Minnesøk

### Minnesøk (Snooping)

#### Hva er det

Minnesøk er en funksjon ved WHDLoad som utfører kontroll og loggføring av tilgang til de tilpassede (Custom) og Cia-registrene. Hvis Snoop er aktivert vil alle ugyldige tilganger generere en tilgangsfeil og det installerte programmet vil bli avsluttet. Slike tilganger er:

- tilgang til ikke-eksisterende registre
- lesetilgang til kun skrivbare (Write Only) registre
- skrivetilgang til kun lesbare (Read Only) registre
- tilgang til tidlig lesbare (Early Read) registre
- byte-skrivetilgang (untatt `bltcon0l` og `aud*vol+1`)

Puls-registre (Strobe registers) kan leses eller skrives. Mengeden gyldige tilpassede registre kan varigere mellom OCS (eldre brikkesett (Old ChipSet) - A500, A1000, eldre A2000) ECS (Forbedret brikkesett (Enhanched ChipSet) - A600, nyere A2000, A3000) og AGA (avansert grafikk (Advanced Graphics) - A1200, A4000). Dette er nyttig spesielt for å lokalisere feil i gamle programmer skapt av udefinerte tilganger til nye AGA-registre.

#### Hvordan det virker

Hvis Snoop er slått på, markerer WHDLoad adressene til de tilpassede registrene og cia-registrene som ugyldige i MMU'ens oversettertre. På grunn av dette vil hver tilgang til et tilpasset eller Cia-register resultere i et tilgangsfeil-unnttak. Unntaksbehandleren i WHDLoad behandler dette unntaket. Først kontrollerer den om tilgangen er gyldig. Hvis tilgangen er ugyldig vil progammet avsluttes. Hvis tilgangen er gyldig og det er en leseoperasjon vil denne emuleres og programkjøringen fortsettes. Hvis det er en skriveoperasjon vil WHDLoad i tillegg lagre den skrevne verdien i et internt lager.
På grunn av ekstraforbruket av unntaket og emuleringsekvensen vil programkjøringen sakke ned. Hvor mye det sakkes er avhengig av CPU-typen, Chip-minnetypen (16/32-bits) og om Stakkpeker-oppstillingen i Chip-minnet er 32-bit (LongWord-oppstilt eller ikke). Det er også forskjellig for tilgangstyper (Byte/Word/LongWord, Lese/Skrive). På en 68030 er skriveoperasjoner raskere enn leseoperasjoner (fordi ved lesing er stakkrammen 92 byte og ved skriving 32 byte), på 68060 er lesing raskere fordi emuleringen av skriving er mere avansert.

#### Rask søkemodus

Tilvalget Snoop/S slår på rask søking. Lesetilganger vil ikke bli kontrollert. Ingen spesialkontroll blir utført. Denne modusen kan være nyttig for å bare få innholdet i de tilpassede registrene, f.eks. for å lagre et bilde med bruk av SP.

#### Copperliste-skanner

Siden versjon 13 av WHDLoad blir også selve copperlistene kontrollert. Skanneren vil aktiveres ved skriving til `coplc`-registerene hvis copper dma er slått på, eller når det installerte programmet slår på cppper dma ved å skrive til `dmacon` registret. Skanneren følger copperlisten og kontrollerer alle flytt-instruksjoner ved å legge til begrensinger skapt av Snoop-valget (OCS/ECS/AGA). Hopp over- (Skip) og Vent- (Wait) instruksjoner (unntatt CEND) vil ignoreres. Når den finner ugyldige poster vil det installerte programmet avsluttes. Skanneren følger grenene (`copjmp`), oppdager løkker og kontrollerer opptil 16 underlister. Flytt-operasjonene i copperlister vil lagres i den interne tilpasset-register-filen som dumpes ved avslutning av WHDLoad. Skanneren er ikke aktiv i Rask søkemodus.

#### Kontroll av Blitterprioritet

