> 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