A2osX/ProDOS.FX/ProDOS.S.XDOS.C.txt

1023 lines
26 KiB
Plaintext
Raw Normal View History

2019-10-16 06:09:13 +00:00
NEW
AUTO 3,1
2019-11-23 15:24:55 +00:00
*--------------------------------------
2020-08-28 10:47:41 +00:00
XDOS.DeallocAX stx bmcnt high address of block.
2019-10-16 06:09:13 +00:00
pha save low address.
ldx vcbptr check that bitmap block address is
2020-05-25 13:58:59 +00:00
lda VCBs+VCB.TBLK+1,x valid given the total # of blocks
2019-10-16 06:09:13 +00:00
cmp bmcnt on the volume.
pla
bcc L3C8C branch if invalid
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
tax
and #$07 bit to be or'd in
tay
lda whichbit,y (shifting takes 7 bytes, but is slower)
sta nofree save bit pattern.
txa low block address.
lsr bmcnt
ror get pointer to byte in block that
lsr bmcnt represents the block address.
ror
lsr bmcnt
ror
sta bmptr save pointer.
lsr bmcnt transfer bit which is page of bitmap
rol half
jsr fndbmap make sure device is correct one.
bcs L3C8B error.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
lda bmacmap current map.
cmp bmcnt is in-core bitmap the correct one ?
beq L3C64 branch if yes.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
jsr upbmap put current map away.
bcs L3C8B error.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
lda bmcnt get map #
ldx vcbptr
2020-05-23 18:45:32 +00:00
2020-09-19 16:48:28 +00:00
sta VCBs+VCB.BMAPIDX,x and make it current.
2019-10-16 06:09:13 +00:00
lda bmadev
jsr gtbmap read it into buffer
bcs L3C8B
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3C64 ldy bmptr index to byte
lsr half
lda nofree (get indiviual bit)
bcc bmbufhi branch if on page 1 of bitmap
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
ora bmbuf+$100,y
sta bmbuf+$100,y
bcs L3C7D always.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
bmbufhi ora bmbuf,y this address + 2 is used as an absolute reference to bmbuf high byte.
sta bmbuf,y
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3C7D lda #$80 mark bitmap as modified
tsb bmastat
2020-09-19 16:48:28 +00:00
2019-10-16 06:09:13 +00:00
inc deblock inc count of blocks deallocated
bne L3C8A
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
inc deblock+1
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3C8A clc
L3C8B rts
2020-05-13 17:00:37 +00:00
2020-05-25 13:58:59 +00:00
L3C8C lda #MLI.E.BADFS bitmap block # impossible.
2019-10-16 06:09:13 +00:00
sec bitmap disk address wrong
rts (maybe data masquerading as indx block)
2019-11-23 15:24:55 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
alc1blk jsr fndbmap get address of bitmap.
bcs L3CB8 error.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3C95 ldy #$00 begin search at start of bitmap block.
sty half which half (page) to search
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3C9A lda bmbuf,y
bne L3CB9 free blocks indicated by 'on' bits
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
iny
bne L3C9A check all in 1st page.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
inc half now search page 2.
inc basval base value = base address / 2048.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CA8 lda bmbuf+$100,y search 2nd half for free block
bne L3CB9
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
iny
bne L3CA8
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
inc basval add 2048 offset for next page.
jsr nxtbmap get next bitmap (if exists) and
bcc L3C95 update vcb. branch if no error.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CB8 rts return error.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CB9 sty bmptr save index pointer to valid bit group.
lda basval prep for block address calculation
sta scrtch+1
tya address of bit pattern.
asl multiply this and basval by 8
rol scrtch+1
asl
rol scrtch+1
asl
rol scrtch+1
tax low address within 7 of actual address
sec
lda half
beq L3CDB branch if allocating from 1st half.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
lda bmbuf+$100,y get pattern from 2nd page.
bcs L3CDE always.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CDB lda bmbuf,y get bit pattern from 1st page.
L3CDE rol find left most 'on' bit
bcs L3CE4 if found.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
inx adjust low address.
bne L3CDE always.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CE4 lsr restore pos'n of all but left most bit.
bcc L3CE4 loop until mark moves into carry.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
stx scrtch save low address.
ldx half which half of bitmap ?
bne L3CF4 if page 2.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
sta bmbuf,y
beq L3CF7 always.
2020-05-13 17:00:37 +00:00
2019-10-16 06:09:13 +00:00
L3CF4 sta bmbuf+$100,y update to show allocated block in use.
2020-05-23 18:45:32 +00:00
2019-10-16 06:09:13 +00:00
L3CF7 lda #$80 indicate map is modified.
tsb bmastat
2020-05-23 18:45:32 +00:00
ldx vcbptr subtract 1 from total free vcb blocks
lda VCBs+VCB.FBLK,x to account for newly allocated block.
bne .7
dec VCBs+VCB.FBLK+1,x
.7 dec VCBs+VCB.FBLK,x
2019-10-16 06:09:13 +00:00
lda scrtch return address in y,a of newly
ldy scrtch+1 allocated block.
2020-05-23 18:45:32 +00:00
clc no errors.
2019-10-16 06:09:13 +00:00
rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
2020-05-25 13:58:59 +00:00
nxtbmap ldx vcbptr inc to next bitmap, but 1st make sure there is another one.
lda VCBs+VCB.TBLK+1,x
2019-10-16 06:09:13 +00:00
lsr
lsr
lsr
lsr
2020-08-28 06:23:27 +00:00
cmp VCBs+VCB.BMAPIDX,x are there more maps ?
2019-10-16 06:09:13 +00:00
beq L3D60 if no more to look at.
2020-05-13 17:00:37 +00:00
2020-08-28 06:23:27 +00:00
inc VCBs+VCB.BMAPIDX,x add 1 to current map
2019-10-16 06:09:13 +00:00
jsr upbmap
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
fndbmap ldy vcbptr
2020-08-28 06:23:27 +00:00
lda VCBs+VCB.DEV,y get device #.
2019-10-16 06:09:13 +00:00
cmp bmadev does this map match this device ?
beq L3D4A yes.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
jsr upbmap otherwise, save other volume's bitmap
bcs L3D5F
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
ldy vcbptr
2020-05-23 18:45:32 +00:00
lda VCBs+VCB.DEV,y
2019-10-16 06:09:13 +00:00
sta bmadev and read in fresh bitmap for this dev.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L3D4A ldy bmastat is it already modified ?
bmi L3D54 yes, return pointer
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
jsr gtbmap otherwise read in fresh bitmap.
bcs L3D5F if error.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L3D54 ldy vcbptr get relative block # of bitmap.
2020-05-23 18:45:32 +00:00
lda VCBs+VCB.BMAPIDX,y
2019-10-16 06:09:13 +00:00
asl 2 pages per block
sta basval
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
clc no errors.
L3D5F rts
2019-11-23 15:24:55 +00:00
L3D60 lda #MLI.E.VOLFULL request can't be filled
2019-10-16 06:09:13 +00:00
sec error
rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
upbmap clc
lda bmastat is current map modified ?
2020-09-19 16:48:28 +00:00
bpl .9 no.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
jsr wrtbmap update device.
2020-09-19 16:48:28 +00:00
bcs .9 if error on writing.
2019-11-23 15:24:55 +00:00
2020-05-13 17:00:37 +00:00
stz bmastat mark bitmap buffer as free
lda #0 MUST EXIT WITH A=0
2020-09-19 16:48:28 +00:00
.9 rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
gtbmap sta bmadev read bitmap specified by dev and vcb.
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
ldy vcbptr get lowest map # with free blocks in it
2020-05-23 18:45:32 +00:00
lda VCBs+VCB.BMAPIDX,y
2019-10-16 06:09:13 +00:00
sta bmacmap associate offset with bitmap ctrl block.
clc add this # to the base address of
2020-07-16 06:18:17 +00:00
adc VCBs+VCB.BMAP,y 1st bitmap and save in bmadadr which
2019-10-16 06:09:13 +00:00
sta bmadadr is address of bitmap to be used.
2020-05-25 13:58:59 +00:00
2020-05-23 18:45:32 +00:00
lda VCBs+VCB.BMAP+1,y
2019-10-16 06:09:13 +00:00
adc #$00
sta bmadadr+1
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
lda #$01 read device command
2020-05-25 13:58:59 +00:00
.HS 2C BIT ABS
wrtbmap lda #$02 write command.
sta A4L
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
lda devnum save current dev #
pha
lda bmadev get bitmap's dev #
sta devnum
lda bmadadr and disk address
sta bloknml
lda bmadadr+1
sta bloknml+1
2020-05-25 13:58:59 +00:00
lda /bmbuf
* lda bmbufhi+2 address of the buffer (low = 0)
jsr XDOS.RWBlock
2019-11-23 15:24:55 +00:00
2020-09-19 16:48:28 +00:00
plx keep A=error code if CS
stx devnum
2019-10-16 06:09:13 +00:00
L3DB6 rts
2020-08-27 15:34:55 +00:00
*--------------------------------------
.DO LOWERCASE=1
XDOS.WriteGBufDir
jsr XDOS.PackGBuf
bra XDOS.WriteGBuf
.FIN
2020-05-25 13:58:59 +00:00
*--------------------------------------
2020-07-16 14:53:35 +00:00
XDOS.ReadGBuf_d_frst
lda d_frst read 1st block of directory into gbuf
ldx d_frst+1
2020-08-27 15:34:55 +00:00
.DO LOWERCASE=1
XDOS.ReadGBufAXDir
jsr XDOS.ReadGBufAX
bcc XDOS.UnpackGBuf
rts
.FIN
2020-05-25 13:58:59 +00:00
XDOS.ReadGBufAX sta bloknml
2019-10-16 06:09:13 +00:00
stx bloknml+1
2020-05-28 21:13:52 +00:00
2020-05-25 13:58:59 +00:00
XDOS.ReadGBuf lda #$01 read command.
2019-12-13 07:09:00 +00:00
.HS 2C BIT ABS
2020-05-28 21:13:52 +00:00
2020-05-25 13:58:59 +00:00
XDOS.WriteGBuf lda #$02 write command
2019-10-16 06:09:13 +00:00
2019-12-13 07:09:00 +00:00
sta A4L pass to device handler.
2019-10-16 06:09:13 +00:00
lda /gbuf general buffer.
2020-05-28 21:13:52 +00:00
2020-09-17 15:29:41 +00:00
XDOS.RWBlock sta buf+1 buffer high.
2019-10-16 06:09:13 +00:00
stz buf buffer low (always on page boundary)
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
stz p8error clear global error code.
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
lda #$FF indicates reg call made to dev handler
sta ioaccess
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
lda devnum transfer dev # for dispatcher to
sta unitnum convert to unit #.
2020-09-17 15:29:41 +00:00
jmp XDOS.DevCall call the driver.
2020-08-27 15:34:55 +00:00
*--------------------------------------
.DO LOWERCASE=1
2021-02-20 10:18:02 +00:00
XDOS.CheckAndUnpackGBuf
lda gbuf+$23
sta h_entln
ldy gbuf+$24
sty h_maxent
cmp #$27
bne .9
cpy #$0D
beq XDOS.UnpackGBuf
.9 lda #MLI.E.NOTPRODOS
sec
rts
2020-08-27 15:34:55 +00:00
XDOS.UnpackGBuf jsr XDOS.Pack.Init
.1 lda (zpt)
and #$0F
beq .6
ldy #$1D MIN_VERSION
lda (zpt),y
bpl .6 no lowercase information
lda (zpt)
and #$0F
tay
.2 cpy #8 CS if MIN_VERSION to use
phy
bcs .3
ldy #$1D MIN_VERSION
lda (zpt),y
ply
and whichbit,y
beq .5
bra .4
.3 ldy #$1C VERSION
lda (zpt),y
ply
and whichbit-8,y
beq .5
.4 lda (zpt),y
eor #$20 to lowercase
sta (zpt),y
.5 dey
bne .2
.6 jsr XDOS.Pack.Next
dex
bne .1
2020-08-28 10:47:41 +00:00
clc make sure CC
2020-08-27 15:34:55 +00:00
rts
*--------------------------------------
2020-09-20 18:35:54 +00:00
*XDOS.PackGBuf.Bitmap .BS 2
XDOS.PackGBuf.Bitmap .EQ sos
*--------------------------------------
2020-08-27 15:34:55 +00:00
XDOS.PackGBuf jsr XDOS.Pack.Init
2020-08-28 06:23:27 +00:00
2020-08-27 15:34:55 +00:00
.1 lda (zpt)
and #$0F
beq .6
stz XDOS.PackGBuf.Bitmap
stz XDOS.PackGBuf.Bitmap+1
tay
.2 lda (zpt),y
2020-08-28 06:23:27 +00:00
cmp #'a'
2020-08-27 15:34:55 +00:00
bcc .5
2020-08-28 06:23:27 +00:00
cmp #'z'+1
2020-08-27 15:34:55 +00:00
bcs .5
eor #$20 to uppercase
sta (zpt),y
cpy #8 CS if MIN_VERSION to use
bcs .3
lda whichbit,y
2020-08-28 06:23:27 +00:00
tsb XDOS.PackGBuf.Bitmap+1
2020-08-27 15:34:55 +00:00
bra .4
.3 lda whichbit-8,y
2020-08-28 06:23:27 +00:00
tsb XDOS.PackGBuf.Bitmap
2020-08-27 15:34:55 +00:00
.4 lda #$80
tsb XDOS.PackGBuf.Bitmap+1
.5 dey
bne .2
ldy #$1C VERSION
lda XDOS.PackGBuf.Bitmap
sta (zpt),y
iny MIN_VERSION
lda XDOS.PackGBuf.Bitmap+1
sta (zpt),y
.6 jsr XDOS.Pack.Next
dex
bne .1
rts
*--------------------------------------
XDOS.Pack.Init lda #4
sta zpt
lda /gbuf
sta zpt+1
ldx h_maxent
2020-09-20 18:35:54 +00:00
* beq * DEBUG : should never happends
2020-08-27 15:34:55 +00:00
rts
*--------------------------------------
XDOS.Pack.Next lda h_entln
clc
adc zpt
sta zpt
bcc .8
inc zpt+1
.8 rts
.FIN
2019-11-20 07:04:00 +00:00
*--------------------------------------
2019-11-23 15:24:55 +00:00
XDOS.GetMark ldx fcbptr index to open fcb.
2020-09-19 16:48:28 +00:00
ldy #$02 index to user's mark parameter.
2019-11-23 15:24:55 +00:00
2020-07-17 15:18:31 +00:00
.1 lda FCBs+FCB.MARK,x transfer current position
2019-10-16 06:09:13 +00:00
sta (A3L),y to user's parameter list
inx
iny
cpy #$05 transfer 3 bytes
bne .1
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
clc
rts
2019-11-23 15:24:55 +00:00
2020-05-25 13:58:59 +00:00
L3DFD lda #MLI.E.BEYEOF invalid position
2019-10-16 06:09:13 +00:00
sec
rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
XDOS.SetMark ldy #$04 index to user's desired position.
2019-10-16 06:09:13 +00:00
ldx fcbptr file's control block index.
inx inc by 2 for index to hi eof
inx
sec indicate comparisons are necessary.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
.1 lda (A3L),y move it to 'tpos'
sta tposll-2,y
bcc .2 branch if mark < eof
2019-11-23 15:24:55 +00:00
2020-07-17 15:18:31 +00:00
cmp FCBs+FCB.EOF,x
2019-10-16 06:09:13 +00:00
bcc .2 branch if mark qualifies.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
bne L3DFD branch if mark > eof (invalid position)
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
dex
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
.2 dey move/compare next lower byte of mark.
tya test for all bytes moved/tested.
eor #$01 preserves carry status.
bne .1 branch if more.
rdposn ldy fcbptr test to see if new position is
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.MARK+1,y within the same (current) data block.
2019-10-16 06:09:13 +00:00
and #$FE
sta scrtch
lda tposlh middle byte of new position
sec
sbc scrtch
sta scrtch
bcc L3E44 branch if < current position.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
cmp #$02 must be within 512 bytes of beginning
bcs L3E44 of current position.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
lda tposhi make sure within the same 64k.
2020-07-17 15:18:31 +00:00
cmp FCBs+FCB.MARK+2,y
2019-10-16 06:09:13 +00:00
bne L3E44 branch if not.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jmp svmark if so, adj fcb, position ptr and return.
2020-05-28 21:13:52 +00:00
2020-07-17 15:18:31 +00:00
L3E44 lda FCBs+FCB.STYPE,y determine file type for positioning.
2019-10-16 06:09:13 +00:00
beq L3E50 0 = invalid file type.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
cmp #$04 tree class file?
bcc L3E59 yes, go position.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jmp dirmark no, test for dir type.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3E50 ldy #$A4 clear illegal filetype entry in fcb
2020-05-28 21:13:52 +00:00
sta FCBs,y
2020-07-17 15:18:31 +00:00
lda #MLI.E.BADREF and report error
2019-10-16 06:09:13 +00:00
sec
rts
2019-12-13 07:09:00 +00:00
2020-07-17 15:18:31 +00:00
L3E59 lda FCBs+FCB.STYPE,y use storage type as # of index levels
2019-10-16 06:09:13 +00:00
sta levels since 1=seed, 2=sapling, 3=tree.
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.F,y
2020-09-17 15:29:41 +00:00
and #FCB.F.DBLKMOD if previous data was modified then
2019-10-16 06:09:13 +00:00
beq L3E6B disk must be updated.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jsr wfcbdat
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
bcs L3ED4 if error.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3E6B ldy fcbptr test to see if current index block
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.MARK+2,y is usable by checking if new
2019-10-16 06:09:13 +00:00
and #$FE position is within 128k of the
sta scrtch beginning of current sapling level
lda tposhi chunk.
sec
sbc scrtch
bcc L3E9D branch if a new index block is needed.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
cmp #$02 is new position within 128k of old ?
bcs L3E9D branch if not.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
ldx levels is it a seed file ?
dex
2020-09-19 16:48:28 +00:00
bne datlevel1 no, use current indexes.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3E89 lda tposlh is new position < 512 ?
lsr
ora tposhi
bne L3EEF no, mark both data and index block as
2020-05-28 21:13:52 +00:00
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.1stBLK,y unallocated. 1st block is only block
2019-10-16 06:09:13 +00:00
sta bloknml and it's data.
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.1stBLK+1,y high block address.
2019-10-16 06:09:13 +00:00
jmp rnewpos go read in block and set statuses.
2020-05-28 21:13:52 +00:00
2020-07-17 15:18:31 +00:00
L3E9D lda FCBs+FCB.F,y check to see if previous index block
and #FCB.F.IBLKMOD was modified.
2019-10-16 06:09:13 +00:00
beq L3EA9 read in over it if current up to date.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jsr wfcbidx go update index on disk (fcb block addr)
bcs L3ED4
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3EA9 ldx levels be sure there is a top index
cpx #$03 before reading it...
beq posindex branch if file is a tree.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
lda tposhi is new position within range of a
lsr sapling file (less than 128k) ?
php save results
lda #$07 (no level is allocated for new pos'n)
plp restore z-flag.
bne L3F18 go mark all as dummy.
2020-05-28 21:13:52 +00:00
2020-09-18 15:06:12 +00:00
jsr XDOS.ClrFCBStatus clr status bits 0,1,2 (index/data/alloc)
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
dex check for seed
beq L3E89 if seed, check for position < 512.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jsr rfcbfst go get only index block.
bcs L3ED4 if error.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
ldy fcbptr save newly loaded index block's address.
lda bloknml
2020-07-17 15:18:31 +00:00
sta FCBs+FCB.IBLK,y
2019-10-16 06:09:13 +00:00
lda bloknml+1
2020-07-17 15:18:31 +00:00
sta FCBs+FCB.IBLK+1,y
2020-09-19 16:48:28 +00:00
datlevel1 bra datlevel branch always
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3ED4 rts
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
posindex jsr XDOS.ClrFCBStatus clr all alloc requirements for previous
2019-10-16 06:09:13 +00:00
jsr rfcbfst position. get highest level index block
bcs L3ED4
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
lda tposhi then test for a sap level index block
lsr
tay
lda (zpt),y
inc zpt+1
cmp (zpt),y (both high and low = 0 if no index exists)
bne saplevel
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
tax are both bytes 0 ?
bne saplevel
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
dec zpt+1
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3EEF lda #$03 show neither index or data block alloc'd
bra L3F18
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
saplevel sta bloknml read in next lower index block.
lda (zpt),y (high address)
sta bloknml+1
dec zpt+1
2020-09-19 16:48:28 +00:00
* jsr rfcbidx read in sapling level
lda #$01 prepare to read index block : read command
sta A4L
ldx #zpt address of current index buffer.
jsr fileio1 go read index block.
bcs L3ED4 error
ldy fcbptr
lda bloknml
sta FCBs+FCB.IBLK,y save block address of this index in fcb
lda bloknml+1
sta FCBs+FCB.IBLK+1,y
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
datlevel lda tposhi get block address of data block
lsr
lda tposlh ( if there is one )
ror
tay
lda (zpt),y data block address low
inc zpt+1
cmp (zpt),y
bne L3F51
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
tax
bne L3F51
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
lda #$01 show data block as never been allocated
dec zpt+1
2020-05-28 21:13:52 +00:00
2020-09-19 16:48:28 +00:00
L3F18 jsr XDOS.SetFCBStatus set status to show what's missing
2019-10-16 06:09:13 +00:00
lsr discard bit that says data block
lsr unallocated because carry indicates if
2020-09-19 16:48:28 +00:00
jsr zipdata index block is invalid and needs to be zeroed.
bcc svmark branch if it doesn't need zeroed
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
jsr zeroindex zero index block in user's i/o buffer
bra svmark
2020-09-18 15:06:12 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
zipdata lda #$00
tay
L3F42 sta (datptr),y zero out data area
iny
bne L3F42
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
inc datptr+1
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3F49 sta (datptr),y
iny
bne L3F49
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
dec datptr+1
rts
2020-09-18 15:06:12 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
L3F51 sta bloknml get data block of new position
lda (zpt),y (high address)
dec zpt+1
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
rnewpos sta bloknml+1
2020-09-18 15:06:12 +00:00
jsr XDOS.ReadFCB.DBLK
2019-10-16 06:09:13 +00:00
bcs L3F86 if error.
2020-05-28 21:13:52 +00:00
2020-09-18 15:06:12 +00:00
jsr XDOS.ClrFCBStatus show whole chain is allocated.
*--------------------------------------
2019-10-16 06:09:13 +00:00
svmark ldy fcbptr update position in fcb
iny
iny
ldx #$02
2020-09-19 16:48:28 +00:00
2020-07-17 15:18:31 +00:00
L3F68 lda FCBs+FCB.MARK,y save old mark in case calling routine
2019-10-16 06:09:13 +00:00
sta oldmark,x fails later.
lda tposll,x
2020-07-17 15:18:31 +00:00
sta FCBs+FCB.MARK,y
2019-10-16 06:09:13 +00:00
dey
dex move 3 byte position marker
bpl L3F68
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
clc set up indirect address to buffer
lda datptr page pointed to by the current
sta sos position marker.
lda tposlh
and #$01
adc datptr+1
sta sos+1
L3F86 rts carry set if error
2020-09-17 15:29:41 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
dirmark cmp #$0D is it a directory ?
beq L3F9C yes...
2019-11-10 18:28:06 +00:00
lda #MLI.E.INCFF no, so compatability problem.
2019-10-16 06:09:13 +00:00
jsr GP.P8errv should not have been opened !!!
L3F9C lda scrtch recover results of previous subtraction.
lsr use difference as counter for how many
sta cntent blocks must be read to get to new pos'n.
2020-09-19 16:48:28 +00:00
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.MARK+1,y test for positive direction
2019-10-16 06:09:13 +00:00
cmp tposlh indicated by carry.
2020-09-19 16:48:28 +00:00
lda FCBs+FCB.MARK+2,y
sbc tposhi
2019-10-16 06:09:13 +00:00
bcc L3FB9 if set, position forward. otherwise,
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3FAB ldy #$00 read directory file in reverse order.
jsr dirpos1 read previous block.
bcs L3FD6 if error.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
inc cntent count up to 128.
bpl L3FAB loop if more blocks to pass over.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
bmi svmark always.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
L3FB9 ldy #$02 position is forward from current.
jsr dirpos1 read next directory block
bcs L3FD6 if error.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
dec cntent
bne L3FB9 loop if position not found in this block
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
beq svmark branch always.
2020-09-19 16:48:28 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
dirpos1 lda (datptr),y get link address of previous or next
sta bloknml directory block.
cmp #$01 test for null byte into carry
iny but first be sure there is a link.
lda (datptr),y get the rest of the link.
bne L3FD8 branch if certain link exists.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
bcs L3FD8 was the low part null as well ?
2019-12-13 07:09:00 +00:00
2019-11-23 15:24:55 +00:00
lda #MLI.E.EOF something is wrong with directory file!
2019-10-16 06:09:13 +00:00
L3FD6 sec error.
rts
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L3FD8 sta bloknml+1
2020-09-18 15:06:12 +00:00
*--------------------------------------
XDOS.ReadFCB.DBLK
lda #$01 read command
2019-10-16 06:09:13 +00:00
sta A4L
2020-09-18 15:06:12 +00:00
2019-10-16 06:09:13 +00:00
ldx #datptr points at address of data buffer.
2020-09-18 15:06:12 +00:00
2019-10-16 06:09:13 +00:00
jsr fileio1 go do file input.
bcs L3FF2 error.
2020-05-28 21:13:52 +00:00
2019-10-16 06:09:13 +00:00
ldy fcbptr
lda bloknml
2020-07-17 15:18:31 +00:00
sta FCBs+FCB.DBLK,y save block # just read in fcb.
2019-10-16 06:09:13 +00:00
lda bloknml+1
2020-07-17 15:18:31 +00:00
sta FCBs+FCB.DBLK+1,y
2019-10-16 06:09:13 +00:00
2020-09-18 15:06:12 +00:00
* clc
L3FF2 rts
*--------------------------------------
2020-09-19 16:48:28 +00:00
*rfcbidx lda #$01 prepare to read index block : read command
* sta A4L
2020-09-18 15:06:12 +00:00
2020-09-19 16:48:28 +00:00
* ldx #zpt address of current index buffer.
2020-09-18 15:06:12 +00:00
2020-09-19 16:48:28 +00:00
* jsr fileio1 go read index block.
* bcs L400C error
2020-05-28 21:13:52 +00:00
2020-09-19 16:48:28 +00:00
* ldy fcbptr
* lda bloknml
* sta FCBs+FCB.IBLK,y save block address of this index in fcb
* lda bloknml+1
* sta FCBs+FCB.IBLK+1,y
2020-07-17 15:18:31 +00:00
2020-09-19 16:48:28 +00:00
** clc
2020-07-17 15:18:31 +00:00
2020-09-19 16:48:28 +00:00
*L400C rts
2020-09-17 15:29:41 +00:00
*--------------------------------------
2020-05-25 13:58:59 +00:00
wfcbfst jsr upbmap update the bitmap and write file's 1st block.
lda #$02 write command
2019-10-16 06:09:13 +00:00
.HS 2C skip next instruction
rfcbfst lda #$01 read command.
2020-05-25 13:58:59 +00:00
2019-10-16 06:09:13 +00:00
pha save the command
2020-09-19 16:48:28 +00:00
lda #FCB.1stBLK
2019-10-16 06:09:13 +00:00
ora fcbptr add offset to fcbptr
tay
pla
2020-09-19 16:48:28 +00:00
ldx #zpt rd block into index portion of file buf
*--------------------------------------
2019-10-16 06:09:13 +00:00
dofileio sta A4L command
2020-09-19 16:48:28 +00:00
2020-07-17 15:18:31 +00:00
lda FCBs,y get disk block address from fcb.
2019-10-16 06:09:13 +00:00
sta bloknml block 0 not legal
2020-09-19 16:48:28 +00:00
bne .1
lda FCBs+1,y high address of disk block
bne .2
2020-05-25 13:58:59 +00:00
2020-09-19 16:48:28 +00:00
lda #$0C Block = $0000, allocation error.
jsr GP.SysDeath doesn't return...
2019-10-16 06:09:13 +00:00
2020-09-19 16:48:28 +00:00
.1 lda FCBs+1,y
.2 sta bloknml+1
*--------------------------------------
2020-09-17 15:29:41 +00:00
fileio1 lda $00,x get memory address of buffer from
2019-10-16 06:09:13 +00:00
sta buf page zero pointed to by x register
lda $01,x
sta buf+1 and pass address to device handler
2020-09-19 16:48:28 +00:00
jsr XDOS.FCBDevIDSelect
2019-10-16 06:09:13 +00:00
lda #$FF also, set to indicate reg call made to
sta ioaccess device handler.
lda devnum transfer device # for dispatcher
sta unitnum to convert to unit #.
stz p8error clear global error code.
2020-09-17 15:29:41 +00:00
jmp XDOS.DevCall call the driver.
*--------------------------------------
2019-10-16 06:09:13 +00:00
wfcbdat ldx #datptr point at memory address with x and
2020-09-19 16:48:28 +00:00
lda #FCB.DBLK disk address with y.
2019-10-16 06:09:13 +00:00
ora fcbptr add offset to fcbptr
tay and put in y.
lda #$02 write data block.
jsr dofileio
bcs L4096 if errors.
2020-09-19 16:48:28 +00:00
2019-10-16 06:09:13 +00:00
lda #$BF mark data status as current.
2020-09-19 16:48:28 +00:00
bra XDOS.ResetFCBStatus
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
wfcbidx jsr upbmap update bitmap.
2020-09-19 16:48:28 +00:00
ldx #zpt point to address of index buffer
lda #FCB.IBLK and block address of that index block.
2019-10-16 06:09:13 +00:00
ora fcbptr
tay
lda #$02
jsr dofileio go write out index block.
bcs L4096 if errors.
2020-07-17 15:18:31 +00:00
2019-10-16 06:09:13 +00:00
lda #$7F mark index status as current.
2020-09-19 16:48:28 +00:00
*--------------------------------------
XDOS.ResetFCBStatus
ldx fcbptr
and FCBs+FCB.F,x
sta FCBs+FCB.F,x
2020-07-17 15:18:31 +00:00
2019-10-16 06:09:13 +00:00
L4096 rts
2019-11-10 18:28:06 +00:00
*--------------------------------------
2020-07-18 14:04:21 +00:00
XDOS.Open jsr XDOS.FindFileOrVol look up the file.
bcs L4096 if not, then error.
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
L40A0 jsr tstopen are any other files writing to this
bcc L40AD same file ? branch if not.
2019-11-10 18:28:06 +00:00
L40A5 lda #MLI.E.OPEN file is busy, shared access not allowed.
2019-11-23 15:24:55 +00:00
.HS 2C
2019-11-10 18:28:06 +00:00
L40A9 lda #MLI.E.UNSUPST file is wrong storage type.
2019-11-23 15:24:55 +00:00
.HS 2C
L40AB lda #MLI.E.FCBFULL fcb full error.
2020-07-18 14:04:21 +00:00
sec
2019-10-16 06:09:13 +00:00
rts
2019-11-10 18:28:06 +00:00
2020-09-18 15:06:12 +00:00
L40AD lda fcbflg if this byte <> 0 then free fcb found
2019-11-23 15:24:55 +00:00
beq L40AB and available for use.
2019-11-10 18:28:06 +00:00
2020-09-18 15:06:12 +00:00
ldx fcbptr get address of 1st free fcb found.
2019-11-10 18:28:06 +00:00
2020-09-18 15:06:12 +00:00
L40B9 ldy #FCB
2019-11-10 18:28:06 +00:00
2020-09-18 15:06:12 +00:00
L40BD stz FCBs,x but clean it first.
inx
dey
bne L40BD
2019-11-10 18:28:06 +00:00
2020-09-18 15:06:12 +00:00
ldy #0
ldx fcbptr
L40CB lda d_dev,y move ownership info.
sta FCBs+FCB.DEVID,x note: this code depends upon the defined
inx order of both the fcb and directory entry buffer.
iny
cpy #6
2019-10-16 06:09:13 +00:00
bne L40CB
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
lda d_stor get storage type and
2020-09-18 15:06:12 +00:00
jsr XDOS.SetFCBSType
2019-10-16 06:09:13 +00:00
tax save in x for later comparison
2020-09-18 15:06:12 +00:00
2019-10-16 06:09:13 +00:00
lda d_attr get file's attributes and use it
and #$03 as a default access request.
cpx #$0D if directory, don't allow write enable.
bne L40EB
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
and #$01 read enabled bit
2019-11-23 15:24:55 +00:00
2020-07-17 15:18:31 +00:00
L40EB sta FCBs+FCB.ACCESS,y
2019-10-16 06:09:13 +00:00
and #$02 check for write enabled request.
beq L40F7 branch for open as read-only
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
lda totent otherwise, be sure no one else is
bne L40A5 reading the same file. branch if busy.
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
L40F7 cpx #$04 is it a tree file type ?
bcc L40FF yes.
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
cpx #$0D is it a directory type ?
bne L40A9 if not, wrong storage type.
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
L40FF ldx #$06 move address of 1st block of file, end
2019-11-10 18:28:06 +00:00
2019-10-16 06:09:13 +00:00
L4101 sta bloknml+1 of file and current usage count.
lda fcbptr
ora ofcbtbl,x this is done via a translation table
tay between directory info and fcb.
lda d_frst,x
2020-05-28 21:13:52 +00:00
sta FCBs,y
2019-10-16 06:09:13 +00:00
dex
bpl L4101 last loop stores hi address of 1st block
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
sta bloknml and this is the low one.
2020-09-18 15:06:12 +00:00
ldx fcbptr
2019-10-16 06:09:13 +00:00
lda cntent this was set up by 'tstopen'.
2020-09-18 15:06:12 +00:00
sta FCBs,x claim fcb for this file.
2019-10-16 06:09:13 +00:00
jsr alcbuffr go allocate buffer in memory tables.
bcs L4147 if errors.
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
ldx fcbptr
jsr XDOS.GetFCBBufX rtn addr of bufs in data & index ptrs.
2019-10-16 06:09:13 +00:00
lda flevel mark level at which
2020-09-18 15:06:12 +00:00
sta FCBs+FCB.FLEVEL,x file was opened.
lda FCBs+FCB.STYPE,x file must be positioned at beginning.
2019-10-16 06:09:13 +00:00
cmp #$04 is it a tree file ?
bcs L415E no, assume a directory.
2020-09-18 06:03:33 +00:00
2019-10-16 06:09:13 +00:00
lda #$FF fool the position routine into giving
2020-09-18 15:06:12 +00:00
sta FCBs+FCB.MARK+2,x a valid position with preloaded data,
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
ldy #$02 etc. set desired position to 0.
lda #$00
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L413C sta tposll,y
dey
bpl L413C
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
jsr rdposn let tree position routine do the rest.
bcc L4163 if successful.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L4147 pha save error code.
2020-09-17 15:29:41 +00:00
ldx fcbptr free buffer space.
2020-09-18 15:06:12 +00:00
stz FCBs,x necessary to release fcb also.
2020-09-17 15:29:41 +00:00
lda FCBs+FCB.BUFID,x
2019-10-16 06:09:13 +00:00
beq L4156 if no bufnum, ok because never alloc'd.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
jsr relbuffr go release buffer.
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
L4156 pla error code.
2019-10-16 06:09:13 +00:00
sec
rts
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
L415E jsr XDOS.ReadFCB.DBLK read in 1st block of directory file.
2019-10-16 06:09:13 +00:00
bcs L4147 return error after freeing buffer & fcb.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L4163 ldx vcbptr index to vcb.
2020-07-16 06:18:17 +00:00
inc VCBs+VCB.OFCNT,x add 1 to # of files currently open
2020-05-23 18:45:32 +00:00
2020-09-18 15:06:12 +00:00
ldx fcbptr index to fcb.
2020-09-19 16:48:28 +00:00
lda FCBs+FCB.ID,x return ref # to user.
2019-10-16 06:09:13 +00:00
ldy #$05
sta (A3L),y
2020-07-16 06:18:17 +00:00
* clc open is successful
2019-10-16 06:09:13 +00:00
rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
2020-09-19 16:48:28 +00:00
tstopen stz cntent returns the ref # of a free fcb.
stz totent flag to indicate file already open.
stz fcbflg flag indicates a free fcb is available.
lda #$00
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L4188 tay index to next fcb.
ldx fcbflg test for free fcb found.
bne L4191 if already found.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
inc cntent
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
L4191 lda FCBs,y is this fcb in use ?
2019-10-16 06:09:13 +00:00
bne L41A3 yes.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
txa if not, should we claim it ?
bne L41C1 branch if free fcb already found.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
sty fcbptr save index to new free fcb.
lda #$FF set fcb flag to indicate
sta fcbflg free fcb found.
bne L41C1 branch always to test next fcb.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L41A3 tya add offset to index to ownership info
ora #$06
tay and put it back in y.
ldx #$06 index to directory entry owner info.
2019-11-23 15:24:55 +00:00
2020-09-18 15:06:12 +00:00
L41A9 lda FCBs,y all bytes must match to say that it's
2019-10-16 06:09:13 +00:00
cmp d_dev-1,x the same file again.
bne L41C1 if not, then next fcb.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
dey index to next lower bytes.
dex
bne L41A9 loop to check all owner info.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
inc totent file is already open, now see
2020-07-17 15:18:31 +00:00
lda FCBs+FCB.ACCESS,y if it's already opened for write. and #$02 if so report file busy (with carry set).
2019-10-16 06:09:13 +00:00
and #$02 if so report file busy (with carry set).
beq L41C1 branch if this file is read access only.
2020-09-18 15:06:12 +00:00
2019-10-16 06:09:13 +00:00
sec
rts
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
L41C1 tya calc position of next fcb.
and #$E0 first strip any possible index offsets.
clc
2020-07-17 06:04:08 +00:00
adc #FCB inc to next fcb.
bcc L4188 branch if more to compare.
2019-11-23 15:24:55 +00:00
2019-10-16 06:09:13 +00:00
clc report no conflicts.
rts
2019-11-23 15:24:55 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
MAN
2020-05-23 18:45:32 +00:00
SAVE usr/src/prodos.fx/prodos.s.xdos.c
LOAD usr/src/prodos.fx/prodos.s
2019-10-16 06:09:13 +00:00
ASM