;*************************************************************
;*			    MONKOR                           *
;*-----------------------------------------------------------*
;		 Программа для прошивки в ПЗУ
;
;	Позволяет проверять клавиатуру, память с 4000 по FFFF,
;изменять   содержимое   памяти   и   регистров,   также  можно
;осуществлять переход по любому  адресу  с  возвратом  в  любой
;точке. 
;*************************************************************
;
;	Общая идея: проверяется видеопамять, если нормально,
;то последняя строка экрана используется для хранения констант
;и организации стека; ОЗУ не используется
;*************************************************************
;
;	      Некоторые определения и константы
;*************************************************************
SHFT	EQU	0	;константа сдвига для настройки
			;на необходимую карту памяти
SMEM	EQU	3FC9H+SHFT	;начало тестируемой памяти
SISREG	EQU	3A7FH+SHFT	;системный регистр
TRS80	EQU	0
ROMB2	EQU	20H
LUT	EQU	3AFBH+SHFT	;арес LUT таблицы
PIA0	EQU	3B30H		;регистр данных принтера
PIA1	EQU	3B38H+SHFT	;регистр атрибута видеоинверсии
PIA0D	EQU	82H
PIA1D	EQU	90H
PIA0A	EQU	0
PIA0C	EQU	41H
PIA1B	EQU	0
PIA1C	EQU	0A3H
EKRAN	EQU	3C00H+SHFT	;начало видеопамяти
KB	EQU	3800H+SHFT	;клавиатура
COLOR	EQU	3ABFH+SHFT	;регистр цвета
CLR01	EQU	1DH	;слой # 0, запись, чтение
CLR11	EQU	2BH	;слой # 1, запись, чтение
CLR21	EQU	47H	;слой # 2, запись, чтение
;	3C0	начало 16 строки экрана
;	3C0 	храним байт нажатой клавиши
;	3C1	храним код символа под курсором
;	3C2,3C3	адрес положения курсора
;	3C4,3C5	адрес возврата при команде JUMP
;	3C6,3C7	адрес начала памяти для просмотра и модификации
;	3C8	храним содержимое адреса возврата
;	3CB	храним номер слоя
;	3CD	храним номер страницы
;
;***************************************************
;	Инициализация и проверка видеопамяти
;если память неисправна, то программа зацикливается
;***************************************************

START:	DI
INCOL:	MVI	A,0
;***********************************************************
;	STA	0FA7FH	;при подготовке программы к прошивке
;			;эту строку убрать
;************************************************************
			;LUT таблица
LP100:	STA	LUT	;
	INR	A	; 00 01 02 03
	CPI	8	; 
 	JNZ	LP100	; 04 05 06 07
	ORI	0F0H	; 
LP101:	STA	LUT	; F8 F9 FA FB
	INR	A	; 
 	JNZ	LP101	; FC FD FE FF
INIT:	MVI	A,PIA1D		;INIT 55
	STA	PIA1+3
	MVI	A,PIA1C		;INIT VIDEO
	STA	PIA1+2
	LDA	PIA1+2
	CPI	PIA1C
	JZ	CS		;TEST 55
	LDA	KB+40H		;опрос клавиатуры
	CPI	4
	JNZ	INIT		;IF NO STOP,INIT
	MVI	A,PIA0D
	STA	PIA0+3
	LDA	PIA0C
	STA	PIA0+2
CS:	LXI	H,EKRAN
LOOPCS:	MVI	A,20H
	MOV	M,A
	INX	H
	MOV	A,H
	CPI	LOW(HIGH(EKRAN)+4)
	JNZ	LOOPCS	;CLS
TESTVD:	LDA	EKRAN+3FFH
	CPI	20H
	JNZ	CS		;IF NO 20H CLS
	MVI	A,65
	STA	EKRAN
CS1:	XRA	A
	STA	EKRAN+3FFH
CS2:	MVI	A,255
	STA	EKRAN+3FEH
	LDA	EKRAN+3FFH
	ORA	A
	JNZ	CS1
	MVI	A,66
	STA	EKRAN+1
	LDA	EKRAN+3FEH
	CPI	255
	JNZ	CS2
;
;*******************************************************
;	Основное тело программы
;*******************************************************
;
MON:	LXI	SP,EKRAN+3FFH	;настройка стека
	MVI	A,1FH	;очистка
	CALL	DISP	;экрана
;*************************************************
;	Модуль RET
;печатает на экране содержимое регистров на входе
;(PC) равно (3C4,3C5)
;*************************************************
RET:	PUSH	H
	LHLD	EKRAN+3C4H
	XTHL		;(SP)<--(EKRAN+3C4H)
	PUSH	H	;HL = (EKRAN+3FF)
	PUSH	PSW
	LXI	H,06
	DAD	SP
	POP	PSW
	XTHL		;(SP) <-- (SP+6) HL = (EKRAN+3FF)
	PUSH	H	;HL
	PUSH	D	;DE
	PUSH	B	;BC
	PUSH	PSW	;AF
	MVI	A,1FH	;CLS
	CALL	DISP
	LHLD	EKRAN+3C4H
	LDA	EKRAN+3C8H	;COD RETURN
	MOV	M,A	;восстанавливаем код вместо RET
	CALL	MEMD	;отображаем память
	MVI	B,6
	LXI	H,AFR	;адрес буфера с названием регистров
LOOPR:	CALL TEXT
	INX	HL
	POP	D
	CALL	PDEHEX	;отображаем содержимое регистров
	DCR	B
	JNZ	LOOPR
	CALL	CUROFF
;
;*******************************************************
;	Модуль команд
;
;*******************************************************

COM:	CALL	KEYIN
COM1:	CPI	'P'
	JZ	PRINT	;P - команда PRINT
	CPI	'D'
	JZ	DISPM	;D - команда просмотр памяти
	CPI	'M'
	JZ	MODMEM 	;M - команда модификации памяти
	CPI	'J'
	JZ	JUMP	;J - команда JUMP на адрес
	CPI	'R'
	JZ	MODREG	;R - команда модификация регистров
	CPI	';'
	JZ	PLUS	;+ - листать страницу памяти вперед
	CPI	'-'
	JZ	MINUS	;- - листать страницу памяти назад
	CPI	'T'
	JZ	MTEST	;T - тест памяти ОЗУ
	CPI	'G'	
	JZ	GRAF	;G - тест ГЗУ
	JMP	COM
;
;*******************************************************
;
;	Подпрограммы
;
;*******************************************************
TEXT:	MOV	A,M	;START OF BUFFER
	ORA	A
	RZ		;RETURN IF "0"
	CALL	DISP
	INX	H	
	JMP	TEXT	;NEXT SYMBOL
;
;*******************************************************
;	Команда "P"
;*******************************************************
;
PRINT:	MVI	A,1FH
	CALL	DISP
PRINT1:	CALL	KEYIN
	CPI	01
	JZ	RET
	CALL	DISP
	JMP	PRINT1
;
;*******************************************************
;	Драйвер клавиатуры
;Сохраняет регистры BC, DE, HL
;Ждет нажатия клавиши. Выход: А - АSCII код клавиши
;*******************************************************
;
KEYIN:	PUSH	D
	PUSH	H
	PUSH	B
LOOP1:	MVI	B,0
	LXI	H,KB+1
LOOP2:	MOV	A,M	;READY START
	ORA	A
	JNZ	PRESS	;OUT
	MOV	A,B
	ADI	8
	MOV	B,A
	MOV	A,L
	ADD	L
	MOV	L,A
	CPI	80H
	JNZ	LOOP2
	JMP	LOOP1
PRESS:	STA	EKRAN+3C0H
LOOP3:	RAR
	JC	ADRESS	;KOD
	INR	B
	JMP	LOOP3
ADRESS:	MOV	A,B
	CPI	1FH
	JNC	NOAZ
	ADI	40H	;YES A-Z
	JMP	OUT
NOAZ:	CPI	30H
	JC	NOSLSY	;0-/;
	LXI	D,CODE-30H
	ADD	E
	MOV	E,A
	JNC	CARRY
	INR	D
CARRY:	LDAX	D
	JMP	OUT
NOSLSY:	ADI	10H
	MOV	C,A
	LXI	D,KB+80H
	LDAX	D	;SHIFT?
	ORA	A
	MOV	A,C
	JNZ	SHIFT
	CPI	3CH
	JC	OUT
	SUI	10H
	JMP	OUT
SHIFT:	CPI	3CH
	JNC	OUT
	SUI	10H
OUT:	MOV	C,A
	CALL	DELAY
	LDA	EKRAN+3C0H
	MOV	B,A
LOOP4:	MOV	A,M
	CMP	B
	JZ	LOOP4
	CALL	DELAY
	MOV	A,C
	POP	B
	POP	H
	POP	D
	RET
