Test sulla PCB “bombrman” – Bomberman (Japan)
Per procedere al test ho dovuto modificare una coppia di rom in cui ho inserito un programma in asm nec v30
La routine è la seguente:
2A000: B1 di
2A001: 3D 00 D0 mov dw,0D000h
2A004: 86 00 20 mov cw,2000h
2A007: 8A C0 xor aw,aw
2A009: A9 C2 mov ds1,dw
2A00B: 8A FF xor iy,iy
2A00D: B0 clr1 dir
2A00E: 6B stmw
2A00F: 6B stmw
2A010: 7B FC dbnz 2A00Eh
2A012: 3D 22 D1 mov dw,0D122h
2A015: 86 40 00 mov cw,40h
2A018: A9 C2 mov ds1,dw
2A01A: 8A FF xor iy,iy
2A01C: 4F 00 02 mov aw,200h
2A01F: 6B stmw
2A020: 4F 05 00 mov aw,5h
2A023: 6B stmw
2A024: 7B F6 dbnz 2A01Ch
2A026: 3D 82 D1 mov dw,0D182h
2A029: 86 40 00 mov cw,40h
2A02C: A9 C2 mov ds1,dw
2A02E: 8A FF xor iy,iy
2A030: 4F 00 02 mov aw,200h
2A033: 6B stmw
2A034: 4F 15 00 mov aw,15h
2A037: 6B stmw
2A038: 7B F6 dbnz 2A030h
2A03A: 3D E2 D1 mov dw,0D1E2h
2A03D: 86 40 00 mov cw,40h
2A040: A9 C2 mov ds1,dw
2A042: 8A FF xor iy,iy
2A044: 4F 00 02 mov aw,200h
2A047: 6B stmw
2A048: 4F 25 00 mov aw,25h
2A04B: 6B stmw
2A04C: 7B F6 dbnz 2A044h
2A04E: 3D 42 D2 mov dw,0D242h
2A051: 86 40 00 mov cw,40h
2A054: A9 C2 mov ds1,dw
2A056: 8A FF xor iy,iy
2A058: 4F 00 02 mov aw,200h
2A05B: 6B stmw
2A05C: 4F 35 00 mov aw,35h
2A05F: 6B stmw
2A060: 7B F6 dbnz 2A058h
2A062: 3D E0 DE mov dw,0DEE0h
2A065: 86 10 00 mov cw,10h
2A068: A9 C2 mov ds1,dw
2A06A: 8A FF xor iy,iy
2A06C: 4F 60 01 mov aw,160h
2A06F: 6B stmw
2A070: 5F inc iy
2A071: 5F inc iy
2A072: 5F inc iy
2A073: 5F inc iy
2A074: 1D 00 02 add aw,200h
2A077: 7B F6 dbnz 2A06Fh
2A079: 86 10 00 mov cw,10h
2A07C: 8A FF xor iy,iy
2A07E: 4F 11 11 mov aw,1111h
2A081: 5F inc iy
2A082: 5F inc iy
2A083: 6B stmw
2A084: 5F inc iy
2A085: 5F inc iy
2A086: 7B F9 dbnz 2A081h
2A088: 86 10 00 mov cw,10h
2A08B: 8A FF xor iy,iy
2A08D: 4F 60 00 mov aw,60h
2A090: 5F inc iy
2A091: 5F inc iy
2A092: 5F inc iy
2A093: 5F inc iy
2A094: 6B stmw
2A095: 1D 12 00 add aw,12h
2A098: 7B F6 dbnz 2A090h
2A09A: 3D E6 DE mov dw,0DEE6h
2A09D: 86 10 00 mov cw,10h
2A0A0: A9 C2 mov ds1,dw
2A0A2: 8A FF xor iy,iy
2A0A4: 4F 30 01 mov aw,130h
2A0A7: 6B stmw
2A0A8: 5F inc iy
2A0A9: 5F inc iy
2A0AA: 5F inc iy
2A0AB: 5F inc iy
2A0AC: 1D 00 02 add aw,200h
2A0AF: 7B F6 dbnz 2A0A7h
2A0B1: 86 10 00 mov cw,10h
2A0B4: 8A FF xor iy,iy
2A0B6: 4F 11 11 mov aw,1111h
2A0B9: 5F inc iy
2A0BA: 5F inc iy
2A0BB: 6B stmw
2A0BC: 5F inc iy
2A0BD: 5F inc iy
2A0BE: 7B F9 dbnz 2A0B9h
2A0C0: 86 10 00 mov cw,10h
2A0C3: 8A FF xor iy,iy
2A0C5: 4F 60 00 mov aw,60h
2A0C8: 5F inc iy
2A0C9: 5F inc iy
2A0CA: 5F inc iy
2A0CB: 5F inc iy
2A0CC: 6B stmw
2A0CD: 1D 12 00 add aw,12h
2A0D0: 7B F6 dbnz 2A0C8h
2A0D2: 3D EC DE mov dw,0DEECh
2A0D5: 86 10 00 mov cw,10h
2A0D8: A9 C2 mov ds1,dw
2A0DA: 8A FF xor iy,iy
2A0DC: 4F 00 01 mov aw,100h
2A0DF: 6B stmw
2A0E0: 5F inc iy
2A0E1: 5F inc iy
2A0E2: 5F inc iy
2A0E3: 5F inc iy
2A0E4: 1D 00 02 add aw,200h
2A0E7: 7B F6 dbnz 2A0DFh
2A0E9: 86 10 00 mov cw,10h
2A0EC: 8A FF xor iy,iy
2A0EE: 4F 11 11 mov aw,1111h
2A0F1: 5F inc iy
2A0F2: 5F inc iy
2A0F3: 6B stmw
2A0F4: 5F inc iy
2A0F5: 5F inc iy
2A0F6: 7B F9 dbnz 2A0F1h
2A0F8: 86 10 00 mov cw,10h
2A0FB: 8A FF xor iy,iy
2A0FD: 4F 60 00 mov aw,60h
2A100: 5F inc iy
2A101: 5F inc iy
2A102: 5F inc iy
2A103: 5F inc iy
2A104: 6B stmw
2A105: 1D 12 00 add aw,12h
2A108: 7B F6 dbnz 2A100h
2A10A: 3D F2 DE mov dw,0DEF2h
2A10D: 86 10 00 mov cw,10h
2A110: A9 C2 mov ds1,dw
2A112: 8A FF xor iy,iy
2A114: 4F D0 00 mov aw,0D0h
2A117: 6B stmw
2A118: 5F inc iy
2A119: 5F inc iy
2A11A: 5F inc iy
2A11B: 5F inc iy
2A11C: 1D 00 02 add aw,200h
2A11F: 7B F6 dbnz 2A117h
2A121: 86 10 00 mov cw,10h
2A124: 8A FF xor iy,iy
2A126: 4F 11 11 mov aw,1111h
2A129: 5F inc iy
2A12A: 5F inc iy
2A12B: 6B stmw
2A12C: 5F inc iy
2A12D: 5F inc iy
2A12E: 7B F9 dbnz 2A129h
2A130: 86 10 00 mov cw,10h
2A133: 8A FF xor iy,iy
2A135: 4F 60 00 mov aw,60h
2A138: 5F inc iy
2A139: 5F inc iy
2A13A: 5F inc iy
2A13B: 5F inc iy
2A13C: 6B stmw
2A13D: 1D 12 00 add aw,12h
2A140: 7B F6 dbnz 2A138h
2A142: 4F 00 00 mov aw,0h
2A145: 79 8E out 8Eh,aw
2A147: 5F inc iy
2A148: 6C FD br 2A147h
Il risultato in mame è il seguente:
la routine cancella la video ram e inserisce 4 linee di tile; la prima linea di tile ha i bit di prorità a 00, la seconda ha i bit a 01, la terza a 10 e la quarta a 11.
Su ciascuna linea vengono visualizzati in ordine 16 sprite il piu’ a sinistra con colore pari a 0 (0x00) e poi a crescere fino a colore pari a 15 (0x0f)
Si puo’ notare come in mame gli sprite della prima riga hanno priorità maggiore rispetto alle tile
La conclusione della routine manda alla porta 8e (il registro video di cui si ignora la funzione) il valore 00 e poi va in un loop infinito
Lo stesso test con la PCB di bomberman da questo risultato:
Il comportamento del mame coincide quasi con il comportamento della pcb
A parte differenze di colore dovute alla non inizializzazione della palette, l’unica differenza riguarda il numero di sprite che possono essere disegnati dalla PCB (limite di sprite in contemporanea o spriteram piu’ ridotta di quanto si pensa?)
Priorità dei giochi IREM m90
In alcuni giochi di questo driver si notano problemi di priorità. Il piu’ martoriato di questi e quizf1
Dato pero’ che quizf1 non era stato completamente decrittato non era chiaro se il problema delle priorità dipendeva dalla non completa decrittazione piuttosto che dalle gestione delle priorità
Altro gioco in cui si nota il problema è Risky Challenge / Gussun Oyoyo
L’idea è di fare alcuni test con una pcb reale e vedere cosa succede modificando alcuni parametri: 2 bit delle tile, il colore degli sprite e un registro video di cui non si conosce la funzione
Risky Challenge / Gussun Oyoyo – parte 4
Ora è giocabile; Adesso si devono scovare i bug!
Risky Challenge / Gussun Oyoyo parte 3
Risky Challenge / Gussun Oyoyo – parte 2
Qualche progresso