Snooping

### Snooping (спостереження)

#### Що це таке

Snooping це особливість програми WHDLoad, що дозволяє спостерігати й вести журнал подій, доступів до регістрів Cia й Custom. Якщо активовано параметр Snoop, то всі некоректні звернення створять Помилку Доступу, а встановлена програма буде завершена. WHDLoad надаст інформацію про причину помилки.

#### Кастомні регістри

Всі звернення про читання або запис до кастомних регістрів перевіряються. Помилкові звернення:

- доступи до заборонених регістрів
- читання регістрів, призначених тільки для запису (Write Only)
- запис у регістри, призначених тільки для читання (Read Only)
- доступ до регістрів Early Read
- спроба запису байта в регістри (за винятком `bltcon0l` і `aud*vol+1`)

Регістри строба (Strobe) можуть бути прочитані або записані. Набір Custom-регістрів може змінюватися між OCS (Old ChipSet - A500, A1000, стара A2000), ECS (Enhanced ChipSet - A600, нова A2000, A3000) і AGA (Advanced Graphics - A1200, A4000). Це корисно для пошуку в старих програмах помилок через звертання до нових регістрів AGA.

#### Cia регістри

На Cia регістрах перевіряються лише записи даних. Це означає, що звернення до неіснуючої регістрів у пам'яті $bfd000...$bfefff не буде виявлено. Для всіх запитів на запис, данні будуть збережені у WHDLoad. Для деяких регістрів Cia є спеціальні перевірки в залежності від значення:

адрес | регістр | перевірка
--- | --- | ---
$bfe001 | ciaa.ciapra | налаштування Overlay біт #0 заборонено
$bfe201 | ciaa.ciaddra | біти #6-7 може мати будь-яке значення (використовується для джойстика), нижні біти повинні бути %000011
$bfe801 | ciaa.ciatodlow | доступ на читання-модифікація-запис (наприклад, bchg) не допускаються якщо біт ALARM встановлено у ciaa.ciacrb (перевіряється тільки на 68060)
$bfe901 | ciaa.ciatodmid
$bfea01 | ciaa.ciatodhi
$bfed01 | ciaa.ciaicr | доступ на читання-модифікація-запис (наприклад, bchg) не допускаються (перевіряється тільки на 68060)
$bfd100 | ciab.ciaprb | біти для MOTOR #7, SELECT #3-6 і STEP #0 не повинні бути очищанні, інші біти можуть бути змінені; але будь-який доступ до флоппі дисків буде виявлен
$bfd200 | ciab.ciaddra | записанне значення повинно буди %11000000
$bfd300 | ciab.ciaddrb | записанне значення повинно буди %11111111
$bfd800 | ciab.ciatodlow | доступ на читання-модифікація-запис (наприклад, bchg) не допускаються якщо біт ALARM встановлено у ciaa.ciacrb (перевіряється тільки на 68060)
$bfd900 | ciab.ciatodmid
$bfda00 | ciab.ciatodhi
$bfdd00 | ciab.ciaicr | доступ на читання-модифікація-запис (наприклад, bchg) не допускаються (перевіряється тільки на 68060)

#### Як це працює

Якщо Snoop включений, WHDLoad помічає у списку перекладу диспетчера пам'яті (MMU) адреси Custom й Cia регістрів, як невірні/захищені від запису. Через це, кожний доступ до Custom або Cia регістрів закінчиться виключенням "Помилка Доступу". Це виключення буде взято під управління WHDLoad. Спочатку, він перевіряє, чи дійсний доступ. Якщо доступ недійсний, програма буде завершена. Якщо доступ дійсний й якщо це операція читання, він буде емулюватися й виконання програми продовжиться. Якщо це операція запису то WHDload додатково, збереже значення у внутрішньому буфері.
Відбудеться вповільнення виконуваної програми, тому що будуть ще оброблятися виключення й буде проводитися емуляція. Наскільки уповільниться роботи програми, залежить від типу центрального процесора, типу Chip-пам'яті (16/32-bit) і вирівнювання покажчика стека, якщо Chip-пам'ять 32-х бітна (є вирівнювання по довгих словах або немає). Це також відрізняється для типу доступу (байт / слово / довге слово, читання/запис). 68030 пише, швидше ніж, читає (тому що читання, фрейму стека включає 92 байта, запис - 32 байта), на процесорах 68060 читання, швидше, тому що емуляція для запису, більше складна.

#### Режим швидкого спостереження (Fast Snoop)

Параметр Snoop/S активізує режим швидкого спостереження. Доступи з читання перевірятися не будуть. Не буде проводитися ніяких спеціальних перевірок. Цей спосіб може бути корисний тільки для одержання змісту Custom-регістрів, наприклад, щоб зробити знімок екрана, використовуючи SP.

