Funai, 1984
Un chip per ogni bit del colore: sovrapposti, ogni pixel prende un valore da zero a sette. Cinquecentododici tessere — e la tavolozza che le colora, letta fino al byte che sceglie il rosso del cuoricino.
Esh tiene la sua grafica in tre chip da 4 KB. Non sono tre pezzi di un magazzino più grande: sono sovrapposti. Il primo dice il bit basso di ogni pixel, il secondo quello di mezzo, il terzo quello alto — e messi insieme ogni pixel prende un valore da zero a sette.
Fanno cinquecentododici tessere da otto per otto: il doppio di quelle di Super Don, e con la metà dei colori per tessera. Due modi opposti di spendere lo stesso silicio.
Cercando il cuoricino che Alan ricordava, è saltata fuori una cosa che cambia la lettura di tutto questo magazzino. La tessera non è l’unità di disegno. Le tessere si prendono a quattro alla volta — due sopra e due sotto — e fanno una figura da sedici per sedici. Cinquecentododici tessere sono centoventotto figure.
Le tessere 480, 481, 482, 483 prese in quel modo danno una X. Prese una per una sono quattro pezzi di diagonale che non vogliono dire niente.
Se le tessere si accoppiano pari con dispari, il disegno deve proseguire attraverso la giuntura: l’ultima colonna della prima e la prima colonna della seconda accese insieme. Contate su tutto il magazzino, quelle righe continue sono 445.
Provando l’accoppiamento sbagliato — dispari con pari — sono zero. Non poche: nessuna.
Quello che conta le vite, in Esh, non è una cifra: è una figurina. Un cuore con un cappello e due gambe, che Alan ricordava dal cabinato — «non ho mai capito perché la vita era così… ma è carino».
Le tessere 124, 125, 126, 127 — le ultime quattro che disegnano qualcosa nella prima metà del magazzino. Le gambe sono aperte, come in un passo di cammino. — I colori sono quelli veri: li sceglie l’attributo che la ROM scrive quando disegna le vite, e il byte che lo dice è qui sotto.
Le sue quattro tessere, una per una: separate non vogliono dire niente, ed è la prova più semplice che l’unità di disegno sono quattro.
Nella prima stesura di questa pagina avevamo scritto che il cuore era la tessera 479. Era falso. Quella tessera, da sola, ha davvero la forma di un cuore — ma è il quarto in basso a destra di una figura più grande, che messa insieme è un ideogramma giapponese. Un quarto di ideogramma che per caso sembra un cuore.
L’errore non era nella lettura dei byte: era nella domanda. Cercavo una figura dentro un’unità che non è una figura.
Questa sezione, fino al 6 settembre 2026, si intitolava «e i colori di questa pagina sono sbagliati» e finiva con una promessa: fino a che non avremo letto chi sceglie la tavolozza, queste figure restano in grigio. La promessa è stata mantenuta, e per una ragione che vale la pena raccontare: non abbiamo scoperto niente di nuovo — abbiamo aperto quello che avevamo già in casa. La PROM dei colori sta dentro il set di ROM del gioco, j1_rgb.bin, 512 byte, dal primo giorno.
Matt Ownby ha ricostruito quella PROM in VHDL per poterla sostituire sulle schede vere. Abbiamo confrontato la sua ricostruzione con il binario di fabbrica: identici, 512 byte su 512. Da qui in avanti, sui colori di Esh, non stiamo più deducendo.
Il numero da zero a sette che esce dai tre chip non è un colore: è una casella. Il colore vero lo decide l’indirizzo con cui si interroga la PROM, e quell’indirizzo è fatto di quattro cose diverse:
| bit | che cos’è | chi lo decide |
|---|---|---|
| A0-A2 | l’indice del pixel (0-7) | i tre chip della grafica, sovrapposti |
| A3-A6 | la tavolozza (0-15) | il programma, nei bit 0-3 dell’attributo della cella |
| A7 | lo sfondo: nero trasparente, oppure blu | un interruttore globale sulla porta F5 — non sta nella cella |
| A8 | il lampeggio: fase spenta o normale | un pendolo hardware, scelto dai bit 6-7 dell’attributo |
⇒ La domanda vecchia — chi sceglie la tavolozza? — ha una risposta breve: l’attributo della cella, che il programma scrive nella seconda metà della memoria video. E un attributo lo abbiamo letto nella ROM, quello che ci interessava di più.
| tav. | le otto caselle | |||||||
|---|---|---|---|---|---|---|---|---|
| 0 (spenta) | ||||||||
| 1 | ||||||||
| 2 | ||||||||
| 3 | ||||||||
| 4 | ||||||||
| 5 | ||||||||
| 6 | ||||||||
| 7 | ||||||||
| 8 | ||||||||
| 9 | ||||||||
| 10 | ||||||||
| 11 | ||||||||
| 12 | ||||||||
| 13 | ||||||||
| 14 | ||||||||
| 15 | ||||||||
La prima casella di ogni tavolozza è quella dello sfondo: qui la vedete nera perché è il pixel trasparente, quello attraverso cui si vede il film del laserdisc. Con l’interruttore dello sfondo alzato diventa blu — ed è lo stesso blu per tutte e sedici: rgb(0, 0, 71). Il blu di Esh è uno solo.
La prima stesura di questa pagina aveva contato, senza sapere che cosa stesse contando: «64 tavolozze da otto caselle, 34 spente, 30 vive — due gruppi da quindici, identici fra loro tranne la prima casella: due sfondi per le stesse tinte». Erano quindici tavolozze vive per due sfondi: quel «tranne la prima casella» era esattamente l’interruttore A7. La misura era giusta; mancava il nome delle cose.
Nella ROM, all’indirizzo 3F9F, c’è questa fila di byte:
| 89 | 49 | 4E | 53 | 45 | 52 | 54 | 20 | 43 | 4F | 49 | 4E | FF |
| attributo | I | N | S | E | R | T | C | O | I | N | fine |
Quel 89 davanti alle lettere è l’attributo, e adesso si legge tutto: i bit bassi dicono tavolozza 9, i bit alti scelgono il canale del lampeggio. E le lettere, nelle tessere, sono disegnate con l’indice 7 su fondo 0 — cioè inchiostro e trasparenza, niente altro.
L’inchiostro della scritta è la casella 7 della tavolozza 9: #979797 — un grigio chiaro, non un bianco. Sullo schermo di un emulatore lo vedete più chiaro, #E0E0E0, perché Daphne applica una correzione per schiarire i colori: sta scritta nel suo codice, «to make colors brighter overall». È una scelta di chi emula, non della macchina.
📌 Quando abbiamo ricostruito quella scritta per il nostro disco, il colore lo avevamo preso a occhio da un video: #DFDFDF. Un punto su 255 di distanza da quello giusto.
Il lampeggio delle scritte non è una cosa che il programma fa a mano: è hardware. I bit 6-7 dell’attributo scelgono uno di quattro canali, e ogni canale ha la sua velocità. Le velocità stanno in otto byte dentro la ROM, all’indirizzo 035D:
| byte | canale | periodo | quanto lampeggia |
|---|---|---|---|
| 10 00 | bit 4 | 0 campi | fermo: non lampeggia |
| 20 02 | bit 5 | 2 campi | ≈ 15 volte al secondo |
| 40 04 | bit 6 | 4 campi | ≈ 7,5 volte al secondo |
| 80 07 | bit 7 | 7 campi | ≈ 4,3 volte al secondo |
La PROM dei colori è grande il doppio del necessario proprio per questo: metà tabella è «normale», metà è «lampeggio in corso». E in quella metà ci sono due soli valori: trasparente e blu. Vuol dire che una cella che lampeggia, nella fase spenta, non prende un altro colore: mostra soltanto lo sfondo — il film, se lo sfondo è trasparente; il blu, se è alzato l’interruttore.
Questa sezione, fino al 7 settembre 2026, si intitolava «le sue caselle, non i suoi colori» e finiva con una rinuncia: quel punto del codice, per il cuore, non l’abbiamo ancora letto. Adesso è letto, e la risposta è un byte.
0899 16 83 LD D,83 <- il codice della figura 089B 1E 0F LD E,0F <- l’ATTRIBUTO 089D CD 8F 05 CALL 058F disegna una figura grande 08A0 04 INC B 08A1 04 INC B due colonne più in là 08A2 25 DEC H una per ogni vita che ti resta 08A3 20 F8 JR NZ,089D
Che D ed E siano proprio il codice e l’attributo non è una supposizione: lo dice la routine a cui vengono consegnati.
059E DD 21 00 F0 LD IX,F000 il piano dei CODICI 05A2 FD 21 00 F4 LD IY,F400 il piano degli ATTRIBUTI 05AB DD 72 00 LD (IX+00),D 05AE FD 73 00 LD (IY+00),E
La figura. Per i codici da 80 a 8F la ROM calcola (codice − 64) × 4 — si legge a 05C4: SBC A,64 / SLA A / SLA A. Con D = 83: (0x83 − 0x64) × 4 = 31 × 4 = 124. Sono le quattro tessere del cuore, quelle che si vedono qui sopra.
Il colore. L’attributo 0F ha i quattro bit bassi accesi: tavolozza 15. Il bit 4 è spento — banco basso delle tessere, e infatti la 124 sta lì — e i due bit alti sono spenti: il cuore non lampeggia.
Il contatore delle vite di Esh, con i colori che gli dà la sua scheda: tavolozza 15, quella che sceglie l’attributo 0F.
| casella | il colore | pixel | che cos’è |
|---|---|---|---|
| 0 | trasparente | 160 | lo sfondo: il film del laserdisc si vede attraverso |
| 1 | #970000 | 53 | il corpo del cuore |
| 2 | #B80000 | 8 | il riflesso, un rosso più acceso |
| 3 | #979700 | 14 | il cappello |
| 4 | #979747 | 15 | il cappello, la parte chiara |
| 6 | #680000 | 6 | l’ombra e le gambette |
E la memoria di chi ci ha giocato aveva ragione. Alan lo ricordava dal cabinato — «non ho mai capito perché la vita era così… ma è carino» — e i byte gli danno un rosso scuro per il corpo, uno più acceso per il riflesso, e due gialli per il cappello.
E c’è una cosa che vale la pena dire sul come. Avevamo messo in conto di doverlo leggere a gioco acceso, andando a guardare la memoria video mentre il cuore stava a schermo. Non è servito: l’attributo non lo decide il momento, lo decide il programma, e quindi stava fermo nella ROM da quarant’anni. La domanda era piu’ facile di come l’avevamo fatta.
⚠ Quello che si vede qui è il colore che manda la scheda. Un emulatore può farlo più chiaro: Daphne (e con lui LGL) alza una gamma 4.0 «to make colors brighter overall», che è una scelta di chi emula, non della macchina del 1983.
Restano in grigio, ed è una scelta. Il colore di una figura non sta nella figura: sta nell’attributo che il programma scrive quando la disegna, e quel punto del codice va trovato una figura alla volta. Per il cuore l’abbiamo trovato; per le altre no, e finché non lo troviamo colorarle sarebbe mostrare un colore inventato con l’aria del colore vero.
⇒ Adesso però sappiamo come si fa, e questa è la differenza fra una cosa che manca e una cosa che non si sa.
📜 Come ci siamo arrivati, per chi vuole rifarlo: nessun codice di tessera sta scritto in chiaro nella ROM — cercare 7C 7D 7E 7F non dà niente, perché la figura è calcolata. La strada buona è partire da chi legge le vite (087D: LD HL,E3BF) e guardare che cosa disegna subito dopo.
a | (b<<1) | (c<<2).