minix.fst/get_dir_entry.aii

996 lines
12 KiB
Plaintext
Raw Normal View History

2015-08-16 20:10:30 +00:00
;
; This file contains the implementation of get_dir_entry.
; It also contains other functions for finding an entry within
; a directory.
;
2015-08-17 00:53:43 +00:00
string asis
2015-08-13 18:05:19 +00:00
include 'gsos.equ'
include 'minix.equ'
include 'records.equ'
2015-08-13 18:05:19 +00:00
include 'fst.equ'
include 'fst.macros'
include 'M16.Debug'
2015-08-14 19:51:22 +00:00
include 'p.equ'
2015-08-13 18:05:19 +00:00
2015-08-16 20:10:30 +00:00
import disk_inode:v1_inode
import disk_super:v1_super
2015-08-16 20:10:30 +00:00
2015-08-14 15:45:41 +00:00
;
; dirent_entry 0 is a special case.
; (assuming base = 1, displacement = 1)
; first call:
; before
; dirent_entry = 0, dirent_zone = 0, dirent_offset = 0
; after:
; dirent_entry = 1, dirent_zone = 0, dirent_offset = 0
;
; subsequent calls:
; before
; dirent_entry = 1, dirent_zone = ..., dirent_offset = ...
; after
; dirent_entry = 2, dirent_zone = ..., dirent_offset = ...
;
2015-08-13 18:05:19 +00:00
2015-08-16 20:10:30 +00:00
; don't think this needs to be dp... move to a normal record.
data record
2015-08-13 18:05:19 +00:00
2015-08-14 19:28:16 +00:00
; size of the directory, divided by dirent_size.
size ds.l 1
2015-08-13 18:05:19 +00:00
displacement ds.w 1
2015-08-14 15:45:41 +00:00
2015-08-13 18:05:19 +00:00
dirent_size ds.w 1
2015-08-14 15:45:41 +00:00
dirent_zone ds.w 1
dirent_offset ds.w 1
dirent_entry ds.w 1
2015-08-13 18:05:19 +00:00
2015-08-14 20:41:45 +00:00
dirent ds v1L_dirent
2015-08-16 20:10:30 +00:00
2015-08-13 18:05:19 +00:00
endr
2015-08-14 20:41:45 +00:00
import init_fcr
import init_vcr
import load_inode
import read_data_block
import do_ignore
import do_eof
import do_blocks
import do_r_eof
import do_r_blocks
import do_access
import do_file_sys_id
import do_option_list
import do_create_date_time
import do_mod_date_time
import do_file_type
import do_aux_type
entry init
entry base_displace
entry find_next_dirent
entry find_absolute_dirent
entry find_dirent_block
entry count_entries
entry count_dirent_block
entry do_flags
entry do_name_buffer_0
entry do_name_buffer_1
entry do_entry_num
2015-08-16 20:10:30 +00:00
entry sparse_dirent_block
2015-08-13 18:05:19 +00:00
get_dir_entry procname export
with fst_parms
with dp
2015-08-16 20:10:30 +00:00
with data
2015-08-13 18:05:19 +00:00
2015-08-15 13:33:16 +00:00
;~DebugSetTrace #1
2015-08-13 18:05:19 +00:00
2015-08-14 19:43:38 +00:00
jsr init_vcr
2015-08-26 20:51:02 +00:00
jsr init_fcr
;brk $ea
2015-08-13 18:05:19 +00:00
; check for read-access
ldy #fcr.access
lda [<my_fcr],y
and #read_access
bne access_ok
lda #invalid_access
sec
rtl
access_ok
; is it a dir?
ldy #fcr.disk_inode.mode
lda [my_fcr],y
and #S_IFMT
cmp #S_IFDIR
beq dir
lda #bad_store_type
sec
rtl
dir
jsr init
2015-08-14 20:41:45 +00:00
jsr base_displace
2015-08-13 18:05:19 +00:00
bcc @ok
rtl
@ok
2015-08-14 15:45:41 +00:00
; if data.dirent.inode is valid, load the inode
; (if not valid, this was a base/displace of 0 to return
; the dirent count. field info will be returned from the
; directory inode)
2015-08-14 20:41:45 +00:00
2015-08-14 15:45:41 +00:00
lda data.dirent.inode
beq dispatch
2015-08-14 19:43:38 +00:00
; if inode == the directory inode (.) , no need to re-load it.
2015-08-14 19:28:16 +00:00
cmp inode
beq dispatch
sta inode
jsr load_inode
2015-08-14 20:41:45 +00:00
bcc dispatch
exit
rtl
2015-08-14 19:28:16 +00:00
2015-08-14 15:45:41 +00:00
dispatch
lda <call_class
beq class0
class1
lda [param_blk_ptr] ; pcount
dec a
asl a ; x 2
asl a ; x 4
tax
dispatch get_dir_entry_dcb_1
2015-08-15 13:33:16 +00:00
2015-08-26 13:09:23 +00:00
;~DebugHexDump param_blk_ptr, #DirEntryRecGS.__sizeof
2015-08-15 13:33:16 +00:00
2015-08-14 15:45:41 +00:00
lda tool_error
2015-08-21 21:32:33 +00:00
cmp #1
2015-08-14 15:45:41 +00:00
rtl
class0
ldx #get_dir_entry_dcb_0_size-4
dispatch get_dir_entry_dcb_0
lda tool_error
2015-08-21 21:32:33 +00:00
cmp #1
2015-08-14 15:45:41 +00:00
rtl
2015-08-13 18:05:19 +00:00
2015-08-14 15:45:41 +00:00
get_dir_entry_dcb_0
dc.w $00, do_ignore ; refnum
dc.w $02, do_flags
dc.w $04, do_ignore ; base
dc.w $06, do_ignore ; displacement
dc.w $08, do_name_buffer_0 ;
dc.w $0c, do_entry_num
dc.w $0e, do_file_type
dc.w $10, do_eof
dc.w $14, do_blocks
2015-08-14 20:41:45 +00:00
dc.w $18, do_create_date_time
dc.w $20, do_mod_date_time
2015-08-14 15:45:41 +00:00
dc.w $28, do_access
dc.w $2a, do_aux_type
2015-08-14 20:41:45 +00:00
dc.w $2e, do_file_sys_id
2015-08-14 15:45:41 +00:00
get_dir_entry_dcb_0_size equ *-get_dir_entry_dcb_0
get_dir_entry_dcb_1
;dc.w $00, do_ignore ; pCount
dc.w $02, do_ignore ; refnum
dc.w $04, do_flags
dc.w $06, do_ignore ; base
dc.w $08, do_ignore ; displacement
dc.w $0a, do_name_buffer_1 ;
dc.w $0e, do_entry_num
dc.w $10, do_file_type
dc.w $12, do_eof
dc.w $16, do_blocks
dc.w $1a, do_create_date_time
dc.w $22, do_mod_date_time
dc.w $2a, do_access
dc.w $2c, do_aux_type
2015-08-14 20:41:45 +00:00
dc.w $30, do_file_sys_id
2015-08-14 15:45:41 +00:00
dc.w $32, do_option_list
dc.w $36, do_r_eof
dc.w $3a, do_r_blocks
2015-08-13 18:05:19 +00:00
endp
2015-08-26 20:51:02 +00:00
init procname
2015-08-13 18:05:19 +00:00
2015-08-16 20:10:30 +00:00
with fst_parms,dp,data
2015-08-13 18:05:19 +00:00
; must be set up before hand.
;lda device
;sta dev_parms.dev_num
2015-08-13 18:05:19 +00:00
2015-08-14 15:45:41 +00:00
; directory entry (and inode lookup) should be cached.
lda #in_cache
sta dev_parms.dev_cache_pr
2015-08-26 15:58:17 +00:00
; should probably read half-blocks...
2015-08-13 18:05:19 +00:00
lda #1024
2015-08-26 15:58:17 +00:00
;sta dev_parms.dev_blk_size
2015-08-14 20:41:45 +00:00
sta dev_parms.dev_req_cnt
2015-08-13 18:05:19 +00:00
2015-08-14 19:43:38 +00:00
;stz dirent_offset
;stz dirent_entry
;stz dirent_zone
ldy #fcr.dirent_zone
lda [my_fcr],y
sta dirent_zone
ldy #fcr.dirent_offset
lda [my_fcr],y
sta dirent_offset
ldy #fcr.dirent_entry
lda [my_fcr],y
sta dirent_entry
2015-08-14 15:45:41 +00:00
stz data.dirent.inode
stz data.dirent.name
2015-08-14 20:41:45 +00:00
lda #v1_dirent.__sizeof
2015-08-13 18:05:19 +00:00
sta dirent_size
2015-08-14 19:28:16 +00:00
lda disk_inode.size
sta size
lda disk_inode.size+2
sta size+2
2015-08-13 18:05:19 +00:00
; / 2
2015-08-14 19:28:16 +00:00
lsr size+2
ror size
2015-08-13 18:05:19 +00:00
; / 4
2015-08-14 19:28:16 +00:00
lsr size+2
ror size
2015-08-13 18:05:19 +00:00
; / 8
2015-08-14 19:28:16 +00:00
lsr size+2
ror size
2015-08-13 18:05:19 +00:00
; / 16
2015-08-14 19:28:16 +00:00
lsr size+2
ror size
2015-08-13 18:05:19 +00:00
2015-08-26 13:09:23 +00:00
;~DebugHexDump <my_vcr, #vcr.__sizeof
2015-08-15 13:33:16 +00:00
ldy #vcr.super.magic
2015-08-14 19:43:38 +00:00
lda [my_vcr],y
2015-08-13 18:05:19 +00:00
cmp #v1L.MAGIC
bne minix
; this is
linux
; linux dirents are twice as big.
asl dirent_size
; / 32
2015-08-14 19:28:16 +00:00
lsr size+2
ror size
2015-08-13 18:05:19 +00:00
minix
rts
endp
2015-08-26 20:51:02 +00:00
base_displace procname
2015-08-13 18:05:19 +00:00
with fst_parms, dp
2015-08-16 20:10:30 +00:00
with data
2015-08-13 18:05:19 +00:00
2015-08-14 19:43:38 +00:00
; offset is $04 for class 0, $06 for class 1
2015-08-13 18:05:19 +00:00
lda #$04
clc
adc <call_class
tay
lda [param_blk_ptr],y ; base
cmp #3
bcs perr
asl a
tax
iny
iny
lda [param_blk_ptr],y ; displacement
sta displacement
jmp (base_table,x)
perr
lda #parm_range_err
sec
rts
base_table
dc.w absolute, forward, backward
absolute
; absolute with a displacement of 0 -> return total count.
;
cmp #0
beq @count
2015-08-14 19:43:38 +00:00
jmp find_absolute_dirent
2015-08-13 18:05:19 +00:00
@count
jmp count_entries
forward
2015-08-14 20:41:45 +00:00
jmp find_next_dirent
2015-08-13 18:05:19 +00:00
;
backward
; backward 0 ? == forward 0
cmp #0
beq forward
eor #$ffff
sec ; inc / clc
2015-08-14 19:43:38 +00:00
adc dirent_entry
2015-08-13 18:05:19 +00:00
sta displacement
2015-08-14 19:43:38 +00:00
jmp find_absolute_dirent
2015-08-13 18:05:19 +00:00
endp
2015-08-26 20:51:02 +00:00
count_entries procname
2015-08-13 18:05:19 +00:00
; count the number of entries.
with fst_parms
2015-08-16 20:10:30 +00:00
with dp, data
2015-08-13 18:05:19 +00:00
; read each block and count the entries.
; only handles direct blocks. so there.
; disk inode has been copied to the dp.
2015-08-14 19:43:38 +00:00
stz dirent_entry
2015-08-13 18:05:19 +00:00
ldx #0
zone_loop
2015-08-16 20:10:30 +00:00
stx dirent_zone
2015-08-14 20:41:45 +00:00
lda disk_inode.zone,x
2015-08-16 20:10:30 +00:00
bne @ok ; directory should not be sparse!
; sparse!
jsr sparse_dirent_block
bcs done
bra next
2015-08-13 18:05:19 +00:00
2015-08-16 20:10:30 +00:00
@ok
2015-08-13 18:05:19 +00:00
jsr read_data_block
bcs exit
2015-08-15 13:33:16 +00:00
; ~DebugHexDump <io_buffer, #1024
2015-08-13 18:05:19 +00:00
jsr count_dirent_block
2015-08-14 19:43:38 +00:00
lda size
2015-08-13 18:05:19 +00:00
beq done
2015-08-14 19:43:38 +00:00
next
2015-08-16 20:10:30 +00:00
ldx dirent_zone
2015-08-14 19:28:16 +00:00
inx
inx
2015-08-14 19:43:38 +00:00
cpx #v1.NR_DZONES*2
2015-08-13 18:05:19 +00:00
bcs done
bra zone_loop
;
; minix has 16-byte dirents.
; linux has 32-byte dirents.
done
; also reset the displacement to 0.
lda #0
2015-08-14 20:41:45 +00:00
ldy #fcr.dirent_entry
2015-08-13 18:05:19 +00:00
sta [my_fcr],y
ldy #fcr.dirent_zone
sta [my_fcr],y
ldy #fcr.dirent_offset
sta [my_fcr],y
clc
exit
rts
endp
2015-08-26 20:51:02 +00:00
count_dirent_block procname
2015-08-13 18:05:19 +00:00
; 16-byte dirent entries -- 64 per block.
2015-08-16 20:10:30 +00:00
with dp, data
2015-08-13 18:05:19 +00:00
ldy #0
loop
lda [io_buffer],y
beq next
2015-08-14 15:45:41 +00:00
inc dirent_entry
2015-08-13 18:05:19 +00:00
next
; not 32-bit safe.
2015-08-14 19:43:38 +00:00
dec size
2015-08-13 18:05:19 +00:00
beq done
tya
clc
adc dirent_size
tay
cmp #1024
bcc loop
done
rts
endp
2015-08-14 15:45:41 +00:00
2015-08-14 19:43:38 +00:00
2015-08-26 20:51:02 +00:00
strlen procname
2015-08-14 15:45:41 +00:00
; strlen the dirent.
; will be 0-terminated unless if < dirent size.
2015-08-14 20:41:45 +00:00
2015-08-14 15:45:41 +00:00
lda data.dirent.inode
beq exit
ldx #2
short m
loop
lda data.dirent,x
beq zero
inx
2015-08-16 20:10:30 +00:00
cpx data.dirent_size
2015-08-14 15:45:41 +00:00
bcc loop
zero
long m
txa
dec a ; -2 for dirent.inode
dec a
exit
rts
endp
2015-08-16 20:10:30 +00:00
2015-08-26 20:51:02 +00:00
do_flags procname
2015-08-14 20:41:45 +00:00
with fst_parms
2015-08-14 15:45:41 +00:00
; $8000 for extended file, 0 for everything else.
lda #0
sta [param_blk_ptr],y
rts
endp
2015-08-26 20:51:02 +00:00
do_entry_num procname
2015-08-14 20:41:45 +00:00
with fst_parms
2015-08-16 20:10:30 +00:00
with data
2015-08-14 20:41:45 +00:00
2015-08-14 15:45:41 +00:00
lda dirent_entry
sta [param_blk_ptr],y
rts
endp
2015-08-26 20:51:02 +00:00
do_name_buffer_0 procname
2015-08-14 20:41:45 +00:00
with fst_parms
with dp
2015-08-14 15:45:41 +00:00
lda [param_blk_ptr],y
sta ptr
iny
iny
lda [param_blk_ptr],y
sta ptr+2
ora ptr
beq exit
copy_it
phx
jsr strlen
; strlen handles inode = 0
tax
tay
short m
sta [ptr]
; no need to dey since there is a length byte.
dex
bmi @done
@loop
lda data.dirent.name,x
sta [ptr],y
dey
dex
bpl @loop
@done
long m
plx
exit
rts
endp
2015-08-26 20:51:02 +00:00
do_name_buffer_1 procname
2015-08-14 20:41:45 +00:00
with fst_parms
with dp
2015-08-14 15:45:41 +00:00
lda [param_blk_ptr],y
sta ptr
iny
iny
lda [param_blk_ptr],y
sta ptr+2
ora ptr
beq exit
phx
jsr strlen
pha ; save
lda [ptr] ; total output buffer size
sec
sbc #4
2015-08-15 01:43:06 +00:00
bmi error
2015-08-14 15:45:41 +00:00
cmp 1,s
bcs ok
2015-08-15 01:43:06 +00:00
error_store_size
2015-08-14 15:45:41 +00:00
ldy #2
sta [ptr],y
2015-08-15 01:43:06 +00:00
error
2015-08-14 15:45:41 +00:00
pla
2015-08-15 01:43:06 +00:00
lda #buff_too_small
2015-08-14 15:45:41 +00:00
sta tool_error
plx
rts
2015-08-15 01:43:06 +00:00
2015-08-14 15:45:41 +00:00
ok
pla ; strlen
ldy #2
sta [ptr],y
tax
tay
iny ; skip gs/os string overhead
iny
iny
short m
dex
bmi @done
@loop
lda data.dirent.name,x
sta [ptr],y
dey
dex
bpl @loop
@done
long m
plx
exit
rts
endp
2015-08-14 19:28:16 +00:00
;
;
; new code....
; here's our big insight
; 1. base 1, displacement xxx is equivalent to stepping forward xxx entries.
; 2. base 2, displacement xxx is equivalent to base 0, displacement fcr.dirent_entry - displacement
; 2a. if displacement is 0, is equivalent to stepping forward 0 entries.
; 3. base 0, displacement xxx is equivalent to base 1 displacement xxx when fcr.dirent_entry = 0
;
; therefore the only special case is dirent_entry == 0 (since displacement 1 -> read entry 0)
;
;
2015-08-26 20:51:02 +00:00
find_absolute_dirent procname
2015-08-16 20:10:30 +00:00
with data
2015-08-14 19:28:16 +00:00
; if displacement > dirent_entry, we can re-use that info.
lda displacement
cmp dirent_entry
bcc no
sec
sbc dirent_entry
sta displacement
bra find_next_dirent
no
stz dirent_entry
stz dirent_zone
stz dirent_offset
bra find_next_dirent
endp
find_next_dirent proc
2015-08-16 20:10:30 +00:00
with data, dp
2015-08-14 19:28:16 +00:00
lda dirent_entry
2015-08-15 14:28:26 +00:00
beq @first
dec dirent_entry
bra @ok
@first
2015-08-14 19:28:16 +00:00
dec displacement
bmi eod
@ok
2015-08-16 20:10:30 +00:00
; make sure dir not empty (should never happen...)
lda size
beq eod
2015-08-14 19:28:16 +00:00
ldx dirent_zone
loop
2015-08-14 20:41:45 +00:00
lda disk_inode.zone,x
2015-08-14 19:28:16 +00:00
beq sparse ; should never happen...
phx ; save
jsr read_data_block
plx
bcs exit
2015-08-15 13:33:16 +00:00
; phx
; phy
; pha
; ~DebugHexDump <io_buffer, #1024
; pla
; ply
; plx
2015-08-14 19:28:16 +00:00
jsr find_dirent_block
2015-08-16 20:10:30 +00:00
bcc next
; a = 0 if it was found!
cmp #1
rts
2015-08-14 19:28:16 +00:00
next
inx
inx
stz dirent_offset
cpx #v1.NR_DZONES*2
bcs exit
bra loop
sparse
2015-08-16 20:10:30 +00:00
jsr sparse_dirent_block
bcs eod
2015-08-14 19:28:16 +00:00
bra next
found_it
2015-08-15 13:33:16 +00:00
;stx dirent_zone
;sty dirent_offset
2015-08-14 19:28:16 +00:00
clc
exit
rts
2015-08-14 20:41:45 +00:00
eod
lda #end_of_dir
sec
rts
2015-08-14 19:28:16 +00:00
endp
2015-08-14 20:41:45 +00:00
;
; returns:
2015-08-16 20:10:30 +00:00
; carry set on error or if found.
; a = 0 if found, or error.
2015-08-14 20:41:45 +00:00
;
; inputs y = dirent offset
2015-08-26 20:51:02 +00:00
find_dirent_block procname
2015-08-16 20:10:30 +00:00
with dp, data
2015-08-14 20:41:45 +00:00
ldy dirent_offset
loop
lda [io_buffer],y
beq next
inc dirent_entry
dec displacement
bmi found_it
next
dec size
beq eod
tya
clc
adc dirent_size
tay
cmp #1024
bcc loop
; not found ...
lda #0
clc
rts
2015-08-14 19:28:16 +00:00
eod
lda #end_of_dir
sec
rts
2015-08-14 20:41:45 +00:00
found_it
; we found our entry!!!
; copy it over.
stx dirent_zone
sty dirent_offset
; dirent_entry updated above.
ldx #0
@loop
lda [io_buffer],y
sta data.dirent,x
iny
iny
inx
inx
cpx dirent_size
bcc @loop
; update the fcr.
lda dirent_entry
ldy #fcr.dirent_entry
sta [my_fcr],y
lda dirent_offset
ldy #fcr.dirent_offset
sta [my_fcr],y
lda dirent_zone
ldy #fcr.dirent_zone
sta [my_fcr],y
lda #0
2015-08-16 20:10:30 +00:00
sec ; found!
rts
endp
2015-08-17 01:49:02 +00:00
strcmp procname
2015-08-16 20:10:30 +00:00
; clobbers ptr
; check if the name is even possible...
2015-08-26 13:09:44 +00:00
with dp, data
2015-08-16 20:10:30 +00:00
import target:GSString32
2015-08-26 13:09:23 +00:00
;~DebugSetTrace #1
2015-08-16 20:10:30 +00:00
iny ; skip inode
iny
tya
clc
adc io_buffer
sta ptr
2015-08-17 01:49:02 +00:00
lda #0
2015-08-16 20:10:30 +00:00
adc io_buffer+2
sta ptr+2
ldy #0
2015-08-26 13:09:44 +00:00
ldx target.length
2015-08-16 20:10:30 +00:00
short m
; y = offset
; x = length of target string.
loop
lda [ptr],y
beq eos
cmp target.text,y
bne no8
2015-08-26 13:09:44 +00:00
iny
2015-08-16 20:10:30 +00:00
dex
2015-08-26 13:09:44 +00:00
bpl loop
eos
2015-08-16 20:10:30 +00:00
long m
2015-08-26 13:09:44 +00:00
; if y == target.length, this is a match.
cpy target.length
bne no
2015-08-16 20:10:30 +00:00
yes
2015-08-26 13:09:23 +00:00
;~DebugSetTrace #0
2015-08-14 20:41:45 +00:00
clc
2015-08-16 20:10:30 +00:00
rts
no8
long m
no
2015-08-26 13:09:23 +00:00
;~DebugSetTrace #0
2015-08-16 20:10:30 +00:00
sec
2015-08-14 20:41:45 +00:00
rts
endp
2015-08-26 20:51:02 +00:00
sparse_dirent_block procname
2015-08-16 20:10:30 +00:00
; (not 32-bit safe)
; decrease size by the appropriate amount
; for a sparse block.
; (should probably never happen!)
; sets c if size <= 0
with data
lda dirent_size
cmp #32 ; linux? 32 dirents per block
beq @ok
lda #64 ; minix? 64 dirents per block
@ok
eor #$ffff
sec
adc size
sta size
bmi eod
beq eod
clc
rts
eod
sec
rts
endp
2015-08-17 01:18:56 +00:00
find_entry_by_name procname export
2015-08-16 20:10:30 +00:00
; scan the directory and search by name...
with dp
with data
2015-08-17 01:49:02 +00:00
import target:GSString32
2015-08-16 20:10:30 +00:00
jsr init
lda size
beq fnf
bmi fnf
2015-08-17 01:49:02 +00:00
; make sure the name is valid.
ldx target.length
beq fnf
; if dirent_size < target.length, it can't be found.
; should do this sooner.
lda data.dirent_size
dec a
dec a
cmp target.length
bcc fnf
2015-08-16 20:10:30 +00:00
ldx #0
2015-08-17 01:18:56 +00:00
zone_loop
2015-08-16 20:10:30 +00:00
; x = dirent_zone
stx dirent_zone
2015-08-17 01:18:56 +00:00
lda disk_inode.zone,x
2015-08-16 20:10:30 +00:00
beq sparse
jsr read_data_block
bcc @ok
rts
@ok
ldy #0
dirent_loop
; y = dirent offset
sty dirent_offset
lda [io_buffer],y
beq next_dirent
sta inode ; optomistic...
jsr strcmp
bcs next_dirent
; found it!
lda #0
clc
rts
next_dirent
dec size
beq fnf
lda dirent_offset
clc
adc dirent_size
tay
cmp #1024
bcs next_zone
bra dirent_loop
next_zone
ldx dirent_zone
inx
inx
cpx #v1.NR_DZONES*2
2015-08-17 01:18:56 +00:00
bcc zone_loop
2015-08-16 20:10:30 +00:00
; all out of zones -> not found!
fnf
stz inode
lda #file_not_found
sec
rts
sparse
; sparse block. jump to the next zone, decrement size appropriately.
jsr sparse_dirent_block
bcs fnf
bra next_zone
endp
2015-08-14 20:41:45 +00:00
2015-08-13 18:05:19 +00:00
end