-
Notifications
You must be signed in to change notification settings - Fork 0
File Structure
Retro-Jack edited this page Jun 28, 2026
·
63 revisions
A tour of where things live in the repo. The shape is deliberately flat — no src/ vs dist/ distinction, no build outputs, no node_modules. Everything you see is what gets served.
genx-dos/
├── README.md one-page entry point
├── CHANGELOG.md
├── ATTRIBUTION.md canonical record of every bundled third-party asset
├── serve.sh starts local http.server, opens browser
├── index.html <meta refresh> to prompt/
├── favicon.ico
├── make_fonts.py generates f12.N.png palette variants
│
├── prompt/ the DOS terminal
│ ├── index.html
│ ├── favicon.ico
│ ├── animated_favicon1.gif
│ ├── javascript/
│ │ ├── globals.js shared state (palette, paths, flags)
│ │ ├── goFontGo.js builds the 256 CSS rules
│ │ ├── classUtils.js add/remove/test class helpers
│ │ ├── keyboard.js keypress / keydown handlers
│ │ ├── terminal.js echo, executeBatch, prompt rendering
│ │ ├── fs.js the virtual C: drive
│ │ ├── commands-core.js dir, cd, type, find, attemptExec, handleCmd
│ │ ├── commands.js echo, cls, setcol, help
│ │ └── init.js entry point + AMIBIOS POST animation
│ └── img/
│ ├── ami-logo.png AMIBIOS POST logo
│ ├── f12.7.png master sprite sheet (light grey)
│ └── f12.<0-15>.png CGA palette variants
│
├── gamedocs/ per-game instruction pages
│ └── <platform>/ one HTML file per game, named by URL param key
│
└── systems/
├── _shared/ shared CSS used by every gamedoc + controls.html (353 pages)
│ + corner controls-link CSS/JS
│ + genx-frame.css (universal play.html page reset + .err/.loading)
│ + genx-noscript.css (no-JS overlay)
│ + genx-game-loader.js (?game=KEY → games.json lookup helper)
│ + genx-numlock-warn.js (NumLock-off banner for VICE bundles)
│ + genx-vice-softkeys.js (RUN/STOP remap to Scroll Lock + soft button)
│ + bezels/ PNG monitor frames (every platform now bezeled)
│ + textures/ 70s wallpaper tile (sitewide body background)
├── _shared-ejs/ shared EmulatorJS framework + 4 VICE cores + gearcoleco + FCEUmm + Stella + gambatte + handy + genesis_plus_gx + prosystem cores
│ (13 bundles share; saves ~25 MB vs per-bundle copies)
├── apple1/ Apple I (copied from scullin/apple1js)
├── apple2/ Apple ][+ (copied from whscullin/apple2js)
├── bbcmicro/ BBC Micro (jsbeeb, Model B — copied from mattgodbolt/jsbeeb)
├── bbcmaster/ BBC Master 128 (jsbeeb, model=Master — full copy of the same build)
├── electron/ Acorn Electron (copied from dmcoles/elkjs)
├── jsnes/ NES (EmulatorJS + FCEUmm libretro core)
├── stella/ Atari 2600 (EmulatorJS + Stella, stella2014 core)
├── js7800/ Atari 7800 (EmulatorJS + ProSystem, shared _shared-ejs/)
├── gbc/ Game Boy / Color (EmulatorJS + gambatte — handheld)
├── lynx/ Atari Lynx (EmulatorJS + handy + boot ROM — handheld)
├── gamegear/ Sega Game Gear (EmulatorJS + genesis_plus_gx — handheld)
├── msx1/ MSX1 (mirror of ppeccin/WebMSX, boots M=MSX1)
├── msx2/ MSX2 (full copy of the same WebMSX engine, boots M=MSX2)
├── jsvecx/ Vectrex (copied from DrSnuggles/jsvecx)
├── jsspeccy/ Sinclair Spectrum (copied from gasman/JSSpeccy 3)
├── jtyone/ Sinclair ZX81 (copied from JtyOne)
├── xroar/ Tandy CoCo (copied from 6809.org.uk/xroar)
├── trs80/ Tandy TRS-80 Model I (sdltrs, built from source to WASM)
├── js99er/ TI-99/4A (copied from Rasmus-M/js99er — vanilla-JS build)
├── atari400/ Atari 400 (atari800 WASM, boots OS-B)
├── atari800/ Atari 800XL (atari800 WASM, boots OS-XL — same build)
├── pet/ Commodore PET (Thomas Skibo's pet2001 — vanilla JS)
├── vic20/ Commodore VIC-20 (EmulatorJS + VICE xvic)
├── max/ Commodore MAX (EmulatorJS + VICE x64 in Ultimax mode)
├── c64/ Commodore 64 (EmulatorJS + VICE x64)
├── c16/ Commodore 16 (EmulatorJS + VICE xplus4 in c16pal mode)
├── plus4/ Commodore Plus/4 (EmulatorJS + VICE xplus4)
├── c128/ Commodore 128 (EmulatorJS + VICE x128 native mode)
├── coleco/ ColecoVision (EmulatorJS + gearcoleco + BIOS)
├── intv/ Intellivision (jzIntv WASM + custom loader + BIOS)
├── odyssey2/ Magnavox Odyssey² (libretro-o2em + custom SDL2 frontend + BIOS)
└── cpc/ Amstrad CPC (floooh/chips-test tiny8bit CPC WASM)
Every emulator-specific page can be told in one row. Where there's an integration story behind the layout, the engine article on the Emulators index goes into the detail.
| Emulator | Runtime | Wrapper | Game files |
|---|---|---|---|
bbcmicro/, bbcmaster/
|
dist/ (Vite build; a full copy in each) |
the dist's own index.html (URL-driven; Master adds ?model=Master) |
dist/discs/<publisher>/*.ssd |
electron/ |
ElkJS pure-JS + jQuery |
play.html (?game=<key>) |
10× .uef snapshots |
apple1/ |
apple1js pure-JS |
play.html (?game=<key>) |
tapes/*.js |
apple2/ |
apple2js webpack dist |
play.html (rewrites ?game= → apple2js ?disk=) |
json/disks/*.json |
jsnes/ |
EmulatorJS + FCEUmm libretro core |
play.html (?game=<key>) |
roms/*.nes |
stella/ |
EmulatorJS (shared _shared-ejs/) |
play.html |
roms/*.a26 |
js7800/ |
EmulatorJS (shared _shared-ejs/) |
play.html |
roms/*.a78 |
gbc/ |
EmulatorJS + gambatte (shared _shared-ejs/) |
play.html |
roms/*.gb/*.gbc
|
lynx/ |
EmulatorJS + handy + lynxboot.img
|
play.html |
roms/*.lnx |
gamegear/ |
EmulatorJS + genesis_plus_gx | play.html |
roms/*.gg |
msx1/, msx2/
|
stock wmsx.js engine + our wrapper index.html (a full copy in each) |
the bundle's own index.html (URL-driven; &M=MSX1 / &M=MSX2) |
games/*.zip |
jsvecx/ |
single-file minified index.html
|
index.html?rom=… (URL-driven) |
Commercial/*.bin |
jsspeccy/ |
jsspeccy/jsspeccy.js + WASM Z80 in Web Worker |
play.html |
games/*.z80/*.tap
|
jtyone/ |
zx81_emu.js + roms/zx81.rom
|
play.html |
tapes/*.p |
xroar/ |
xroar.js + xroar.wasm + 9 system ROMs |
play.html |
roms/*.ccc |
trs80/ |
sdltrs.js + sdltrs.wasm (Level II ROM embedded) |
play.html |
games/*.cmd |
js99er/ |
vanilla-JS modules + lib/ (jQuery + zip.js) |
play.html (.rpk first, .bin fallback) |
carts/*.rpk |
atari400/, atari800/
|
atari800.js + atari800.wasm (AltirraOS baked in; a full copy in each) |
play.html (?game=<key>; 400 boots OS-B, 800XL boots OS-XL) |
roms/*.atr + *.rom
|
pet, vic20, max, c64, c16, plus4, c128
|
EmulatorJS framework + VICE libretro core (shared) |
play.html (per-game model/video overrides) |
games/*.prg/*.d64/*.crt
|
coleco/ |
EmulatorJS + gearcoleco + colecovision.rom BIOS |
play.html (EJS_defaultControls numpad remap) |
games/*.col |
cpc/ |
floooh/tiny8bit CPC WASM |
play.html (URL rewrite to sokol_args ?file=&input=) |
games/*.dsk |
intv/ |
jzIntv WASM + exec.bin + grom.bin BIOS |
play.html (calls Module.launchJzintv()) |
games/*.int |
odyssey2/ |
libretro-o2em + custom SDL2 frontend + o2rom.bin BIOS |
play.html (uses shared genxLoadGame()) |
games/*.bin |
Each play.html-based emulator has a games.json mapping <key> → {title, rom} (or {title, bundle}). The URL-driven emulators (bbcmicro, bbcmaster, msx1, msx2, jsvecx) take all their config via query string or hash and need no per-site wrapper.
| File | Purpose |
|---|---|
index.html (repo root) |
<meta refresh> to prompt/ — the POST animation lives in the prompt page now |
prompt/index.html |
Loads the JS modules in order, hosts the terminal <div>
|
prompt/img/ami-logo.png |
AMIBIOS POST splash logo |
prompt/img/f12.7.png |
192×192 px, 16×16 grid of 12×12 px CP437 glyphs (light grey) |
prompt/img/f12.<N>.png |
Pre-tinted variant for CGA palette index N |
make_fonts.py |
One-shot PIL script that tints f12.7.png into the other variants |
serve.sh |
python3 -m http.server 8765 wrapper that also opens the browser |