### Snooping

#### Co to je

Snooping je schopnost WHDLoad, která ověřuje a loguje CPU přístupy k custom a CIA registrům. Pokud je Snoop aktivován, všechny nesprávné přístupy k custom registrům vytvoří chybu a nainstalovaný program bude ukončen. WHDLoad zobrazí chybový registr vysvětlující důvod chyby.

#### Custom registry

Všechny přístupy čtení/zápisu do custom registrů jsou kontrolovány. Nesprávné přístupy jsou:

- přístupy k neexistujícím registrům
- read přístupy k Write Only registrům
- write přístupy k Read Only registrům
- přístupy k Early Read registrům
- byte write přístupy (krome `bltcon0l` a `aud*vol+1`)

Strobe registry mohou být čteny nebo zapisovány.Custom registry se odlišují - OCS (Old ChipSet - A500, A1000, old A2000), ECS (Enhanced ChipSet - A600, nova A2000, A3000) a AGA (Advanced Graphics - A1200, A4000). Takže se tato funkce hodí obzvláště pro hledání chyb ve starých programech, způsobených špatným přístupem k AGA registrům.

#### Cia registry

U Cia registrů jsou kontrolovány jen zápisy. To znamená, že čtení neexistujících registrů v oblasti paměti od $bfd000 do $bfefff nebude detekováno. Pro všechny zápisy bude zapisovaná hodnota interně uložena WHDLoadem. Pro některé Cia registry jsou speciální kontroly, které ověřují zapisovanou hodnotu:

adresa | registr | test
--- | --- | ---
$bfe001 | ciaa.ciapra | nastavení Overlay bitu #0 je zakázáno
$bfe201 | ciaa.ciaddra | bity #6-7 můžou mít jakoukoliv hodnotu (využívá se pro joypad), nižší bity musí být %000011
$bfe801 | ciaa.ciatodlow | read-modify-write zápisy (například přes bchg) nejsou dovoleny pokud je nastaven ALARM bit v ciaa.ciacrb (ověřuje se jen na 68060)
$bfe901 | ciaa.ciatodmid
$bfea01 | ciaa.ciatodhi
$bfed01 | ciaa.ciaicr | read-modify-write přístupy (například bchg) nejsou dovoleny (ověřováno na 68060)
$bfd100 | ciab.ciaprb | bity pro MOTOR #7, SELECT #3-6 a STEP #0 nesmí být vynulovány, ostatní bity mohou být změněny, takhle se detekuje přístup na disk
$bfd200 | ciab.ciaddra | zapsaná hodnota musí být %11000000
$bfd300 | ciab.ciaddrb | zapsaná hodnota musí být %11111111
$bfd800 | ciab.ciatodlow | read-modify-write přístupy (například bchg) nejsou dovoleny, pokud je nastaven ALARM bit v ciab.ciacrb (ověřováno jen na 68060)
$bfd900 | ciab.ciatodmid
$bfda00 | ciab.ciatodhi
$bfdd00 | ciab.ciaicr | read-modify-write přístupy (například bchg) nejsou dovoleny (ověřováno jen na 68060)

#### Jak to funguje

Pokud je snooping zapnutý, WHDLoad označí adresy custom registrů v MMU translation tree jako nesprávné/chráněné proti zápisu. Díky tomu se každý přístup do custom registrů stane Access Fault vyjímkou. WHDload tuto vyjímku ovládá, takže může zjistit, jestli je přístup správný nebo ne (při nekorektním přístupu je program ukončen, jinak program pokračuje).
Kvůli přetížení vyjímek a emulační sekvenci se běh programu značně zpomalí. Jak moc, záleží na CPU, typu Chip RAM a stackpointer aligmentu. Vše se take liší podle druhu přístupu (Byte/Word/LongWord, Read/Write). Na 68030 jsou zápisy rychlejší než čtení (protože při čtení je stackframe 92 bajtu, při psaní 32), na 68060 je to naopak, protože emulace zápisu je složitější.

