
BEGIN:	CALL	INIT		; инициализация	программы
	CALL	SINIT		; инициализация	экрана

2:	CALL	TERR		; обработка ошибок измерения
	CALL	TSCAN		; сбор данных
	CALL	TSCREN		; отображение результатов
;	CALL	TSAVE		; демо-режим пишем видео-экран

	CALL	ANALIZ		; анализ состояния и управление

	CALL	LSHIFT		; сдвиг	графического экрана
	CALL	LGRSO		; отображение состояния
	; рисуем график
	MOV	TMEM,R2		; вход
	MOV	#1,R0		; синий
	CALL	LGRAF

	MOV	TMEM+2.,R2	; выход
	MOV	#2,R0		; зеленый
	CALL	LGRAF

	MOV	TMEM+12.,R2	; маленькая комната
	MOV	#3,R0		; красный
	CALL	LGRAF

;	MOV	MTT,R2		; отобразим DTH	- сиреневый
;	MOV	(R2),R2
;	ADD	DTH,R2
;	MOV	#1,R0		; синий
;	COM	TAKT
;	TST	TAKT
;	BNE	3
;	MOV	#3,R0		; красный
;3:	 CALL	 LGRAF


; вывод	состояния -только для отладки
;	MOV	REGMOD,R1	; режим	регулирования
;	CALL	LOCTW
;	MOV	NAGREV,R1	; нагрев
;	CALL	LOCTW
;	MOV	RAZMOR,R1	; разморозка
;	CALL	LOCTW
;	MOV	ERTEMP,R1	; количество ошибок измерения
;	CALL	LOCTW		;


	MTPS	#0

	TST	EXM		; ПРОВЕРИМ НЕ НАЖИМАЛИ ЛИ СТОП
	BEQ	2		; НЕТ -	НЕ НАЖИМАЛИ

	MTPS	#340
	CLR	EXM
	MOV	#600,R0
	MOV	#2000,R1
	CALL	LSOUND
	CALL	SAVSCR
	MTPS	#0
	TST	EXM
	BEQ	2
EXT:	MOV	MRED,@#214	; дефолтный красный цвет
	MOV	MEMSTP,@#4	 ; ВОССТАНОВИМ ОБРАБОТЧИК
	MOV	#233,R0
	EMT	16
	MOV	#232,R0
	EMT	16
	MOV	MEMSP,SP
	HALT

TAKT:	.WORD	0		; ячейка для отсчета тактов
EXM:	.WORD	0		; ЯЧЕЙКА ДЛЯ ХРАНЕНИЯ ПРИЗНАКА
				; НАЖАТИЯ STOP
DEMCLK:	.WORD	0

; демо
TSAVE:	INC	DEMCLK
	CMP	#8.,DEMCLK
	BNE	99
	CALL	SAVSCR
	CLR	DEMCLK
99:	RETURN

; ИНИЦИАЛИЗАЦИЯ	ПРОГРАММЫ
MEMSTP:	.WORD	120000		; СОХРАНЕНИЕ ВЕКТОРА 4
MEMSP:	.WORD	1000		; СОХРАНЕНИЕ УКАЗАТЕЛЯ СТЕКА

INIT:	;EMT14
	CLR	KOMMAD
	MOV	#233,R0
	EMT	16
	MOV	#232,R0
	EMT	16
	MOV	SP,MEMSP
	MOV	@#4,MEMSTP
	MOV	#LSTOP,@#4	; ПОСТАВИМ ОБРАБОТЧИК
	MOV	#340,@#6
	MOV	#TMEM,R0	 ; очистим массив температур
	MOV	#16.,R1
0:	CLR	(R0)+
	SOB	R1,0
	CALL	LSCANT		; R4 МАСКА НАЙДЕННЫХ ДАТЧИКОВ
	MOV	R4,TMASK	; СРХРАНИМ МАСКУ НАЙДЕННЫХ ТМР
	CLR	ERTEMP		; очистим счетчик ошибок
	CLR	CYCLES		; счетчик циклов
	CLR	LIMERR		; счетчик ограничений
	CLR	DEMCLK		; демо-счетчик
	RETURN

; ОБРАБОТКА СТОП
LSTOP:	INC	 EXM
	SUB	 (PC),(SP)
	RTI

; ОБРАБОТКА СОБЫТИЙ
; АНАЛИЗ ЗНАЧЕНИЙ ДАТЧИКОВ
KOMMAD:	 .WORD	0      ;сюда программы пишут слово управления
KOMEND:	 .WORD	0      ;итоговое слово управления
KOMPRV:	 .WORD	0      ;предидущая комманда посланная системе

; КОНТРОЛЬНЫЕ ТОЧКИ
MTS:	.WORD	1.,MT00,50.,MT05,100.,MT10,150.,MT15,200.,MT20
	.WORD	250.,MT25,999.,MT99,71,72

; МАССИВ УПРАВЛЕНИЯ
;		Т3	L1    H2    Z2
;		     L2	   H1	 Z1
MT00:	.WORD	285.,27,25,35,35,25,05,04
MT05:	.WORD	285.,27,25,37,35,25,05,04
MT10:	.WORD	275.,17,07,37,35,25,05,04
MT15:	.WORD	275.,17,17,05,37,05,05,04
MT20:	.WORD	270.,17,17,05,07,05,05,04
MT25:	.WORD	265.,17,17,05,07,05,05,04
MT99:	.WORD	265.,17,17,05,07,05,05,04
; СМЕЩЕНИЕ	  0   2	 4  6 10 12 14 16

MTT:	.WORD	MT00	; УКАЗАТЕЛЬ НА МАССИВ УПРАВЛЕНИЯ
DT1:	.WORD	5.	; ДЕЛЬТА1-РЕГУЛИРОВАНИЕ	В ПРЕДЕЛАХ L1H1
DT2:	.WORD	10.	; H2 L2	СООТВЕСТВЕННО
DTH:	.WORD	100.	;10C - ограничение по верхнему пределу
DTL:	.WORD	50.	;-5C ограничение по нижнему пределу

REGMOD:	.WORD	0	; РЕЖИМ	РЕГУЛИРОВАНИЯ 0=Н1-L1
			;		      1=H2-Tз-L2