DELAY:	LXI	D,1000H
DELAY1:	DCX	D
	MOV	A,D
	ANA	A
	RZ
	JMP	DELAY1
CODE:	DB	0DH	;<CR>
	DB	1FH	;<CLS>
	DB	01H	;^C
	DB	1BH	;<DEL> - курсор вверх
	DB	0AH	;<INS> - курсор вниз
	DB	08H	;<--   - курсор влево
	DB	09H	;<TАB> - курсор вправо
	DB	20H	;пробел
;
;***********************************************************
;	Драйвер дисплея
;Сохраняет регистры PSW, BC, DE, HL
;Вход: А - код символа; управляющие символы - см. буфер CODE:
;Печатает символ в позиции (3C2) и (3C2) <-- (3C2)+1
;************************************************************
;
DISP:	PUSH	B
	PUSH	H
	PUSH	PSW
	MOV	C,A
	CALL	CUROFF
	MOV	A,C
	CPI	1FH
	JZ	CLS
	CPI	0DH
	JZ	ENTER
	CPI	01
	JZ	OUTD	;BREAK
	CPI	1BH
	JZ	UP
	CPI	0AH
	JZ	DOWN
	CPI	08H
	JZ	LEFT
	CPI	09H
	JZ	RIGHT
	MOV	M,C	;печать символа
RIGHT:	INX	H
OUTD1:	PUSH	H
	LXI	B,0FFFFH-EKRAN-3FFH+40H
	DAD	B
	POP	H
	JNC	OUTD
	LXI	B,0FFFFH-380H+1
	DAD	B
OUTD:	CALL	CURON
	POP	PSW
	POP	H
	POP	B
	RET
;
;
CLS:	LXI	H,EKRAN
	LXI	B,3C0H
LOOPD1:	MVI	M,20H
	INX	H
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	LOOPD1
	LXI	H,EKRAN
	JMP	OUTD
ENTER:	MVI	A,0C0H
	ANA	L
	MOV	L,A
DOWN:	LXI	B,40H
	DAD	B
	JMP	OUTD1
UP:	LXI	B,0FFC0H
	DAD	B
MORE:	MOV	A,H
	CPI	HIGH(EKRAN)-1
	JNZ	OUTD
	LXI	BC,3C0H
	DAD	B
	JMP	OUTD
LEFT:	DCX	H
	JMP	MORE
;
;
CUROFF:	LHLD	EKRAN+03C2H
	LDA	EKRAN+03C1H
	MOV	M,A
	RET
;
;
CURON:	SHLD	EKRAN+3C2H
	MOV	A,M
	STA	EKRAN+3C1H
	MVI	M,08FH
	RET
;
;*****************************************************
;	Модуль PDEHEX
;Печатает на экране с адреса (3C2) содержимое DE в
;HEX-формате, т.е. 4 символа
;*****************************************************
PDEHEX:	MOV	A,D
	CALL	PHEX
	MOV	A,E
;
PHEX:	PUSH	PSW
	RRC
	RRC
	RRC
	RRC
	CALL	HEX2
	POP	PSW
HEX2:	ANI	0FH
	ADI	30H
	CPI	3AH
	JC	DISPL
	ADI	7
DISPL:	CALL	DISP
	RET
;
;*******************************************************
;	Модуль MEMD
;Выводит содержимое памяти на экран в HEX-формате и
;АSCII кодах с адреса (3C6,3C7). 8 строк по 16 байт = 128
;********************************************************
;
MEMD:	LHLD	EKRAN+3C6H
	XCHG	
	MOV	A,E
	ANI	0F0H
	MOV	E,A
MEM:	MVI	B,8	;счетчик на 8 строк
LOOPM:	LHLD	EKRAN+3C2H
	MOV	A,L	;сдвиг для вывода
	ADI	2FH	;АSCII кодов
	MOV	L,A
	CALL	PDEHEX
	MVI	A,20H
	CALL	DISP
LOOPM1:	MVI	A,20H
	CALL	DISP
	LDAX	D
	MOV	M,A	;засылка АSCII кода
	INX	H
	CALL	PHEX	;печать 1 байта в HEX-формате
	INX	D
	LDAX	D
	MOV	M,A
	INX	H
	CALL	PHEX	;печать 2 байта в HEX-формате
	INX	D
	MVI	A,0FH
	ANA	E
	JNZ	LOOPM1
	MVI	A,0DH
	CALL	DISP
	DCR	B	;
	JNZ	LOOPM
	CALL	CUROFF
	RET
