Eletrônica
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!
loading...
-
Dica Tv Electronia 20nt Chassis 11ak30
Defeito--Não liga. Led vermelho aceso. Ao tentar ligar, o led passa a verde mas, no mesmo instante, o led volta para vermelho e a fonte da tv não arma.Valores ...
-
Dica Tvs Panasonic Tx-25xd3e Chassis Euro 2m
Defeito--Este tv estava em protecção, trazia o transístor de saída de linhas (2SD1577- LB) em curto. Depois de o substituir, o tv arrancou apresentando o seguinte ...
-
Detecção De Ram 48/128
Conforme tinha prometido na postagem sobre incompatibilidade do Bubble Bobble, eu vou mostrar a rotina de detecção de tamanho de RAM 48/128K que elaborei na ocasião. A ideia era fazer uma rotina que não altere o conteúdo da RAM a ser testada;...
-
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...
-
Thundercats V. 2 Para Basic 128
Mal acabei de lançar uma adaptação do Thundercats para Beta e TKMEM-128 e estou com a versão 2. A versão anterior tinha um problema: não consegue carregar a partir do BASIC 128, portanto tinha que dar um 'USR 0' antes. Na versão 2 não...
Eletrônica