sexta-feira, 9 de novembro de 2012

Explorer × TK90X + TKMEM-128

Parece que o Fairlight 128, que roda no TK90X graças ao TKMEM-128, não se dá muito bem com a Explorer. O som fica bastante distorcido, bem diferente do que ouço no emulador. Fiz algumas tentativas para entender o que está acontecendo.


Frequência de interrupção

Uma fonte bastante frequente de distorção é a frequência de interrupção mascarável, muito empregado para temporizar a rotina de música, ser maior (60 Hz) no TK90X do que no computador europeu (50 Hz). Eu encontrei a rotina de interrupção no disassembly:

46849   PUSH HL        ; Preserva registradores.
        PUSH DE
        PUSH BC
        PUSH AF
        PUSH IX
        PUSH IY
        LD A,19        ; Seleciona banco de RAM 3.
        OUT (253),A
        CALL 49152     ; Chama sub-rotina em 49152.
        LD A,(46899)   ; Chaveia banco de RAM anterior.
        OUT (253),A
        POP IY         ; Recupera registradores.
        POP IX
        POP AF
        POP BC
        POP DE
        POP HL
        EI             ; Reativa as interrupções.
46878   RETN           ; Retorna.


Vi ainda que o espaço entre 46880 e 46898 estava vazio, por isso poderia ser usado por uma eventual alteração na rotina de interrupção. A rotina acima preserva os registradores na pilha, seleciona o banco de RAM 3, chama a sub-rotina 49152 que comanda o PSG AY-3-8912, chaveia de volta o banco de RAM original, recupera os registradores e retorna.

Resolvi testar a seguinte alteração:

        ...
        LD A,19
        OUT (253),A
        LD A,(IntFlag)   ; Pega flag de interrupção.
        CPL              ; Inverte os bits.
        AND A            ; Testa seu valor.
        LD (IntFlag),A   ; Guarda novo valor do flag.
        CALL Z,49152     ; Chama rotina somente se flag for 0.
        LD A,(46899)
        OUT (253),A

        ...

Como a sub-rotina em 49152 é chamada somente na metade das interrupções, na prática reduz a frequência para 30 Hz. No emulador funcionou, o ritmo da música ficou bem mais lento. Infelizmente no TK90X o problema no som persistiu, parecia estar gaguejando.

Vetores de interrupções

Quanto fui encontrar a rotina de interrupção, vi uma coisa que não gostei. No modo IM 2 do Z80, o registrador I define o byte mais significativo da tabela de vetores de interrupções; o byte menos significativo é tomado do barramento de dados que, em teoria deveria ser #FF (255), mas pode ser alterado pelo ULA. Para contornar este problema, deve-se construir uma tabela de 256 bytes com o endereço da rotina de interrupção (para mais detalhes, ver este artigo no TK-WIKI). Porém no Fairlight não se faz uma tabela, apenas a posição #B6FF é usada. Pensei que talvez fosse essa a fonte de problemas.

Como solução, criei uma tabela de vetores de interrupção e rotina que desvia para a rotina de interrupção, acrescentando uma linha no carregador BASIC:

80 POKE 65508,189: FOR n=48384 TO 48640: POKE n,189: NEXT n: POKE 49087,195: POKE 49088,1: POKE 49089,183

No TK90X esta alteração não trouxe nenhuma melhoria sonora.

Bug da porta 65533 da Explorer

Com exceção do modelo II, as Explorer não permitem ler a porta 65535, somente se pode escrever nela. Descrevi este bug numa postagem anterior. No emulador Fuse acionei o breakpoint que interrompe a emulação quando se faz a leitura desta porta com o comando:

br port write 65533
br port read 65533

O resultado foi negativo, Fairlight não lê esta porta. 

E agora ... ?

A última hipótese que ainda resta foi sugerida por Alexandre em seu comentário nesta postagem: a frequência de clock da Explorer é maior que o do PSG AY-3-8912 do Spectrum 128, causando problemas no som. Se a hipótese estiver correta, a interface AY interna do Eduardo Luccas poderia ser a solução, pois usa o mesmo esquema do Melodik.

O que era para ser uma adaptação simples, tornou-se uma verdadeira dor de cabeça.

Atualização em 10/11/2012: corrigido o comando do debugger para breakpoint da leitura da porta 65533. Valeu, Danjovic, por avisar!

5 comentários:

  1. Flávio, testa esse demo aqui na sua Explorer:
    http://www.worldofspectrum.org/infoseekid.cgi?id=0023087

    Ele na minha Explorer IV fica dando saltos, fica só com ploc ploc ploc, distorce, etc... mas na outra placa toca normal.

    ResponderExcluir
    Respostas
    1. Oi, Alexandre, eu testei esse demo na minha Explorer e realmente dá problemas. Fica bem diferente do que ouço no emulador.

      Excluir
    2. Então não temos problema entre Fairlight x TKMEM x Explorer. A Explorer que não se dá bem com algumas músicas.
      De repente o mod do Victor faça tudo funcionar normal.
      Quando eu fizer o mod, falo os resultados aqui.

      Excluir
  2. Fiz a correção na minha Explorer IV.
    Agora tudo funciona normal. O AlienDemo, o Cybernoid II, etc.
    Realmente precisa ser feita a correção para tudo ficar OK.

    ResponderExcluir
    Respostas
    1. Realmente há programas que leem a porta 65533, que não é providenciada por certas versões da Explorer. Valeu pelo relato.

      Excluir

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