Хабрахабр

Адаптация программ для ZX Spectrum к TR-DOS современными средствами. Часть 2

Теперь нужно перенести файлы на диск. В первой части статьи мы разобрали загрузчик оригинальной версии и выяснили, куда загружается код игры и как он запускается.

25""/> <img src="http://orion-int.ru/wp-content/uploads/2019/05/adaptaciya-programm-dlya-zx-spectrum-k-tr-dos-sovremennymi-sredstvami-chast-2.jpg" alt="Floppy 5.

Дело в том, что оригинальный файл содержит картинку и код игры целым куском и, следовательно, затирает собой область бейсика и системных переменных, которые находятся сразу за экранной областью. Обычно это делается простым копированием файлов, но есть одна проблема. TR-DOS резервирует область определённую памяти под свои нужды, и если загрузить туда данные, в процессе загрузки всё сломается. Такой файл можно загрузить с ленты, но нельзя загрузить с дискеты.

Поэтому игру можно загрузить в другое место, а по окончании загрузки переместить куда нужно и запустить. К счастью, у нас есть достаточно памяти, не занятого игрой. Для этого распилим монолитный файл на два — данные экранной области и данные игры: Картинку при этом хотелось бы показать до окончания загрузки — на то она и загрузочная.

$ head -c 6912 headless.bin > screen.bin
$ tail -c +6913 headless.bin > data.bin

Позже он нам понадобится для записи в итоговый образ. Файл с данными игры сразу же переведём формат hobeta. Для преобразования форматов будем использовать zxspectrum-utils и trd2hob:

$ binto0 data.bin 3
$ 0tohob data.000 # создаст файл data.$C

Loading screen

Её можно порядочно сжать экранным компрессором, например, Laser Compact 5. Что же касается загрузочного экрана, тратить 6,75 кБ на такую простую картинку — расточительство. Для этого сначала нужно записать файл картинки во временный образ дискеты: 2.

$ binto0 screen.bin 3
$ 0tohob screen.000
$ createtrd tmp.trd
$ hobeta2trd screen.\$C tmp.trd

При сохранении укажем имя файла screenz. После этого запускаем Laser Compact в эмуляторе и сохраняем сжатую картинку на эту же дискету (Pack screen → Save with depacker). Далее нужно скопировать сжатую картинку из образа дискеты обратно на диск. C. К сожалению, исходников trd2hob мне нигде найти не удалось, поэтому приходится запускать досовский бинарник из-под DosBox:

$ dosbox -c "mount C $PWD" -c "C:" -c "trd2hob.exe screen.trd" -c exit

В итоге получаем hobeta-файл вида screenz.$С со сжатой картинкой.

Хоть работу с ними и удобнее автоматизировать, у обоих перед Laser Compact есть недостатки: Кроме родных спектрумовских утилит для сжатия экранов есть утилиты и для PC, например, zx7b и zxsc.

  1. Оба проигрывают по качеству сжатия.
  2. При распаковке картинки видны определённые артефакты, когда как Laser Compact заполняет область атрибутов экрана практически мгновенно.
  3. zx7b не поддерживает создание самораспаковывающихся архивов — приходится дополнительно компилировать декомпрессор.

Он понадобится нам позже для написания загрузчика. Напоследок узнаем размер сжатого файла.

$ lstrd tmp.trd 80 Tracks, Double Side, capacity 640kB
Number of files/deleted: 2/0
Free sectors/bytes: 2509/642304
First free sector/track: 3/3 FILENAME TYPE SECTORS ADDRESS LENGTH TRACK SECTOR --------------------------------------------------------------
screen <C> CODE (BYTES) 27 16384 6912 1 0
screenz <C> CODE (BYTES) 8 40000 1812 2 11

Как видим, файл сжался более чем втрое и занимает 8 секторов на диске.

В следующей части перейдём непосредственно к загрузчику.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть