Talán hasznos információ az ep128emu snapshot file formátumának a leírása:
- minden ep128emu2/plus4emu bináris file egy 16 byte-os azonosítóval kezdődik:
{
0x5D, 0x12, 0xE4, 0xF4, 0xC9, 0xDA, 0xB6, 0x42,
0x01, 0x33, 0xDE, 0x07, 0xD2, 0x34, 0xF2, 0x22
};
- ezt tetszőleges számú adatblokk követi a következő formátumban:
- blokk típus (4 byte)
- blokk adat méret (4 byte)
- blokk adat (blokk_adat_méret byte)
- blokk ellenőrző összeg (a gyakorlatban az egyszerűség kedvéért figyelmen kívül hagyható)
- a több byte-os egész értékek mindig MSB..LSB ("big-endian") formátumúak
- az utolsó, "file vége" blokk 0x00000000 típusú és 0 adat méretű
A snapshot betöltéshez hasznos blokk típusok (egyelőre nem teljes lista
):
0x45508002 (memória állapot)- verzió (4 byte, jelenleg mindig 0x10000000)
- lapregiszterek (B0h..B3h) állapota (4 byte)
- szegmens adatok a blokk végéig, egy szegmens formátuma:
- szegmensszám (1 byte)
- szegmens típus (1 byte, 0 = RAM, 1 = ROM)
- szegmens adat (16384 byte)
0x45508003 (I/O állapot, gyakorlatilag a portokra utoljára kiírt értékek)- verzió (4 byte, jelenleg mindig 0x10000000)
- I/O port állapot (256 byte)
0x45508001 (Z80 állapot)- verzió (4 byte, jelenleg 0x10000002, régi emulátor verzióknál kisebb érték is előfordulhat, de a gyakorlatban valószínűleg elég ezt támogatni)
- regiszterpárok állapota PC, AF, BC, DE, HL, SP, IX, IY, AF', BC', DE', HL' sorrendben (mind 2 byte)
- I regiszter (1 byte)
- R regiszter (1 byte, a 7. bitet figyelmen kívül kell hagyni)
- belső regiszter, figyelmen kívül hagyható (4 byte)
- IFF1 regiszter (1 byte, 0 vagy 1)
- IFF2 regiszter (1 byte, 0 vagy 1)
- R regiszter 7. bitje (1 byte, 0 vagy 0x80)
- IM regiszter (1 byte, 0, 1, vagy 2)
- az IM2 mód cím táblázat címzéséhez az alsó 8 bit (1 byte)
- jelzőbitek (4 byte):
- bit 0: az aktuális utasítás végén lehetséges megszakítás (1 = igen, a DI és EI letiltja ezt)
- bit 1: a Z80 megszakítás bemenete aktív (1 = igen)
- bit 2: az aktuális utasítás HALT (1 = igen)
- bit 3: a Z80 megszakítás bemenete aktív (1 = igen)
- bit 4: NMI az aktuális utasítás végén (EP-n nem fordul elő)
- bit 5: új PC beállítása az aktuális utasítás végén (ez csak a debuggerben lehetséges)
A gyakorlatban az 1. bit a fontos, a többi valószínűleg figyelmen kívül hagyható játékok
betöltésénél, mivel snapshot normál esetben nem készül utasítás közben, és a debugger funkciók
támogatása sem lényeges.
- új PC cím az aktuális utasítás után (4 byte, előjeles, -1: nincs ugrás); ezt a debugger használja, és figyelmen kívül hagyható
0x45508004 (DAVE állapot)- verzió (4 byte, jelenleg mindig 0x01000000)
- órajel osztó (1 byte, 2 vagy 3, = (port(BFh) & 2) / 2 + 2)
- órajel osztó számláló (1 byte, visszafelé számol 0-ig)
- változtatható hosszúságú polinom számláló hossza (1 byte, 9, 11, 15, vagy 17)
- 4 bites polinom számláló fázis (4 byte, 0..14, visszafelé számol)
- 5 bites polinom számláló fázis (4 byte, 0..30, visszafelé számol)
- 7 bites polinom számláló fázis (4 byte, 0..126, visszafelé számol)
- változtatható hosszúságú polinom számláló fázis (4 byte, visszafelé számol)
- változtatható hosszúságú polinom számláló fázis kezdőérték (4 byte, 510, 2046, 32766, vagy 131070)
- 4 bites polinom számláló kimenet (1 byte, 0 vagy 1)
- 5 bites polinom számláló kimenet (1 byte, 0 vagy 1)
- 7 bites polinom számláló kimenet (1 byte, 0 vagy 1)
- változtatható hosszúságú polinom számláló kimenet (1 byte, 0 vagy 1)
- 62500 Hz számláló (4 byte, 0..3, visszafelé számol)
- 1000 Hz számláló (4 byte, 0..249, visszafelé számol)
- 50 Hz számláló (4 byte, 0..4999, visszafelé számol)
- 1 Hz számláló (4 byte, 0..249999, visszafelé számol)
- 31250 Hz (62500 / 2) órajel állapot (1 byte, 0 vagy 1)
- 0., 1., és 2. hang csatorna állapota a következő formátumban:
- kimenet (1 byte, 0 vagy 1)
- előző kimenet (1 byte, 0 vagy 1)
- flip-flop állapot (1 byte, 0 vagy 1)
- számláló fázis (4 byte, visszafelé számol 0-ig)
- számláló kezdőérték (= frekvencia kód, 4 byte, 0..4095)
- polinom számláló mód (1 byte, 0, 4, 5, 7, vagy 17)
- felüláteresztő szűrő engedélyezett a következő csatorna kimenetével (1 byte, 0 vagy 1)
- gyűrűmoduláció engedélyezett a 2. következő csatorna kimenetével (1 byte, 0 vagy 1)
- számláló engedélyezett (1 byte, 0 vagy 1, 1 = számláló fut)
- bal hangerő (1 byte, 0..63)
- jobb hangerő (1 byte, 0..63)
- 3. hang csatorna állapota a következő formátumban:
- kimenet (1 byte, 0 vagy 1)
- előző kimenet (1 byte, 0 vagy 1)
- polinom számláló kimenet (1 byte, 0 vagy 1)
- szűrő kimenet (1 byte, 0 vagy 1)
- órajel forrás (1 byte, 0..2 = másik hang csatorna kimenetének lefutó éle, 3 = 31250 Hz órajel
lefutó éle)
- órajel forrás előző kimenete (1 byte, 0 vagy 1)
- 7 bites és változtatható hosszúságú polinom számlálók felcserélése (1 byte, 0 vagy 1, 1 = igen)
- zaj csatorna polinom számláló (1 byte, 7 vagy 17)
- aluláteresztő szűrő a 2. csatorna kimenetével (1 byte, 0 vagy 1)
- felüláteresztő szűrő a 0. csatorna kimenetével (1 byte, 0 vagy 1)
- gyűrűmoduláció az 1. csatorna kimenetével (1 byte, 0 vagy 1)
- bal hangerő (1 byte, 0..63)
- jobb hangerő (1 byte, 0..63)
- hang megszakítás forrása (1 byte, 0 = 0. csatorna, 1 = 1. csatorna, 2 = 50 Hz, 3 = 1 kHz)
- hang megszakítás engedélyezett (1 byte, 0 = nem, 1 = igen)
- 1 Hz megszakítás engedélyezett (1 byte, 0 = nem, 1 = igen)
- video megszakítás engedélyezett (1 byte, 0 = nem, 1 = igen)
- INT 2 megszakítás engedélyezett (1 byte, 0 = nem, 1 = igen)
- hang megszakítás bemenet állapot (1 byte, 0 vagy 1)
- 1 Hz megszakítás bemenet állapot (1 byte, 0 vagy 1)
- video megszakítás bemenet állapot (1 byte, 0 vagy 1)
- INT 2 megszakítás bemenet állapot (1 byte, 0 vagy 1)
- hang megszakítás tároló (1 byte, 0 vagy 1, 1 = aktív)
- 1 Hz megszakítás tároló (1 byte, 0 vagy 1, 1 = aktív)
- video megszakítás tároló (1 byte, 0 vagy 1, 1 = aktív)
- INT 2 megszakítás tároló (1 byte, 0 vagy 1, 1 = aktív)
- aktuális audio kimenet (4 byte, bal + jobb * 65536, egy csatorna kimenete 16 bites előjel nélküli egész érték)
- memória lapregiszterek állapota (4 byte)
- magnó hang visszacsatolás engedélyezett (1 byte, 0 vagy 1)
- aktuális magnó bemenet (1 byte, 0 vagy 1, 0 = B6h port 7. bit = 1)
- aktuális magnó szint (1 byte, 0 vagy 1, 0 = B6h port 6. bit = 1)
- billentyűzet mátrix sor (1 byte, 0..15)
- billenyűzet mátrix állapot (16 byte)
Ezek közül a gyakorlatban elsősorban a megszakítással kapcsolatos regiszterek fontosak, a sok belső hang regiszter különösebb probléma nélkül figyelmen kívül hagyható.
0x45508005 (NICK állapot)- verzió (jelenleg 0x04000000)
- az aktuális LPB paraméterei:
- sorok száma (4 byte, 1..256)
- VINT flag (1 byte, 0/1 = VINT alacsony/magas)
- VRES bit (1 byte, 0 vagy 1)
- reload bit (1 byte, 0 vagy 1)
- szín mód (1 byte, 0..3)
- video mód (1 byte, 0..7)
- altInd0 bit (1 byte, 0 vagy 1, = jobb margó 7. bitje)
- altInd1 bit (1 byte, 0 vagy 1, = jobb margó 6. bitje)
- lsbAlt bit (1 byte, 0 vagy 1, = bal margó 6. bitje)
- msbAlt bit (1 byte, 0 vagy 1, = bal margó 7. bitje)
- bal margó (1 byte, 0..63)
- jobb margó (1 byte, 0..63)
- paletta (16 byte, a 8..15 színeket a 80h port írása állítja)
- aktuális LD1 cím (4 byte; minden cím video cím 0 és 0xFFFF között)
- aktuális LD2 cím (4 byte, karakteres módban a tényleges cím)
- LPT kezdőcím (4 byte)
- aktuális LPB kezdőcíme (4 byte)
- aktuális LPB sorszámláló (visszafelé számol 0-ig) (4 byte)
- video megjelenítés aktív (nem keret) (1 byte, 0 vagy 1)
- aktuális slot (1 byte, 0..56)
- keret színe (1 byte)
- adatbusz állapota (1 byte, figyelmen kívül hagyható)
- LPT jelzőbitek (1 byte, belső regiszter az LPT újratöltésének vezérléséhez)
- 80h port mentett értéke (1 byte)
- 83h port mentett értéke (1 byte)
0x45508009 (gép állapot, leírás később)
Az egyéb blokk típusok figyelmen kívül hagyhatók, de az alábbiakra érdemes hibaüzenetet adni, mert EP snapshotban nem fordulhatnak elő:
- 0x45508007 (emulátor konfiguráció)
- 0x4550800A (demo adat, azaz billentyűzet események időzítéssel)
- minden, ami 0x4550800B, vagy nagyobb (ezek csak Plus/4, Spectrum, vagy CPC emulációnál lehetségesek)