В первой части статьи мы разобрали загрузчик оригинальной версии и выяснили, куда загружается код игры и как он запускается. Теперь нужно перенести файлы на диск.
Обычно это делается простым копированием файлов, но есть одна проблема. Дело в том, что оригинальный файл содержит картинку и код игры целым куском и, следовательно, затирает собой область бейсика и системных переменных, которые находятся сразу за экранной областью. Такой файл можно загрузить с ленты, но нельзя загрузить с дискеты. 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
Что же касается загрузочного экрана, тратить 6,75 кБ на такую простую картинку — расточительство. Её можно порядочно сжать экранным компрессором, например, Laser Compact 5.2. Для этого сначала нужно записать файл картинки во временный образ дискеты:
$ binto0 screen.bin 3
$ 0tohob screen.000
$ createtrd tmp.trd
$ hobeta2trd screen.\$C tmp.trd
После этого запускаем Laser Compact в эмуляторе и сохраняем сжатую картинку на эту же дискету (Pack screen > Save with depacker). При сохранении укажем имя файла screenz.C
. Далее нужно скопировать сжатую картинку из образа дискеты обратно на диск. К сожалению, исходников trd2hob
мне нигде найти не удалось, поэтому приходится запускать досовский бинарник из-под DosBox:
$ dosbox -c "mount C $PWD" -c "C:" -c "trd2hob.exe screen.trd" -c exit
В итоге получаем hobeta-файл вида screenz.$С
со сжатой картинкой.
Кроме родных спектрумовских утилит для сжатия экранов есть утилиты и для PC, например, zx7b
и zxsc
. Хоть работу с ними и удобнее автоматизировать, у обоих перед Laser Compact есть недостатки:
- Оба проигрывают по качеству сжатия.
- При распаковке картинки видны определённые артефакты, когда как Laser Compact заполняет область атрибутов экрана практически мгновенно.
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 секторов на диске.
В следующей части перейдём непосредственно к загрузчику.
Ссылки по теме:
- «Адаптация программ к системе TR-DOS» Николая Родионова.
Комментарии (10)
fdroid
20.05.2019 23:18Насколько я помню, программа для Spectrum состояла из двух файлов — загрузчика, написанного на Basic, и самой программы в машинных кодах. На дискетах эти файлы, соответственно, были доступны через некий файл-менеджер, не знаю как назывался, но это был файл boot. Т.е. чтобы загрузить дискету со списком файлов, нужно было на эту самую дискету скопировать boot. А вот загрузчик программ на Basic для кассет отличался от загрузчика программ для дискет. И когда у меня появился дисковод и TR-DOS, естественно я начал переносить программы с кассет на дискеты, но для того чтобы они работали в TR-DOS, «кассетные» загрузчики приходилось переписывать на Basic адаптируя к работе с дискетами. Деталей не помню, а может быть вообще не так всё помню, я школьником был начальных классов.
DeadMoroz Автор
21.05.2019 04:41Всё правильно. В простешем случае нужно было просто перед всеми `LOAD` добавить `RANDOMIZE USR 15619: REM:`, но этого было достаточно далеко не всегда. В этой и других статьях будут как раз детали.
kalantaj
21.05.2019 23:24Не. Этого мало. Недостаточно было везде перед LOAD «name» CODE добавлять RANDOMIZE USR 15619: REM:
ОБЯЗАТЕЛЬНО надо чтобы стоящий далее оператор LOAD был последним в бейсик-строке.
То есть если у меня, например, если загрузчик кассетной версии был таким:
10 LOAD «1» CODE: LOAD «2» CODE: LOAD «3» CODE: RANDOMIZE USR 32768
То сделав так:
10 RANDOMIZE USR 15619: REM: LOAD «1» CODE: RANDOMIZE USR 15619: REM: LOAD «2» CODE: RANDOMIZE USR 15619: REM: LOAD «3» CODE: RANDOMIZE USR 32768
Я получу НЕРАБОТАЮЩИЙ загрузчик. Мало того что он ничего не запустит, но он не загрузит даже одного кодового блока.
А написав вот так:
10 RANDOMIZE USR 15619: REM: LOAD «1» CODE
20 RANDOMIZE USR 15619: REM: LOAD «2» CODE
30 RANDOMIZE USR 15619: REM: LOAD «3» CODE
40 RANDOMIZE USR 32768
мы получим рабочий загрузчик для дисковода, с учетом того, что загружаемые блоки не будут пересекаться с загрузочной программой.
Операторы INK, PAPER, BORDER и CLEAR с CLS в загрузчике не писал по соображениям ненужности и не касаемости самого процесса загрузки. Хотя CLEAR стоило бы, чтобы опустить стек и случайно не затереть его при загрузке данных.
MichaelBorisov
21.05.2019 15:30Отличная тема! Автор, а вы оставите ссылку на книгу Н. Родионова «Адаптация программ к системе TR-DOS»?
prospero78su
До сих пор для меня туман, что такое hobeta. Хорошо бы уже почитать толковую статью))
DmitryMry
А чего там не понятного? Формат хранения данных. Это просто побайтовая копия секторов диска этого файла, к которым также добавлен заголовок.
qw1
Файл в TR-DOS состоит из 2 частей: 16 байт описателя в каталоге на 0-й дорожке + собственно данные в секторах на диске. Фактически, формат hobeta это склеенные вместе эти два блока данных.
serg_meus
speccy.info/Hobeta