Een Atari 2600 Burgertime-cartridge ombouwen om Myst te draaien
Inleiding
Achtergrond over de Myst-demakes
Als leuke opvolging van mijn Apple II Myst-demake wilde ik onderzoeken hoeveel van het spel ik kon passen op de hardwarematig zeer beperkte Atari 2600/VCS. Ter herinnering: het originele MYST was een van de eerste CD-ROM-spellen met honderden megabytes aan pre-rendered graphics. Atari 2600-cartridges maxteen doorgaans uit op 4k, of misschien 32k bij complex bank-switching.
De Atari VCS-versie is een beperkte subset van het originele spel (hoewel de volledige speedrun-route mogelijk is). Deze versie werd onverwacht populair en kreeg veel aandacht in de pers.
Draaien op een Harmony-cartridge
De demake werd ontwikkeld op Linux en getest via de Stella-emulator. Het draait ook op echte hardware. Je kunt het testen met de Harmony-cartridge, een geëmuleerde cartridge die ROM-bestanden vanaf een SD-kaart kan draaien.
Ik heb ook een aangepaste cartridge laten maken, maar deze is eveneens geëmuleerd met een Melody-board, wat vergelijkbaar is met de Harmony-cartridge maar de ROM vanaf flash-geheugen draait. Deze cartridges bevatten 70MHz 32-bit ARM-microcontrollers die het bank-switching en andere signalering afhandelen die nodig is om high-end cartridge mappers te emuleren.
Dit is geweldig voor ontwikkeling, maar dit was niet beschikbaar in 1977 toen de console debuteerde. De ARM-chip zou destijds de kracht van een workstation of supercomputer hebben gehad. Ik begon me af te vragen: kan ik Atari 2600 Myst draaien met vintage technologie uit de jaren 80, zonder ARM-microcontrollers?
Myst passen in een 16k-cartridge
Tegen het einde van hun levenscyclus begonnen bedrijven geavanceerde bank-switching te gebruiken om meer ROM op een cartridge te passen dan de natuurlijke limiet van 4k.
De Atari VCS/2600 maakt gebruik van de 6507-processor, een variant van de 6502-chip in een kleinere behuizing om kosten te besparen. Deze heeft slechts genoeg adreslijnen om 8k aan geheugen te benaderen, maar de A12-lijn wordt gebruikt om te schakelen tussen interne adressen en de cartridge, wat programma's beperkt tot 4k. De meeste vroege spellen gebruikten 2k of 4k ROM's, maar later kwamen er diverse mapper-schema's om grotere hoeveelheden opslag in de adresruimte te bank-switchen. In de jaren 80 waren er cartridges beschikbaar die tot 32k ROM mapten.
De Atari VCS had slechts 128 bytes aan algemeen RAM-geheugen ingebouwd (slechts de helft van de 6502 zero page), wat ook gedeeld werd met de stack. Sommige cartridges voegden extra RAM toe, maar dat was gecompliceerd omdat de cartridge-slot de 6502 read/write-lijn niet beschikbaar had. Ontwikkelaars omzeilden dit door een deel van de adresruimte te reserveren voor reads en een ander deel voor writes.
Om zoveel mogelijk scènes uit Myst te kunnen passen, was compressie nodig. Vanwege de "race-the-beam" natuur van de graphics zou het veel eenvoudiger zijn als ik de graphics kon decompresseren naar een staging area die groter was dan 128 bytes. Wanneer je een nieuw level betreedt, wordt de gecomprimeerde graphics-data gekopieerd naar het 256-byte RAM-venster. Vervolgens wordt de ROM gewisseld en wordt het 1k RAM-bereik ingeschakeld, waarna de 256-byte RAM wordt gedecomprimeerd naar het 1k-bereik.
De E7 M-Network "Big Game" Mapper
Voor Atari VCS MYST koos ik de E7 "Big Game" mapper van M-Networks (Mattel). Deze chip uit 1983 kon niet alleen 16k ROM aan, maar ondersteunde (in theorie) ook tot 2k RAM.
De configuratie werkt als volgt:
- De primaire ROM is 1,5k aan de bovenkant van de adresruimte en is altijd gemapt.
- Via soft-switches aan het einde van het geheugen kunnen 7 verschillende chunks van 2k ROM aan de onderkant van de adresruimte worden gemapt.
- Er kan 256 bytes RAM worden ingeschakeld in de resterende 512 byte ruimte (onderste helft voor writes, bovenste voor reads).
- In plaats van ROM kan er een extra 1k RAM in de onderste adresruimte worden bank-switched.
Deze mapper leek perfect voor de Myst-demake. De vraag was waar ik zo'n chip kon vinden. Slechts enkele spellen werden uitgebracht met deze chip voordat M-Networks werd gesloten. Hiervan is Burgertime de enige die de RAM-functionaliteit gebruikte.
Bekende gebruikers van de M-Network E7 Mapper
1980s gebruikers op echte hardware
| Game Name | Commercial Release | Ram on Board | 256 byte bank usage | 1k bank usage |
|---|---|---|---|---|
| Bump 'N' Jump | Yes | None | N/A | N/A |
| Masters of the Universe | Yes | None | N/A | N/A |
| Burgertime | Yes | 1k | 1 bank used | no |
| AD&D Tower of Mystery | No | 2k | many banks used | no |
| In Search of the Golden Skull | No | 2k(?) | ?? | ?? |
| Locomotion | No | 1k(?) | ?? | ?? |
Modern, ontwikkeld onder emulator
| Game Name | Commercial Release | Ram on Board | 256 byte bank usage | 1k bank usage |
|---|---|---|---|---|
| Myst | No | 2k | 1 bank used | YES |
| Elite | No | 2k | ? | YES |
Het verkrijgen van Burgertime-cartridges
Voor de zekerheid heb ik een aantal Burgertime-cartridges aangeschaft. Er zijn twee varianten: één met through-hole chips (Made in USA) en één met epoxy-blobs voor de E7- en ROM-chips (Made in Singapore). Ik eindigde met zes cartridges, waarvan er slechts drie correct werkten; de anderen vertoonden glitches of andere problemen.
Pogingen tot conversie van de Burgertime-cartridge
In theorie zou de conversie simpel moeten zijn:
- De ROM's vervangen door chips met mijn eigen code.
- De RAM upgraden van een 1k SRAM naar 2k.
In de praktijk was niets simpel. Pogingen om de borden te desolderen met solder-wick en een soldpomp resulteerden in losgelaten pads en verloren pinnen. Uiteindelijk kocht ik een Hakko desoldering gun, wat de investering waard was.
De ROM's gebruiken de MCM67866 24-pin pinout (zelfde als IBM 5150 BIOS en Commodore 64). Deze komt niet overeen met het standaard 28-pin 27C64 8k EPROM-formaat. Adapters waren te groot voor de bestaande printplaat.
Het RAM is een 1k Toshiba SRAM TMM2009P-25A, die nauwelijks gedocumenteerd is. Omdat de pinout essentieel hetzelfde lijkt als de meer gangbare 6116 2k SRAM, hoopte ik dat deze als vervanging zou werken (wat later niet het geval bleek te zijn).
Ik bouwde een testopstelling op een breadboard met de geoogste chips, waarbij de E7-chip op het bord bleef en een lintkabel de signalen naar het breadboard bracht. Dit werkte niet.
Aangepaste PCB
Na een pauze van twee jaar pakte ik het project in de zomer van 2026 weer op. Omdat de bestaande cartridge een doodlopende weg was, besloot ik een aangepaste printplaat (PCB) te maken met KiCAD. Deze replica E7-cartridge had extra ruimte voor de ROM-adapters en extra pinnen voor debugging.
Assemblage en testen van de PCB
Stap 1: Bord vullen met chips van een werkende Burgertime-cartridge. Resultaat: Het werkt.
Stap 2: Gebruik maken van gebrande EPROM-kopieën van het spel via adapters. Resultaat: Het werkt.
Stap 3: De TMM2009 1k SRAM upgraden naar 6116 2k SRAM. Resultaat: Het werkt niet. Het titelbeeld verscheen, maar zodra het spel het RAM probeerde te benaderen, ontstonden er glitches.
De eerste E7-test-ROM schrijven
Om te begrijpen wat er misging bij het gebruik van de 6116 RAM-chips, schreef ik een tester in 6502-assembly. Op de Atari 2600 is dit complex: er is slechts 128 bytes RAM, de framebuffer is slechts 20 bits en elk 60Hz frame moet via "racing the beam" worden getekend. Een simpele printf() van een geheugenadres vereist nauwkeurige cycle-counting. Bovendien is de altijd gemapte area van de E7-cart slechts 1,5kB.
Met de originele 1k SRAM werkte de test prima op alle vier de 256-byte chunks. Toegang tot de 1k chunk werkte niet, wat verwacht was omdat deze niet bestond. Met de 6116 2k SRAM was er echter veel reset-activiteit, alsof de chip tegen de bus vocht. De meeste tests faalden.
Gebruik van een Logic Analyzer
Na feedback op de Atariage-forums en contact met ontwikkelaars (waaronder kevtris) werd gesuggereerd een logic analyzer te gebruiken. Ik schafte een goedkope Sparkfun USB logic analyzer aan en stapte over op 28C64 EEPROM's (elektrisch wisbaar), omdat ik geen UV-eraser had voor de 27C64's.
Problemen met het RAM-geheugen
Ik onderzocht of een andere Toshiba 2k SRAM beter zou passen dan de 6116 van een andere fabrikant. Ik probeerde de Toshiba TMM2116. Dit werkte nog steeds niet volledig: Burgertime werkte en de 256-byte RAM-banks waren toegankelijk, maar zodra het 1k RAM-venster werd geactiveerd, stopte al het RAM (inclusief het 256-byte venster) met werken.
Myst kwam verder, maar de gameplay glitched. De reden hiervoor is de volgorde van operaties in Myst:
- 256 bytes gecomprimeerde data worden vanuit ROM naar 256-byte RAM gekopieerd.
- Het 1k-RAM-venster wordt geactiveerd.
- De data wordt vanuit het 256-byte RAM gedecomprimeerd naar het 1k-RAM-venster.
Zonder een werkend 1k RAM-venster kan het spel niet draaien.
Nieuwe E7 Test-ROM en Logic Analyzer resultaten
Ik schreef een verbeterde test-ROM waarmee ik bank-switches en specifieke lees/schrijfadressen kon kiezen via de joystick. Met de logic analyzer ontdekte ik het volgende:
- Bij een schrijfbeurt naar het 256-byte venster (werkend) waren alle signalen correct.
- Bij een schrijfbeurt naar het 1k-RAM-bank (niet-werkend) leek het
/WE(write enable) signaal te floaten of onverwacht laag te gaan. - Wanneer het 1k RAM-gebied actief was, verdween de waarde die de CPU probeerde te schrijven en bereikte deze de databus niet.
Ik ontdekte dat prototype-spellen zoals AD&D Tower of Mystery de Toshiba TC5116 2k SRAM gebruikten. Ik probeerde deze chip, maar deze faalde op precies dezelfde manier als de TMM2116. Uit onderzoek naar de broncode van dat prototype bleek bovendien dat het spel alleen de 256-byte ranges gebruikte en nooit het 1k bereik.
De uiteindelijke oplossing
De laatste pogingen
Ik probeerde het /WE signaal te corrigeren door een logische OR-poort te gebruiken tussen de /WE en /OE lijnen. Dit loste het probleem niet op. Toen ik de RAM-chip volledig verwijderde en de traces bekeek, zag ik dat de databus nog steeds de data niet correct doorgaf. Het probleem lag dus niet bij de RAM-chip, maar bij de E7-chip zelf.
Als laatste "longshot" bedacht ik: als de databus (D7..D0) verkeerde waarden doorgeeft door de E7-chip, waarom laat ik ze dan niet gewoon onverbonden? Ik gebruikte pin-headers om de socket uit te breiden voor alle pinnen, behalve de databus.
Het resultaat: Succes! Met de databus losgekoppeld liet het E7-testprogramma me correct lezen en schrijven in het RAM, zelfs met BANK7 actief. Daarna plaatste ik de Myst EPROMs en het werkte eindelijk.
Samenvatting van de benodigdheden
Om dit werkend te krijgen was het volgende nodig:
- Een E7-chip van een Burgertime-board, waarbij de D7..D0 pinnen niet zijn aangesloten.
- SRAM geupgraded naar een 2k Toshiba TC5116 (een TMM2116 zou mogelijk ook werken).
- ROM-adapters om de pinout van de 24-pin mask ROM's om te zetten naar 28-pin 27C64 EPROMs.
Reflectie en toekomst
Ik ben waarschijnlijk de eerste persoon in 40 jaar die succesvol een E7-mapper heeft gebruikt met de volledige 2k SRAM. De motivatie was nieuwsgierigheid en de wens om code te schrijven die daadwerkelijk op echte retro-hardware draait, wat in de demoscene vaak wordt gewaardeerd boven "fantasy consoles".
Toekomstige plannen:
- Werken aan andere spellen of demoscene-demo's.
- Een nieuwe printplaat ontwerpen met de losgekoppelde datalijnen en de juiste EPROM-pinout, om de huidige bulkige hack-board te vervangen.
- Onderzoeken of ondersteuning voor 16k EPROMs (in plaats van twee 8k) mogelijk is.
Groetjes,