#### Сканер Copper List'а

Починаючи з версії 13, WHDLoad також може сканувати коперлісти (copperlists). Сканер буде активований на запис у регістри `coplc`, якщо активізовано copper dma, або коли встановлена програма активізує coppper dma, записуючи в регістр`dmacon`. Сканер стежить за коперлістом і підтверджує всі інструкції Move, застосовуючи обмеження, накладені опцією Snoop (OCS / ECS / AGA). Інструкції Skip й Wait (за виключенням CEND) будуть ігноруватися. Коли він знаходить недійсні входження, установлена програма завершується. Сканер також стежить за відгалуженнями (`copjmp`), виявляє цикли й перевіряє до 16 підперечнів. Інструкції Move у коперлістах будуть збережені у внутрішньому файлі регістрів, який буде створено WHDLoad при виході. Сканер не активний у режимі швидкого спостереження (Fast Snoop).

#### Перевірка пріоритету блітера

Коли активізована опція ChkBltHog/S, WHDLOAD перевірить, що встановлена програма не активізує біт BltHog, записуючи в `dmacon` регістр. Пріоритет блітера може створити проблеми на деяких апаратних конфігураціях при використанні всіх його можливостей (при використанні всіх каналів).

#### Перевірка розміру блітера

Коли параметр ChkBltSize/S активізований, WHDLOAD перевірить, щоб блітер не працював з пам'яттю за межами області BaseMem. При доступі на запис в `bltsize` або `bltsizh`, він перевіряє, чи встановлений лінійний режим в `bltcon1`. Якщо лінійний режим активний, перевірка розміру буде скасована. Інакше WHDLoad визначить перше й останнє слово доступу до кожного активованого каналу прямого доступу до пам'яті. Якщо одна адреса перебуває за межами області пам'яті BaseMem, те програма буде завершена з висновком вікна повідомлення. Обчислення призначено для роботи з усіма режимами (ascending/descending, positive/negativ modulos, odd modulos/pointers).
Пом`ятайте, що режим "line drawing" не перевіряється й що всі регістри блітера можуть бути перезаписані копером, у випадку якщо встановлено `copcon`.

#### Перевірка очікування блітера (Blitter Wait Check)

Коли параметр ChkBltWait/S активізований, WHDLOAD буде використовувати трасування інструкцій на предмет того, що встановлена програма дійсно правильно чекає закінчення роботи блітера, перед його наступним запуском. Whdload використає внутрішню змінну, котра відображає робочий стан блітерa. Змінна встановлюється, коли виконується запис в `bltsize` або `bltsizh`, і скидається, коли виконується читання з регістра `dmaconr`. При кожному записі в регістр блітера, перевіряється значення змінної, і якщо значення показує, що блітер запущено, то установлена програма буде завершена, а WHDLoad повідомить PC останньої запущеної задачі блітера разом з реальним доступом
У даного параметра є два головних недоліки:
1) використання блітера через копер НЕ перевіряється;
2) використання преривань блітера змусить процедуру перевірки виводити безглузді повідомлення про помилки

#### Плани на майбутнє

Планується реалізувати таку можливість, як припинення програми й згортання її в іконку. Для цього відмінно підходить Snoop. Тому, для забезпечення сумісності надалі, рекомендую авторам інсталяційних модулів перевіряти коректність роботи ваших патчей з параметром Snoop.

#### Системні вимоги

Для роботи параметра Snoop необхідний диспетчер пам'яті (MMU). WHDLoad також повинен використовувати MMU, тому на машинах із процесорами 68030 необхідно активізувати опцію MMU/S.

#### Обмеження

- 68020 + 68851
  - Ця конфігурація в цей момент не підтримується
- 68030
  - Невідомо ніяких обмежень
- 68040
  - Ця конфігурація в цей момент не підтримується
- 68060
  - Інструкція`movem` може звернутися до недійсного регістра, не створивши при цьому повідомлення про помилку доступу. Це можливо тому, що тільки перше звернення буде оброблене на відповідність до данного регістра.
  - Інструкція`move <Cia/Custom register>,sr` буде виконана неправильно, якщо вона змінює частину регістра статусу, що належить супервайзеру, частина супервайзера не зміниться.
  - Кожна з команд `(ssp)+` або `-(ssp)` разом із доступом по записі в регістри Cia або Custom не може бути оброблена у зв'язку із проблемами фрейму стека. WHDLoad виявить таке звернення й завершить роботу програми з відповідної повідомленням
  - Інструкції не повинні одночасно звертатися більш ніж до одного "snooped"-регістру. Це означає, що код, подібний move.b ($dff006), ($bfd800) не може бути оброблений й якщо такий код буде виконано, то WHDLOAD виведе повідомлення про помилку доступу.