[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

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

Що це таке

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

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

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

Регістри строба (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.

Обмеження


[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]