; UPDN.MAC ; ; A SUBROUTINE TO PICK UP THE UP OR DOWN ARROW FROM A VT-100 OR ADAM-36 ; TERMINAL. THEY CAN HIT ANY KEY THEY WANT AND THE VALUE OF ; THAT KEY IS PASSED BACK TO THE CALLING PROG. IF THE UP KEY ; IS HIT, YOU GET 33,133,101 FOR THE ADAM 36 OR VT 100 AND ; 33,101 FOR THE VT-52. THE PROGRAM WILL SEE THE 33 AND LOOK FOR ; A SECOND NO. IF IT IS 133 IT WILL LOOK FOR A THIRD NO. AND THEN ; IF IT SEES 101 IT WILL ASSUME THE UP WAS HIT AND PASS OCTAL 34 ; BACK TO THE CALLING PROGRAM. ; IF THE DOWN KEY IS HIT A 33,133,102 OR 33,102 WILL BE RECEIVED ; IT PASSES OCTAL 35 BACK TO THE CALLING PROGRAM. IF ANY OTHER KEY ; OTHER THAN THE UP, DOWN, LEFT, OR RIGHT IS HIT ; WHICH CAUSES THE ESC FOLLOWED BY ANOTHER KEY TO BE TRANSMITTED ; AN X IS PASSED BACK TO CALLING PROGRAM. ; ; FOLLOWING IS A TABLE OF THE NUMBER RETURNED TO CALLING PROG FOR WHICH KEY ; UP 34 ; DOWN 35 ; RIGHT 36 ; LEFT 37 ; .MCALL QIOW$C,ALUN$C,QIOW$S .TITLE UPDN .GLOBL UPDN UPDN:: QIOW$C IO.RAL!TF.RNE,5,1,,,, MOVB STO,R1 BIC #177600,R1 CMP R1,#33 ; IS THIS ESCAPE CHARACTER BEQ TWO ; IF IT IS EXPECT A SECOND CHAR CMP R1,#10 ; IS THIS THE BACK SPACE KEY BEQ L2 ; IF SO, TREAT LIKE LEFT KEY MOVB R1,@2(R5) ; OTHERWISE GIVE IT BACK RETURN TWO: QIOW$C IO.RAL!TF.RNE,5,1,,,, ; GET 2ND CHAR MOVB STO,R1 BIC #177600,R1 ; WAS THIS THE UP KEY? CMP R1,#133 ; IS THIS VT-100 OR ADAM 36? BEQ TWO ; IF SO, GET A THIRD LETTER CMP R1,#117 ; IS THIS A PF KEY BEQ TWO ; PROBABLY SO CMP R1,#101 ; IS THIS THE UP KEY? BNE DTST ; NO IT WASN'T MOVB #34,@2(R5) ; WAS UP KEY, MOVE 37 FOR UP RETURN DTST: CMP R1,#102 ; WAS THIS DOWN KEY BNE RTST ; NO IT WASN'T MOVB #35,@2(R5) ; WAS DOWN KEY, MOVE 35 FOR DOWN RETURN RTST: CMP R1,#103 ; WAS THIS THE RIGHT KEY BNE LTST ; NO IT WASN'T MOVB #36,@2(R5) ; RETURN THE 36 FOR RIGHT RETURN LTST: CMP R1,#104 ; IS THIS THE LEFT KEY BNE PF1 L2: MOVB #37,@2(R5) ; MOVE THE 37 FOR LEFT RETURN PF1: CMP R1,#120 ; IS THIS THE PF1 KEY BNE PF2 MOVB #30,@2(R5) ; RETURN 30 FOR PF1 RETURN PF2: CMP R1,#121 ; IS THIS THE PF2 KEY BNE PF3 ; NO MOVB #31,@2(R5) ; RETURN 31 FOR PF2 KEY RETURN PF3: CMP R1,#122 ; IS THIS PF3 KEY BNE PF4 ; NO MOVB #32,@2(R5) ; MOVE 32 FOR PF3 KEY RETURN PF4: CMP R1,#123 ; IS THIS PF4 KEY BNE XX ; NO MOVB #33,@2(R5) ; MOVE 33 FOR PF4 KEY RETURN XX: MOVB #130,@2(R5) ; DON'T KNOW WHAT THEY DID, SEND X RETURN STO: .BYTE STO2: .BYTE ; ; CALL SEND(A) ; PRINT ONE CHARACTER (A), ON THE TERMINAL SEND:: MOVB @2(R5),STO QIOW$C IO.WVB,5,1,,,, RETURN ; ; CRLF ; DO A CARRIAGE RETURN, LINE FEED CRLF:: QIOW$C IO.WVB,5,1,,,, RETURN CR: .BYTE 15,12 ; ; CALL CUR(Y,X) ; PLACE CURSOR AT LINE NO. Y AND COLUMN NO. X ; CUR:: MOV #OUT,R0 ; LOCATION OF OUTPUT STRING MOV @2(R5),R1 ; GET LINE NO. CLR R2 ; SURPRESS LEADING ZEROES CALL $CBDMG ; CONVERT TO ASCII CHAR. MOVB #73,(R0)+ ; PUT SEMICOLON AFTER NO. MOV @4(R5),R1 ; GET COLUMN NO. CLR R2 ; SURPRESS LEADING ZEROES CALL $CBDMG MOVB #110,(R0)+ ; PUT LETTER H AFTER STRING SUB #OUT1,R0 ; CALCULATE NO. OF CHARACTERS QIOW$S #IO.WVB,#5,#1,,,,<#OUT1,R0> ; OUTPUT IT RETURN OUT1: .BYTE 33,133 OUT: .BLKB 10. ERASR:: QIOW$C IO.WVB,5,1,,,, ; ERASE SCREEN FROM CURSOR DOWN RETURN ERA: .BYTE 33,133,60,112 ;CDN:: QIOW$C IO.WVB,5,1,,,, ; MOVE CURSOR DOWN ; RETURN ;CUP:: QIOW$C IO.WVB,5,1,,,, ; MOVE CURSOR UP ; RETURN ;CU: .BYTE 33,133,101 ;DN: .BYTE 33,133,102 ERASA:: QIOW$C IO.WVB,5,1,,,, RETURN EA: .BYTE 33,133,62,112 WRITE:: MOVB @2(R5),CHAR QIOW$C IO.WVB,5,1,,,, RETURN CHAR: .BYTE .EVEN ;RITE:: QIOW$C IO.WVB,5,1,,,, ; RETURN CUP:: MOVB #101,TEM ; CURSOR UP ENDS IN A BR CMOV CDN:: MOVB #102,TEM ; CURSOR DOWN ENDS IN B BR CMOV RITE:: MOVB #103,TEM ; CURSOR RIGHT ENDS IN C BR CMOV LEFT:: MOVB #104,TEM ; CURSOR LEFT ENDS IN D CMOV: MOV #1,R1 ; DEFAULT SPACES TO MOVE TST (R5) ; IS THERE AN ARGUMENT? BLE RIT2 ; NO THERE WASN'T MOV @2(R5),R1 ; WAS AN ARGUMENT, GET NO. SPACES RIT2: MOV #CM+2,R0 ; ADDDRESS WHERE OUTPUT WILL GO CLR R2 ; SURPRESS LEADING ZEROES CALL $CBDMG ; MAKE CONVERSION MOVB TEM,(R0)+ ; PUT C AT END OF STRING SUB #CM,R0 ; GET NO. OF CHARACTERS QIOW$S #IO.WVB,#5,#1,,,,<#CM,R0> ; SEND STRING RETURN CM: .BYTE 33,133 .BLKB 4 ;LEFT:: QIOW$C IO.WVB,5,1,,,, ; RETURN ;RT: .BYTE 33,133,103 ;LEF: .BYTE 10 TEM: .BYTE .EVEN .END