On Monday, April 03, 2006 3:34 PM [GMT+1],
Luca Bisti <lucbisti@xxxxxx> wrote:
dal computer su cui viene caricato. Forse dipende dalla decodifica
degli indirizzi, che maschera usi sul Badaloc? Sull'emulatore l'AY
viene indirizzato quando (ADDR & 0x8002) == 0x8000.
Il problema dipende sicuramente da questo, perche` in realta` io verifico
tutte le 16 linee di indirizzo affinche` abbiano il valore ufficiale della
porta. E` piu` pulito, ma capisco che non posso mantenerlo.
Ed ora il risultato (per me sorprendente) della mia indagine:
Lanciato il gioco e collegato analizzatore di stati alle linee IORQ, WR,
BDIR, BC1.
Si nota subito che ci sono pacchetti di scritture in I/O costituite da
coppie di cicli WR ravvicinati fra loro. Il numero complessivo delle coppie
e` 14. Il fatto che salta all'occhio e` che per ciascuna coppia, solo il
primo WR sortisce effetto sulle linee dell'AY (le porta entrambe alte, segno
che si tratta dell'OUT su $FFFD).
Dal debugger del realspec si evince che l'output del secondo ciclo viene
effettuato con un OUTI, dopo aver diligentemente caricato $BFFD (valore
esatto della porta I/O) in BC. Il registro B viene infatti ripristinato dopo
ogni OUTI, che e` sfruttata per il fatto di incrementare da sola HL.
Dovrebbe funzionare, quindi. E invece no.
Ho allora scritto un pezzetto di codice come segue:
xor a
ld bc,$fffd
out (c),a
ld bc,$bffd
out (c),a
ld bc,$fffd
outi
ld bc,$bffd
outi
Con grande sorpresa, l'attivazione delle linee avviene SOLO PER LE PRIME DUE
istruzioni, ovvero le OUT tradizionali. Delle altre due nemmeno l'ombra. Il
datasheet dello Z84C0020 dice chiaramente che anche la OUTI presenta
l'intero registro BC sull'address bus.
Quello che non dice chiaramente, e che ho scoperto sperimentalmente, e` che
il registro B viene DECREMENTATO PRIMA DELL'OUT!!!!
Morale: modificando come segue:
ld bc,$00fd
outi
ld bc,$c0fd
outi
sono magicamente comparse anche le altre due attivazioni.
Il gioco Infinity esegue l'out su $FFFD correttamente (perche` usa una OUT
normale) mentre quello che dovrebbe finire in $BFFD viene eseguito su $BEFD
dalla OUTI.
Si tratta quindi di un "bug" del software, che pero` non si manifesta dato
che l'hardware non considera tutti i bit di indirizzo.