NAGREV:	.WORD	0	; РЕЖИМ	=1 НАГРЕВ
			;	=0 ОХЛАЖДЕНИЕ
RAZMOR:	.WORD	0	; РЕЖИМ	ЗИМНЕЙ РАЗМОРОЗКИ
			; =1 РАЗМОРОЗКА
LIMERR:	.WORD	0	; количество ограничений по верхнему
			; пределу
CYCLES:	.WORD	0	; счетчик циклов

KWAIT:	.WORD	0	; количество циклов ожидания до
			; повторного включения компрессора

; РЕГИСТР УПРАВЛЕНИЯ КОНДИЦИОНЕРОМ 177714
; БИТЫ МАСКА
; 0 - 01 - ВКЛЮЧЕНИЕ ВЕНТИЛЯТОРА КОНДИЦИОНЕРА
; 1 - 02 - ВКЛЮЧЕНИЕ ТУРБО РЕЖИМА ВЕНТИЛЯТОРА КОНДИЦОНЕРА
; 2 - 04 - ВКЛЮЧЕНИЕ ВЫДУВНОГО ВЕНТИЛЯТОРА
; 3 - 10 - ВКЛЮЧЕНИЕ KOMПРЕССОРА
; 4 - 20 - ВКЛЮЧЕНИЕ КЛАПАНА НА	НАГРЕВ
; 5 - 40 - РЕЗЕРВ - РАЗМОРОЗКА

; 1ая(ANREG1) СТАДИЯ УСТАНОВКА УКАЗАТЕЛЯ НА МАССИВ УПРАВЛЕНИЯ
; ПО ПОКАЗАНИЯМ	ДАТЧИКА	ВНЕШНЕЙ	ТЕМПЕРАТУРЫ
; 2ая(ANREG2) СТАДИЯ СОБСТВЕННО	РЕГУЛИРОВАНИЕ
; НА ОСНОВАНИИ ИНФОРМАЦИИ С ДАТЧИКОВ В КВАРТИРЕ
;
ANALIZ:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)

00:	CALL	ZSTART		; зимний пуск системы
	CALL	ANREG1		; установка указателя MTT
	MOV	TMEM,R0		; температура за бортом
	SUB	#50.,R0		; +3
	TST	R0
	BPL	20		; если больше +5
10:	CALL	ANZIM		; зимняя разморозка
	TST	R5		; обработаем флаг выхода
	BNE	99
	CALL	ANREG2
	CALL	ANREG3
	BR	30
20:	CALL	ANLET		; летняя разморозка
	TST	RAZMOR
	BNE	99
21:	CALL	ANREG2		; комфортное регулирование DTH

30:	CALL	ANREG4		; регулирование	по пределам
99:	CALL	AISKL		; обработаем исключения
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN

; подпрограмма зимнего пуска системы
ZSTART:	TST	KOMMAD		; проверим первый ли это пуск
	BNE	99		; нет
	MOV	TMEM+6,R0	; данные с испарителя в	R0
	TST	R0
	BPL	99		; если испаритель имеет	плюс
				; то выходим иначе
	CLR	RAZMOR		; разморозка
	INC	RAZMOR		; oчевидно что летом тут же
	MOV	#24,KOMMAD	; выйдет из этого режима
99:	RETURN

; подпрограмма летней разморозки и защиты от обморожения входа
ANLET:	CLR	R5
	MOV	TMEM,R0		; вход в R0
	MOV	TMEM+2.,R1	; выход	в R1
	MOV	TMEM+6.,R2	; испаритель
	TST	RAZMOR		; режим	разморозка ?
	BNE	60		; да
	CCC
	TST	R1
	BMI	10		; выход	холодный
	TST	R2
	BMI	20		; испаритель холодный
	BR	99		; все теплое
10:	TST	R2		; испаритель холодный ?
	BMI	30		; выход	и испаритель холодные
	NEG	R1		; знак поменяем
	CCC
	CMP	R1,#25.		; выход	холоднее -4.5с ?
	BLE	99		; нет -	выходим
      ;	BIT	#10,KOMMAD	; включен компрессор
      ;	BNE	99		; выключен - выходи
	BR	30
20:	NEG	R2
	CCC
	CMP	R2,#30.		; испаритель холоднее -3с ?
	BLE	99		; нет
30:	INC	RAZMOR		; включаем режим разморозки
	CLR	NAGREV
	CLR	REGMOD
	MOV	#27,KOMMAD	; те вентиляцию
	BR	99
60:	TST	R1
	BMI	99		; выход	холодный
	CMP	R1,#130.	; выход	теплее +15с ?
	BGT	80		; да
	CMP	R1,R0		; выход	теплее входа ?
	BLE	99		; нет -	продолжам разморозку
	CCC
	;выключам разморозку
80:	CLR	RAZMOR
	CLR	REGMOD
	CLR	NAGREV
	MOV	#7,KOMMAD
99:	RETURN



; подпрограмма обработки зимней	разморозки
ANZIM:	; EСЛИ ТЕМПЕРАТУРА ИСПАРИТЕЛЯ МЕНЬШЕ -15C
	; ТО ВКЛЮЧИМ ТОЛЬКО ВЫДУВНОЙ ВЕНТИЛЯТОР	ДО
	; ДОСТИЖЕНИЯ ПОЛОЖИТЕЛЬНОЙ ЕГО ТЕМПЕРАТУРЫ - ТЕ	+5
	MOV	TMEM+6,R0	; ДАННЫЕ С ИСПАРИТЕЛЯ В	R0
	TST	RAZMOR		; МЫ В РЕЖИМЕ РАЗМОРОЗКИ ?
	BEQ	60		; НЕТ
	CCC
	TST	R0		; ПРОВЕРИМ ТЕМПЕРАТУРУ
	BPL	61		; ПОЛОЖИТЕЛЬНАЯ	- ПРОВЕРИМ
	BR	99		; ВЫХОДИМ - НИЧЕГО НЕ МЕНЯ
61:	CCC
	CMP	R0,#50.		; ИСПАРИТЕЛЬ ТЕПЛЕЕ +5С
	BLE	99		; ЕСЛИ МЕНЬШЕ ТО РАЗМОРАЖИВАЕМ
	BR	69		; ЕСЛИ БОЛЬШЕ СНИМАЕМ ПРИЗНАК
