.TITLE SRDINI ;**SRD--SORT DIRECTORY ; ; TASK INITIALIZATION PHASE ; ; ; THIS TASK WILL SORT A RSX11 DIRECTORY ;THEN CREATE A LISTING WITH MANY SELECTION OPTIONS ; ;THIS IS THE MAIN ROUTINE, AND IS PURE. ; ; ; ; ;SYSTEM MACRO CALLS ; .MCALL CSI$1,CSI$2,DIR$,EXIT$S,GCMLD$,GCML$,FHDOF$ .MCALL GPRT$S,GTIM$S,WTSE$S,CSI$SW,CSI$SV,CSI$ND,NMBLK$ .MCALL ALUN$S,GLUN$S,GTSK$S,PUT$S FHDOF$ DEF$L ;DEFINE FILE HEADER ; STRING: .ASCII /SY:/ .EVEN FRMFD: .ASCII <14> FRMLEN=.-FRMFD .EVEN SWTABL: CSI$SW NE,NESW,SWMSK$,SET,NEG CSI$SW SP,SPSW,SWMSK$,SET,NEG CSI$SW BE,BESW,SWMSK$,SET,NEG,BEDVAL CSI$SW AF,AFSW,SWMSK$,SET,NEG,AFDVAL CSI$SW LI,LISW,SWMSK$,SET,NEG CSI$SW WB,WBSW,SWMSK$,SET,NEG CSI$SW BR,BRSW,SWMSK$,SET,NEG,FUVAL CSI$SW DE,DESW,SWMSK$,SET,NEG CSI$SW DA,DASW,SWMSK$,SET,NEG,DAVAL CSI$SW FU,FUSW,SWMSK$,SET,NEG,FUVAL CSI$SW TB,BRSW,SWMSK$,CLEAR,NEG CSI$SW ID,IDSW,SWMSK$,SET,NEG ; CSI$SW CD,RDSW,SWMS1$,CLEAR,NEG CSI$SW RD,RDSW,SWMS1$,SET,NEG CSI$SW SR,SRSW,SWMS1$,SET,NEG CSI$SW CM,PRSW,SWMS1$,SET CSI$SW OV,OVSW,SWMS1$,SET,NEG,VERVAL CSI$SW HV,HVSW,SWMS1$,SET,NEG,VERVAL CSI$SW NV,NVSW,SWMS1$,SET,NEG,VERVAL CSI$SW SN,DNSW,SWMS1$,CLEAR,NEG CSI$SW DN,DNSW,SWMS1$,SET,NEG CSI$SW ST,DTSW,SWMS1$,CLEAR,NEG CSI$SW DT,DTSW,SWMS1$,SET,NEG CSI$SW SV,DVSW,SWMS1$,CLEAR,NEG CSI$SW DV,DVSW,SWMS1$,SET,NEG CSI$SW CO,COSW,SWMS1$,SET CSI$SW LO,LOSW,SWMS1$,SET CSI$SW MU,MUSW,SWMS1$,SET CSI$SW SD,SDSW,SWMS1$,SET,NEG CSI$SW PU,,SWMS1$,SET,NEG,VERVAL ; CSI$ND CSI$SV DECIMAL,LINSZ$,2,FUVAL CSI$SV ASCII,DABUF$,9.,DAVAL CSI$SV ASCII,BEBUF$,11.,BEDVAL CSI$SV ASCII,AFBUF$,11.,AFDVAL CSI$SV OCTAL,SVNUM$,2,VERVAL CSI$ND DFNB: NMBLK$ 200200,DIR,1,SY,0 PARBF$: .BLKW 16. KEYCT: .WORD 1 .PAGE SRDINI:: MOV $XX1,DIRBF$ ; FIGURE OUT LOWEST AVAIL LOCATION CMP DIRBF$,$XX2 BHI 44$ MOV $XX2,DIRBF$ 44$: CMP DIRBF$,$XX3 BHI 45$ MOV $XX3,DIRBF$ 45$: ADD #3,DIRBF$ ; ROUND UP TO NEXT 4-BYTE BOUNDARY BIC #3,DIRBF$ GTSK$S #PARBF$ ;++001 GET TOP OF TASK MOV PARBF$+G.TSTS,R0 ;++001 CALC. LENGTH CMP PARBF$+G.TSSY,#1 ; 1 = M BNE 50$ ; SKIP OVER NEXT SECTION IF D OR IAS ;;; THIS SECTION IS FOR 11M ONLY GPRT$S ,#PARBF$ ;FIND SIZE OF PARTITION MOV PARBF$+2,R0 ;PICK UP SIZE OF PAR/100(OCTAL) SWAB R0 ;THIS ROUTINE ASRB R0 ;CONVERTS THAT SIZE ROR R0 ;INTO SIZE OF PARTITION ROR R0 ;IN BYTES ADD $DSW,R0 ;ADD IN BASE OF PARTITION ;;; THIS SECTION IS FOR 11M ONLY 50$: MOV R0,DIRBE$ ;SAVE END OF DIRECTORY BUFFER LOOP: CLR NUMFS ; TO COUNT # OF FILES CLR NUMFT CLR TBLKU ; CLEAR BLOCK COUNTS CLR TBLKU+2 CLR TBLKA CLR TBLKA+2 MOV #BRSW,SWMSK$ ;INIT SWITCHES MOV #SRSW,SWMS1$ CLR LINSZ$ ;ZERO LINE SIZE SW VALUE CLR NXUIC$ ; MOV #-1,BEVAL$ ;ZERO RESIDUAL DATE CLR AFVAL$ ;ZERO RESIDUAL DATE CLR PRNUM$ ;ZERO OUT FORMAT SWITCH CLR PRCCNT ;ZERO # CHAR. IN PROC. NAME CLR SVNUM$ ;CLEAR VERSION NUMBER MOV #KEYTB,R3 MOVB #1,(R3)+ ;DEFAULT TO SORT NAME,TYPE,VERSION MOVB #2,(R3)+ MOVB #3,(R3) ; GCML$ #CMDBLK ;GET COMMAND LINE BCC CMDOK ;BR=AOK CMPB #GE.EOF,G.ERR(R0) ;LOOK FOR END-OF-FILE BEQ 5$ ;BR IF EXPECTED ERROR FERR GCME ;ELSE LOG ERR 5$: EXIT$S ;THEN LEAVE ; CMDOK: MOV G.CMLD+2(R0),R1 ;COMMAND START MOV G.CMLD(R0),R3 ;AND LENGTH BNE 1$ MOV #STRING,R1 ;SET DEFAULT COMMAND MOV #3,R2 ;LENGTH JMP CKSYN ; TAKE OUT BLANKS 1$: MOV #STRCMD,R4 ;COPY ORIG. CMD INTO STRCMD MOV R3,(R4)+ ;STORE LENGTH OF ORIG. CMD IN 1ST WORD MOV R1,R2 ;R2 - OPEN POSITION DEC R1 5$: INC R1 ;LOOK AT NEXT CHARACTER MOVB (R1),(R4)+ ;STORE ORIG. CMD CMPB #40,(R1) BEQ 10$ ;IF A BLANK SKIP OVER... MOVB (R1),(R2)+ ;OTHERWISE MOVE CHAR. INTO OPEN POS. 10$: SOB R3,5$ ;END OF LINE? MOV G.CMLD+2(R0),R1 ;RESET STARTING ADDRESS MOVB #'/,(R2) ;WILL USE / AS TEMPORARY TERMINATOR ; CHECK FOR NAME SELECTION 15$: CMPB #'=,(R1)+ ;IF THERE IS AN = LOOK TO RIGHT OF IT BEQ 25$ ;FOUND THE = CMP R1,R2 BEQ 20$ ;TESTED ENTIRE CMD LINE CONTAINS NO = BR 15$ 20$: MOV G.CMLD+2(R0),R1 ;RELOAD START ADDRESS ; R1 POINTS TO 1ST CHAR. OF INPUT FILE 25$: MOV R1,R4 ;SAVE 1ST CHAR. ADD 30$: CMPB #':,(R1) BNE 35$ ;NO : CHECK FOR [ INC R1 CMPB #'[,(R1) BEQ 40$ ; WE HAVE :[ FIND ] CMPB #'/,(R1) BEQ FILFIN ;WE HAVE :/ NO SE NEEDED BR FILNAM ;INSERT /SE WE HAVE :X ; R1 POINTS TO X 35$: CMPB #'[,(R1) BEQ 40$ ;WE HAVE [ FIND ] CMPB #'/,(R1) BEQ 37$ ;FOUND A SLASH INC R1 BR 30$ ;KEEP SEARCHING 37$: CMP R1,R4 ;ARE THERE LETTERS BETWEEN START AND / ???? BEQ FILFIN ; NO WE DO NOT NEED SE MOV R4,R1 ; R1 POINTS TO X BR FILNAM 40$: INC R1 ; FIND ] 45$: CMPB #'],(R1)+ BNE 45$ CMPB #'/,(R1) ; IS ] FOLLOWED BY / ????? BEQ FILFIN ; YES DO NOT NEED SE ; R1 POINTS TO X FILNAM: BIS #SESW,SWMSK$ ;SET SWITCH TO SHOW SELECTIVE MOV #SEBUF$,R3 MOVB #'.,R4 ;R4 HOLDS WHAT SEARCH ON - 1ST TIME . 10$: CMPB (R1),R4 BEQ 20$ CMPB (R1),#'/ BEQ 30$ ;/ IMPLIES END OF FILENAME.TYP.VER CMPB (R1),#'? ;REPLACE ? WITH - BNE 11$ MOVB #'-,(R3)+ BR 15$ ;GO ON TO BLANK OUT ORIG. LINE 11$: CMPB (R1),#'% ;REPLACE % WITH - BNE 13$ MOVB #'-,(R3)+ BR 15$ ;GO ON TO BLANK OUT ORIG. LINE 13$: MOVB (R1),(R3)+ ;PICKED UP A CHAR. STORE IN SEBUF 15$: MOVB #40,(R1)+ ; AND BLANK OUT GCML BR 10$ ;CHECK NEXT CHAR. 20$: MOVB (R1),(R3)+ ;SAVE THIS CHAR MOVB #40,(R1)+ ; AND BLANK OUT GCML CMPB #';,R4 ;IF FOUND A ; GO DO VERSION BEQ 40$ MOVB #';,R4 ;RESET TO SEARCH FOR ; BR 10$ 30$: CMPB #';,R4 ;LOOKING AT VERSION OR TYPE? BEQ 35$ MOVB #'.,(R3)+ ;INSERT .* MOVB #'*,(R3)+ 35$: MOVB #';,(R3)+ ;INSERT ;* MOVB #'*,(R3) BR FILFIN 40$: CMPB (R1),#'* ;A VERSION WAS SPECIFIED BNE 42$ BIS #SVSW,SWMSK$ ;IF USER SAID * FLAG IT MOV #-77,SVNUM$ BR 52$ 42$: CMPB (R1),#'- ;IF -1 USE OV SWITCH BNE 44$ BIS #OVSW,SWMS1$ DEC SVNUM$ ;SET SVNUM$ -1 BR 52$ 44$: CMPB (R1),#'/ ;IF ;/ USE 0 TO GET THE NEWEST VERSION BNE 46$ BIS #NVSW,SWMS1$ BR FILFIN 46$: CMPB (R1),#'0 ;IF 0 USE NV:1 BNE 50$ BIS #NVSW,SWMS1$ BR 52$ 50$: BIS #SVSW,SWMSK$ ;NUMBER > 0 GIVEN - CONVERT IT MOV R0,-(SP) ;SAVE R0,R1,R2 MOV R1,-(SP) MOV R2,-(SP) MOV R1,R0 ;PUT START OF ASCII STRING IN R0 CALL $COTB ;CONVERT OCTAL ASCII TO BINARY MOV R1,SVNUM$ ;R1 HAS BINARY VALUE MOV (SP)+,R2 ;RESTORE R0,R1,R2 MOV (SP)+,R1 MOV (SP)+,R0 52$: MOVB #40,(R1)+ ;BLANK OUT NUMBERS CMPB (R1),#'/ ;END OF STRING? BNE 52$ FILFIN: MOV G.CMLD+2(R0),R1 ;RESET R1 TO START OF COMMAND LINE PRLOOP: CMPB #'/,(R1) ;LOOKING FOR /CM: BEQ 10$ CMP R2,R1 ;END OF CMD? BMI SRTKEY ;YES GO WORK ON SORT KEYS INC R1 BR PRLOOP 10$: INC R1 ;FOUND / CHECK FOR 3 CHAR. PAST IT MOV R1,R3 ADD #3,R3 CMP R2,R3 BMI SRTKEY ;CMD STRING SHORT CMPB #'C,(R1)+ BNE PRLOOP CMPB #'M,(R1)+ BNE PRLOOP CMPB #':,(R1)+ BNE PRLOOP ;FOUND /CM: MOVB #40,-(R1) ;BLANK OUT 1ST COLON TSTB (R1)+ ;CORRECT POINTER MOV #XXXSAV,R3 ;STORE COMMAND IN XXXSAV 20$: CMPB #'/,(R1) BEQ SRTKEY ;END OF SWITCH GET OUT CMPB #'=,(R1) ;END OF PROC. NAME GET OUT BEQ SRTKEY CMPB #':,(R1) ;FOUND : GO DECIPHER FORMAT BEQ 30$ MOVB (R1),(R3)+ ;SAV CHAR. IN XXXSAV MOVB #40,(R1)+ ; AND BLANK OUT SPACE INC PRCCNT ;ONE MORE CHAR. IN PROC. NAME CMP R2,R1 ;END OF CMD? BPL 20$ ; NO - LOOP BACK 30$: ;DECIPHER CM FORMAT MOVB #40,(R1)+ ;BLANK OUT CHAR. CMP R2,R1 ;END OF COMMAND? BMI SRTKEY ; YES GET OUT CMPB #'/,(R1) ;FOUND A / ? BEQ SRTKEY ; YES GET OUT CMPB #'=,(R1) ;END OF CM SWITCH? BEQ SRTKEY ; YES GET OUT CMPB #'O,(R1) ;OUTFILE? BNE 32$ BIS #1,PRNUM$ ; YES SET BIT BR 30$ ;LOOK FOR MORE 32$: CMPB #'L,(R1) ;LISTING FILE? BNE 34$ BIS #2,PRNUM$ ; YES SET BIT BR 30$ ;LOOK FOR MORE 34$: CMPB #'T,(R1) ;TYPE? BNE 36$ ;NO BRANCH BIS #4,PRNUM$ ;YES SET BIT BR 30$ ;LOOK FOR MORE 36$: CMPB #'V,(R1) ;VERSION? BNE 38$ BIS #10,PRNUM$ ; YES SET BIT BR 30$ ;LOOK FOR MORE 38$: CMPB #'S,(R1) ;SECOND FILE? BNE 40$ BIS #20,PRNUM$ ;YES SET BIT BR 30$ ;LOOK FOR MORE 40$: DIAG FMTR ;ILLEGAL CHAR. PRINT ERROR THEN RESUME BR 30$ SRTKEY: MOV G.CMLD+2(R0),R1 ;RESET R1 TO START OF CMD MOV #KEYTB,R3 ;GET ADDRESS OF SORT KEY TABLE CLR KEYCT ;CLEAR THE KEY COUNTER 1$: MOVB (R1)+,R4 ; start of loop to find '/' CMP R1,R2 ; BGE 15$ ; no more chars CMPB R4,#'/ ; check for '/' BNE 1$ 2$: CLR R5 ;USE R5 TO FLAG - OR NO MOVB (R1)+,R4 ; start of loop to analyze switches CMPB R4,#'- ; check for '-' BNE 3$ INC R5 ;FOUND A - FLAG R5 BR 5$ 3$: CMPB R4,#'N ; check for 'NO' BNE 6$ ; MOVB (R1)+,R4 ; CMPB R4,#'O ; BNE 4$ INC R5 ;FOUND A 'NO' FLAG R5 BR 5$ 4$: SUB #-2,R1 ; not 'NO', back up R1 for recovery 5$: MOVB (R1)+,R4 ; this must be first char of switch 6$: CMPB R4,#'S ; looking for 'S' or 'D' BEQ 7$ ; CMPB R4,#'D ; BNE 12$ ; 7$: MOVB (R1)+,R4 ; found 'S' or 'D', look for key designator CMPB R4,#'N ; BNE 8$ ; MOVB #1,(R3)+ ; code: 1 = filename INC KEYCT BR 10$ ; 8$: CMPB R4,#'T ; BNE 9$ ; MOVB #2,(R3)+ ; code: 2 = filetype INC KEYCT BR 10$ ; 9$: CMPB R4,#'V ; BNE 12$ ; MOVB #3,(R3)+ ; code: 3 = version INC KEYCT BR 10$ ; (needed if other key designators added) 10$: TST R5 ;DID WE HAVE A NEG. SORT SWITCH? BEQ 11$ BIC #SRSW,SWMS1$ ;YES CLEAR SORT SWITCH BR 35$ 11$: MOVB (R1)+,R4 ; success, now look for ':' to continue CMPB R4,#': ; now look for ':' to repeat loop BNE 15$ ; MOVB #'/,-(R1) ; replace ':' with '/' INC R1 ; BR 2$ ; repeat loop 12$: DEC R1 ; switch sought was not found BR 1$ ; keep looking 15$: TST KEYCT BEQ 35$ ;IF NO KEYS GIVEN WE USE DEFAULT CLR R1 ;R1 HOLDS NUMBER TO SEARCH FOR 17$: CMP #3,KEYCT ;DO WE HAVE 3 KEYS? BEQ 35$ ;YES - NO INSERTS NEEDED 20$: INC R1 ;BUMP SEARCH NUMBER MOV #KEYTB,R3 MOV KEYCT,R4 22$: CMPB (R3)+,R1 BEQ 20$ ;FOUND THIS NUMBER, CHECK FOR NEXT SOB R4,22$ MOVB R1,(R3) ;SEARCH NUM. NOT IN KEYTB - INSERT INC KEYCT ;BUMP # KEYS GIVEN BR 17$ 35$: MOVB #40,(R2) ;BLANK OUT TEMPORARY TERMINATOR MOV G.CMLD+2(R0),R1 ;RESET R1 TO START OF COMMAND SUB R1,R2 ; AND R2 TO # OF CHAR. MOV R2,G.CMLD(R0) ;CORRECT # OF CHAR. IN LINE BR CKSYN ; ; COMMAND ERROR ; CS1ERR: FERR CS1E CS2IER: FERR CS2I CS2OER: FERR CS2O PARSER: FERR PRSE WRBKER: FERR WBSV ; ; CKSYN: CSI$1 #CSIBLK,R1,R2 ;CK SYNTAX BCS CS1ERR ;BR IF BAD MOV #SWTABL,C.SWAD(R0) ;SET SWITCH TABLE ADDRESS MOVB #CS.OUT,(R0) ;ASSUME THAT OUTPUT IS ALL THAT WAS GIVEN MOV #LSTDFN,R3 ;GET DEFAULT NAME BLOCK FOR LISTING CLR R2 ;ASSUME NO NAME FOR OUTPUT IN STRING MOV #"TI,N.DVNM(R3) ;ASSUME THAT THE "TI:" IS WHERE IT GOES BIT #CS.EQU*400,(R0) ;WAS AN "=" GIVEN? BEQ 30$ ;BR IF NO-ASSUMPTIONS WERE CORRECT ; MOV #"SY,N.DVNM(R3) ;NAME GIVEN-CHANGE DEFAULT TO "SY0:" CALL .CSI2 ;PARSE REAL OUTPUT NAME BCS CS2OER ;OUTPUT SPEC ERROR MOVB #CS.INP,(R0) ;SET UP TO DO INPUT NEXT MOV #,R2 ;GET DATA-SET-DESCRITOR ADDRESS BIS #OUTFSW,SWMS1$ ; SET FLAG 30$: MOV #LSTFDB,R0 ;SET FILE-DESCRIPTOR-BLOCK MOV #,R1 ;AND FILE-NAME-BLOCK FOR PARSE CALL .PARSE ;---AND PARSE IT! BCS PARSER ;BR IF FAILED CALL .OPFNB ;OPEN THE FILE BCC 40$ ;BR IF A-OK FERR OPNO ;FATAL OPEN ON OUTPUT FILE 40$: BITB #FD.REC,F.RCTL(R0) ;RECORD DEVICE? BEQ 50$ ;BR IF NO JSR R0,ATTDET ;TRY TO ATTACH .WORD IO.ATT BITB #4,F.RCTL(R0) ;TELEPRINTER? BNE 50$ ;BR IF NO PUT$S #LSTFDB,#FRMFD,#FRMLEN 50$: MOV #CSIBLK,R0 ;SET CSI BLOCK CALL .CSI2 ;GET COMMAND FOR UFD TO SORT BCS CS2IER ;INPUT SPEC ERROR BITB #CS.MOR,C.STAT(R0) ;CHECK FOR INVALID SYNTAX BNE CS1ERR ;BR IF THERE BIT #SVSW,SWMSK$ ;DID USER SPECIFY A VERSION? BEQ PRCHEK ;NO CHECK IF PROC. BIT #,SWMS1$ ;OTHER VERSION SWITCHES? BEQ 1$ ;NO CARRY ON FERR VERSN ;YES ERROR TOO MANY VERSION SPECIFICATIONS 1$: CMP #-77,SVNUM$ ;DID WE SET FLAG EARLIER? BNE WBCHK BIC #SVSW,SWMSK$ ;YES CLEAR SVSW AND SVNUM CLR SVNUM$ BIT #10,PRNUM$ ;IF ;* AND CM:V USE ALL VERSIONS IN CM BNE WBCHK PRCHEK: BIT #PRSW,SWMS1$ ;ARE WE USING THE PROCESSOR? BEQ WBCHK ;NO BIT #HVSW,SWMS1$ ;IF HV SET DO NOT SET NV BNE WBCHK BIS #NVSW,SWMS1$ ;USING PROCESSOR WITH NV:1 WBCHK: BIT #WBSW,SWMSK$ ;IS WRITE-BACK SPECIFIED? BEQ LINESZ ; NO GO WORK ON LINE SIZE BIT #,SWMS1$ ;USING OLD OR NEW VERSION? BNE WRBKER ; YES BRANCH TO FATAL ERROR LINESZ: MOV #LINSZ$,R0 ;POINT AT LINE SIZE SW VALUE TST (R0) ;DID USER SPECIFY VALUE? BNE 5$ ;BR IF YES! MOV LSTFDB+F.BBFS,(R0) ;SET DEVICE BUFFER SIZE FOR LINE SIZE 5$: CMP (R0),#72. ;CK LINE SIZE AGAINST MIN BHIS 10$ ;BR IF SIZE OK MOV #72.,(R0) ;SET ACCEPTABLE VALUE 10$: CMP (R0),#132. ;NOW CK AGAINST MAX BLOS 20$ ;BR IF OK MOV #132.,(R0) ;SET ACCEPTABLE LINE SIZE 20$: LST1: 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 #3,R2 ;SET TO CONVERT HR,MIN,SEC CALL $TIM ;AND CONVERT THE TIME BIT #DASW,SWMSK$ ;DATE SELECT BEQ 30$ ;BR IF NO MOV #DABUF$,R1 ;SET TO POINT AT SW BUFFER TSTB (R1) ;ANY DATE SUPPLIED? BNE 20$ ;BR IF YES-USE USER SUPPLIED DATE MOV #DATIM$,R1 ;IF NON SUPPLIED-USE TODAY! CMPB (R1),#040 BNE 20$ INC R1 20$: CALL CNVDAT ;CHANGE TO INTEGER FORMAT MOV R2,BEVAL$ ;SAVE TARGET DATE MATCH MOV R2,AFVAL$ ;SAVE TARGET DATE MATCH BNE 40$ 22$: FERR BADD ; BAD DATE FORMAT ; ; CHECK FOR BEFORE & AFTER DATES 30$: BIT #BESW,SWMSK$ BEQ 35$ ; NO BEFORE DATE BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH MOV #BEBUF$,R1 ; CONVERT THE GIVEN DATE TSTB (R1) BNE 33$ MOV #DATIM$,R1 ;IF NO DATE USE TODAY CMPB (R1),#40 BNE 33$ INC R1 33$: CALL CNVDAT MOV R2,BEVAL$ SUB R0,BEVAL$ 35$: BIT #AFSW,SWMSK$ BEQ 40$ ; NO AFTER DATE BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH MOV #AFBUF$,R1 ; CONVERT THE GIVEN DATE CALL CNVDAT MOV R2,AFVAL$ BEQ 22$ ADD R0,AFVAL$ 40$: BITB #CS.WLD,C.STAT+CSIBLK ;ANY WILD CARDS AROUND HERE? BEQ OPN1 ;BR IF NO! MOV C.DIRD+2+CSIBLK,R3 ;02 GET ADDRESS OF DIRECTORY STRING MOV C.DIRD+CSIBLK,R0 ;02 NOW LENGTH BEQ OPN1 ;02 BR IF NO DIRECTORY STRING 48$: DEC R0 ;02 COUNT DOWN NUMBER CHARS TO SCAN BMI OPN1 ;02 BR IF DIDN'T FIND WILD CARD FLAG CMPB (R3)+,#'* ;02 IS THAT A WILD CARD FLAG? BNE 48$ ;02 BR IF NO INC NXUIC$ ;SET UIC TO START AT 1 MOV C.DIRD+2+CSIBLK,R3 ;POINT AT DIRECTORY DESC. CLR WCGRP$ ;ASSUME WILD GROUP INC R3 ;SKIP [ CMPB #'*,(R3)+ ;IS IT WILD? BEQ 70$ ;BR IF YES 60$: CMPB #',,(R3)+ ;LOOK FOR END OF NUMBER BNE 60$ ;BR IF NOT FOUND MOV R3,R1 ;COPY START OF USER NUMBER DEC R1 ;BACK UP TO COMMA MOV #'[,R2 ;SET OTHER END OF FIELD CALL GETUIC ;CONVERT TO RAD50 MOV R1,WCGRP$ ;SAVE SELECTED GROUP 70$: CMPB #'],(R3)+ ;LOOK FOR END OF USER NUMBER BNE 70$ ;BR IF NOT FOUND CLR WCUSR$ ;ASSUME WILD CARD USER MOV R3,R1 ;COPY PLACE IN STRING CMPB -(R1),-(R1) ;BACK UP TO LAST DIGIT IN NUMBER CMPB #'*,(R1)+ ;IS IT WILD BEQ 80$ ;BR IF YES MOV #<',>,R2 ;SET END OF FIELD CALL GETUIC ;CONV TO RAD50 FORM MOV R1,WCUSR$ ;SAVE THAT CODE 80$: MOV #LSTNX$,(SP) ;SET RETURN ADDRESS OPN1: MOV #UFDFDB,R0 ;GET FDB MOV #,R1 ;FILE NAME BLOCK MOV #,R2 ;DATA SET DESCRIPTOR MOV #DFNB,R3 ;DEFAULT NAME BLOCK TST NXUIC$ ;WILD CARD OPERATION ? BEQ 10$ ;NO CALL .PRSDV ;YES, JUST PARSE DEVICE PART BCC INIEX ;EXIT IF OK FERR PRSE ;ELSE COMPLAIN ; 10$: CALL .PARSE ; BCC SRTDIR ;BR IF OK FERR DIRF ;DIRECTORY FIND ERR ; SRTDIR: ; ; DIRECTORY FIND WAS SUCCESSFUL ; MOV F.FNB+N.DID(R0),SAVDID ;SAVE DIRECTORY ID MOV F.FNB+N.DID+2(R0),SAVDID+2 MOV F.FNB+N.DVNM(R0),SAVDVN ;---AND DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER MOV N.DID(R1),N.FID(R1) ;COPY DIRECTORY I.D. CLR N.DID(R1) ;REMOVE DIRECTORY ID MOV N.DID+2(R1),N.FID+2(R1) ;TO FILE ID SPACE MOV N.DID+4(R1),N.FID+4(R1) ;JUST FOR "GRINS", THIS TOO! MOVB #FO.RD!FA.SHR,F.FACC(R0) ;ASSUME ONLY READ ACCESS TSTB SWMSK$ ;DOES HE WANT IT WRITTEN BACK? BPL 5$ ;BR IF NO MOVB #FO.MFY,F.FACC(R0) ;REQUEST ACCESS OF FILE FOR MODIFY 5$: MOV #SAVDID,READHD+Q.IOPL ;SET DIRECTORY ID FOR HEADER READ ALUN$S #HDRLUN,SAVDVN,SAVUNM DIR$ #READHD ;REQUEST THE READ BCC 20$ ;BR IF AOK CALL $ALERR ;DIAGNOS ERR BR 5$ ;RETRY IF THAT IS POSIBLE 20$: WTSE$S #EFN1 ;WAIT FOR THAT TO STOP MOVB HDBUF$+1,R1 ;GET OFFSET TO IDENT AREA ADD #I.FNAM,R1 ;POINT AT FILE NAME ADD #HDBUF$,R1 ;ADD IN OFFSET FOR BUFFER MOV (R1)+,F.FNAM(R0) ;SET TOP 1/2 OF DIRECTORY NAME MOV (R1),F.FNAM+2(R0) ;-AND BOTTOM 1/2 RETURN ; INIEX: MOV F.FNB+N.DVNM(R0),SAVDVN ; SAVE DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER ALUN$S #HDRLUN,SAVDVN,SAVUNM RETURN ; ;GETUIC---LOCAL SUBROUTINE TO CONVERT A 1 TO 3 BYTE NUMERIC STRING ; INTO 3 RADIX 50 CHAR FORMAT CONSISTANT WITH DIRECTORY NAMES GETUIC: MOV #UICS$,R0 ;POINT AT 4 BYTE STRING BUFFER MOV #"00,(R0)+ ;ASSUME LEADING ZEROS NEEDED CLRB (R0)+ ;ADVANCE PONTER 10$: CMPB -(R1),R2 ;IS THIS TERMINAL CHAR? BEQ 20$ ;BR IF YES MOVB (R1),-(R0) ;NO-SET DATA INTO STRING BR 10$ ;TRY AGAIN 20$: MOV #UICS$,R0 ;RESET POINTER CALL $CAT5 ;CONVERT TO RAD50 RETURN .END