home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
norge.freeshell.org (192.94.73.8)
/
192.94.73.8.tar
/
192.94.73.8
/
pub
/
computers
/
cpm
/
alphatronic
/
PASCALZ4.ZIP
/
D3
/
FILNAM.SRC
< prev
next >
Wrap
Text File
|
1999-04-05
|
4KB
|
178 lines
;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 STAR.TING 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
XRA A
MOV B,A
MOV D,A
MOV E,M ;LOCATION OF FIRST CHAR
DAD D
NXTCHR: INR B ;CHAR COUNTER
MOV A,M ;GET CHAR
CPI CR ;IS IT A CARRIAGE RETURN
INX H ;NEXT POSITION
JRNZ NXTCHR ;NOT A CR
MVI A,3
CMP B ;IS LENGTH 3 OR LESS
JRNC NOTCL1 ;TOO SHORT TO BE CON: OR LST:
LHLD 6
LXI D,-GETP
DAD D ;LENGTH >=4 - IS IT CON: OR LST:
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
NOTCL: 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
NOTCL1: POP H
JR NOTCL
;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 LIS.TING 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
;