### Snooping

#### De què es tracta?

Snooping és una funcionalitat de WHDLoad que registra i valida els accessos als registres Custom i CIA. Si Snoop està activat, tots els accessos invàlids crearan una Falla d'Accés i el programa instal·lat acabarà. WHDLoad mostrarà un diàleg indicant el motiu de l'error.

#### Registres Custom

Es verifiquen tots els accessos de lectura/escriptura als registres Custom. Els accessos no vàlids son :

- Accessos a registres inexistents
- Accessos de lectura a registres de només escriptura
- Accessos d'escriptura a registres de només lectura
- Accessos a registres Early Read
- Accessos d'escriptura de byte (excepte `bltcon0l` i `aud*vol+1`)

Els registres Strobe es poden llegir o escriure. El conjunt de registres Custom vàlids pot variar entre OCS (Old ChipSet - A500, A1000, A2000 vells), ECS (Enhanced ChipSet - A600, A2000 nous, A3000) i AGA (Advanced Graphics - A1200, A4000). Això és útil especialment per a localitzar errors en programes vells causats per accessos no definits als nous registres AGA.

#### Registres CIA

Als registres CIA només es verifica l'accés d'escriptura. Això vol dir que els accessos de lectura a registres inexistents a l'àrea de memòria $bfd000...$bfefff no seràn detectats. Per a tots els accessos d'escriptura, el valor escrit serà guardat internament per WHDLoad. Per a alguns registres CIA s'estableixen comprovacions especials depenent del valor que s'ha escrit :

adreça | registre | comprovació
--- | --- | ---
$bfe001 | ciaa.ciapra | Es prohibeix establir el bit #0 d'Overlay.
$bfe201 | ciaa.ciaddra | Els bits #6-7 poden tenir qualsevol valor (emprats per al joypad) mentre que els bits inferiors han d'ésser %000011
$bfe801 | ciaa.ciatodlow | No es permeten accessos de lectura-escriptura-modificació (p.ex. bchg) si el bit ALARM está establert a ciaa.ciacrb (només es comprova als 68060)
$bfe901 | ciaa.ciatodmid
$bfea01 | ciaa.ciatodhi
$bfed01 | ciaa.ciaicr | No es permeten accessos de lectura-modificació-escriptura (p.ex.: bchg) (només es comprova als 68060)
$bfd100 | ciab.ciaprb | No s'han d'esborrar els bits de MOTOR #7, SELECT #3-6 i STEP #0, es poden canviar altres bits; així, es detectarà qualsevol accés a les unitats de disc (floppy drives).
$bfd200 | ciab.ciaddra | El valor escrit ha de ser %11000000
$bfd300 | ciab.ciaddrb | El valor escrit ha de ser %11000000
$bfd800 | ciab.ciatodlow | No es permeten accessos de lectura-escriptura-modificació (p.ex. bchg) si el bit ALARM está establert a ciaa.ciacrb (només es comprova als 68060)
$bfd900 | ciab.ciatodmid
$bfda00 | ciab.ciatodhi
$bfdd00 | ciab.ciaicr | No es permeten accessos de lectura-escriptura-modificació (p.ex. bchg. Només es comprova als 68060)

#### Com funciona?

Si Snoop està activat, WHDLoad marca les adreces dels registres Custom i CIA com a invàlides/protegides contra escriptura en l'arbre de traducció de la MMU. A causa d'això, cada accés a un registre Custom o CIA ocasionarà una excepció de Falla d'Accés. El gestor d'excepcions dintre de WHDLoad tractarà aquesta excepció: Primer controlarà si l'accés és vàlid; Si l'accés és invàlid el programa finalitzarà. Si l'accés és vàlid i és tracta d'una operació de lectura, serà emulat i l'execució del programa continuarà. Si és una operació d'escriptura, WHDLoad addicionalment guardarà els valors escrits en un espai d'emmagatzematge intern.
A causa de la sobrecàrrega de l'excepció i la seqüència d'emulació el programa patirà un alentiment a l'execució. La quantitat d'aquest alentiment dependrà del tipus de CPU, el tipus de Memòria Xip (16/32 bits) i l'alineament del Punter de Pila si la Memòria Xip és de 32 bits (Paraules Llargues alineades o no). També diferirà pel tipus d'accés (Byte/Paraula/ Paraula Llarga, Lectura/Escriptura). En processadors 68030 l'Escriptura serà més ràpida que la Lectura (degut al fet que durant les lectures l'entorn de pila és de 92 bytes i en escriptures és de 32 bytes), al 68060 les Lectures seran mes ràpides degut al fet que l'emulació per a les Escriptures és més complexa.

#### Mode Snoop Ràpid (Fast Snoop)

L'opció Snoop/S activa el mode de snoop ràpid. Els accessos de lectura no es comprovaran. No es realitzaran controls especials. Aquest mode només serà útil per a obtenir el contingut dels registres Custom, per ex. per a salvar una pantalla usant SP.

