Files
minix.fst/find_zone.aii

243 lines
2.9 KiB
Plaintext

string asis
include 'gsos.equ'
include 'minix.equ'
include 'records.equ'
include 'fst.equ'
include 'fst.macros'
include 'M16.Debug'
import disk_inode:v1_inode
entry read_indir
entry read_double_indir
import read_data_block
;
; convert a file block to an absolute block
; blocks 1-6 are stored in the inode.
; blocks 7-519 are stored in the indirect block.
; blocks 520-... are stored in the double indirect block.
;
; input a = file block
; output a = disk block (0 if sparse, carry set on error)
find_zone procname export
; with dev_parms
with dp
stz <zone_path
stz <zone_path+2
stz <zone_path+4
cmp #v1.NR_DZONES
bcc direct
sbc #v1.NR_DZONES
cmp #512
bcc indirect
sbc #512
bra dindirect
; cmp #512*512
; bcc dindirect
; lda #drvr_bad_block
; sec
; rts
direct
asl a
sta <zone_path
tax
lda disk_inode.zone,x
clc
rts
indirect
ldx #v1.NR_DZONES*2
stx <zone_path
asl a
sta <zone_path+2
bra read_indir
; double indirect...
dindirect
ldx #v1.NR_DZONES*2+2
stx <zone_path
; divide by 512... then multiply by 2.
pha
xba
lsr a
and #%01111110
sta <zone_path+2
pla
and #511
asl a
sta <zone_path+4
bra read_double_indir
endp
read_indir proc
with dp
inc dev_parms.dev_cache_pr
ldx io_buffer
stx dev_parms.dev_buff
ldx io_buffer+2
stx dev_parms.dev_buff+2
lda disk_inode.zone+v1.NR_DZONES*2
beq @clc ; sparse
jsr read_data_block ; really only needs to read a 512 byte block...
bcs @rts
ldy zone_path+2
lda [io_buffer],y
@clc clc
@rts dec dev_parms.dev_cache_pr
rts
endp
read_double_indir proc
with dp
inc dev_parms.dev_cache_pr
ldx io_buffer
stx dev_parms.dev_buff
ldx io_buffer+2
stx dev_parms.dev_buff+2
lda disk_inode.zone+v1.NR_DZONES*2+2
beq @clc ; sparse
jsr read_data_block ; really only needs to read a 512 byte block...
bcs @rts
ldy zone_path+2
lda [io_buffer],y
beq @clc ; sparse
jsr read_data_block
bcs @rts
ldy zone_path+4
lda [io_buffer],y
@clc clc
@rts dec dev_parms.dev_cache_pr
rts
next_zone procname export
with dp
;
; zone_path components are pre-multiplied by 2.
;
ldx zone_path
; tax
; cpx #v1.NR_TZONES ; handedl via z9 eof error
; bcs @bad
jmp (@table,x)
@table dc.w z0
dc.w z1
dc.w z2
dc.w z3
dc.w z4
dc.w z5
dc.w z6
dc.w z7
dc.w z8
dc.w z9
; inode
z0
z1
z2
z3
z4
z5
inx
inx
stx zone_path
lda disk_inode.zone,x
clc
rts
; advance from inode to indirect
z6
stz zone_path+2
stz zone_path+4
inx
inx
stx zone_path
brl read_indir
z7
lda zone_path+2
inc a
inc a
cmp #512*2
bcs @next
sta zone_path+2
brl read_indir
@next
inc zone_path
inc zone_path
stz zone_path+2
stz zone_path+4
bra read_double_indir
;
z8
lda zone_path+4
inc a
inc a
cmp #512*2
bcs @next1
sta zone_path+4
brl read_double_indir
@next1
stz zone_path+4
lda zone_path+2
inc a
inc a
cmp #512*2
bcs @next2
sta zone_path+2
brl read_double_indir
@next2
inc zone_path
inc zone_path
z9
lda #end_of_file
sec
rts
endp
end