60:	CCC
	TST	R0		; ПРОВЕРИМ ТЕМПЕРАТУРУ
	BPL	69		; ПОЛОЖИТЕЛЬНАЯ	- ВСЕ OK
	NEG	R0		; СМЕНИМ ЗНАК
	CCC
	CMP	#150.,R0	; ИСПАРИТЕЛЬ НИЖЕ -15C ?
	BGT	69		; OБМЕРЗАНИЯ НЕ	ОБНАРУЖЕНО
	MOV	#24,KOMMAD	; УСТАНОВИМ РЕЖИМ
	INC	RAZMOR		; УСТАНОВИМ ПРИЗНАК РАЗМОРОЗКИ
	BR	99

69:	CLR	RAZMOR		; СБРОСИМ ПРИЗНАК РАЗМОРОЗКИ
	CMP	#24,KOMMAD	; ПРОВЕРИМ ПРЕДИДУЩУЮ КОМАНДУ
	BNE	68		; ЕСЛИ НЕ РАЗМОРОЗКА
	MOV	#5,KOMMAD	; EСЛИ БЫЛА РАЗМОРОЗКА - ВЫЙДЕМ
				; ИЗ НЕЕ - ВЕНТИЛЯЦИЯ
	CLR	REGMOD		; СБРОСИМ ПРИЗНАКИ
	CLR	NAGREV
68:	CLR	R5
	RETURN
99:	CLR	R5		; выход	с признаком
	INC	R5		; выйти	на исключения
	RETURN

; подпрограмма установки указателей на массив управления
; 1ая СТАДИЯ
ANREG1:	NOP
68:	MOV	TMEM,R0		; ДАННЫЕ С ПЕРВОГО В R0
	TST	R0		; ПРОВЕРИМ ЗНАК
	BPL	12		; ЕСЛИ ПОЛОЖИТЕЛЬНАЯ
	MOV	#MT00,MTT	; УСТАНОВИ УКАЗАТЕЛЬ
	BR	13		; ПЕРЕЙДЕМ KO ВТОРОМУ ЭТАПУ
12:	MOV	MTS,R1		; МАССИВ
	MOV	#6,R2		; КОЛИЧЕСТВО ШАГОВ
	CLR	R3		; РЕГИСТР СМЕЩЕНИЯ
10:	CCC			; СБРОСИМ ПРИЗНАКИ
	CMP	MTS(R3),R0	; СРАВНИМ С МАССИВОМ
	BGE	11		; ЕСЛИ МЕНЬШЕ ТО ТО ЧТО	НАДО
	ADD	#4,R3		; ДОБАВИМ СМЕЩЕНИЕ
	SOB	R2,10		; ЦИКЛ
11:	MOV	MTS+2(R3),MTT	; УСТАНОВИМ УКАЗАТЕЛЬ
	; MTT -	УКАЗАТЕЛЬ НА УКАЗАТЕЛЬ НА МАССИВ УПРАВЛЕНИЯ
13:	RETURN

; подпрограмма комфортного регулирования
; 1 выключение режима нагрева при превышении температуры выхода
; на DTH относительно заданной
ANREG2:	TST	NAGREV	  ; нагрев установлен ?
	BEQ	99	  ; нет	- выходим
	MOV	MTT,R2	  ; указатель на массив	регулирования
	MOV	TMEM+2,R1 ; данные с датчика выхода в R1
	TST	R1	  ; температура	положительная ?
	BMI	99	  ; нет	- тогда	выходим
0:	SUB	DTH,R1	  ; вычтем DTH
	CMP	R1,(R2)	   ; сравним
	BLE	99	  ; если нет превышения	выйдем
	MOV	TMEM+12.,R1 ; датчик в R1
	CMP	(R2),R1	  ; сравним с заданной
	BLT	98	  ; если порог не достигнут - выходим
	CLR	NAGREV	  ; сбросим нагрев
	MOV	4(R2),KOMMAD	; установим охлаждение
	CLR	REGMOD	  ; сбросим регмод
	MOV	#300,R0	  ; пищим
	MOV	#100,R1
	CALL	LSOUND
	BR	99
98:	ADD	#10.,DTH   ; увеличиваем порог ограничения
99:	RETURN

; подпрограмма комофрта	2 - обработка нижнего предела
; при выходной температуре ниже	-10С и при достижения заданной
; температуры в	помещении включаем нагрев не дожидаясь достижен
; ния нижнего предела
ANREG3:	CLR	R1
	ADD	NAGREV,R1
	ADD	REGMOD,R1
	ADD	RAZMOR,R1
	TST	R1		;проверим можно	ли регулировать
	BNE	99		; если хоть один установлен -99
	MOV	MTT,R2		; указатель на массив рег-ния
	MOV	TMEM+2,R1	; данные с выхода  в R1
	TST	R1		; температура отрицательная
	BPL	99		; если температура + выходим
	NEG	R1
	CMP	R1,DTL		; сравним с пределом
	BLE	0		; выходим
	INC	NAGREV
	MOV	6(R2),KOMMAD	; включаем нагрев
	; узел адаптивного изменения DTL
0:	MOV	TMEM+12.,R3	; данные с комнаты в R3
	CMP	R3,(R2)		; сравним с заданной
	BLT	1		; тепло	- предел не достигнут
	; если нижняя температу
	TST	NAGREV
	BNE	99
	SUB	#10.,DTL	; повысим DTL  за невключенный
	TST	DTL		; нагрев
	BPL	99		; до ноля еще не дошли
	BR	2		; дошли	- повысим
1:	TST	NAGREV
	BEQ	99
2:	ADD	#10.,DTL	; понизим  DTL за рано включенн
				; ый нагрев
99:	RETURN

