### Snooping

#### Qu'est ce c'est ?

Snooping est une caractéristique de WHDLoad qui enregistre tous les accès CPU aux registres spécialisés (Custom). Si Snoop est activé, tous les accès invalides aux registres Custom créeront un Access Fault et le programme installé sera terminé. WHDLoad affichera une fenêtre de requête expliquant les raisons de la faute.

#### Les regsitres Custom

Tous les accès en lecture et écriture aux registres Custom sont vérifiés. Les accès invalides sont:

- accès aux registres non-existants
- accès en lecture aux registres Write Only
- accès en écriture aux registres Read Only
- accès aux registres Early Read
- accès par un octet en écriture (à l'exception de `bltcon0` et `aud*vol+1`)

Les registres Strobe peuvent être lus et écrits. La validité des registres Custom varient en fonction des Amigas OCS (Old ChipSet - A500, A1000, ancien A2000), ECS (Enhanced ChipSet - A600, récent A2000, A3000) et AGA (Advanced Graphics - A1200, A4000). Ceci est utile pour localiser les bugs dans les anciens programmes qui causent des accès indéfinis aux nouveaux registres AGA.

#### Les registres CIA

Les accès des registres CIA sont seulement vérifiés en écriture. Ceci implique que les accès en lecture à des registres inexistants compris dans la zone de mémoire entre $bfd000...$bfefff ne seront pas détectés. Pour tous les accès en écriture, les valeurs seront enregistrées en interne par WHDLoad. Pour quelques registres CIA, il y a des vérifications spéciales dépendant de la valeur écrite:

adresse | registre | vérification
--- | --- | ---
$bfe001 | ciaa.ciapra | mettre à 1 le bit #0 Overlay est interdit
$bfe201 | ciaa.ciaddra | les bits #6-7 peuvent avoir une valeur quelconque (utilisés pour le joypad), les bits inférieurs doivent contenir %000011
$bfe801 | ciaa.ciatodlow | les accès en read-modify-write (ex. bchg) ne sont pas permis si le bit ALARM est mis à 1 dans ciaa.ciacrb (seulement vérifié sur 68060)
$bfe901 | ciaa.ciatodmid
$bfea01 | ciaa.ciatodhi
$bfed01 | ciaa.ciaicr | les accès en read-modify-write (ex. bchg) ne sont pas permis (seulement vérifié sur 68060)
$bfd100 | ciab.ciaprb | les bits pour MOTOR #7, SELECT #3-6 and STEP #0 doivent pas être mis à 0, les autres bits peuvent être changés; comme ceci tout accès au lecteur de disquette sera détecté
$bfd200 | ciab.ciaddra | la valeur écrite doit être %11000000
$bfd300 | ciab.ciaddrb | la valeur écrite doit être %11111111
$bfd800 | ciab.ciatodlow | les accès read-modify-write (ex. bchg) ne sont pas permis si le bit ALARM est mis à 1 dans in ciab.ciacrb (seulement vérifié sur 68060)
$bfd900 | ciab.ciatodmid
$bfda00 | ciab.ciatodhi
$bfdd00 | ciab.ciaicr | les accès read-modify-write (ex. bchg) ne sont pas permis (seulement vérifié sur 68060)

#### Comment ça marche

Si Snoop est activé, WHDLoad marque les adresses des registres Custom comme invalide/protégé en écriture dans l'arbre de traduction MMU. Donc chaque accès à un registre Custom aura comme résultat un Access Fault exception. Cette exception sera prise en main par WHDLoad. D'abord, il vérifie que l'accès est valide. Si l'accès est invalide le programme sera terminé. Si l'accès est valide et que c'est un accès en lecture, il sera émulé et l'exécution du programme continuera. Si c'est un accès en écriture, WHDLoad sauvegarde la valeur qui devait être écrite avant l'émulation.
Le programme exécuté sera ralenti car les exceptions et l'émulation prennent le dessus. Le ralentissement dépend du type de CPU, du type de mémoire chip (16/32 Bit), de l'alignement du pointeur de la pile, si la mémoire chip est 32 Bit (LongWord aligné ou non). Cela diffère aussi suivant le type d'accès (Byte/Word/LongWord, Read/Write). Sur le 68030, l'Ecriture est plus rapide que la Lecture (car pour la lecture, le stackframe est de 92 octets, pour l'écriture, 32 octets), pour le 68060, la Lecture est plus rapide parce que l'émulation pour l'écriture est plus complexe.

#### Le mode Fast Snoop

L'option Snoop/S active le Snooping rapide. Les accès à la lecture ne seront pas vérifiés. Aucune vérification spéciale ne sera effectuée. Ce mode est utile seulement pour recueillir les informations contenues dans les registres custom, ex. pour capturer l'image de l'écran en utilisant SP.

#### Le scanner de la Copper-Liste

Depuis la version 13 de WHDLoad, les copper-listes sont aussi vérifiées. Le scanner sera activé en accès écriture aux registres `coplc`, si le copper dma est activé, ou quand le programme installé active le copper dma en inscrivant dans le registre `dmacon`. Le scanner suit la copper-liste et valide toutes les instructions Move en appliquant les restrictions causées par l'option Snoop (OCS/ECS/AGA). Les instructions Skip et Wait (sauf CEND) seront ignorées. Quand il trouve des entrées invalides, le programme installé sera terminé. Le scanner suit les branches (`copjmp`), détecte les boucles et vérifie jusqu'à 16 sous-listes. Les moves dans les copper-listes seront sauvegardés dans le fichier interne des registres Custom créé par WHDLoad quand il sera quitté. Le scanner est inactif dans le mode Fast Snoop.

#### Vérification de la priorité du Blitter

Quand l'option ChkBltHogs/S est activé, WHDLoad vérifiera que le programme installé n'active pas le bit BltHog en inscrivant dans le registre `dmacon`. La priorité du Blitter peut causer des problèmes sur certain matériel en conjonction avec de larges opérations Blitter (tous canaux utilisés).

#### Vérification de la taille du Blitter

Quand l'option ChkBltSize/S est activé, WHDLoad vérifiera que le travail du Blitter n'accède pas à la mémoire en dehors de la BaseMem. Pour les accès en écriture à `bltsize` or `bltsizh`, il vérifiera si le mode ligne est activé dans `bltcon1`. Si le mode ligne est activé, il annulera la vérification de la taille. Autrement WHDload calculera le premier et le dernier mot d'accès pour chaque canal DMA activé. Si une adresse est en dehors de la BaseMem, le programme sera terminé par un message. Le calcul a été conçu pour fonctionner avec tous les modes (montant/descendant, modulos positive/négative, modulos/pointeur impairs).
Souvenez-vous que le mode "line drawing" ne sera pas vérifié et que tous les registres du blitter peuvent aussi être inscrits par le copper, si `copcon` est activé.

#### Vérification du Blitter Wait

Quand l'option ChkBltWait/S est activé, WHDLoad utilisera une instruction trace pour vérifier que le programme installé attend correctement que le blitter ait fini son travail avant d'en commencer un autre. Une variable interne sera utilisée, elle représente l'état de marche du Blitter. La variable est activée s'il se produit un accès en écriture dans `bltsize` ou `bltsizh` et effacée quand il y a un accès en lecture dans `dmaconr`. A chaque écriture dans le registre du Blitter, la valeur de la variable interne est vérifiée, si l'état est un travail du Blitter, le programme installé sera terminé et WHDLoad rapportera la ligne de code du dernier travail du Blitter et l'accès actuel.
Il y a 2 goulets majeurs. Le premier est l'utilisation du Blitter via le copper ne sera pas vérifiée et le second est l'emploi des interruptions du Blitter qui provoquera des erreurs superflues dans la routine de vérification.

#### Futur

L'implémentation des caractéristiques comme le Freezing et l'Iconifing est en projet. Pour cela, Snoop est primordial. Par conséquent, il est recommandé aux auteurs d'installs de vérifier leurs installs avec l'option Snoop pour garantir une compatibilité future.

#### Ce que vous avez besoin

Un MMU est nécessaire pour utiliser les options Snoop. Ainsi WHDLoad doit utiliser le MMU, par conséquent l'option MMU/S doit être activée sur les machines à base 68030.

#### Limitations

- 68020 + 68851
  - Ce hardware n'est pas supporté actuellement
- 68030
  - Aucune limitation connue
- 68040
  - Ce hardware n'est pas supporté actuellement
- 68060
  - L'instruction `movem` peut accéder à un registre invalide sans créer un Access Fault exception, ceci est possible car seulement le 1er accès sera vérifié.
  - `Move <Cia/Custom register>,sr` ne sera pas exécuté correctement, s'il veut changer l'octet superviseur du registre d'état, l'octet restera inchangé.
  - N'importe quel`(ssp)+` ou `-(ssp)` en conjonction avec un accès en écriture à un registre Cia ou Custom ne peut pas être pris en main à cause des problèmes de stackframe. WHDLoad détectera ce genre d'accès et quittera avec un message approprié.
  - Les instructions ne doivent pas accéder à plus d'un registre snoopé à la fois, comme cette instruction `move.b ($dff006),($bfd800)` ne peut pas être prise en main. Si ce genre de code apparaît, WHDLoad affichera une requête d'Access Fault.