Logo
Home Cerca Pannello

Architettura di base

Marco Vaccaro - 📅 30/10/2026 - ← Torna a Nostalgia 64

Prima di scrivere una singola riga o tentare acrobazie tecniche, il commodore 64 va conosciuto a fondo. Non si domina l'hardware senza averne prima mappato il territorio strato per strato. In questa fase iniziale, quindi, presentiamo la macchina smontandone l'architettura di base senza filtri.

Il processore centrale del commodore 64 non è il 6502 standard, ma il mos 6510. La differenza architetturale fondamentale è la presenza di una porta I/O bidirezionale a 6 bit mappata internamente agli indirizzi $0000 e $0001. Questo registro permette al sistema di effettuare il memory banking, spegnendo e accendendo dinamicamente banchi di rom o registri di I/O per esporre la ram nascosta al di sotto, aggirando il limite naturale dei 64 kb di spazio di indirizzamento della cpu.

Mappa della memoria (configurazione all'accensione)

  • $0000-$00ff (0-255) - Zero page: L'area nevralgica della macchina. La cpu impiega un ciclo di clock in meno per accedere a questa pagina rispetto al resto della ram. Serve per l'indirizzamento indiretto e indicizzato. Il basic e il kernal la saturano quasi totalmente con puntatori a 16 bit e variabili di sistema critiche. Sviluppando in assembly devi usare i pochi byte liberi garantiti (come quelli da $fb a $fe) per evitare che il sistema operativo si corrompa.

  • $0100-$01ff (256-511) - Stack del processore: Struttura lifo cablata in hardware nel 6510. Il puntatore dello stack parte da $01ff e decresce.

  • $0200-$03ff (512-1023) - Variabili kernal e vettori: Contiene i puntatori hardware, tra cui l'irq (interruzione hardware) a $0314. Modificando questo indirizzo si dirotta l'esecuzione per far girare le proprie routine agganciate al pennello video.

  • $0400-$07e7 (1024-2023) - Video ram: I mille byte della matrice dello schermo, dove il chip video vic-ii legge i caratteri da stampare.

  • $0800-$9fff (2048-40959) - Ram del basic: I famosi 38911 byte free. È lo spazio dove vengono allocati il codice tokenizzato e le variabili quando scrivi un programma.

  • $a000-$bfff (40960-49151) - Rom basic v2: L'interprete di sistema da 8 kb.

  • $c000-$cfff (49152-53247) - Ram libera: Un segmento di 4 kb totalmente ignorato dalle routine di sistema. È la zona di parcheggio ideale per sprites, caratteri custom o piccole routine in assembly.

  • $d000-$dfff (53248-57343) - Spazio di I/O: Mappa i registri hardware per controllare vic-ii (video), sid (audio) e cia 1/2 (joystick, timer e I/O). In alternativa ospita la rom dei caratteri.

  • $e000-$ffff (57344-65535) - Rom kernal: Il sistema operativo di basso livello da 8 kb che gestisce interruzioni, tastiera e operazioni su datassette o disco.

L'interprete basic e l'esecuzione

L'interprete commodore basic v2 risiede nella rom a $a000 ed è costituito da codice macchina eseguito costantemente in loop dal 6510. Quando scrivi codice in basic, l'interprete non esegue subito il testo puro ma esegue una fase di tokenizzazione: comprime i comandi testuali (ad esempio la stringa print) in singoli byte identificativi, stivandoli sequenzialmente nella ram a partire dall'indirizzo $0801.

Lanciando il programma con run, il ciclo di valutazione entra in azione istruzione per istruzione: il sistema legge il token, salta alla routine corrispondente in rom (che esegue fisicamente il lavoro), aggiorna le variabili residenti in ram ed effettua i calcoli utilizzando librerie matematiche in virgola mobile. Questa sovrastruttura di conversione e salto in tempo reale causa enormi colli di bottiglia e latenze, distruggendo qualsiasi pretesa di calcolo puro o elaborazione grafica in tempo reale.

Assembly 6510 e l'innesco da basic

Per interfacciarsi direttamente ai registri hardware senza perdite di cicli, si usa il linguaggio macchina. La cpu smette di interpretare dati e comincia a prelevare OPCODE nativi dalla memoria, eseguendoli al volo nel ciclo di clock successivo.

Se intendi mantenere in vita il basic e caricare routine macchina aggiuntive, il punto più sicuro in cui compilare è $c000 (49152). Se il progetto è autonomo e necessita di tutta la ram disponibile, si compila l'assembly per occupare l'area a partire da $0801, schiacciando la memoria utile del basic. In questo scenario si inietta nei primi byte del file prg un "basic stub", un micro array pre-tokenizzato che fa comparire a schermo l'equivalente della seguente riga:

Basic
10 sys 2064

Quando l'utente digita run, l'interprete basic avvia la riga e legge il comando sys diretto alla locazione di memoria decimale 2064 (ovvero $0810), congelando di colpo il layer basic e cedendo in via definitiva l'esecuzione al codice macchina che si trova allocato a quell'indirizzo.