volume -- suppport prodos 16 call (/ name)

This commit is contained in:
Kelvin Sherlock 2015-08-24 22:05:05 -04:00
parent 2312e6f09c
commit 62726712c6
1 changed files with 96 additions and 68 deletions

View File

@ -17,7 +17,17 @@
import id_disk import id_disk
my_dp record dp.__end
src ds.l 1
dest ds.l 1
length ds.w 1
IF *>=$d4 THEN
AERROR 'dp -- too large.'
ENDIF
endr
import do_file_sys_id import do_file_sys_id
import do_ignore import do_ignore
@ -38,7 +48,7 @@ volume procname export
lda fst_parms.dev1_num lda fst_parms.dev1_num
; if no device, find a volume by name... ; if no device, find a volume by name...
beq by_name beq no_dev
jsr id_disk jsr id_disk
bcc got_it bcc got_it
@ -71,6 +81,21 @@ dup_0
got_it got_it
; init common volume name parameters here...
with my_dp
ldy #vcr.vname.length
lda [my_vcr],y
sta length
lda #vcr.vname.text
clc
adc my_vcr
sta src
lda #0
adc my_vcr+2
sta src+2
endwith
lda <call_class lda <call_class
beq class0 beq class0
@ -96,28 +121,32 @@ exit
rtl rtl
by_name no_dev
lda #unknown_vol lda #unknown_vol
sec sec
rtl rtl
volume_dcb_0 volume_dcb_0
dc.w VolumeRec.deviceName, do_ignore with VolumeRec
dc.w VolumeRec.volName, do_vol_name_1 dc.w deviceName, do_ignore
dc.w VolumeRec.totalBlocks, do_total_blocks dc.w volName, do_vol_name_0
dc.w VolumeRec.freeBlocks, do_free_blocks dc.w totalBlocks, do_total_blocks
dc.w VolumeRec.fileSysID, do_file_sys_id dc.w freeBlocks, do_free_blocks
dc.w fileSysID, do_file_sys_id
endwith
volume_dcb_0_size equ *-volume_dcb_0 volume_dcb_0_size equ *-volume_dcb_0
volume_dcb_1 volume_dcb_1
dc.w VolumeRecGS.devName, do_ignore with VolumeRecGS
dc.w VolumeRecGS.volName, do_vol_name_1 dc.w devName, do_ignore
dc.w VolumeRecGS.totalBlocks, do_total_blocks dc.w volName, do_vol_name_1
dc.w VolumeRecGS.freeBlocks, do_free_blocks dc.w totalBlocks, do_total_blocks
dc.w VolumeRecGS.fileSysID, do_file_sys_id dc.w freeBlocks, do_free_blocks
dc.w VolumeRecGS.blockSize, do_block_size dc.w fileSysID, do_file_sys_id
dc.w VolumeRecGS.characteristics, do_ignore dc.w blockSize, do_block_size
dc.w VolumeRecGS.deviceID, do_ignore dc.w characteristics, do_ignore
dc.w deviceID, do_ignore
endwith
endp endp
@ -172,110 +201,109 @@ do_vol_name_0 proc
; store the volume name (class 0) ; store the volume name (class 0)
with fst_parms with fst_parms
with dp with dp, my_dp
; length and src are valid.
;ldy #VolumeRec.volName
lda [param_blk_ptr],y lda [param_blk_ptr],y
sta ptr sta dest
iny iny
iny iny
lda [param_blk_ptr],y lda [param_blk_ptr],y
sta ptr+2 sta dest+2
; length should be in the range of 1-30.
lda length
inc a
ora #'/'<<8 ; pstring
sta [dest]
lda #2
clc
adc dest
sta dest
lda #0 lda #0
adc dest+2
sta dest+2
ldy length
beq done
dey
short m short m
lda defaultName ; count.
tax
tay
@loop @loop
lda defaultName,x lda [src],y
sta [ptr],y sta [dest],y
dex
dey dey
bpl @loop bpl @loop
done
long m long m
done
clc clc
rts rts
defaultName str.b ':minix'
endp endp
do_vol_name_1 procname do_vol_name_1 procname
with fst_parms with fst_parms
with dp with dp, my_dp
;ldy #VolumeRecGS.volName
lda [param_blk_ptr],y lda [param_blk_ptr],y
sta ptr sta dest
iny iny
iny iny
lda [param_blk_ptr],y lda [param_blk_ptr],y
sta ptr+2 sta dest+2
; check the length. ; check the length.
lda [ptr] lda [dest]
sec sec
sbc #4 sbc #4
bmi error bmi error
dec a ; - 1 for leading : dec a ; - 1 for leading :
ldy #vcr.vname.length cmp length
cmp [my_vcr],y
;bcc error_store_size
ldy #vcr.vname.length lda length
lda [my_vcr],y inc a
inc a ; :
ldy #2 ldy #2
sta [ptr],y sta [dest],y
bcc error ; still set from cmp. ; carry still set from cmp
bcc error
phx ; save...
ldy #4 ldy #4
short m short m
lda #':' lda #':'
sta [ptr],y sta [dest],y
long m long m
lda #5
clc
adc dest
sta dest
lda #0
adc dest+2
sta dest+2
; adjust pointer so y offset ldy length
; 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
beq done beq done
dey
short m short m
@loop @loop
lda [my_vcr],y lda [src],y
sta [ptr],y sta [dest],y
iny dey
dex bpl @loop
bne @loop
long m long m
done done
plx ; restore
clc clc
rts rts
error error
lda #buff_too_small lda #buff_too_small
sta tool_error sta tool_error