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. |
Похожие статьи:
В этот день... 21 ноября