GERLA.CC

Diario di sviluppoDevelopment journal

Gli appunti dei miei esperimenti, in ordine dal più recente. Onestà al 100%: cosa ha funzionato, cosa è crollato, cosa ho imparato. Qui dentro finiscono due filoni: i giochi per le macchine dell'epoca, dal Commodore 64 al Game Boy Advance, e il software, gli strumenti che scrivo per lavorare e che ogni tanto vale la pena passare a qualcun altro. Premessa d'obbligo: a tutto questo ci lavoro a tempo perso, la sera tardi, quando i bambini sono a letto. Il ritmo è quello che è. Notes on my experiments, newest first. 100% honest: what worked, what collapsed, what I learned. Two threads end up in here: the games for period machines, from the Commodore 64 to the Game Boy Advance, and the software, the tools I write to work with and that now and then are worth handing to someone else. Fair warning: I work on all of this in my spare time, late at night, once the kids are in bed. The pace is what it is.

7 settembre 2026September 7, 2026 · Commodore 64

Due disegni, una domenica, e un C64Two drawings, a Sunday, and a C64

Fuori programma, e per una volta non è roba mia. Matteo85 è alle prime esperienze con la grafica sul Commodore 64 e mi ha mandato due disegni: un SUV e una rana. La domanda dietro era concreta, funzionano?, e a quel tipo di domanda si risponde più in fretta facendo girare i disegni che discutendone.

Off schedule, and for once it isn't my own stuff. Matteo85 is just starting out with Commodore 64 graphics and sent me two drawings: a SUV and a frog. The question behind them was a concrete one, do these work?, and that kind of question is answered faster by running the drawings than by discussing them.

Così in un paio d'ore, nei ritagli di una domenica, li ho messi in strada. È venuta fuori una corsa senza fine: guidi, eviti le rane, una rana superata viva vale punti e una schiacciata costa una vita, e ne hai tre. Si accelera, si frena, si suona il clacson, e il clacson per un secondo fa scappare le rane. Non c'è traguardo. Il nome, Save The Frogs, gliel'ha dato lui.

So in a couple of hours, in the gaps of a Sunday, I put them on the road. Out came an endless run: you drive, you avoid the frogs, a frog you pass alive is worth points and one you flatten costs a life, and you get three. You accelerate, you brake, you sound the horn, and the horn scatters the frogs for a second. There's no finish line. The name, Save The Frogs, is his.

Save The Frogs in esecuzione sul Commodore 64

Il pezzo interessante però non è il gioco, è quello che serviva a spiegare. Uno sprite su questa macchina si capisce molto prima vedendolo muovere che leggendone la definizione, e allora l'ho scritto per bene: gli sprite del C64, spiegati mettendoli in strada. Otto disegni che il chip video sposta da solo senza che la CPU ridisegni niente, la griglia da 24 per 21, un colore tuo più due presi in prestito da tutti gli altri sprite, i 63 byte usati dentro un blocco da 64, l'ombra che non è disegnata ma calcolata da quattro righe di codice, la trappola del nono bit che fa teletrasportare l'oggetto a metà schermo, e la cosa che conta più di tutte: perché la strada non è uno sprite.

The interesting part, though, isn't the game, it's what it was there to explain. A sprite on this machine is understood far sooner by watching one move than by reading its definition, so I wrote it out properly: C64 sprites, explained by putting them on the road. Eight drawings the video chip moves on its own with the CPU redrawing nothing, the 24 by 21 grid, one colour of your own plus two borrowed from every other sprite, the 63 bytes used inside a 64-byte block, the shadow that isn't drawn but computed by four lines of code, the ninth-bit trap that teleports your object halfway across the screen, and the thing that matters most: why the road isn't a sprite.

Nel tutorial c'è anche un video di otto minuti che racconta tutto il percorso, dai pixel al gioco, coi sottotitoli in italiano, e il PRG da caricare in VICE o su una macchina vera.

The tutorial also has an eight-minute video telling the whole path, from pixels to game, with Italian subtitles, plus the PRG to load in VICE or on a real machine.

Leggi il tutorial Scarica il PRG

Read the tutorial Download the PRG

5 settembre 2026September 5, 2026 · Game Boy Advance

VECTOR v0.44.0: il robot non pesava nienteVECTOR v0.44.0: the robot didn't weigh anything

Stesse dodici camere, stessi enigmi, stesso file. Quello che è cambiato è la cosa che fai fra un enigma e l'altro: camminare. Un collaudatore l'ha detta senza giri: il robot non pesava niente.

Same twelve rooms, same puzzles, same file. What changed is the thing you do between the puzzles: walking. A tester put it plainly: the robot didn't weigh anything.

È il tipo di critica che all'inizio sembra vaga e poi si rivela la più concreta di tutte, perché una volta che vai a misurare scopri che ha una causa numerica precisa. Anzi tre.

It's the kind of criticism that sounds vague at first and turns out to be the most concrete of all, because once you go and measure you find it has a precise numeric cause. Three of them, actually.

Correva tutto il tempo. Due punti per quadro, per una figura alta ventotto punti, fanno quattro altezze e mezzo al secondo. Quella non è una camminata, è uno scatto. A quella velocità il piede toccava terra dieci volte al secondo, e non c'è disegno né suono che faccia sembrare pesanti dieci passi al secondo: qualunque falcata tu disegni, quello che si vede è un ticchettio. A terra adesso fa 1,25 punti per quadro. Sei passi al secondo invece di dieci.

He was running the whole time. Two points per frame, for a figure twenty-eight points tall, is four and a half body heights a second. That isn't a walk, it's a sprint. At that speed his foot hit the floor ten times a second, and no drawing and no sound can make ten footfalls a second feel heavy: whatever stride you draw, what you see is a patter. On the ground he now does 1.25 points per frame. Six footfalls a second instead of ten.

Il salto invece non l'ho toccato. In aria il tetto resta due punti per quadro, e chi salta mentre cammina parte alla velocità piena. Non è un vezzo, è un obbligo: quattro blocchi di salto sono la misura su cui è costruita metà delle camere, e se il balzo si accorciasse i livelli smetterebbero di funzionare. Poi si dà il caso che sia anche giusto da guardare: una cosa pesante non passa dal passo al volo, si raccoglie e si butta.

The jump I didn't touch at all. In the air the ceiling is still two points per frame, and anyone who jumps while walking launches at the full speed. That isn't a flourish, it's a requirement: four blocks of jump is the measurement half the rooms are built on, and if the leap got shorter the levels would stop working. It also happens to be right to look at: a heavy thing doesn't go from a step to a flight, it gathers itself and throws.

Il ginocchio non si disegna più, si trova. La gamba vecchia aveva una lunghezza fissa: la caviglia stava cinque punti sotto il ginocchio e ci restava, sempre. Con quel vincolo il piede non poteva staccarsi da terra e il ginocchio non aveva nessun motivo di piegarsi, quindi quello che rimaneva era un busto che scivolava in avanti con le cosce che si muovevano appena.

The knee isn't drawn any more, it's found. The old leg had a fixed length: the ankle sat five points below the knee and stayed there, always. With that constraint the foot could never leave the ground and the knee had no reason to bend, so what was left was a torso sliding forward with its thighs moving slightly.

Adesso la gamba è due ossa, e quello che muovo è il piede, non gli angoli. Per metà del ciclo il piede è inchiodato al pavimento mentre il corpo gli passa sopra; per l'altra metà vola avanti e si alza, con il tallone che parte prima della punta. Il ginocchio non è un numero che scrivo: è, fra le due posizioni possibili, quella che userebbe un ginocchio vero, cioè quella che punta in avanti, e si piega di quanto serve perché la gamba non si allunga. Il corpo cala di due punti quando i piedi sono lontani, che è anche quello che permette alla gamba di arrivare fin lì, ed è quello che fa una cosa pesante dove scarica il peso.

Now the leg is two bones, and what I move is the foot, not the angles. For half the cycle the foot is nailed to the floor while the body passes over it; for the other half it flies forward and lifts, with the heel leaving before the toe. The knee isn't a number I write: of the two possible positions it's the one a real knee would use, the one pointing forward, and it bends by however much is needed because the leg cannot stretch. The body sinks two points when the feet are far apart, which is also what lets the leg reach that far, and is what a heavy thing does where it puts its weight down.

E i piedi non pattinano più. Questo era il difetto vero, ed era misurabile: la falcata disegnata si apriva di sei punti, mentre il gioco faceva avanzare il ciclo come se fosse tredici. Quei sette punti di differenza a ogni passo uscivano da qualche parte, e uscivano dal piede piantato che strisciava sul pavimento.

And the feet no longer skate. This was the real fault, and it was measurable: the drawn stride opened to six points, while the game advanced the cycle as if it were thirteen. Those seven points of difference at every step came out of somewhere, and they came out of the planted foot sliding along the floor.

