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 é:
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
Interessantissimo! Alias, ia ser legal se a criançada tivesse maior oportunidade de contato com o Assembly.
ResponderExcluirConcordo com você, não seria difícil introduzir o assembly como se fosse um jogo, isto é, uma atividade com regras simples.
Excluir