;подрограмма обработки регулирования по	пределам
ANREG4:	; 2ая СТАДИЯ
	; НАЧНЕМ АНАЛИЗИРОВАТЬ ИСХОДНЫЕ	ДАННЫЕ
	; ВЫБИРАЕМ 2 АЛГОРИТМА РЕГУЛИРОВАНИЯ
	; 1Й ЭТО ПРИ ПРЕВЫШЕНИИ	H2 ИЛИ L2
	; РЕГУЛИРОВАНИЕ	ИДЕТ ДО	ДОСТИЖЕНИЯ ЗАДАННОЙ ТЕМПЕРАТУРЫ
	; REGMOD=1
	; 2Й ПРИ ПРЕВЫШЕНИИ Н1 ИЛИ L1
	; ТУТ РЕГУЛИРОВАНИЕ ИДЕТ ДО ПРОТИВОПОЛОЖНОЙ ТОЧКИ H1 L1
	; REGMOD=0

13:	MOV	MTT,R2		; УКАЗАТЕЛЬ
	MOV	TMEM+12.,R1	; ЗАГОНИМ ПЕРВЫЙ ДАТЧИК
;    MOV     TMEM+30.,R1
;    MOV     #260,R1
	TST	REGMOD		; ПРОВЕРИМ РЕЖИМ
	BEQ	40		; ПЕРЕЙДЕМ К ОБРАБОТКЕ ОБЫЧНОГО
	CCC
	TST	NAGREV		; OПРЕДЕЛИМ РЕЖИМ
	; NAGREV=0 - ОХЛАЖДЕНИЕ
	; NAGREV=1 - НАГРЕВ
	BNE	50		; ПЕРЕЙДЕМ НА ОХЛАЖДЕНИЕ
	; ОБРАБАТЫВАЕМ НАГРЕВ -	ТЕ ЖДЕМ	ПОНИЖЕНИЯ ТЕМПЕРАТУРЫ
	CCC
	CMP	(R2),R1		; СРАВНЕНИЕ С ЗАД ТЕМПЕРАТУРОЙ
	BLT	99		; ЕСЛИ ПОРОГ НЕ	ДОСТИГНУТ
	BR	52		; ПОРОГ	ДОСТИГНУТ
50:	CCC
	CMP	(R2),R1		; СРАВНЕНИЕ С ЗАД ТЕМПЕРАТУРОЙ
	BGT	99		; ПОРОГ	НАГРЕВА	НЕ ДОСТИГНУТ
52:	CLR	REGMOD		; СБРОСИМ ПРИЗНАК РЕЖИМА Н2L2
	BR	99		; ВЫХОД

40:	MOV	(R2),R3		; СЧИТАЕМ ЗНАЧЕНИЕ
	ADD	DT1,R3		; ВЕРХНИЙ ПРЕДЕЛ 1
	CCC
	CMP	R1,R3		; СРАВНИМ
	BGT	21		; ВЫШЕ 1
	BR	30		; НЕ ВЫШЕ
21:	MOV	(R2),R3		;
	ADD	DT2,R3		; УСТAНОВИМ ВЕРХНИ ПРЕДЕЛ 2
	CCC
	CMP	R1,R3		; СРАВНИМ
	BGT	22
	MOV	4(R2),KOMMAD	; ОХЛАЖДАЕМ ПО L1
	CLR	NAGREV
	BR	99
22:	MOV	2(R2),KOMMAD	; СООТВЕТСТВЕННО ОХЛАЖДАЕМ L2
	INC	REGMOD		; УСТАНОВИМ ПРИЗНАК H2L2
	CLR	NAGREV		; УСТАНОВИМ ПРИЗНАК ОХЛАЖДЕНИЯ
	SUB	#30.,DTH	 ; уменьшим порог
	BR	99
30:	MOV	(R2),R3		; ЗАГРУЗИМ
	SUB	DT1,R3		; НИЖНЕЕ ЗНАЧЕНИЕ L1
	CCC
	CMP	R1,R3		; СРАВНИМ С НИЖНИМ L1
	BLT	31		; EСЛИ НИЖЕ
	BR	99		; ЕСЛИ В ЗАДАННОМ ДИАПАЗОНЕ
31:	MOV	(R2),R3		; ЗАГРУЗИМ
	SUB	DT2,R3		; НИЖНЕЕ L2
	CCC
	CMP	R1,R3		; СРАВНИМ
	BLT	32		; НИЖЕ НИЖНЕГО
	MOV	6(R2),KOMMAD	; ГРЕЕМ	ПО L1
	CLR	NAGREV
	INC	NAGREV
	BR	99
32:	MOV	8.(R2),KOMMAD	; ГРЕЕМ	ПО L2
	INC	REGMOD		; УСТАНОВИМ ПРИЗНАК
	CLR	NAGREV		; УСТАНОВИМ ПРИЗНАК НАГРЕВА
	INC	NAGREV
99:	TST	DTH
	BPL	990
	CLR	DTH
990:	RETURN

; подпрограммы группы анализа
; обработка исключения
AISKL:	MOV	KOMMAD,KOMEND ;	сохраним команду
	CCC		   ; сначала отслеживаем выключение
			   ; для взведения счетчика
	BIT	#10,KOMMAD ; новая команда компрессор OFF
	BNE	97	   ; компрессор	включен	 - выходим
	CCC
	BIT	#10,KOMPRV ; предидущая	команда	компрессор ON
	BEQ	97	   ; компрессор	выключен
	MOV	#10.,KWAIT ; взводим счетчик
97:			   ;отрабатываем ожидание включения
	TST	KWAIT	   ; если 0
	BEQ	98	   ; выходим
	DEC	KWAIT	   ; уменьшаем счетчик
	BIC	#10,KOMEND ; безусловно	выключаем компрессор
98:	CCC			; обработка отсутствия команды
	TST	KOMMAD		; ОБРАБОТАЕМ ИСКЛЮЧЕНИЕ
	BNE	99		; ЕСЛИ ЕСТЬ КОМАНДА
	MOV	MTT,R2
	MOV	12(R2),KOMMAD	;ЕСЛИ НЕТ КОМАНДЫ-ВЕНТИЛЯЦИЯ
99:	MOV	KOMEND,@#177714
	MOV	KOMMAD,KOMPRV  ; запомним команду для анализа
	RETURN

; Процедура рисования состояния	кондиционера в нижних 3х
; строках - отображаются следующие состояния:
; КРАС - компрессор on/off	- маска	10
; СИН  - вентилятор IN	on/off	- маска	01
; ЗЕЛ  - вентилятор OUT	on/off	- маска	04

