[zxspectrum] Re: loader

  • From: "BODRATO Stefano" <Stefano.Bodrato@xxxxxxxxxxxxxxxx>
  • To: <zxspectrum@xxxxxxxxxxxxx>
  • Date: Tue, 14 Sep 2004 11:09:28 +0200

>Stando un po' più terra terra come si può eseguire quanto hai detto? 

Dunque, CHANS punta a una tabella che contiene le locazioni usate dagli stream 
di I/O (ovvero i comandi BASIC PRINT/INPUT/INKEY$ #1,#2,#3..).
Ogni canale ha una lettera che lo contraddistingue: 'K' per la tastiera, 'S' 
per lo schermo, 'P' per la stampante ecc..

La locazione di CHANS è 23732, e il puntatore è una word di 2 byte.
Per conoscerne il valore, devi fare PRINT PEEK 23631+256*PEEK 23632.

La tabella, quando impostata dalla ROM standard, è la seguente:

; CHANS                   $09F4           ; PRINT-OUT
;                         $10A8           ; KEY-INPUT
;                         $4B             ; 'K'
;
;                         $09F4           ; PRINT-OUT
;                         $15C4           ; REPORT-J
;                         $53             ; 'S'
;
;                         $0F81           ; ADD-CHAR
;                         $15C4           ; REPORT-J
;                         $52             ; 'R'
;
;                         $09F4           ; PRINT-OUT
;                         $15C4           ; REPORT-J
;                         $50             ; 'P'
;
;                         $80             ; End Marker

Ovviamente la tabella può essere estesa o modificata; è il sistema usato dalle 
routine che impostano la modalità a 64 colonne o dalle shadow ROM per 
aggiungere periferiche (microdrive, floppy, seriali, parallele, ecc..).
Ogni canale descritto occupa 5 byte; i primi 2 puntano alla routine per 
l'output, poi c'è il puntatore alla routine di input e un byte per la lettera 
che da il nome al canale.
Il valore che ti interessa è, nella tabella sopra, l'indirizzo puntato da 
CHANS+5, ovvero PRINT-OUT del canale 'S'.

Se non hai espansioni attive, la locazione è la 23739; se non sei un purista, 
puoi usare direttamente quella senza calcoli, visto che lo Spectrum 
all'accensione non ha shadow ROM attive.

PEEK 23739 da 244, mentre 23740 risponde con 9.  9*256+244 è appunto la 
locazione di PRINT-OUT.

Ora ti serve una locazione ROM che contenga 201, ovvero RET, per ritornare 
direttamente senza fare nulla.
10 FOR x=0 TO 16000
20 IF PEEK x=201 THEN PRINT x
30 NEXT X

82
124
148
160
...


Ok, 82 va benissimo.
Ora...   POKE 23739,82 : POKE 23740,0

NON PREMERE ENTER A VUOTO, ALTRIMENTI IL BASIC RISETTA AUTOMATICAMENTE I 
PUNTATORI !

...prova a fare PRINT 1234, oppure LIST (seguito da ENTER).


In sintesi:
        POKE 23739,82 : POKE 23740,0   -> disattiva la routine di PRINT
        POKE 23739,244 : POKE 23740,9  -> riattiva la routine di PRINT



Other related posts: