### resload_Protect#? használata

#### Elmélet

Vannak olyan helyzetek, amikor hasznos lehet tudni azt, hogy az installált program milyen memória-hozzáféréseket hajt végre. A resload_Protect#? funkciókkal lehetséges bizonyos memóriahelyek védelme olvasás és/vagy írás ellen. A védelem azt jelenti hogy minden ilyen védett területhez való hozzáférés Access Fault kivétet fog létrehozni, amit a WHDLoad egy kérdezővel fog megjeleníteni. Ha egy memóriarészt védettnek állítasz be a resload_Protect#? funkcióval, a WHDLoad módosítani fogja a lapleírókat az MMU fordítási fában. Ezentúl minden védett laphoz való hozzáféréskor a CPU Access Fault kivétet fog generálni. A kivét handler a WHDLoad-on belül elenőrzi a kivét okát. Ha az ok egy hozzáférés volt egy védett laphoz de a hozzáférés nem egyezik a védett területtel, akkor a hozzáférés emulálva lesz, és normál programfuttatás folytatódik. Egyébként a WHDLoad kilép a megfelelő kérdezővel. Ha a hozzáférés egy hozzáférés az utasításokhoz (pl. a cpu megpróbál egy kódot betölteni), az mindig emulálva lesz, vagy más szavakkal a resload_Protect#? funkciók csak az adatok olvasását és írását szabályozzák. Tény hogy minden védett laphoz való hozzáférés (jelenlegi lapméret $1000) hozzáférési kivétet fog létrehozni, még ha a védett terület csak egy byte, az eredmény a program nagymértékű belassulása lesz. Különösen ha a kód ugyanazon a lapon van. Ha program függ a végrehajtási sebességtől, a futásban problémák adódhatnak. Ezért előfordulhat, hogy néhány program nem működik a védelmi funkcióval.

#### Példa: kódok ellenőrzése

Ha egy játékot installálsz a WHDLoad segítségével, módosítanod kell az eredeti betöltő rutint úgy, hogy a WHDLoad töltse be a játék adatait. Néhány játék ellenőrzi a kódterületeket, hogy nem módosították-e az eredeti kódot. Ezeket az érzékelő rutinokat néha nehéz megtalálni. De a resload_Protect#? funkciók használatával ez könnyű. Csak annyit kell tenned, hogy levéded olvasástól azokat a területeket, amelyeket megváltoztattál. Ezután minden rutin amely megpróbálja ellenőrizni és beolvasni a megváltoztatott kódot, egy hozzáférési hibát fog generálni. És így megtudod, hogy hol van a rutin.

#### Korlátozások

Nem védheted le azt a területet amelyre az SSP mutat. Ha ezt teszed, és egy kivét történik, az egy Double Bus Fault-ot eredményez, mivel a CPU nem tudja kiírni a kivét stackframe-et. A Double Bus Fault után csak egy reset után lehet folytatni a végrehajtást. A WHDLoad ellenőrzi a védett terület és az SSP konfliktusát, és megszűnteti azt, de ez nem segít, ha az SSP később megváltozik.

- 68020 + 68851
  - ez a hardver jelenleg nem támogatott
- 68030
  - 3-byte átvitelek nem támogatottak és valódi hozzáférési kivétet hoznak létre, ilyen átvitelek történhetnek, ha egy longword hozzáférés történik egy páratlan címen a laphatárnál (pl. "`tst.l ($fff)`" ahol a $1000 lap védett), mivel ez érvénytelen 68000-en, ezért valószínűleg ilyet sose fogsz látni
  - zárt átvitelek `tas`, `cas` vagy `cas2` kód miatt nem támogatottak és valódi hozzáférési kivétet hoznak létre, ez nem gond, mert a zárt átvitelt nem támogatja az Amiga hardvere
- 68040
  - ez a hardver jelenleg nem támogatott
- 68060
  - félrecímzett adatfolyamok hozzáférés nem támogatott és valódi hozzáférési kivétet hoznak létre, a félrecímzett hozzáférés egy olyan hozzáférés, amely két lapon nyúlik át (és ezek közül legalább az egyik vagy mindkettő védett), például "`tst.l ($ffe)`" a $0..$fff lapot és a $1000..$1fff lapot is módosítja, ez a korlát valódi probléma és a resload_Protect funkciót majdnem használhatatlanná teszi, valószínűleg később megpróbálom támogatni, de ez nehéz
  - félrecímzett adatfolyamok hozzáférés nem támogatott és valódi hozzáférési kivétet hoznak létre, és ha mindkét érintett lap védett, ezt az együttállást el kell kerülni az esetek nagy részében
  - zárt átvitelek `tas`, `cas` vagy `cas2` kód miatt nem támogatottak és valódi hozzáférési kivétet hoznak létre, ez nem gond, mert a zárt átvitelt nem támogatja az Amiga hardvere
  - a védett lapon lévő utasítások (és emiatt emuláltak) és az állapotregiszter supervisor részéhez való hozzáférések hibásan lesznek végrehajtva, ezek az utasítások mindig 1-re állítják a nyomkövető bitet és a megszakítás prioritás maszkját 7-esre, a supervisor rész bármilyen módosítása hatástalan lesz (pl. a supervisor rész változatlan marad)
  - `movem` utasítás hozzáférhet egy védett területhez anélkül, hogy hozzáférési hiba kivétet hozna létre, ez azért lehetséges, mert csak az első hozzáférés lesz ellenőrizve (word vagy longword)
  - `move16` és a dupla pontosságú műveletek (FPU) nem támogatottak és valódi hozzáférési kivétet hoznak létre
  - a "`move (mem),(mem)`" utasítás a átlapoló forrás és célcímzéssel hozzáférési kivétet hoznak létre, mivel a félrecímzés helytelenül lesz végrehajtva, például a "`move.l ($ffc),($ffe)`" utasítás, ahol a $1000..$1fff lap védett és a memória végrahajtás előtti tartalma: ($ffc)=$11112222, ($1000)=$33334444, végrehajtás után a $1000 tartalma: $11114444 és nem $22224444