Lilith.
⌕
Ilustracja redakcyjna: Gemini pisał emulator Game Boya na identyfikator konferencyjny, ale najtrudniejsze błędy znalazły dopiero prawdziwe gry
Ilustracja Lilith · remiks redakcyjny

Na tegorocznej konferencji GitHub Universe identyfikator na szyi odpala Zeldę. Steve Francia, który wcześniej kierował w Google językiem Go, z pomocą Gemini uruchomił na nim emulator NES, a potem także Game Boya i Game Boya Color. Zwrócił na to uwagę Simon Willison, który podobny identyfikator hakował już rok temu.

Identyfikator z układem RP2350 płynnie uciąga Link's Awakening w 60 klatkach

Identyfikator nazywa się Badger. Ma dwurdzeniowy układ RP2350 taktowany zegarem 230 MHz, kolorowy ekran 320 × 240 pikseli, 16 MB pamięci flash i 8 MB PSRAM. Działa na nim MonaOS 4.0, środowisko oparte na MicroPythonie. Francia dostał go kilka dni przed wydarzeniem, z karteczką „hack this”.

Najszybciej byłoby wgrać gotowy emulator w C. Według Franci zajmuje to około dwudziestu minut, tyle że identyfikator straciłby swoje aplikacje, wymianę kontaktów przez Bluetooth i podczerwone podchody po sali. Dlatego chciał emulatora jako zwykłej aplikacji w MicroPythonie. Zwykły MicroPython wykonuje jednak około 100 do 200 tysięcy instrukcji na sekundę, a NES potrzebuje mniej więcej dziesięć razy więcej.

Pomógł tryb Viper, który kompiluje typowany Python wprost do kodu maszynowego ARM. Pierwszy emulator NES ma około 1100 linii i według autora odpala Zeldę w mniej więcej 32 klatkach na sekundę. Game Boy Color okazał się trudniejszy: jego procesor SM83 ma 512 instrukcji, a NES tylko 56. Mimo to Francia podaje, że emulacja procesora trwa poniżej 12 ms, a rysowanie poniżej 3 ms, więc pętla mieści się w 16,6 ms na klatkę przy 60 Hz. Gra się na przyciskach dotykowych po odwróceniu identyfikatora do góry nogami.

Model pisał pętle, człowiek decydował i mierzył

Ciekawszy od samej gry jest podział pracy, który Francia opisuje wyjątkowo dokładnie. Według niego Gemini 4 Argon szkicował wewnętrzne pętle na podstawie promptów opisujących procesor 6502, układ graficzny i przełączanie banków pamięci. Francia ustalił architekturę opartą na czterech wskaźnikach do pamięci, dopracował kernele w Viperze i każdą liczbę zmierzył na prawdziwym sprzęcie przez USB. Pozostałe błędy to według niego takie, na które trafia się dopiero po uruchomieniu.

Przy Game Boyu sprawdziło się to dosłownie. Pokémon Crystal po starcie pokazywał puste ramki, bo gra kieruje wskaźnik stosu do ROM-u, żeby szybko kopiować czcionki. Francia przyznaje, że nie wiedział, że sprzęt w ogóle na to pozwala. Link's Awakening DX przy chodzeniu w dół na jedną klatkę rozcinał bohatera na pół, bo emulator nie uwzględniał trybu podwójnej prędkości Game Boya Color. Próba podkręcenia do 300 MHz całkowicie zamroziła identyfikator.

Dla programistów płynie z tego praktyczny wzorzec. AI pomogła komuś bez wiedzy o sprzęcie Game Boya dojść do działającego rdzenia w ułamku czasu. Prawdziwym testem był jednak budżet 16,6 ms i stos kartridży z lat dziewięćdziesiątych, które bezlitośnie obnażyły każde błędne założenie.

Ile kodu napisał Gemini, autor nie zdradza

Z opisu nie da się ustalić, jaka część kodu pochodzi od modelu, a ile Francia przepisał. Brakuje też informacji, ile prób się nie udało, zanim pętla zadziałała. Bez tego projekt to raczej udany pokaz doświadczonego inżyniera niż dowód, że model sam napisze emulator.

Projekt ma też zwyczajne ograniczenia. Identyfikator nie ma głośnika, więc port NES działa bez dźwięku. Kod jest open source, ale autor nie dołącza gier i każdy musi wgrać własne, legalnie zdobyte ROM-y. Na identyfikator konferencyjny to zabawka na kilka dni, a nie platforma.

Czy sztuczki z Vipera się przyjmą, pokażą kolejni hakerzy identyfikatorów

Francia opublikował repozytorium i pięć sztuczek, które przeniósł z Game Boya z powrotem do emulatora NES i które przyspieszyły także jego. Pierwszym sygnałem będzie to, czy podchwycą je inni właściciele identyfikatorów albo społeczność MicroPythona.

Drugi sygnał dotyczy sposobu pracy. Jeśli podobne projekty zaczną publikować zapisy promptów i udział kodu z modelu, tak jak rok temu przy swoim identyfikatorze zrobił Willison z Claude Code, da się porównać, gdzie AI naprawdę oszczędziła tygodnie, a gdzie tylko przeniosła pracę do debugowania.

Werdykt Lilith

Gemini napisał Game Boya, który przeszedł wszystkie prompty, a potem pojawił się profesor Oak z pustymi ramkami. Kto chce wiedzieć, czy kod z AI działa, potrzebuje obok modelu ćwierćwiecznego kartridża, który nie czyta dokumentacji i niczego nie wybacza.