Следующая таблица показывает процесс выполнения программы, когда WHDLoad-ая установленная программа, будет выполнена. Я надеюсь, что это поможет понять, как работает WHDLoad и как WHDLoad, slave и установленная программа взаимодействуют между собой.
ПОЛЬЗОВАТЕЛЬ |
|
Операционная Система |
|
WHDLoad |
|
Slave |
|
Установленная программа |
|
ПОЛЬЗОВАТЕЛЬ |
|
Slave |
|
WHDLoad |
|
Этот пункт пояснит о том, как создать патч использующий WHDLoad. Данный пункт поясняет самый простой вариант. В реальности такой вариант будет крайне редко происходить. Для особых случаев и проблем, читайте главы, которые следуют за этой.
После этого мы должны найти загрузчик в главном исполняемом файле. Быстрый путь состоит в том, чтобы искать образец $AAAAAAAA($55555555)(используется MFM) HEX-редактором. Изменяя область поиска (+/- $1000 байт) найдите его, дизассемблируйте, и ищите начало загрузчика. Когда загрузчик будет найден, разберитесь какие параметры загрузки он использует(адрес загрузки, длина). Теперь мы создаем код для slave-a, который исправит этот загрузчик, и который будет обрабатывать все запросы переадресовывая их slave-у. Slave будет приспосабливать параметры загрузки и вызывать функцию WHDLoad resload_DiskLoad.
Некоторые программы используют свой собственный формат диска. Это означает, что DIC неспособен создать образ такого диска. Чтобы создать файлы или образ такого диска, рекомендуется использование RawDIC. См. документацию по RawDIC.
Если программа использует больше чем один диск, то slave должен переадресовать доступы к дискам к соответствующему файлу образа. Иногда это не легко. Некоторые программы поддерживают больше чем один дисковод, так что вы можете использовать номер дисковода чтобы выбрать нужный диск. Большинство программ использует ID(например название) на каждом диске, чтобы отличать их. В этом случае, используйте переменную, которая содержит номер диска, и при каждом доступе к диску, ID ( анализируя параметры для загрузчика диска) увеличивать переменную (если последний диск достигнут, уменьшение его). Так что загрузчик будет читать ID снова и снова вплоть до правильного номера диска. Бывает что программа создает запрос, чтобы пользователь вставил правильный диск - оключите этот запрос.
Используйте resload_SaveFile, чтобы записать соответствующую область памяти на диск. И в придачу еще зашифруйте, так чтобы ламеры не могли исправить его. Не рекомендую записывать непосредственно в образ диска (используя resload_SaveFileOffset), потому что, если что-то пойдет не так, как надо (например какя-нибудь ошибка или зависание), возможно, что образ диска будет поврежден.
Savegame работает так же как и highscores.
Во время работы slave и установленная программа не должны иметь обращений
к OS! Поэтому все доступы из установленной программы должны быть отключены
или перенаправлены. Если их не так много и они не имеют смысла (типа exec.Disable() или exec.SuperState()) просто
замените их командой NOP ($4e71). Если доступы имеют важную функцию
(типа exec.DoIO()), переадресуйте их slave-у, и эмулируйте их. Также можете
создать простую exec.library в неиспользованной области памяти (инициализируйте longword в адресе 4 $). Вы можете посмотреть
исходный текст для Oscar.slave, который эмулирует
exec.AllocMem(). Чтобы обнаружить такие доступы
к OS, задайте execbase - $f0000001
с намерением, что все программы, которые любят использовать execbase, создадут исключение "Ошибка Адреса".
Если очень трудно эмулировать функции OS, тогда используйте один из kickemu пакетов, которые могут быть найдены в
whdload-dev пакете. Есть пакет для Kick 1.3
('src/sources/whdload/kick13.s'') и один
для Kick 3.1 ('src/sources/whdload/kick31.s'').
Эти пакеты требуют оригинального образа кикстарта и создают полную
OS в WHDLOAD. Читайте readme снабженный
подробнейшей информацией.
На этих процессорах адреса ограничены 16 МБ (000000
$... $ffffff), потому что CPU имеет только 24
линии адреса. В результате все доступы к более высоким адресам выполняются к более низким 16 МБ, игнорируя старшие
8 бит адреса. Некоторые программы используют эти биты,
чтобы хранить данные, или просто забывают очищать
их. На процессоре с полной разрядностью адреса на
4Гб типа 68020/680ec30/68030/68040/68060 это не будет
работать, потому что обращение будет идти к полному
адресу на 32 бита.
Чтобы решить эту проблему, вы должны исправить эти доступы и переадресовать их к
соответствующему адресу.
Иногда причиной этих доступов к странным адресам
может быть неинициализированный указатель. В этом
случае может помочь очищение 400 $ - ws_BaseMemSize.
Stackframes созданный процессором после
перерывания различен для членов семейства 68К. На 68000 stackframe - 6 байтов, за исключением "Ошибок
Адреса" и "шины". Stackframe содержит SR в
(a7) и PC в (2, a7). На всех других процессорах (68010 +) минимальный stackframe - 8 байтов и дополнительно содержит
номер вектора / исключения в (6, a7). Этот stackframe создается для "TRAP #xx" и прерывает
68010-68060. Stackframes при прерываниях / исключениях
отличны на каждом процессоре. RTE инструкция
работает по-другому на 68000 чем на 68010 +. На 68000 она просто восстанавливает
SR и PC и продолжает выполнение программы в прерванном адресе. На 68010
+ она дополнительно освободит stackframe в
зависимости от формата stackframe.
Некоторые программы ложат адрес (PC) и SR, и затем выполняют RTE инструкцию. Это работает только на 68000,
на 68010 + это будет иметь неопределенный результат.
Если программа делает так, то вы должны исправить ее. Иногда может быть достаточно заменить RTE на RTR.
Есть различие, если регистр, используемый в способе преддекремента (RL) также содержится в списке регистров.
На 68 020 - 68 040 список сохраняется полностью . Список decrement не
сохраняется на 68000 - 68 010.
Так как эта инструкция не очень часто используется, то никакие соответствующие
проблемные случаи не известны в настоящее время.
Иногда перед вами будет стоять выбор, что использовать, образы дисков или файлы. Оба имеют его преимущества. Использование образов диска - обычно более легкий и более быстрый способ создать slave. Но реальные файлы - более легче кэшируются (если очень мало памяти, или память фрагментирована). Занимаемое место на жестком диске также будет меньше с реальными файлами чем с образами дисков. Вы должны использовать образы дисков, если очень много файлов (больше чем 30).