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