Порядок выполнения программы

Следующая таблица показывает процесс выполнения программы, когда WHDLoad-ая установленная программа, будет выполнена. Я надеюсь, что это поможет понять, как работает WHDLoad и как WHDLoad, slave и установленная программа взаимодействуют между собой.

 

ПОЛЬЗОВАТЕЛЬ
  • запускает демо или игру, щелкая на иконку или запуская WHDLoad через командную строку
Операционная Система
  • загружает WHDLoad и призводит запуск
WHDLoad
  • проверяет програмную среду и железо
  • загружает и проверяет slave
  • резервирует необходимое количество памяти для установленной программы
  • если опция Preload/S установлена, то она загружает образы диска и файлы в RAM (насколько свободная память доступна)
  • выключает OS (отключает многозадачность и перерывания, переключает графику на режим OCS, инициализирует все аппаратные средства которые необходимы)
  • осущесвствляет переход на выполнение slave
Slave
  • загружает исполняемый файл установленной программы, вызывая функцию WHDLoad (например resload_DiskLoad или resload_LoadFile)
  • исправляет исполняемый файл (что бы программа загрузила свои данные через slave, устраняет проблемы несовместимости, активирует функцию выхода из программы)
  • запускает исполняемый файл
Установленная программа
  • выполняется
  • при подгрузке данных с диска, вызывает slave (потому что slave исправил исполняемый файл), slave вызывает WHDLoad, и WHDLoad частично обращается к OS чтобы загрузить данные (только если данные предварительно не подгружены -  Preload), затем возвращается в установленную программу и программа продолжает выполняться
ПОЛЬЗОВАТЕЛЬ
  • выходит из программы, нажимая QuitKey
Slave
  • возвращается к WHDLoad, вызывая resload_Abort
WHDLoad
  • перезапускает OS (восстанавливает состояние регистров, памяти, дисплея)
  • освобождает все занятые ресурсы
  • происходит возврат к OS

Как устанавить диск использующий трековый загрузчик (trackloader)

Этот пункт пояснит о том, как создать патч использующий WHDLoad. Данный пункт поясняет самый простой вариант. В реальности такой вариант будет крайне редко происходить. Для особых случаев и проблем, читайте главы, которые следуют за этой.

  1. Предварительная подготовка

Возможные проблемы

Не стандартный trackloader

Некоторые программы используют свой собственный формат диска. Это означает, что DIC неспособен создать образ такого диска. Чтобы создать файлы или образ такого диска, рекомендуется использование RawDIC. См. документацию по RawDIC.

Несколько дисков

Если программа использует больше чем один диск, то slave должен переадресовать доступы к дискам к соответствующему файлу образа. Иногда это не легко. Некоторые программы поддерживают больше чем один дисковод, так что вы можете использовать номер дисковода чтобы выбрать нужный диск. Большинство программ использует ID(например название) на каждом диске, чтобы отличать их. В этом случае, используйте переменную, которая содержит номер диска, и при каждом доступе к диску, ID ( анализируя параметры для загрузчика диска) увеличивать переменную (если последний диск достигнут, уменьшение его). Так что загрузчик будет читать ID снова и снова вплоть до правильного номера диска. Бывает что программа создает запрос, чтобы пользователь вставил правильный диск - оключите этот запрос.

Сохранение таблицы рекордов (Highscore)

Используйте resload_SaveFile, чтобы записать соответствующую область памяти на диск. И в придачу еще зашифруйте, так чтобы ламеры не могли исправить его. Не рекомендую записывать непосредственно в образ диска (используя resload_SaveFileOffset), потому что, если что-то пойдет не так, как надо (например какя-нибудь ошибка или зависание), возможно, что образ диска будет поврежден.

Сохранение состояния игры (Savegames)

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 снабженный подробнейшей информацией.

Проблемы совместимости

Ограниченное адресное пространство на 68000/68010/68ec020

На этих процессорах адреса ограничены 16 МБ (000000 $... $ffffff), потому что CPU имеет только 24 линии адреса. В результате все доступы к более высоким адресам выполняются к более низким 16 МБ, игнорируя старшие 8 бит адреса. Некоторые программы используют эти биты, чтобы хранить данные, или просто забывают очищать их. На процессоре с полной разрядностью адреса на 4Гб типа 68020/680ec30/68030/68040/68060 это не будет работать, потому что обращение будет идти к полному адресу на 32 бита.
Чтобы решить эту проблему, вы должны исправить эти доступы и переадресовать их к соответствующему адресу.
Иногда причиной этих доступов к странным адресам может быть неинициализированный указатель. В этом случае может помочь очищение 400 $ - ws_BaseMemSize.

Различный stackframes на каждом процессоре

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.

MOVEM.x RL, - на 68000/010 и 68020/030/040

Есть различие, если регистр, используемый в способе преддекремента (RL) также содержится в списке регистров. На 68 020 - 68 040 список сохраняется полностью . Список  decrement не сохраняется на 68000 - 68 010.
Так как эта инструкция не очень часто используется, то никакие соответствующие проблемные случаи не известны в настоящее время.

Общие руководства по написанию патчей

Подсказки

Что лучше использовать: образы дисков или файлы?

Иногда перед вами будет стоять выбор, что использовать, образы дисков или файлы. Оба имеют его преимущества. Использование образов диска - обычно более легкий и более быстрый способ создать slave. Но реальные файлы - более легче кэшируются (если очень мало памяти, или память фрагментирована). Занимаемое место на жестком диске также будет меньше с реальными файлами чем с образами дисков. Вы должны использовать образы дисков, если очень много файлов (больше чем 30).