Радио-86РК/Радио 09-90/Экранный генератор BEST/Таблица 4

Материал из Emuverse
Версия от 17:01, 5 декабря 2008; Panther (обсуждение | вклад) (http://retro.h1.ru/RK86/Best/RBstTbl4.txt)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: А. СОРОКИН

Источник: http://retro.h1.ru/RK86/Best/RBstTbl4.txt

				Таблица 4
SCRN:	EQU 077C2	;адрес левого верхнего угла экр. Подпрограмма адресации курсора - POST
			;Входные данные:
			;D - Y координата Е - X координата
			;Выходные данные: нет
POST:	PUSH H 		;ЗАПОМНИТЬ ЗНАЧЕНИЕ HL
	LXI H, PST+2	;HL <- АДРЕС ЗАПИСИ КООРД.
	MOV A, D 	; ЗАПИСАТЬ КООРДИНАТУ
 	ADI 20Н 	;Y В СООТВЕТСТВИИ С ФОР-
	MOV H, A 	;МАТОМ ДИРЕКТИВЫ МОНИТОРА.
	INX H 		;АДРЕС ЗАПИСИ СЛЕД. КООРД.
	MOV А,Е 	;ЗАПИСЬ КООРДИНАТЫ X
 	adi гон
	MOV H,A
	LXI H,PST 	; ЗАПУСК ДИРЕКТИВЫ МОНИТОРА 
	CALL OF818H 	;ВЫВОДА СООБЩЕНИЯ НА ЭКРАН. 
	POP H 		;ВОССТАНОВИТЬ ЗНАЧЕНИЕ HL 
	RET 
PST:	DB 1BH, 59Н, О, О, О
;ПОДПРОГРАММА ПЕРЕМЕЩЕНИЯ ОКНА ЭКРАНА С ЗАДАННЫМ РАЗМЕРОМ - SDVIG 
;ВХОДНЫЕ ДАННЫЕ:
;		ХВ, YB - КООРДИНАТЫ X, Y ВЕРХНЕГО ЛЕВОГО УГЛА ОКНА.
;		XN,YN - КООРДИНАТЫ X, Y НИЖНЕГО ПРАВОГО УГЛА ОКНА.
;		Н(ТОР),М(ТОР*11 - КООРДИНАТЫ X,Y ВЕРХНЕГО ЛЕВОГО УГЛА КОПИИ ОКНА.
;		Н(ВОТТ),М(ВОТТ+1) - КООРДИНАТЫ X, Y НИЖНЕГО ПРАВОГО УГЛА КОПИИ ОКНА.
;ВЫХОДНЫЕ ДАННЫЕ: НЕТ.
;ИСПОЛЬЗУЕМЫЕ ПОДПРОГРАММЫ: HLM. INSTAL. ADR
;ДЛЯ ПЕРЕСЫЛКИ ОКНА ТЕКСТА , НЕ СТИРАЯ ПОД СОБОЙ ИЗОБРАЖЕНИЕ ЭКРАНА. ПОЛЬЗУЮТСЯ АЛГОРИТМОМ:
	MVI A, OFFH
	STA PERES+1
	CALL PERES 
L:	.... 		;ВВОД ДАННЫХ ДЛЯ ПОДПРОГРАММЫ
	CALL SDVIG
	XRA A
	STA PERES+1 
	CALL PERES 
	JMP L
;-AYS- 11.09.89
SDVIG:	PUSH D 		;ЗАПОМНИТЬ DE
	LHLD XN 	;B HL КООРД. НИЖН. ЛЕВОГО УГЛА
	CALL ADR 	;ВЫЧИСЛИТЬ АДРЕС ПО КООРД.
	XCHG 		;И В DE
	LHLD BOTT 	;В HL КООРД. НИЖН. ЛЕВОГО УГЛА
	CALL ADR 	; ОБРАЗА ОКНА И ВЫЧИСЛИТЬ АДРЕС
	CALL HLM1 	;ЕСЛИ АДРЕСА НЕ ПЕРЕКРЫВАЮТСЯ.
	JM FORTH 	;TO КОПИРОВАТЬ С НАЧАЛА.
; -- . -- -КОПИРОВАНИЕ ОКНА С КОНЦА.
	MVI A, OFFH 	;В KOD ПРИЗНАК КОПИРОВАНИЯ С
	STA KOD 	; КОНЦА И ВЫПОЛНИТЬ ПОДПРОГР.
	CALL INSTAL 	;ЗАГРУЗКИ НАЧАЛЬНЫХ ЗНАЧЕНИИ.
	XCHG 		;ПЕРЕД ПЕРЕСЫЛКОЙ ОКНА:
LY:	PUSH H 		;HL-АДР. ОКНА. DE-АДР. КОПИИ
	PUSH D 		; ЗАПОМНИМ АДРЕСА
	LDA KOD 	;B В - КОЛИЧЕСТВО СТРОК
	MOV С, А 	;В С - ДЛИНА СТРОКИ
LX:	MOV А, И	;ПЕРЕСЫЛАЕМ НАЧИНАЯ СО СТАР-
	STAX D 		;ШЕГО АДРЕСА К МЛАДШЕМУ ВО
	DCX D 		; ИЗБЕЖАНИЯ ПОТЕРИ
	DCX H 		;ДАННЫХ.
	DCR С 		; ВЫПОЛНЯТЬ, ПОКА НЕ КОНЧИЛАСЬ
 	JP LX 		; СТРОКА.
	DCR В 		;ЕСЛИ ПЕРЕСЛАЛИ ПОСЛЕДИ.
	JM KON 		; СТОКУ, ТО НА КОНЕЦ.
	POP H 		;ВЫЧИСЛИМ АДРЕС НОВОЙ СТРОКИ
	CALL HLM 	;OKHA И ЗАПОМНИМ ЕГО.
	SHLD ADRK 	; ВЫЧИСЛИМ АДРЕС НОВОЙ СТРОКИ POP Н ; КОПИИ ОКНА И
	CALL HLM 	;РАЗМЕСТИМ ПОЛУЧЕННЫЕ
	XCHG 		;АДРЕСА В 
	LHLD ADRK 	; РЕГИСТРАХ. 
	XCHG 		;ДАЛЕЕ ПЕРЕСЫЛКА СТРОК.
	JMP LY
;--------КОПИРОВАНИЕ ОКНА С НАЧАЛА.
FORTH:	XRA A 		;B KOD ПРИЗНАК КОПИРОВАНИЯ С
	STA KOD 	;НАЧАЛА И ВЫПОЛНИТЬ ПОДПРОГР.
	CALL INSTAL 	;ЗАГРУЗКИ НАЧАЛЬНЫХ ЗНАЧЕНИИ.
	PUSH H 		;ПЕРЕД ПЕРЕСЫЛКОЙ ОКНА:
	LHLD XB 	;HL-АДР. ОКНА
	CALL ADR 	;DE-АДР. КОПИИ
	POP D 		;
LYF:	PUSH H 		;ЗАПОМНИМ
	PUSH D 		; АДРЕСА
	LDA KOD 	;B В - КОЛИЧЕСТВО СТРОК
	MOV С, A 	;B С - ДЛИНА СТРОКИ
LXF:	MOV A, M	; ПЕРЕСЫЛАЕМ НАЧИНАЯ
	STAX D 		;C МЛАДШЕГО
	INX D 		;АДРЕСА К
	INX H 		; СТАРШЕМУ.
	DCR С 		;ВЫПОЛНЯТЬ, ПОКА НЕ КОНЧИЛАСЬ
 	JP LXF 		;cTPOKA*. 
	DCR В 		;ЕСЛИ ПЕРЕСЛАЛИ ПОСЛЕДИ.
	JM КОN 		;СТОКУ. ТО НА КОНЕЦ.
	POP H 		;УВЕЛИЧИТЬ АДРЕСА
	LXI D, 78 	;OKHA И
	DAD D 		;КОПИЙ НА 76.
	SHLD ADRK 	;
	POP H 		; РАЗМЕСТИМ
	DAD D 		; ПОЛУЧЕННЫЕ
	XCHG 		; АДРЕС А
	LHLD ADRK 	;B
	XCHG 		; РЕГИСТРАХ.
	JMP LYF 	;ДАЛЕЕ ПЕРЕСЫЛКА СТРОК.
KON:	POP D 		;СНИМАЕМ СО СТЕКА
	POP D 		; АДРЕС
	POP D 		; ВОЗВРАТА.
	RET
; ПОДПРОГРАММА ВЫЧИСЛЕНИЯ HL=HL-DE i
HLM:	LXI D, 78 	;В DE ДЛИНУ СТРОКИ = 78
HLM1:	MOV A,L 	;HLM1 - ТОЧКА ВХОЛА
	SUB Е 		;ДЛЯ ВЫЧИСЛЕНИЯ
	MOV L,A 	;ПРОИЗВОЛЬНЫХ HL И DE.
	MOV A, H 	;
	SBB D 		;
	MOV H, A 	;
	RET
; ПОДПРОГРАММА ЗАГРУЗКИ НАЧАЛЬНЫХ ЗНАЧЕНИИ i
INSTAL:	LHLD BOTT 	;В HL - НАЧАЛЬНЫЕ
	LDA KOD 	; КООРДИНАТЫ ПЕРЕСЫЛКИ
	ORA A 		;B ОКНЕ. ( ОПРЕДЕЛЯЕМ ПО
	JNZ INS1 	; ПРИЗНАКУ КОПИРОВАНИЯ )
	LHLD TOP 	;
INS1:	CALL ADR 	;ВЫЧИСЛЯЕМ АДРЕС КООРДИНАТ.
	LDA XB 		;ВЫЧИСЛЯЕМ
	MOV B, A 	; КОЛИЧЕСТВО
	LDA XN 		;СТРОК В
	SUB В 		;OKHE И ПОМЕШАЕМ
	STA KOD 	;B РЕГИСТР В.
	LDA YB 		;ВЫЧИСЛЯЕМ
	MOV B, A 	; КОЛИЧЕСТВО
	LDA YN 		; СТРОК В
	SUB В 		;OKHE И ПОМЕШАЕМ
	MOV В, A 	;B РЕГИСТР В.
	RET
; _ __ _______
;ПОДПРОГРАММА ВЫЧИСЛЕНИЯ АДРЕСА, В ЭКРАННОЙ ОБЛАСТИ, СООТБЕТСТВУШЕГО КООРДИНАТАМ.
;ВХОДНЫЕ ДАННЫЕ:
;		Н - Y КООРДИНАТА L - X КООРДИНАТА
;ВЫХОДНЫЕ ДАННЫЕ: HL - АДРЕС
ADR:	PUSH D 		;ЗАПОМНИТЬ 
	PUSH В 		;РЕГИСТРЫ 
	MOV С, L 	;ВС КООРДИНАТУ X 
	MOV А, Н 	;В А КООРДИНАТУ Y 
	LXI D, 78 	;В DE ДЛИНУ СТРОКИ 
	LXI H, 0 	;ВЫЧИСЛЕНИЕ
S1:	ORA А 		;АДРЕСА ПО
	JZ PROD 	;ФОРМУЛЕ:
	RAR 		;АДРЕС:78"Y
	JNC 32
	DAD D
S2:	xchg
	DAD H 		;
	XCHG 		;
	JMP S1
PROD:	XCHG 		;
	LXI H, SCRN 	; ЗАГРУЗИТЬ АДРЕС
	DAD D 		; КООРДИНАТ О. 0.
	MVI В, О 	; СЛОЖИТЬ С АДРЕСОМ НАЧАЛА
	DAD В 		;И ПРИБАВИТЬ X
	POP В 		; ВОССТАНОВИТЬ
	POP О 		;РЕГИСТРЫ.
	RET
;ПОДПРОГРАММА ПЕРЕСЫЛКИ ЭКРАНА
;ВХОДНЫЕ ДАННЫЕ: ПО МРЕСУ PERES+1 ЗАСЛАТЬ:
;	OFFH ЭКРАН --> ПАМЯТЬ ООН ЭКРАН <-- ПАМЯТЬ 
;ВЫХОДНЫЕ ДАННЫЕ: НЕТ
feres:	mvi а,0
	LXI H, 08D61H 	;HL - АДРЕС ПЕРЕСЫЛКИ ЭКРАНА
	LXI D, SCRN 	;DE - АДРЕС ЭКРАНА
	LXI В,1950 	;ВС - РАЗМЕР ЭКРАНА
	ANA A
	JZ ТЗ 		;ОБМЕНЯТЬ АДРЕСА, ЕСЛИ ;
	XCHG 		;ПЕРЕСЫЛКА В ПАМЯТЬ.
ТЗ:	MOV А, Н 	;ПИК/1
	STAX D 		;ПЕРЕСЫЛКИ.
	INX Н
	INX D
	DCX В
	MOV А, В
	ORA С
	JNZ ТЗ 
	RET 

KOD:	DS 1 
ХВ:	DS 1 
УВ:	ds 1 
XN:	DS 1
УN:	DS 1
top:	ds 1
BOOT:	ds 1