.TITLE INIT2 .IDENT /V2.0/ ; ;+ ;***** ; ; THIS MODULE CONTINUES THE COMMON INITIALIZATION PROCEDURE FOR THE ; DIR DIRECTORY TASK STARTED BY INIT1. IN PARTICULAR, INIT2 CHECKS ; THE COMMAND NAME AND MAKES A CALL TO A SPECIFIC INITIALIZATION ; ROUTINE FOR EACH OF THE COMMANDS SUPPORTED (DIR/DEL/PUR). ; ; THE SPECIFIC ROUTINE CALLED BY INIT2 CONTAINS ALL THE CSI SWITCH ; AND SWITCH VALUE DEFINITIONS SUPPORTED BY THE COMMAND, AND ALSO ; TAKES CARE OF ANY COMMAND SPECIFIC SWITCH CHECKING REQUIRED. ON ; RETURN FROM THIS CALLED ROUTINE, INIT2 ASSUMES THAT THE DATA SET ; DESCRIPTOR BLOCK IN CSIBLK HAS BEEN INITIALIZED FOR THE INPUT ; FILE SPECIFICATION. INIT2 WILL THEN PROCEED TO PARSE THIS INFORMATION ; AND SETUP THE UFDFDB. IF AN OUTPUT FILE SPEC IS VALID, INIT2 ; WILL THEN USE CSI$1 AND CSI$2 TO LOAD THE DATA SET DESCRIPTOR BLOCK ; AGAIN. PARSE WILL BE INVOKED TO SETUP THE FDB OF THE LISTING DEVICE ; (EITHER DEFAULT OR SPECIFIED) IN LSTFDB. ; ; FINAL ACTIONS TAKEN ARE TO CHECK THE COMMON SWITCHES SUPPORTED BY ; ALL THE COMMANDS (AT THIS POINT PREDOMINANTLY DATE SELECTION STUFF) ; AND TO PERFORM ANY NECESSARY PROCESSING OF THESE SWITCHES. ; ; PAUL SORENSON ; PULMONARY RESEARCH ; S3, MAYO CLINIC ; ROCHESTER, MN 55904 ; ;***** ; ; UPDATE 8/80--PRS; ORIGINAL EDIT ; ; UPDATE 2/10/82 -- PRS; ADD SUPPORT FOR WILD CHARACTERS/STRINGS IN UFD ; FIELDS. UFD PARSING NOW PART OF "INIT1" RATHER THEN HERE ; ;***** ;- ; ;DEBUG=0 ;ENABLE DEBUGGING OF SWITCH PARSING ; .MCALL CSI$,CSI$1,CSI$2,FHDOF$,GTIM$S,ALUN$S .MCALL GLUN$S,DIR$,WTSE$S,QIOW$S .IF DF DEBUG .MCALL EXIT$S .ENDC ;DEBUG FHDOF$ DEF$L ;DEFINE FILE HEADER OFFSETS LOCALLY CSI$ ;DEFINE CSI BLOCK OFFSETS .IF DF ST$DAT & EX$DAT ; ; LOCAL DATA, THIS IS THE DEFAULT EXPIRATION DATE STRING. FUTURE ; IMPLEMENTATIONS MAY SET DEFAULT TO SOME # OF DAYS AFTER CURRENT ; SYSTEM DATE ; .PSECT $PDATA,RO,D,LCL,REL,CON DEFEXP: .ASCII /31DEC99/ .EVEN .ENDC ;ST$DAT & EX$DAT .PSECT $CODE1,RO,I,LCL,CON,REL .INIT2:: ;GLOBAL ENTRY POINT CMP CMDNAM,#DI$CMD ;IS COMMAND "DIRECTORY" ? BEQ 5$ ;BRANCH IF YES 3$: CALL DELINI ;PURGE AND DELETE INITIALIZED BY DELINI BR 10$ ; 5$: CALL DIRINI ;DIRECTORY INITIALIZED BY DIRINI 10$: .PAGE ; ;***** ; ; TAKE CARE OF INPUT FILE AND DEFINING THE UFD FILE DESCRIPTOR BLOCK ; ;***** ; OPN1: MOV #UFDFDB,R0 ;GET FDB MOV #UFDFDB+F.FNB,R1 ;FILE NAME BLOCK MOV #CSIBLK+C.DSDS,R2 ;CSI'S DATA SET DESCRIPTOR MOV #SAVFNB,R3 ;DEFAULT FILE NAME BLOCK TST NXUIC$ ;DOING WILD CARD ? BEQ 10$ ;BRANCH IF NO CALL .PRSDV ;YES,WILD UFD-PARSE ONLY DEVICE BCC 15$ ;BRANCH IF WORKED FERR PRSE ;SIGNAL PARSE ERROR 10$: CALL .PARSE ;DO WHOLE DSD BLOCK BCC 12$ ;BRANCH IF WORKED FERR DIRF ;SIGNAL DIRECTORY FIND ERROR 12$: ; ;***** ; THIS CODE USED TO BE HANDLED BY "SRTDIR" IN SRDINI V5.0. ; DIRECTORY FILE ID, FILE NAME, ; DEVICE NAME AND UNIT # SAVED BY "SRDOPR" NOW. NEW PARSING OF ; UFD FIELDS BY INIT1 SAVES RAD50 GROUP AND USER #'S SO DON'T ; NEED TO READ DIRECTORY FILE'S HEADER TO DETERMINE FILE NAME. ; ;***** ; MOV N.DID(R1),N.FID(R1) ;COPY DIRECTORY ID TO FILE ID MOV N.DID+2(R1),N.FID+2(R1) ; " MOV N.DID+4(R1),N.FID+4(R1) ; " MOV WCGRP$,N.FNAM(R1) ;SET TOP 1/2 OF DIRECTORY NAME MOV WCUSR$,N.FNAM+2(R1) ;SET LOWER 1/2 OF DIRECTORY NAME CLR N.DID(R1) ;REMOVE DIRECTORY ID ; CONTINUE ON TO ASSIGN LOGICAL UNIT # ; ;***** ; ; THIS CODE USED TO BE HANDLED BY "INIEX" IN SRDINI V5.0. ; WHEN DOING WILD UFD'S, "DIRNUD" ; WILL FILL IN DIRECTORY'S FILE ID, FILE NAME, ETC. ; ;***** ; 15$: ALUN$S #HDRLUN,UFDFDB+F.FNB+N.DVNM,UFDFDB+F.FNB+N.UNIT ;ASSIGN LOG UNIT # FOR UFD READ ; ;***** ; ; TAKE CARE OF LISTING FILE'S FILE DESCRIPTOR BLOCK ; ;***** ; OPN2: MOV #LSTDFN,R3 ;SET ADDRESS OF DEFAULT NAME BLOCK CLR R2 ;FLAG NO DATA SET DESCRIPTOR FOR NOW BIT #OUTFSW,SWMSK$ ;OUTPUT FILE SWITCH SET ? BEQ 20$ ;BRANCH IF NO ;EITHER HAVE EXPLICIT OUTPUT FILE SPEC ;OR SPOOLING OUTPUT--IN EITHER CASE... MOV PARBF$+G.TSDU,R1 ;FETCH PROTECTION UIC-COURTESY OF ; "GTSK$S" DIRECTIVE IN INIT1 CALL .WDFUI ;AND SET DEFAULT UIC FOR LISTING FILE ; TO BE THE PROTECTION (LOGON) UIC MOV #"SY,N.DVNM(R3) ;SET DEFAULT DEVICE TO BE "SY0:" BIT #SPSW,SWMSK$ ;CHECK IF JUST SPOOLING OUTPUT BNE 20$ ;BRANCH IF YES MOV OUBUF$,R1 ;ELSE, FETCH LENGTH OF FILE SPEC. BEQ 20$ ;BRANCH IF 0, NO FILE SPEC TO PROCESS 5$: MOV #CSIBLK,R0 ;FETCH ADDRESS OF CSI BLOCK MOV R1,C.CMLD(R0) ;SET FILE SPEC. LENGTH MOV #OUBUF$+2,C.CMLD+2(R0) ;FETCH START ADDRESS OF FILE SPEC CSI$1 R0 ;LET CSI CHECK SYNTAX ; *** DEBUG SECTION .IFDF DEBUG MOV R0,-(SP) ;SAVE REGISTERS NEEDED FOR DEBUG MOV R1,-(SP) MOV CSIBLK+C.CMLD+2,R0 ;SET RO TO START OF COMPRESSED COMMAND MOV CSIBLK+C.CMLD,R1 ;SET R1 TO NEW LENGTH CALL TYPEIT MOV (SP)+,R1 ;POP THE STACK MOV (SP)+,R0 .ENDC ;DEBUG ; *** BCC 10$ ;BRANCH IF OK FERR CS2O ;SIGNAL SYNTAX ERROR 10$: CLR C.SWAD(R0) ;NO VALID SWITCH TABLE ADDRESS CSI$2 R0,OUTPUT ;LET CSI PARSE OUTPUT FILE SPEC. BCC 15$ ;BRANCH IF WORKED FERR CS2O ;SIGNAL SYNTAX ERROR 15$: MOV #CSIBLK+C.DSDS,R2 ;SET R2 TO ADDRESS OF DATA SET DESC. 20$: MOV #LSTFDB,R0 ;GET LISTING FILE DESCRIPTOR BLOCK MOV #LSTFDB+F.FNB,R1 ;POINT TO FILE NAME BLOCK CALL .PARSE ;PARSE IT BCC 25$ ;BRANCH IF OK FERR PRSE ;SIGNAL FAILURE IN PARSE 25$: CALL .OPFNB ;OPEN FILE BCC 30$ ;BRANCH IF OK FERR OPNO ;SIGNAL OPEN FAILURE FOR OUTPUT 30$: ; ;***** ; ; Include a task builder "GBLDEF" option to define the $TIATT symbol ; If $TIATT = 0, don't attach the user's terminal ; If $TIATT 0, attach the user's terminal ; ;***** ; TST #$TIATT ;CHECK SYMBOL $TIATT BNE 32$ ;BRANCH IF NON-ZERO, MAY ATTACH TI: BIT #OUTFSW,SWMSK$ ;OUTPUT DIRECTED TO TI: ? BEQ 35$ ;BRANCH IF YES, SKIP ATTACHING TI: 32$: BITB #FD.REC,F.RCTL(R0) ;RECORD DEVICE ? BEQ 35$ ;BRANCH IF NO QIOW$S #IO.ATT,#LSTLUN,#LSTEFN ;ISSUE ATTACH 35$: MOV LSTFDB+F.BBFS,R0 ;GET BUFFER SIZE FOR LIST DEVICE CMP R0,#72. ;CHECK IF < MIN BHIS 40$ ;BRANCH IF NO MOV #72.,R0 ;SET TO 72. BR 45$ 40$: CMP R0,#132. ;CHECK IF > MAX BLOS 45$ ;BRANCH IF NO MOV #132.,R0 ;SET TO 132. 45$: MOV R0,LINSZ$ ;SAVE LISTING BUFFER SIZE .PAGE ; ;***** ; ; CHECK COMMON COMMAND SWITCHES--DATE SELECTION, ETC. ; ; DIR HANDLES DATE SELECTION DIFFERENTLY THAN SRD DID: 1) BEFORE ; AND AFTER DATES ARE NOW EXCLUSIVE OF THE SPECIFIED DATE, 2) DATE ; SELECTION AND BEFORE AND AFTER SELECTION ARE NO LONGER MUTUALLY ; EXCLUSIVE. FOR EXAMPLE, IF SELECT DATE, BEFORE, AND AFTER ; SWITCHES WITH NO DATES SPECIFIED, RESULT IS SELECTING ALL FILES. ; IF SELECT BEFORE AND AFTER SWITCHES WITHOUT SPECIFYING A DATE, ; RESULT IS SELECTING ALL FILES NOT REVISED (CREATED) ON THE ; CURRENT SYSTEM'S DATE. ETC. DATE MATCHES ARE CHECKED USING ; UNSIGNED 16 BIT COMPARISONS. ; ; NOTE: SELECTION MAY BE BASED ON CREATION, REVISION, OR EXPIRATION ; DATE. HOWEVER, THESE ARE MUTUALLY EXCLUSIVE, CHECK FOR SYNTAX ; ERROR HERE. ; ;***** ; SWCHK: MOV #-1,R0 ;PRESET ACCUMULATOR BIT #CDSW,SWMS2$ ;USE CREATION DATE ? BEQ 3$ ;BRANCH IF NO INC R0 ;COUNT IT 3$: BIT #RDSW,SWMS2$ ;USE REVISION DATE ? BEQ 6$ ;BRANCH IF NO INC R0 ;COUNT IT 6$: .IF DF EX$DAT ;INCLUDE CODE IF SUPPORT EXPIRATION DATES BIT #EDSW,SWMS2$ ;USE EXPIRATION DATE ? BEQ 9$ ;BRANCH IF NO INC R0 ;COUNT IT 9$: .ENDC ;EX$DAT TST R0 ;CHECK ACCUMULATOR BEQ 11$ ;BRANCH IF ONE SELECTED BLT 10$ ;BRANCH IF NONE SELECTED, SET DEFAULT FERR CNFLSW ;MORE THAN ONE, FATAL ERROR 10$: BIS #RDSW,SWMS2$ ;USE REVISION DATE BY DEFAULT 11$: MOV #DATIM$,R0 ;POINT AT DATE BUFFER MOV #HDBUF$,R1 ;SCRATCH AREA GTIM$S R1 ;FIND THE TIME CALL $DAT ;CONVERT DATE TO NORMAL FORM MOVB #40,(R0)+ ;SEPARATE DATE AND TIME MOV #2,R2 ;SET TO CONVERT HR,MIN CALL $TIM ;AND CONVERT THE TIME CLRB (R0) ;SIGNIFY END OF DATE/TIME WITH NULL MOV #DATIM$,R0 ;FETCH DATE STRING AGAIN 20$: CALL .DRCDI ;CHANGE DATE TO INTEGER FORMAT BCS 50$ ;BRANCH IF BAD DATE MOV R1,DAVAL$ ;SAVE DATE AS DEFAULT FOR ALL SWITCHES MOV R1,BEVAL$ MOV R1,AFVAL$ ; BIT #DASW,SWMS1$ ;DATE SELECTED ? BEQ 29$ ;BRANCH IF NO-RESET DATE VALUE MOV #DABUF$,R0 ;SET TO POINT AT SW BUFFER TSTB (R0) ;ANY DATE SUPPLIED? BEQ 30$ ;IF 0--KEEP DEFAULT CALL .DRCDI ;CONVERT SPECIFIED DATE BCS 50$ ;BRANCH ON BAD DATE MOV R1,DAVAL$ ;STORE IT BR 30$ 29$: MOV #-1,DAVAL$ ;RESET DATE TO -1, NEVER RETURNED BY .DRCDI ; 30$: BIT #BESW,SWMS1$ ;BEFORE DATE SELECTED ? BEQ 39$ ;BRANCH IF NO--RESET BEFORE DATE MOV #BEBUF$,R0 ;FETCH ADDRESS OF DATE TSTB (R0) ;ANYTHING THERE ? BEQ 40$ ;BRANCH IF NO--KEEP DEFAULT DATE CALL .DRCDI ;CONVERT DATE BCS 50$ ;BRANCH ON BAD DATE MOV R1,BEVAL$ ;STORE IT BR 40$ 39$: CLR BEVAL$ ;RESET BEFORE DATE TO 0, SMALLEST # POSSIBLE ; 40$: BIT #AFSW,SWMS1$ ;AFTER DATE SELECTED ? BEQ 49$ ;BRANCH IF NO--RESET DATE MOV #AFBUF$,R0 ;FETCH ADDRESS OF DATE TSTB (R0) ;ANYTHING THERE BEQ 60$ ;BRANCH IF NO--USE DEFAULT DATE CALL .DRCDI ;CONVERT DATE BCS 50$ ;BRANCH ON BAD DATE MOV R1,AFVAL$ ;STORE IT BR 60$ 49$: MOV #-1,AFVAL$ ;RESET AFTER DATE TO -1, LARGEST # POSSIBLE BR 60$ 50$: FERR BADD ;BAD DATE FORMAT 60$: .IF DF ST$DAT ;INCLUDE THIS SECTION IF SUPPORT SETTING FILE DATES ; SET FILE DATES VIA SWITCHES TO "DIR" COMMAND, ; DIRINI MUST CHECK FOR CONFLICT BETWEEN SET DATE ; FUNCTIONS -- SEDSW, SRDSW, AND SCDSW ARE MUTUALLY ; EXCLUSIVE. BIT #,SWMS2$ ;DOING A SET DATE ? BEQ DONE ;BRANCH IF NO MOV #SDBUF$,R0 ;FETCH ADDRESS OF DATE TSTB (R0) ;ANYTHING THERE? BNE 65$ ;BRANCH IF YES ; ; GET DEFAULTS ; BIT #SEDSW,SWMS2$ ;SETTING EXPIRATION DATE ? BEQ 64$ ;BRANCH IF NO MOV #DEFEXP,R0 ;YES, POINT TO DEFAULT EXPIRATION DATE BR 65$ 64$: MOV #DATIM$,R0 ;USE CURRENT DATE AS DEFAULT FOR CR/RV DATES 65$: CALL .DRCDI ;CONVERT DATE TO INTEGER BCC 68$ ;BRANCH ON VALID DATE FERR BADD ;BAD DATE ERROR 68$: MOV #SDBUF$,R0 ;GET BUFFER ADDRESS AGAIN CALL .DRCID ;CONVERT INTEGER BACK TO COMPRESSED DATE FORM .ENDC ;ST$DAT DONE: ;ALL DONE .IF NDF DEBUG RETURN ;RETURN TO CALLER .ENDC ;DEBUG ; ;***** ; ; DISPLAY CURRENT SWITCH MASK WORDS, DATES SELECTED ; .IF DF DEBUG DUMP: MOV #HDBUF$,R0 ;FETCH PLACE FOR STRING MOV SWMSK$,R1 ;FETCH SWITCH MASK WORD CALL 50$ ;SETUP STRING MOV R0,R1 ;COPY CURRENT POINTER MOV #HDBUF$,R0 ;RECOVER START ADDRESS SUB R0,R1 ;SET R1 = LENGTH CALL TYPEIT ;OUTPUT STRING MOV SWMS1$,R1 ;FETCH SWITCH MASK WORD CALL 50$ ;SETUP STRING MOV R0,R1 ;COPY CURRENT POINTER MOV #HDBUF$,R0 ;RECOVER START ADDRESS SUB R0,R1 ;SET R1 = LENGTH CALL TYPEIT ;OUTPUT STRING MOV SWMS2$,R1 ;FETCH SWITCH MASK WORD CALL 50$ ;SETUP STRING MOV R0,R1 ;COPY CURRENT POINTER MOV #HDBUF$,R0 ;RECOVER START ADDRESS SUB R0,R1 ;SET R1 = LENGTH CALL TYPEIT ;OUTPUT STRING ; ;**** ; TSTB DABUF$ ;ANYTHING IN DATE BUFFER? BEQ 25$ ;BRANCH IF NO MOV #DABUF$,R0 ;FETCH ADDRESS CALL 60$ ;FIND LENGTH CALL TYPEIT ;OUTPUT IT 25$: TSTB BEBUF$ ;ANYTHING IN BEFORE BUFFER ? BEQ 30$ ;BRANCH IF NO MOV #BEBUF$,R0 ;FETCH ADDRESS CALL 60$ ;FIND LENGTH CALL TYPEIT ;OUTPUT IT 30$: TSTB AFBUF$ ;ANYTHING IN DATE BUFFER? BEQ 35$ ;BRANCH IF NO MOV #AFBUF$,R0 ;FETCH ADDRESS CALL 60$ ;FIND LENGTH CALL TYPEIT ;OUTPUT IT 35$: .IF DF ST$DAT ;INCLUDE IF SUPPORT SET FILE DATES TSTB SDBUF$ ;ANYTHING IN DATE BUFFER? BEQ 40$ ;BRANCH IF NO MOV #SDBUF$,R0 ;FETCH ADDRESS CALL 60$ ;FIND LENGTH CALL TYPEIT ;OUTPUT IT 40$: .ENDC ;ST$DAT RETURN ;EXIT 50$: ;SETUP BIT PATTERN STRING MOV #16.,R2 ;# TIMES TO LOOP 51$: ROL R1 ;FIND OUT STATE OF BIT BCS 52$ MOVB #'0,(R0)+ BR 53$ 52$: MOVB #'1,(R0)+ 53$: SOB R2,51$ ;LOOP FOR FULL WORD ROL R1 ;REALIGN WORD RETURN ; ALL DONE 60$: ;FIND # CHARACTERS IN ASCIZ STRING MOV R0,R1 ;COPY CURRENT POINTER 61$: TSTB (R1)+ ;CHECK BYTE BNE 61$ ;LOOP TIL DONE DEC R1 ;BACKUP TO NULL SUB R0,R1 ;SET R1 TO STRING LENGTH RETURN ;ALL DONE .ENDC ;DEBUG .PAGE ; ;***** ; ; LOCAL SUBROUTINES SECTION ; ;***** ; ; ;***** ; ; SUBROUTINE TYPEIT-OUPUT LINE USING QIO READ AFTER PROMPT ; TO SHOW A LINE TO TERMINAL AND WAIT FOR CARRAIGE RETURN. ; WHEN CALLED R0=POINTER TO STUFF TO OUTPUT, R1=#CHARACTERS TO OUTPUT. ; USES HDBUF$FOR RESPONSE BUFFER. ; ;***** ; .IFDF DEBUG TYPEIT: QIOW$S #IO.RPR,#TILUN,#TIEFN,,#IOSB$,,<#HDBUF$,#2.,,R0,R1,#044> ;OUTPUT IT AND WAIT FOR CONTINUE TSTB IOSB$ ;CHECK ERROR STATUS BGT 5$ ;NO ERROR, LEAVE EXIT$S 5$: RETURN .ENDC ;DEBUG ; .END ;.INIT2