AFR:	DW	0D0DH
	DB	' AF:'
	DB	0
	DB	' BC:'
	DB	0
DER:	DB	' DE:'
	DB	0
HLR:	DB	' HL:'
	DB	0
SPR:	DB	' SP:'
	DB	0
CPR:	DB	' PC:'
	DB	0

;
;***************************************************
;	Команда "D"
;***************************************************
;
DISPM:	CALL	ADDRIN
	CPI	8FH	;SPASE?
	JNZ	RPD	;IFNO,OLD
	MOV	A,B
	CPI	4
	JNZ	RPD
	SHLD	EKRAN+3C6H	;NEW	ADDR
RPD:	LXI	H,EKRAN		;3C00H
	SHLD	EKRAN+3C2H
	CALL	MEMD
	CALL	CMCLR
	JMP	COM
;
;***************************************************
;	Команда "+"
;***************************************************
;
PLUS:	LHLD	EKRAN+3C6H
	LXI	D,80H
	DAD	D
	SHLD	EKRAN+3C6H
	JMP	RPD
;
;***************************************************
;	Команда "-"
;***************************************************
;
MINUS:	LHLD	EKRAN+3C6H
	LXI	D,0FF80H
	DAD	D
	SHLD	EKRAN+3C6H
	JMP	RPD
;
;**************************************************
;
ADDRIN:	LXI	H,EKRAN+300H
	SHLD	EKRAN+3C2H	;CURS
	CALL	DISP
	LXI	H,ADDR
	CALL	TEXT
IN:	CALL	KEYIN
	CPI	0DH	;ENTER?
	JZ	LOAD
	CALL	DISP
	JMP	IN
LOAD:	LXI	D,EKRAN+30BH
	CALL	IDEHEX
	RET
ADDR:	DB	' ADDRESS? '
	DB	0
;
;
CMCLR:	LXI	H,EKRAN+300H
CTCLR:	MVI	B,40H
NCLEAR:	MVI	A,20H
LOOPNC:	MOV	M,A	;CLEAR
	INX	H
	DCR	B	;ALL?
	JNZ	LOOPNC
	RET
;
;*****************************************************
;	Модуль IDEHEX
;Вход: DE - адрес видеопамяти с HEX-форматом
;Выход: HL - 2 байта, переведенные из HEX-формата
;	DE - смещен не +4
;	B  - число прочитанных байт
;	А  - АSCII код байта по адресу (DE)
;Если не HEX-формат, то выход
;******************************************************
;
IDEHEX:	MVI	B,0
IDEH1:	LDAX	D
	CPI	30H	;IF<0
	RC		;RET
	CPI	3AH	;IF0<X<9
	JC	STRIP
	CPI	41H	;IF9<X<A
	RC	
	CPI	47H
	RNC		;IF>F
	SUI	7
STRIP:	INR	B
	INX	D
	ANI	15
	DAD	H
	DAD	H
	DAD	H
	DAD	H
	ADD	L
	MOV	L,A
	JNC	IDEH1
	INR	H
	JMP	IDEH1
;
;***************************************************
;	Команда "М"
;***************************************************
;
MODMEM:	LXI	H,EKRAN+06H	;START
NEXTCT:	CALL	CURON
CHANGE:	CALL	KEYIN
	CPI	1
	JZ	OUTMD
	CPI	0DH
	JZ	OUTMD1
	CPI	20H
	JNZ	DONE
	MVI	A,9
DONE:	CALL	DISP
	MOV	B,A
	LDA	EKRAN+3C1H
	CPI	20H
	JNZ	CHANGE
	MOV	A,B
	CPI	8
	JZ	PRYG
	MVI	A,9
PRYG:	CALL	DISP
	LHLD	EKRAN+3C2H	
	MOV	A,L
	ADI	12H
	ANI	3FH
	JNZ	WHERE
	MVI	B,18H
	CALL	TABUL
WHERE:	LHLD	EKRAN+3C2H	
	MOV	A,H
	CPI	3EH
	JNZ	CHANGE
	MVI	A,1BH
	CALL	DISP
	JMP	CHANGE