LGRSO:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	KOMEND,R3
	MOV	#377,R1		; координата Х
	CCC
	BIT	#10,R3		; проверим маску 10
	BEQ	0
	MOV	#3,R0
	MOV	#375,R2		; координата Y
	CALL	LPSETC
0:	CCC
	BIT	#01,R3		; проверим маску 01
	BEQ	1
	MOV	#1,R0
	MOV	#374,R2
	CALL	LPSETC
1:	CCC
	BIT	#04,R3
	BEQ	2
	MOV	#2,R0
	MOV	#376,R2
	CALL	LPSETC
2:	TST	KWAIT		; вывод	запрета	на включение
				; компрессора
	BEQ	3
	MOV	#3,R0		; красный
	MOV	#373,R2
	CALL	LPSETC
3:	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN

; процедура рисования точки графика
; вход R0 - цвет точки
; R2 - значение	температуры *10

LGRAF:	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	#377,R1		; зададим координату Х
	MOV	#3600,R3
	TST	R2		; проверим значение
	BPL	0		; положительная
	NEG	R2		; поменяем знак
	ADD	R2,R3		; добавим смещение
	BR	1
0:	SUB	R2,R3		; вычтем смещение
1:	CLR	R2
	DIV	#10.,R2		; разделим на 10
;	BIC	#177400,R2	; отсечем лишнее
	CALL	LPSETC
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	RETURN

; процедура сдвига экрана влево
; сдивгаем экран в цветном режиме для рисования	графиков
; в реальном времени

LSHIFT:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	#77700,R0      ; начальный адрес
	MOV	#120.,R1       ; количество строк
	MOV	#37,R4	       ; количество слов в строке
1:	MOV	R0,R3
	CCC
	MOV	R4,R2	       ; количество слов в строке
0:	ROR	-(R0)
	SOB	R2,0
	TST	-(R0)
	MOV	R3,R0
	CCC
	MOV	R4,R2
00:	ROR	-(R0)
	SOB	R2,00
	TST	-(R0)
	SOB	R1,1
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN

; инициализация	экрана

SINIT:	CLR	R2
	CLR	R1
	EMT	24
	MOV	MGREEN,@#214	  ; зеленый
	.PRINT	#TNAM01
	.PRINT	#TNAM02
	.PRINT	#TNAM03
	.PRINT	#TNAM04
	.PRINT	#TNAM05
	.PRINT	#TNAM07
    ;	.PRINT	#TNAM08
	.PRINT	#TNAM09
	.PRINT	#TNAM10
	.PRINT	#TNAM11
	.PRINT	#TNAM16
	MOV	MGREEN,@#214	; зеленый
	CLR	R1		; выведем надпись режим
	MOV	#'M,R0
	EMT	22
	MOV	#'O,R0
	INC	R1
	EMT	22
	MOV	#'D,R0
	INC	R1
	EMT	22
	MOV	#'E,R0
	INC	R1
	EMT	22
	MOV	#':,R0
	INC	R1
	EMT	22
	MOV	#40,R0
	MOV	#27.,R2
9:	INC	R1
	EMT	22
	SOB	R2,9
    ;	MOV	MBLUE,@#214	; синий
	RETURN


; подпрограмма записи скриншотов
NS0:	.WORD	0	; Счетчик имен файлов

SAVSCR:	MOV	R1,-(SP)
	MOV	R3,-(SP)
	TST	NS0
	BNE	10
	MOV	MVER,R3		; запихнем вперед версию
	MOV	#10,R1
0:	ASL	R3
	SOB	R1,0
	MOV	R3,NS0
10:	MOV	#320,R1		; адрес	массива	управления
	MOV	#2,(R1)+	; команда - запись
	MOV	#40000,(R1)+	; адрес	начала экрана
	MOV	#40000,(R1)+	; длина	экрана
	MOV	NS0,R1
	MOV	#326,R3
	CALL	LOCTWS		; вывод	числа в	строку
	MOVB	#12,@#334
	CLRB	@#335
	MOV	#320,R1
	EMT	36
	INC	NS0
	MOV	(SP)+,R3
	MOV	(SP)+,R1
	RETURN

; процедура отображения	результатов

TSCREN:	MOV	MGREEN,@#214	; зеленый
	CLR	R2
	MOV	#21,R1
	EMT	24
	MOV	TMEM,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+2,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+4,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+6,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+8.,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+12.,R0
	CALL	LDEC1

;	MOV	#40,R0
;	EMT	16
;	MOV	TLOW,R0
;	CALL	LDEC2
;	MOV	#40,R0
;	EMT	16
;	MOV	THI,R0
;	CALL	LDEC2

	MOV	MRED,@#214	; красный
	MOV	@MTT,R0
	CALL	LDEC1
	MOV	MGREEN,@#214	; зеленый

 ;	INC	R2
 ;	EMT	24
 ;	MOV	TMEM+14.,R0
 ;	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+16.,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+18.,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+20.,R0
	CALL	LDEC1
	INC	R2
	EMT	24
	MOV	TMEM+30.,R0
	CALL	LDEC1

	CLR	R1
	INC	R2
	EMT	24

; отображение режимов работы в статус-строке
	CCC
	MOV	#5,R1
	TST	RAZMOR	; если мы в режиме разморозки
	BNE	0	; то выведем RZ

	MOV	#'Ё,R0
	MOV	MRED,@#214	; красный
	TST	NAGREV	; выведем нагрев или охлаждение
	BNE	1
	MOV	MBLUE,@#214	; синий
	MOV	#'н,R0
1:	EMT	22
	INC	R1
	TST	REGMOD	;выведем режим
	BNE	2
	MOV	#40,R0	; очистим
2:	EMT	22
	BR	99
0:	MOV	MRED,@#214	; красный
	MOV	#'R,R0
	EMT	22
	MOV	#'Z,R0
	INC	R1
	EMT	22
99:	; отображение внутренних параметров в статус строке
	MOV	MGREEN,@#214	; зеленый
	MOV	#8.,R1		 ; 7ая-позиция
	MOV	#TMS01,R2
	CALL	SPRINT		; вывод	строки
	MOV	DTH,R0		;
	CALL	LDECS		; вывод	темп  в	статус строку
	MOV	#TMS02,R2
	INC	R1
	CALL	SPRINT
	MOV	DTL,R0
	NEG	R0
	CALL	LDECS		; вывод	числа в	статус строку
	RETURN

