;-----------------------------
; Универсальный оконный модуль. Концепция Data Press
;	(c) Андрей Леликов.

;------ Один раз в жизни мы настраиваемся 
WINIT::	.WORD 106417
	CLR R0
	CLR (R0)+
	MOV #161716,(R0)+
	MOV #2,(R0)+
	CLR (R0)+
	MOV #1330,177664
	RESET
	MOV #KK6,60
	MOV #200,62
	MOV #KK6,274
	MOV #201,276
	CLR 177660
	RTS PC
;------ Редактирование строки. ---------
; JSR R1,ESTR
; .WORD Адрес в памяти
; .WORD Адрес первого байта после строки (адрес+длина)
; .WORD Адрес в экране
ESTR::	CLR 1$
	MOV (R1),R2
5$:	MOV R2,R3
	ADD 4(R1),R3

2$:	TST	122
	BNE	31$
	MOV #20000,R4
	INC (PC)+
1$:	.WORD 0
	COMB 1000(R3)
	COMB 1100(R3)
3$:	DEC R4
	BEQ 2$
	DEC 64
	BNE 32$
	;TST	122
	;BNE	31$
	BIT #100,177716
	BEQ 31$
32$:	TSTB 105
	BEQ 3$
31$:	JSR PC,KEY
	BIT #1,1$
	BEQ 4$
	COMB 1000(R3)
	COMB 1100(R3)
	INC 1$
4$:	CMP R0,#10
	BNE 6$
	CMP R2,(R1)
	BEQ 2$
	DEC R2
7$:	MOV R1,-(SP)
	MOV R2,-(SP)
	JSR PC,SOUND
	MOV (SP)+,R2
	MOV (SP)+,R1
	BR 5$
6$:	CMP R0,#31
	BNE 8$
11$:	CMP R2,2(R1)
	BEQ 2$
12$:	INC R2
	BR 7$
8$:	CMP R0,#30
	BNE 9$
	CMP R2,(R1)
	BEQ 2$
	DEC R2
	MOVB #40,(R2)
	JSR PC,ESO1
	BR 7$
9$:	CMP R0,#12
	BNE 10$
	ADD #6,R1
	MOV R1,(SP)
	JMP SOUND
10$:	CMP #40,R0
	BHI 2$
	CMP R2,2(R1)
	BEQ 2$
	MOVB R0,(R2)
	JSR PC,ESO1
	BR 12$

ESO1:	MOV R1,-(SP)
	MOV R2,-(SP)
	MOVB (R2),R0
	ADD 4(R1),R2
	JSR PC,PRCHR
	MOV (SP)+,R2
	MOV (SP)+,R1
	RTS PC
;------ Кнопочку взять. ----------
KEY::	TST 177662
	MTPS #0
2$:	BIT #100,177716
	BEQ 1$
	JMP 101010
1$:	DEC 64
	BPL 2$
	MOV #3000,64
	.WORD 10737,66
	JMP 101122
;------ Пропищать. -------
SOUND::	TST 122
	BNE 2$
	MOV #5,R2
	MOV #50,R3
	TST 66
	BEQ 1$
	MOV #100,R3
1$:	JMP 102062
2$:	RTS PC
;------ Клавиатура. -----
KK6::	MOV #20000,64
	MOV #0,66
	JSR R4,110346
	MOV R5,-(SP)
	MOV 177662,R0
	BCS 1$
	BEQ 2$		; MAINS
	CMP R0,#15
	BEQ 2$
	CMP R0,#20
	BEQ 2$
3$:	CMP R0,#16
	BNE 31$
	MOVB #200,43
	BR  2$
31$:	CMP R0,#17
	BNE 32$
	CLRB 43
2$:	CLR R0
	INC R0
32$:	JMP 101150
1$:	CMP #77,R0
	BHI 2$
	JMP 101374
;------ Печать текстового блока. -------
; .W ADR	; 4 - R5=OLD, 10 - R2=OLD+1200
; .W SCR ADR	;
TBLK::	TST (PC)+
TPWT:	.WORD 0
	BNE 2$
	MOV (R0)+,R1
	BEQ RTS2
	BIT #40000,R1
	BEQ 1$
	TST R1
	BMI 10$
	MOV R1,R2
	BR 6$
10$:	BIT #20000,R1
	BEQ 2$
	BIT #10000,R1
	BEQ 7$
	MOVB R1,TPWT
	BR TBLK
