### Використання функції resload_Protect *?

#### Теорія

Є різні ситуації, при яких було б дуже корисно одержувати інформацію про те, що установлена програма звертається до певних ділянок пам'яті. За допомогою функції resload_Protect *? можна захищати ділянки пам'яті від читання й/або запису процесором. Захист полягає в тому, що кожен доступ до такої захищеної ділянки ініціює виняткову подію "Помилка Доступу", яка створить відповідне вікно з повідомленням від WHDLoad. Якщо ви ставите область пам'яті під захист, використовуючи функцію resload_Protect *?, то WHDLoad змінить затронуті дескриптори сторінок у списку перекладу диспетчера пам'яті (MMU). Тепер при кожному доступі до захищеної сторінки центральний процесор буде ініціювати виняткову подію "Помилка Доступу". Оброблювач виняткових подій усередині WHDLoad перевірить його причину. Якщо причиною був доступ до захищеної сторінки, але доступ не торкнув захищену ділянку, то цей доступ буде емулюватися, і продовжиться нормальне виконання програми. Інакше, WHDLoad закінчить роботу і видасть відповідне вікно з повідомленням. Якщо відбувається доступ до інструкції (тобто центральний процесор намагається завантажити код), то це завжди буде емулюватися, або інакше кажучи, функція resload_Protect *? стосується тільки читання й запису даних. Факт в тому, що кожен доступ до захищеної сторінки (у наш час розмір сторінки дорівнює $1000), створить помилку доступу, навіть якщо захищена ділянка має довжину всього 1 байт, у результаті швидкість виконання програми дуже сильно впаде. Особливо, якщо частини коду розташовані на одній й тій же сторінці. Якщо програма залежить від швидкості виконання, те можлива різниця в виконанні. Таким чином, можливий варіант, що деякі програми не будуть працювати з захищеною пам'яттю.

#### Приклад: контрольні суми по коду

Якщо ви встановлюєте гру, використовуючи WHDLoad, ви повинні виправити в грі процедури оригінальних завантажників таким чином, щоб вони використали WHDLoad, для завантаження дані ігри. Деякі ігри виконують підрахунок контрольних сум у деяких ділянках коду, щоб визначити, чи не змінювався оригінальний код. Ці підпрограми перевірки іноді дуже важко знайти. Але використання функції resload_Protect *? в WHDLoad робить цей процес дуже простим. Усе, що ви повинні зробити, це захистити від читання ті байти, які ви змінили в коді гри. Тепер кожна підпрограма, що спробує підрахувати контрольну суму й прочитати ваш виправлений код, створить помилку доступу. І ви зможете довідаєтися де розташована ця підпрограма.

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

Ви не в якому випадку не повинні захищати ділянку пам'яті, яку вказує SSP. Якщо ви все-таки це зробили, то відбудеться Виключення, що приведе до подвійній помилці шини (Double Bus Fault), тому що центральний процесор не зможе записати stackframe виключення. Після подвійної помилки шини має бути зроблене перезавантаження для продовження роботи. WHDLoad перевіряє конфлікт захищеної ділянки з SSP і закінчує усуваючи його, але це не допомагає, якщо SSP змінюється пізніше.

- 68020 + 68851
  - така конфігурація в цей момент не підтримується
- 68030
  - 3-байтові передачі не підтримуються й створюють Помилку Доступу, такі передачі будуть виникати, якщо відбудеться звертання до "довгого слова" на непарній адресі на границі сторінки (наприклад, "`tst.l ($fff)`" де захищена сторінка, починаючи з адреси $1000). Оскільки це не стосується процесорів 68000, то Ви швидше за все ніколи не зштовхнетеся з подібною ситуацією
  - блоковані переміщення типу `tas`, `cas` або`cas2` не підтримуються й створять реальну Помилку Доступу, але це не є проблемою, тому що ці команди не підтримуються апаратними засобами Амігі.
- 68040
  - така конфігурація в цей момент не підтримується
- 68060
  - Доступ до невирівняних даних не підтримується й створить Помилку Доступу, невирівняний доступ - це доступ, що охоплює дві сторінки (і, у крайньому випадку, одна з них захищена), наприклад, "`tst.l ($ffe)`" стосується сторінки $0...$fff і сторінку $1000...$1fff, це обмеження - дійсно є проблемою і причиною того, що іноді неможливо використати функцію resload_Protect. Я спробую пізніше зробити підтримку цього, але це дуже важко.
  - невирівняні доступи потоків інструкцій не підтримуються й створюють реальну Помилку Доступу, якщо обидві порушені сторінки захищені. В більшості випадків, таку ситуацію можна обійти
  - блоковані переміщення, викликані `tas` або `cas` не підтримуються й створюють реальну Помилку Доступу, але це не є проблемою, тому що ці команди не підтримуються апаратними засобами Амігі.
  - інструкції, які перебувають на захищеній сторінці (отже, що емулюються) і доступ до функцій supervisor'а регістра статусу, будуть виконані неправильно, ці інструкції будуть завжди бачити що trace bit виставлено в 1, а маска пріоритету переривання виставлена в 7, тому будь-яка зміна функцій supervisor'а не буде мати ніякого ефекту (тобто supervisor залишиться без змін).
  - `Інструкція movem` може одержати доступ до захищеної ділянки, не створюючи виключення "Помилка Доступу", це можливо, тому що тільки перше звертання (слово або довге слово) буде перевірене на відповідність захищеній ділянці.
  - `Інструкція move16` й операцій з плаваючою комою (FPU) не підтримуються й створюють Помилку Доступу
  - Команда "`move (mem),(mem)`" з адресами, створює джерела й призначення, що перекривають Помилку Доступу, тому що Misalignment буде виконуватися некоректно, наприклад "`move.l ($ffc), ($ffe)`", де сторінка $1000...$1fff захищена й пам'ять перед виконанням містить ($ffc) =$11112222, ($1000) =$33334444, а після виконання, $1000 містить $11114444, а не $22224444.