Модификация графических файлов, Орион -128, работа в PENX$
Работа с графикой на Орионе 128
На 14.07.2022 последней версией OR DOS является релиз 4.03 от 1993г , прошивки ниже ORDOC написана написана Сафроновым и Сугоняко и остается до настоящего времени, описание будет позже. Все журналы "Радио" с упоминанием Ориона
Организация экранной области Ориона-128
Все драйвера сначала ищутся на диске В, потом на диске А
Стандарты ПО, адресов и портов
Графический редактор PENX, немного модификаций
Остановимся на нескольких моментах, связанных с установкой программы
PENX$ на ваш компьютер. Несмотря на то что переназначение управляющих
клавиш можно сделать непосредственно при запуске программы, довольно
неудобно будет делать это каждый раз, если ваша клавиатура отличается от
клавиатуры "Радио-86РК". Переназначить клавиши управления можно
непосредственно заменой кодов в программе. Коды управляющих клавиш
занимают в программе PENX$ десять ячеек, начиная с ячейки с адресом
000ЗН и по ячейку 000СН включительно. Заметим, что большинство программ
для ОРИОНА рассчитаны на работу под операционной системой ORDOS и при
загрузке программ с диска и запуске они чаще всего производят изменение
каких-либо ячеек непосредственно в самих себе, а оригинал всегда
хранится в неизменном виде на диске. Поэтому запустить программу, потом
выйти из нее и сохранить директивой S область памяти, где располагается
программа вместо оригинала, нельзя. Если вы решите заменить коды
управляющих клавиш, вам надо будет сделать эти изменения либо до набора
кодов программы, либо непосредственно в файле.
Произвести изменения в файле можно, пользуясь программой М128$, а
директивой FILE DUMP определить адреса модифицируемых ячеек на диске.
Полный формат этой команды будет выглядеть так:
FILE DUMP В: PENX$ [ВК].
Затем, узнав по каким адресам дополнительной страницы (квазидиска)
расположены ячейки, требующие модификации, выполняют директиву MODIFY
<АДРЕС>, 1 [ВК) и вводят новые значения.
ПРЕДСТАВЛЕНИЕ ГРАФИЧЕСКИХ ОБРАЗОВ В ПРК "ОРИОН-128"
Создание образов-картинок с помощью программы PENX$ не является самоцелью. Программа просмотра графических файлов. Созданные графическим редактором спрайты нужны для их дальнейшего использования в самых различных областях приложения ПРК. Однако, если вы просмотрите коды, записанные в созданный редактором файл, вряд ли вы сможете увидеть в, них что-то напоминающее то, что вы рисовали. Для того чтобы иметь возможность в полной мере использовать графические объекты, постараемся разобраться как можно более подробно, что же представляет собой созданный редактором спрайт и какие преобразования происходят с картинкой при записи ее на диск в виде стандартного файла ORDOS, заметим, что информация, которую мы даем ниже, предназначена для тех пользователей ПРК ОРИОН, которые достаточно хорошо представляют себе структуру памяти ПРК и, кроме того, имеют навыки в программировании на языке АССЕМБЛЕРа.
Таблица 2
;ПРОГРАММА РАСПАКОВКИ УПАКОВАННОГО ГРАФИЧЕСКОГО ;ФАЙЛА "RISI.PC" В 5УФЕР СПРАЙТОВ И ВЫВОД ЕГО НА ЭКРАН ;ИСПОЛЬЗУЕМЫЕ СИСТЕМНЫЕ УТИЛИТЫ ОС "ORDOS" ; ATPLDiEGHJ BBPCDH SDMAlEGHJ аВРРВН ;WDNiEQU B5FD6H RDISKlEQU BBFDCH PSGFlEQU CreFESH DOSlEQU CIBFFDH ; ПОДПРОГРАММЫ МОНИТОРА e KBRDlEQU BF803H WBP2iEOU BF87?H CALL UNPACK ; РАСПАКОВАТЬ ФАЙЛ В БУФЕР LHLB 7FFCH ; РАЗМЕРЫ СПРАЙТА" MOV C,L ; ВЫСОТА MOV Э,Н ; ШИРИНА LHLD 7FFEH ; НАЧАЛЬНЫЙ АДРЕС БУФЕРА YPHI" LXI Н,ВСВВВН ; ЛЕВЫМ ВЕРХНИХ УГОЛ ЭКРАНА1 ; ; ВЫВОД НА ЭКРАН АТРИБУТОВ ЦВЕТА" PUSH Н PUSH В CVC2 : PUSH Н PUSH В CYC1: LDAX D ; ЧИТАТЬ ОЧЕРЕДНОЙ БАЙТ ИЗ БУФЕРА PUSH В MOV С,А MVI А,1 ; ЗАПИСАТЬ ЕГО В ЭКРАННУЮ ОБЛАСТЬ CALL WBP2 ; ОЗУ ДОПОЛНИТЕЛЬНОЙ СТРАНИЦЫ POP В INX D INR L ; "СПУСТИТЬСЯ НИЖЕ" НА 1 СТРОКУ ЭКРАНА DCR С ; СЧЕТЧИК БАЙТОВ В КОЛОНКЕ JN2 CYC1 POP В POP Н INR Н ; ПЕРЕЙТИ НА СЛЕДУЮЩУЮ КОЛОНКУ DCR В ; СЧЕТЧИК КОЛОНОК JNZ CYC2 POP В POP Н ; ВЫВЕСТИ НА ЭКРАН ПЕРЕДНИЙ ПЛАН; CYC4: PUSH Н PUSH В CYC5: LDAX D ; ЧИТАТЬ ОЧЕРЕДНОЙ БАЙТ ИЗ БУФЕРА MOV М,А ; ВЫВЕСТИ ЕГО НА ЭКРАН ZNX D INR L ; "СПУСТИТЬСЯ НИЖЕ" НА 1 СТРОКУ ЭКРАНА DCR С ; СЧЕТЧИК БАЙТОВ В КОЛОНКЕ JNZ CYC3 POP В POP Н INR Н ; ПЕРЕЙТИ НА СЛЕДУЮЩУЮ КОЛОНКУ DCR В ; СЧЕТЧИК КОЛОНОК JNZ CYC4 CALL KBRD ; ЖДАТЬ НАЖАТИЯ ЛЮБОЙ КЛАВИШИ JMP DOS ; ПЕРЕЙТИ В ОС ; ПОДПРОГРАММА РАСПАКОВКИ" UNPACK: MVI А,'В' CALL WDN ; УСТАНОВИТЬ АКТИВНЫЙ ДИСК - "В" LXI H,NAME CALL SDMA ; УКАЗАТЬ ОС АДРЕС, НАЧИНАЯ С КОТОРОГО ; ЗАПИСАНО ИМЯ ИСКОМОГО ФАЙЛА CALL PSCF ; ПОИСК НА ДИСКЕ ФАЙЛА С ЭТИМ ИМЕНЕМ INR A JNZ DOS ; ЕСЛИ ФАЙЛ НЕ НАЙДЕН, ПЕРЕЙТИ В ОС CALL ATFLD ; В HL - АДРЕС НАЧАЛА ЗАПИСИ В ФАЙЛЕ UNPCK1: CALL RDISK ; ЧИТАТЬ 1-Й БАЙТ АДРЕСА БУФЕРА MOV Е,А INX H CALL RDISK ; ЧИТАТЬ 2-И БАЙТ АДРЕСА БУФЕРА MOV D,A INX Н INX Н ; ПРОПУСТИТЬ 2 БАЙТА (РАЗМЕРЫ) INX Н ; . - UNPB: CALL RDISK ; ЧИТАТЬ БАЙТ С К/ДИСКА INX Н RLC ; ПРОВЕРИТЬ, D7"l ? JC TW2 ; ЕСЛИ ДА, ТО СЛЕДУЕТ СЕРИЯ ОДИНАКОВЫХ ; ЕСЛИ НТ, ТО СЕРИЯ РАЗЛИЧНЫХ" RRC ; MR А MOV В,А ; ДЛИНА СЕРИИ UNP1: CALL RDISK ; ЧИТАТЬ БАЙТ С К/ДИСКА INX Н STAX D ; ЗАПИСАТЬ ЕГО В БУФЕР INX D MOV A,D СРI ваН RZ ; ЗАКОНЧИТЬ, ЕСЛИ БУФЕР ЗАПОЛНЕН DCR В ; УМЕНЬШИТЬ СЧЕТЧИК JNZ UNP1 JMP UNPB TW2: CMC RAR INR А MOV В,А ; ДЛИНА СЕРИИ ОДИНАКОВЫХ БАЙТОВ CALL RDISK ; ЧИТАТЬ БАЙТ С К/ДИСКА INX Н MOV С,А TW3: MOV А, С STAX D ; ЗАПИСАТЬ В БУФЕР INX D MOV A,D CPI аан RZ ; ЗАКОНЧИТЬ, ЕСЛИ БУФЕР ЗАПОЛНЕН DCR В ; УМЕНЬШИТЬ СЧЕТЧИК JNZ TW3 JMP UNPa NAME: DB 'RISI.PC END
Наличие промежуточного этапа - хранения развернутого массива в буфере
обусловлено тем, что многие операции, например создание перемещающихся
по экрану образов или преобразование изображения в инверсное, невозможно
проделать с упакованной информацией. С другой стороны, развернутый
графический массив обычно занимает большой объем ОЗУ, и упаковка таких
массивов совершенно необходима при одновременной работе с несколькими
образами.
При упаковке для записи на диск сформированный массив обрабатывается
следующим образом: сначала (теперь уже первыми) записываются 2 байта
начального адреса буфера - Х2 и X1, затем размеры (это делается затем,
чтобы программа распаковки могла сразу определить, куда распаковывать
массив, если он распаковывается в буфер, либо "знала" размеры картинки
при распаковке непосредственно на экран). Далее идет собственно упаковка
по следующей схеме: если подряд друг за другом следуют несколько
одинаковых байтов, записывается байт, в котором старший бит равен 1, а 7
младших бит определяют количество одинаковых (от 1 до 128). Далее
записывается само значение повторяющегося байта. Если же в массиве
имеется серия различных байтов, то записывается байт со старшим битом,
равным 0, и 7-ю битами, представляющими собой длину (опять же от 1 до
128) серии, и далее сама серия байтов. После этого операция повторяется,
и так до тех пор, пока не будет исчерпан весь буфер. Распаковка массива
проделывается в обратном порядке, причем сделать это можно несколькими
способами, в зависимости от того, как и для каких целей используется
спрайт. В табл.2 приведена в качестве примера программа, которая
работает следующим образом: ищет на диске В файл с именем RIS1.PC,
распаковывает его в буфер, а затем выводит на экран.
Однако для прикладных программ чаще всего нужна такая схема: поиск файла
по имени, распаковка и вывод. Несколько упакованных спрайтов, например,
могут быть объединены в один информационный блок и в таком виде включены
непосредственно в программу. В этом случае в подпрограмме распаковки
можно исключить все команды работы с диском, и сама подпрограмма будет
начинаться не с метки UNPACK, а с метки UNPCK1, кроме того, команды "CALL
RDISK" (чтение байта с диска по адресу, задаваемому регистровой парой HL)
нужно будет везде заменить на команды MOV А, М. Может быть и так, что
для ваших целей не, нужен вывод на экран атрибутов цвета, а необходимо
вывести только черно-белое изображение. В этом случае часть программы,
отмеченную как "вывод на экран атрибутов цвета", надо заменить на два
вложенных "холостых" цикла по счетчикам, задаваемым регистрами В и С, с
тем, чтобы пропустить блок атрибутов и вычислить начало собственно
изображения. Еще один вариант - распаковка с непосредственным выводом на
экран, минуя буфер спрайтов. При таком выводе вместо команд, помеченных
в листинге программы комментарием "пропустить 2 байта (размеры)", нужно
будет как раз прочитать эти значения размеров картинки и использовать их
в качестве счетчиков. Подпрограмма UNPACK при этом довольно существенно
усложнится из-за большого количества счетчиков.
В. САФРОНОВ, В. СУГОНЯКО Московская обл.
Журнал Радио № 9 1991 г.
Описание графического редактора (v1.xx) "penx" приведено в журнале "Радио" № 8,9 за 1992 год.
Работа в CP/M-80 программы и железо
Организация экранной памяти Орион128
На предыдущую страницу На главную страницу На следующую страницу