tutorial · gerla.cc
Il ciclo di vita di un gioco
Un videogioco, sotto tutto il resto, è un anello che gira: parte, aspetta la pressione del tasto, dà tre vite, le porta via una a una, dice game over, salva il record e ricomincia. Vediamo com'è fatto quell'anello, fase per fase, sui due ambienti in gioco: Commodore 64 (6502) e Mega Drive (68000). Tutto in assembler, con il codice spiegato riga per riga dai commenti.
Nota: nel gioco vero, sul Mega Drive scrivo la logica in C. Qui però mostro l'ossatura in 68000 assembly, perché un tutorial sul loop rende di più a nudo: è esattamente quello che il compilatore produce, e che la macchina esegue davvero.
accendi la macchina, prepara tutto
aspetta che premi FUOCO / START
Accendere la macchina
All'accensione la macchina esegue il primo indirizzo che le diciamo. Prima di ogni cosa mettiamo a tacere le interruzioni, sistemiamo lo schermo e i registri video, e azzeriamo le variabili: quante vite, che punteggio. Poi si salta alla schermata home. È il gesto d'apertura, si fa una volta sola.
C64 · 6502
Mega Drive · 68000
Stessa idea, due dialetti: spegni il rumore, prepara il video, imposta vite e punteggio, vai al titolo.
Aspettare che premi il tasto
La schermata home fa una cosa sola: aspetta. Disegna «PREMI FUOCO» e poi gira in un piccolo anello leggendo il joystick a ogni frame, finché non premi. Il trucco è la pazienza: un giro dell'anello per ogni quadro video, così il controllo resta reattivo senza mangiarsi la macchina. Appena arriva il tasto, si salta alla partita.
C64 · 6502
Mega Drive · 68000
Un ciclo che non fa nulla se non ascoltare. Il gioco vero comincia solo quando decidi tu.
Il cuore: un frame alla volta
Qui vive il gioco. Ogni giro dell'anello è un fotogramma: aspetti l'inizio del quadro (il vblank, il momento in cui il pennello video torna in cima), leggi i comandi, muovi il personaggio, muovi i nemici, controlli le collisioni. Se sei ancora vivo, riparte il giro. Sessanta volte al secondo, sempre uguale. Tutta l'azione che vedi è questo anello che gira in fretta.
C64 · 6502
Mega Drive · 68000
Il wait_vblank è il metronomo: senza, il gioco andrebbe a velocità diverse su macchine diverse. Con, tutto scorre a tempo.
Morire, e contare le vite
Quando muori, l'anello della partita si spezza e si arriva qui. La regola è semplice: togli una vita. Se ne restano, rimetti il personaggio in pista e torni a giocare. Se sei a zero, la strada porta al game over. Una sottrazione decide tutto.
C64 · 6502
Mega Drive · 68000
Il dec/subq abbassa il contatore e, di colpo, imposta anche il segnale «è zero?». Il salto subito dopo legge quel segnale: niente confronti in più.
Salvare il punteggio più alto
Finita la partita, si confronta il punteggio con il record. Se l'hai battuto, il record si aggiorna. Ed è qui che i due mondi si separano davvero. Sul Mega Drive la cartuccia può avere una SRAM con batteria: scrivi lì il record e resta anche a console spenta, per sempre. Sul C64 non c'è batteria: il record vive in RAM per la sessione, e se lo vuoi eterno lo salvi su disco. Stessa idea, due modi di ricordare.
C64 · 6502
Mega Drive · 68000
Il confronto a 16/32 bit si fa un pezzo alla volta, dal byte più pesante: se quello decide, il resto non serve nemmeno guardarlo.
E si ricomincia
Ultimo anello: si aspetta un attimo, o un tasto, e si torna alla schermata home. Il cerchio si chiude e la macchina è di nuovo pronta ad aspettare il prossimo giocatore. È lo stesso jmp title del primo giorno: da qui, tutto ricomincia.
C64 · 6502
Mega Drive · 68000
Nota che il record NON si azzera: vite e punteggio ripartono, ma il primato resta. È la memoria del gioco.
Un anello dentro un anello
Tutto qui: un anello grande (home → partita → game over → home) e dentro un anello piccolo che gira sessanta volte al secondo (la partita, frame per frame). Cambiano il dialetto e i dettagli della macchina, ma la forma è la stessa dal 1982 a oggi, e anche nel gioco HTML5 da cui sono partito. Impari questo, e hai imparato l'ossatura di qualunque gioco.