Graças aos arquivos enviados pelos amigos da lista TK90X (obrigado, Colella e Wesley), eu acredito ter encontrado a origem da incompatibilidade do Bubble Bobble no TK90X.
Somente um dos arquivos enviados, "Bubble Bobble (1987)(Firebird).tap", funciona com TK90X e Spectrum NTSC (este último testado no emulador). Depois descobri que este arquivo pode ser encontrado no Planet Emulation.
Após fazer alguns disassemblies no emulador, pude encontrar a rotina que faz a detecção do modelo do computador, se é 48 ou 128K. No Bubble Bobble original encontrado no World of Spectrum:
Foi a primeira vez que vi tal detecção ser feita com base na temporização fornecida pelas interrupções mascaráveis. A frequência desta interrupção é de 50 Hz nos Spectrum 48 e 128, mas o clock do Z80 nos dois modelos diferem. Um loop é executado com temporização baseada na variável de sistema FRAMES (TVCOUNT) e, dependendo do valor obtido, decide-se qual é o modelo presente.
Obviamente tal rotina não irá funcionar com computadores de 60 Hz, certamente irá acusar erroneamente que há 128K de RAM. Neste caso a música PSG AY-3-8912 (Explorer) será tocada, porém como não há o banco de RAM 4, uma parte da memória será corrompida. Aparentemente esta alteração da memória não é um problema muito sério, pois parece que só prejudica os gráficos, mas o jogo consegue rodar.
Já no arquivo TAP, há indícios de que alguém hackeou o trecho de detecção de capacidade de RAM:
Nesta versão, o programa corretamente não executa a música para Explorer, nem faz uso do banco de RAM 4. Entretanto usa a variável de sistema em 23388, que só existe para o 128 BASIC. Portanto se for rodar na TKMEM-128 sem a ROM 128 ativada, irá se comportar como se a expansão não existisse.
Após fazer alguns disassemblies no emulador, pude encontrar a rotina que faz a detecção do modelo do computador, se é 48 ou 128K. No Bubble Bobble original encontrado no World of Spectrum:
64195 IM 1 ; Modo de interrupção padrão do Sinclair BASIC.
EI
HALT ; Aguarda 1 interrupção.
64199 LD BC,0 ; Contador de temporização.
LD HL,0 ; Zera variável de sistema FRAMES (23672-23674).
LD (23672),HL
LD (23673),HL
LD E,0 ; Contador de 256 tentativas.
64213 LD A,255
LD HL,23672 ; Aponta para LSB de FRAMES.
;
64218 INC E ; Aumenta valor de contador e se atingir limite de
JR NZ,64222 ;256 tentativas, não aumenta contador BC.
INC BC ; Aumenta contador BC.
64222 CP (HL) ; Verifica se o LSB de FRAMES atingiu valor 255.
JR NZ,64218 ; Senão, repete o loop.
;
LD A,B ; Se BC não for 1886 assume que o computador é 128K.
CP 7
JR NZ,64239
LD A,C
CP 94
JR Z,64244
64239 LD A,128 ; A=128 sinaliza 128K.
64241 JP 64059
;
64244 LD A,48 ; A=48 sinaliza 48K.
64246 RET
Foi a primeira vez que vi tal detecção ser feita com base na temporização fornecida pelas interrupções mascaráveis. A frequência desta interrupção é de 50 Hz nos Spectrum 48 e 128, mas o clock do Z80 nos dois modelos diferem. Um loop é executado com temporização baseada na variável de sistema FRAMES (TVCOUNT) e, dependendo do valor obtido, decide-se qual é o modelo presente.
Obviamente tal rotina não irá funcionar com computadores de 60 Hz, certamente irá acusar erroneamente que há 128K de RAM. Neste caso a música PSG AY-3-8912 (Explorer) será tocada, porém como não há o banco de RAM 4, uma parte da memória será corrompida. Aparentemente esta alteração da memória não é um problema muito sério, pois parece que só prejudica os gráficos, mas o jogo consegue rodar.
Já no arquivo TAP, há indícios de que alguém hackeou o trecho de detecção de capacidade de RAM:
64195 IM 1
EI
LD A,(23388) ; Verifica último byte enviado à porta 32765.
CP 0 ; Se for 0, computador é de 48K.
64203 JR Z,64244
64205-64238 NOP ; Trecho apagado.
64239 LD A,128
; A=128, sinaliza 128K.
64241 RET
64242 NOP
; Trecho apagado.
64243 NOP
64244 LD A,48
; A=48, sinaliza 48K.
64246 RET
Nesta versão, o programa corretamente não executa a música para Explorer, nem faz uso do banco de RAM 4. Entretanto usa a variável de sistema em 23388, que só existe para o 128 BASIC. Portanto se for rodar na TKMEM-128 sem a ROM 128 ativada, irá se comportar como se a expansão não existisse.
Não sei ao certo como cheguei aqui, mas foi engraçado ler isto. Quando era miúdo jogava muito Bubble Bobble com o meu irmão, era 1 dos nossos jogos preferidos. Às vezes o jogo dava música, mas com este defeito nos gráficos, outras vezes o jogo era carregado sem música, mas os gráficos funcionavam bem. Ao fim destes anos todos li uma explicação mais técnica apesar de não ter percebido nada.
ResponderExcluirEste jogo realmente é muito bom, felizmente consegui debugá-lo.
Excluir