; процедура выводит строку в статус-строку
; вход
; R1 - начальная позиция в статус-строке
; R2 - адрес начала строки в памяти на вывод
; окончание строки 0

SPRINT:	MOV	R0,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	#64,R3		; максмималная длина строки
0:	MOVB	(R2)+,R0	; считаем символ на вывод
	TST	R0		; если 0 то выходим
	BEQ	99
	EMT	22		; выводим символ
	INC	R1
	SOB	R3,0		; цикл
99:	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R0
	RETURN


; СБОР ИНФОРМАЦИИ В ПАМЯТЬ С ДАТЧИКОВ
; ПРОЦЕДУРА СОБИРАЕТ ИНФОРМАЦИЮ	С ДАТЧИКОВ ПО МАСКЕ

TNAM01:	.ASCIZ /Вход_____________/<12> ; TMEM
TNAM02:	.ASCIZ /Выход____________/<12> ; TMEM+2.
TNAM03:	.ASCIZ /Компрессор_______/<12> ; TMEM+4.
TNAM04:	.ASCIZ /Испаритель_______/<12> ; TMEM+6.
TNAM05:	.ASCIZ /Обратный контур__/<12> ; TMEM+8.
TNAM06:	.ASCIZ /резерв___________/<12> ; TMEM+10.
TNAM07:	.ASCIZ /Mаленькая комната/<12> ; TMEM+12.
TNAM08:	.ASCIZ /Резерв___________/<12> ; TMEM+14.
TNAM09:	.ASCIZ /Большая	комнатa__/<12> ; TMEM+16.
TNAM10:	.ASCIZ /Ванная команатa__/<12> ; TMEM+18.
TNAM11:	.ASCIZ /Kухня____________/<12> ; TMEM+20.
TNAM12:	.ASCIZ /резерв___________/<12> ;
TNAM13:	.ASCIZ /none_____________/<12> ;
TNAM14:	.ASCIZ /none_____________/<12> ;
TNAM15:	.ASCIZ /none_____________/<12> ;
TNAM16:	.ASCIZ /Kонтроллер_______/<12> ;
MESS01:	.ASCIZ <12>
MESS02:	.ASCIZ //
TMS01:	.ASCIZ /DTH=/;
TMS02:	.ASCIZ /DTL=/;
TMS03:	.ASCIZ /DT2=/;
TMS04:	.ASCIZ /ERTEMP=/;
TMS05:	.ASCIZ /LIMERR=/;
TMS06:	.ASCIZ /DTH=/;
TMS07:	.ASCIZ /KW=/;
	.EVEN

TMEM:	.BLKW 16.	; MAССИВ ДЛЯ ХРАНЕНИЯ СОБРАННОЙ	ИНФОРМА
			; ЦИИ С	ДАТЧИКОВ ПО ЗАДАННОЙ ДОПУСТИМОЙ
			; МАСКЕ

TMASK:	.WORD 0

; СОБСТВЕННО САМА ПРОЦЕДУРА
TSCAN:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	CLR	R2		; СМЕЩЕНИЕ ДЛЯ БЛОКА ПАМЯТИ
	CLR	R3		; НАЧАЛЬНОЕ ЗНАЧЕНИЕ
	INC	R3
	MOV	#20,R5		; CЧЕТЧИК
	MOV	TMASK,R4	; МАСКА	НАЙДЕННЫХ - В R4
2:	CCC			; СБРОС	БИТОВ
	BIT	R4,R3		; ПРОВЕРИМ ПОПАЛИ ?
	BLOS	3		; НЕ ПОПАЛИ
	MOV	TMEM(R2),R0	; передадим старое значение
	CALL	LTEMP		; СЧИТЫВАЕМ
	MOV	R0,TMEM(R2)
3:	ASL	R3		; ДВИГАЕМ
	INC	R2
	INC	R2
	SOB	R5,2
	MOV	(SP)+,R0
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RETURN


; ПРОЦЕДУРА ОПРЕДЕЛЕНИЯ	АКТИВНЫХ ДАТЧИКОВ
; ВХОДНЫЕ ДАННЫЕ - НЕТ
; ВЫХОДНЫЕ ДАННЫЕ - МАСКА НАЙДЕННЫ ДАТЧИКОВ - R4

LSCANT:	MTPS	#340
	MOV	R0,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R5,-(SP)
	MOV	#177714,R0	; АДРЕС	 ДАТЧИКА
	CLR	R2
	CLR	R4		; ПОДГОТОВКА РЕГИСТРОВ
	CLR	R5		; R4- ОБНАРУЖЕНИЕ 1
	COM	R5		; R5- ОБНАРУЖЕНИЕ 0
	DEC	R2
1:	MOV	(R0),R3		; СЧИТАЕМ
	BIS	R3,R4		; УСТАНАВЛИВАЕМ	1
	COM	R3
	BIC	R3,R5		; УСТАНАВЛИВАЕМ	0
	SOB	R2,1
	XOR	R5,R4		; УДАЛИМ ЛИШНЕЕ	- ТЕ СТАТИЧНЫЕ
	MOV	(SP)+,R5
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R0
	RETURN

; процедура обработки ошибок измерения
; она смотри на	общее количество ошибок	- ERTEMP и при
; превышении предела чистит массив измерений

TERR:	INC	CYCLES
	CMP	ERTEMP,#25.
	BLE	1
	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	#TMEM,R0
	MOV	#16.,R1
0:	CLR	(R0)+
	SOB	R1,0
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	CLR	ERTEMP
	CALL	TSCAN	; вызов	пересканирования наличия
			; датчиков
1:	RETURN

; ПРОЦЕДУРА ВЫЧИСЛЕНИЯ T1 И Т2
; ДЛЯ ВЫЧИСЛЕНИЯ ТЕМПЕРАТУРЫ
; С ПЕРЕСЧЕТОМ В ТЕМПЕРАУРУ В ГРАДУСАХ ЦЕЛЬСИЯ
;
; ВХОДНЫЕ ДАННЫЕ
; R3-МАСКА СКАНИРУЕМОГО	ДАТЧИКА
; R0 - начальное значение
;
; ВЫХОДНЫЕ ДАННЫЕ
; R0 ТЕМПЕРАТУРА
ERTEMP:	.WORD	0	; счетчик количества ошибок измерения

