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.
Используя функцию resload_Control и тэги WHDLTAG_CUST_DISABLE/READ/STROBE/WRITE может быть модифицирована внутренняя конфигурация WHDLoad, какие регистры доступны по записи/чтению. С помощью этого некорректные попытки доступа могут быть проигнорированы, либо могут быть просто замечена все попытки доступа. Должно использоваться только в процессе тестов, но не в релизных версиях модулей.
адрес | регистр | проверка |
---|---|---|
$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 чтение, быстрее, потому что
эмуляция для записи, более сложная.
Параметр Snoop/S активизирует режим быстрого слежения. Доступы по чтению проверяться не будут. Не будет выполняться никаких специальных проверок. Этот способ может быть полезен только для получения содержания Custom-регистров, например, чтобы сделать снимок экрана, используя SP.
Начиная с версии 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.
Когда параметр ChkBltWait/S активирован, WHDLOAD будет
использовать трассировку инструкций на предмет
того, что установленная программа действительно
правильно ждет окончания работы блиттера, перед
его следующим запуском. Whdload использует
внутреннюю переменную, которая отображает
рабочее состояние блиттерa. Переменная устанавливается,
когда производится запись в bltsize или bltsizh,
и сбрасывается, когда происходит чтение из
регистра dmaconr. При каждой записи в регистр
блиттера, проверяется значение переменной, и
если значение показывает, что блиттер запущен, то
установленная программа будет завершена, а WHDLoad
сообщит PC последней запущенной задачи блиттера
совместно с реальным доступом.
У данного параметра есть два главных недостатка:
1) использование блиттера через коппер НЕ проверяется;
2) использование перерываний блиттера вынудит
процедуру проверки выводить бессмысленные
сообщения об ошибках.
custom.bplcon0
выставлен бит color
.
Некоторое аппаратное обеспечение, особенно flickerfixer требуют для вывода правильного видеосигнала, чтобы этот бит был выставлен.
Для лучшей совместимости следует всегда выставлять этот бит.
Проверяется прямая запись в custom.bplcon0
и запись посредством Копперлистов (copperlists).
custom.copcon
не установлен бит #1.
Этот бит включает возможность Коппера записывать в регистры Блиттера.
Иногда это может быть полезно для определения используют ли программы Коппер для управления DMA.
Планируется реализовать такую возможность, как приостановка программы и свёртывание ее в иконку. Для этого требуется Snoop. Поэтому, для обеспечения совместимости в дальнейшем, рекомендую авторам инсталляционных модулей проверять корректность работы ваших патчей с параметром Snoop.
Для работы параметра Snoop необходим диспетчер памяти (MMU). WHDLoad также должен использовать MMU, поэтому на машинах с процессорами 68030 необходимо активизировать опцию MMU/S.