[zxspectrum] Re: R: Re: R: Re: R: Re: R: Re: DEMO PENTAGON su ZX-UNO

  • From: Luca Alimandi <luca.alimandi62@xxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Fri, 2 Sep 2016 18:49:33 +0200

Il 02/09/2016 18:34, Luca Alimandi ha scritto:

Il 02/09/2016 16:57, Enrico Maria Giordano ha scritto:


Il 02/09/2016 15:57, Luca Alimandi ha scritto:

In alcuni altri articoli (che non ho ritrovato) si parlava del fatto che
anche gli emulatori non si comportano tutti nello stesso modo per quello
che riguarda il contenuto dell'indirizzo basso (bit 0-7) del bus durante
gli interrupt, il che costringe i programmatori, che intendano usare
l'IM2 e mantenere la compatibilità con tutti gli emulatori e le versioni
di Spectrum e periferiche, ad utilizzare una tabella formata in modo
particolare (257 byte consecutivi (come ha scritto bene Stefano)
contenenti sempre lo stesso valore in modo che sia leggendo coppie a
partire da posizioni pari che da posizioni dispari formino sempre lo
stesso indirizzo a cui saltare; ad esempio nella mia routine per la
gestione del mouse Kempston ho usato il valore 253, per cui l'indirizzo
di salto è 253 + 256 * 253 = 65021). Inoltre la tabella stessa si deve
trovare all'inizio di una zona di memoria multiplo di 256. Nel mio caso
ho posto i tre byte di un "JP nn" a partire da 65021 e ho fatto iniziare
la tabella subito appresso, ossia a 65024, che è appunto 254 * 256.

Infatti è esattamente il sistema che ho sempre usato io (c'è, ad esempio, anche in Link).

EMG


In realtà c'è anche un furbo trucchetto che sfrutta il fatto che la fine della ROM dello Spectrum è occupata da una lunga serie di byte con valore FF (255)...
In questo modo la tabella, già bella e pronta in ROM, fa saltare sempre a 65535. In questa locazione si deve porre un byte di valore 195 (è l'istruzione JP), dopo di che i due byte successivi (agli indirizzi 0 e 1, sempre della ROM) determinano dove va a parare il processore, ossia all'indirizzo 243 + 175 x 256 = 45043.
In pratica permette di risparmiare i 257 byte della tabella e il pezzettino di codice per crearla. Di contro costringe a posizionare la routine di gestione dell'interrupt nella posizione fissa 45043. Però in caso di estrema necessità di spazio è una soluzione molto intelligente! ;-)



P.S. Ho dimenticato di dire che in tal caso occorre caricare il valore 59 (3B) nel registro I (il registro delle interruzioni, ossia: LD A,59: LD I,A) in modo che punti a quella tabella precostituita. Il valore 59, fa puntare ad un indirizzo compreso 59 x 256 = 15104 e 60 x 256 = 15360, che sono appunto tutti a 255 (FF). Non so se nei vari cloni dello Spectrum che sono stati prodotti questa zona è stata riempita con valori diversi da 255; in tal caso per quei cloni non funzionerebbe...

--

|_ /-\


Other related posts: