.TITLE CURSOR .GLOBL .CD,.CL,.CR,.CU,.CPOS,.CMOV .GLOBL CD,CL,CMOV,CNEX,CPOS,CR,CU,DWL,E,EL,ELL,ELR,RIS,SWL .MCALL .TTYOUT,.TTYIN,.CVIS,.PARS,.TS,.SWL,.CD,.CL,.CR,.CU .MCALL .CPOS,.CMOV,.CNEX,.DWL,.E,.EL,.ELL,.ELR,.RIS ; .MACRO .CD N ;MOVE CURSOR DOWN N SPACES CD: .CD @2(R5) ;CALL CD(7) N:=7; CD(N); RETURN ND: .BLKW 1 .CD: MOV R0,-(SP) MOV ND,R0 CALL SEND .TTYOUT #'B MOV (SP)+,R0 RETURN ;************* ; .MACRO .CL N ;CURSOR LEFT N CL: .CL @2(R5) ;CALL CL(7) CL(N); RETURN NL: .BLKW 1 .CL: MOV R0,-(SP) MOV NL,R0 CALL SEND .TTYOUT #'D MOV (SP)+,R0 RETURN ;************* ; .MACRO .CMOV ROW,COLUMN ;MOVE CURSOR TO (ROW,COLUMN) CMOV: .CMOV @2(R5),@4(R5) ;1 <= ROW <= 24; 1 <= COLUMN <= 80 RETURN ;CALL CMOV(13,7) CMOV(I,J); CCOL: .BLKW 1 CROW: .BLKW 1 .CMOV: MOV R0,-(SP) .TTYOUT #33 ;ESCAPE .TTYOUT #133 ;[ .CVIS CROW,#BUF,#10. ;CONVERT ROW INTO TWO DIGITS .PARS #BUF,#BUF,#SPACE ;REMOVE LEADING SPACES .TS #BUF .TTYOUT #73 ;SEMICOLON .CVIS CCOL,#BUF,#10. ;CONVERT COLUMN INTO TWO DIGITS .PARS #BUF,#BUF,#SPACE .TS #BUF .TTYOUT #110 ;H MOV (SP)+,R0 RETURN ;************* CNEX: .CNEX ;MOVE CURSOR TO BEGINNING OF NEXT LINE CALL CNEX(0) CNEX; RETURN ;************ ; .MACRO .CPOS ROW,COL,B ;TYPE ANY KEY B; MACRO RETURNS CURSOR POSITION & BYTE B CPOS: .CPOS @2(R5),@4(R5),@6(R5) ;CALL CPOS(I,J,B) CPOS(I,J,B); RETURN B: .BLKW 1 COL: .BLKW 1 ROW: .BLKW 1 .CPOS: MOV R0,-(SP) MOV R1,-(SP) MOV 44,-(SP) ;SAVE 44 (JOB STATUS WORD) MOV #^B1000000000000,44 ;SET BIT12, WHICH MAKES TYPED CHAR ;IMMEDIATELY AVAILABLE (NO CR-LF NEEDED) L12: .TTYIN B ;WHEN ARROW PRESSED, TERM SENDS ESC [ A,B,C,D .TTYOUT B ;ECHO CMPB B,#33 ;ESC? BNE DOCUR .TTYIN B ;AFTER ESC, INPUT 2 MORE CHAR .TTYOUT B .TTYIN B .TTYOUT B BR L12 DOCUR: .TTYOUT #33 ;SEND DEVICE STATUS REPORT 6 (REPORT ACTIVE POSITION) .TTYOUT #133 ;ESC [ 6 n .TTYOUT #66 .TTYOUT #156 .TTYIN R0 ;RECEIVE ESC; RECEIVE CURSOR POSITION REPORT .TTYIN R0 ;RECEIVE [ .TTYIN R1 ;RECEIVE ROW NUMBER CMPB R1,#73 ; ;? BEQ SEMI SUB #60,R1 .TTYIN R0 CMPB R0,#73 ; ;? BEQ SEMI SUB #60,R0 MUL #10.,R1 ADD R0,R1 .TTYIN R0 ;NEXT CHAR MUST BE ; SEMI: MOV R1,ROW .TTYIN R1 ;RECEIVE COLUMN NUMBER CMPB R1,#122 ;R? BEQ R SUB #60,R1 .TTYIN R0 CMPB R0,#122 ;R? BEQ R SUB #60,R0 MUL #10.,R1 ADD R0,R1 .TTYIN R0 ;NEXT CHAR MUST BE R R: DEC R1 ;CURSOR WAS MOVED OVER WHEN KEY HIT MOV R1,COL MOV (SP)+,44 ;RESTORE JSW MOV (SP)+,R1 MOV (SP)+,R0 RETURN ;************* ; .MACRO .CR N ;CURSOR RIGHT N CR: .CR @2(R5) ;CALL CR(7) CR(N); RETURN NR: .BLKW 1 .CR: MOV R0,-(SP) MOV NR,R0 CALL SEND .TTYOUT #'C MOV (SP)+,R0 RETURN ;************* ; .MACRO .CU N ;CURSOR UP CU: .CU @2(R5) ;CALL CU(2) CU(2); RETURN NU: .BLKW 1 .CU: MOV R0,-(SP) MOV NU,R0 CALL SEND .TTYOUT #'A MOV (SP)+,R0 RETURN ;************* ; .MACRO .DWL ;DOUBLE WIDTH LETTERS ON LINE WHERE CURSOR IS DWL: .DWL ;CALL DWL(0) DWL; RETURN ;************** ; .MACRO .E ;ERASE SCREEN, BUT NOT GRAPH E: .E ;CALL E(0) E; RETURN ;************* ; .MACRO .EL ;ERASE LINE WHERE CURSOR IS EL: .EL ;CALL EL(0) EL; RETURN ;*********** ; .MACRO .ELL ;ERASE LINE UNDER & LEFT OF CURSOR ELL: .ELL ;CALL ELL(0) ELL; RETURN ;************* ; .MACRO .ELR ;ERASE LINE UNDER & TO RIGHT OF CURSOR ELR: .ELR ;CALL ELR(0) ELR; RETURN ;************** ; .MACRO .RIS ;RESET TERMINAL TO INITIAL STATE RIS: .RIS ;CALL RIS(0) RIS; RETURN ;************ ; .MACRO .SWL ;MAKE LETTERS ON LINE WHERE CURSOR IS NORMAL WIDTH SWL: .SWL ;CALL SWL(0) SWL; RETURN ;************* SEND: .CVIS R0,#S+2,#10. .PARS #S+2,#S+2,#TERM .TS #S RETURN S: .BYTE 33,133,0,0,0,0,0,0,0,0 ;ESC [ DIGITS TERM: .BYTE 40,0 ;SP BUF: .BLKB 7 SPACE: .ASCIZ * * .EVEN .END