START: CALL @#CLRSCR MOV #100,R0 CLR R2 2: CLR R1 1: EMT 24 EMT 16 INC R1 CMP #100,R1 BNE 1 INC R2 CMP #27,R2 BNE 2 WAIT HALT ;Подпрограмма подгонки экранного адреса при переполнении ;Вход: R3 - адрес ;Выход: R3 - обработанный адрес RECALC: BIS #40000,R3 BIC #100000,R3 RETURN ;Подпрограмма вычисления адреса заданного знакоместа ;Вход: R1 - координата X [0-77] ; R2 - координата Y [0-30] ;Выход: R3 - адрес CALCXY: MOV R2,-(SP) CALL @#CALCHI ADD #300,R3 ADD R1,R3 SWAB R2 ROR R2 ADD R2,R3 ROL R2 ROL R2 ADD R2,R3 CALL @#RECALC MOV (SP)+,R2 RETURN ;Подпрограмма вычисления адреса верхнего левого угла ;Выход: R3 - адрес CALCHI: MOVB @#177664,R3 ADD #50,R3 SWAB R3 CLRB R3 ROR R3 ROR R3 ADD #40000,R3 RETURN ;Подпрограмма вычисления адреса заданного символа ;Вход: R0 - символ ;Выход: R5 - адрес CALCCH: MOV R0,-(SP) MOV #112276,R5 CMPB #37,R0 BHIS 2 CMPB #177,R0 BHIS 1 CMPB #237,R0 BHIS 2 SUB #200,R0 MOV #114176,R5 1: SUB #40,R0 ROL R0 ADD R0,R5 ROL R0 ROL R0 ADD R0,R5 2: MOV (SP)+,R0 RETURN ;Подпрограмма очистки экрана CLRSCR: MOV R0,-(SP) MOV #40000,R0 1: CLR (R0)+ TST R0 BPL 1 MOV (SP)+,R0 RETURN ;Подпрограмма вывода символа по координатам ;Вход: R0 - символ ; CURX - координата X ; CURY - координата Y WRTCHR: MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R5,-(SP) CALL @#GETXY CALL @#CALCXY CALL @#CALCCH MOV #12,R1 1: MOVB (R5)+,(R3) ADD #100,R3 CALL @#RECALC SOB R1,1 MOV (SP)+,R5 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RETURN ;Подпрограмма построения прямоугольной рамки ;Вход: R5 - адрес блока параметров FRMCH1: .ASCII /┌─┐/ FRMCH2: .ASCII /│ │/ FRMCH3: .ASCII /└─┘/ FRMCH4: .ASCII /├─┤/ ;Подпрограмма построение линии окна по шаблону ;Вход: R3 - шаблон WFRMLN: RETURN ;Текущие координаты вывода CURX: .WORD 0 CURY: .WORD 0 ;Установка координат вывода ;Вход: R1 - координата X ; R2 - координата Y SETXY: MOV R1,@#CURX MOV R2,@#CURY RETURN ;Выдача текущих координат вывода ;Выход: R1 - координата X ; R2 - координата Y GETXY: MOV @#CURX,R1 MOV @#CURY,R2 RETURN .END