mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 17:04:19 +00:00
152 lines
4.8 KiB
Plaintext
152 lines
4.8 KiB
Plaintext
|
||
;*****************************************************
|
||
;*
|
||
;* Parse Filename Function
|
||
;*
|
||
;*****************************************************
|
||
|
||
;=========== =========================
|
||
parse_entry: ; Parse filename into FCB
|
||
;=========== =========================
|
||
; input: DX -> PCB in u_wrkseg
|
||
; output: BX = 0ffffh on error
|
||
; = 0 on last name in string
|
||
; = offset of delimiter following name
|
||
; CX = Error Code
|
||
;
|
||
; PCB: +----+----+----+----+
|
||
; | NAMEADR | FCBADR |
|
||
; +----+----+----+----+
|
||
;
|
||
; NAMEADR = offset of String to parse
|
||
; FCBADR = offset of FCB in u_wrkseg
|
||
;
|
||
; Parsed FCB:
|
||
; 0 => drive, 0=default, 1=A, 2=B, ...
|
||
; 1- 8 => name, converted to upper case,
|
||
; padded w/blanks
|
||
; 9-11 => type, converted to upper case,
|
||
; padded w/blanks
|
||
; 12-15 => set to zero
|
||
; 16-23 => password, convered to upper case,
|
||
; padded w/blanks
|
||
; 24-25 => address of password field in 'filename',
|
||
; set to zero if password length=0
|
||
; 26 => length of password (0-8)
|
||
; 27-31 => left as is
|
||
|
||
mov ax,u_wrkseg
|
||
push ds ! mov ds,ax ;DS->u_wrkseg
|
||
push es ! mov es,ax ;ES->u_wrkseg for string ops
|
||
mov bx,dx ! mov si,pcb_flnmptr[bx] ;SI->nxt char in parse string
|
||
mov bx,pcb_fcbptr[bx] ;BX -> FCB
|
||
call fcbinit ! call deblank ;init FCB, deblank parse str
|
||
mov bp,e_badfname ;BAD FILENAME
|
||
;BP=error code if error
|
||
call delim ! jnz parse1 ;chk 1st char
|
||
jmp pfn_endp
|
||
parse1: mov ch,al ! inc si ! mov al,[si] ;see if Disk spec
|
||
cmp al,':' ! jne parse2
|
||
mov bp,e_illdisk ;drive specified
|
||
mov al,ch ! sub al,'A' ! jc pfn_err ;see if legal
|
||
cmp al,16 ! jge pfn_err
|
||
inc al ! mov fcb_dr[bx],al ;good drv, set fcb_dr field
|
||
mov bp,e_badfname
|
||
inc si ! call delim ! jnz parse3 ;check nxt char
|
||
cmp al,'.' ! je pfn_err ;hit delim
|
||
cmp al,':' ! je pfn_err ; see if legal
|
||
cmp al,';' ! je pfn_err
|
||
jmp parse3
|
||
parse2: dec si ;use default disk
|
||
|
||
parse3: ;parse filename
|
||
mov di,bx ! lea bx,fcb_name[di]
|
||
mov ch,8 ! call setfld ;fill in FCB
|
||
cmp ch,0 ! jne parse4
|
||
call delim ! jz parse4 ;see if more than 8 chars
|
||
pfn_err: mov cx,bp
|
||
mov bx,0ffffh ! pop es ! pop ds ! ret
|
||
parse4: cmp al,'.' ! jnz parse5 ;see if filetype
|
||
mov bp,e_badftype
|
||
mov ch,3 ! lea bx,fcb_type[di]
|
||
inc si ! call setfld ;fill in FCB
|
||
cmp ch,0 ! jne parse5
|
||
call delim ! jz parse5
|
||
jmp pfn_err
|
||
|
||
;parse passwd
|
||
parse5:
|
||
cmp al,';' ! jnz parse8 ;see if password delim
|
||
mov bp,e_ill_passwd
|
||
mov ch,8 ! lea bx,fcb_passwd[di]
|
||
inc si ! call setfld ;yes
|
||
mov cl,8 ! sub cl,ch
|
||
mov fcb_plen[di],cl
|
||
cmp ch,0 ! jne parse8
|
||
call delim ! jz parse8
|
||
jmp pfn_err
|
||
|
||
parse8: mov bx,si ! call deblank ;see if more to parse
|
||
call delim ! jnz pfn_out ;if yes,exit
|
||
mov bx,si
|
||
cmp al,0 ! je pfn_endp
|
||
cmp al,cr ! jne pfn_out
|
||
pfn_endp: mov bx,0 ;NOPE
|
||
pfn_out:sub cx,cx ! pop es ! pop ds ! ret ;exit
|
||
|
||
setfld: ; fill in a field until end of field or delim
|
||
;------
|
||
pop dx ! call delim ! push dx
|
||
jz setret
|
||
cmp al,'*' ! jnz setfld1
|
||
mov byte ptr [bx],'?'
|
||
inc bx ! dec ch ! jnz setfld
|
||
jmp setfld2
|
||
setfld1: mov [bx],al ! inc bx ! dec ch
|
||
setfld2: inc si ! cmp ch,0 ! jne setfld
|
||
setret: ret
|
||
|
||
delim: ; see if char is delim, if not UPPER it, err if illegal
|
||
;-----
|
||
; input: SI -> next char in parse string
|
||
; output: 'z' flag on if delimiter found
|
||
; character converted to UPPER if 'a'-'z'
|
||
; AL = converted char
|
||
|
||
mov cl,ndelims ! mov al,[si] ;See if Delimiter
|
||
push di ! mov di,offset delims ;look at delim string
|
||
delnxt: cmp cl,0 ! je no_del ;if end of delims,not delim
|
||
cmp cs:[di],al ! je delret ;if delim, ret w/ z set
|
||
dec cl ! inc di ! jmps delnxt ;try next delim
|
||
no_del: cmp al,' ' ! ja del_up ;not delim, check graphic
|
||
pop di ! pop bx ! mov cx,e_badfname ;not graphic, err
|
||
jmp pfn_err ;go directly out, bypass ret
|
||
del_up: cmp al,'a' ! jb delret ;if below 'a', no high bit,ret
|
||
cmp al,'z' ! ja del_noup ;if above 'z',
|
||
and al,05fh ;make 'a'-'z' UPPER CASE
|
||
del_noup: and al,07fh ;strip high bit
|
||
delret: pop di ! ret
|
||
|
||
delims db 0,tab,cr,'.:;=,/[]<> '
|
||
ndelims equ (offset $)-(offset delims)
|
||
|
||
deblank: ;strip leading blanks
|
||
;-------
|
||
; input: SI -> parse string
|
||
; output: SI -> first non-blank or tab char
|
||
|
||
cmp byte ptr [si],' ' ! je blnk
|
||
cmp byte ptr [si],tab ! je blnk
|
||
ret
|
||
blnk: inc si ! jmps deblank
|
||
|
||
fcbinit: ; Initialize FCB
|
||
;-------
|
||
mov di,bx ! sub ax,ax
|
||
sub cx,cx ! stosb ; 0 =0
|
||
mov al,' ' ! mov cl,11 ! rep stosb ; 1-11=' '
|
||
mov al,0 ! mov cl,2 ! rep stosw ;12-15=0
|
||
mov al,' ' ! mov cl,8 ! rep stosb ;16-23=' '
|
||
mov al,0 ! mov cl,3 ! rep stosb ;24-26=0
|
||
ret
|
||
|