#### Analitzador de la CopperList

Des de la versió 13 de WHDLoad també la copperlist en sí mateixa es comprova. L'analitzador s'activa durant les escriptures als registres `coplc` si el DMA de copper està activat, o quan el programa instal·lat activa el DMA de copper escrivint el registre `dmacon`. L'analitzador seguirà la copperlist i validarà totes les instruccions Move aplicant les restriccions causades per l'opció Snoop (OCS/ECS/AGA). Les instruccions Skip i Wait (excepte CEND) s'ignoraran. Quan trobi entrades invàlides, el programa instal·lat finalitzarà. L'analitzador segueix les ramificacions (`copjmp`), detecta cicles i comprova fins a 16 subllistes. Els Move's en la copperlist es desen a l'arxiu intern de registres Custom que es bolca en sortir de WHDLoad. L'analitzador no es troba actiu al mode Snoop Ràpid.

#### Comprobació de la Prioritat del Blitter

Quan l'opció ChkBltHog/S es trobi activa, WHDLoad comprovarà que el programa instal·lat no activi el bit `BltHog` escrivint al registre `dmacon`. La Prioritat del Blitter pot causar problemes en algunes configuracions de maquinari en conjunt amb grans operacions del blitter (on s'usin tots els canals).

#### Comprovació del Tamany del Blitter

Quan s'activa l'opció ChkBltSize/S WHDLoad comprovarà que els treballs del blitter no accedeixin memòria fora de l'àrea BaseMem. En accessos d'escriptura a `bltsize` o `bltsizh` comprova si el mode lineal està activat a bltcon1. Si el mode lineal està activat, cancel·larà el control de tamany. En cas contrari WHDLoad calcularà la primera i última paraula on accedir per a cada canal actiu de DMA. Si una adreça es troba fora de l'àrea BaseMem el programa finalitzarà amb un quadre de diàleg. El càlcul està dissenyat per a treballar en tots els modes (ascendent/descendent, mòduls positius/ negatius, mòduls/punters imparells).
Recordi que el mode de dibuix de línies no serà verificat i que tots els registres del blitter poden ser escrits pel copper si `copcon` està configurat.

#### Comprovació de l'Espera del Blitter

Quan l'opció ChkBltWait/S està activa, WHDLoad empra un seguiment d'instruccions per a verificar que el programa instal·lat espera correctament que el blitter acabi abans de començar un altre treball de blitter. S'utilitza una variable interna que representa l'estat de treball del blitter. La variable és configurada quan es produeix un accés d'escriptura a `bltsize` o `bltsizh` i desactivada quan es realitza un accés de lectura al registre `dmaconr`. A cada escriptura a un registre del blitter es comprova el valor de la variable interna, si es troba un treball de blitter en execució, el programa instal·lat finalitzarà i WHDLoad informarà l'ordinador de l'últim treball de blitter arrencat conjuntament amb l'accés actual.
Hi ha dos colls d'ampolla principals en aquesta funcionalitat. Primer, l'ús de blitter a través del copper no es comprova, i segon, l'ús de les interrupcions del blitter ocasionen que la rutina de comprovació reporti errors inexistents.

#### El futur

S'ha planejat implementar funcionalitats tals com Congelat i Iconificat. Per a les mateixes, Snoop és un requeriment necessari. Per tant és recomanable que els autors dels instal·ladors comprovin els seus instal·ladors amb Snoop per a assegurar la compatibilitat futura.

#### Requeriments

Es requereix una MMU per a la funcionalitat Snoop. WHDLoad també ha d'utilitzar la MMU i en conseqüència s'ha d'activar l'opció MMU/S en màquines basades en 68030.

#### Limitacions

- 68020 + 68851
  - Aquest maquinari no és suportat actualment
- 68030
  - Sense limitacions conegudes
- 68040
  - Aquest maquinari no està suportat
- 68060
  - Les instruccions `movem` poden accedir a un registre invàlid sense ocasionar una excepció de Falla d'Accés, això és possible degut al fet que només es verifica que el primer accés concordi amb un registre vàlid.
  - `move <registre Cia/Custom>,sr` serà executat incorrectament si intenta canviar la part supervisor del registre d'estat, la part de supervisor romandrà sense canvis
  - Qualsevol instrucció `(ssp)+` o `-(ssp)` en conjunt amb un accés d'escriptura a un registre CIA o Custom no pot ser gestionat degut a problemes de marc de pila, en aquest cas, WHDLoad detectarà tals accessos i acabarà amb el quadre de diàleg apropiat
  - Les instruccions no han d'accedir més d'un registre controlat per Snoop al mateix temps; això significa que codi com `move.b ($dff006),($bfd800)` no pot ésser gestionat. Si té lloc una situació com aquesta, WHDLoad mostrarà un diàleg de Falla d'Accés