Il passo disegnato apriva sei punti mentre il gioco ne avanzava tredici: la differenza usciva dal piede che strisciava PRIMA piede piantato il disegno apre 6 il gioco avanza 13 7 punti che il piede striscia, a ogni passo ADESSO piede fermo dov'e' stato messo il disegno apre 6 il gioco avanza 6

Il rimedio non è ritoccare i disegni: è cambiare che cosa comanda il ciclo. Adesso lo comanda la distanza percorsa e non il tempo, quindi falcata disegnata e falcata percorsa sono lo stesso numero, e il piede resta dove è stato messo a qualunque velocità.

The fix isn't retouching the drawings: it's changing what drives the cycle. Now it's driven by distance travelled and not by time, so the drawn stride and the travelled stride are the same number, and the foot stays where it was put at any speed.

E adesso lo senti. L'atterraggio prima era completamente muto: potevi saltare mezza stanza e toccare terra senza niente, nessun suono, niente che si muovesse. Una cosa che atterra in silenzio non pesa. Ci sono i passi, sui due quadri in cui il tallone si pianta davvero, così il suono ti dice quale disegno stai guardando; e i due piedi non suonano uguali, perché nessuno appoggia i due piedi con lo stesso peso, e soprattutto perché due rumori identici sei volte al secondo sono un sonaglio, mentre due rumori diversi sono un'andatura. C'è un tonfo all'atterraggio, lo stesso rumore tenuto molto più basso e molto più lungo: il peso che arriva tutto insieme invece che a metà per volta. La finestra sobbalza e si riassesta in sei quadri: il tonfo dice che è atterrato, il sobbalzo dice quanto pesa. E incassa: per due quadri dopo l'atterraggio la figura è disegnata un punto più in basso. Un punto si legge come gambe che assorbono; due si leggerebbero già come piedi che sprofondano nel pavimento.

And now you can hear him. Landing used to be completely silent: you could leap half a room and touch down with nothing, no sound, nothing moving. A thing that lands in silence weighs nothing. There are footsteps now, on the two frames where the heel actually plants, so the sound tells you which drawing you're looking at; and the two feet don't sound the same, because nobody puts both feet down with the same weight, and above all because two identical noises six times a second are a rattle, while two different ones are a gait. There's a thud on landing, the same noise held much lower and much longer: the weight arriving all at once instead of half at a time. The window jolts and settles over six frames: the thud says he landed, the jolt says how much he weighs. And he takes the hit: for two frames after landing the figure is drawn one point lower. One point reads as legs absorbing; two would already read as feet sinking into the floor.

Tre cose sistemate. Fuori dalla camera non c'era niente: con la finestra che sobbalza di qualche punto oltre il bordo sarebbe comparsa una fascia nera lungo un lato, quindi adesso la mappa è riempita di muro fin dove arriva, e il muro semplicemente continua. Non costa niente, perché la mappa intera viaggia dentro la cartuccia comunque. Un colpo che prende qualcosa che non è un pannello adesso lo dice: butta una scintilla, del colore del varco che stavi cercando di piazzare, e ti dice due cose in una, che la pistola ha sparato e che lì non attacca. La camera 4 ha di nuovo i pannelli: l'acido si può ancora attraversare aspettando la navetta, come insegna la stanza, oppure ci si butta dentro il varco sul ciglio e si esce dalla parete in fondo, già dall'altra parte.

Three things fixed. Outside the room there was nothing: with the window jolting a few points past the edge, a black band would have appeared along one side, so now the map is filled with wall as far as it goes, and the wall simply carries on. It costs nothing, because the whole map ships in the cartridge anyway. A shot that hits something that isn't a panel now says so: it throws a spark, in the colour of the portal you were trying to place, and it tells you two things at once, that the gun fired and that it doesn't stick there. Room 4 has panels again: the acid can still be crossed by waiting for the shuttle, the way the room teaches, or you can drop into the portal on the lip and come out of the far wall, already across.

Una corsa pulita su tutte e dodici adesso è di circa due minuti e cinquanta. Prima era due e trenta. I venti secondi in più sono tutti camminata, che è esattamente quello che dovevano essere.

A clean run of all twelve is now about two minutes fifty. It was two thirty. The extra twenty seconds are all walking, which is exactly what they were supposed to be.

Scarica la ROM La scheda del gioco

Download the ROM The game page

4 settembre 2026September 4, 2026 · Game Boy Advance

VECTOR v0.43: la telecamera si muove, e c'è LA TORREVECTOR v0.43: the camera moves, and there's THE TOWER

Stessa demo, build nuova. Le camere sono sempre dodici, ma non sono quelle di prima: sono state rifatte tutte e dodici, e il motore si è preso una telecamera.

Same demo, new build. There are still twelve rooms, but they aren't the ones from before: all twelve have been rebuilt, and the engine grew a camera.

La telecamera che scorre nella torre, all'ingresso della camera

Il giro di ricognizione: entri, e la finestra va a vedere il fondo prima di restituirti i comandi.

The look around: you walk in, and the window goes to see the far end before it hands you the controls.

La telecamera. Prima ogni camera era esattamente uno schermo, 15 blocchi per 10: tutta la stanza ti stava davanti dal primo quadro, e insieme alla stanza ci stava anche la sua soluzione. Adesso lo sfondo è 512 per 512 invece di 512 per 256, la finestra ti segue, ogni camera è larga due schermi e l'ultima è anche alta due schermi. Una stanza non si legge più dalla soglia: bisogna entrarci.

The camera. Rooms used to be exactly one screen, 15 blocks by 10: the whole room was in front of you from the first frame, and so was its answer. Now the background is 512 by 512 instead of 512 by 256, the window follows you, every room is two screens wide and the last one is also two screens tall. A room can no longer be read from the doorway: you have to walk into it.

La finestra non stacca mai. Quando un varco ti sputa dall'altra parte della stanza la vista slitta dietro di te e frena arrivando, e non ti lascia mai uscire dall'inquadratura. Sembra un dettaglio e non lo è: uno stacco secco su un teletrasporto ti fa perdere l'orientamento ogni singola volta.

The window never cuts. When a portal throws you across the room the view slides after you, braking as it arrives, and it never lets you leave the frame. That sounds like a detail and it isn't: a hard cut on a teleport makes you lose where you are, every single time.

Il giro di ricognizione. Allargare le camere ha creato un problema che non avevo previsto: entri, e metà stanza ti è rimasta dietro. La porta, il pulsante, la cascata: non puoi sapere che ci sono. Così adesso, appena entri, la telecamera va a vedere: la finestra scorre fino in fondo, si ferma un attimo, e torna da te; nella camera alta sale anche. Dura poco più di due secondi e i tasti sono morti finché non ha finito, perché altrimenti cammini alla cieca e sei nell'acido prima di aver visto qualcosa. Quando muori non si ripete: la stanza l'hai già vista, e rivedertela a ogni errore sarebbe una punizione, non un aiuto.

The look around. Widening the rooms created a problem I hadn't seen coming: you walk in and half the room is behind you. The door, the button, the waterfall: you can't know they're there. So now, as you enter, the camera goes to look: the window sweeps to the far end, holds a beat, and comes back to you; in the tall room it goes up as well. It takes a little over two seconds and the buttons are dead until it's done, because otherwise you start walking blind and you're in the acid before you've seen anything. It doesn't replay when you die: you've already seen the room, and watching it again on every mistake would be a punishment, not a help.

LA TORRE. L'ultima camera è 30 blocchi per 20, la prima del gioco più alta dello schermo. Uno scarico in cima versa una cascata che cade per tutta l'altezza e attraversa i due piani: per gran parte della stanza è l'unica cosa che si veda da entrambi.

THE TOWER. The last room is 30 blocks by 20, the first in the game taller than the screen. A drain at the very top pours a waterfall that falls the whole height and crosses both floors: for most of the room it's the only thing you can see from both.

La torre intera, alta due schermi

La torre intera, quella che a schermo non ci sta: due piani, la cascata che li attraversa, e il ballatoio col buco da tappare.

The whole tower, the one that doesn't fit on screen: two floors, the waterfall crossing them, and the mezzanine with the gap to plug.

A terra c'è una vasca, asciutta, a quindici blocchi da dove batte l'acqua. Varco per terra dove cade l'acqua, varco nel soffitto sopra la vasca, e l'acqua attraversa la torre. La vasca piena è l'interruttore che non torna più su: apre la porta di sopra e alza l'ascensore che tappa il buco del ballatoio, due cose che succedono fuori campo e che scopri salendo. Di sopra la porta sta su una mensola quattro blocchi sopra il pavimento, fuori dalla portata di qualunque salto: e sono gli stessi due varchi a rifarlo, il pannello nella parete di sinistra preso di sbieco dal basso, poi il pannello nel pavimento sparato ai propri piedi. Si cade verso l'alto. La prima volta i varchi spostano l'acqua, la seconda spostano te.