;
OUTMD1:	LHLD	EKRAN+3C2H	
	LDA	EKRAN+3C1H
	MOV	M,A
	LXI	D,EKRAN+06H
	LHLD	EKRAN+3C6H	;START	ADDRESS
	MVI	A,0F0H
	ANA	L
	MOV	L,A
	MVI	C,88H
LOOPOM:	PUSH	H
	CALL	IDEHEX
	CPI	20H
	JNZ	OUTMD
	MOV	A,B
	CPI	4
	JNZ	OUTMD
	INX	D
	MOV	A,H
	MOV	B,L
	POP	H
	MOV	M,A
	INX	H
	MOV	M,B
	INX	H
	DCR	C
	MVI	A,0FH
	ANA	C
	JNZ	LOOPOM
	PUSH	H
	LXI	H,18H
	DAD	D
	XCHG	
	POP	H
	MOV	A,C
	SUI	8
	MOV	C,A
	ANI	0F0H
	JNZ	LOOPOM
OUTMD:	JMP	RPD
;
;
TABUL:	MVI	A,9
	CALL	DISP
	DCR	B
	JNZ	TABUL
	RET
;
;********************************************************
;	Команда "R"
;Изменяет содержимое регистров только на экране
;********************************************************
;
MODREG:	LXI	H,EKRAN+284H
	MOV	A,M
	CPI	20H
	JZ	RET
	CALL	CURON
CHANGR:	CALL	KEYIN
	CPI	0DH
	JZ	OUTMR
	CPI	9
	MVI	B,7
	CZ	TABUL
	CPI	20H
	JNZ	DO
	MVI	A,9
DO:	CALL	DISP
	LDA	EKRAN+3C1H
	CPI	20H
	JNZ	CHANGR
	MVI	B,4
	CALL	TABUL
	JMP	CHANGR
OUTMR:	LHLD	EKRAN+3C2H	
	LDA	EKRAN+3C1H
	MOV	M,A
	JMP	COM
;
;***************************************************
;	Команда "J"
;Имеет 2 типа: "Адрес" и "Адрес1,Адрес2"
;В 1 случае управление передается по адресу "Адрес"
;В 2 случае по адресу "Адрес1", по адресу "Адрес2"
;происходит выход и управление передается данной
;программе
;****************************************************
;
JUMP:	CALL	ADDRIN
	CPI	8FH
	JZ	JMP
	CPI	','
	JZ	CALL
OUTMES:	CALL	CMCLR
	JMP	COM
OUTMS1:	POP	H
	JMP	OUTMES
JMP:	CALL	JMP1
	JMP	OUTJP
JMP1:	MOV	A,B
	ORA	A
	RZ
	CPI	4
	JNZ	OUTMS1
	XCHG	
	LXI	H,EKRAN+2ACH	;настройка на PC на экране
	SHLD	EKRAN+3C2H	
	JMP	PDEHEX
CALL:	INX	D
	PUSH	D
	CALL	JMP1	;изменяет PC на экране
	POP	D
	CALL	IDEHEX	;анализ 2 адреса
	CPI	8FH
	JNZ	OUTMES
	MOV	A,B
	CPI	4
	JNZ	OUTMES
	MOV	A,M
	STA	EKRAN+3C8H	;(3C8)-содержимое памяти
				;по адресу возврата
	MVI	A,0C9H	;код RET
	MOV	M,A	;по адресу возврата кладется RET
	SHLD	EKRAN+3C4H	;запоминаем адрес возврата
	LXI	H,RET
	PUSH	H
;**********************************************************
;	Модуль OUTJP
;Считывает инфомацию о регистрах с экрана и засылает в стек
;На выходе устанавливает новые значения регистров из стека
;***********************************************************
;
OUTJP:	MVI	C,6
	CALL	CUROFF
	LXI	D,EKRAN+2ACH
OUTJP1:	CALL	IDEHEX
	CPI	20H
	JNZ	OUTMES
	MOV	A,B
	CPI	4
	JNZ	OUTMES
	PUSH	H
	MOV	A,E
	SUI	12
	MOV	E,A
	DCR	C
	JNZ	OUTJP1
	POP	PSW	;изменили регистры
	POP	B
	POP	D
	POP	H
	XTHL
	POP	H
	RET		;JUMP по содержимому стека
;
;******************************************************
;	Команда "T"
;******************************************************
;
MTEST:	MVI	A,1FH
	CALL	DISP
;	LXI	D,0
;	PUSH	D		;COUNT CICLE
MAIN:	CALL	TOP	;TOP OF SEARCH
;
	PUSH	D
