"Заплатка" на программе
Подпрограммы в машинных кодах, часто включаемые в Бейсик-программы, выглядят в них эдакими "заплатками" из другой ткани, зато заметно увеличивают их эффективность. Использование таких подпрограмм дело непростое, требующее определенной квалификации, однако многие любители освоили его. Ну а включение подпрограмм в чужие программы в машинных кодах? Кто осмелится на такое?
Оказывается, не так страшен черт. Докажем это на примере.
В хорошем текстовом редакторе для "Корвета" WMR есть один существенный недостаток: нельзя перемещать курсор клавишами дополнительного поля. Попробуем исправить его, перекодировав все эти клавиши (в том числе DEL, INS, CLS).
Клавиша 2 должна перемещать курсор вниз. В инструкции к WMR ("Диалог. Пакет 3") можно узнать, что для этого она должна генерировать код 1Е (здесь и далее коды и адреса шестнадцатиричные), соответствующий управляющему символу УПР+Ч. В "Руководстве системного программиста" находим, что код клавиши 2 хранится в ячейке с адресом F6AC. Записать туда 1Е можно двумя командами ассемблера:
MVI А,1Е
STA F6AC
В кодах они записываются так: ЗЕ, 1Е, 32, АС, F6.
Примерно такие же цепочки кодов команд нужны для перекодировки остальных клавиш. Добавим, кроме того, еще две команды, включающие нижний регистр русских букв (для этого в ячейки F72D и F72E нужно записать нули). Вся программа будет выглядеть так.
ЗЕ 10 32 А0 F6 ЗЕ 06 32 А6 F6 ЗЕ 1Е 32 AC F6 ЗЕ 01 32 В2 F6 ЗЕ 19 32 ВВ F6 ЗЕ 12 32 BE F6 ЗЕ 17 32 С4 F6 ЗЕ 08 32 СА F6 ЗЕ 15 32 D0 F6 ЗЕ 13 32 D6 F6 ЗЕ 05 32 DC F6 ЗЕ 14 32 Е2 F6 ЗЕ 1А 32 Е8 F6 ЗЕ 07 32 ЕЕ F6 ЗЕ 00 32 2D F7 ЗЕ 00 32 2Е F7 С9
Последний код - команда RET.
Теперь оформим ее в виде отдельного файла, который назовем KEYWM.COM.
Чтобы записать эти коды на диск, используйте программу POWER.COM (команды DS и SAVE) или DU.COM, в которой можно быстрее и с меньшей вероятностью ошибки набирать и записывать информацию, чем в POWER, которая все равно, однако, понадобится для создания файла на диске (команды READ, SAVE).
Приступим. Загружаем DU.COM: A>DU. Выбираем пустую дорожку на диске, задаем номер дорожки: Т43. Задаем номер сектора: S17. Нажимаем D, на экран выводится дамп этого сектора. Запишем в него коды, начиная с адреса 00 (лучше небольшими группами):
СН00,3Е,10,32,A0,F6,ЗЕ,06,32,A6"F6<BK>
10 кодов занесены (пока это только копия сектора в ОЗУ!). Чтобы посмотреть их в дампе, нажмем еще раз D. Убедившись, что все в порядке, действуем дальше - вводим очередную порцию кодов (теперь уже с адреса 0А):
CH0A,ЗЕ,1Е,32,AC,F6,ЗЕ,01,32,В2,F6<BK>
И т. д. Когда занесены все коды, нужно заполнить остальные ячейки сектора кодом 00 (это не обязательно, но желательно - потом с таким сектором удобнее будет работать).
Записываем сектор на диск: W. Выйдем из DU в систему: X. Загрузим POWER и дадим команды
A>READ 43 17 4000 1 A>SAVE KEYWM.COM 4000 1
Убедившись, что на диске появился файл KEYWM.COM, попробуем с ним работать. Загрузим его:
A>KEYWM
Теперь, если попытаться набрать команду
A>WMR PROBA.TXT
(PROBA.TXT - файл, который мы будем создавать в редакторе), то будут набираться русские буквы нижнего регистра, поэтому команду надо набирать, нажав одновременно клавиши АЛФ и РГ и удерживая их.
Набирая текст, передвигая курсор, удаляя символы или вставляя новые, проверим, как работает редактор. Если что-то нас не устраивает, можно внести изменения в файл KEYWM.COM, если все в порядке, проделаем следующее:
- объединим файлы WMR.COM и KEYWM.СОМ;
- заставим добавленные коды работать в виде подпрограммы.
Первая задача решается просто:
A>COPY WM.COM=WMR.COM,KEYWM.COM[VOR]
Получим объединенный файл WM.COM из 77 секторов: 76 - WMR.COM, 1 - KEYWM.СОМ.
При загрузке в ОЗУ WM.COM будет располагаться начиная с адреса 0100, 77-й сектор - с адреса 2700, а последний код (09) - по адресу 2750.
Где-то в начале программы, до того как редактор начнет работу с текстом, надо организовать переход к подпрограмме по адреcу 2700. Для этого годится любая из команд JMP и CALL, занимающих три байта каждая, но где ее разместить? Надо использовать одну из трех возможностей:
- команда JMP;
- команда CALL;
- три "пустые" ячейки подряд - NOP.
Используем дизассемблер SID.COM:
A>SID WM.COM
Дадим команду L. На экране - команды WM.COM. Нам повезло: первая же команда - JMP 0269, она располагается, начиная с адреса 0100, т. е. в ячейках 0100, 0101, 0102, и в кодах имеет вид СЗ 69 02, в чем нетрудно убедиться, дав команду D и посмотрев дамп. В эти ячейки нужно записать команду перехода к нашей подпрограмме JMP 2700, которая в кодах имеет вид СЗ 00 27. Это можно сделать с помощью POWER.COM. Надо загрузить файл с адреса 4100 (командой LOAD) и с помощью команды DS в ячейки 4100, 4101, 4102 записать вышеупомянутые коды. Затем в адрес 6750 и далее записать три кода: СЗ 69 02. Эти три кода заменят в нашей подпрограмме С9 00 00 и обеспечат правильный вход в основную программу.
Осталось только сохранить измененную программу командой SAVE.
Редактор работает. Если вам не нравится, что по выходе из него кодирование клавиш сохраняется (а также остается включенным нижний регистр русских букв), можно сделатъ (таким же образом) программку KEY.COM, изменяющую все коды на стандартные.
WM.COM хорошо работает в МикроДОС разных версий, передается системой SEND по локальной сети на РМУ, где работает с любыми текстами. Известный редактор ED.COM в этой системе не работает на РМУ с файлами, загруженными с диска.
Учтите, что в СР/М-80 не переключается верхний регистр и не работают клавиши DEL, INS, CLS (вместо них можно использовать УПР+Т, УПР+Z, УПР+G). Черные клавиши дополнительного поля работают нормально. Можно было бы усложнить программу и сделать ее универсальной, но в данном случае эта задача не ставилась. Целью автора было обратить внимание читателей на следующее:
- рядовой пользователь может делать весьма полезные вещи относительно простыми средствами;
- не следует бояться программ в кодах - их тоже можно читать, писать, модифицировать;
- чем болыче мы, пользователи "Корвета", будем общаться (в частности, через "ИНФО"), тем легче и интереснее нам будет работать.