On the ground there's a tub, dry, fifteen blocks from where the water lands. Portal on the ground where the water falls, portal in the ceiling above the tub, and the water crosses the tower. The full tub is the switch that never comes back up: it opens the door upstairs and raises the lift that plugs the gap in the mezzanine, two things that happen off-screen and that you find out about on the way up. Upstairs the door sits on a shelf four blocks above the floor, out of reach of any jump: and it's the same two portals doing it again, the panel in the left wall taken at an angle from below, then the panel in the floor shot at your own feet. You fall upwards. The first time the portals move the water, the second time they move you.

La cascata nella torre

E le prime sei camere non sono più il tutorial che erano. Insegnano le stesse sei cose nello stesso ordine, ma ognuna adesso ha un secondo problema appeso al primo. Nella camera dei varchi l'acido è largo dodici blocchi e resta una sola parete buona, in fondo: l'altro varco deve andare per terra. Ci cadi dentro ed esci dal muro, già dall'altra parte. È la regola su cui è costruito tutto il gioco, e lì viene detta ad alta voce. Nella camera del cubo attraversi il pavimento, esci dal soffitto e sterzi mentre cadi, perché la mensola si prende solo tenendo premuto destro in caduta. Nella camera della torretta il cubo è insieme il tuo scudo e la tua unica arma, e non puoi usarlo come tutti e due nello stesso momento.

And the first six rooms are no longer the tutorial they were. They teach the same six things in the same order, but each now has a second problem hanging off the first. In the portal room the acid is twelve blocks wide and only one good wall is left, at the far end: the other portal has to go on the floor. You drop in and come out of the wall, already on the far side. That's the rule the whole game is built on, and there it gets said out loud. In the cube room you go through the floor, come out of the ceiling and steer while falling, because the shelf is only reachable by holding right on the way down. In the turret room the cube is both your shield and your only weapon, and you can't use it as both at once.

Una corsa pulita su tutte e dodici adesso è di circa due minuti e mezzo. Prima era un minuto e trentotto.

A clean run of all twelve is now about two and a half minutes. It was one minute thirty-eight before.

Tre cose sistemate, e la prima è la più istruttiva. La cascata si fermava a mezz'aria: il getto era fatto di sette sprite, che coprono 224 punti, esattamente quanto basta per una camera alta uno schermo. Nella torre la caduta è di 288, e l'acqua semplicemente finiva, con l'aria sotto. Adesso quel numero è misurato sulla camera più alta del gioco invece che sulla più comune. L'edera cresceva nelle camere pulite: la casella vuota nella tabella delle piante era marcata -1, e il gioco saltava solo le caselle sotto -100, quindi ogni stanza in ordine si accatastava in silenzio quattordici rampicanti contro la parete sinistra, e a colpo d'occhio sembravano perfino al posto giusto. Il ponte mobile ti faceva cadere dal suo stesso bordo: adesso ha il piano più largo e un parapetto, e puoi tenere premuto avanti per tutta la corsa.

Three things fixed, and the first is the most instructive. The waterfall used to stop in mid-air: the jet was built from seven sprites, covering 224 pixels, exactly enough for a room one screen tall. In the tower the fall is 288, and the water simply ended, with air underneath. Now that number is measured against the tallest room in the game instead of the most common one. Ivy grew in the clean rooms: the empty slot in the plant table was marked -1, and the game only skipped slots below -100, so every tidy room quietly stacked fourteen creepers against its left wall, and at a glance they even looked like they belonged. The moving bridge used to walk you off its own edge: it has a wider deck and a parapet now, and you can hold forward for the whole ride.

La cartuccia aggiornata è qui sotto. Gira su emulatore e su hardware vero con una flashcart, e il numero di build è scritto in basso a sinistra sulla schermata del titolo, così non può essere una bugia scritta a mano.

The updated cartridge is below. It runs on emulators and on real hardware with a flashcart, and the build number is written at the bottom left of the title screen, so it can never be a hand-typed lie.

Da allora è uscita la 0.44.0, che non tocca gli enigmi ma rifà la camminata: è raccontata qui. Quello che si scarica è sempre l'ultima build.

Since then 0.44.0 has come out, which doesn't touch the puzzles but redoes the walk: it's told here. What you download is always the latest build.

Scarica la ROM La scheda del gioco

Download the ROM The game page

4 settembre 2026September 4, 2026 · Game Boy Advance

Dodici camere: la seconda metà è lo stesso posto, anni dopoTwelve rooms: the second half is the same place, years later

Dalle sei camere di cui scrivevo ieri si è arrivati a dodici, e la cosa interessante non è il numero: è che la seconda metà non è un mondo nuovo. È lo stesso impianto, visto anni dopo.

From the six rooms I wrote about yesterday we've got to twelve, and the interesting part isn't the number: it's that the second half isn't a new world. It's the same facility, seen years later.

La scheda di presentazione della prima parte, THE PLANT

Il gioco è diviso in due, e ogni metà si presenta con una scheda. La prima: «qui funziona ancora tutto. Le porte si aprono. L'acqua scorre. Le macchine aspettano ordini.»

The game is split in two, and each half introduces itself with a card. The first one: "everything still works here. The doors open. The water runs. The machines wait for orders."

Le prime sei sono l'impianto in funzione. Cubi da portare e posare sui pulsanti, porte che si aprono quando arrivi, torrette che ti vedono e sparano, raggi da spezzare col cubo, piattaforme mobili e ascensori. Sono quelle che insegnano le regole, una per stanza.

The first six are the facility in working order. Cubes to carry and drop onto buttons, doors that open on approach, turrets that see you and shoot, beams to break with a cube, moving platforms and lifts. They're the ones that teach the rules, one per room.

La camera dei varchi, nell'impianto in funzione La camera del raggio, col cubo

Prima parte: cemento pulito, luci accese, e le macchine che rispondono ai comandi.

First part: clean concrete, lights on, and machines that answer to orders.

Le ultime sei sono lo stesso posto abbandonato. Muri crollati, muschio ed edera sopra il cemento, luce del giorno che entra dai buchi. Non è un cambio di scenografia per far vedere altri colori: è lo stesso impianto, e si riconosce.

The last six are the same place, abandoned. Collapsed walls, moss and vines over the concrete, daylight coming in through the holes. It isn't a change of set dressing to show off other colours: it's the same facility, and you recognise it.

E lì dentro ci sono tre cose che nella prima metà non esistono:

And in there are three things that don't exist in the first half:

  • Il vetro. Ferma il tuo corpo ma non i tuoi colpi: i varchi ci passano attraverso, tu no.
  • Glass. It stops your body but not your shots: portals go through it, you don't.
  • Le sentinelle da parete. Non si abbattono sparando: si abbattono tirandogli addosso un cubo.
  • Wall sentries. They can't be shot down: they're destroyed by throwing a cube at them.
  • Le consolle di comando. Ci sali sopra e guidi una macchina che puoi solo guardare, attraverso il vetro, dall'altra parte della stanza.
  • Control consoles. You stand on one and drive a machine you can only watch, through the glass, on the other side of the room.
La torre, nella seconda metà: edera, cascata e luce dai buchi

Seconda parte: stesso cemento, ma con l'edera sopra e l'acqua che scende da uno scarico rotto.

Second part: the same concrete, but with ivy over it and water coming down from a broken drain.

In fondo c'è una schermata di congedo, perché questa resta una demo e continua a dirlo. Dodici camere e un finale sono un punto di partenza pubblico, non un traguardo: le camere cresceranno ancora.

At the end there's a closing screen, because this is still a demo and it keeps saying so. Twelve rooms and an ending are a public starting point, not a finish line: the rooms will keep growing.

La scheda del gioco Cosa è cambiato con la v0.43

The game page What changed in v0.43

3 settembre 2026September 3, 2026 · Game Boy Advance

La sorpresa di settembre: una macchina nuova, e VECTORThe September surprise: a new machine, and VECTOR

A luglio avevo scritto che bolliva in pentola qualcosa di grosso e che non dicevo su quale macchina. Eccola: Game Boy Advance. E non a mani vuote, perché intanto è venuto fuori un gioco: VECTOR, un omaggio a Portal, scritto da zero per quell'hardware.

In July I wrote that something big was cooking and that I wasn't saying on which machine. Here it is: the Game Boy Advance. And not empty-handed, because a game came out of it along the way: VECTOR, a tribute to Portal, written from scratch for that hardware.

VECTOR, illustrazione di copertina

L'illustrazione di copertina. Non è una schermata di gioco: il GBA ha sedici colori per tavolozza e 240×160 punti, e le schermate vere sono qui sotto.

