terça-feira, 11 de fevereiro de 2014

Carregamento do Daley Thompson's Supertest 128

Encontrei uma coisa interessante no carregamento do Daley Thompson's Supertest 128 no TK90X.

Fonte: WOS

A listagem do carregador BASIC tem uma coisa estranha:


Na linha 6 há a instrução SPECTRUM que faria com que o BASIC 48 tomasse conta do computador, inviabilizando acesso aos banco de RAM de 128K. Entretanto se rodar o programa, os blocos de RAM são normalmente carregados.


Misteriosamente, parece que o comando GOTO 10 é digitado e executado sozinho.


Parece até que uma entidade sobrenatural está digitando o comando acima, para continuar a execução do carregamento da fita.

Entretanto não é nada sobrenatural, se consideramos que na linha 6 do BASIC há o carregamento do código de máquina que é executado por USR 40000. Neste código, há um engenhoso aproveitamento da rotina de interrupção do TK90X. A Interrupção normalmente é empregada para ler o teclado. Mas neste caso, foi modificado de forma a simular a digitação de 11 espaços seguido do comando GOTO 10 e depois por Enter. Com isto, o monitor BASIC "pensa" que este comando foi digitado pelo operador e passa a executá-lo.

Eu achei realmente engenhosa essa rotina. A listagem completa é:

40000   DI
        LD A,(40036)
        LD HL,(40037)
        LD (23296),A
        LD (23297),HL
        LD HL,0
        LD (23299),HL
40019   CALL 39960

; Prepare interrupt routine. 
39960   LD HL,32768     ; Make a IM 2 table with address #8282

                        ;(33410). 
        LD DE,32769
        LD BC,258
        LD (HL),130
        LDIR
        DI
        IM 2
        LD A,128
        LD I,A
        LD A,195
        LD HL,40064       ; Put instruction 'JP 40064' at 33410. 
        LD (33410),A
        LD (33411),HL
        EI
39991   RET

40064   PUSH HL
        PUSH DE
        PUSH AF
        PUSH BC
        LD A,(40126)
        DEC A
        LD (40126),A
        JR NZ,40113
        LD A,4
        LD (40126),A
        LD HL,(40127)
        INC HL
        LD (40127),HL
        LD A,(HL)
        CP 255
        JR Z,40120
        LD (23560),A
        LD (23556),A
        LD (23559),A
        LD A,5
        LD (23557),A
        LD HL,23611
        SET 5,(HL)
40113   EI
        POP BC
        POP AF
        POP DE
        POP HL
40118   RETI
40120   CALL 40055
40123   JR 40113
40125   NOP
40126   DEFB 25
40127   DEFW 40128
40128   DEFM "           "      ; 11 spaces. 
40139   DEFB 236                ; 'GO TO'. 
40140   DEFM "10"
40142   DEFB 13                 ; Enter. 
40143   DEFB 255                ; End marker. 

40022   NOP
...     ...
40035   RET

2 comentários:

  1. Interessantissimo! Alias, ia ser legal se a criançada tivesse maior oportunidade de contato com o Assembly.

    ResponderExcluir
    Respostas
    1. Concordo com você, não seria difícil introduzir o assembly como se fosse um jogo, isto é, uma atividade com regras simples.

      Excluir

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.