.TITLE BLKCML .IDENT /V1.0/ .IF EQ DEBUG .PSECT BLKCML,RO .IFF .PSECT BLKCML,RW .ENDC ;+ ; MACHINE/SYSTEM - PDP-11/70 / IAS V3.0 ; AUTHOR - JOHN GUIDI ; DATE - 22-SEPTEMBER-80 ; RESIDENCE - LB:[?,?]BLKCML.MAC ; LANGUAGE - MACRO-11 D1113 ; ; FILE CONTENTS: ; ROUTINE FUNCTION ; ------- ---------------------------------------------------- ; GETCML OBTAINS THE COMMAND LINE ; OPNLST OPENS THE LIST FILE ; OPNSRC OPENS THE NEXT SOURCE FILE AND SELECTS DEVICE TO USE ;- .MCALL FINIT$ .MCALL GCMLB$,GCMLD$,GCML$ .MCALL CSI$,CSI$1,CSI$2 .MCALL OFNB$W,CLOSE$ .MCALL GET$S,OPEN$R .MCALL CSI$SW,CSI$ND GCMLD$ ; DEFINE GCML OFFSETS CSI$ HELP:: .ASCII /HELP/ .SBTTL GETCML -> OBTAINS THE COMMAND LINE GETCML:: ;+ ; ROUTINE: GETCML ; ; EFFECT: THIS ROUTINE OBTAINS THE COMMAND LINE. IF A "?" OR "HELP" ; IS OBTAINED, THEN THE HELP FRAME IS DISPLAYED, AND THEN ; THE USER IS PROPMTED FOR THE COMMAND LINE. ; ; INPUTS: 1. (NONE) ; ; OUTPUTS: 1. CSIBLK IS FILLED IN BY CSI$1 MACRO ; 2. C-BIT CLEAR IF COMMAND LINE OBTAINED ; C-BIT SET IF GCML$ ERROR (EOF OR OTHERWISE) ; 3. (NO REGISTERS PRESERVED) ; ; ROUTINES ; CALLED: 1. BLKHLP ; 2. BLKTRP (THROUGH ERROR MACRO) ;- ; ; 1. GET THE COMMAND LINE ; FINIT$ ; EXPLICITLY INITIALIZE THE FSR GCML$ #GCML ; GET COMMAND LINE. R0 -> GCML BLOCK BCC 20$ ; GCML$ WAS OK. GOTO NEXT STEP. CMPB #GE.EOF,G.ERR(R0) ; WAS ERROR EOF ? BNE 10$ ; NO. GO REPORT ERROR AND EXIT. SEC ; SET CARRY TO TERMINATE PROGRAM JMP 999$ ; YES. EOF IS ALLOWED. GO EXIT. ; GCML$ ERROR 10$: ERROR GCMLXX ; PRINT ERROR MESSAGE SEC ; INDICATE FAILURE JMP 999$ ; THEN EXIT. ; ; 2. USE CSI$1 TO COMPRESS THIS COMMAND, AS WELL AS CHECK FOR SYNTACTIC ; VALIDITY. THEN CHECK TO SEE IF THE HELP TEXT WAS REQUESTED VIA '?' ; OR 'HELP'. IN OTHER WORDS, CHECK FOR CSI SYNTAX EXCEPTIONS. ; 20$: CSI$1 #CSIBLK,, ; ANALYZE COMMAND LINE BCC 30$ ; SYNTAX OK. CHECK TO SEE IF 'HELP'. ; THE ONLY EXPECTED ERROR FROM CSI$1 ; IS WHERE COMPRESSED COMMAND IS '?'. ;------------------------------------- CMP #1, ; IS THERE ONLY ONE CHARACTER IN CML? BNE 25$ ; NO. GO REPORT SYNTAX ERROR. MOV ,R2 ; R2 -> COMPRESSED COMMAND LINE BUFFER CMPB #'?,(R2) ; IS THE SINGLE CHARACTER A '?' ? BNE 25$ ; NO. GO REPORT SYNTAX ERROR. BR 50$ ; '?' COMMAND. GOTO COMMON HELP CALL ; SYNTAX ERROR IN CSI$1 AND IT WASN'T ; A '?' FOR THE HELP FRAME. ;------------------------------------- 25$: ERROR SYNTXX ; PRINT ERROR MESSAGE BR GETCML ; RE-START ; ; 3. CSI$1 RETURNED SUCCESS. SEE IF ANYTING WAS ACTUALLY ENTERED. IF ; SOMETHING WAS, SEE IF IT WAS 'HELP'. ; ; CSI$1 RETURNED SUCCESS. CHECK TO ; ENSURE THAT SOMETHING WAS ACTUALLY ; ENTERED WITH GCML$. ;------------------------------------- 30$: TST ; IS THE COMMAND LINE SIZE = 0 ? BEQ GETCML ; YES. NO COMMAND WAS ENTERED.RE-START ; IF SYNTAX IS OK, FIRST CHECK TO ; SEE WHETHER 'HELP' WAS REQUESTED. ;------------------------------------- MOV ,R1 ; R1 = # BYTES IN COMMNAD LINE BUFFER CMP #4,R1 ; 4 CHARACTERS IN COMMAND LINE? BNE 70$ ; NO. LET PARSER TAKE OVER. MOV ,R2 ; R2 -> ADDRESS OF COMMAND LINE BUFFER MOV #HELP,R3 ; R3 -> 'HELP' 40$: CMPB (R2)+,(R3)+ ; ARE CHARACTERS THE SAME? BNE 70$ ; NO. EXIT. WE HAVE THE COMMAND LINE SOB R1,40$ ; YES. TRY NEXT CHARACTER ; IF WE FALL THROUGH THIS LOOP, THEN ; 'HELP' WAS REQUESTED. 50$: CALL BLKHLP ; COMMON HELP SUBROUTINE CALL BR GETCML ; RE-START AFTER BLKHLP ROUTINE 70$: CLC ; INDICATE THAT WE HAVE COMMAND LINE 999$: ; LABEL FOR ERRORS RETURN .SBTTL OPNLST -> OPENS THE LIST FILE OPNLST:: ;+ ; ROUTINE: OPNLST ; ; EFFECT: THIS ROUTINE OBTAINS THE LIST FILE FROM CSIBLK, AND ; OPENS THAT FILE AS THE LIST FILE. ; ; INPUTS: 1. CSIBLK (ALREADY PROCESSED BY CSI$1) ; 2. (NO REGISTERS INPUT) ; ; OUTPUTS: 1. CSIBLK (POINTS TO FIRST SOURCE FILE) ; 2. LSTFDB (LIST FILE HAS BEEN OPENED) ; 3. C-BIT CLEAR IF LIST FILE SUCCESSFULLY OPENED ; C-BIT SET IF LIST FILE HAS NOT BEEN OPENED ; 4. (NO REGISTERS PRESERVED) ; ; ; NOTE: CSI$ USES THE TERMS 'INPUT' AND 'OUTPUT' SOMEWHAT AMBIGUOUSLY. ; WE WILL USE THE TERMS 'LIST' AND 'SOURCE' IN THE FOLLOWING FASHION: ; ; CSI$ COMMAND: OUTPUT/SWITCHES ; OUR INTERPRETATION: LIST = TERMINAL ; SOURCE = OUTPUT ; ; CSI$ COMMAND: OUTPUT=INPUT/SWITCHES ; OUR INTERPRETATION: LIST = OUTPUT ; SOURCE = INPUT ; ; ROUTINES ; CALLED: 1. BLKTRP (THROUGH ERROR MACRO) ; 2. .PARSE ;- ; ; 1. DETERMINE WHETHER BOTH SOURCE AND LIST FILES HAVE BEEN SPECIFIED ; MOV #CSIBLK,R0 ; R0 -> CSIBLK BITB #CS.EQU,C.STAT(R0) ; DOES COMMAND LINE HAVE '=' ? BNE 10$ ; YES. GO OBTAIN THE LIST FILESPEC. MOV #"TI, ; NO. FILL DEF. NAME BLOCK WITH TERM. BR 90$ ; GO AND OPEN THE LIST FILE. ; ; 2. ARRIVAL HERE INDICATES THAT WE ASSUME THAT BOTH THE SOURCE AND LIST ; FILES HAVE BEEN SPECIFIED ON THIS COMMAND LINE. FIRST WE CHECK THE ; LIST FILE SPECIFICATION BY: ; 1. CSI$2 - AN ERROR INDICATES AN OBVIOUS SYNTAX ERROR ; 2. ENSURING THAT NO SWITCHES ARE PRESENTED WITH THE LIST FILE ; 3. ENSURING THAT THE LIST FILE CONTAINS NO WILDCARDS ; 4. ENSURING THAT MULTIPLE LIST FILES HAVE NOT BEEN SPECIFIED ; 10$: CLR SWMASK ; INITIALIZE THE SWITCH MASK CSI$2 #CSIBLK,OUTPUT,#SWTABL ; PARSE THE LIST FILESPEC BCC 20$ ; ANY OBVIOUS ERRORS? NO. ERROR LSYNXX ; YES. REPORT ERROR. SEC ; INDICATE FAILURE BR 999$ ; GO EXIT 20$: TST SWMASK ; ANY SWITCES ON LIST FILE? BEQ 30$ ; NO. GOTO NEXT CHECK. ERROR LSWIXX ; YES. REPORT ERROR SEC ; INDICATE FAILURE BR 999$ ; GO EXIT ; R0 -> CSIBLK 30$: BITB #CS.WLD,C.STAT(R0) ; ARE THERE WILDCARDS IN LIST FILE? BEQ 40$ ; NO. GOTO TEXT CHECK. ERROR LWLDXX ; YES. REPORT ERROR. SEC ; INDICATE FAILURE BR 999$ ; GO EXIT 40$: BITB #CS.MOR,C.STAT(R0) ; ARE THERE MULTIPLE LIST FILES? BEQ 50$ ; NO. FILL IN LIST FDB. ERROR LMULXX ; YES. REPORT ERROR SEC ; INDICATE FAILURE BR 999$ ; GO EXIT ; AT THIS POINT, WE ASSUME THAT AN ; EXPLICIT LIST FILE HAS BEEN GIVEN. ; IF THE DEVICE IS NOT INCLUDED, ; ASSUME THE SYSTEM DEVICE AS DEFAULT. ;------------------------------------- 50$: MOV #"SY, ; FILL IN DEF. NAME BLOCK WITH SY: ; ; 3. OPEN THE LIST FILE ; 90$: MOV #LSTFDB,R0 ; R0 -> LSTFDB MOV #,R1 ; R1 -> FILE NAME BLOCK IN LSTFDB MOV #,R2 ; R2 -> DATA SET DESCRIPTOR MOV #LSTNMB,R3 ; R3 -> DEFAULT NAME BLOCK CALL .PARSE ; FILL IN LSTFDB FILE NAME BLOCK BCC 100$ ; .PARSE OK? YES. ERROR LPRSXX ; NO. REPORT ERROR SEC ; INDICATE FAILURE BR 999$ ; GO EXIT 100$: OFNB$W #LSTFDB ; OPEN LIST FILE BCC 110$ ; OFNM$W OK? YES. EXIT ERROR LOPNXX ; NO. REPORT ERROR SEC ; INDICATE FAILURE BR 999$ ; GO EXIT 110$: CLC ; INDICATE SUCCESS 999$: ; LABEL FOR ERROR RETURN .SBTTL OPNSRC -> OPENS THE (NEXT) SOURCE FILE AND SELECTS DEVICE OPNSRC:: ;+ ; ROUTINE: OPNSRC ; ; EFFECT: THIS ROUTINE OBTAINS THE NEXT SOURCE FILE FROM CSIBLK, ; AND OPENS THAT FILE AS THE INPUT FILE FOR THIS UTILITY. ; WILDCARDS ARE NOT ALLOWED FOR THE UTILITY INPUT FILE. ; ; INPUTS: 1. CSIBLK (POINTS TO NEXT SOURCE FILE) ; 2. (NO REGISTERS INPUT) ; ; OUTPUTS: 1. CSIBLK (POINTS TO FOLLOWING SOURCE FILE, IF ANY) ; 2. INPFDB (SOURCE FILE SUCCESSFULLY OPENED AS INPUT FILE) ; 3. C-BIT CLEAR IF SOURCE FILE SUCCESSFULLY OPENED ; C-BIT SET IF SOURCE FILE HAS NOT BEEN OPENED ; 4. INDICATES IF THERE ARE MORE SOURCE FILES. ; IF THERE ARE, THEN BIT #CS.MOR WILL BE SET. ; 5. DEVNAM (CONTAINS THE VALUE OF THE /DE: SWITCH, IF SPECIFIED, ; OR SY0:, IF /DE: IS NOT SPECIFIED) ; 6. DEVSIZ (CONTAINS NUMBER OF ACTUAL DEVNAM CHARACTERS) ; 7. BITDSP (FIRST WORD OF BITMAP DATASET IS SET TO DEVSIZ) ; 8. INXDSP (FIRST WORD OF INDEX FILE DATASET IS SET TO DEVSIZ) ; 9. MSTDSP (FIRST WORD OF MASTER DIRECTORY DATASET SET TO DEVSIZ) ; 10. WLDDSP (FIRST WORD OF WILD DIRECTORY DATASET SET TO DEVSIZ) ; 11. LSTFDB (IF ERROR DURING UTILITY INPUT FILE OPEN, THEN THE ; LIST FILE IS CLOSED. ; 12. (NO REGISTERS PRESERVED) ; ; ; NOTE: CSI$ USES THE TERMS 'INPUT' AND 'OUTPUT' SOMEWHAT AMBIGUOUSLY. ; WE WILL USE THE TERMS 'LIST' AND 'SOURCE' IN THE FOLLOWING FASHION: ; ; CSI$ COMMAND: OUTPUT/SWITCHES ; OUR INTERPRETATION: LIST = TERMINAL ; SOURCE = OUTPUT ; ; CSI$ COMMAND: OUTPUT=INPUT/SWITCHES ; OUR INTERPRETATION: LIST = OUTPUT ; SOURCE = INPUT ; ; ; ROUTINES ; CALLED: 1. BLKTRP (THROUGH ERROR MACRO) ;- ; ; 1. PARSE THE SOURCE FILE INTO CSIBLK DATASET DESCRIPTOR, WHICH IS ; ATTACHED TO INPFDB (FDB FOR INPUT FILE). ; MOV #CSIBLK,R0 ; INITIALIZE R0 -> CSIBLK CLR SWMASK ; INITIALIZE THE SWITCH MASK BITB #CS.EQU,C.STAT(R0) ; DOES COMMAND LINE HAVE '='? BNE 10$ ; YES. GO GET THE 'INPUT' SOURCE FILE CSI$2 R0,OUTPUT,#SWTABL ; NO. PARSE THE 'OUTPUT' SOURCE FILE BR 20$ ; GOTO COMMON CODE 10$: CSI$2 R0,INPUT,#SWTABL ; PARSE THE 'INPUT' SOURCE FILE 20$: BCC 30$ ; CSI$2 ERRORS? NO. ERROR ISYNXX ; YES. REPORT ERROR BR 37$ ; GO CLOSE LIST FILE ; ; 2. OPEN THIS SOURCE FILE AS THE UTILITY INPUT FILE ; 30$: BITB #CS.WLD, ; ANY WILDCARDS IN SOURCE FILE? BEQ 35$ ; NO. ERROR IWLDXX ; YES. REPORT ERROR BR 37$ ; GO CLOSE LIST FILE 35$: OPEN$R #INPFDB ; OPEN THE INPUT FILE BCC 40$ ; OPEN$R OK? YES. ERROR IOPNXX ; NO. REPORT ERROR 37$: CLOSE$ #LSTFDB ; ERROR. CLOSE LIST FILE SEC ; INDICATE FAILURE BR 999$ ; THEN EXIT ; ; 3. SEE IF /DE: WAS SPECIFIED. IF NOT, PUT SY0: AS THE DEVICE INTO ; THE VARIABLES DEVNAM AND DEVSIZ. THEN COMPLETE THE DATASET ; DESCRIPTORS FOR BITDSP,INXDSP,MSTDSP,WLDDSP (THEY ALREADY HAVE ; THE DEVICE NAME ADDRESS). ; 40$: BIT #DEMSK,SWMASK ; /DE: SPECIFIED? BNE 50$ ; YES. GO FIND OUT DEVNAM SIZE MOV #"SY,DEVNAM ; NO. SET DEVNAM TO "SY0:" MOV #"0:, ; MOV #4,DEVSIZ ; SET DEVSIZ BR 80$ ; GO FILL IN DATASETS WITH DEVSIZ ; FIND FIRST NULL IN DEVNAM. 50$: MOV #DEVSPC,R0 ; R0 = TOTAL SPACE ALLOWED FOR DEVNAM MOV #DEVNAM,R1 ; R1 -> START OF DEVICE NAME 60$: TSTB (R1)+ ; IS THIS A NULL? BEQ 70$ ; YES. SOB R0,60$ ; NO. GO TILL END OF DEVNAM MOV DEVSPC,DEVSIZ ; DEVSIZ = DEVSPC BR 80$ ; GO FILL IN DATASETS WITH DEVSIZ 70$: MOVB #':,-(R1) ; REPLACE NULL WITH ':' SUB #DEVNAM,R1 ; R1 = NUMBER OF CHARACTERS -1 INC R1 ; R1 = NUMBER OF CHARACTERS MOV R1,DEVSIZ ; DEVSIZ = NUMBER CHARACTERS IN DEVNAM 80$: MOV DEVSIZ,BITDSP ; COMPLETE BITMAP DATASET MOV DEVSIZ,INXDSP ; COMPLETE INDEX FILE DATASET MOV DEVSIZ,MSTDSP ; COMPLETE MASTER DIRECTORY DATASET MOV DEVSIZ,WLDDSP ; COMPLETE WILD DIRECTORY DATASET CLC ; INDICATE INPUT FILE OPENED, ; AND DEVICE SELECTED. 999$: RETURN .END