sexta-feira, 14 de junho de 2019

Atualizando um post antigo sobre o Paddle Vaus

Quando analisei há um tempo atrás a rotina de leitura do Paddle Vaus pelo jogo Arkanoid deixei passar batido um detalhe: O bit mais significativo da leitura já está na entrada "up" assim que a termina a conversão/contagem do circuito do paddle

Os 9 bits são lidos da seguinte maneira:

  • Lê registro 14 do PSG e salva em H

  • Repete 8 vezes:
    • gera um pulso de clock para deslocar 1 bit
    • lê o bit e salva em C
  • Salva o conteúdo de C para o endereço 0xEOC1
  • Isola o bit 0 de H, que é o bit mais significativo da leitura e salva em 0xE0C2
...
42fc 3e0e      ld      a,0eh       ; seleciona registro 14 do PSG
42fe d3a0      out     (0a0h),a
4300 dba2      in      a,(0a2h)    ; realiza primeira leitura
4302 67        ld      h,a         ; bit mais significativo já esta na saida
4303 0608      ld      b,08h       ; 8 bits
4305 0e00      ld      c,00h
4307 1e00      ld      e,00h
4309 3e0f      ld      a,0fh
430b d3a0      out     (0a0h),a
430d 3e1e      ld      a,1eh
430f d3a1      out     (0a1h),a    ; clock low
4311 3e1f      ld      a,1fh
4313 d3a1      out     (0a1h),a    ; clock high
4315 3e0e      ld      a,0eh
4317 d3a0      out     (0a0h),a
4319 dba2      in      a,(0a2h)
431b 5f        ld      e,a
431c cb3f      srl     a           ; lê bit
431e cb11      rl      c           ; armazena em C
4320 10e7      djnz    4309h       ; próximo bit
4322 79        ld      a,c
4323 32c1e0    ld      (0e0c1h),a  ; armazena bits menos significativos
4326 7c        ld      a,h         ; pega primeira leitura
4327 e601      and     01h         ; isola bit 0 (up)
4329 32c2e0    ld      (0e0c2h),a  ; armazena bit mais significativo
 

432c 3e0f      ld      a,0fh       ; gera um pulso para iniciar
432e d3a0      out     (0a0h),a    ; a próxima conversão/contagem
4330 3e1f      ld      a,1fh
4332 d3a1      out     (0a1h),a    ; pino8 high
4334 3e0f      ld      a,0fh
4336 d3a1      out     (0a1h),a    ; pino8 low
4338 3e1f      ld      a,1fh
433a d3a1      out     (0a1h),a    ; pino8 high
433c 3e0e      ld      a,0eh
433e d3a0      out     (0a0h),a
4340 dba2      in      a,(0a2h)
4342 5f        ld      e,a
4343 21c4e0    ld      hl,0e0c4h
4346 7e        ld      a,(hl)
4347 73        ld      (hl),e
4348 e60f      and     0fh
434a a3        and     e
434b ab        xor     e
434c 32c5e0    ld      (0e0c5h),a
434f 47        ld      b,a
4350 3a0be0    ld      a,(0e00bh)
4353 b7        or      a
4354 c0        ret     nz

4355 cb48      bit     1,b         ; Testa botão de tiro
4357 c8        ret     z           ; bit 1 -> DOWN do reg 14

4358 3a0ae0    ld      a,(0e00ah)
435b b7        or      a
435c ca7043    jp      z,4370h
435f af        xor     a
4360 320ae0    ld      (0e00ah),a
4363 213ce5    ld      hl,0e53ch
4366 113de5    ld      de,0e53dh
4369 3600      ld      (hl),00h
436b 010700    ld      bc,0007h
436e edb0      ldir
4370 3e01      ld      a,01h
4372 320ce0    ld      (0e00ch),a
4375 c9        ret

...



 


quinta-feira, 13 de junho de 2019

Diferentes versões de Arkanoid

Eu montei um clone do controle de Arkanoid e ao testar notei que o jogo não reconhecia o controle. Achei estranho pois me lembrava de ter visto o código e até "desassemblado" um trecho de uma ROM que gerava os sinais para ler o controle da Taito.
Clone do Paddle Arkanoid da TAITO

Pesquisando em alguns sites achei uma versão cujo binário era realmente era diferente, e que funcionou com o Paddle que montei.

Arkanoid 1 (1986) (Taito) (J).rom

Comparando com mais detalhes as duas versões dá pra ver que a ROM em que o Paddle não funciona chama apenas a rotina de leitura de teclado (0x425b - CD 0141H) ao passo em que a outra ROM chama uma função no endereço 0x42FD que é justamente responsável por gerar os sinais e ler os dados vindos do paddle (vide artigo anterior)



Além disso existe uma diferença "visual" entre as ROMS. A que lê o Paddle coloca na tela a mensagem TAITO CORPORATION. Já a ROM que não lê o paddle escreve TAITO IMAGINE LTD.










A última difereça é o último byte do arquivo, que em uma versão tem o valor 0x00 e na outra 0x3F

sábado, 8 de junho de 2019

Diagrama redesenhado do Modulador de RF do Hotbit

Redesenhei o diagrama do modulador de RF do Hotbit. Aproveitei o corrigi o diagrama da placa principal pois a alimentação que vai para o conector do modulador de RF é de 12Volts em vez de 5 Volts.

Arquivos disponíveis no github

quarta-feira, 6 de junho de 2018