LTEMP:	MTPS	#340
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	MOV	#10.,R5	     ; КОЛИЧЕСТВО ИЗМЕРЕНИЙ
	CLR	123
	NEG	R0
	ADD	#2340.,R0
	MOV	R0,125	    ; сохраним начальное
9:	CALL	LTEMP0	    ; собственно измерение
	BR	10

123:	.WORD	0	; ДЛЯ ХРАНЕНИЯ ПРОМЕЖУТОЧНЫХ РЕЗ-ТОВ
125:	.WORD	0	; для хранения предидущего результата

	; отбраковка результатов
	; если первый проход то	она не производится
10:	MOV	125,R1
	CMP	#2340.,R1    ; первый проход ?
	BEQ	79	     ; да
	CCC
	CMP	R0,R1	     ; сравним
	BEQ	79	     ; совпадение 100%
	MOV	R0,R2
	SUB	R1,R2	     ;в	R2 разницу между новым и старым
	CCC
	TST	R2
	BPL	11	     ; если положительная
	NEG	R2	     ; если отрицательная
11:	CCC
	CMP	R2,#50.	     ; допустимая ошибка 5C
	BLE	79	     ; меньше
	MOV	125,R0	     ; рез-т не	укладывается и мы
			     ; возьмем старый
	INC	ERTEMP	     ;увеличим счетчик ошибок измерения
79:	ADD	R0,123
	SOB	R5,9	     ; ЦИКЛ УСРЕДНЕНИЯ
	CLR	R0
	MOV	123,R1
	DIV	#10.,R0	     ; ПОЛУЧИМ УСРЕДНЕННЫЙ РЕЗУЛЬТАТ
	TST	R0
	BEQ	8
	MOV	#2340.,R2    ; 2350 - KOРРЕКТИРОВКА - 2310
	SUB	R0,R2
	MOV	R2,R0
	; проверим укладывается	ли результат в пределы
	; от -50C  до +130C

	BR	88
8:	MOV	#0,R0	 ; ЗАТЫЧКА - ТЕ	НЕТ РЕЗУЛЬТАТА
88:	MOV	(SP)+,R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	RETURN


; сама процедура измерения
; вход - R3  с битом датчика
; выход	 R0 температура

LTEMP0:	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	CLR	R1
	CLR	R2
	MOV	#177714,R0 ; РЕГИСТР С ДАТЧИКАМИ TMP-03
	CCC
2:	BIT	R3,(R0)	   ; ТЕСТОВЫЙ ПРОГОН
	BNE	1	   ; T1
	INC	R1
	TST	R1
	BEQ	1
	BR	2
1:	BIT	R3,(R0)	   ; ПРОГОН T2
	BEQ	3
	INC	R2
	TST	R2
	BEQ	3
	BR	1
3:	CLR	R1
4:	BIT	R3,(R0)	   ; CЧИТАЕМ T1
	BNE	5
	INC	R1
	TST	R1
	BEQ	5
	BR	4
5:	CLR	R2
6:	BIT	R3,(R0)	   ; CЧИТАЕМ T2
	BEQ	77
	INC	R2
	TST	R2
	BEQ	77
	BR	6

; ПЕРЕХОДЯ НА МЕТКУ 77 МЫ ПОЛУЧИЛИ РЕЗУЛЬТАТЫ
; R1-T1; R2-T2
; ПЕРЕСЧЕТ В ТЕМПЕРАТУРУ ОСУЩЕСТВЛЯЕТСЯ	ПО ФОРМУЛЕ
; C=235-(400*Т1/Т2)
; ДЛЯ ПОВЫШЕНИЯ	ТОЧНОСТИ - ТЕМПЕРАТУРА ИДЕС С КОЭФФИЦИЕНТОМ 10

77:	MOV	#160016,@#10 ; ИНИЦИАЛИЗИРУЕМ АРИФМЕТИКУ
	MOV	R2,R4
	MOV	R1,R0
	CLR	R1
	MUL	#4000.,R0   ; Т1*4000 РЕЗУЛЬТАТ	В R0R1
	DIV	R4,R0	    ; /Т2     РЕЗУЛЬТАТ	В R0R1
	CLR	R1
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	RETURN

; подпрограмма вывода восьмеричного числа из ячейки
; вход - значение в ячейке LCW
LCW:	.WORD	0
LCW1:	.WORD	0

LOCTWM:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	#12,R0
	EMT	16
	MOV	LCW,R1
	CALL	LOCTW
	MOV	LCW1,R1
	CALL	LOCTW
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN

; вывод	на экран восьмеричного числа
; вход - R1
LOCTW:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	CLR	R0
	MOV	#6,R2
	BR	2
1:	CLR	R0
	ASL	R1
	ROL	R0
	ASL	R1
	ROL	R0
2:	ASL	R1
	ROL	R0
	ADD	#60,R0
	EMT	16
	SOB	R2,1
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN

; вывод	в строку по адресу R3 восьмеричного слова (6 байт)
; вход - R1 число
; R3 - адрес куда писать

LOCTWS:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	CLR	R0
	MOV	#6,R2
	BR	2
1:	CLR	R0
	ASL	R1
	ROL	R0
	ASL	R1
	ROL	R0
2:	ASL	R1
	ROL	R0
	ADD	#60,R0
	MOVB	R0,(R3)+
	SOB	R2,1
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RETURN



; подпрограмма вывода на экран температуры в виде NNN.N
; вход - R0
MD1:	 .WORD 1750,144,12,1

LDEC1:	MTPS	#340
	MOV	@#214,-(SP)	; сохраним цвет
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	MOV	R0,R3
	MOV	MBLUE,@#214
	TST	R0	; если положительная температура то
	BPL	30	; идем сюда
	MOV	#55,R0
	NEG	R3
	BR	31
30:	MOV	#53,R0
	MOV	MRED,@#214
31:	EMT	16
	MOV	#60,R0
	MOV	#MD1,R2
	MOV	#3,R4	; ЧИСЛО	ЗНАКОВ НА ЭКРАН
