mirror of
https://github.com/ksherlock/minix.fst.git
synced 2026-04-26 22:17:50 +00:00
243 lines
2.9 KiB
Plaintext
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
|