BGM player

Subrotina em assembler para ser usada em jogos ou demos. Permite tocar uma trilha sonora de tons simples que pode ser gerada a partir de arquivos padrão RTTL.

A subrotina utiliza formato próprio, composto de 3 bytes, contendo duração da nota (1byte) e sua "frequência" (2 bytes).

duração      : [ 1 byte ]  1..255
"frequencia" : [---lsb--][0000-msb]  0..4095



A subrotina não é blocante e deve ser chamada a cada interrupção do VDP. Por isso a duração corresponde a intervalos de tempo múltiplos de 16.67ms (1/60Hz) ou de 20ms (1/50Hz) conforme o padrão da máquina.

A "frequência" corresponde ao divisor de clock que deve ser carregado nos registros de divisão do PSG (12 bits).

Uma nota com duração igual a 0 (zero) corresponde a um comando, dessa forma

duração: [ 0 ]  Comando
         [ccccrrrr][dddddddd]  

         cccc comando 0..15  
         rrrr argumento 0..15
         dddddddd dado 0..255

Até o momento três comandos estão definidos:

cccc = 0, : Reinicializa música
rrrr, dddddddd sem uso
                                  
cccc = 1,  : Escreve num registro do PSG
rrrr = registro [0..15]
dddddddd = dado [0..255] valor a ser escrito.


cccc = 2,  : Escreve num registro do PSG 
             e interpreta proximo comando ainda no mesm
             intervalo de tmepo
rrrr = registro [0..15]
dddddddd = dado [0..255] valor a ser escrito.

                                  
A geração das músicas a partir de "Ringtones" no formato RTTL pode ser feita utilizando um script python que permite inclusive que as músicas sejam ouvidas (pelo menos na versão windows)

Alguns detalhes:
Um valor de divisor para geração da frequência igual a 0 faz com que o canal do PSG fique mudo e isso é usado para gerar a pausa. Em nenhuma das referências que consultei havia essa informação.

O valor máximo de duração de uma nota é por volta de 4.3 segundos. Para gerar notas de maior duração o script gera uma segunda nota de mesma frequencia com o valor de duração excedente.

Códigos fonte e demais arquivos disponíveis no repositório do GitHub mas também tem uma imagem de disco na página do projeto no Hackaday.io que dá pra testar no WebMSX


segunda-feira, 21 de maio de 2018

Diagrama redesenhado da placa CPU do HOTBIT

Desenhei este diagrama nas férias do início do ano, mas só agora me lembrei de postar. Ele foi baseado num diagrama que achei no site do Luciano (MSXPRO).

A título de curiosidade este diagrama foi editado num netbook Asus EEE 1005HA com tela de 1024x600

O circuito está disponível nos formatos PDF e Eagle (versão >=6.0) em meu repositório de MSX do Github
https://github.com/Danjovic/MSX/raw/master/Schematics/HOTBIT%20HB8000/HotBit.pdf

segunda-feira, 19 de dezembro de 2016

Nova versão do Joy232

Nova versão do Joy232, que é um programa que intercepta os caraceteres enviados para a impressora e os transmite serialmente pela porta de joystick.

Novidades desta versão (1.3):
  • Código reescrito e otimizado de forma a  caber 64 bytes da fila da RS232 que não é usada no MSX, e portanto não vai ser sobrescrito por outro programa
  • Suporta 14400 bauds (além de 1200,2400,4800,9600 e 19200 bauds)
  • Permite transmitir sem paridade (N) ou com paridade par (E) e ímpar (O)
Mais detalhes na página do projeto no https://hackaday.io/project/18552-joy232



Meus agradecimentos ao Fábio Belavenuto pela SD Mapper! Tem me ajudado pra caramba!!!

E para os apressados:
10 REM
20 REM Joy232 hook code
30 REM danjovic 2016
40 REM version 1.31 19/12/2016
50 REM
60 EI=&HFAF5:SIZE=63
70 FOR A = EI TO EI+SIZE
80 READ B$: POKE A,VAL("&H"+B$)
90 NEXT A
100 REM
110 POKE &HFFB8,&HFA
120 POKE &HFFB7,&HF5
130 POKE &HFFB6,&HC3
140 REM
150 DATA F3,F5,C5,E5,6F,3E,0F,D3
160 DATA A0,26,FF,A7,CB,15,CB,14
170 DATA 06,0B,DB,A2,CB,87,CB,1C
180 DATA CB,1D,CE,00,D3,A1,0E,11
190 DATA 0D,20,FD,10,ED,E1,C1,F1
200 DATA A7,FB,33,33,C9,CE,00,D3
210 DATA A1,0E,06,0D,20,FD,10,ED
220 DATA E1,C1,F1,FB,33,33,C9,00
230 REM
240 REM To change baudrate
250 REM
260 REM POKE &HFB27,value
270 REM
280 REM Baudrate  value
290 REM 1200      170
300 REM 2400      83
310 REM 4800      39
320 REM 9600      17
330 REM 14400     10
340 REM 19200      6
350 REM
360 REM ----------------------
370 REM To use parity
380 REM
390 REM POKE &HF96D,value
400 REM
410 REM Parity    value
420 REM NONE        0 (or 1)
430 REM EVEN        2
440 REM ODD         3


 A conexão ao PC é feito na porta A de Joystick usando-se um adaptador ("dongle") USB-Serial.

segunda-feira, 5 de dezembro de 2016