Ho fatto qualche altro esperimento su come accedere al Plus ASIC da BASIC. Ho creato tre piccole routine per fermare il lampeggio dei colori, scrivere un valore nell’ASIC e rileggerlo. Queste routine possono risiedere in qualsiasi punto della memoria, tranne che nella pagina dell’ASIC tra &4000 e &7FFF. Utilizzando queste routine, non ci saranno problemi di sovrapposizione tra interrupt o codice BASIC e la pagina ASIC.
Ecco un piccolo programma per dimostrarlo. Magari questa soluzione ridurrà le incompatibilità con il compilatore BASIC. Non ho fornito comandi RSX per ridurre le dimensioni del blocco DATA.
MODE 2
100 MODE 0 : DEFINT a-z : memBase=&A600 : MEMORY memBase-1
110 ' === Sblocca ASIC.
120 DATA &FF,&00,&FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B,&15,&8A,&CD,&EE
130 FOR i=1 TO 17 : READ a : OUT &BC00,a : NEXT
140 ' === Installa routine assembler.
150 DATA &CF,&55,&8D,&F3,&DD,&66,&03,&DD,&6E,&02,&01,&B8,&7F,&ED,&49,&73
160 DATA &0E,&A0,&ED,&49,&FB,&C9,&F3,&DD,&66,&03,&DD,&6E,&02,&01,&B8,&7F
170 DATA &ED,&49,&7E,&0E,&A0,&ED,&49,&12,&FB,&C9
180 FOR i=0 TO 41 : READ a : POKE memBase+i,a : NEXT
190 stopFlashing = memBase+0 : asicPoke = memBase+3 : asicPeek = memBase+22
200 ' === Ridefinisci colori.
210 CALL stopFlashing
220 FOR i=0 TO 15
230 r=i : g=i : b=i
240 CALL asicPoke,&6400+i*2,b+16*r : CALL asicPoke,&6401+i*2,g
250 NEXT
260 ' === Disegna gradiente di colore e stampa i valori dei colori.
270 FOR x = 0 TO 639 STEP 2 : MOVE x,0 : DRAW x,399,x\40 : NEXT
280 FOR i=0 TO 15
290 a%=0 : CALL asicPeek,&6400+i*2,@a% : CALL asicPeek,&6400+i*2+1,@a%+1
300 LOCATE 1,i+1 : PEN 15 : PRINT HEX$(a%)
310 NEXT
320 ' ==== Fine (MODE ripristina i colori e riattiva il lampeggio).
330 CALL &BB18 : MODE 2
' ORG #A600
'
' stop_flashing:
' RST #0008 : DEFW #8D55 ;; LO_JUMP #0D55
'
' asic_poke: PRINT $-#A600
' DI ;; Disabilita gli interrupt.
' LD H,(IX+3) : LD L,(IX+2) ;; Ottieni il primo parametro con l'indirizzo.
' LD BC,#7FB8 : OUT (C),C ;; Attiva la pagina ASIC.
' LD (HL),E ;; Memorizza il valore del secondo parametro all'indirizzo.
' LD C,#A0 : OUT (C),C ;; Disattiva la pagina ASIC.
' EI : RET ;; Abilita gli interrupt e torna al BASIC.
'
' asic_peek: PRINT $-#A600
' DI ;; Disabilita gli interrupt.
' LD H,(IX+3) : LD L,(IX+2) ;; Ottieni il primo parametro con l'indirizzo.
' LD BC,#7FB8 : OUT (C),C ;; Attiva la pagina ASIC.
' LD A,(HL) ;; Carica il valore dall'indirizzo.
' LD C,#A0 : OUT (C),C ;; Disattiva la pagina ASIC.
' LD (DE),A ;; Memorizza il valore nel secondo parametro.
' EI : RET ;; Abilita gli interrupt e torna al BASIC.