; ; GETF.MAC ; ; A SUBROUTINE THAT WILL ALLOW ONE TO GET CHARACTERS AND ALSO ; USE THE LEFT AND RIGHT ARROW ON A VT-100 OR ADAM 36 TERMINAL. THUS, ; ONE CAN CHANGE A CHARACTER THAT WAS ENTERED AS LONG AS THE ; CARRIAGE RETURN HAS NOT BEEN HIT. A REPLACEMENT OF GET.MAC ; ; CALL THE SUBROUTINE USING THE FOLLOWING COMMAND: ; CALL GETF(ARRAY,[MAXIMUM NO. OF CHARACTERS ALLOWED]) ; .MCALL QIOW$C,EXIT$S,QIOW$S .TITLE GETF .GLOBL GETF GETF:: MOV R5,RSAV ; SAVE THE VALUE OF R5 MOV 2(R5),R3 ; GET THE ADDRESS OF THE ARRAY MOV R3,LEND ; ALSO SAVE THIS AS LEFT END CLR R4 TST 4(R5) ; IS THERE A 2ND ARGUMENT BLT IN ; NO THERE ISN'T MOV R3,R4 ADD @4(R5),R4 ; THIS IS ADDRESS FOR RIGHT MOST CHAR IN: MOV #LIST,R5 ; USE THIS VALUE OF R5 WHEN CALLING UPDN LOOP: CALL UPDN ; GET A CHAR RESULT IN R1 MOVB @2(R5),R1 CMPB R1,#37 ; IS THIS THE LEFT ARROW ? BEQ LEF ; YES CMPB R1,#36 ; IS THIS THE RIGHT ARROW? BEQ RIT ; 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 MOVB R1,BUF CALL PRINT BR LOOP LEF: CMP R3,LEND ; ARE WE AT LEFT END BEQ LOOP ; YES DEC R3 ; DECREMENT ADDRESS CALL LEFT BR LOOP RIT: CMP R3,R4 ; ARE WE AT RIGHT END? BEQ LOOP ; YES. INC R3 ; INCREMENT ADDRESS CALL RITE BR LOOP DELET: CMP R3,LEND ; ARE WE AT LEFT END BEQ LOOP ; YES. CALL LEFT ; MOVE CURSOR ONE TO LEFT 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 CALL LEFT ; CURSOR MOVED TO RIGHT BR LOOP PRINT: QIOW$C IO.WAL,5,1,,,, ; WRITE THE CHARACTER RETURN DONE: MOV RSAV,R5 ; GET BACK ORIGINAL VALUE OF R5 MOVB #15,BUF ; PLACE CR RETURN IN BUF CALL PRINT ; PRINT THE CR RETURN ; ALL FINNISHED ; ; DATA SECTION ; LIST: .WORD ; NO. OF ARGUMENTS .WORD CHAR ; 1ST ARG ADDRESS CHAR: .BYTE ; PLACE TO STORE CHAR .EVEN RSAV: .WORD ; SAVE THE ORIG VALUE OF R5 LEND: .WORD ; VALUE OF LEFT END BUF: .BYTE .EVEN .END