### Snooping (Pátranie)

#### Čo to vlastne je

Snooping (pátranie) je vlastnosť programu WHDLoad, ktorá je schopná kontrolovať a zaznamenávať prístupy ku custom a cia registrom. Ak je Snoop aktivovaný, všetky nesprávne prístupy vytvoria Access Fault a nainštalovaný program bude ukončený. Nesprávne prístupy sú:

- prístupy k neexistujúcim registrom
- read prístupy k Write Only registrom
- write prístupy k Read Only registrom
- prístup do registrov typu Early Read
- byte write prístupy (okrem `bltcon0l` a `aud*vol+1`)

Strobe registre môžu byť čítané alebo zapisované. Custom registre sa odlišujú - OCS (Old ChipSet - A500, A1000, stará A2000), ECS (Enhanced ChipSet - A600, nová A2000, A3000) a AGA (Advanced Graphics - A1200, A4000). Takže sa táto funkcia hodí hlavne pre hľadanie chýb v starých programoch, ktoré sú spôsobené zlým prístupom k AGA registrom.

#### Ako to pracuje

Ak je snooping zapnutý, WHDLoad označí adresy custom a cia registrov v MMU translation tree ako neplatné. Vďaka tomu každý prístup do custom a cia registrov vyústi do Access Fault výnimky. WHDload túto výnimku zachytí a môže tak zistiť, či je prístup správny alebo nie (pri nesprávnom prístupe je program ukončený). Zachytený správny prístup typu read bude emulovaný a program bude pokračovať, v prípade platného prístupu typu write, WHDLoad si naviac zapíše hodnotu do vnútorného zásobníku.
Kvôli preťaženiu výnimiek a emulačnej sekvencie sa chod programu značne spomalí. Miera spomalenia záleží na CPU, na type Chip RAM (16/32-bit) a na Stackpointer aligment, ak je Chip RAM 32-bit (buď LongWord aligned alebo nie). Líši sa to i podľa druhu prístupu (Byte/Word/LongWord, Read/Write). Na 68030 sú zápisy rýchlejšie než čítanie (pretože pri čítaní je stackframe 92 bajtov, pri zapisovaní 32), na 68060 je to naopak, pretože emulácia zápisu je zložitejšia. Zapisovanie je viac zložitejšie.

#### Rýchly (Fast) Snoop mód

Voľba Snoop/S zapína rýchle pátranie. Read prístupy nebudú testované. Žiadne špeciálne testovanie tiež neprebieha. Tento mód je užitočný len na získanie obsahu custom registru, napr. kvôli uloženiu obrázku pomocou SP.

#### Copper List Scanner

Od verzie 13 sú testované tiež copperlisty. Skener bude aktivovaný pri zápise do registru coplc, ak je DMA copper povolené, alebo ak nainštalovaný program zapne copper DMA zapísaním `dmacon` registru. Scanner nasleduje copperlist a validizuje všetky move inštrukcie aplikovaním obmedzenia spôsobeného Snoop voľbou (OCS/ECS/AGA). Inštrukcie Skip a Wait (okrem CEND) budú ignorované. Pokiaľ budú nájdené nesprávne vstupy, nainštalovaný program bude ukončený. Scanner prehľadáva vetvy (`copjmp`), zisťuje slučky a kontroluje až do 16ho podlistu. Inštrukcie Move v copperliste budú uložené do vnútorného custom registra, ktorý bude dumpovaný pri ukončení WHDLoad. Scanner je aktívny aj pri Rýchlom Snoop móde.

#### Test priority Blitter-u

Keď je voľba ChkBltHog/S aktivovaná, WHDLoad testuje, či nainštalovaný program nezapína BltHog bit zapísaním do dmacon registru. Priorita blitteru môže spôsobiť problémy na niektorých konfiguráciách v súvislosti s rozsiahlymi operáciami cez blitter (použitie všetkých kanálov).

#### Test veľkosti blitter bloku

Keď je voľba ChkBltSize/S aktivovaná, WHDLoad otestuje, či práca blitteru nepristupuje mimo vyhradenú BaseMem pamäť. Pri zápise do `bltsize`, alebo do `bltsizh` skontroluje, či je zapnutý Line mód v `bltcon1`, ak áno, WHDLoad nebude testovať veľkosť bloku. Inak WHDLoad vypočíta prvý a posledný word pre prístup k jednotlivým aktivovaným DMA kanálom. Ak je jedna adresa mimo oblasti BaseMem, program bude ukončený s hlásením. Kalkulácia je navrhnutá, aby pracovala práci so všetkými módmi (vzostupný/zostupný, pozitívny/negatívny modulos, nepárne modulos/pointers).
Pamätajte, že line drawing mód nebude kontrolovaný a tak všetky blitter registre môžu byť taktiež zapísané pomocou copper (ak je nastavený `copcon`).

#### Kontrola Blitter Wait

Ak je voľba ChkBltWait/S zapnutá, WHDLoad bude testovať inštrukcie, aby overil, že nainštalovaný program správne čaká na koniec blitter operácie, než začne novú. Používa sa interná hodnota, ktorá reprezentuje status blitter operácie. Hodnota sa nastaví, ak sa objaví write prístup do `bltsize`, alebo do `bltsizh`. Hodnota sa vymaže pri read prístupe do `dmaconr`. registru. Pri každom zápise do blitter registru sa skontroluje interná premenná a ak sa zistí, že blitter pracuje, program bude ukončený a WHDLoad zahlási PC posledného neukončeného blitter procesu spolu s jeho adresou.
Sú tu ale dva nedostatky: použitie blitteru cez copperlist nie je kontrolované a použitie blitter prerušení spôsobí, že kontrolná rutina hlási zbytočné chyby.

#### Plány do budúcnosti

Plánujem implementovať vlastnosti ako Freezing, and Iconify. Pre tieto dve je Snoop ideálny. Preto doporučujem autorom inštalačiek, aby si skontrolovali ich inštalácie pre kompatibilitu so Snoopom - čím zaistia aj kompatibilitu s budúcimi verziami WHDLoad.

#### Požiadavky

Pre Snoop je potrebné MMU. WHDLoad musí používať MMU, prípadne MMU/S musí byť zapnuté na 68030.

#### Obmedzenia

- 68020 + 68851
  - momentálne nepodporovaný hardvér
- 68030
  - žiadne známe obmedzenia
- 68040
  - momentálne nepodporovaný hardvér
- 68060
  - Inštrukcia `movem` môže pristupovať do nesprávneho registra bez vytvorenia výnimky Access Fault, toto sa môže stať, pretože je kontrolovaný len prvý prístup do registru.
  - Inštrukcia `move <Cia/Custom register>,sr` bude vykonaná nesprávne, pokiaľ sa bude snažiť zmeniť časť Supervisor status registru. Táto zmena však nebude vykonaná
  - Inštrukcia `(ssp)+` alebo `-(ssp)` v súčinnosti so zápisom do Cia alebo Custom registru nemôže byť spracovaná kvôli problémom so stackframe. WHDLoad tento prístup zachytí a ukončí program s príslušným hlásením.
  - Inštrukcia nesmie prsistupovať k viac ako jednému Snoopovanému registru naraz. To znamená, že napr.: `move.b ($dff006),($bfd800)` nemôže byť spracovaná. Ak sa to však udeje, WHDLoad oznámi chybu Access Fault