Go to the FreeLists Home Page Home Signup Help Login
 



Browse zxspectrum: This Month's ArchiveMain Archive PageRelated postsPrevious by DateNext by Date

[zxspectrum] Re: R: Re: R: Re: R: Re: infinity

  • From: "Alessandro Poppi" <apoppi@xxxxxxxx>
  • To: <zxspectrum@xxxxxxxxxxxxx>
  • Date: Mon, 3 Apr 2006 17:11:10 +0200
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.

Ciao!


Other related posts:

  • [zxspectrum] R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity
  • [zxspectrum] Re: R: Re: R: Re: R: Re: infinity




  • [ Home | Signup | Help | Login | Archives | Lists ]

    All trademarks and copyrights within the FreeLists archives are owned by their respective owners.
    Everything else ©2008 Avenir Technologies, LLC.