Есть различные ситуации, при которых очень полезно было бы получать информацию что установленная программа обращается к определенным участкам памяти. С функцией resload_Protect *? можно защищать участки памяти от чтения и/или записи процессором. Защита позволяет то, что каждый доступ к такой защищенной области создаст исключение / Ошибка Доступа, которое закончится соответствующим запросчиком WHDLoad. Если вы делаете область памяти защищенной, использование resload_Protect *? функции WHDLoad изменит затронутые описатели страниц в MMU списке перевода. Теперь при каждом доступе к защищенной странице центральный процессор создаст исключение / Ошибка Доступа. Исключение будет обработано WHDLoad - проверит причину исключения. Если причиной был доступ к защищенной странице(MMU), но доступ не касается защищенной области, то этот доступ будет эмулироваться, и выполнение программы продолжится. Иначе WHDLoad выйдет с соответствующим запросчиком. Если доступ был к инструкции (то есть cpu, пытается загрузить код команды), то это будет эмулироваться всегда, или другими словами функция resload_Protect *? затрагивают только чтение и запись данных. Факт, что каждый доступ к защищенной странице (размер pagesize в настоящее время равен $1000), создаст ошибку доступа, даже если защищенная область имеет только длину 1 байт, в результате, скорость выполнения программы замедлиться чрезвычайно. Особенно, если части кода расположены на той же самой странице. Если программа зависит от скорости выполнения, возможно, что программа не работает с защищенной памятью.
Если вы устанавливаете игру, используя WHDLoad, вы должны исправить в игре оригинальные загрузчики, которые будет использовать WHDLoad, чтобы загрузить данные для игры. Некоторые игры выполняют подсчет контрольных сумм в некоторых областях, чтобы обнаружить, что оригинальный код был изменен. Эти подпрограммы проверки иногда очень трудно найти. Но использование функции resload_Protect *? в WHDLoad делает этот процесс легким. Все, что вы должны сделать, должны защитить байты, которые вы изменили в коде игры от чтения. Теперь каждая подпрограмма, которая попробует сделать контрольную сумму и считать ваш исправленный код, создаст - ошибку доступа. И таким образом вы узнаете, где такая подпрограмма расположена.
Вы не должны защищать участок памяти, где расположен SSP. Если же вы защитили, то произойдет Исключение , и это закончится Double Bus Fault, потому что центральный процессор не способен будет записать исключение в stackframe. После Double Bus Fault должна быть произведена перезагрузка компьютера. WHDLoad проверяет конфликт защищенной области с SSP и заканчивает его , но это не помогает если SSP был изменен позже.
tst.l
($fff)
" где страница начиная с
адреса $1000 защищена), и еще - т.к.
это одна из отсутсвовающих команд на 68000, то Ошибок
Доступа не будет.
tas
или cas2
не
поддерживаются и создают Ошибку Доступа,
но это не проблема, потому что
эти команды не поддерживаются
амижными аппаратными средствами. tst.l ($ffe)
" затрагивает
страницу $0.. $fff и страницу $1000.. $1fff, это ограничение -
настоящая проблема и является причиной того, что функция resload_Protect
иногда бесполезна. Я буду пытаться возможно
поддерживать это, но это очень
трудно.
tas
или cas
не поддерживаются и создают Ошибку Доступа,
но это не проблема, потому что
такие передачи так или иначе не поддерживаются
амижными аппаратными средствамиинструкция - movem
может
получить доступ к защищенной области, не создавая исключение Ошибки Доступа,
это возможно, потому что только первый доступ (слово или
длинное слово) будет проверено на
соответствие защищенной области move16
и операции с плавающей точкой
(FPU) не поддерживаются и создают Ошибку Доступа move (mem),(mem)
" с перекрыванием
источника на адрес предназначения,
создает Ошибку Доступа, т.к. нет
выравнивания и соответственно команда будет выполнена неправильно,
например "move.l ($ffc), ($ffe)
" где страница $1000.. $1fff защищена и память
перед выполнение
содержит ($ffc) =$11112222, ($1000) =$33334444, после выполнения, $1000 содержат
$11114444 а не $22224444