.TITLE GTLIN -- GET COMMAND LINE .SBTTL GTLIN -- DOCUMENTATION .IDENT /GCE001/ .MCALL GCMLB$,GCML$,RCML$ ; ; GTLIN -- GET A COMMAND LINE. ; ------------------------------ ; CALL GTLIN(LINE,IPRM,LU,NCH,NPRM [,UPPCAS [,CLOSE]]) ;;;; CALL GTLIN(LINE,NCH,LU,IPRM,NPRM [,UPPCAS [,CLOSE]]) ; LINE ARRAY OF LENGTH 80 BYTES. ; NCH IF NON-NEGATIVE, IS NUMBER OF BYTES READ. ; IF -1, IS EOF. ; IF -2, I/O ERROR. ; LU LOGICAL UNIT TO READ FROM. ; IPRM PROMPT STRING ; NPRM NUMBER OF CHARACTERS IN PROMPT. ; UPPCAS OPTIONAL CASE FLAG - .TRUE.=UPPERCASE, .FALSE.=LOWERCASE ; DEFAULT .TRUE. ; CLOSE OPTIONAL CLOSE FLAG - .TRUE.=CLOSE, .FALSE.=NO CLOSE ; DEFAULT .TRUE. ; ; SETEXT -- SET DEFAULT EXTENSION FOR INDIRECT COMMAND FILES. ; ------------------------------------------------------------ ; CALL SETEXT(NEWEXT) ; NEWEXT -- 3 RAD50 CHARACTER EXTENSION FOR COMMAND FILES. ; ; FLUSHC -- FLUSH ALL INDIRECT COMMAND FILES. ; -------------------------------------------- ; ; CALLING SEQUENCE: ; CALL FLUSHC ;EDITS: ; GCE001 - NULL BYTE AFTER THE LAST VALID BYTE (FOR RT11 ; COMPATIBLITY) ; - DEFAULT ARGUMENTS TO A PROMPT OF "CMD>" ; AND LUN 5 SO ONLY 1ST ARG IS REQUIRED ; (AGAIN FOR RT11 COMPATIBILITY) ; .PAGE .PSECT DATA,D DFPRP: .ASCII <15><12>/CMD>/ .EVEN DFPRPL=.-DFPRP ;LENGTH OF DEFAULT PROMPT DFPRPW: .WORD 0 ;WORK LENGTH .SBTTL GMCL TABLES ; ; COMMAND BLOCK ; .PSECT GCBLK,D GCBLK.:: .ENABL LSB GCM: GCMLB$ 3,,,,,,,DFNB .DSABL LSB .EVEN ; .PSECT CODE,I GTLIN:: CMPB @R5,#4 ;WAS THE NO .CHARS THERE ARG GIVEN? BLT 37$ ;IF NCH ARG THERE? CLR @10(R5) ;SET FOR NULL LINE OR EOF. 37$: CMPB @R5,#3 ;ANY LUN ARGUMENT? BGE 40$ ;IF GE YES MOVB #5,GCM+F.LUN BR 41$ 40$: MOVB @6(R5),GCM+F.LUN ;SET NEW LU. 41$: BICB #GE.LC,GCM+G.MODE ;DEFAULT NO LOWER CASE BISB #GE.CLO,GCM+G.MODE ;DEFAULT CLOSE FILE AFTER READ. CMPB #6,(R5) ;OPTIONAL PARAMETERS PRESENT? BGT 20$ ;NO MOV 14(R5),R0 ;GET LOWER CASE FLAG IF PRESENT CMP #-1,R0 ;IS IT NULL BEQ 10$ ;EQ - YES BIT #100000,(R0) ;IS IT TRUE BNE 10$ ;NE - YES BISB #GE.LC,GCM+G.MODE ;FALSE - ENABLE LOWER CASE 10$: CMPB #7,(R5) ;OPTIONAL CLOSE FLAG PRESENT? BGT 20$ ;LE - NO MOV 16(R5),R0 ;GET FLAG CMP #-1,R0 ;IS IT NULL BEQ 20$ ;EQ - YES BIT #100000,(R0) ;IS IT TRUE BNE 20$ ;NE - YES BICB #GE.CLO,GCM+G.MODE ;FALSE - NO CLOSE 20$: CMPB @R5,#2 ;2 ARGS THERE (OR MORE?)? BGE 42$ ;IF GE YES, DO IT GCML$ #GCM,#DFPRP,#DFPRPL ;ELSE USE DEFAULT PROMPT BR 43$ ;AND SKIP THE OTHER 42$: CMPB @R5,#5 ;WAS PROMPT LENGTH GIVEN? BGE 48$ ;IF SO USE IT JSR R5,S.RSAV ;IF NOT LOOK FOR NULL IN 2ND ARG CLR DFPRPW ;NULL LENGTH OF WORK LENGTH MOV #40,R1 MOV 4(R5),R0 ;GET ADDR OF ARG 2 49$: TSTB (R0)+ ;LOOK FOR NULL BEQ 50$ ;EXIT WHEN WE GET ONE CMPB #200,-1(R0) ;NO CRLF TYPE TERMINATOR? BEQ 51$ INC DFPRPW ;ELSE COUNT CHARS DEC R1 BGT 49$ 50$: .MCALL DIR$ DIR$ #CLF ;EMIT A CRLF FIRST... ; (IGNORES ERRORS ON THE QIOW$) 51$: JSR R5,S.RRES ;RESTORE REGS .IF NDF,RT... DIR$ #CLF ;EMIT AN EXTRA CRLF .ENDC GCML$ #GCM,4(R5),DFPRPW ;GET DATA WITH PROMPT BR 43$ 48$: GCML$ #GCM,4(R5),@12(R5) ;GET COMMAND LINE. 43$: BCC MOVLN ;IF NO ERROR, GO MOVE LINE. CLRB @2(R5) ;NULL 1ST BYTE OF LINE CMPB @R5,#4 ;IS THERE A 2ND ARG? BLT 44$ ;IF NOT DON'T SET ONE MOV #-1,@10(R5) ;SET FOR EOF. 44$: CMPB #GE.EOF,GCM+G.ERR BEQ DONL ;DONE IF EOF. CMPB @R5,#4 ;IS THERE A 2ND ARG? BLT DONL MOV #-2,@10(R5) ;I/O ERROR. CLRB @2(R5) ;NULL 1ST BYTE OF LINE DONL: RETURN MOVLN: MOV GCM+G.CMLD,R2 ;GET # OF CHARS. BLE DONL MOV GCM+G.CMLD+2,R1 ;GET ADDRESS OF CHARS. CMP #80.,R2 ;TRUNCATE EXCESS BGE MVL MOV #80.,R2 MVL: CMPB @R5,#4 ;IS THERE A 2ND ARG? BLE 45$ MOV R2,@10(R5) ;SAVE NUMBER OF CHARS. 45$: MOV 2(R5),R0 ;SAVE USER BUFFER LPM: MOVB (R1)+,(R0)+ DEC R2 BNE LPM CLRB @R0 ;NULL AFTER LAST BYTE OF LINE RETURN ; ; ; .$PRNT - PRINT A CHARACTER STRING POINTED AT BY TOS AND NULL ; TERMINATED ON LUN 5 (USING IO.WVB FOR SAFETY) ; ; ASSUMES CALL (FROM .PRINT ADDR MACRO) OF ; MOV ADDR,-(SP) ; JSR PC,.$PRNT ;PRINT THE STRING ; INC (SP)+ ;CLEAR UP THE STACK ; ; .$PRNT:: JSR R5,S.RSAV ;SAVE REGISTERS .MCALL QIOW$S MOV 16(SP),R0 ;USER STRING ADDRESS MOV #80.,R1 ;LIMIT TO 80 CHARS TILL NULL .MCALL DIR$ .MCALL QIOW$ DIR$ #CLF ;EMIT CRLF FIRST MOV R0,R2 1$: BITB #177,(R2)+ BEQ 2$ ;SEARCH FOR NULL OR 200 OCTAL DEC R1 ;TILL WE RUN OUT BGT 1$ ;THEN KEEP ON LOOKING 2$: DEC R2 ;BACK UP OVER OLD AUTOINC SUB R0,R2 ;GET LENGTH OF BUFFER BLE 3$ ;NEG OR 0 WON'T WORK .MCALL QIOW$S QIOW$S #IO.WVB,#5,#5,,,, ;EMIT THE BUFFER 3$: JSR R5,S.RRES ;RESTORE CALLER REGISTERS RTS PC ;AND GO BACK .PSECT DATA,D CLF: QIOW$ IO.WVB,5,5,,,, CLFBUF: .BYTE 15,12 .EVEN ; TTYOUT ; EMIT CHAR. CHARACTER ON TOP OF STACK PRIOR TO ; CALL. TTYOUT:: JSR R5,S.RSAV MOV SP,R5 ;COMPUTE ADDRESS ON STACK OF CHARACTER ADD #16,R5 ;POINT AT 16(SP) ; MOV 16(SP),R0 ;GET A CHARACTER QIOW$S #IO.WVB,#5,#5,,,, ;EMIT THE CHARACTER VIA QIO$ ; ASSUMES LUN 5 IS TTY. JSR R5,S.RRES RTS PC ; .PSECT CODE,I ; S.RSAV AND S.RRES - SYSTEM REGISTER SAVE/RESTORE ; CALL VIA JSR R5,S.RSAV OR JSR R5,S.RRES S.RSAV:: MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV 12(SP),-(SP) ;COPY CALLING R5 RTS R5 ;SO WE RETURN WITH R5 AS AT CALL S.RRES:: TST (SP)+ ;JUNK CALLING R5 MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;RTS POPS R5 OFF .SBTTL FLUSHC -- MAIN CODE. ; ; SUBROUTINE FLUSHC ; FLUSHC:: RCML$ #GCM RETURN .SBTTL SETEXT -- MAIN CODE ; ; SUBROUTINE SETEXT(NEWEXT) ; SETEXT:: MOV @2(R5),DFNB+N.FTYP RETURN .PSECT DATA,D ;TTYINR -- EMULATE RT11 .TTINR MACRO VIA QIO$ TO LUN 5 JSW:: .WORD 0 ;EMULATED RT11 JSW ; NOTE 100000 BIT MEANS NO ECHO ON READ RIP: .WORD 0 ;READ IN PROGRESS FLAG BUF: .WORD 0 IOS: .WORD 0,0 ;USE IOSB TO SAY READ GOING OR DONE .MCALL QIO$,DIR$ RD: QIO$ IO.RLB!TF.RNE,5,5,,IOS,, RDE: QIO$ IO.RLB,5,5,,IOS,, .EVEN .PSECT CODE,I TTYINR:: TST RIP ;READ GOING? BNE 1$ ;IF SO GO SEE IF DONE ;START READ UP IF NONE STARTED CLR IOS ;ZERO ANY IOSB STUFF BIT #100000,JSW ;NO ECHO MODE? BEQ 100$ ;IF EQ NO, READ WITH ECHO DIR$ #RD ;READ STARTUP, NO ECHO BR 101$ 100$: DIR$ #RDE ;READ WITH ECHO 101$: INC RIP ;FLAG READ IN PROGRESS 1$: TSTB IOS BEQ 2$ ;IF 0 IOS, NOTHING HAPPENING, RETURN CS MOVB BUF,R0 ;GET CHAR TO R0 IF ALL IS WELL CLR RIP ;SAY NO READ IN PROGRESS NOW ;NOTE NO ERROR IS TESTED FOR. TOO BAD IF ONE HAPPENS. CLC RETURN 2$: SEC RETURN ;TTYIN - CALL TTYINR TO GET THE CHARACTER TO R0 TTYIN:: 2$: JSR PC,TTYINR BCC 1$ .MCALL WSIG$S WSIG$S ;WAIT FOR ANY SIG EVENT BR 2$ ;LOOP BACK AND TRY ANOTHER READ 1$: RTS PC ;RETURN WITH CHARACTER IN R0 .END