[zxspectrum] Spindizzy (Top Spin) e IM2

  • From: "Cesare Falco" <wallyweek@xxxxxxxxxxxx>
  • To: "ml speccy" <zxspectrum@xxxxxxxxxxxxx>
  • Date: Wed, 05 Jul 2006 10:12:20 +0000

> Sei per caso l'autore di TOP-SPIN, pubblicato da load'n'run nel 1986? E` un 
no, non puo' essere lui perche' come ti hanno detto il vero nome del gioco 
(bellissimo) e' Spindizzy :)

Nemmeno io sono l'autore (...magari!), per cui cerco di interpretare il 
comportamento del
codice in base alla mia esperienza di "hacker" e sulle conoscenze che ho 
dell'asm dello Z80

> Confrontando un paio di snapshot (prima e dopo il crash) ho notato che la 
> "fase piroetta" passa in IM2 con I = $3A, che e` proprio in rom. A quel 
> punto mi e` bastato ricaricare la rom originale ed il gioco ha preso a 
> funzionare.

> A cosa serve questo meccanismo? Cosa viene chiamato, in rom, dato che in
> quella zona c'e' un'area vuota?
quando e' attivo l'IM2, al verificarsi di una richiesta di interrupt 
mascherabile lo Z80
utilizza il contenuto dell'apposito registro I come byte alto dell'indirizzo di 
memoria al
quale saltare per eseguire la routine di interrupt vera e propria.
Il byte meno significativo viene letto dal bus dati, che nel caso dello 
Spectrum non si sa bene
che valore abbia (il famoso floating bus), per cui e' tecnica comune utilizzare 
una pagina di
memoria lunga 257 byte riempiti con lo stesso valore per generare sempre lo 
stesso indirizzo al
variare del contenuto del bus dati, al quale viene assemblata la vera routine 
da eseguire.

> E` possibile che il funzionamento sia 
> garantito dal fatto che il contenuto e` $FF, 
> ovvero RST 38? (E` anche 
non e' _possibile_... direi che e' _sicuro_! :)

Dovrei vedere il codice della rom e quello del gioco per risponderti con 
certezza assoluta,
ma se ogni byte della pagina di memoria da $3A00 a $3B00 contiene $FF, settando 
I a $3A si fa si che
ad ogni interrupt lo Z80 esegua il codice che si trova a $FFFF a prescindere 
dal floating bus.

Posso immaginare che a $FFFF sia stato assegnato il valore $18 (JR xx) e visto 
che il registro
interno dello Z80 che si occupa di fare il fetch delle istruzioni da eseguire 
e' a 16 bit, dopo
$FFFF va in overflow e torna a $0000, primo byte della rom che normalmente 
contiene $F3.

In questo modo verrebbe eseguito un JR $FFF2, indirizzo al quale si trova 
presumibilmente un
nuovo salto, stavolta magari assoluto del tipo JP yyyy, all'inizio della vera 
routine da eseguire.

Perche' non usare direttamente una pagina di memoria ram invece di questa serie 
di salti,
rimane un mistero... posso solo immaginare sia per evitare la contesa di 
memoria ULA/Z80... ma gia'
all'epoca si sapeva che erano da evitare solo gli indirizzi da $4000 a $8000... 
mah! :/

> possibile che il passaggio a IM2 sia il risultato dell'esecuzione erratica 
> dovuta alla mia modifica alla rom e che tu non sappia di cosa sto parlando).
no, questo lo escluderei... in rom non ci possono essere istruzioni IM 2, 
altrimenti lo Spectrum
andrebbe in crash senza apparente motivo tutte le
volte che le incontrasse (a $FFFF spesso e' assegnato il valore $00, 
l'istruzione NOP, e come
si diceva prima la locazione successiva $0000 e' la prima della rom).

....a meno che in rom ci fosse una routine che aggiornasse il valore di $FFFF e 
copiasse
una routine di interrupt in ram per gestire l'IM 2, ma non mi risulta che nella 
rom standard
ci sia niente di simile.

Sono riuscito a rendere? Riconosco che la cosa e' un po' incasinata da 
spiegare, ma e' meno
complicata di quanto sembri...

Cesare.

________________________________________________________________________
SERVIZIO VOICE: TELEFONA e INVIA SMS dal tuo computer a tariffe vantaggiose! 
Scopri come telefonare e videochiamare gratis da pc a pc.
http://voice.repubblica.it




Other related posts: