### Používání resload_Protect#?

#### Teorie

Vyskytnou se různé situace, ve kterých se může hodit být informován o přístupech nainstalovaného programu do určitých oblastí paměti. S pomocí funkcí resload_Protect#? je možné chránit určité oblasti paměti před čtením anebo zapisovaním procesorem. Chránit znamená, že každý přístup do tatko chráněné oblasti vyvolá Access Fault vyjímku, která vyústí v chybový requester WHDLoadu. Jestliže označíte oblast paměti jako chráněnou použitím resload_Protect#? funkce, WHDLoad změní popisy oné oblasti v překladači MMU. Nyní při každém přístupu do dané paměti CPU vytvoří vyjímku Access fault. Handler vyjímek uvnitř WHDLoadu ověří důvod pro vyjímku a WHDLoad vyskočí s chybovým hlášením. Tato schopnost se ale projevuje silným zpomalením běhu programu, obzvláště pokud jsou chráněné části kódu ve stejné stránce paměti. Pokud program závisí na rychlosti běhu, rozdíly ve funkčnosti jsou možné - některé programy nemusí s ochranou paměti fungovat.

#### Příklad: checksums kódu

Pokud instalujete hru pomocí WHDLoad, budete muset patchnout původní loader ve hře tak, aby program nahrával přes WHDLoad. Některé hry provádějí kontrolní součet klíčových oblastí programu, aby detekovaly změny původního kódu. Tyto rutiny může být někdy těžké najít. Ale použití resload_Protect#? funkcí ve WHDLoad problém řeší. Všechno, co musíte udělat, je chránit bajty, které jste změnili v kódu hry před přečtením. Pak každá rutina, která se pokouší přečíst váš opravený kód způsobí chybu a vy zjistíte, kde kontrola je.

#### Omezení

Nesmíte chránit paměť, kde je SSP. Pokud to uděláte a stane se vyjímka, dojde k dvojité chybě na sběrnici, protože CPU nebude schopné zapsat stackframe vyjímky. Poté už se dá program jen resetnout. WHDLoad ověřuje, jestli existuje konflikt chráněné oblasti se SSP a pokud ano - ukončí se, ale to nepomůže, pokud se SSP později změní.

- 68020 + 68851
  - tento hardware není momentálně podpořen
- 68030
  - 3-Byte přesuny nejsou podporovány a způsobí Access Fault, takové přesuny se stávají, pokud je přistupováno k longwordu na liché adrese (napr. tst.l $fff), zatímco chráněná oblast paměti začíná na $1000). Protože tohle je nesprávně i na A500, možná na to nikdy nenarazíte.
  - uzamčené přesuny způsobené TAS, CAS or CAS2 nejsou podpořeny a zahlásí chybu, to ale není problém, protože tyto přesuny nejsou podpořeny hardwarem Amigy.
- 68040
  - tento hardware není momentálně podpořen
- 68060
  - misalignované data stream přístupy nejsou podpořeny a způsobí chybu (např. tst.l $fff, zatímco chráněná oblast paměti začíná na $1000), toto omezení je problém a občas je kvůli tomu schopnost resload_Protect téměř neopužitelná, možná to později opravím, ale je to těžké
  - misalignované instructions stream přístupy nejsou podpořeny a vytvoří chybu, pokud jsou obě zasažené stránky chráněné
  - uzamčené přesuny způsobené TAS, CAS or CAS2 nejsou podpořeny a zahlásí chybu, to ale není problém, protože tyto přesuny nejsou podpořeny hardwarem Amigy.
  - instrukce, které leží na chráněné stránce paměti a přistupují k supervizor části status registeru budou vykonány nepřesně, tyto instrukce vždy vidí trace bit jako 1 a masku priority vyjímky jako 7, jakákoliv modifikace supervizor části bude neúčinná
  - movem instrukce mohou přistupovat k chráněné oblasti bez ohlášení chyby, protože je ověřen jen první přístup k chráněné oblasti
  - move16 a double precision operace (FPU) nejsou podpořené a ohlásí chybu
  - "move (mem),(mem)" překračující hranice stránek paměti budou vykonány nesprávně