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: 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