|
Micro
#10
28 ноября 1998 |
|
Tape и Disk - Адаптация программ к системе TR-DOS (часть 4).

┌═══════════════════════════════════════┐
║ АДАПТАЦИЯ ПРОГРАММ К СИСТЕМЕ TR-DOS ║▒
└═══════════════════════════════════════┘▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
ГЛАВА 4
─────────────────────────────
ЗАГРУЗЧИКИ В МАШИННЫХ КОДАХ
--------------------------------
для тех, кто не знает, что такое
машинный код.
Несмотря на то,что знание ассемблера не
является обязательным для понимания того,
о чём я буду писать дальше, оно отнюдь не
повредит. Ещё более полезным является уме-
ние пользоваться каким-либо монитором-диз-
ассемблером, рекомендую воспользоваться
программой из пакета Ultraviolet/Infrared.
Это первые ассемблер и дизассемблер, кото-
рые появились на рынке для ZX Spectrum.
Программа проста в обращении и вполне при-
емлема для решения тех задач, которые бу-
дут разбираться в этой главе. Позднее Вам
придётся перейти к чему-нибудь более серь-
ёзному (например, STS 6.2).
Изложить последовательно и понятно ор-
ганизацию загрузки файлов из машинного ко-
да для неподготоленного пользователя ─ за-
дача более чем сложная,но попробовать мож-
но.
Начнём с самого простого. Предположим,
что на ленте имеется программа, состоящая
из четырёх файлов: файл на Бейсике, кодо-
вый файл и два файла без заголовка. Изучив
бейсик-программу, Вы пришли к выводу, что
она загружает кодовый файл и запускает его
с адреса 65000.
С помощью копировщика вы определили,что
кодовый файл загружается с адреса 65000 и
имеет длину 30 байт,длина файлов без заго-
ловка равна соответственно 6912 и 32768
байт.
Теперь запустите кодовый файл туда, где
ему положено находиться, но запустите не
его, а Ваш дизассемблер. Дизассемблировать
память необходимо, начиная с адреса запус-
ка, то есть с адреса 65000. Предположим,
что дизассемблер показал следующее:
65000 LD IX,16384 ;стартовый адрес
65004 LD DE,6912 ;длина
65007 LD A,255
65009 SCF
65010 CALL 1366 ;вызов подпрограм-
;мы загрузки
65013 LD IX,25000 ;стартовый адрес
65017 LD DE,32768 ;длина
65020 LD A,255
65022 SCF
65023 CALL 1366 ;вызов подпрограм-
;мы загрузки
65026 JP 40000 ;запуск программы
65029 NOP
Не берусь объяснять смысл всех этих за-
корючек. Если Вы знаете, что они обознача-
ют ─ Ваше счастье, если нет, то и Бог с
Вами. Чтобы мало-мальски разбираться с за-
грузчиками, необходимо запомнить, что пос-
ле LD IX следует адрес загрузки файла,пос-
ле LD DE ─ его длина. Мнемоники LD A,255 и
SCF устанавливают системные регисты, а
CALL 1366 вызывает подпрограмму загрузки с
ленты. Адрес после CALL может изменяться в
зависимости от того, использует ли загруз-
чик стандартную подпрограмму загрузки,рас-
положенную в ПЗУ(как в данном примере),или
свою собственную.
Таким образом, мы узнали, что загрузчик
загружает два файла,первый из которых(дли-
ной 6912 байт и адресом загрузки 16384),
очевидно, ─ заставка, а второй (32768 и
25000 соответственно) ─ основной файл про-
граммы (обратите внимание, что данные о
длинах файла совпадают с данными, предос-
тавленными копировщиком); кроме того, мы
узнали, что программа запускается с адреса
40000.
Получив эти данные, можно приступить к
адаптации программы.
Пожалуй, самое сложное, что предстоит
сделать, ─ это записать два файла без за-
головков на диск. Если у Вас есть програм-
ма PCopier,PCopier Plus или L-COPY, то за-
дача несколько упростится. Достаточно бу-
дет скопировать файлы на диск, а затем вы-
полнить следующую программу:
10 RANDOMIZE USR 15619: REM:
LOAD "less 001"CODE 16384
20 RANDOMIZE USR 15619: REM:
SAVE "screen"SCREEN$
30 RANDOMIZE USR 15619: REM:
LOAD "less 002"CODE 25000
40 RANDOMIZE USR 15619: REM:
SAVE "main"CODE 25000,32768
Разумеется, адреса и имена файлов при-
годны только для данного примера.
Существует, однако, немало способов ко-
пирования файлов и без использования спе-
циальных копирощиков. Приведу наиболее
простой для данного примера метод (в прин-
ципе,он пригоден для большинства случаев).
После загрузки файлов, загрузчик, как
правило, запускает программу. Обычно для
этого используется уже упомянутая команда
JP XXXXX, где XXXXX ─ адрес запуска прог-
раммы.Чтобы получить копию файла на диске,
нужно загрузить файлы в память с ленты и
записать их на диск. Для этого можно вос-
пользоваться уже готовым загрузчиком, пре-
дварительно заменив инстукцию, запускающую
программу, на инструкцию, возвращающую уп-
равление бейсик-интерпретатору, то есть
вместо мнемоники JP нужно поставить RET,
код которой ─ 201. В нашем примере этого
можно добиться, выполнив оператор POKE
65026,201. Значение по адресу,где располо-
жена инструкция JP, измениться на 201 (ко-
манда RET),что обеспечит возврат в бейсик-
систему после загрузки обоих файлов.
Подготовив кодовый загрузчик подобным
образом,можно его запускать,не забыв обес-
печить запись файлов на диск после завер-
шения работы загрузчика. Удобно набрать
программу в несколько строк:
10 RANDOMIZE USR 65000: REM Запуск за-
грузчика
20 RANDOMIZE USR 15619: REM:
SAVE "screen"SCREEN$
30 RANDOMIZE USR 15619: REM
SAVE "main"CODE 25000,32768
Когда на экране появиться сообщение об
успешном выполнении программы,Вам останет-
ся только написать загрузчик с диска, с
чем, я надеюсь, трудностей не возникнет.
────────────────────────────
Главу 5 "КАК БОРОТЬСЯ С RAMTOP'ом", Вы
найдёте в следующем номере Micro.
----------------------------
03.12.98. Gloom Demons Inc.
C.E. special for Micro 10.
Другие статьи номера:
BBS - ПОЛНОЕ описание работы с BBS на Спектруме. |
Мнение - обзор игры жанра D&D - Last Herp of Light Force. |
Tape и Disk - Адаптация программ к системе TR-DOS (часть 4). |
Юмор - подборка анекдотов. |
Pokes - подборка Poke's. |
Похожие статьи:
В этот день... 5 ноября