mirror of
https://github.com/ksherlock/minix.fst.git
synced 2024-12-27 06:29:15 +00:00
improved disk id for use with name-based paths.
This commit is contained in:
parent
2f76570457
commit
eb2935c7a6
@ -17,6 +17,8 @@
|
|||||||
entry path_to_inode
|
entry path_to_inode
|
||||||
entry load_inode
|
entry load_inode
|
||||||
entry find_file
|
entry find_file
|
||||||
|
entry volume_by_name
|
||||||
|
entry vstrcmp
|
||||||
|
|
||||||
import id_disk
|
import id_disk
|
||||||
import device_read
|
import device_read
|
||||||
@ -220,6 +222,25 @@ ok
|
|||||||
; uses path1, dev1, span1.
|
; uses path1, dev1, span1.
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; After GS/OS expands prefixes, there are two path types
|
||||||
|
; 1. device root (.dev:path)
|
||||||
|
; 2. path root (:volume:path)
|
||||||
|
;
|
||||||
|
; in the case of 1, verify the device is a minix volume, create
|
||||||
|
; the vcr (if necessary) and proceed from there.
|
||||||
|
;
|
||||||
|
; in the case of 2, gs/os will check for a vcr with the volume
|
||||||
|
; name and, if found, give the FST a first shot at handling it.
|
||||||
|
; if the FST doesn't claim it, or no vcr is found, all FSTs will
|
||||||
|
; be called until it's claimed.
|
||||||
|
;
|
||||||
|
; fst_parms.vcr will not be populated even if GS/OS previously found
|
||||||
|
; it.
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
path_to_inode procname export
|
path_to_inode procname export
|
||||||
with dp,fst_parms
|
with dp,fst_parms
|
||||||
|
|
||||||
@ -256,6 +277,8 @@ exit
|
|||||||
|
|
||||||
check_path
|
check_path
|
||||||
|
|
||||||
|
; linux allows a 30-char name. minix is 14 char
|
||||||
|
; will check for minix later.
|
||||||
lda span
|
lda span
|
||||||
cmp #v1L.DIRSIZE+1
|
cmp #v1L.DIRSIZE+1
|
||||||
bcs bps
|
bcs bps
|
||||||
@ -288,10 +311,11 @@ absolute
|
|||||||
; 2. call find_vcr to find it by name
|
; 2. call find_vcr to find it by name
|
||||||
; 3. if that fails, scan all devices.
|
; 3. if that fails, scan all devices.
|
||||||
|
|
||||||
lda #1
|
|
||||||
sta inode
|
jsr volume_by_name
|
||||||
clc
|
_rts.cs
|
||||||
rts
|
|
||||||
|
brl find_file
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -398,8 +422,173 @@ done
|
|||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
endp
|
||||||
|
|
||||||
|
volume_by_name procname
|
||||||
|
;
|
||||||
|
; extract the volume name from path1_ptr and find (or create) a vcr.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
with dp
|
||||||
|
with data
|
||||||
|
|
||||||
|
path equ fst_parms.path1_ptr
|
||||||
|
|
||||||
|
import target:GSString32
|
||||||
|
|
||||||
|
; copy volume name to target.
|
||||||
|
; leading : is NOT included.
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
ldy #3
|
||||||
|
short m
|
||||||
|
@loop
|
||||||
|
lda [path],y
|
||||||
|
beq done
|
||||||
|
cmp #':'
|
||||||
|
bne @next
|
||||||
|
iny
|
||||||
|
sty path_offset
|
||||||
|
bra done
|
||||||
|
@next
|
||||||
|
sta target.text,x
|
||||||
|
inx
|
||||||
|
iny
|
||||||
|
bra @loop
|
||||||
|
done
|
||||||
|
|
||||||
|
long m
|
||||||
|
stx target.length
|
||||||
|
|
||||||
|
ldx #target
|
||||||
|
ldy #^target
|
||||||
|
lda #0
|
||||||
|
jsl find_vcr
|
||||||
|
bcs no_vcr
|
||||||
|
|
||||||
|
; store it for later...
|
||||||
|
stx ptr
|
||||||
|
sty ptr+2
|
||||||
|
|
||||||
|
jsl deref
|
||||||
|
stx my_vcr
|
||||||
|
sty my_vcr+2
|
||||||
|
|
||||||
|
ldy #vcr.fst_id
|
||||||
|
lda [my_vcr],y
|
||||||
|
cmp #fst_id
|
||||||
|
bne no_vcr
|
||||||
|
|
||||||
|
; there is a vcr and it's a minix vcr.
|
||||||
|
; 1. should do a case-sensitive name check.
|
||||||
|
; 2. if the volume is marked as swapped, we need to
|
||||||
|
; re-scan devices.
|
||||||
|
; 3. if the volume is not swapped, we need to verify
|
||||||
|
; the disk didn't switch on us.
|
||||||
|
|
||||||
|
ldy #vcr.status
|
||||||
|
lda [my_vcr],y
|
||||||
|
and #vcr_swapped
|
||||||
|
bne no_vcr
|
||||||
|
|
||||||
|
ldy #vcr.device
|
||||||
|
lda [my_vcr],y
|
||||||
|
jsr id_disk
|
||||||
|
bcs no_vcr
|
||||||
|
|
||||||
|
;
|
||||||
|
; I suppose reading a block could alloc memory and invalidate the vcr...
|
||||||
|
;
|
||||||
|
|
||||||
|
ldx ptr
|
||||||
|
ldy ptr+2
|
||||||
|
|
||||||
|
jsl deref
|
||||||
|
stx my_vcr
|
||||||
|
sty my_vcr+2
|
||||||
|
|
||||||
|
; check the volume name here...
|
||||||
|
|
||||||
|
jsr vstrcmp
|
||||||
|
bcs no_vcr
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
no_vcr
|
||||||
|
; no vcr on file... scan all devices to find the volume.
|
||||||
|
stz my_vcr
|
||||||
|
stz my_vcr+2
|
||||||
|
|
||||||
|
stz device
|
||||||
|
|
||||||
|
@loop
|
||||||
|
lda device
|
||||||
|
inc a
|
||||||
|
sta device
|
||||||
|
jsr id_disk
|
||||||
|
|
||||||
|
bcs @error_check
|
||||||
|
|
||||||
|
; check if the volume name matches...
|
||||||
|
jsr vstrcmp
|
||||||
|
bcs @loop
|
||||||
|
|
||||||
|
; match! hooray!
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
@error_check
|
||||||
|
cmp #dup_volume
|
||||||
|
beq @error
|
||||||
|
cmp #invalid_dev_num
|
||||||
|
bne @loop
|
||||||
|
lda #vol_not_found
|
||||||
|
@error
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
endp
|
||||||
|
|
||||||
|
vstrcmp procname
|
||||||
|
|
||||||
|
import target:GSString32
|
||||||
|
|
||||||
|
; case-sensitive strcmp for volume name
|
||||||
|
with dp
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
ldy #2
|
||||||
|
|
||||||
|
ldy #vcr.vname.length
|
||||||
|
lda [my_vcr],y
|
||||||
|
beq fail
|
||||||
|
cmp target.length
|
||||||
|
bne fail
|
||||||
|
|
||||||
|
tax
|
||||||
|
dex
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc #vcr.vname.text-1
|
||||||
|
tya
|
||||||
|
|
||||||
|
short m
|
||||||
|
@loop
|
||||||
|
lda [my_vcr],y
|
||||||
|
cmp target.text,x
|
||||||
|
bne fail8
|
||||||
|
dey
|
||||||
|
dex
|
||||||
|
bpl @loop
|
||||||
|
long m
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
fail8
|
||||||
|
long m
|
||||||
|
fail
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
40
id_disk.aii
40
id_disk.aii
@ -44,6 +44,8 @@ id_disk procname export
|
|||||||
with dev_parms
|
with dev_parms
|
||||||
with v1
|
with v1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sta dev_num
|
sta dev_num
|
||||||
|
|
||||||
lda #512
|
lda #512
|
||||||
@ -60,9 +62,17 @@ id_disk procname export
|
|||||||
jsr check_super
|
jsr check_super
|
||||||
bcs exit
|
bcs exit
|
||||||
|
|
||||||
|
;
|
||||||
|
; if my_vcr is set, we only need to verify this is a minix disk,
|
||||||
|
; not building a new vcr.
|
||||||
|
lda dp.my_vcr
|
||||||
|
ora dp.my_vcr+2
|
||||||
|
bne done
|
||||||
|
|
||||||
jsr build_vcr
|
jsr build_vcr
|
||||||
bcs exit
|
bcs exit
|
||||||
|
|
||||||
|
done
|
||||||
; error priority $8000?
|
; error priority $8000?
|
||||||
lda #0
|
lda #0
|
||||||
clc
|
clc
|
||||||
@ -96,6 +106,13 @@ check_log_zone
|
|||||||
lda [dev_buff],y
|
lda [dev_buff],y
|
||||||
bne no
|
bne no
|
||||||
|
|
||||||
|
|
||||||
|
; todo
|
||||||
|
; if my_vcr is valid, check the volume name...
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
yes
|
yes
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
@ -236,8 +253,29 @@ create_vcr
|
|||||||
ldy #vcr.first_inode_block
|
ldy #vcr.first_inode_block
|
||||||
sta [my_vcr],y
|
sta [my_vcr],y
|
||||||
|
|
||||||
|
vname
|
||||||
|
|
||||||
~DebugHexDump <my_vcr,#vcr.__sizeof
|
; also need to copy over the volume name...
|
||||||
|
;ldy #vcr.vname
|
||||||
|
lda default_name
|
||||||
|
;sta [my_vcr],y
|
||||||
|
|
||||||
|
inc a
|
||||||
|
tax
|
||||||
|
clc
|
||||||
|
adc #vcr.vname
|
||||||
|
tay
|
||||||
|
short m
|
||||||
|
@loop
|
||||||
|
lda default_name,x
|
||||||
|
sta [my_vcr],y
|
||||||
|
dey
|
||||||
|
dex
|
||||||
|
bpl @loop
|
||||||
|
long m
|
||||||
|
|
||||||
|
|
||||||
|
; ~DebugHexDump <my_vcr,#vcr.__sizeof
|
||||||
|
|
||||||
lda #0
|
lda #0
|
||||||
clc
|
clc
|
||||||
|
67
volume.aii
67
volume.aii
@ -103,7 +103,7 @@ by_name
|
|||||||
|
|
||||||
volume_dcb_0
|
volume_dcb_0
|
||||||
dc.w VolumeRec.deviceName, do_ignore
|
dc.w VolumeRec.deviceName, do_ignore
|
||||||
dc.w VolumeRec.volName, do_vol_name_0
|
dc.w VolumeRec.volName, do_vol_name_1
|
||||||
dc.w VolumeRec.totalBlocks, do_total_blocks
|
dc.w VolumeRec.totalBlocks, do_total_blocks
|
||||||
dc.w VolumeRec.freeBlocks, do_free_blocks
|
dc.w VolumeRec.freeBlocks, do_free_blocks
|
||||||
dc.w VolumeRec.fileSysID, do_file_sys_id
|
dc.w VolumeRec.fileSysID, do_file_sys_id
|
||||||
@ -202,12 +202,14 @@ done
|
|||||||
defaultName str.b ':minix'
|
defaultName str.b ':minix'
|
||||||
endp
|
endp
|
||||||
|
|
||||||
do_vol_name_1 proc
|
do_vol_name_1 procname
|
||||||
|
|
||||||
with fst_parms
|
with fst_parms
|
||||||
with dp
|
with dp
|
||||||
|
|
||||||
;ldy #VolumeRecGS.volName
|
;ldy #VolumeRecGS.volName
|
||||||
|
|
||||||
|
|
||||||
lda [param_blk_ptr],y
|
lda [param_blk_ptr],y
|
||||||
sta ptr
|
sta ptr
|
||||||
iny
|
iny
|
||||||
@ -221,43 +223,66 @@ do_vol_name_1 proc
|
|||||||
sbc #4
|
sbc #4
|
||||||
bmi error
|
bmi error
|
||||||
|
|
||||||
cmp defaultName
|
dec a ; - 1 for leading :
|
||||||
bcc error_store_size
|
ldy #vcr.vname.length
|
||||||
|
cmp [my_vcr],y
|
||||||
|
;bcc error_store_size
|
||||||
|
|
||||||
;ldy #2
|
ldy #vcr.vname.length
|
||||||
lda defaultName
|
lda [my_vcr],y
|
||||||
;sta [ptr],y
|
inc a ; :
|
||||||
|
ldy #2
|
||||||
|
sta [ptr],y
|
||||||
|
|
||||||
inc a ; +1 for length word.
|
bcc error ; still set from cmp.
|
||||||
|
|
||||||
|
|
||||||
|
phx ; save...
|
||||||
|
|
||||||
|
ldy #4
|
||||||
|
short m
|
||||||
|
lda #':'
|
||||||
|
sta [ptr],y
|
||||||
|
long m
|
||||||
|
|
||||||
|
|
||||||
|
; adjust pointer so y offset
|
||||||
|
; matches
|
||||||
|
lda ptr
|
||||||
|
sec
|
||||||
|
sbc #vcr.vname-3 ; -5 for gs/os name overhead and :
|
||||||
|
sta ptr
|
||||||
|
lda ptr+2
|
||||||
|
sbc #0
|
||||||
|
sta ptr+2
|
||||||
|
|
||||||
|
ldy #vcr.vname.length
|
||||||
|
lda [my_vcr],y ; length
|
||||||
|
iny
|
||||||
|
iny
|
||||||
tax
|
tax
|
||||||
|
beq done
|
||||||
inc a ; skip buffer size.
|
|
||||||
inc a
|
|
||||||
tay
|
|
||||||
short m
|
short m
|
||||||
@loop
|
@loop
|
||||||
lda defaultName,x
|
lda [my_vcr],y
|
||||||
sta [ptr],y
|
sta [ptr],y
|
||||||
dey
|
iny
|
||||||
dex
|
dex
|
||||||
bpl @loop
|
bne @loop
|
||||||
|
long m
|
||||||
|
|
||||||
done
|
done
|
||||||
long m
|
plx ; restore
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
error_store_size
|
|
||||||
lda defaultName
|
|
||||||
ldy #2
|
|
||||||
sta [ptr],y
|
|
||||||
error
|
error
|
||||||
lda #buff_too_small
|
lda #buff_too_small
|
||||||
sta tool_error
|
sta tool_error
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
|
|
||||||
defaultName str.w ':minix'
|
;defaultName str.w ':minix'
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user