### Používanie resload_Protect#?

#### Teória

Existujú rôzne situácie, v ktorých sa môže hodiť informovanosť o prístupoch nainštalovaného programu do určitých oblastí pamäti. S pomocou funkcie resload_Protect#? je možné chrániť určité oblasti pamäte pred čítaním alebo zapisovaním procesorom. Ochrana znamená, že každý prístup do tatko chránenej oblasti vyvolá Access Fault výnimku, ktorá vyústi v chybové hlásenie programu WHDLoad. Ak označíte oblasť pamäte ako chránenú použitím funkcie resload_Protect#?, WHDLoad zmení popisy danej oblasti v translation tree MMU. Potom pri každom prístupe do danej pamäte, CPU vytvorí výnimku Access Fault. Ovládač výnimiek vo vnútri WHDLoad overí dôvod pre výnimku. Ak bola príčina v prístupe do chránenej stránky,ale prístup sa nezhoduje s chránenou oblasťou, potom bude tento prístup emulovaný a program bude pokračovať v normálnom chode. Inak sa WHDLoad ukončí s adekvátnym chybovým hlásením, alebo inými slovami funkcie resload_Protect#? Ovplyvnia len čítanie a zapisovanie dát. Fakt, že každý prístup do chránenej stránky (veľkosť stránky je momentálne $1000) vytvorí zlyhanie prístupu, i keď chránená oblasť má len dĺžku 1 byte, vyústi do silného spomalenia chodu programu, hlavne ak sú chránené časti kódu v rovnakej stránke pamäti. Ak je program závislý na určitej rýchlosti, odchýlky vo funkčnosti nie sú vylúčené, čo znamená, že niektoré programy nemusia s ochranou pamäte fungovať.

#### Príklad: checksum kódu

Ak inštalujete hru pomocou WHDLoad, budete musieť upraviť pôvodný loader v hre tak, aby sa dáta programu nahrávali cez WHDLoad. Niektoré hry kontrolujú súčet kľúčových oblastí svojho kódu a tým zisťujú, či kód nebol zmenený. Niekedy sa však tieto rutiny ťažko hľadajú. Použitím funkcií resload_Protect#? vo WHDLoad však problém rieši. Všetko, čo musíte urobiť, je chrániť zmenené bajty pred prečítaním. Potom každá rutina, ktorá sa pokúša vypočítať checksum a prečítať váš opravený kód, spôsobí prístupovú chybu a vy tak zistíte, kde je kontrolná rutina lokalizovaná.

#### Obmedzenie

Nesmiete chrániť stránku pamäťe, na ktorú odkazuje SSP. Ak to spravíte a objaví sa výnimka, dôjde k dvojitej chybe na zbernici, pretože CPU nebude schopné zapísať stackframe výnimky. Potom sa dá program už len resetovať. WHDLoad overuje, či existuje konflikt chránenej oblasti s SSP a ak áno, ukončí sa. To ale nepomôže, ak sa SSP zmení neskôr.

- 68020 + 68851
  - tento hardvér nie je momentálne podporovaný
- 68030
  - 3-Byte presuny nie sú podporované a spôsobia Access Fault, také presuny sa stávajú, ak sa k longword pristupuje na nepárnej adrese (napr. tst.l $fff), zatiaľ čo chránená oblasť pamäte začína na $1000). Pretože toto je nesprávne na 68000, možno na to nikdy nenarazíte.
  - uzamknuté presuny spôsobené TAS, CAS or CAS2 nie sú podporované a spôsobia reálnu Access Fault, to ale nie je problém, pretože tieto presuny nie sú podporované hardvérom Amigy.
- 68040
  - tento hardvér nie je momentálne podporovaný
- 68060
  - misaligned data stream prístupy nie sú podporované a spôsobia Access Fault, misaligned access je taký prístup ktorý sa vzťahuje na dve stránky (a jedna z nich je chránená), napr. “tst.l ($ffe)” ovplyvňuje stránku $0..$fff a stránku $1000..$1fff, toto obmedzenie je skutočný problém a občas je kvôli tomu schopnosť resload_Protect takmer nepoužiteľná, možno to neskôr opravím, ale je to ťažké
  - misaligned instructions stream prístupy nie sú podporované a vytvoria Access Fault, ak sú obe stránky chránené, vo väčšine prípadov sa takej situácii dá vyhnúť
  - uzamknuté presuny spôsobené TAS alebo CAS nie sú podporované a vytvoria skutočný Access Fault, to ale nie je problém, pretože tieto presuny nie sú podporované hardvérom Amigy.
  - inštrukcie, ktoré ležia v chránenej stránke (a preto musia byť emulované) a pristupujú k Supervisor časti status registra, budú vykonané nesprávne, tieto inštrukcie vždy vidia trace bit ako 1 a masku priority výnimky ako 7, akákoľvek modifikácia Supervisor časti bude neúčinná (Supervisor časť zostane nezmenaná).
  - `movem` inštrukcie môžu pristupovať k chránenej oblasti bez vytvorenia Access Fault. To je možné vďaka tomu, že je overovaný len prvý prístup k chránenej oblasti (word alebo longword)
  - `move16` a double precision operácie (FPU) nie sú podporované a vytvora Access Fault
  - "move (mem),(mem)" s prekračujúcimi zdrojovými a cieľovými adresami generujú Access Fault, pretože misaligment bude vykonaný nesprávne. Napríklad: "`move.l ($ffc),($ffe)`" kde je stránka $1000..$1fff chránená, a pamäť pred spustením obsahuje ($ffc)=$11112222, ($1000)=$33334444, po spustení $1000 bude obsahovať $11114444 a nie $22224444