The cover illustration. It is not a screenshot: the GBA has sixteen colours per palette and 240×160 pixels, and the real screens are below.

Le camere di VECTOR costruite finora

Le camere costruite finora, tutte insieme. Ognuna insegna una cosa sola e la chiede una volta sola: camminare e saltare, i varchi, il cubo sul pulsante, la torretta, il raggio, le macchine che si muovono.

The rooms built so far, all together. Each teaches a single thing and asks for it once: walking and jumping, the portals, the cube on the plate, the turret, the beam, the moving machines.

Diciamolo subito: è una demo. Le camere fatte finora servivano a fare amicizia con il processore e a vedere cosa saltava fuori: sono un inizio, non un traguardo, e ne arriveranno altre. Non è un gioco finito e non finge di esserlo. Però gira, si gioca, e la cartuccia sta in centoseimila byte.

Let's say it up front: it's a demo. The rooms built so far were there to get me on speaking terms with the processor and see what came out: they're a beginning, not a finish line, and more are coming. It isn't a finished game and doesn't pretend to be one. But it runs, it plays, and the cartridge fits in a hundred and six thousand bytes.

L'idea è quella di Portal, e nient'altro: la pistola non spara colpi ma varchi, due, uno caldo e uno freddo, e si aprono solo sui pannelli chiari. Entri in uno, esci dall'altro, e la velocità non si perde: cadi da in alto dentro un varco e dall'altro ne esci sparato. Niente dell'originale è stato usato, nessun disegno e nessun suono: l'omaggio è dichiarato dentro il gioco, nella pagina INFO, col nome dell'originale e di chi l'ha fatto, perché un omaggio che non nomina l'originale non è un omaggio.

The idea is Portal's, and nothing else: the gun doesn't fire bullets but portals, two of them, one warm and one cold, and they only stick to the pale panels. Go in one, come out of the other, and keep your speed: fall from high up into a portal and you come out of the other one fast. Nothing from the original was used, no art and no sound: the tribute is declared inside the game, on the INFO page, with the name of the original and of who made it, because a tribute that doesn't name the original isn't a tribute.

VECTOR, il raggio laser VECTOR, la piattaforma e l'ascensore

Il raggio uccide, si ferma sul primo ostacolo, e si tappa col cubo. L'ascensore non ha bottoni: sale mentre ci stai sopra e scende quando lo lasci.

The beam kills, stops at the first obstacle, and can be plugged with the cube. The lift has no buttons: it rises while you stand on it and comes down when you step off.

La macchina. Dopo il 6502 a 8 bit e il 68000 a 16, qui sotto c'è un ARM a 32 bit a 16,8 MHz, e per la prima volta la potenza non è il vincolo principale. Il vincolo è altrove: 240 punti per 160, sedici colori per tavolozza, e soprattutto quanti colori riesci a mettere dentro una tessera di otto punti per otto. Il mestiere sta tutto lì. E il processore non sa dividere, quindi ogni ciclo e ogni rampa è una potenza di due: non è un vezzo, è che una divisione qualunque diventa una chiamata a una libreria che qui non c'è, e il programma non si collega più.

The machine. After the 8-bit 6502 and the 16-bit 68000, down here there's a 32-bit ARM at 16.8 MHz, and for the first time raw power isn't the main constraint. The constraint is elsewhere: 240 by 160 pixels, sixteen colours per palette, and above all how many colours you can fit inside an eight-by-eight tile. The craft is all in there. And the processor can't divide, so every cycle and every ramp is a power of two: not an affectation, but the fact that an arbitrary division becomes a call into a library that isn't here, and the program stops linking.

Niente bitmap, come sempre. La grafica non è disegnata in un programma di disegno: è generata. Trentadue attrezzi in JavaScript producono tessere, tavolozze, mappe e tabelle come file C, e le camere stanno in un file di testo con un editore che le fa vedere disegnate mentre le modifichi e che al salvataggio ricompila la cartuccia. Anche il personaggio è generato parte per parte, e le pose del passo nascono da una curva invece che da numeri messi a occhio.

No bitmaps, as always. The graphics aren't drawn in a paint program: they're generated. Thirty-two JavaScript tools produce tiles, palettes, maps and tables as C files, and the rooms live in a text file with an editor that shows them drawn while you edit and recompiles the cartridge on save. The character too is generated part by part, and the walk poses come from a curve instead of numbers set by eye.

I due muri più istruttivi li ho raccontati per esteso, perché sono la parte che vale davvero: la luce che faceva ombra, cioè come questa macchina fonde i colori e perché un cono marrone scurisce il muro invece di illuminarlo; e compila, gira, e non funziona, cinque guasti che non danno nessun errore, a partire da una variabile che viveva in ROM e non cambiava mai.

The two most instructive walls are told in full, because that's the part that really counts: the light that cast a shadow, that is how this machine blends colours and why a brown cone darkens the wall instead of lighting it; and it compiles, it runs, it doesn't work, five faults that raise no error at all, starting with a variable that lived in ROM and never changed.

La ROM di questa build era la 0.25.0, e girava su emulatore e su hardware vero con una flashcart.

The ROM for this build was 0.25.0, and it ran on emulators and on real hardware with a flashcart.

Aggiornamento: da qui il gioco è andato avanti parecchio, e la versione che si scarica è sempre l'ultima. Sono arrivate le dodici camere e la telecamera che scorre, e poi la camminata rifatta. Questo pezzo resta com'era, perché è il racconto di quel giorno.

Update: the game has moved on quite a bit since, and what you download is always the latest build. Twelve rooms and a scrolling camera arrived, and then the rebuilt walk. This piece stays as it was, because it's the account of that day.

La scheda del gioco

The game page

26 agosto 2026August 26, 2026 · software

Un'estensione per VS Code, e la metto gratisA VS Code extension, and I'm giving it away

Oggi niente assembly e niente pixel: si scende dall'altro banco di lavoro. Remote SFTP/FTP è un'estensione per Visual Studio Code, la uso tutti i giorni, e da oggi si scarica da qui.

No assembly and no pixels today: this comes off the other workbench. Remote SFTP/FTP is a Visual Studio Code extension, I use it every day, and from today it's downloadable from here.

Da anni sposto file su server remoti mentre sviluppo, e da anni la stessa scena: apri il file con un client FTP, lo modifichi in un editor diverso da quello che stai usando per il progetto, salvi, ricarichi. Oppure installi una delle estensioni che fanno la stessa cosa, e scopri che la password del server di produzione è finita in chiaro dentro un file JSON nella cartella del progetto, a un «git add .» di distanza dal repository. L'ho scritta per togliermi questo problema, e visto che funziona la metto a disposizione gratuitamente.

For years I've been moving files onto remote servers while developing, and for years it's been the same scene: you open the file with an FTP client, edit it in an editor that isn't the one you're using for the project, save, reload. Or you install one of the extensions that do the same thing, and discover that your production password ended up in clear text inside a JSON file in the project folder, one "git add ." away from the repository. I wrote it to get that off my desk, and since it works, I'm giving it away for free.

Cosa fa. Configuri la connessione una volta, SFTP su SSH oppure FTP e FTPS, e nella barra laterale compare l'albero delle cartelle remote. Clicchi un file, si apre; premi Salva, e il file viene riscritto sul server. Nessuna copia locale che dopo due giorni non sai più se è più aggiornata di quella remota, nessuna sincronizzazione da lanciare e da ricordarsi. Una cartella remota può anche diventare la radice del workspace.

What it does. You configure the connection once, SFTP over SSH or FTP and FTPS, and the remote folder tree appears in the sidebar. You click a file, it opens; you hit Save, and the file is written back to the server. No local copy that two days later you can't tell is newer or older than the remote one, no sync job to launch and remember. A remote folder can even become the workspace root.

Sulle connessioni SSH c'è il terminale remoto, e qui c'è un dettaglio a cui tengo: la shell si apre sulla stessa connessione già aperta per i file. Nessun secondo login, nessuna seconda password. La funzione che uso di più, però, è la ricerca: scegli da quale cartella partire e cosa cercare, e se l'account SSH ha una shell la ricerca gira direttamente sul server, con grep e find. In rete passa solo l'elenco dei risultati, non i file. Clicchi un risultato e il file si apre alla riga giusta. Su FTP, dove una shell non esiste, l'estensione scandaglia le cartelle dal client: più lenta, ma funziona. E poi c'è il trascinamento, anche fra due connessioni diverse per copiare da un server a un altro: in quel caso i dati passano da un flusso all'altro senza toccare né il disco né la memoria, quindi un file da qualche centinaio di megabyte non è un problema.

