Modifica il kernal del VIC 20

Quando si accende un VIC-20 vengono da subito inizializzate alcune funzioni base, per esempio il colore dello sfondo e le scritte sullo schermo. Tali informazioni sono presenti nel cosidetto KERNAL Rom, in seguito su altre macchine prese il nome di Kernel.

Breve storia del Kernal

Il KERNAL nacque per il Commodore PET del 1977 e successivamente fu integrato anche nei Commodore VIC-20, Commodore 64, Commodore 16, Commodore Plus/4 e Commodore 128. Fu inizialmente scritto da John Feagans, che introdusse l’idea di separare le routine di base del sistema operativo e fu poi ulteriormente sviluppato da più persone, in particolare da Robert Russell, che aggiunse molte delle funzionalità per il VIC-20 e il C64.

All’inizio del suo sviluppo per il PET, il KERNAL era noto internamente a Commodore come kernel ma nel 1980 Russel sbagliò a scrivere il termine sui suoi appunti segnando kernal. Quando Neil Harris e Andy Finkel, coloro i quali erano deputati alla stesura della documentazione dei prodotti Commodore, iniziarono a lavorare sugli appunti di Russell per stilare il manuale del programmatore del VIC-20 non si accorsero dell’errore ortografico, riportandolo nei documenti ufficiali.

Un’altra versione, riportata dallo scrittore/programmatore Jim Butterfield e da altri, afferma invece che la parola KERNAL è l’acronimo (o forse l’acronimo inverso) di Keyboard Entry Read, Network, And Link, che infatti ha un certo senso considerando il ruolo stesso del KERNAL.

Berkeley Softworks usò in seguito il termine per dare un nome alle routine centrali del suo sistema operativo a GUI per i computer a 8 bit, il GEOS KERNAL.

L’errore fu corretto quando fu sviluppato il sistema operativo per la serie di computer Amiga: l’Amiga ROM Kernel utilizzava la trascrizione esatta.

Caratteristiche tecniche

Il KERNAL consisteva delle routine di basso livello, vicine all’hardware della macchina (a differenza delle routine di alto livello dell’interprete BASIC, anch’esse residenti in ROM), chiamabili tramite una jump table, di cui la parte centrale, per ragioni di retrocompatibilità, rimase nel corso degli anni sempre la stessa per tutti i computer della serie ad 8 bit.
La ROM del KERNAL occupava gli ultimi 8 KB dei 64 KB di spazio indirizzi della CPU (da $E000 a $FFFF). Diverse routine del KERNAL erano chiamabili attraverso una jump table presente nella pagina 3 della RAM (indirizzi $0300-$0333): le chiamate a queste routine potevano essere intercettate semplicemente modificando gli indirizzi presenti nella jump table di modo che puntassero a versioni modificate o sostitutive delle stesse, scritte dall’utente.

Esempio di codice

CHROUT  = $ffd2          ; CHROUT invia un carattere al dispositivo di output corrente
CR      = $0d            ; codice PETSCII per "Ritorno carrello" 
;
hello:
        ldx #0           ; inizia con il carattere in posizione 0
next:
        lda message,x    ; legge il carattere X-esimo del messaggio
        beq done         ; uscita dal ciclo quando viene letto un byte a zero
        jsr CHROUT       ; chiamata a CHROUT per visualizzare il carattere sul dispositivo
                         ; di output corrente (generalmente lo schermo)
        inx              ; prossimo carattere
        bne next         ; cicla finché il carattere letto non vale 0 - fine stringa
                         ; (lunghezza max. della stringa 255 byte)
done:
        rts              ; esce dalla subroutine
;
message:
        .byte "Hello, world!"
        .byte CR, 0      ; Ritorno carrello e 0, 0 è il marcatore di fine stringa

Sostanzialmente si tratta quindi di software inserito in pianta stabile in memorie hardware di tip ROM, cioè ad accesso in sola lettura, non riscrivibile, non cancellabile.

