segunda-feira, 11 de fevereiro de 2013

Detecção de RAM 48/128 no Bubble Bobble

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:

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.

2 comentários:

  1. 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.

    ResponderExcluir
    Respostas
    1. Este jogo realmente é muito bom, felizmente consegui debugá-lo.

      Excluir

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