; ; GET.MAC ; ; A SUBROUTINE THAT WILL ALLOW ONE TO GET CHARACTERS AND ALSO ; USE THE LEFT AND RIGHT ARROW ON A HAZELTINE TERMINAL. THUS, ; ONE CAN CHANGE A CHARACTER THAT WAS ENTERED AS LONG AS THE ; CARRIAGE RETURN HAS NOT BEEN HIT. ; ; CALL THE SUBROUTINE USING THE FOLLOWING COMMAND: ; CALL GET(ARRAY,[MAXIMUM NO. OF CHARACTERS ALLOWED]) ; .MCALL QIOW$C,EXIT$S,QIOW$S .TITLE GETSTR ; GET STRING .GLOBL GETSTR GETSTR: MOV 2(R5),R3 ; GET THE ADDRESS OF THE ARRAY CLR R4 TST 4(R5) ; IS THERE A 2ND ARGUMENT BLT LOOP ; NO THERE ISN'T MOV R3,R4 ADD @4(R5),R4 ; THIS IS ADDRESS FOR RIGHT MOST CHAR LOOP: QIOW$C IO.RAL!TF.RNE,5,1,,,, ; GET A CHAR, NO ECHOE MOVB BUF,R1 BIC #177600,R1 ; CLEAR THE PARITY BIT CMPB R1,#10 ; IS THIS THE LEFT ARROW ? BEQ LEFT ; YES CMPB R1,#20 ; IS THIS THE RIGHT ARROW? BEQ RITE ; YES CMPB R1,#15 ; IS THIS A CARRIAGE RETURN? BEQ DONE ; IF SO, GET OUT OF SUBROUTINE CMPB R1,#177 ; IS THIS THE DELETE KEY BEQ DELET ; ; THIS IS NOT AN ARROW, A CARRIAGE RETURN, OR THE DELETE KEY ; CMP R3,R4 ; ARE WE AT THE RIGHT END? BEQ LOOP ; IF SO, DON'T PRINT IT MOVB R1,(R3) ; ACCEPT THIS CHARACTER INC R3 ; ALSO, INCREMENT ADDRESS FOR NEXT CHARACTER CALL PRINT BR LOOP LEFT: CMP R3,2(R5) ; ARE WE AT LEFT END BEQ LOOP ; YES DEC R3 ; DECREMENT ADDRESS CALL PRINT BR LOOP RITE: CMP R3,R4 ; ARE WE AT RIGHT END? BEQ LOOP ; YES. INC R3 ; INCREMENT ADDRESS CALL PRINT BR LOOP DELET: CMP R3,2(R5) ; ARE WE AT LEFT END BEQ LOOP ; YES. MOVB #10,BUF ; MOVE CURSOR ONE TO THE LEFT CALL PRINT DEC R3 ; BACK UP ONE IN THE ARRAY MOVB #40,(R3) ; PUT A SPACE IN THE ARRAY MOVB #40,BUF ; PUT A SPACE ON THE SCREEN CALL PRINT MOVB #10,BUF ; CURSOR MOVED TO RIGHT CALL PRINT ; SO MOVE BACK TO THE LEFT BR LOOP PRINT: QIOW$C IO.WAL,5,1,,,, ; WRITE THE CHARACTER RETURN DONE: CALL PRINT ; PRINT THE CR RETURN ; ALL FINNISHED ; ; DATA SECTION ; BUF: .BYTE .EVEN .END