#### Fast Snoop Mode

Volba Snoop/S zapíná rychlý snooping. Read přístupy nebudou testovány. Žádné speciální zkoušky nejsou provedeny. Tento mód je užitečný jen pro získání obsahu custom registru, např. pro uložení obrázku pomocí SP.

#### Copper List Scanner

Od verze 13 budou zkoušeny také copperlisty. Scanner bude aktivován při zápisu do registru coplc. Scanner procházi copperlist a ověřuje všechny move instrukce aplikováním omezení způsobených Snoop volbou. Skip a Wait instrukce budou ignorovány, Pokud scanner objeví ilegální přístup, program bude ukončen s chybovou hláškou. Scanner následuje branche (`copjmp`), detekuje smyčky a zkouší až 16 sublistů. Pohyby v copperlistech budou uloženy do interního logu pro custom registry a ten bude vypsán do souboru při exitu. Scanner není aktivní při Fast Snoop módu.

#### Zkouška Blitter Priority

Když je volba ChkBltHog/S aktivována, WHDLoad otestuje, zda instalovaný program nezapíná BltHog bit zapsáním do dmacon registru. Priorita blitteru může způsobit problémy na některých konfiguracích v souvislosti s rozsáhlými operacemi přes blitter (použití všech kanálů).

#### Test velikosti blitter bloku

Když je volba ChkBltSize/S aktivována, WHDlaod otestuje, zda práce blitteru nepřistupuje mimo vyhrazenou paměť. Při zápisu do `bltsize` nebo `bltsizh` zkouší, jestli je zapnut řádkový mód - pokud ano, nebude WHDLoad zkoušet velikost bloku. Jinak vypočítá WHDLoad první a poslední word pro každý aktivovaný DMA kanál. Pokud je adresa mimo BaseMem území, program bude ukončen s requesterem. Kalkulace je navržena k práci se všemi módy.

#### Blitter Wait test

Pokud je volba ChkBltWait/S zapnuta, WHDLoad bude sledovat instrukce, aby ověřil, že nainstalovaný program korektně čeká na konec blitter operace než začne novou. Používá interní hodnotu, která reprezentuje status další blitter operace. Hodnota je nastavena při zápisu do `bltsize` nebo `bltsizh` a vymazána, když je čten `dmaconr` registr. Při každém kontrolovaném zápisu je hodnota testována a pokud je zjištěno, že předchozí blitter operace stále běží, program bude ukončen s chybovým registrem s adresou neukončeného blitter procesu.
Jsou tu ale dva nedostatky: použití blitteru přes copperlist není testováno a použití blitter přerušení způsobí, že testovací rutina hlásí zbytečné chyby.

#### Budoucnost

Plánuje se implementovat schopnosti jako Freezing nebo ikonifikace. Pro tohle je Snooping ideální. Autorům instalaček se doporučuje zkoušet jejich produkty se Snoop pro budoucí kompatibilitu.

#### Požadavky

Pro Snoop mód je vyžadováno vlastnit MMU, se kterým umí WHDLoad pracovat (na 68030 je ho třeba zapnout)

#### Omezeni

- 68020 + 68851
  - tento hardware není podporován
- 68030
  - žádná omezení
- 68040
  - tento hardware není podporován
- 68060
  - `movem` instrukce mohou zasahovat nesprávný registr bez chybového hlášení (protože je testován jen první přístup)
  - `move <Cia/Custom registr>,sr` bude vykonán nesprávně, pokud se snaží změnit supervisor portion stavového registru, nezmění se.
  - any `(ssp)+` or `-(ssp)` ve spojení s write přístupem k Cia nebo Custom registru nemůže být převzato kvůli problémům se stackframes, WHDLoad takove přístupy detekuje a vyskočí s příslušným requesterem.
  - instrukce nesmi přistupovat víc než do jednoho střeženého registru najednou, to znamená, že kód jako `move.b ($dff006),($bfd800)` nemůže být zvládnutý a způsobí chybu Access Fault.