.TITLE GC .IDENT /X01/ .ENABL LC ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I G E T C O M M A N D L I N E I ; I - - - - - - - - - - - - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; SUBROUTINE PACKAGE TO GET COMMAND LINES ; ;-- ;======================================================================; ; ; ; EXTERNAL MACROS ; .MCALL PROC,GCMLB$,GCML$,RCML$,QIO$S ; ; COMMON READ/WRITE MEMORY ; .PSECT GCDATA,RW,D,GBL,REL,OVR ; PROADR: .WORD 0 ;PROMPT ADDRESS PROLEN: .WORD 0 ;PROMPT LENGTH OUTUNI: .BYTE 0 ;OUTPUT LOGICAL UNIT NUMBER CR: .BYTE 15 ;CONSTANT CARRIAGE RETURN OUTSB: .WORD 0,0 ;OUTPUT I/O STATUS BLOCK COMBLK: GCMLB$ 3,,0 ;3 DEEP @ STACK, BUFFER TO BE FURNISHED ; .PSECT .PAGE .SBTTL GCINIT ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I G C I N I T I ; I - - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; GET COMMAND LINE INITIALIZATION MODULE ; ; CALLING SEQUENCE: CALL GCINIT(INUN,OUUN,INOK,PROM,PRLN,BUFF) ; ; INPUT: ; ; INUN - (B) COMMAND INPUT LOGICAL UNIT NUMBER ; OUUN - (B) COMMAND OUTPUT LOGICAL UNIT NUMBER ; INOK - (L*1) .TRUE. IF INDIRECT FILES ALLOWED, .FALSE. IF NOT ; PROM - (B) PROMPT STRING ; PRLN - (I*2) LENGTH OF PROMPT STRING ; BUFF - (B) INPUT BUFFER, WORD ALLIGNED, AT LEAST 82 BYTES LONG ; ; OUTPUT: NONE ; ; REQUIREMENTS: ; ; INPUT VIA GCDATA: ; ; COMBLK - GET COMMAND CONTROL BLOCK ; G.MODE - CURRENT CONTROL FLAGS ; ; SYSTEM SYMBOLS: ; ; F.LUN - OFFSET OF COMMAND INPUT LOGICAL UNIT NUMBER IN GET COMMAND ; CONTROL BLOCK ; G.MODE - OFFSET OF CONTROL FLAGS IN GET COMMAND CONTROL BLOCK ; GE.COM - GET COMMAND CONTROL FLAG MASK FOR COMMENT LINES ALLOWED ; GE.IND - GET COMMAND CONTROL FLAG MASK FOR INDIRECT FILES ALLOWED ; ; EFFECTS: ; ; OUTPUT VIA GCDATA: ; ; COMBLK - UPDATED COMMAND CONTROL BLOCK ; 156 - COMMAND BUFFER ADDRESS ; F.LUN - COMMAND INPUT LOGICAL UNIT NUMBER ; G.MODE - FLAGS SET FOR NO COMMENT LINE PROCESSING AND INDIRECT ; FILES ALLOWED ACCORDING TO CALLER'S OPTION ; OUTUNI - COMMAND OUTPUT LOGICAL UNIT NUMBER ; PROADR - ADDRESS OF PROMPT STRING ; PROLEN - LENGTH OF PROMPT STRING ; ;-- ;======================================================================; ; .PAGE ; ; PROCEDURE SYMBOLS ; A.INUN = 2. ;INPUT LOGICAL UNIT NUMBER A.OUUN = 4. ;OUTPUT LOGICAL UNIT NUMBER A.INOK = 6. ;INDIRECT FILES OK A.PROM = 8. ;PROMPT STRING A.PRLN = 10. ;PROMPT STRING LENGTH A.BUFF = 12. ;BUFFER ; ; PROCEDURE BODY ; PROC GCINIT MOV #COMBLK,R0 ;ADDRESS OF GET COMMAND BLOCK MOVB @A.INUN(R5),F.LUN(R0) ;PUT INPUT LOGICAL UNIT NUMBER IN COMMAND BLOCK MOVB @A.OUUN(R5),OUTUNI ;SAVE OUTPUT LOGICAL UNIT NUMBER MOVB G.MODE(R0),R1 ;GET GET COMMAND CONTROL FLAGS IF ; INDIRECT FILES ALLOWED FALSEB CLEAR @A.INOK(R5) THEN BISB #GE.IND,R1 ;SET FLAG FOR INDIRECT ALLOWED ELSE BICB #GE.IND,R1 ;CLEAR FLAG FOR INDIRECT ALLOWED ENDIF BICB #GE.COM,R1 ;CLEAR FLAG FOR COMMENTS ALLOWED MOVB R1,G.MODE(R0) ;PUT FIXED UP FLAGS BACK IN COMMAND BLOCK MOV A.PROM(R5),PROADR ;SET PROMPT ADDRESS MOV @A.PRLN(R5),PROLEN ;AND PROMPT LENGTH MOV A.BUFF(R5),156(R0) ;AND BUFFER ADDRESS ENDPROC .PAGE .SBTTL GCREAD ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I G C R E A D I ; I - - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; GET COMMAND LINE MODULE TO READ A LINE ; ; CALLING SEQUENCE: FLAG=GCREAD(RETURN) ; ; INPUT: NONE ; ; OUTPUT: ; ; C-BIT - CLEAR IF SUCCESS, SET IF FAILURE ; GCREAD/R0 - (L) .TRUE. IF SUCCESS, .FALSE. IF FAILURE ; RETURN - LENGTH OF LINE IF SUCCESS, ERROR CODE IF FAILURE ; -1 - I/O ERROR READING INDIRECT FILE ; -2 - ERROR OPENING INDIRECT FILE ; -3 - BAD INDIRECT FILE NAME SYNTAX ; -4 - INDIRECT FILE NESTING DEPTH EXCEEDED ; ; REQUIREMENTS: ; ; INPUT VIA GCDATA: ; ; COMBLK - CURRENT COMMAND CONTROL BLOCK ; 156 - COMMAND BUFFER ADDRESS ; CR - CARRIAGE RETURN CHARACTER ; PROADR - ADDRESS OF PROMPT STRING ; PROLEN - LENGTH OF PROMPT STRING ; ; SYSTEM SYMBOLS: ; ; FD.TTY - COMMAND FROM TERMINAL FLAG MASK ; F.RCTL - OFFSET OF FILE CONTROL FLAGS IN COMMAND CONTROL BLOCK ; G.CMLD - OFFSET OF COMMAND LINE ADDRESS AND LENGTH IN COMMAND ; CONTROL BLOCK ; G.ERR - OFFSET OF ERROR CODE IN COMMAND CONTROL BLOCK ; IE.EOF - END-OF-FILE ERROR CODE VALUE ; ; EFFECTS: ; ; OUTPUT VIA GCDATA: ; ; COMBLK - UPDATED COMMAND CONTROL BLOCK ; ;-- ;======================================================================; ; .PAGE ; ; PROCEDURE SYMBOLS ; A.RET = 2. ;COMMAND LINE LENGTH OR ERROR CODE ; ; PROCEDURE BODY ; PROC GCREAD MOV #COMBLK,R0 ;ADDRESS OF COMMAND BLOCK GCML$ ,PROADR,PROLEN ;GET A COMMAND LINE IF ; LINE FROM A FILE FALSEB SET #FD.TTY,F.RCTL(R0) THEN MOV PROADR,R1 ;ADDRESS OF PROMPT MOV PROLEN,R2 ;LENGTH OF PROMPT CALL PRINT ;OUTPUT THE PROMPT MOV G.CMLD+2(R0),R1 ;ADDRESS OF LINE MOV G.CMLD(R0),R2 ;LENGTH OF LINE CALL PRINT ;PRINT THE LINE MOV #CR,R1 ;ADDRESS OF CARRIAGE RETURN MOV #1,R2 ;LENGTH OF CARRIAGE RETURN CALL PRINT ;PRINT A CARRIAGE RETURN ENDIF MOVB G.ERR(R0),R1 ;GET RETURN CODE IF ; SUCCESS FALSE LT THEN MOV G.CMLD+2(R0),R2 ;GET ADDRESS OF COMMAND MOV G.CMLD(R0),R1 ;GET LENGTH OF LINE FOR RETURN IF ; COMMAND NOT AT BEGINNING OF BUFFER FALSE EQ R2,COMBLK+156 THEN MOV COMBLK+156,R3 ;GET ADDRESS OF BEGINNING OF BUFFER WHILE ; LENGTH > 0 FALSE LE R1 DO MOVB (R2)+,(R3)+ ;MOVE BYTE TO BEGINNING DEC R1 ;DECREMENT COUNT ENDWHILE MOV G.CMLD(R0),R1 ;RESTORE LENGTH OF LINE FOR RETURN ENDIF MOV #-1,R0 ;RETURN .TRUE. CLC ;ALL OK ELSE IF ; ERROR <> END-OF-FILE FALSE EQ R1,#IE.EOF THEN RCML$ ;POP TO TOP LEVEL COMMAND SOURCE ENDIF CLR R0 ;RETURN .FALSE. SEC ;FAILURE ENDIF MOV R1,@A.RET(R5) ;SET RETURN VALUE ENDPROC .PAGE .SBTTL GCFILE ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I G C F I L E I ; I - - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; GET COMMAND LINE MODULE TO INFORM IF PREVIOUS COMMAND WAS FROM AN ; INDIRECT FILE ; ; CALLING SEQUENCE: FLAG=GCFILE() ; ; INPUT: NONE ; ; OUTPUT: ; ; C-BIT - CLEAR IF PREVIOUS COMMAND FROM FILE, SET IF NOT ; GCFILE/R0 - (L) .TRUE. IF PREVIOUS COMMAND FROM FILE, .FALSE. IF NOT ; ; REQUIREMENTS: ; ; INPUT VIA GCDATA: ; ; COMBLK - CURRENT COMMAND CONTROL BLOCK ; F.RCTL - FILE CONTROL FLAGS ; ; SYSTEM SYMBOLS: ; ; FD.TTY - INPUT IS TERMINAL FLAG MASK ; F.RCTL - OFFSET OF FILE CONTROL FLAGS IN COMMAND CONTROL BLOCK ; ;-- ;======================================================================; ; .PAGE ; ; PROCEDURE BODY ; PROC GCFILE MOV #COMBLK,R0 ;ADDRESS OF COMMAND BLOCK IF ; COMMAND FROM A FILE FALSEB SET #FD.TTY,F.RCTL(R0) THEN MOV #-1,R0 ;RETURN .TRUE. CLC ;BOTH WAYS ELSE CLR R0 ;RETURN .FALSE. SEC ;BOTH WAYS ENDIF ENDPROC .PAGE .SBTTL GCPRIN ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I G C P R I N I ; I - - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; GET COMMAND LINE MODULE TO PRINT AN ERROR MESSAGE ; ; CALLING SEQUENCE: CALL GCPRIN(ERROR) ; ; INPUT: ; ; ERROR - (B) GET COMMAND ERROR CODE (SEE GCREAD) ; ; OUTPUT: NONE ; ;-- ;======================================================================; ; .PAGE ; ; PROCEDURE SYMBOLS ; A.ERR = 2. ;ERROR CODE ; ; READ ONLY MEMORY ; MSG0: .ASCII <12>'Unrecogized indirect file error.'<15> LEN0 = .-MSG0 MSG1: .ASCII <12>'I/O error reading indirect file.'<15> LEN1 = .-MSG1 MSG2: .ASCII <12>'Error opening indirect file.'<15> LEN2 = .-MSG2 MSG3: .ASCII <12>'Bad indirect file name syntax.'<15> LEN3 = .-MSG3 MSG4: .ASCII <12>'Indirect file nesting depth exceeded.'<15> LEN4 = .-MSG4 .EVEN ; MSGADR: .WORD MSG0,MSG1,MSG2,MSG3,MSG4 MSGLEN: .WORD LEN0,LEN1,LEN2,LEN3,LEN4 .PAGE ; ; PROCEDURE BODY ; PROC GCPRIN MOVB @A.ERR(R5),R0 ;GET ERROR CODE IF ; ERROR CODE > 0 OR < -4 TRUE GT FALSE GE R0,#-4 THEN CLR R0 ;USE DEFAULT MESSAGE ENDIF NEG R0 ;MAKE IT POSITIVE ASL R0 ;MAKE IT A WORD INDEX MOV MSGADR(R0),R1 ;MESSAGE ADDRESS MOV MSGLEN(R0),R2 ;MESSAGE LENGTH CALL PRINT ;PRINT THE ERROR MESSAGE ENDPROC .PAGE .SBTTL PRINT ; ;======================================================================; ;++ ; +-------------------------------------------------+ ; I I ; I P R I N T I ; I - - - - - I ; I I ; +-------------------------------------------------+ ; ; FUNCTION: ; ; INTERNAL GET COMMAND LINE MODULE TO PRINT ON COMMAND OUTPUT MEDIUM ; ; INPUT: ; ; R1 - ADDRESS OF MESSAGE TO PRINT ; R2 - LENGTH OF MESSAGE TO PRINT ; ; OUTPUT: NONE ; ; REQUIREMENTS: ; ; INPUT VIA GCDATA: ; ; OUTUNI - COMMAND OUTPUT LOGICAL UNIT NUMBER ; ; SYSTEM SYMBOLS: ; ; IO.WLB - WRITE FUNCTION CODE VALUE ; ; EFFECTS: ; ; MODIFIED IN GCDATA: ; ; OUTSB - OUTPUT I/O STATUS BLOCK ; ; NOTES: ; ; USES A SPIN LOCK WHILE WAITING FOR TERMINAL OUTPUT TO COMPLETE ; ;-- ;======================================================================; ; ; ; LOCAL PROCEDURE BODY ; PROCLC PRINT CLR OUTSB ;CLEAR OUTPUT I/O STATUS BLOCK QIO$S #IO.WLB,OUTUNI,,,#OUTSB,, WHILE ; OUTPUT NOT COMPLETE FALSE SET OUTSB DO ENDWHILE ENDPROC .END