On SSH connections there's the remote terminal, and here's a detail I care about: the shell opens on the same connection already used for the files. No second login, no second password. The feature I use most, though, is search: you pick which folder to start from and what to look for, and if the SSH account has a shell the search runs directly on the server, with grep and find. Only the list of results crosses the network, not the files. You click a result and the file opens at the right line. On FTP, where no shell exists, the extension scans the folders from the client: slower, but it works. Then there's drag and drop, even between two different connections to copy from one server to another: in that case the data goes from one stream into the other without touching disk or memory, so a few-hundred-megabyte file is not a problem.

Le tre cose di cui vado più fiero non si vedono, ed è per quelle che l'ho scritta. Le password stanno nel portachiavi di sistema, non in un file dentro il progetto. La chiave del server viene verificata contro il tuo known_hosts esattamente come fa ssh: se l'host è nuovo ti mostra l'impronta e ti chiede conferma, e se la chiave è cambiata ti avverte in modo esplicito, perché può essere una rotazione legittima oppure qualcuno in mezzo. E il salvataggio non sovrascrive di nascosto: se un collega ha toccato quel file dopo che l'hai aperto, prima di scrivere ci si ferma e puoi confrontare le due versioni.

The three things I'm proudest of can't be seen, and they're the reason I wrote it. Passwords live in the system keychain, not in a file inside the project. The server key is verified against your known_hosts exactly the way ssh does it: if the host is new it shows you the fingerprint and asks, and if the key has changed it warns you explicitly, because that can be a legitimate rotation or someone in the middle. And saving doesn't overwrite behind your back: if a colleague touched that file after you opened it, the save stops before writing and you can compare the two versions.

Qualche limite, detto subito. È provata su macOS e Linux; su Windows no. I file oltre 16 megabyte non si aprono nell'editor, ed è un vincolo di VS Code, che riceve i file remoti in un blocco unico: per quelli conviene usare il download. Il terminale SSH aperto non sopravvive a una caduta di connessione e va riaperto. E la ricerca nel contenuto su FTP, come dicevo, è più lenta.

A few limits, said up front. It's tested on macOS and Linux; not on Windows. Files over 16 megabytes don't open in the editor, and that's a VS Code constraint, it receives remote files as a single block: for those, use the download instead. An open SSH terminal doesn't survive a dropped connection and has to be reopened. And content search over FTP, as I said, is slower.

La licenza è gratuita per qualunque uso, anche commerciale e in azienda, senza registrazione e senza limiti di tempo o di postazioni. Non è open source. L'unica cosa che chiedo è di non ridistribuire il file altrove: linkate la pagina, così chi la installa ha sempre la versione corrente. Le istruzioni di installazione, passo per passo, sono sulla scheda. Se la provate e trovate qualcosa che non va, scrivetemi.

The licence is free for any use, commercial and inside companies included, with no registration and no limits on time or seats. It is not open source. The only thing I ask is that you don't redistribute the file elsewhere: link the page, so whoever installs it always gets the current version. Step-by-step install instructions are on the tool page. If you try it and something doesn't work, write to me.

Detto questo: no, non è questa la sorpresa promessa a settembre. Quella riguarda tutt'altro banco di lavoro, e regge ancora.

That said: no, this isn't the surprise promised for September. That one is about the other workbench entirely, and it still holds.

Vai alla scheda Scarica il .vsix v0.1.0

Go to the tool page Download the .vsix v0.1.0

31 luglio 2026July 31, 2026 · avvisonotice

Mondo 11: la Spiaggia (in arrivo, ma non subito)World 11: the Beach (coming, but not just yet)

MONDO 11 · SPIAGGIA · TORNO A SETTEMBRE
WORLD 11 · BEACH · BACK IN SEPTEMBER

Piccola verità onesta, per una volta senza trabocchetti: nelle prossime settimane bolle in pentola qualcosa di grosso. Non dico cosa, non dico su quale macchina, ma se avete seguito fin qui il salto lo sentite arrivare. Diciamo che il pavimento, stavolta, regge davvero.

A small honest truth, for once with no trap: something big is cooking for the coming weeks. I won't say what, I won't say on which machine, but if you've followed this far you can feel the jump coming. Let's say that this time the floor actually holds.

C'è però un ostacolo che nessun assembler può schivare: la famiglia va portata al mare, e poi su in montagna. Quindi il banco di lavoro chiude per un po', e il grande annuncio slitta a settembre. Non è un rinvio all'italiana: è proprio scritto sul calendario, con la sabbia.

There's one obstacle, though, that no assembler can dodge: the family needs to be taken to the sea, then up to the mountains. So the workbench closes for a while, and the big reveal moves to September. It's not a vague "soon": it's right there on the calendar, written in sand.

Nel frattempo le due build C64 e Mega Drive restano qui, scaricabili, per ingannare l'attesa. E tenete d'occhio questo spazio: qualche indizio potrebbe spuntare anche prima di settembre, quando il wifi del lido, o del rifugio, lo permette. Restate sintonizzati.

Meanwhile the two builds, C64 and Mega Drive, stay right here, downloadable, to pass the time. And keep an eye on this space: a clue or two might surface even before September, whenever the beach (or mountain) wifi allows. Stay tuned.

19 luglio 2026July 19, 2026 · Commodore 64

C64: la campagna V2 arriva anche sul biscottoneC64: the V2 campaign lands on the breadbin too

Quello che ho costruito sul Mega Drive comincia a scendere sul Commodore 64. La versione C64 v0.0.11 è la conversione della campagna V2: per ora i primi due livelli, con la pistola, i nemici e le stelle da raccogliere, riscritti in assembly 6502. Stesso gioco, stessa idea, un'altra macchina, e mezzo secolo di potenza di calcolo in meno.

What I built on the Mega Drive is starting to come down to the Commodore 64. The C64 v0.0.11 build is the conversion of the V2 campaign: the first two levels for now, with the gun, the enemies and the stars to collect, rewritten in 6502 assembly. Same game, same idea, another machine, and half a century less computing power.

FIDATI. C64, livello 1-2 Ritmo e Piombo

1-2 «Ritmo e Piombo» sul C64: la stessa scena vista sul Mega Drive, con la pistola in pugno e la promessa in cima: «loro non sparano. Per ora.»

1-2 "Rhythm and Lead" on the C64: the same scene as on the Mega Drive, gun in hand and the promise up top: "they don't shoot. For now."

Il PRG aggiornato è qui sotto, per emulatore e hardware reale.

The updated PRG is below, for emulators and real hardware.

Scarica il PRG v0.0.11

Download PRG v0.0.11

18 luglio 2026July 18, 2026 · Mega Drive

Mega Drive: la campagna V2, dalla 0.0.2 alla 0.0.11Mega Drive: the V2 campaign, from 0.0.2 to 0.0.11

In poche build il test Mega Drive è cresciuto parecchio: da un livello di prova a una piccola campagna, la «V2». I sei schemi sono stati rimessi a nuovo, è comparso qualche avversario, c'è una presentazione tutta nuova e un bel lavoro di rifinitura grafica. La logica di gioco resta fedele all'originale. Il resto, meglio scoprirlo giocando.

In a few builds the Mega Drive test grew quite a bit: from a test level to a small campaign, "V2". The six screens have been reworked, a few adversaries appeared, there's a whole new presentation and a good deal of graphic polish. The game logic stays faithful to the original. The rest is better discovered by playing.

L'idea, in fondo, è un esperimento di design: sto provando a buttare dentro un po' tutti gli ingredienti classici del platform, quelli che si sono visti mille volte nel genere, e vedere come si mescolano tra loro. Non per inventare la ruota, ma per capire cosa succede a impastarli tutti nello stesso gioco.

The idea, really, is a design experiment: I'm trying to throw in a bit of every classic platformer ingredient, the ones the genre has shown a thousand times, and see how they blend together. Not to reinvent the wheel, but to find out what happens when you knead them all into the same game.

FIDATI. Mega Drive, livello 1-2 Ritmo e Piombo FIDATI. Mega Drive, livello 2-2 Una di loro mente

1-2 «Ritmo e Piombo», un mondo di pietra al crepuscolo, con la pistola in pugno, qualche robot e un pianeta all'orizzonte. 2-2 «Una di loro mente», un mondo d'acciaio nella notte, fra luna, droni e piattaforme che si accendono.

1-2 "Rhythm and Lead", a stone world at dusk, gun in hand, a few robots and a planet on the horizon. 2-2 "One of them lies", a steel world at night, among moon, drones and platforms that light up.

Gameplay. Tutti e sei gli schemi sono stati rifatti in una piccola campagna a schermata fissa: si raccolgono delle stelle per sbloccare la bandiera, e c'è più sviluppo in verticale. È arrivata una pistola, che una volta presa resta per tutta la partita, e con lei i primi nemici, da abbattere o da schivare. Ci sono le vite e il game over, ma la prima bandiera bugiarda non ne costa una: quella è la lezione gratis. Tornano i codici per accedere ai mondi, le schede di presentazione di ogni mondo e le solite frasi ironiche sparse un po' ovunque.