Når tilvalget ChkBltHog/S er aktivert vil WHDLoad kontrollere at det installerte programmet ikke aktiverer `BltHog`-bit'en ved å skrive til `dmacon`-registeret. Blitter-prioriteten kan lage problemer på noen maskinvarekonfigurasjoner sammen med store blitteroperasjoner (alle kanaler i bruk)

#### Kontroll av Blitter-størrelse

Når tilvalget ChkBltSize/S er aktivert vil WHDLoad kontrollere at blitterjobber ikke prøver å få tilgang til minne utenfor BaseMem-området. Ved skrivetilgang til `bltsize` eller `bltsizh` kontrollerer den om linjemodus er aktivert i `bltcon1`. Hvis linjemodusen er aktiv vil den avbryte størrelsekontrollen. Ellers vil WHDLoad kalkulere første og siste word for tilgang på hver aktiverte DMA-kanal. Hvis en av adressene er utenfor BaseMem-området blir programmet avsluttet med en forespørsel. Kalkuleringen erdesignet for å virke med alle moduser (stigende/synkende, positiv/negativ modulo, odde modulo/pekere).
Husk at linje-tegnemodusen ikke vil verifiseres og at alle blitterregistre også kan skrives til hvis `copcon` er satt.

#### Blitter vente-kontroll

Når tilvalget ChkBltWait/S er aktivert vil WHDLoad bruke en instruksjonssporing for å bekrefte at det installerte programmet venter på at blitteren abslutter før den starter en ny blitterjobb. Den bruker en intern variabel som representerer blitterens arbeidsstatus. Variabelen settes når en skrivetilgang til `bltsize` eller `bltsizh` inntreffer og tømmes når lesetilgang til `dmaconr`-registret utføres. Ved hver skriving til et blitterregister blir verdien til den interne variabelen kontrollert, hvis den tilsier en kjørende blitterjobb, vil det installerte programmet avsluttes og WHDLoad vil rapportere PC'en til den sist startede blitterjobben sammen med den aktuelle tilgangen.
Det er to store flaskehalser ved denne funksjonen. For det første kontrolleres ikke blitterbruk via copper'en, og for det andre vil bruk av blitteravbrudd føre til at kontrollrutinen rapporterer feil uten grunn.

#### Fremtid

Det er planlagt å implementere funksjoner som frysing og Ikonifisering. Til dette er Søking en essensiell forutsetning. Derfor er anbefales det at alle installerer-forfattere kontrollerer sin installerere med Søk for å sikre fremtidig kompatibilitet.

#### Krav

En MMU er nødvendig for Søk-funksjonen. I tilleg må WHDLoad bruke MMU'en, derfor må MMU/S være aktivert på 68030-maskiner.

#### Begrensinger

- 68020 + 68851
  - denne maskinvaren støttes for tiden ikke
- 68030
  - ingen kjente begrensinger
- 68040
  - denne maskinvaren støttes for tiden ikke
- 68060
  - `movem`-instruksjoner kan prøve å få tilgang til et ugyldig register uten å generere et tilgangsfeil-unntak, dette er mulig fordi bare den første tilgangen vil bli verifisert ved å matche mot et gyldig register
  - `move <Cia-/tilpasset register>,sr` vil utføres ukorrekt hvis den ønsker å endre overvåkingsdelen av statusregisteret, overvåkingsdelen vil bli uforandret
  - ingen `(ssp)+` eller `-(ssp)` sammen med en skrivetilgang til et Cia- eller tilpasset register kan utføres pga stakkramme-problemer, WHDLoad vil oppdage slike tilganger og avslutte med en passende forespørsel.
  - instruksjoner må ikke prøve å få tilgang til mer enn ett søket register om gangen, det betyr at kode som `move.b ($dff006),($bfd800)` ikke kan utføres, hvis slik kode inntreffer vil WHDLoad vise en tilgangsfeil-forespørsel.