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!
Flávio, testa esse demo aqui na sua Explorer:
ResponderExcluirhttp://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.
Oi, Alexandre, eu testei esse demo na minha Explorer e realmente dá problemas. Fica bem diferente do que ouço no emulador.
ExcluirEntão não temos problema entre Fairlight x TKMEM x Explorer. A Explorer que não se dá bem com algumas músicas.
ExcluirDe repente o mod do Victor faça tudo funcionar normal.
Quando eu fizer o mod, falo os resultados aqui.
Fiz a correção na minha Explorer IV.
ResponderExcluirAgora tudo funciona normal. O AlienDemo, o Cybernoid II, etc.
Realmente precisa ser feita a correção para tudo ficar OK.
Realmente há programas que leem a porta 65533, que não é providenciada por certas versões da Explorer. Valeu pelo relato.
Excluir