mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
234 lines
3.0 KiB
NASM
234 lines
3.0 KiB
NASM
$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
|
||
|
||
|
||
|