7$:	BIC #170000,R1
	MOVB (R0)+,R3
	MOV R3,R2
	BIC #177700,R3
	SWAB R2
	ASR R2
	ASR R2
	BIC #147777,R2
	ADD #40000,R2
	ADD R2,R1
11$:	CLR R4
	BISB (R0)+,R4
	JSR PC,INCOM
	BR TBLK
1$:	MOV R1,R5
5$:	BMI 2$
	MOV (R0)+,R2
6$:	MOV R2,(PC)+
3$:	.WORD 0
	BR 4$
2$:	ADD #1200,3$
	MOV 3$,R2
	DEC TPWT
4$:	BIC #140000,R5
	CMP R5,#100
	BHI 41$
	MOV (R0)+,R1
	MOV (R0)+,R3
	MOV R0,-(SP)
	MOV #100,R4
	SUB R5,R4
43$:	MOV R5,R0
42$:	MOVB (R1)+,(R2)+
	SOB R0,42$
	ADD R4,R1
	ADD R4,R2
	SOB R3,43$
	BR 44$
41$:	MOV R0,-(SP)
	JSR PC,STRING
44$:	MOV (SP)+,R0
	BR TBLK
RTS2:	RTS R0
;------ Инверсия фрагмента. -------
INCOM::	MOV R1,R2
	ADD #100,R1
	MOV R3,R5
8$:	COMB (R2)+
	SOB R5,8$
	SOB R4,INCOM
	RTS PC
;----- Вывод строки символов. ----------
; R5 - ADR IN MEMORY
; R2 - ARD IN SCREEN
STRING::
.ENABL LSB
	CLR -(SP)
1$:	TST (PC)+
MDT:	.WORD -1
	BMI 2$
	BNE 3$
	MOV (PC)+,R5
MDO:	.WORD 0
3$:	DEC MDT
2$:	MOVB (R5)+,R0
	BEQ 21$
	MOV R5,(SP)
	JSR PC,PRCHR
	MOV (SP),R5
	BR 1$
21$:	TST (SP)+
RTS1:	RTS PC
.DSABL LSB
;------ Печать символа или установка режима. ---
; R0 - CODE
; R2 - SCR ADR
PRCHR::	MOVB R0,R4
	BPL 3$
	SUB #177640,R4
	BPL 11$
	CMP R4,#-5
	BGT 34$
	MOV #<SZNAK+<40*12>>,R3
	BR 2$
34$:	MOV 2(SP),R1
	MOVB <MDA+4>(R4),R0
	ADD #MDD,R0
	MOVB (R0)+,R5
	BPL 35$
	MOVB (R0)+,36$
	.WORD 112160	; MOVB (R1)+,X(R0)
36$:	.WORD 0
	NEG R5
35$:	MOV R1,MDO
	MOV R5,MDT
	MOV R0,2(SP)	; WARNING! вызов только из PRSTR
	RTS PC
3$:	SUB #20,R4
	BPL 1$
	CMP R4,#<14-20>
	BEQ 55$
	ASL R4
	ASL R4
	MOV <STYP+74>(R4),R3
	BPL 5$
	MOV (SP)+,R0
	MOV (SP),R1
	INC (SP)
	MOVB (R1),R1	; ONLY >0 !!!!
	MOV #77,R3
	MOV #<2-1200>,R4
52$:	MOV #12,R5
	DEC R2
51$:	MOVB (R2)+,(R2)
	ADD R3,R2
	SOB R5,51$
	ADD R4,R2
	SOB R1,52$
	JMP (R0)
55$:	MOV R2,R4
	INC R2
	MOV #100,R3
	MOV #12,R0
56$:	BICB #^B11001100,(R4)
	ADD R3,R4
	SOB R0,56$
	RTS PC
5$:	MOV R3,TTYP
	MOV <STYP+76>(R4),R0
	BMI 4$
	BIC #40000,(R0)
	RTS PC
4$:	BIS #40000,100000(R0)
	RTS PC
11$:	MOV #<112036+<160*12>>,R3
	BR  2$
1$:	MOV #112036,R3
2$:	MOV R4,R1
	ASL R1
	ASL R1
	ADD R4,R1
	ASL R1
	ADD R3,R1
	.WORD 137
TTYP:	.WORD 0
;------	Вывод жирного символа. ---------
BOLD:	MOV #BADCHR,R3
	MOV #27.,R4
	CLR R5
2$:	CMPB R0,(R3)+
	BEQ QBOLD
	SOB R4,2$
;------ Обычный жирный символ. -------
TBOLD:	MOV #12,R0
	MOV #100,R3
	MOV R2,R4
	INC R2
