;CALL ANSI(XP,YP[,STRING[,LEN]]) ; XP = X POSITION ; YP = Y POSITION ; STRING = ASCII BYTES TO PRINT AT THAT LOCATION ; LEN = LENGTH OF STRING IF NOT TERMINATED WITH A NUL ; .TITLE ANSI PERFORM ADDRESSABLE CURSOR COMMANDS FOR VT100'S .MCALL QIOW$,DIR$ XP=2 YP=4 STRING=6 LEN=10 ANSI:: MOV #DATA,R0 MOV @YP(R5),R1 TST R1 BGE BIGY MOV #1,R1 BR CONY BIGY: CMP R1,#24. BLE CONY MOV #24.,R1 CONY: CLR R2 JSR PC,$CBDMG MOVB #';,(R0)+ MOV @XP(R5),R1 TST R1 BGE XBIG MOV #1,R1 BR CONX XBIG: CMP R1,#132. BLE CONX MOV #132.,R1 CONX: CLR R2 JSR PC,$CBDMG MOVB #'H,(R0)+ CMP (R5),#STRING/2 BLT WRITE MOV MAXLEN,R2 MOV STRING(R5),R1 CMP (R5),#LEN/2 BLT XFRC MOV @LEN(R5),R2 XFRC: MOVB (R1)+,(R0)+ BEQ INCR SOB R2,XFRC BR WRITE INCR: DEC R0 ;DON'T COUNT THE TERMINATING NUL WRITE: SUB #ADDRS,R0 ;CALCULATE THE NUMBER OF BYTES MOV R0,WAL+Q.IOPL+2 MOV CONSOLE,WAL+Q.IOLU DIR$ #WAL RTS PC WAL: QIOW$ IO.WAL,,1,,,, ADDRS: .BYTE 33,133 DATA: .BLKB 148. .END