$title	('Filename Parser')
	name	Parse
	public parse
	CSEG
	; BC->.(.filename,.fcb)
	;
	; filename = [d:]file[.type][;password]
	;             
	; fcb assignments
	;
	;   0     => drive, 0 = default, 1 = A, 2 = B, ...
	;   1-8   => file, converted to upper case,
	;            padded with blanks
	;   9-11  => type, converted to upper case,
	;	     padded with blanks
	;   12-15 => set to zero
	;   16-23 => password, converted to upper case,
	;	     padded with blanks
	;   24-25 => address of password field in 'filename',
	;	     set to zero if password length = 0
	;   26    => length of password (0 - 8)
	;
	; Upon return, HL is set to FFFFH if BC locates
	;            an invalid file name;
	; otherwise, HL is set to 0000H if the delimiter
	;            following the file name is a 00H (NULL)
	; 	     or a 0DH (CR);
	; otherwise, HL is set to the address of the delimiter
	;            following the file name.
	;
parse:	lxi h,0
	push h
	push h
	mov h,b
	mov l,c
	mov e,m
	inx h
	mov d,m
	inx h		
	mov a,m
	inx h
	mov h,m
	mov l,a	
	call deblnk
	call delim
	jnz parse1
	mov a,c
	ora a
	jnz parse9
	mov m,a
	jmp parse3
parse1:	mov b,a
	inx d
	ldax d
	cpi ':'
	jnz parse2
	mov a,b
	sui 'A'
	jc parse9
	cpi 16
	jnc parse9
	inr a
	mov m,a
	inx d
	call delim
	jnz parse3
	cpi '.'
	jz parse9
	cpi ':'
	jz parse9
	cpi ';'
	jz parse9
	jmp parse3
parse2:	dcx d
	mvi m,0
parse3:	mvi b,8
	call setfld
	mvi b,3
	cpi '.'
	jz parse4
	call padfld
	jmp parse5
parse4:	inx d
	call setfld
parse5:	mvi b,4
parse6:	inx h
	mvi m,0
	dcr b
	jnz parse6
	mvi b,8
	cpi ';'
	jz parse7
	call padfld
	jmp parse8
parse7:	inx d
	call pwfld
parse8:	push d
	call deblnk
	call delim
	jnz pars81
	inx sp
	inx sp
	jmp pars82
pars81: pop d
pars82: mov a,c
	ora a
	pop b
	mov a,c
	pop b
	inx h
	mov m,c
	inx h
	mov m,b
	inx h
	mov m,a
	xchg
	rnz
	lxi h,0
	ret
parse9:	pop h
	pop h
	lxi h,0ffffh
	ret

setfld:	call delim
	jz padfld
	inx h
	cpi '*'
	jnz setfd1
	mvi m,'?'
	dcr b
	jnz setfld
	jmp setfd2
setfd1: mov m,a
	dcr b
setfd2: inx d
	jnz setfld
setfd3: call delim
	rz
	pop h
	jmp parse9

pwfld:	call delim
	jz padfld
	inx sp
	inx sp
	inx sp
	inx sp
	inx sp
	inx sp
	push d
	push h
	mvi l,0
	xthl
	dcx sp
	dcx sp
pwfld1:	inx sp
	inx sp
	xthl
	inr l
	xthl
	dcx sp
	dcx sp
	inx h
	mov m,a
	inx d
	dcr b
	jz setfd3
	call delim
	jnz pwfld1
	;jmp padfld

padfld:	inx h
	mvi m,' '
	dcr b
	jnz padfld
	ret

delim:	ldax d
	mov c,a
	ora a
	rz
	mvi c,0
	cpi 0dh
	rz
	mov c,a
	cpi 09h
	rz
	cpi ' '
	jc delim2
	rz
	cpi '.'
	rz
	cpi ':'
	rz
	cpi ';'
	rz
	cpi '='
	rz
	cpi ','
	rz
	cpi '/'
	rz
	cpi '['
	rz
	cpi ']'
	rz
	cpi '<'
	rz
	cpi '>'
	rz
	cpi 'a'
	rc
	cpi 'z'+1
	jnc delim1
	ani 05fh
delim1:	ani 07fh
	ret
delim2:	pop h
	jmp parse9

deblnk: ldax d
	cpi ' '
	jz dblnk1
	cpi 09h
	jz dblnk1
	ret
dblnk1: inx d
	jmp deblnk
	END
	EOF


