Модификация графических файлов, Орион -128, работа в PENX$

Работа с графикой на Орионе 128

Продаю платы и наборы микросхем, куплю микросхемы, комплектующие к ПК Орион-128

На 14.07.2022 последней версией OR DOS является релиз 4.03 от 1993г , прошивки ниже ORDOC написана написана Сафроновым и Сугоняко и остается до настоящего времени, описание будет позже. Все журналы "Радио"  с упоминанием Ориона

Организация экранной области Ориона-128

Все драйвера сначала ищутся на диске В, потом на диске А

Стандарты ПО, адресов и портов

Графический редактор PENX, немного модификаций

    Графический редактор PENX4$, PENX4$, Орион -128, работа в OR DOS Орионе 128 работа с графикой

Остановимся на нескольких моментах, связанных с установкой программы 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

 

Программы DS DOS

Куплю платы, наборы микросхем 2716, 2732, 2764, 27128, 27256, 27512, 27c010, 27c801 на Орион-128, КР565РУ5В, КР565ру7В, к565ру5г AU, к565ру7г Au в позолоте, куплю микросхемы фирмы NEC, Intel, Oki

 

Полезные и интересные статьи

На предыдущую страницу  На главную страницу  На следующую страницу