# MSX1 Webulátor

Webový emulátor MSX1. Jako šablona webu posloužil [`../sordm5`](../sordm5/),
jako referenční model stroje picoM8. Čistý JavaScript, Canvas a Web Audio,
bez závislostí a bez bundleru.

## Rychlý start

```sh
node tools/serve.cjs
```

Otevřete <http://127.0.0.1:8871/>. Tlačítko **Diagnostika** spustí přiloženou
původní testovací cartridge; vlastní soubor `.rom` / `.bin` nahrajete tlačítkem
nebo přetažením na obrazovku. Start C-BIOS trvá několik sekund. Diagnostika se
ovládá šipkami vlevo / vpravo a mezerník zahraje tón. Zvuk je zapnutý od startu,
prohlížeč ho ale pustí až po prvním kliknutí nebo stisku klávesy — do té doby
na obrazovce svítí hláška, že se zvuk zapne kliknutím. Soubory zůstávají
v prohlížeči, nikam se neodesílají.

Přiložený firmware je PAL C-BIOS 0.29a s lokálními opravami kompatibility
pro Monkey Academy a pro ROM, jejichž inicializace se vrací do BIOSu. Je
sestavený ze zdrojů upstreamu pod licencí BSD 2-clause, viz
[poznámky ke zdrojům a sestavení firmwaru](firmware/cbios/README.md).
**C-BIOS neobsahuje MSX BASIC.** Tlačítkem **Nahrát BIOS** použijete vlastní
32KB dump MSX1; zůstane jen v aktuální relaci prohlížeče. Tlačítko **C-BIOS**
vrátí přiložený firmware. K distribuci je přiložený pouze C-BIOS.

## Emulovaný hardware

| Součást | Konfigurace |
|---|---|
| CPU | Z80 na 3 579 545 Hz, PAL 50 Hz |
| Obraz | VDP kompatibilní s TMS9918, 16 KiB VRAM, aktivní obraz 256 × 192 |
| Paměť | 64 KiB RAM, 32 KiB BIOS, čtyři primární sloty |
| Sloty | BIOS 0; cartridge 1; prázdný 2; RAM 3/subslot 2 |
| Vstup | 8255 PPI, matice klávesnice aktivní v nule, joystick přes PSG |
| Zvuk | AY-3-8910: tóny, šum a obálka; AudioWorklet se záložním výstupem |
| Přerušení | VDP zapojený přímo na INT procesoru Z80 |

## Cartridge a ovládání

Funguje stránkování Normal, ASCII8, ASCII16, Konami a Konami SCC. Volba Auto
se řídí značkou v názvu souboru (například `Hra [ASCII8].rom`) a jinak odhadem;
v případě potřeby zvolte mapper ručně. **Zvuk SCC zatím není hotový.** ROM
může mít nejvýš 4 MiB. Cartridge a zvolený mapper si prohlížeč zapamatuje,
pokud to jeho úložiště dovolí.

Parametr `?CART=diagnostic` nahraje `carts/diagnostic.rom`; povolený je jen
název souboru, ne cesta. Pro ovládání klávesnicí klikněte na obrazovku.
Joystick 1 ovládají šipky, mezerník a N. Přeřazovače popisuje nápověda.
Když zrcadlení joysticku na klávesy překáží při psaní, zvolte **Jen klávesnice
MSX**. Prohlížeč podporuje dva standardní gamepady: D-pad / levá páčka
a tlačítka A/B ovládají porty MSX 1 a 2. Gamepad připojíte stiskem libovolného
tlačítka na ovladači. Diagnostika přijímá i vstup z gamepadu. K dispozici je
reset, pauza, celá obrazovka, scanlines, diagnostický panel a dotykové šipky.

## BIOS a snapshoty

**Nahrát BIOS** vyžaduje přesně 32 KiB a provede studený reset, cartridge
přitom zůstane vložená. Pro start samotného firmwaru cartridge vyjměte.
Zda bude k dispozici BASIC, záleží na vašem dumpu. Některé kompilované
cartridge, mezi nimi Calebe Adventure, volají rutiny BASIC ROM, přestože jde
o samostatné soubory ROM. Potřebují váš vlastní BIOS s BASICem; C-BIOS místo
spouštění nepoužitých bajtů ROM a restartu ohlásí nedostupnou část firmwaru.
Vlastní BIOS se neukládá do úložiště prohlížeče a obnovení stránky nepřežije.

Vlastní dumpy jsou lokálně ve složce `bins/` pro budoucí práci na
kompatibilitě. Složka je vyřazená ze správy verzí; její obsah je soukromý
referenční materiál a nesmí se dostat do vydaných balíčků ani na server.

**Uložit** stáhne soubor `.esnap`. **Nahrát** nebo přetažení souboru na
obrazovku obnoví stroj včetně uloženého stavu pauzy. Snapshot obsahuje CPU,
RAM, firmware, banky cartridge, obraz, sloty PPI a fáze zvuku AY. Obsahuje
i nahraný BIOS a cartridge, takže soubory s vlastními dumpy nikomu neposílejte.
Nastavení zvuku a držené klávesy se neobnovují. Viz
[schéma snapshotu MSX](docs/ESNAP_FORMAT.md); ostatní emulátory s formátem
ESNAP potřebují pro výměnu souborů právě toto schéma MSX.

## Vývoj

```sh
node tools/serve.cjs            # lokální HTTP server; port změní PORT (výchozí 8871)
node --test tests/*.test.cjs    # testy jádra, bootu, mapperů, vstupu, zvuku a UI
node tools/build-demo.cjs       # znovu sestaví diagnostickou cartridge a JS data
python3 tools/build-cbios.py --check  # ověří sestavení C-BIOS (vyžaduje SjASMPlus)
```

Zdrojáky jsou v `src/{cpu,video,machine,audio,snapshot,ui}`, testy v `tests/`
a lokální cartridge v `carts/`. Na localhostu nebo přes HTTPS se použije
preferovaný výstup AudioWorklet. Když se modul nenačte (například při otevření
souboru napřímo), zvuk automaticky přejde na záložní výstup. Diagnostický panel
ukazuje stav zvukového kontextu a zvolený výstup.

## Zdroje a poděkování

Chování stroje vychází z projektu picoM8 (`src/machines/msx1/`
a `src/devices/ay8910.*`). Viz [poznámky k architektuře](docs/ARCHITECTURE.md)
a [licence](licenses/README.md). [WebMSX](https://github.com/ppeccin/webmsx)
posloužil jen jako inspirace; neobsahuje se z něj žádný kód, ROM ani grafika.

## Omezení a další kroky

Jde o první implementaci, ne o slib široké kompatibility s hrami. Obraz se
kreslí po snímcích, ne přesně po řádcích. Zápisy do AY nemají časové značky
v cyklech. Disketa, magnetofon, zvuk SCC, cartridge se SRAM, MSX2 a rozšířené
mappery RAM zatím nejsou. Monkey Academy a ROM s vracející se inicializací mají
lokální opravy kompatibility. Calebe Adventure s lokálně dodaným BIOSem dojde
na titulní obrazovku; jeho běhové prostředí BASIC ale C-BIOS neposkytuje.
Pokrytí dalších her a firmwarů je zatím omezené.

Automatické testy ověřují boot C-BIOS a původní diagnostickou cartridge.
Testy UI simulují API prohlížeče. Skutečné vykreslování, stahování souborů,
fyzické ovladače a návaznost zvuku po snapshotu je potřeba ověřit v prohlížeči.