Per il VIC 20 esistevano diversi tipi di Kernal ufficiali, sviluppati per adattarsi a delle differenze regionali, per esempio per gestire un particolare idioma oppure per gestire il VIC PAL piuttosto che quello NTSC:

  • kernal.901486-02.bin – Commodore VIC-1001 (Japanese VIC-20, NTSC-M) KERNAL ROM.
  • kernal.901486-04.bin – Commodore VIC-20 KERNAL ROM, revision 4. Found in a early NTSC VIC-20. Provided by Jeff Schaap. Came on ceramic MOS part dated 0881.
  • kernal.901486-06.bin – Commodore VIC-20 KERNAL ROM, revision 6. Intended for NTSC-M systems. Probably not the first revision. But not the sixth revision either, since the BASIC ROM has the same part number.
  • kernal.901486-07.bin – Commodore VIC-20 KERNAL ROM, revision 7. Intended for PAL-B systems. Probably the last revision.
  • kernal.differences – Lists the differences between the VIC-20 KERNAL ROMs 901486-06 and
  • kernal.DKB_901486-07.bin – Commodore VIC-20 KERNAL ROM, 901486-07 version patched for Danish keyboard and character set.
  • kernal.NecP22081-206.bin – Commodore VIC-20 KERNAL ROM, 901486-07 version patched for Swedish/Finnish keyboard and character set. Chip markings: NEC JAPAN P22489-207 / D2364C 689 UE12 (Yes, it is a 8kb*8 mask-programmable ROM!).
  • vic20patchedkernalswe.bin – Fixes tape bug in Swedish Keyboard VIC-20s 901486-07.

LA GUIDA ALLA MODIFICA

Può nascere l’esigenza, anche per soli scopi di ludica soddisfazione, di cambiare alcune parti di questo codice ad esempio per cambiare i colori dello schermo all’accensione dlela macchina, oppure per cambiare le informazioni iniziali, come nella schermata seguente prodotta dall’amico ed appassionato Emanuele Siward:

schermata modificata nel Kernal

Si noti lo screenshot prodotto dall’uso dell’emulatore VICE, al quale si può dare in pasto il bin modificato per vederne subito gli effetti. Come abbiamo visto, infatti, per far girare un nuovo Kernal nel VIC va programmato un chip compatibile con l’originale.

Esistono anche chip programmabili con più Kernal, la cui selezione può avvenire tramite switch appositi (fisici oppure logici).

Vediamo i passi fatti per modificare il Kernal come da immagine sopra, guida di Emanuele Siward su un VIC-20 prodotto per l’Europa:

1) Scaricare il kernal originale daZimmers:

http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/vic20/index.html

kernal.901486-07.bin 2018-03-07 8192
Commodore VIC-20 KERNAL ROM, revision 7. Intended for PAL-B systems.
Probably the last revision.

2) Aprire il file bin con un hex editor come HxD (https://mh-nexus.de/en/)

3) Sostituire il colore dei caratteri all’offset 5500. L’originale è 06 (blue), nel mio caso l’ho sostituito con 03 (cyan), secondo la seguente tabella:

0 BLK Black
1 WHT White
2 RED Red
3 CYN Cyan
4 PUR Purple
5 GRN Green
6 BLU Blue
7 YEL Yellow

4) Sostituire il colore di bordo e sfondo all’offset DF03. L’originale è 1B (27 in decimale: bordo cyan, sfondo bianco), io l’ho sostituito con bordo e sfondo neri (08 sia in hex che in decimale), secondo la tabella 2 che si trova all’URL:

https://www.atarimagazines.com/compute/issue20/202_1_VIC_Color_Tips.php

5) Infine sostituire il testo mostrato all’avvio. In questo caso basta cercare il testo “V2” o andare all’offset 4309 per modificare il testo:

**** CBM BASIC V2 ****

Nel mio caso l’ho cambiato con:

** MOON BASE STAR 8 **

6) A questo punto si può salvare il file BIN e testarlo sull’emulatore VICE (Settings->Settings->Machine->ROM->Kernal) ed effettuare un hard reset, oppure flasharlo su una eprom 27Cxxx ed utilizzare un adattatore tipo questo https://github.com/SukkoPera/Open2327RomAdapter per utilizzarlo su un vero VIC-20.

Buon divertimento!


Lascia un commento

Il tuo indirizzo email non sarà pubblicato.