|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 3840 (0xf00) Types: TextFile Names: »FILNAM.SRC«
└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80) └─ ⟦this⟧ »FILNAM.SRC«
;DECODES A STRING FROM THE TEXT BUFFER AS A FILE SPECIFICATION ; NAME FILNAM ENTRY FILNAM EXT TIN,NAMERR,TXTYP,POPHDB,PUSHBD INCLUDE DEFLT.SRC ; ; ;IT STORES THE CORRESPONDING CP/M FILE CONTROL BLOCK (FCB) IN A 34 BYTE ;BLOCK STARTING AT HL. THE 34TH BYTE IS THE DRIVE NUMBER AND IS NOT ;LOOKED AT BY CP/M (IT IS LOOKED AT BY SELDSK). FILNAM CALL PUSHBD ;SAVE ALL REGISTERS EXCEPT A PUSH PSW MVI M,0 ; MAKE FIRST BYTE OF FCB ZERO. DCX H DCX H DCX H ; FILE BUFFER ADDRESS MVI M,0 ; SET ALL FLAGS TO ZERO LXI B,4 DAD B PUSH H ; HL POINTS TO START OF FCB NAME FIELD. ;FILL THE NAME FIELD WITH SPACES (THE DEFAULT CHARACTER). MVI B,11 ; 8 CHARACTERS FOR FILE NAME + 3 FOR FILE TYPE. DEFSP MVI M,' ' ; STUFF A SPACE. INX H DJNZ DEFSP ;MAKE THE REST OF THE FCB ZERO. MVI B,DEVNUM-11-1 ;NUMBER OF BYTES TO ZERO. ZEROLP MVI M,0 INX H DJNZ ZEROLP SKIPSP CALL FTIN ; GET A CHARACTER FROM THE TEXT BUFFER. JRZ SKIPSP ; IGNORE SPACES. JRC FILNER ; Error if no characters in buffer. ; CHECK FOR LST: OR CON: PUSH PSW ; SAVE CHAR. PUSH H LHLD 6 ; HL POINTS TO TOP OF MEMORY LXI D,-GETP DAD D ; TEXT-IN POINTER MVI A,3 ADD M MOV E,A MVI D,0 DAD D ; FOURTH CHAR OF FILE NAME MOV A,M CPI ':' ; IS IT A ':' POP H JRZ LSTCON ; YES, CHECK FOR LST: OR CON: ; CHECK FOR SPECIFIED DRIVE POP PSW ; GET CHAR. SUI 'A' ; A..P ===> 0..15 MOV B,A PUSH H ; SAVE 34th BYTE LHLD 6 LXI D,-GETP DAD D ; TEXT_IN_POINTER MVI A,1 ADD M MOV E,A MVI D,0 DAD D ; LOOK AT NEXT CHARACTER MOV A,M CPI CR ; IS IT A CARRIAGE RETURN? JRNZ DLET ; NO MVI A,' ' ; FILENAME IS 1 CHAR, ADD A SPACE DLET: POP H ; 34th BYTE OF FCB CPI ':' ; IS A DRIVE SPECIFIED? JRZ DRVSP PUSH H LHLD 6 ; HL POINTS TO TOP OF MEMORY. LXI D,-GETP DAD D ; HL POINTS TO TEXT IN POINTER. DCR M ; PUSH IT BACK 1 CHARACTER. LHLD 6 DCX H ; HL POINTS TO DEFAULT DRIVE #. MOV A,M POP H JR DRVNSP ; Drive not specified ;CHARACTER IN A SHOULD BE THE DRIVE LETTER. DRVSP: CALL FTIN ; read past the : MOV A,B ; DRIVE LETTER ===> A DRVNSP: CPI MAXDRV ; IS IT A VALID DRIVE NUMBER? JRC DRVOK ;RETURN AN ERROR CODE. FILNER POP H ; CLEAN UP THE STACK. NAMER LXI H,NAMERR CALL TXTYP ; 'Bad filename' POP PSW STC JMP POPHDB LSTCON: POP PSW ; GET CHAR. CPI 'L' ; CHECKING FOR LST: JRZ LST1 CPI 'C' ; CHECKING FOR CON: JRNZ NAMER ; NEITHER, BAD FILE NAME CALL FTIN CPI 'O' ; SECOND LETTER OF CON: JRNZ NAMER ; NO, BAD FILE NAME CALL FTIN CPI 'N' ; THIRD LETTER OF CON: JRNZ NAMER POP H ; CON:! LXI B,-4 DAD B ; FBA BSET 7,M ; SET FLAG FOR CONSOLE FILE JR LST2 LST1: CALL FTIN CPI 'S' ; SECOND LETTER OF LST: JRNZ NAMER CALL FTIN CPI 'T' ; THIRD LETTER JRNZ NAMER POP H LXI B,-4 DAD B ; FBA BSET 6,M ; SET FLAG FOR LISTING DEVICE LST2: CALL FTIN ; READ THE ':' NOMORE: POP PSW ORA A JMP POPHDB DRVOK MOV M,A ; STORE DRIVE NUMBER IN 34TH BYTE OF FCB POP H ; START OF FCB NAME FIELD MVI B,9 ; LIMIT + 1 TO # OF CHARS IN FILE NAME. SKSP CALL FTIN JRC NOMORE ; Branch if the text in buffer is empty. JRZ SKSP ; Skip spaces. CPI '.' JRZ NXTPT ; Branch if we have reached the type field. MOV M,A ; STORE THE CHARACTER IN THE FCB. INX H ; INCREMENT THE FCB POINTER. DJNZ SKSP JMPR NAMER ;TOO MANY CHARACTERS IN A FIELD. NXTPT MOV C,B MVI B,4 ; LIMIT +1 OF # OF CHARS IN FILE TYPE. NOIMAG DCR C JRZ SKSP INX H JMPR NOIMAG ; ; FTIN -- FILE TIN, CONVERTS ALL LETTERS TO UPPER CASE FTIN: CALL TIN CPI 'a' ; is it >= 'a' JRC FTIN1 ; YES, CPI 'z'+1 ; IS IT <= 'z' JRNC FTIN1 ; YES, ANI 5FH ; THEN CONVERT TO UPPER CASE FTIN1: CPI ' ' ; COMPARE TO A SPACE RET ; AND RETURN ; «eof»