1:	CMP	R3,@R2
	BMI	2
	INCB	R0
	SUB	(R2),R3
	BR	1
2:	EMT	16
	MOV	#60,R0
	TST	(R2)+
	SOB	R4,1
	MOV	R0,-(SP)
	MOV	#56,R0
	EMT	16
	MOV	(SP)+,R0
11:	CMP	R3,@R2
	BMI	22
	INCB	R0
	SUB	(R2),R3
	BR	11
22:	EMT	16
	MOV	#60,R0
	TST	(R2)+
	MOV	(SP)+,R0
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,@#214 ; востановим цвет
	RETURN


; подпрограмма вывода в	статус-строку температуры в виде NNN.N
; вход - R0
; начальная позиция - R1
MD3:	 .WORD 1750,144,12,1

LDECS:	MTPS	#340
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	MOV	R0,R3
	TST	R0	; если положительная температура то
	BPL	30	; идем сюда
	MOV	#55,R0
	NEG	R3
	BR	31
30:	MOV	#53,R0
31:	EMT	22	  ; вывод
	INC	R1
	MOV	#60,R0
	MOV	#MD3,R2
	MOV	#3,R4	  ; ЧИСЛО ЗНАКОВ НА ЭКРАН
1:	CMP	R3,@R2
	BMI	2
	INCB	R0
	SUB	(R2),R3
	BR	1
2:	EMT	22	  ; вывод
	INC	R1
	MOV	#60,R0
	TST	(R2)+
	SOB	R4,1
	MOV	R0,-(SP)
	MOV	#56,R0
	EMT	22	  ; вывод
	INC	R1
	MOV	(SP)+,R0
11:	CMP	R3,@R2
	BMI	22
	INCB	R0
	SUB	(R2),R3
	BR	11
22:	EMT	22	  ; вывод
	INC	R1
	MOV	#60,R0
	TST	(R2)+
	MOV	(SP)+,R0
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	RETURN


; подпрограмма вывода на экран десятичных чисел	NN
; вход - R0
MD2:	 .WORD 1000.,100.,10.,1

LDEC2:	MTPS	#340
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	MOV	R0,R3
	CLR	R2
	DIV	#10.,R2
	MOV	R2,R3
	MOV	#60,R0
	MOV	#MD2,R2
	MOV	#3,R4	; ЧИСЛО	ЗНАКОВ НА ЭКРАН
1:	CMP	R3,@R2
	BMI	2
	INCB	R0
	SUB	(R2),R3
	BR	1
2:	EMT	16
	MOV	#60,R0
	TST	(R2)+
	SOB	R4,1
	MOV	(SP)+,R0
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	RETURN

; подпрограмма вывода на экран десятичных чисел	NN
; вход - R0
; позиция -R1
MD4:	 .WORD 1000.,1000.,100.,10.,1

LDECN:	MTPS	#340
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	MOV	R0,R3
	MOV	#60,R0
	MOV	#MD2,R2
	MOV	#5,R4	; ЧИСЛО	ЗНАКОВ НА ЭКРАН
1:	CMP	R3,@R2
	BMI	2
	INCB	R0
	SUB	(R2),R3
	BR	1
2:	EMT	22	; вывод
	INC	R1
	MOV	#60,R0
	TST	(R2)+
	SOB	R4,1
	MOV	(SP)+,R0
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	RETURN

;Маска вывода пикселей в байт (для увеличения скорости)
;использется в подпрограмме вывода цветной точки

LMASKC:	.BYTE 300,60,14,3

;Mаски преобразования цветов
;используются в	подпрограмме вывода цветной точки

LCOLOR:	.BYTE 0,125,252,377

;Рисование цветной точки
;R0 - цвет точки 0-черный 1-зеленый 2-синий 3-красный
;R1 - координата Х (0-377)
;R2 - координата Y (0-377)

LPSETC:	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	SWAB	R2		; вычисление Y-смещения
	ROR	R2
	ROR	R2
	ADD	#40000,R2	; добавление начального	адреса
	MOV	R1,R3		; вычисление адреса маски
	BIC	#177774,R3
	ASR	R1		; вычисление Х-смещения
	ASR	R1
	ADD	R1,R2		; добавление Х-смещения
	MOV	#LMASKC,R1
	ADD	R3,R1
	MOVB	(R1),R1
	BICB	R1,(R2)		; стирание точки
	MOV	#LCOLOR,R3	; выбор	цвета
	ADD	R0,R3
	MOVB	(R3),R3
	COMB	R1		; образ	цветной	маски
	BICB	R1,R3
	BISB	R3,(R2)		; вывод	точки
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	RETURN

; подпрограмма прозрачного звука
; вход R0-тон R1-длительность
; ограничений на параметры нет

LSOUND:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R1,-(SP)
	MOV	R0,-(SP)	; сохранить тон
	MOV	#177716,R5	; регистр звука
	MOV	#100,R3		; маска	звука
	MOV	#1,R4		; R4 длительность "1"
0:	BIS	R3,(R5)		; "1"
	MOV	R4,R2
1:	SOB	R4,1
	MOV	R2,R4
	INC	R4		; увеличение длительности "1"
	TST	R0
	BIC	R3,(R5)		; "0"
	MOV	R0,R2
2:	SOB	R0,2
	MOV	R2,R0
	DEC	R0		; уменьшение длительности "0"
	TST	R0
	BEQ	4		; начальная установка
3:	SOB	R1,0	       ; цикл по длительности
99:	MOV	(SP)+,R0
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RETURN
4:	MOV	(SP),R4
	MOV	#1,R0
00:	BIS	R3,(R5)
	MOV	R4,R2
11:	SOB	R4,11
	MOV	R2,R4
	DEC	R4
	TST	R4
	BEQ	44
	BIC	R3,(R5)
	MOV	R0,R2
22:	SOB	R0,22
	MOV	R2,R0
	INC	R0
	TST	R0
	SOB	R1,00
	BR	99
44:	MOV	(SP),R0
	MOV	#2,R4
	BR	0

; разные данные
; маски	цвета для шрифтов
MRED:	.WORD	177777
MGREEN:	.WORD	125252
MBLUE:	.WORD	52525
; версия
MVER:	.WORD	203

	.END