LOOPMT:	MVI	A,1FH
	CALL	DISP
	POP	D
	CALL	PDEHEX
	DCX	D
	PUSH	D
	MOV	A,D
	CMP	E
	JNZ	LPT1
	CPI	0FFH
	JZ	EXIT
LPT1:	LXI	D,1
	CALL	WR
	LXI	D,2
	CALL	WR
	LXI	D,0FF00H
	CALL	WR
	LXI	D,1
	CALL	RD
	LXI	D,0FF01H
	CALL	WR
	LXI	D,2
	CALL	RD
	LXI	D,0FF00H
	CALL	RD
	LXI	D,0FF01H
	CALL	RD
	LXI	D,0
	CALL	WR
	CALL	RD
	LXI	D,0FF02H
	CALL	WR
	CALL	RD
	LDA	KB+40H
	CPI	4
	JNZ	LOOPMT
	JMP	MTEST
;
;
WR:	LHLD	SMEM
	MOV	A,E
	ADD	L
	MOV	L,A
	MOV	A,H
	ACI	0
	MOV	H,A
WLP:	MOV	M,D	;запись
	INX	H
	MOV	A,H
	CPI	0
	RZ
	INX	H
	MOV	A,H
	CPI	0
	RZ
	INX	H
	MOV	A,H
	CPI	0
	RZ
	MOV	A,C
	SUB	L
	MOV	A,B
	SBB	H
	RC	
	JMP	WLP
;
;
;
RD:	LHLD	SMEM
	MOV	A,E
	ADD	L
	MOV	L,A
	MOV	A,H
	ACI	00H
	MOV	H,A
RLP:	MOV	A,M
	CMP	D
	CNZ	ERR
	INX	H
	MOV	A,H
	CPI	0
	RZ
	INX	H
	MOV	A,H
	CPI	0
	RZ
	INX	H
	MOV	A,H
	CPI	0
	RZ
	MOV	A,C
	SUB	L
	MOV	A,B
	SBB	H
	RC	
	JMP	RLP
;
;**********************************************************
;	Команда "G"
;**********************************************************
;
GRAF:	MVI	A,1FH
	CALL	DISP	;очистка экрана
	MVI	A,0
	STA	LUT
	MVI	A,91H
GRAF0:	STA	LUT	;LUT - таблица
	ADI	11H	;
	CPI	8	; 00 91 A2 B3
	JNZ	GRAF0	;
	MVI	A,0F8H	; C4 D5 E6 F7
GRAF1:	STA	LUT	;
	INR	A	; F8 F9 FA FB
	CPI	0	;
	JNZ	GRAF1	; FC FD FE FF
	MVI	A,ROMB2
	STA	SISREG
	CALL	TOP
	PUSH	D
GR0:	MVI	A,1FH
	CALL	DISP
	POP	D
	CALL	PDEHEX
	CALL	CUROFF
	DCX	D
	PUSH	D
	MOV	A,D
	CMP	E
	JNZ	GR10
	CPI	0FFH
	JZ	EXIT1
GR10:	LXI	H,EKRAN+3CDH
	MVI	A,30H
	MOV	M,A
	MVI	A,20H
	STA	PIA1+2
GR00:	PUSH	B
	CALL	CMCLR
	POP	B
	LXI	H,EKRAN+10H
	SHLD	EKRAN+3C2H
	LXI	H,BGR0
	CALL	TEXT
	LXI	H,EKRAN+3CDH
	MOV	A,M
	CALL	DISP
	CALL	CUROFF	;
GR1:	MVI	E,0
	MVI	A,CLR01
	LXI	H,EKRAN+3CBH
	MOV	M,A
GR2:	MVI	D,0FFH
	PUSH	B
	CALL	CMCLR	;очистка командной строки
	POP	B
	LXI	H,EKRAN+90H
	SHLD	EKRAN+3C2H
	LXI	H,BGR1	;настройка на буфер текста
	CALL	TEXT
	MVI	A,30H
	ADD	E
	CALL	DISP
	CALL	CUROFF
	LXI	H,EKRAN+3CBH
	MOV	A,M
	STA	COLOR
	PUSH	H
	CALL	WRG
	CALL	RDG
	POP	H
	PUSH	H
	MOV	A,M
	DCR	A
	STA	COLOR
	MVI	D,1
	STC
	CMC
	MOV	A,D
