WHDLoad programozása

### Sematikus végrehajtási folyamat

A következő táblázat mutatja a program futását amikor a WHDLoad installált program végre lesz hajtva. Remélem segít megérteni a WHDLoad működését és azt, hogy hogyan működik együtt a WHDLoad, a Slave és az installált program.

A FELHASZNÁLÓ

- elindítja a demót vagy a játékot az ikonjára klikkelve vagy parancssorból indítva

Az Operációs Rendszer

- betölti a WHDLoad programot és elindítja

WHDLoad

- ellenőrzi a szoftver és hardver környezetet
- betölti és ellenőrzi a Slave-et
- lefoglalja az installált programhoz szükséges memóriát
- ha a Preload/S be van kapcsolva, betölti a lemez képmásokat és a fájlokat a memóriába (ha van elég)
- leállítja a rendszert (kikapcsolja a multitask-ot és a megszakításokat, átkapcsolja a grafikus hardvert OCS módba, minden hardvert kezdőállapotba hoz)
- átugrik a Slave-re

Slave

- betölti az insatllált program fő indítóját egy WHDLoad funkció segítségével (pl. resload_DiskLoad vagy resload_LoadFile)
- kijavítja a fő indítót (hogy a program a Slave-en keresztül töltse be az adatokat, kompatibilitási problémák, engedélyezi a kilépést
- meghívja a fő indítót

Installált program

- teszi a dolgát
- adatok betöltésénél meghívja a Slave-et (mert a Slave már módosította hogy ezt tegye), és Slave meghívja a WHDLoad-tot, és a WHDLoad részben engedélyezi a rendszernek az adatok betöltését (csak akkor ha az adat nem Preload), aztán visszatér, visszatér és az installált program fut tovább

A FELHASZNÁLÓ

- kilép a programból a QuitKey megnyomásával

Slave

- visszatér a WHDLoad-hoz a resload_Abort funkcióval

WHDLoad

- engedélyezi a rendszert (visszaálítja a hardver regisztereket, képernyőt és memóriát)
- felszabadítja az összes lefoglalt erőforrást
- visszatér a rendszerbe

### Hogyan kell installálni egy egyszerű egylemezes sávtöltőst

Ez egy nagyon kicsi és rövid lépésenkénti útmutató ahhoz, hogy hogyan lehet a WHDLoad segítségével installálót készíteni. Az útmutaó egy ideális egyszerű esetet vesz alapul. A valós világban ilyen valószinűleg soha nem fog előfordulni. A speciális esetekre és problémákra olvasd el az ezt követő fejezeteket.

1. Előkészületek
   - Készíts egy könyvtárat ahová az össze fájl kerül.
   - Készítsd el a lemez képmását a DIC segítségével ebbe a könyvtárba.
   - Készíts egy #?.info fájlt "WHDLoad" <alapértelmezett programmal> és a "SLAVE=#?" paraméterrel, ami a slave nevét tartalmazza. (vagy egyszerűen másold át az ikont a Példa Installból, és kapcsold ki az összes paramétert a "SLAVE=" kivételével).
2. A Slave
   A slave megírásához a következő információkra van szükség:
   1. Hol helyezkedik el a lemezen a fő indító?
   2. A fő indítón belül hol van a lemezbetöltő?
   Ezekhez az információkhoz először elemzeni kell az indítóblokkot. Legtöbbször a fő indító innét töltődik be exec.DoIO() segítségével. Néha egy speciális sávtöltő van az indítóblokkban. Most megírhatjuk a Slave-et ami szimulálja az indítóblokkot és a betölti a fő indítót a lemez képmásból. Most ki kell szednünk a fő indítót a képmásból vagy a memória kiíratásból. Ezután meg kell találnunk a betöltőt a főprogramban. Ezt gyorsan úgy tehetjük meg, hogy megkeressük a `$AAAAAAAA` mintát (ezt az MFM dekódolás használja) egy hexa-szerkesztővel. Ezután kivágjuk a megtalált területet (+/- `$1000` byte), visszaalakítjuk, és megkeressük a rutin elejét. Megértjük a paraméterlistát. Mostmár létrehozhatjuk azt a kódot, ami módosítja ezt a töltőrutint úgy, hogy minden hívás a Slave-hez megy. A Slave ezután módosítja a paramétereket és meghívja a resload_DiskLoad. WHDLoad funkciót.
3. Ideális esetben az installálás kész.
   Az egyetlen hátralévő dolog egy szép ikon készítése. Szedjél ki két képet a WHDLoad kutató opciójával és az SP vagy a leállító vagy U.A.E. használatával és készítsd el az ikont. A 16 színű RomIcon paletta ajánlott.

### Lehetséges problémák és speciális esetek

#### Nem-standard sávtöltő

Néhány program saját lemezformátumot használ. Ez azt jelenti hogy a DIC nem tudja a lemezképmásokat létrehozni. Ilyen lemezekről a RawDIC tud lemezképmásokat vagy fájlokat létrehozni. További információkért lásd a RawDIC dokumentációját.

#### Több lemez

Ha a program egynél több lemezt használ, akkor a Slave-nek a lemezhozzáféréseket át kell irányítania a képmás fájlba. Ez néha nem könnyű. Néhány program támogat egynél több meghajtót, így használhatod a meghajtó számát a lemez kiválasztásához. A legtöbb program egy azonosítót használ minden lemezen a megkülönbönztetés miatt. Ebben az esetben változókat kell használni, amelyek a lemez számát tartalmazzák, és minden lemezazonosító-hozzáférésnél (ezt a lemez-töltő paramétreinek elemzéséből tudhatjuk meg) növelni kell a változót (ha elérte az utolsó lemezt, akkor csökkenteni). Így remélhetőleg a betöltő beolvassa az azonosítót újra és újra addig amíg a megfelelő lemezt meg nem találja. Ezt persze a programba épített lemez-kérdező kikapcsolhatja.

#### Eredménytábla mentése

Nincs itt sok mondanivaló. Használd a resload_SaveFile opciót egy bizonyos memóriaterület lemezre írásához. Ha akarod, ezt be is kódolhatod, hogy a lamerek ne tudják könnyen módosítani. Nem javasolt közvetlen lemezképmásba írás (a resload_SaveFileOffset opciót használva), mert ha valami balul sül el (pl. összeomlás), a képmások valószínűleg megsérülnek.

#### Játékmentések

A mentések kezelése hasonló az eredménytábláéhoz.

#### Operációs rendszer használata

Amikor a slave és az instalált program elindul, a rendszer nem létezik, nem érhető el, és nincs értelme elérni! Ezért az installált program mindenféle elérését le kell tiltani. Ha nincs belőlük sok és nem számítanak a WHDLoad környezetben (mint pl. exec.Disable() vagy exec.SuperState()) egyszerűen NOP (`$4e71`) kell. Ha fontos funkciókhoz érnek hozzá (mint exec.DoIO()), át kell irányítani őket a Slave-hez és emulálni kell. Ha nagyon sok van belőlük, készíteni kell egy egyszerű exec.library-t egy nemhasznált memória-területen (inicializálni kell a longword-ot a `$4` címen). Megnézheted az Oscar.slave forráskódját, amely exec.AllocMem() utasítást emulál. A rendszerhozzáférések felismeréséhez a kezdeti execbase címe a következő legyen: `$f0000001`, de így minden olyan rutin, amely használja ezt, "Address Error" kivétet fog generálni.
Ha nagyon sok rendszerfunkció van használatban, használd a KickEmu csomagok egyikét, amelyet a fejlesztői csomagban találhatsz meg. Van egy a Kick 1.3 részére ('src/sources/whdload/kick13.s') és van egy a Kick 3.1 részére ('src/sources/whdload/kick31.s'). A csomagokhoz szükséges az eredeti Kickstart képmás és egy teljes rendszer-környezetet fognak létrehozni a WHDLoad területén belül. További információért nézd meg a mellékelt dokumentációt.

### Gyakori kompatibilitási problémák

#### 68000/68010/68ec020 korlátozott címterülete

Ezeken a processzorokon a címterület korlátozva van 16 MB-ra (`$000000...$ffffff`) mert a processzoroknak csak 24 címvezetékük van. Emiatt az összes magasab című elérés az alsó 16 MB-ban lesz végrehajtva a 8 legnagyobb bit figyelmenkívül hagyásával. Néhány program ezeket adattárolásra használja, vagy egyszerűen nem törli. Az olyan processzorokon, ahol a teljes 4 GB-os címterület megvan (pl. 68020/680ec30/68030/68040/68060) ez nem működik, mivel a teljes 32-bites cím lesz használva.
A megoldás a hozzáférések módosítása és átirányítása a megfelelő címre.
Néha a különös címekhez való hozzáférés oka lehet egy nem inicializált mutató. Ebben az esetben segíthet a `$400` - ws_BaseMemSize törlése.

#### Processzorok különböző stackframe-je

A megszakítások és kivétek során a processzorok által létrehozott stackframe-ek különbözőek a 68k család tagjainál. A 68000-en a stackframe 6 byte, kivéve a busz és címhibák. A stackframe a mentett SR-t (a7) és PC-t (2,a7) tartalmazza. Minden más processzoron (68010+) a minimális stackframe 8 byte és tartalmazza a vektor számát word-ként (6,a7). Ez a négy-word stackframe formátum `$0` lesz létrehozva a "Trap #xx" és a megszakítások számára 68010-68060 processzorokon. A stackframe-ek más kivéteknél különböznek minden processzoron. Az RTE utasítások különbözőek a 680000en és 68010+-eken. 68000-on csak visszaállitja az SR-t és PC-t és folytatja a program végrehajtását a megszakított címen. 68010+-okon kiüríti a stackframe-et a stackframe formátumától függően.
Néhány program berak egy címet (PC) és egy SR-t és ezután végrehajt egy RTE utasítást. Ez csak a 68000-en működik, 68010+-okon előre nem látható eredményei lesznek.
Ha egy program ezt teszi, ki kell javítanod. Néha elég az RTE-t kicserélni RTR-re.

#### MOVEM.x RL,-(An) 68000/010 és 68020/030/040 processzorokon

Különbség van, ha a regisztert predecrement módban (RL) használják, ekkor tartalmazni fogja a regiszterlistát is. A 68020, 68030 és 68040 processzorokon a memóriába írt érték a regiszter kezdeti értéke a művelet méretével csökkentve. A 68000 és 68010 a kezdeti regiszter értéket írja (nincs csökkentés).
Mivel egy ilyen konstrukció nem túl hasznos, jelenleg nincs egy program sem, amelynek ez gondot okozna.

### Általános útmutató installálók írásához

- Ne módosítsd a nagyobbb processzorban lévő regisztereket mint pl. VBR vagy CACR. A VBR mindig 0 a Slave programozó szemszögéből, mégha az automatikus vektorok miatt (és Trap-ek miatt is, ha a WHDL_EmulTrap jelző be van állítva) mozgatva van. A CACR bitjei különböznek minden processzoron. Csak egy használható módja van a cache módosításához, használd a resload_SetCACR/SetCPU funkciót és a bitdef-eket az 'exec/execbase.i' és 'whdload.i' fájlokból. Emellett az installálandó programban lévő összes olyan dolgot, amely ezeket a regisztereket módosítja, ki kell kapcsolni vagy át kell lépni, egyébként a WHDLoad nem tud rendesen működni!
- Soha ne módosítsd a lemezképmásokat. Megvan az előnye annak, ha valaki lemezről akarja ezeket indítani, csak egyszerűen visszaírja őket lemezre (abban az esetben, hogyha a program fut nagy javítások nélkül, ami nem túl gyakori).
- Ne használj fel közvetlenül a programból dolgokat a slave-ben (copyright probléma).
- Csak akkor engedélyezd a gyorsítótárakat ha az minden processzoron működik.
- Használj olyan kevés memóriát, maennyit csak lehetséges a ws_BaseMemSize számára. Néhány embernek rezidens moduljai vannak a Chip memória végén, így használd inkább a `$1f0000` címet a `$200000` helyett és a WHDLoad tud abszolút lefoglalt memóriát használni.

### Tippek és trükkök

#### Mi a jobb, lemezképmások vagy fájlok használata?

Előfordul, hogy lehetőséged van választani lemezképmások vagy valódi fájlok között. Mindkettőnek megvan az előnye. A lemezképmások általában könnyebben kezelhetőek és gyorsabban létrehozhatóak a Slave által. De a valódi fájlok könnyebben gyorsítótárazhatóak (ha csak kevés memória van vagy az nagyon töredezett). A merevlemezen is kevesebb helyet foglalnak el a valódi fájlok, mint a lemezképmások. Csak akkor használj lemezképmást ha sok fájl van (több mint 30).