Gameplay. All six screens have been redone into a small fixed-screen campaign: you collect stars to unlock the flag, and there's more vertical layout. A gun showed up, and once picked up it stays for the whole run, and with it the first enemies, to shoot down or dodge. There are lives and a game over, but the first lying flag doesn't cost one: that's the free lesson. World access codes are back, along with intro cards for each world and the usual wry lines scattered here and there.

Presentazione. Un breve filmato d'apertura muto, che si può saltare, apre la partita; poi una schermata iniziale grafica, col logo grande e la scelta della lingua.

Presentation. A short silent opening cutscene, which can be skipped, opens the game; then a graphic title screen, with a big logo and a language choice.

Grafica e animazioni. Ora ogni mondo ha il suo carattere: uno di pietra, caldo, contro uno di metallo, freddo e illuminato, ciascuno con fondali, cielo, pianeti e stelle diversi. Gli spuntoni sono più grossi e riconoscibili, i blocchi finti crollano con un po' di teatro, le luci si accendono in modo morbido, e le animazioni del personaggio, delle stelle e della bandiera sono più curate. Anche l'omino e la pistola sono stati ridisegnati.

Graphics and animation. Each world now has its own character: a warm stone one against a cold, lit metal one, each with different backdrops, sky, planets and stars. The spikes are bigger and clearer, the fake blocks crumble with a bit of drama, the lights come on softly, and the animations of the character, the stars and the flag are more polished. The figure and the gun were redrawn too.

Audio. Qualche effetto sonoro nuovo per gli spari e le raccolte; la musica resta quella di prima. E come sempre, la versione C64 continua a girare intatta a fianco.

Audio. A few new sound effects for shots and pickups; the music stays as it was. And as always, the C64 version keeps running intact alongside.

Sotto, la ROM aggiornata: gira su emulatore e flashcart.

Below, the updated ROM: it runs on emulators and flashcarts.

Scarica la ROM v0.0.11

Download ROM v0.0.11

18 luglio 2026July 18, 2026 · Mega Drive

Cambio di rotta: il prototipo si sposta sul Mega DriveChange of course: the prototype moves to the Mega Drive

Il prototipo HTML ha fatto esattamente il lavoro per cui l'avevo tirato su: fissare le regole del gioco. Fisica, feel del salto, i tradimenti dei mondi, il ritmo. Tutto deciso lì, dove provare un'idea costa dieci minuti. Adesso però lo archivio: resta online, giocabile com'è, ma smetto di farlo crescere. Ha finito il suo turno, e l'ha fatto bene.

Il motivo è una sorpresa: sul Mega Drive mi trovo bene, molto più di quanto pensassi. Il 68000 con il C mi dà abbastanza agio da poterci prototipare direttamente, senza più il giro dal web. E c'è un regalo in più: sul Mega Drive posso fare due versioni dello stesso gioco. Una a schermata fissa, alla vecchia maniera, un quadro alla volta; e più avanti una in scrolling, col mondo che scorre. Due modi di raccontare lo stesso design.

Quindi si riparte da lì, direttamente sul ferro del 1988: due livelli belli corposi, costruiti come si deve, non più bozze. Poi, da quella base solida, il porting sul C64. Il web ci ha portato fin qui; il resto del viaggio lo faccio sulle macchine vere.

The HTML prototype did exactly the job I built it for: locking down the rules of the game. Physics, jump feel, the worlds' betrayals, the rhythm. All decided there, where trying an idea costs ten minutes. Now I'm shelving it: it stays online, playable as it is, but I'll stop growing it. Its turn is over, and it served me well.

The reason is a surprise: I feel at home on the Mega Drive, far more than I expected. The 68000 with C gives me enough room to prototype directly there, no more detour through the web. And there's a bonus: on the Mega Drive I can make two versions of the same game. One on a fixed screen, the old way, one board at a time; and later one with scrolling, the world sliding by. Two ways to tell the same design.

So I'm starting over right there, on 1988 iron: two good, meaty levels, built properly, no longer drafts. Then, from that solid base, the port to the C64. The web brought us this far; the rest of the journey I'll make on the real machines.

16 luglio 2026July 16, 2026 · C64 + Mega Drive

Bug e pezzi di codice: il dietro le quinteBugs and pieces of code: behind the scenes

Ho raccolto in una pagina dedicata i bug più istruttivi del porting, ognuno col suo frammento di codice e la sua morale. Tre dal C64: il gracchio del SID (il pop era negli attacchi, non nelle note), il registro che cancellava gli indizi del 6502, e la memoria che traboccava in silenzio dentro il charset. Tre dal Mega Drive: lo schermo viola dello Z80 tenuto in reset, la striscia che non voleva crollare sulla grafica a tile, e il doppio bersaglio, il trucco che permette di collaudare la console senza la console. Ogni pezzo è raccontato in parole semplici.

I've collected the most instructive porting bugs on a dedicated page, each with its code fragment and its moral. Three from the C64: the SID crackle (the pop was in the attacks, not the notes), the 6502's register that erased the clues, and the memory silently overflowing into the charset. Three from the Mega Drive: the purple screen of a Z80 held in reset, the stripe that wouldn't crumble on tile graphics, and the dual target, the trick that lets you test the console without the console. Every snippet is told in plain words.

16 luglio 2026July 16, 2026 · Mega Drive

Mega Drive: il primo livello gira, e la ROM è quiMega Drive: the first level runs, and the ROM is here

Non doveva toccare a lui, ma il prototipo era lì che aspettava. La prima ROM Mega Drive è scaricabile: il primo livello del Mondo 1 in un file .gen da 256KB che parte negli emulatori e dovrebbe partire su flashcart. Dentro c'è la ricetta raccontata nel post del 9 luglio: startup, vettori e schermata del titolo in assembly 68k, logica di gioco e render in C compilato per il 68000. La logica è la stessa del prototipo, quindi il gameplay è quello giusto; quello che non posso verificare da qui è il ferro vero. Se avete un Mega Drive e una flashcart, il collaudo su hardware è vostro: scrivetemi cosa succede. Ora si torna al C64, che era rimasto col joystick in mano.

It wasn't supposed to be its turn, but the prototype was sitting right there. The first Mega Drive ROM is downloadable: World 1's first level in a 256KB .gen file that boots in emulators and should boot on flashcarts. Inside is the recipe from the July 9 post: startup, vectors and title screen in 68k assembly, game logic and rendering in C compiled for the 68000. The logic is the same as the prototype, so the gameplay is right; what I can't verify from here is real iron. If you own a Mega Drive and a flashcart, the hardware test is yours: write me what happens. Now back to the C64, which was left holding the joystick.

16 luglio 2026July 16, 2026 · C64

Il SID ha smesso di prendermi a schiaffi: la musica c'èThe SID stopped slapping me around: the music is in

Due giorni fa scrivevo che il SID mi stava prendendo a schiaffi. Aggiornamento: abbiamo fatto pace. Il player adesso gira dentro l'interrupt del raster senza sforare il frame, e la musica è nel PRG: tema del titolo e motivo di gioco, due voci per la melodia e il basso, la terza che resta libera per gli effetti, che hanno la precedenza (in un gioco dove il pavimento crolla, il crollo si deve sentire). Non è ancora roba da demoscene, gli inviluppi sono semplici e il filtro lo sto solo sfiorando, ma è musica vera che esce da un SID vero. La prima volta che il tema è partito intero, alle 23:50, ho alzato il volume di un pelo. Poi mi sono ricordato dei bambini e l'ho riabbassato. Il viaggio nell'assembler paga la prima cartolina. Il bug più bello di questa battaglia, il gracchio fantasma, è raccontato col codice nel dietro le quinte.

Two days ago I wrote the SID was slapping me around. Update: we made peace. The player now runs inside the raster interrupt without blowing the frame budget, and the music is in the PRG: title theme and in-game tune, two voices for melody and bass, the third kept free for sound effects, which take priority (in a game where floors collapse, you need to hear the collapse). It's not demoscene material yet, the envelopes are simple and I'm barely touching the filter, but it's real music coming out of a real SID. The first time the theme played all the way through, at 11:50pm, I turned the volume up a notch. Then I remembered the kids and turned it back down. The assembler journey sends its first postcard. The best bug from this battle, the phantom crackle, is told with code in the behind the scenes.

15 luglio 2026July 15, 2026 · C64

Build 1: 2 livelli, 6 schemi, un PRG da scaricareBuild 1: 2 levels, 6 screens, a PRG to download