M1:	MOVB (R1)+,R5
MBOL:	BISB R5,(R4)
	ASL R5
	BISB R5,(R4)
	ADD R3,R4
	SOB R0,M1
	RTS PC
;------ Вывод жирного символа красиво. ------
QBOLD:	MOV #100,R3
	MOV #12,R0
M2:	MOVB (R1)+,R4
MQBO:	BISB R4,(R2)
	MOV R4,R5
	ASL R4
	ASR R5
 	BIC #37,R4
	BIC #374,R5 
	BISB R4,(R2)
	BISB R5,(R2)
	ADD R3,R2
	SOB R0,M2
	ADD #<1-1200>,R2
	RTS PC
;------ Рисование обычного символа. ----------
QSYMB:	MOV #12,R0
	MOV #100,R3
	MOV R2,R4
	INC R2
MSYM:	MOVB (R1)+,(R4)
	ADD R3,R4
	SOB R0,MSYM
	RTS PC
;------ Для окошек. ----
TSYMB:	MOV #11,R0
	MOV #100,R3
	MOV R2,R4
	INC R2
	MOVB #377,(R4)
	ADD R3,R4
	BR  MSYM
;------ Инверсная печать -----
ISYMB:	MOV #12,R0
	MOV #100,R3
	MOV R2,R4
	INC R2
ISYM:	MOVB (R1)+,(R4)
	COMB (R4)
	ADD R3,R4
	SOB R0,ISYM
	RTS PC
;------ Таблица подпрограмм режимов. ----
STYP:	.WORD QSYMB,MSYM	; 1
	.WORD QSYMB,MSYM+100000	; 2
	.WORD BOLD,MBOL		; 3
	.WORD BOLD,MBOL+100000	; 4
	.WORD QBOLD,MQBO	; 5
	.WORD QBOLD,MQBO+100000	; 6
	.WORD TBOLD,MBOL	; 7
	.WORD TBOLD,MBOL+100000	; 10
	.WORD TSYMB,MSYM	; 11
	.WORD TSYMB,MSYM+100000	; 12
	.WORD -1,0		; 13
	.BLKW 2			; 14 - Очистка ©
	.WORD ISYMB,ISYM	; 15
;------ Данные для окошек. ------
BADCHR:	.BYTE '#,'&,'@,'W,'w,'Ю,'ю,'Ф,'ф,'Ж,'ж,'Ш,'ш,'Щ,'щ
	.BYTE 'M,'m,'Q,'М,'м,'n,'p,'р,'r,'b,'h,'u
;------ Макроопределения -----
MDA:	.BYTE 0,<MD3-MDD>,<MD1-MDD>,<MD2-MDD>
MDD:	.BYTE <400-6>,3,214,216,13,0,215,14,0
MD3:	.BYTE <400-5>,4,2,40,14,13,0,1
MD1:	.BYTE 6,1,200,201,202,203,11
MD2:	.BYTE <400-13>,10,1,204,205,206,0,207,203,13,0,211,14,0
	.EVEN
SZNAK:	.BYTE 377,377,017,017,217,017,017,017
	.BYTE 017,377,377,377,000,000,377,176
	.BYTE 030,000,000,377,377,377,360,360
	.BYTE 361,360,360,360,360,377,377,000
	.BYTE 000,000,000,000,000,000,000,000
	.BYTE 377,377,017,017,017,017,017,017
	.BYTE 017,377,377,377,000,000,000,377
	.BYTE 000,000,000,377,377,377,360,360
	.BYTE 360,360,360,360,360,377,377,017
	.BYTE 017,017,017,017,017,017,017,017
	.BYTE 000,300,140,061,033,016,004,000
	.BYTE 000,000,377,360,360,360,360,360
	.BYTE 360,360,360,360,017,017,017,017
	.BYTE 017,017,017,017,017,017,360,360
	.BYTE 360,360,360,360,360,360,360,360
	.BYTE 017,017,017,017,017,017,017,017
	.BYTE 377,377,360,360,360,360,360,360
	.BYTE 360,360,377,377,000,000,000,000
	.BYTE 000,000,000,000,377,377,377,377
	.BYTE 000,000,000,000,000,000,000,000
	.BYTE 124,105,124,105,124,105,124,105
	.BYTE 124,105,210,042,210,042,210,042
	.BYTE 210,042,210,042


FREMEM::	.BLKW 5
.END

                                                                                                                                                                                                                                                                                                                                      