GR5:	MOV	D,A
	JC	GR6
	PUSH	D
	CALL	WRG
	MOV	A,D
	DCR	D
	ORA	D
	CMA
	MOV	D,A
	CALL	RDG
	POP	D
	MOV	A,D
	RLC
	JMP	GR5
GR6:	MOV	A,E
	CPI	0
	JNZ	GR3
	INR	E
	MVI	A,CLR11
	POP	H
	MOV	M,A
	JMP	GR2
GR3:	CPI	1
	JNZ	GR4
	INR	E
	MVI	A,CLR21
	POP	H
	MOV	M,A
	JMP	GR2
GR4:	POP	H
	LXI	H,EKRAN+3CDH
	MOV	A,M
	CPI	30H
	JNZ	GR7
	INR	A
	MOV	M,A
	MVI	A,61H
	STA	PIA1+2
	JMP	GR00
GR7:	CPI	31H
	JNZ	GR8
	INR	A
	MOV	M,A
	MVI	A,0A2H
	STA	PIA1+2
	JMP	GR00
GR8:	CPI	32H
	JNZ	GR9
	INR	A
	MOV	M,A
	MVI	A,0E3H
	STA	PIA1+2
	JMP	GR00
GR9:	LDA	KB+40H
	CPI	4
	JNZ	GR0
EXIT1:	MVI	A,TRS80
	STA	SISREG
	JMP	EXIT
;
;******************************************************
;
WRG:	LHLD	SMEM
WRG1:	MOV	M,D
	INX	H
	MOV	A,H
	CPI	0
	RZ
	MOV	A,C
	SUB	L
	MOV	A,B
	SBB	H
	RC
	JMP	WRG1
;
;*******************************************************
;
RDG:	LHLD	SMEM
RDG1:	MOV	A,M
	CMP	D
	CNZ	ERR1
	INX	H
	MOV	A,H
	CPI	0
	RZ
	MOV	A,C
	SUB	L
	MOV	A,B
	SBB	H
	RC
	JMP	RDG1
;
ERR1:	PUSH	D
	CALL	DELAY
	POP	D
	CALL	ERR
	RET
;
;******************************************************
;
; SUBPROGRAMMES TO PRINT ERROR MESSAGES
;
ERR:	PUSH	D
	PUSH	H
	XCHG	
	CALL	PDEHEX
	MVI	A,' '
	CALL	DISP
	MVI	A,'='
	CALL	DISP
	MVI	A,' '
	CALL	DISP
	LDAX	D
	CALL	PHEX	; PRINT ERRONEUS VALUE
	MVI	A,':'
	CALL	DISP
	MOV	A,H	; OUTPUT DESIRED CODE
	CALL	PHEX
	MVI	A,0DH	; CARRIAGE RETURN
	CALL	DISP
;
	POP	H
	POP	D
LPERR:	LDA	KB+0FFH
	ORA	A
	JZ	LPERR
	RET
;
TOP:	CALL	CMCLR	;CLEAR COMMAND LINE
	MVI	A,'S'
	CALL	ADDRIN
	MOV	A,B
	ORA	A
	JZ	MON	;EXIT WHEN ADDRESS 0000H 
	MOV	A,H
	CPI	HIGH(EKRAN)
	JC	TOP
	SHLD	SMEM
	CALL	CMCLR	;CLEAR COMMAND LINE
	MVI	A,'E'
	CALL	ADDRIN
	PUSH	H
	CALL	CMCLR
	LXI	H,EKRAN+300H
	SHLD	EKRAN+3C2H
	LXI	H,MCICL
	CALL	TEXT
IN1:	CALL	KEYIN
	CPI	0DH
	JZ	LOAD1
	CALL	DISP
	JMP	IN1
LOAD1:	LXI	D,EKRAN+313H
	CALL	IDEHEX
	XCHG
	POP	B
	RET

EXIT:	LXI	H,MSG12
	CALL	TEXT
EX1:	LDA	KB+40H
	CPI	4
	JZ	MON
	JMP	EX1

MCICL:	DB	'NAMBER OF CICLES = ',0
;
BGR0:	DB	'PAGE # ',0
;
BGR1:	DB	'SLOY # ',0
;
MSG12:	DB	'   O.K.'
	DB	00H
;
	END	START
N+313H
	CALL	IDEHEX
	XCHG
	POP	B
	RET

EXIT:	LXI	H,MSG12
	CALL	TEXT
