.TITLE MF01 CONVERT FILENAME TO FILENAME BLOCK DATA .IDENT /MF01.E/ ; ; MODS LIST ; ========= ; ; (A) ALLOW CHARACTER READ OF PROTECTED STRINGS ; (B) DEFAULT FILENAME BLOCK ADDRESS IN R0 ; (C) ENABLE FILE FUNCTION CODES TO BE USED ; (D) DEFAULT FILENAME BLOCK NOW HELD IN MFD1 SOURCE ; (E) ADDRESS OF DFNB NOT PASSED BACK AS THIS IS A FIXED STORE ; ; .SBTTL MAIN CONTROL PROGRAM ; F$NAME:: ;THIS PROCEDURE SETS UP A FILENAME BLOCK ; ; ; ENTRY CONDITIONS ; R0 -> ADDRESS OF FILENAME STRING ; ; EXIT CONDITIONS ; DFNB SET UP IF STATUS = SUCCESS ; FNB = FILENAME BLOCK ; DFNB= DEFAULT FILENAME BLOCK ; ; .SBTTL PRESETS USED IN PROGRAM FNAMDEF ;REQUEST FILENAME CONTROL FLAGS FILEFUN ;REQUEST FILE FUNCTION FLAGS .PAGE .SBTTL INITIALISATION SECTION ; ; ; USE OF REGISTERS ; ; R0* = GENERAL DOGSBODY REGISTERS ; AND INPUT/OUTPUT POINTER ; R1* = ADDRESS OF FILENAME STRING ; R2* = USED BY THE 'POSITION' ROUTINE ; R3* = ADDRESS OF FILENAME DATA AREA ; R4* = NUMBER ACUMULATOR ; R5* = NEXT CHARACTER POSITION TO ACCESS ; ; * MARKS REGISTERS THAT NEED TO BE SAVED ; ; ; SAVE ;PROTECT REGISTERS MOV R0,R1 ;HOLD ADDRESS OF DATA STRING MOV #F$DFNB,R3 ;HOLD FNB ADDRESS CLR N.FID+0(R3) ;CLEAR OUT FILE IDENITY WORDS CLR N.FID+2(R3) ;IF ANY FILE ID WORDS HAVE A VALUE CLR N.FID+4(R3) ;IN THEM THE SYSTEM TRYS TO OPEN FILE ;BY FILE ID ONLY. CLR N.STAT(R3) ;REMOVE ALL STATUS FLAGS MOV #1,R5 ;START CHARACTER POSITION IN STRING ; ; ; ; .PAGE .SBTTL PROCESS DEVICE SECTION ; MOV #':,R0 ;HOLD LOCATE CHARACTER CALL R$POSS ;DOES COLON EXIST IN STRING IFSUCCESS 10$ ;J IF DEVICE NAME SPECIFIED ; ; ASSUME DEFAULT IS SY0: BIT #.NOSY0,F$FLG0 ;IS SY0: DEFAULT REQUIRED BNE 15$ ;J IF NOT REQUIRED ; MOV #"SY,N.DVNM(R3) ;LOAD DEVICE CHARACTERS CLR N.UNIT(R3) ;INDICATE UNIT IS ZERO BIS #NB.DEV,N.STAT(R3) ;INDICATE EXPLICIT DEVICE BR 15$ ;CRASH ON REGUARDLESS ; ; REAL DATA HAS BEEN ENTERED ; 10$: MOV #4,F$MAXC ;MAXIMUM NUMBER OF CHARS IN DEVICE TYPE ;PROCESSING COMMAND STATUS BIS #NB.DEV,N.STAT(R3) ;INDICATE EXPLICIT DEVICE MOV #ALPHA!REMWILD!REMTERM,F$FLG1 CALL GETCHAR ;GET FIRST CHARACTER MOVB R0,N.DVNM+0(R3) ;LOAD FIRST CHAR TO DATA BUFFER CALL GETCHAR ;GET SECOND DEVIVE CHARACTER MOVB R0,N.DVNM+1(R3) ;LOAD SECOND CHAR TO DATA BUFFER ; ;PROCESSING COMMAND STATUS MOV #OCTAL!COLON!REMWILD,F$FLG1 MOV R3,R4 ;HOLD DATA BUFFER ADDRESS ADD #N.UNIT,R4 ;R4 NOW HOPEFULLY POINTS TO THE UNIT WORD CLR @R4 ;WE START AT ZERO 12$: CALL GETCHAR ;GET CHARS BR 15$ ;TERMINATION RETURN BRANCH ; EXIT POINT IF VALID OCTAL NUMBER ASL @R4 ;MAKE SPACE FOR NEW DIGIT ASL @R4 ;THIS IS THE NON EIS MULTIPLY BY 8 ORDER ASL @R4 ;REQUIRED ON CHEAP AND GROTTY COMPUTERS ADD R0,@R4 ;BUILD UP DEVICE NUMBER BR 12$ ;BUILD UP DEVICE NUMBER ; ; .PAGE .SBTTL PROCESS USER IDENTITY CODE ; ; 15$: ;TRY AND MAKE SENCE OF UIC INPUT ; MOV #"00,N.DID+0(R3) ;FORCE DATA AREA TO UIC [0,0] MOV #"00,N.DID+2(R3) MOV #"00,N.DID+4(R3) ; BIT #.NOUIC,F$FLG0 ;IS UIC OPTION DISABLED BNE 25$ ;J IF OPTION NOT REQUIRED ; MOV #'[,R0 ;SEEK CHARACTER [ CALL R$POSS ;IS A UIC CHAR START CHARACTER IN STRING IFERROR 25$ ;J IF NO UIC CHARACTER ; MOV #OPEN!COMMA!OCTAL!NUMBER!WILD,F$FLG1 MOV #5,F$MAXC ;MAXIMUM NUMBER OF CHARACTERS IN UIC GROUP BIS #NB.DIR,N.STAT(R3) ;INDICATE AN EXPLICIT UIC SPECIFIED 18$: CALL GETCHAR ;GET A CHARACTER BR 19$ ;VALID WILD CARD EXIT BR 20$ ;COMMA TERMINATOR EXIT ; VALID OCTAL NUMBER BIC #WILD,F$FLG1 ;ALLOW ONLY OCTAL CHARACTERS MOVB N.DID+1(R3),N.DID+0(R3) MOVB N.DID+2(R3),N.DID+1(R3) MOVB R0,N.DID+2(R3) ;SHOVEL IN CHAR AT GROUP START POSITION BR 18$ ;GET NEXT ASCII CHARACTER ; 19$: BIC #OCTAL!WILD,F$FLG1 ;ALLOW TERMINATORS ONLY BIS #NB.SD1,N.STAT(R3) ;A WILD GROUP SETTING BR 18$ ;WAIT FOR TERMINATOR ; 20$: MOV #CLOSE!COMMA!OCTAL!NUMBER!WILD,F$FLG1 ;SECOND FIELD CONTROL SETTINGS MOV #4,F$MAXC ;MAX CHARS IN UIC MEMBER 21$: CALL GETCHAR ;GRAB A CHARACTER BR 23$ ;WILD CARD EXIT BR 25$ ;CLOSING BRACKET TERMINATOR ; VALID CHARACTER EXIT BIC #WILD,F$FLG1 ;OCTAL CHARACTERS ONLY MOVB N.DID+4(R3),N.DID+3(R3) MOVB N.DID+5(R3),N.DID+4(R3) MOVB R0,N.DID+5(R3) ;SHOVEL IN CHAR AT MEMBER START POSITION BR 21$ ;GET NEXT ASCII CHARACTER ; 23$: BIC #OCTAL!WILD,F$FLG1 ;ALLOW TERMINATOR ONLY BIS #NB.SD2,N.STAT(R3) ;INDICATE WE HAVE A WILD MEMBER BR 21$ ;GET TERMINATOR ; .PAGE .SBTTL PROCESS FILENAME SECTION ; 25$: MOV #'.,R0 ;CHARACTER TO LOOK FOR CALL R$POSS ;DOES FILENAME TERMINATOR EXIST IN STRING IFERROR ERROR ;J IF YUCK ENTRY ; MOV #RAD50!DOT,F$FLG1 ;CONTROL CONDITION FOR READ MOV #9.,F$MAXC ;BIGGEST FILENAME IS 9 CHARACTER MOV R3,R4 ;ADDRESS OF FDB ADD #N.FNAM,R4 ;ACTUAL ADDRESS OF FILENAME SECTION CLR @R4 ;CLEAR OUT FILE NAME SECTION CLR 2(R4) CLR 4(R4) ;THREE WORDS IN TOTAL ; CLR N.FTYP(R3) ;CLEAR OUT FILE TYPE CLR N.FVER(R3) ;ASSUME VERSION ZERO ; CALL R$R50L+2 ;INITIALISE RAD50 LOADER PROCEDURE ; 28$: CALL GETCHAR ;GET A CHARACTER BR 30$ ;J IF WILD CARD EXIT BR 35$ ;J IF VAILD TERMINATOR CALL R$R50L ;STASH RAD50 CHARACTER IN FILENAME SECTION BIS #NB.NAM,N.STAT(R3) ;INDICATE EXPLICIT FILENAME BIC #WILD,F$FLG1 ;ALLOW CHARACTERS ONLY BR 28$ ;LOOP TILL ALL CHARS READ IN ; 30$: BIS #NB.SNM,N.STAT(R3) ;INDICATE WILD FILENAME BIC #RAD50!WILD,F$FLG1 ;ONLY VALID CHAR TO FOLLOW IS A DOT BR 28$ ;CHECK IF DOT FOLLOWS ; .PAGE .SBTTL PROCESS FILETYPE AND VERSION ; 35$: MOV R3,R4 ;HOLD FDB BUFFER ADDRESS ADD #N.FTYPE,R4 ;ADDRESS OF FILE TYPE WORD CALL R$R50L+2 ;INITIALISE RAD50 LOADER MOV #3,F$MAXC ;LIMIT NUMBER OF CONVERSIONS MOV #RAD50!NOCHAR!SEMI!WILD,F$FLG1 ;SET UP READ CONTROL FLAGS ; 38$: CALL GETCHAR ;READ A CHARACTER BR 40$ ;WILD CARD EXIT BR 45$ ;VALID TERMINATOR EXIT CALL R$R50L ;BUILD UP TYPE BIS #NB.TYP,N.STAT(R3) ;INDICATE AN EXPLICIT FILETYPE BIC #WILD,F$FLG1 ;ALLOW CHARACTERS ONLY BR 38$ ;LOOP TILL END ; 40$: BIS #NB.STP,N.STAT(R3) ;INDICATE WILD CARD BEEN USED BIC #RAD50!WILD,F$FLG1 ;ONLY SEMI AND NOCHARS NOW VALID BR 38$ ;LOOP TILL VALID END ; 45$: MOV #6,F$MAXC ;VERSION NUMBER 6 CHARS MAX MOV #OCTAL!NOCHAR!WILD,F$FLG1 ;SET UP READ CONTROL FLAGS 48$: CALL GETCHAR ;READ A VALID CHARACTER BR 50$ ;J IF WILD CARD VERSION BR 55$ ;J IF VALID TERMINATOR ASL N.FVER(R3) ;MULTIPLY VERSION BY 2 ASL N.FVER(R3) ;MULTIPLY VERSION BY 2 ASL N.FVER(R3) ;MULTIPLY VERSION BY 2 ADD R0,N.FVER(R3) ;LOAD IN LS DIGIT BIS #NB.VER,N.STAT(R3) ;INDICATE THIS IS AN EXPLICIT VERSION BIC #WILD,F$FLG1 ;ALLOW CHARACTERS ONLY BR 48$ ;LOOP TILL END ; 50$: BIS #NB.SVR,N.STAT(R3) ;INDICATE A WILD CARD VERSION BIC #OCTAL!WILD,F$FLG1 ;STOP ANY FURTHER CHARACTERS BR 48$ ;LOOP TILL VERSION FILLED ; ; 55$: SETSUCCESS ;EXIT AS COMMAND SAID JMP EXIT ; ERROR: JMP EREXIT ;SOMEFING WENT RONG ; .PAGE .SBTTL CHARACTER READ AND VALIDATION ROUTINE ; ; GETCHAR: ;THIS PROCEDURE VALIDATE AN INPUT CHARACTER ; DEC F$MAXC ;REDUCE CHARACTER LIMIT 10$: CALL 100$ ;GET A CHARACTER IFSUCCESS 15$ ;J IF CHARACTER BEEN EXTRACTED BIT #NOCHAR,F$FLG1 ;IS LACK OF CHARACTER A VALID TERMINATOR BEQ 16$ ;LACK OF CHARS = ERROR HENCE JMP BIC #NOCHAR,F$FLG1 ;REMOVE NO CHAR OPTION BR 600$ ;EXIT AS TERMINATOR ; .PAGE .SBTTL WILDCARD VALIDATION ; ; 15$: CMP #'*,R0 ;IS THIS WILD CARD SITUATION BNE 17$ ;J IF NOT WILD CARD ; BIT #.NOWILD,F$FLG0 ;ARE WILDCARDS ALLOWED GLOBALLY BNE 16$ ;J IF NOT ALLOWED BIT #WILD,F$FLG1 ;IS A WILD CARD ALLOWED BEQ 16$ ;J IF ILLEGAL WILDCARD BIT #REMWILD,F$FLG1 ;HAS THE WILDCARD EXIT BEEN REMOVED BNE 16$ ;ERROR IF NO VALID EXIT BR 610$ ;WILD EXIT ; 16$: BR 620$ ;ERROR EXIT ; ; .PAGE .SBTTL LOOK FOR VALID TERMINATORS ; 17$: CMP #',,R0 ;IS THIS A COMMA BNE 19$ ;J IF NOT COMMA BIT #COMMA,F$FLG1 ;IS A COMMA EXPECTED BEQ 16$ ;WRONG J IF WRONG FORMAT BR 600$ ;TERMINATION EXIT ; 19$: CMP #'[,R0 ;IS CHAR AN OPEN BRACKET BNE 21$ ;J IF NOT BIT #OPEN,F$FLG1 ;WAS OPEN BRACKET EXPECTED BEQ 620$ ;J IF SURPRISE BR 10$ ;GET NEXT CHARACTER ; 21$: CMP #':,R0 ;IS THIS A COLON BNE 23$ ;J IF NOT BIT #COLON,F$FLG1 ;WAS IT EXPECTED BEQ 620$ ;J IF SURPRISE BR 600$ ;TERMINATION EXIT ; 23$: CMP #'.,R0 ;IS THIS A DOT BNE 25$ ;J IF NOT A DOT BIT #DOT,F$FLG1 ;WAS DOT EXPECTED BEQ 620$ ;J IF SYNTAX ERROR BR 600$ ;TERMINATION EXIT ; 25$: CMP #';,R0 ;IS THIS A SEMI COLON BNE 27$ ;J IF NOT BIT #SEMI,F$FLG1 ;IS VERSION STOP EXPECTED BEQ 620$ ;J IF ERROR SITUATION BR 600$ ;TERMINATION EXIT ; 27$: CMP #'],R0 ;IS THIS A CLOSE BRACKET BNE 29$ ;J IF NOT BIT #CLOSE,F$FLG1 ;IS A CLOSE BRACKET EXPECTED BEQ 620$ ;J IF NOT EXPECTED (ERROR) BR 600$ ;TERMINATION EXIT ; .PAGE .SBTTL VALID DATA AND CONVERSIONS SECTION ; 29$: BIT #OCTAL,F$FLG1 ;IS OCTAL CONVERSION REQUIRED BEQ 31$ ;J IF NOT SUB #48.,R0 ;REDUCE TO BASE LEVEL BLT 620$ ;J IF NOT OCTAL CHARACTER CMP R0,#8. ;IF VALUE IN OCTAL RANGE BGE 620$ ;J IF NOT OCTAL BIT #NUMBER,F$FLG1 ;IS NUMBER BACK CONVERT REQD BEQ 30$ ; J IF NOT ADD #48.,R0 ;CONVERT BACK TO AN NUMBER 30$: BR 590$ ;NORMAL EXIT ; 31$: BIT #RAD50,F$FLG1 ;IS RAD50 CONVERSION REQUIRED BEQ 33$ ;J IF NOT SAVE R0 ;PROTECT CHARACTERS CALL R$CR50 ;CONVERT TO RAD50 UNSAVE R0 ;RESTORE CHARACTER BUT KEEP STATUS FLAG IFERROR 620$ ;J IF NO CONVERT BR 590$ ;NORMAL EXIT ; 33$: BIT #ALPHA,F$FLG1 ;IS ALPHA CHECK REQUIRED BEQ 35$ ;J IF ALPHA CHECK NOT REQUIRED CMP R0,#'A ;IS CHAR AN ALPHA BLT 620$ ;J IF NOT ALPHA CMP R0,#'Z ;IS CHAR STILL IN ALPHA RANGE BGT 620$ ;J IF ERROR SITUATION BR 590$ ;NORMAL EXIT ; ; 35$: BR 620$ ;UNCON ERROR ; ; .PAGE .SBTTL EXTRACT NEXT CHARACTER FROM DATA STRING ; ; ; ; ENTRY CONDITIONS ; R1 -> DATA STRING ; ; EXIT CONDITIONS ; R0 = NEXT CHARACTER IF STATUS = SUCCESS ; ; 100$: CMP @R1,R5 ;HAVE WE REACHED THE END OF THE STRING BLT 110$ ;J IF END REACHED INC R5 ;R5 = DIRECT OFFSET TO NEXT CHARACTER MOV R1,R0 ;HOLD STRING ADDRESS ADD R5,R0 ;HOLD ABSOLUTE ADDRESS OF CHARACTER MOVB @R0,R0 ;HOLD CHARACTER EXITSUCCESS ;BACK TO CALLING ROUTINE ; 110$: EXITERROR ;EXIT NO CHARACTER ; ; ; ; ; ; ; .PAGE .SBTTL MULTI CONDITIONAL EXITITING SECTION ; ; 590$: TST F$MAXC ;IS CHARACTER LIMIT UP BLT 620$ ;J IF EXCESS CHARS BIT #ALPHA!OCTAL!RAD50,F$FLG1 ;IS ONE OF THE ABOVE EXPECTED ??? BEQ 620$ ;NO SO ERROR BIT #REMTERM,F$FLG1 ;IS TERMINATION EXIT TO BE REMOVED BNE 600$ ;YEP ADD #2,@SP ;FUDGE RETURN ADDRESS ; 600$: BIT #REMWILD,F$FLG1 ;IS WILD EXIT TO BE REMOVED BNE 610$ ;YEP ADD #2,@SP ;FUDGE RETURN ADDRESS +2 OR +4 610$: RETURN ;EXIT TO CALLING PROGRAM ; 620$: TST (SP)+ ;FUDGE SP TO PICK UP F$NAME CALL ADDRESS EREXIT: SETERROR ;INDICATE ERROR SITUATION EXIT: UNSAVE ;RESTORE ALL USED REGISTERS RETURN ;EXIT FROM ROUTINE WHICH CALLED THIS ROUTINE ; ; ; ; .END ; ; ;