La prima build scaricabile del test C64 è online: i primi 2 livelli del Mondo 1, 6 schemi in totale, in un PRG da 17KB che parte su VICE e dovrebbe partire su hardware reale. «Dovrebbe» è la parola chiave: la collisione sui pavimenti finti va verificata schema per schema, e il timing del tremolio (un decimo di secondo, che su PAL fa 5 frame) per ora è tarato a occhio in emulazione, non su un C64 vero. Se lo provate su ferro vero e succede qualcosa di strano, scrivetemi: fa parte dell'esperimento. Anzi, l'esperimento è esattamente questo. La build è stata compilata alle 23:40, come tutto in questo progetto: si lavora quando i bambini dormono.

The first downloadable build of the C64 test is online: the first 2 levels of World 1, 6 screens in total, in a 17KB PRG that boots in VICE and should boot on real hardware. "Should" is the key word: fake-floor collision needs checking screen by screen, and the trembling timing (a tenth of a second, which is 5 frames on PAL) is currently tuned by eye in emulation, not on a real C64. If you run it on real iron and something weird happens, write me: it's part of the experiment. Actually, that IS the experiment. The build was compiled at 11:40pm, like everything in this project: work happens when the kids are asleep.

14 luglio 2026July 14, 2026 · C64

Il SID è tosto (e mi sta prendendo a schiaffi)The SID is tough (and it's slapping me around)

Confessione: la musica è la parte più difficile di tutto il test C64. Il SID non è un beeper, è un sintetizzatore vero: 3 voci, inviluppi ADSR, filtri analogici, e zero pietà per chi arriva dal WebAudio, dove una nota è una riga di JavaScript. Qui una nota è un registro di frequenza a 16 bit da calcolare, un inviluppo da programmare, e un player da scrivere in assembly dentro l'interrupt del raster senza sforare il tempo del frame. Per ora la build ha solo gli effetti: salto, morte, bandiera. La musica arriverà, ma con i suoi tempi: fare bene il SID è un mestiere a parte, e io sono ancora apprendista. Con l'aggravante del setup: un'ora scarsa a notte, a bambini addormentati, col volume al minimo per non svegliarli. Imparare un sintetizzatore in punta di piedi.

Confession: music is the hardest part of the whole C64 test. The SID is not a beeper, it's a real synthesizer: 3 voices, ADSR envelopes, analog filters, and zero mercy for someone coming from WebAudio, where a note is one line of JavaScript. Here a note is a 16-bit frequency register to compute, an envelope to program, and a player to write in assembly inside the raster interrupt without blowing the frame budget. For now the build has sound effects only: jump, death, flag. Music will come, at its own pace: doing the SID justice is a craft of its own, and I'm still an apprentice. With an aggravating factor, the setup: barely an hour a night, kids asleep, volume near zero so I don't wake them. Learning a synthesizer on tiptoe.

13 luglio 2026July 13, 2026 · HTML5

Tutti e 10 i mondi esistono. Ora il lavoro vero: affinarliAll 10 worlds exist. Now the real work: polishing them

Traguardo: tutti e 10 i mondi di FIDATI. sono giocabili da capo a fondo, Inferno compreso, lava che sale inclusa. Ma «giocabile» e «finito» sono due parole diverse. È tutto ancora una bozza: anche i primi 6 andranno ripassati, e gli ultimi 4 sono i più acerbi: la Giungla ha piattaforme coi denti che mordono con troppo poco preavviso, i teletrasporti della Città Futuristica a volte mentono troppo perfino per gli standard di questo gioco, la segnaletica della Città Aliena deve mentire con più eleganza, e l'Inferno va bilanciato schema per schema perché tutte le bugie insieme sono tante anche per chi le ha scritte. I mondi si rifiniscono uno alla volta, via via che passano il playtest. Che, per un progetto fatto di ritagli di sera dopo l'ora dei bambini, non è un brutto punto in cui stare.

Milestone: all 10 FIDATI. worlds are playable start to finish, Inferno included, rising lava included. But "playable" and "done" are two different words. It is all still a draft: even the first 6 will need another pass, and the last 4 are the roughest: the Jungle has toothed platforms that bite with too little warning, the Futuristic City teleporters sometimes lie too much even by this game's standards, the Alien City signage needs to lie with more elegance, and Inferno needs balancing screen by screen, because every lie at once is a lot even for the person who wrote them. The worlds get polished one at a time, as they survive playtesting. Which, for a project made of evening scraps after the kids' bedtime, is not a bad place to be.

11 luglio 2026July 11, 2026 · HTML5

Saturno: anelli che non reggono il tuo pesoSaturn: rings that can't hold your weight

Le piattaforme mobili erano l'ultima grande feature del motore, e non volevo che fossero le solite. La regola in più: finché ci stai sopra, l'anello affonda, 18 pixel al secondo, e recupera quota solo quando scendi. Quando sta per cedere, il bordo lampeggia rosso. Il risultato è che gli anelli sono mezzi di trasporto, non case: chi si ferma a pensare, sprofonda. Nel terzo livello del mondo c'è il mio dettaglio preferito: un robot pattuglia tranquillo un isolotto il cui centro è un pavimento finto. Lui ci cammina sopra sereno, perché il pavimento tradisce solo te.

Moving platforms were the engine's last big feature, and I didn't want the usual ones. The extra rule: while you stand on a ring it sinks, 18 pixels per second, and only recovers when you step off. When it's about to give, the edge flashes red. Rings become transport, not real estate: hesitate and you sink. The world's third level has my favorite detail: a robot calmly patrols an island whose center is a fake floor. It walks it safely, because the floor only betrays you.

10 luglio 2026July 10, 2026 · HTML5

Venere aveva bisogno di cattiveriaVenus needed more cruelty

Il primo taglio di Venere era troppo gentile: vento a raffiche telegrafate e poco altro. Il playtest è stato impietoso («troppo easy»), quindi il mondo ha ricevuto la pioggia acida (gocce che si gonfiano sotto le nuvole prima di precipitare, desincronizzate per colonna) e le vespe regine: due colpi per abbatterle, e il primo le fa infuriare. Il tocco che preferisco è balistico: il vento sposta anche i tuoi proiettili. Sparare a una vespa col vento di traverso non è mira, è artiglieria.

Venus' first cut was too kind: telegraphed gusts and little else. Playtesting was merciless ("too easy"), so the world got acid rain (drops swelling under the clouds before falling, desynced per column) and queen wasps: two hits to down, and the first one makes them furious. My favorite touch is ballistic: the wind bends your bullets too. Shooting a wasp in a crosswind isn't aiming, it's artillery.

9 luglio 2026July 9, 2026 · Mega Drive

Mega Drive: assembly dove serve, C dove contaMega Drive: assembly where needed, C where it counts

La versione Mega Drive è senza SGDK né librerie, ma non è tutta assembly, ed è una scelta precisa. Lo startup e i vettori sono assembly 68k (crt0.s), la schermata del titolo è asm pura; la logica di gioco e il render sono in C (game_logic.c, main.c), compilati da gcc in codice macchina 68000 che finisce nella ROM. Perché il C? Primo: è la prassi dell'epoca 16-bit. Il 68000 è nato pensando ai compilatori, e una valanga di giochi commerciali per Mega Drive era in C con l'assembly solo nei punti caldi. Non è un ripiego moderno. Secondo: è il trucco che rende il porting verificabile. Non ho un emulatore 68000 per collaudare la logica, ma la stessa identica sorgente C compila anche nativa sul Mac, dove la faccio giocare frame per frame contro il modello di riferimento: è così che arriva la garanzia bit-exact sui 1583 frame. In assembly 68k puro potrei solo scrivere codice e sperare. Il pavimento finto che crolla l'ho visto funzionare contando i pixel viola che sparivano: 4756, 4592, 4428. La soddisfazione era tutta lì. Il metodo del doppio bersaglio, e gli altri bug del Mega Drive, sono nel dietro le quinte.

The Mega Drive build uses no SGDK, no libraries, but it's not all assembly, and that's a deliberate choice. Startup and vectors are 68k assembly (crt0.s), the title screen is pure asm; game logic and rendering are C (game_logic.c, main.c), compiled by gcc into 68000 machine code that goes into the ROM. Why C? First: it's standard 16-bit era practice. The 68000 was designed with compilers in mind, and loads of commercial Mega Drive games were C with assembly only in the hot spots. It's not a modern shortcut. Second: it's the trick that makes the port verifiable. I don't have a 68000 emulator to test the logic with, but the exact same C source also compiles natively on the Mac, where I play it frame by frame against the reference model: that's where the bit-exact guarantee across 1583 frames comes from. In pure 68k assembly I could only write code and hope. I watched the fake floor crumble by counting vanishing purple pixels: 4756, 4592, 4428. That's where the satisfaction lives. The dual-target method, and the other Mega Drive bugs, are in the behind the scenes.

8 luglio 2026July 8, 2026 · C64

Un test per C64, con sudore e 6502A C64 test, in sweat and 6502

Portare FIDATI. sul C64 è stato un bagno di umiltà. Il motore (fisica in virgola fissa, coyote time incluso, perché il feel non si negozia nemmeno nel 1982) ha funzionato quasi subito. La grafica no: scrivere charset a byte nudi senza vederli produce esattamente quello che immaginate. La svolta è arrivata costruendo una pipeline di anteprima: ogni byte di grafica viene renderizzato e guardato prima di finire nel PRG. Curiosità: la griglia di gioco 20×12 a tile da 16px combacia esattamente con lo schermo 40×24 caratteri del C64, come se il gioco fosse nato lì. Forse un po' è vero.

Porting FIDATI. to the C64 was a humbling experience. The engine (fixed-point physics, coyote time included, because feel is non-negotiable even in 1982) worked almost immediately. The graphics didn't: writing charsets as raw bytes without seeing them produces exactly what you imagine. The turning point was a preview pipeline: every byte of art gets rendered and looked at before it enters the PRG. Fun fact: the 20×12 grid of 16px tiles maps exactly onto the C64's 40×24 character screen, as if the game was born there. Maybe it partly was.

7 luglio 2026July 7, 2026 · design

Il feel del salto: 4 dettagli invisibiliJump feel: 4 invisible details

Un platformer vive o muore sul salto, e la differenza sta in quattro dettagli che il giocatore non vede ma sente. Coyote time: puoi saltare per qualche frame dopo aver lasciato il bordo, altrimenti i salti sembrano «rubati». Jump buffer: se premi un attimo prima di atterrare, il salto parte comunque. Salto variabile: rilasci presto, salti corto. Squash & stretch: il personaggio si schiaccia all'atterraggio e si allunga allo stacco. Sono in tutte e tre le versioni di FIDATI., identici: 4-5 frame di coyote, 6-7 di buffer, dal browser al 6502.

A platformer lives or dies on its jump, and the difference is four details players never see but always feel. Coyote time: you can still jump a few frames after leaving a ledge, or jumps feel "stolen". Jump buffering: press slightly before landing and the jump still fires. Variable jump: release early, jump short. Squash & stretch: the character squashes on landing, stretches on takeoff. All three FIDATI. versions share them, identical: 4-5 coyote frames, 6-7 buffer frames, from the browser down to the 6502.

5 luglio 2026July 5, 2026 · design

Password come nel 1991Passwords like it's 1991

FIDATI. usa codici a 4 lettere per accedere ai mondi: LUCE, CIMA, ROSS, VENT, ANEL... Non è solo nostalgia: sui portali web non c'è garanzia di salvataggio tra sessioni, e i password system degli anni '90 risolvevano esattamente questo problema. Il codice appare quando raggiungi un mondo nuovo, te lo annoti, e vali più di qualunque cloud. Il decimo codice è LAVA. Fate due più due.

FIDATI. uses 4-letter codes to access worlds: LUCE, CIMA, ROSS, VENT, ANEL... It's not just nostalgia: web portals don't guarantee saves across sessions, and 90s password systems solved exactly that. The code shows up when you reach a new world, you write it down, and you outlast any cloud. The tenth code is LAVA. Do the math.

4 luglio 2026July 4, 2026 · HTML5

Marte: la pistola cambia tutto (per questo si guadagna)Mars: the gun changes everything (that's why you earn it)

Con Marte sono entrate due cose pericolose: la gravità dimezzata e la pistola. La gravità è stata la parte facile: voli per dodici tile e ogni salto imparato nei primi tre mondi diventa una bugia della tua memoria muscolare, che è esattamente il punto del gioco. La pistola invece era un rischio di design: un rage platformer dove spari rischia di diventare un run and gun qualunque. La soluzione: non si trova, si guadagna, i colpi sono contati, e i robot che la sorvegliano sono immuni ai salti. Vuoi l'arma? Prima impara a schivare. È il patto più onesto di tutto il gioco, e infatti l'ho nascosto nel mondo più bugiardo. Bilanciare i robot in sessioni da un'ora a notte, con la casa che dorme, ha richiesto una settimana di sere: il tempo perso è perso, ma rende meticolosi.

Mars brought two dangerous things: half gravity and the gun. Gravity was the easy part: you float across twelve tiles and every jump you learned in the first three worlds becomes a lie your muscle memory tells you, which is exactly the point of the game. The gun was a design risk: a rage platformer where you shoot can turn into just another run and gun. The solution: it isn't found, it's earned, ammo is scarce, and the robots guarding it are immune to jumps. Want the weapon? Learn to dodge first. It's the most honest deal in the whole game, so of course I hid it in the most deceitful world. Balancing the robots in one-hour sessions a night, with the house asleep, took a week of evenings: spare time is slow, but it makes you meticulous.

3 luglio 2026July 3, 2026 · HTML5

Chiptune in WebAudio: la colonna sonora senza fileChiptune in WebAudio: a soundtrack with no files

Niente mp3, niente asset: tutta la musica di FIDATI. è sintetizzata in tempo reale con WebAudio. Onde quadre e triangolari per le voci, rumore filtrato per le percussioni, un sequencer di una quarantina di righe che legge pattern scritti come stringhe. Ogni mondo ha il suo tema: lo Spazio Geometrico è quasi allegro (è il tutorial, deve illuderti), Marte è in minore, l'Inferno è un basso che sale di semitono ogni battuta, come la lava. Il vantaggio pratico: il gioco resta un singolo file HTML sotto i 50KB. Quello che il WebAudio mi ha regalato in semplicità, il SID me lo sta facendo pagare con gli interessi. Ma questa è un'altra storia, più sopra nel devlog.

No mp3s, no assets: all of FIDATI.'s music is synthesized in real time with WebAudio. Square and triangle waves for the voices, filtered noise for percussion, a forty-line sequencer reading patterns written as strings. Each world has its theme: Geometric Space is almost cheerful (it's the tutorial, it has to fool you), Mars is in a minor key, Inferno is a bassline rising a semitone every bar, like the lava. The practical win: the game stays a single HTML file under 50KB. What WebAudio gave me in simplicity, the SID is now making me pay back with interest. But that's another story, further up this devlog.

2 luglio 2026July 2, 2026 · HTML5

Un file solo, zero asset: le fondamentaOne file, zero assets: the foundations

Regola numero uno, decisa il primo giorno: tutto il gioco in un singolo file HTML, niente asset esterni. Sprite, tile e livelli disegnati via codice sul canvas, suoni sintetizzati, livelli descritti come stringhe di caratteri dove # è un muro, ^ è uno spuntone e F è la bandiera (una delle due, almeno). Sembra masochismo, è una scelta pratica: un file solo si carica ovunque, si porta in giro, non ha dipendenze che marciscono. E ha un effetto collaterale che scoprirò solo una settimana dopo: livelli fatti di caratteri si portano su una macchina a caratteri, tipo un certo biscottone del 1982, con una naturalezza sospetta.

Rule number one, set on day one: the whole game in a single HTML file, no external assets. Sprites, tiles and levels drawn in code on the canvas, synthesized sounds, levels described as character strings where # is a wall, ^ is a spike and F is the flag (one of the two, anyway). It sounds like masochism, it's a practical choice: a single file loads anywhere, travels well, has no dependencies to rot. And it has a side effect I'd only discover a week later: levels made of characters move to a character-based machine, say a certain 1982 breadbin, with suspicious ease.

1 luglio 2026July 1, 2026 · design

Perché FIDATI. (e perché mente)Why FIDATI. (and why it lies)

Tutto è partito da un prototipo di un weekend, o meglio: di due sere di quel weekend, dai 21:30 in poi, a bambini addormentati. Un canvas, un quadrato arancione, una fisica scritta a mano. Il primo pavimento finto è nato per sbaglio: un bug nella collisione faceva sparire un tile a caso sotto i piedi, e morire lì era stranamente divertente. Invece di correggerlo, l'ho promosso a meccanica. Da lì il concept: un platform che ti mente, ma con regole oneste. Ogni bugia è imparabile, ogni tradimento ha un preavviso, anche se di un decimo di secondo: il gioco non bara, ti illude, che è diverso. Il titolo è arrivato da solo: FIDATI., col punto. Come lo dicono i bugiardi.

It all started as a weekend prototype, or rather: two evenings of that weekend, from 9:30pm on, kids asleep. A canvas, an orange square, hand-written physics. The first fake floor was born by accident: a collision bug made a random tile vanish underfoot, and dying there was strangely fun. Instead of fixing it, I promoted it to a mechanic. From there, the concept: a platformer that lies to you, but with honest rules. Every lie can be learned, every betrayal has a warning, even if it's a tenth of a second: the game doesn't cheat, it deceives, which is different. The title arrived on its own: FIDATI. (Italian for "trust me"), with the period. The way liars say it.