Kernel 0.94

This commit is contained in:
Rémy GIBERT 2020-09-18 17:06:12 +02:00
parent 960e7769ea
commit 570daa7f23
6 changed files with 188 additions and 173 deletions

View File

@ -251,9 +251,10 @@ sysdeath1 tax death error code.
adc #$06 inc to alpha a-f
.3 ldy #deathmsg.LEN
ora #$80
sta $400,y
lda #' '
lda #" "
.4 iny
sta $400,y
@ -284,7 +285,7 @@ XDOS.bfmgr lda XDOS.CmdFlags,x translate into command address.
nopath asl cmdtemp test for refnum processing
bcc nopreref
jsr findfcb set pointers to fcb and vcb of file
jsr XDOS.GetFCB set pointers to fcb and vcb of file
bcs errorsys
nopreref asl cmdtemp check for necessity of time stamp
@ -504,11 +505,11 @@ H33B3 inx
gotprfx clc no error
rts
*--------------------------------------
findfcb ldy #$01 index to ref#
XDOS.GetFCB ldy #$01 index to ref#
lda (A3L),y is it a valid file# ?
beq badref must not be 0.
cmp #$09 must be 1 to 8 only.
cmp #FCB.MAX+1
bcs badref
pha
@ -518,35 +519,41 @@ findfcb ldy #$01 index to ref#
ror
ror multiply by 32.
sta fcbptr used as an index to fcb
tay
tax
pla restore ref# in acc
cmp FCBs,y
cmp FCBs+FCB.ID,x
bne errnoref
*--------------------------------------
XDOS.GetFCBBufX lda FCBs+FCB.BUFID,x get page address of file buffer.
tay index into global buffer table.
lda buftbl-1,y
sta bufaddrh
fndfcbuf lda FCBs+FCB.BUFID,y get page address of file buffer.
jsr getbufadr get file's address into bufaddrl,h
ldx bufaddrh (y=fcbptr preserved)
beq fcbdead fcb corrupted
stx datptr+1 save ptr to data area of buffer
inx
inx index block always 2 pages after data
stx zpt+1
sta datptr+1 save ptr to data area of buffer
inc
inc index block always 2 pages after data
sta zpt+1
lda FCBs+FCB.DEVID,y also set up device #
sta devnum
lda bufaddrl
lda buftbl-2,y ???? ALWAYS 0
sta bufaddrl
sta datptr index and data buffers always on
sta zpt page boundaries.
lda FCBs+FCB.DEVID,x also set up device #
sta devnum
lda #VCB0
fndfvol tax search for associated vcb
lda VCBs+VCB.DEV,x
cmp FCBs+FCB.DEVID,y is this vcb the same device?
fndfvol tay search for associated vcb
lda VCBs+VCB.DEV,y
cmp FCBs+FCB.DEVID,x is this vcb the same device?
beq tstvopen if it is, make sure volume is active.
nxtfvol txa adjust index to next vcb.
nxtfvol tya adjust index to next vcb.
clc
adc #VCB
bcc fndfvol loop until volume found.
@ -555,16 +562,17 @@ nxtfvol txa adjust index to next vcb.
.HS 2C BIT ABS
fcbdead lda #$0B fcb error so
jsr sysdeath kill the system.
tstvopen lda VCBs,x make sure this vcb is open.
tstvopen lda VCBs,y make sure this vcb is open.
beq nxtfvol branch if it is not active.
stx vcbptr save ptr to good vcb.
clc no error
rts
errnoref lda #$00 put a zero into this fcb to
sta FCBs,y show free fcb.
sty vcbptr save ptr to good vcb.
clc no error
rts Y = VCBPtr, X = FCBPtr
errnoref stz FCBs,x
badref lda #MLI.E.BADREF requested refnum is
sec illegal (out of range)

View File

@ -529,7 +529,7 @@ L3EA9 ldx levels be sure there is a top index
plp restore z-flag.
bne L3F18 go mark all as dummy.
jsr clrstats clr status bits 0,1,2 (index/data/alloc)
jsr XDOS.ClrFCBStatus clr status bits 0,1,2 (index/data/alloc)
dex check for seed
beq L3E89 if seed, check for position < 512.
@ -546,7 +546,7 @@ L3EA9 ldx levels be sure there is a top index
L3ED4 rts
posindex jsr clrstats clr all alloc requirements for previous
posindex jsr XDOS.ClrFCBStatus clr all alloc requirements for previous
jsr rfcbfst position. get highest level index block
bcs L3ED4
@ -599,7 +599,7 @@ L3F18 ldy fcbptr set status to show what's missing
jsr zeroindex zero index block in user's i/o buffer
bra svmark
*--------------------------------------
zeroindex lda #$00
tay
L3F30 sta (zpt),y zero out the index half of the user's
@ -614,7 +614,7 @@ L3F37 sta (zpt),y
dec zpt+1 restore proper address
rts
*--------------------------------------
zipdata lda #$00
tay
L3F42 sta (datptr),y zero out data area
@ -629,17 +629,17 @@ L3F49 sta (datptr),y
dec datptr+1
rts
*--------------------------------------
L3F51 sta bloknml get data block of new position
lda (zpt),y (high address)
dec zpt+1
rnewpos sta bloknml+1
jsr rfcbdat
jsr XDOS.ReadFCB.DBLK
bcs L3F86 if error.
jsr clrstats show whole chain is allocated.
jsr XDOS.ClrFCBStatus show whole chain is allocated.
*--------------------------------------
svmark ldy fcbptr update position in fcb
iny
iny
@ -661,12 +661,6 @@ L3F68 lda FCBs+FCB.MARK,y save old mark in case calling routine
sta sos+1
L3F86 rts carry set if error
*--------------------------------------
clrstats ldy fcbptr clear allocation states for data block
lda FCBs+FCB.F,y and both levels of indexes/
and #$F8
sta FCBs+FCB.F,y indicates that either they exist now
rts or unnecessary for current position.
*--------------------------------------
dirmark cmp #$0D is it a directory ?
beq L3F9C yes...
@ -712,12 +706,13 @@ L3FD6 sec error.
rts
L3FD8 sta bloknml+1
* read file's data block
rfcbdat lda #$01 read command
*--------------------------------------
XDOS.ReadFCB.DBLK
lda #$01 read command
sta A4L
ldx #datptr points at address of data buffer.
jsr fileio1 go do file input.
bcs L3FF2 error.
@ -726,11 +721,16 @@ rfcbdat lda #$01 read command
sta FCBs+FCB.DBLK,y save block # just read in fcb.
lda bloknml+1
sta FCBs+FCB.DBLK+1,y
L3FF2 rts
* clc
L3FF2 rts
*--------------------------------------
rfcbidx lda #$01 prepare to read index block : read command
sta A4L
ldx #$48 address of current index buffer.
ldx #zpt address of current index buffer.
jsr fileio1 go read index block.
bcs L400C error
@ -826,37 +826,33 @@ L40AB lda #MLI.E.FCBFULL fcb full error.
sec
rts
L40AD ldy fcbptr get address of 1st free fcb found.
lda fcbflg if this byte <> 0 then free fcb found
L40AD lda fcbflg if this byte <> 0 then free fcb found
beq L40AB and available for use.
L40B9 ldx #$1F assign fcb,
ldx fcbptr get address of 1st free fcb found.
lda #0
L40B9 ldy #FCB
L40BD sta FCBs,y but clean it first.
L40BD stz FCBs,x but clean it first.
inx
dey
bne L40BD
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
dex
bpl L40BD
lda #$06 start claiming it by moving in file info
tax using x as source index
ora fcbptr and y as destination (fcb).
tay
L40CB lda d_dev-1,x move ownership info.
sta FCBs,y note: this code depends upon the defined
dey order of both the fcb and directory
dex entry buffer.
cpy #6
bne L40CB
lda d_stor get storage type and
lsr strip off file name length
lsr by dividing by 16.
lsr
lsr
jsr XDOS.SetFCBSType
tax save in x for later comparison
sta FCBs+FCB.STYPE,y and in fcb for future access.
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.
@ -889,21 +885,23 @@ L4101 sta bloknml+1 of file and current usage count.
bpl L4101 last loop stores hi address of 1st block
sta bloknml and this is the low one.
ldy fcbptr
ldx fcbptr
lda cntent this was set up by 'tstopen'.
sta FCBs,y claim fcb for this file.
sta FCBs,x claim fcb for this file.
jsr alcbuffr go allocate buffer in memory tables.
bcs L4147 if errors.
jsr fndfcbuf rtn addr of bufs in data & index ptrs.
ldx fcbptr
jsr XDOS.GetFCBBufX rtn addr of bufs in data & index ptrs.
lda flevel mark level at which
sta FCBs+FCB.FLEVEL,y file was opened.
lda FCBs+FCB.STYPE,y file must be positioned at beginning.
sta FCBs+FCB.FLEVEL,x file was opened.
lda FCBs+FCB.STYPE,x file must be positioned at beginning.
cmp #$04 is it a tree file ?
bcs L415E no, assume a directory.
lda #$FF fool the position routine into giving
sta FCBs+FCB.MARK+2,y a valid position with preloaded data,
sta FCBs+FCB.MARK+2,x a valid position with preloaded data,
ldy #$02 etc. set desired position to 0.
lda #$00
@ -918,28 +916,24 @@ L413C sta tposll,y
L4147 pha save error code.
ldx fcbptr free buffer space.
stz FCBs,x necessary to release fcb also.
lda FCBs+FCB.BUFID,x
beq L4156 if no bufnum, ok because never alloc'd.
jsr relbuffr go release buffer.
ldx fcbptr
L4156 stz FCBs,x necessary to release fcb also.
pla error code.
L4156 pla error code.
sec
rts
L415E jsr rfcbdat read in 1st block of directory file.
L415E jsr XDOS.ReadFCB.DBLK read in 1st block of directory file.
bcs L4147 return error after freeing buffer & fcb.
L4163 ldx vcbptr index to vcb.
inc VCBs+VCB.OFCNT,x add 1 to # of files currently open
* sec and indicate that this volume has at
* ror VCBs+VCB.OF,x least 1 file active.
ldy fcbptr index to fcb.
lda FCBs,y return ref # to user.
ldx fcbptr index to fcb.
lda FCBs,x return ref # to user.
ldy #$05
sta (A3L),y
* clc open is successful
@ -956,7 +950,7 @@ L4188 tay index to next fcb.
inc cntent
L4191 lda FCBs,y is this fcb in use ?
L4191 lda FCBs,y is this fcb in use ?
bne L41A3 yes.
txa if not, should we claim it ?
@ -972,7 +966,7 @@ L41A3 tya add offset to index to ownership info
tay and put it back in y.
ldx #$06 index to directory entry owner info.
L41A9 lda FCBs,y all bytes must match to say that it's
L41A9 lda FCBs,y all bytes must match to say that it's
cmp d_dev-1,x the same file again.
bne L41C1 if not, then next fcb.
@ -984,6 +978,7 @@ L41A9 lda FCBs,y all bytes must match to say that it's
lda FCBs+FCB.ACCESS,y if it's already opened for write. and #$02 if so report file busy (with carry set).
and #$02 if so report file busy (with carry set).
beq L41C1 branch if this file is read access only.
sec
rts

View File

@ -41,7 +41,7 @@ L4210 jsr valdbuf validate user's data buffer range.
cmp #$04 and find out if it's a tree or other.
bcc L421F branch if a tree file
jmp dread otherwise assume it's a directory.
jmp XDOS.ReadDir otherwise assume it's a directory.
L421F jsr rdposn set up data pointer.
bcs L4202 errors.
@ -56,7 +56,7 @@ L421F jsr rdposn set up data pointer.
beq L421F
sta cmdtemp save bulk block count.
jsr gfcbstat make sure current data area doesn't
jsr XDOS.GetFCBStatus make sure current data area doesn't
and #$40 need writing before resetting ptr to
bne L421F read into user's area. branch if data
@ -251,17 +251,16 @@ fxdatptr lda datptr put current user buffer address back to normal
sta usrbuf
lda datptr+1
sta usrbuf+1 bank pair byte should be moved also.
ldy fcbptr restore buffer address
jmp fndfcbuf
* read directory file
dread jsr rdposn
ldx fcbptr restore buffer address
jmp XDOS.GetFCBBufX
*--------------------------------------
XDOS.ReadDir jsr rdposn
bcs L43B8 pass back any errors.
jsr preprw prepare for transfer.
jsr readpart move data to user's buffer.
bvc dread repeat until request is satisfied.
bvc XDOS.ReadDir repeat until request is satisfied.
jsr rwdone update fcb as to new position.
bcc L43B6 branch if done with no errors.
@ -412,7 +411,7 @@ L4472 jsr mvdbufr move the user's buffer ptr to bfm zero
L4479 jsr rdposn
bcs L44A2
jsr gfcbstat
jsr XDOS.GetFCBStatus
and #$07
beq L44E9
@ -427,7 +426,7 @@ L4487 iny indexes and data block ?
jsr tstfrblk
bcs L44A2 pass back any errors.
jsr gfcbstat now get more specific.
jsr XDOS.GetFCBStatus now get more specific.
and #$04 are we lacking a tree top ?
beq L44AC no, test for lack of sapling level index
@ -441,7 +440,7 @@ L44A2 pha save error.
sec
rts
L44AC jsr gfcbstat get status byte again.
L44AC jsr XDOS.GetFCBStatus get status byte again.
and #$02 do we need a sapling level index block ?
beq L44B8 no, assume it's just a data block needed
@ -451,10 +450,11 @@ L44AC jsr gfcbstat get status byte again.
L44B8 jsr alcwblk go allocate for data block.
bcs L44A2
jsr gfcbstat clear allocation required bits in status
ora #$80 but first indicate index block is dirty.
and #$F8
sta FCBs+FCB.F,y
jsr XDOS.ClrFCBStatus clear allocation required bits in status
lda #FCB.F.IBLKMOD indicate index block is dirty.
jsr XDOS.SetFCBStatus
lda tposhi calculate position within index block.
lsr
lda tposlh
@ -467,6 +467,7 @@ L44B8 jsr alcwblk go allocate for data block.
dec zpt+1 restore pointer to lower page of index
lda scrtch block. get low block address.
sta (zpt),y store low address.
ldy fcbptr update fcb to indicate that this block
sta FCBs+FCB.DBLK,y is allocated.
txa get high address again.
@ -646,11 +647,11 @@ alcwblk jsr alc1blk
.9 rts
*--------------------------------------
tstwprot jsr gfcbstat check for 'never been modified' condition
tstwprot jsr XDOS.GetFCBStatus check for 'never been modified' condition
and #$F0
bne tstwprot.8 ordinary rts if known write ok.
lda FCBs+FCB.DEVID,y get file's dev #.
lda FCBs+FCB.DEVID,x get file's dev #.
sta devnum get current status of block device.
twrprot1 sta unitnum make the device status call

View File

@ -9,12 +9,12 @@ XDOS.Close ldy #$01 close all ?
* lda #$00 start at the beginning.
L4654 sta fcbptr save current low byte of pointer.
tay get the level at which the file
lda FCBs+FCB.FLEVEL,y was opened.
tax get the level at which the file
lda FCBs+FCB.FLEVEL,x was opened.
cmp flevel if file's level is < global level
bcc L4675 then don't close.
lda FCBs,y is this reference file open ?
lda FCBs+FCB.ID,x is this reference file open ?
beq L4675 no, try next.
jsr flush2 clean it out...
@ -39,8 +39,8 @@ L4675 lda fcbptr inc pointer to next fcb
L4683 jsr flush1 flush file 1st (including updating
bcs L46B6 bitmap). branch if errors.
close2 ldy fcbptr
lda FCBs+FCB.BUFID,y release file buffer
close2 ldx fcbptr
lda FCBs+FCB.BUFID,x release file buffer
jsr relbuffr
bcs L46B6
@ -67,8 +67,8 @@ XDOS.Flush ldy #$01 flush all ?
* lda #$00 start at the beginning.
L46C3 sta fcbptr save current low byte of pointer.
tay index to ref #.
lda FCBs,y is this reference file open ?
tax index to ref #.
lda FCBs,x is this reference file open ?
beq L46D1 no, try next.
jsr flush2 clean it out...
@ -85,51 +85,53 @@ L46D9 clc
sec report error now
L46E0 rts
flush2 jsr fndfcbuf must set up vcb & buffer locations 1st.
*--------------------------------------
flush2 jsr XDOS.GetFCBBufX must set up vcb & buffer locations 1st.
bcc L46F1 branch if no error.
L46E6 jmp glberr error so check for close or flush all.
flush1 stz cferr for normal refnum flush, clear global error.
jsr findfcb setup pointer to fcb user references.
jsr XDOS.GetFCB setup pointer to fcb user references.
bcs L46E6 return any errors.
L46F1 lda FCBs+FCB.ACCESS,y test to see if file is modified.
L46F1 lda FCBs+FCB.ACCESS,x test to see if file is modified.
and #$02 is it write enabled ?
beq L46D9 branch if 'read only'
lda FCBs+FCB.DIRTY,y has eof been modified ?
lda FCBs+FCB.DIRTY,x has eof been modified ?
bmi L4704 if yes.
jsr gfcbstat has data been modified ?
jsr XDOS.GetFCBStatus has data been modified ?
and #$70 (was written to while it's been open?)
beq L46D9 if not.
L4704 jsr gfcbstat
L4704 jsr XDOS.GetFCBStatus
and #$40 does current data buffer need to be
beq L4710 written ? branch if not.
jsr wfcbdat if so, go write it.
bcs L46E6 if error.
L4710 jsr gfcbstat check to see if the index block (tree
L4710 jsr XDOS.GetFCBStatus check to see if the index block (tree
and #$80 files only) needs to be written.
beq L471C branch if not.
jsr wfcbidx
bcs L46E6 return any errors.
L471C lda #$06 prepare to update directory
tax
ora fcbptr
tay
L4723 lda FCBs,y note: this code depends on the defined
sta d_dev-1,x order of the file control block and the
dey temporary directory area in 'work space'
dex
bne L4723
L471C ldx fcbptr
lda FCBs+FCB.DEVID,x
sta devnum A = d_dev
ldy #0
sta devnum
L4723 lda FCBs+FCB.DEVID,x note: this code depends on the defined
sta d_dev,y order of the file control block and the
inx temporary directory area in 'work space'
iny
cpy #6
bne L4723
lda d_head read the directory header for this file
ldx d_head+1
@ -159,26 +161,27 @@ L4755 jsr entcalc set up pointer to entry.
jsr moventry move entry to temp entry buffer in
ldy fcbptr 'work space'. update 'blocks used' count
lda FCBs+FCB.UBLK,y
ldx fcbptr 'work space'. update 'blocks used' count
lda FCBs+FCB.UBLK,x
sta d_usage
lda FCBs+FCB.UBLK+1,y
lda FCBs+FCB.UBLK+1,x
sta d_usage+1
ldx #$00 and move in end of file mark whether
ldy #0 and move in end of file mark whether
L476C lda FCBs+FCB.EOF,y needed or not.
sta d_eof,x
inx
cpx #$03 move all 3 bytes
L476C lda FCBs+FCB.EOF,x needed or not.
sta d_eof,y
iny
cpy #$03 move all 3 bytes
beq L4780
lda FCBs+FCB.1stBLK,y also move in the address of the file's
sta d_filid,x first block since it might have changed
iny since the file first opened.
lda FCBs+FCB.1stBLK,x also move in the address of the file's
sta d_filid,y first block since it might have changed
inx since the file first opened.
bne L476C branch always.
L4780 lda FCBs+FCB.STYPE-2,y the last thing to update is storage
L4780 ldx fcbptr
lda FCBs+FCB.STYPE,x the last thing to update is storage
asl type (y=fcbptr+2). shift into high
asl nibble.
asl
@ -219,14 +222,27 @@ glberr ldy #$01
L47C1 pla
rts
gfcbstat ldy fcbptr index to fcb.
lda FCBs+FCB.F,y return status byte.
*--------------------------------------
XDOS.SetFCBSType
lsr
lsr
lsr
lsr
ldy fcbptr and save it in fcb.
sta FCBs+FCB.STYPE,y
rts
*--------------------------------------
XDOS.ClrFCBStatus
ldy fcbptr clear allocation states for data block
lda FCBs+FCB.F,y and both levels of indexes/
and #$F8
sta FCBs+FCB.F,y indicates that either they exist now
rts or unnecessary for current position.
*--------------------------------------
XDOS.GetFCBStatus
ldx fcbptr index to fcb.
lda FCBs+FCB.F,x return status byte.
rts
L47CA lda #MLI.E.LOCKED access error
sec
L47CD rts
*--------------------------------------
XDOS.SetFCBStatus
ldx fcbptr
@ -234,6 +250,10 @@ XDOS.SetFCBStatus
sta FCBs+FCB.F,x
rts
*--------------------------------------
L47CA lda #MLI.E.LOCKED access error
sec
L47CD rts
*--------------------------------------
XDOS.SetEOF jsr gfcbstyp can only move end of tree, sapling or seed.
cmp #$04 tree type ?
bcs L47CA if not then access error
@ -386,13 +406,9 @@ L48C2 lda firstbl,x
bne L48C2 without disturbing carry.
lda stortyp get possibly modified storage type
lsr
lsr
lsr
lsr
ldy fcbptr and save it in fcb.
sta FCBs+FCB.STYPE,y
jsr clrstats make it look as though position has
jsr XDOS.SetFCBSType
jsr XDOS.ClrFCBStatus make it look as though position has
jsr dvcbrev nothing allocated, update total blocks
ldy fcbptr in fcb and correct position.
iny

View File

@ -493,17 +493,13 @@ L4DFE dex set proper bits to 1
L4E1E lda #MLI.E.BADBUF buffer is in use or not legal
sec
rts
getbufadr tax index into global buffer table.
*--------------------------------------
relbuffr tax index into global buffer table.
lda buftbl-2,x
sta bufaddrl
lda buftbl-1,x
sta bufaddrh
rts
relbuffr jsr getbufadr preserve buffer address in 'bufaddr'
tay returns high buffer address in acc.
beq L4E54 branch if unallocated buffer space.
beq relbuffr.8 branch if unallocated buffer space.
stz buftbl-1,x take address out of buffer list.
stz buftbl-2,x (x was set up by getbufadr)
@ -514,15 +510,15 @@ freebuf ldx bufaddrh get hi buffer address
inx
inx
L4E43 dex drop to next lower page.
.1 dex drop to next lower page.
jsr cmembit get bit and position to memtable of
eor #$FF this page. invert mask.
and MEMTABL,y mark address as free space.
sta MEMTABL,y
cpx bufaddrh all pages freed ?
bne L4E43 no.
bne .1 no.
L4E54 clc no error.
relbuffr.8 clc no error.
rts
*--------------------------------------
* calculate memory allocation bit position.
@ -605,7 +601,7 @@ L4EB8 lda (usrbuf),y move all 4 pages of the buffer to
inc usrbuf+1
dex
bpl L4EB8
cmembit.CLCRTS
XDOS.SetBuf.CLCRTS
clc no errors
L4EC7 rts
*--------------------------------------
@ -617,9 +613,9 @@ XDOS.IsValidChar
XDOS.IsValidFirstChar
.DO ENHFILENAME=1
cmp #'.'
beq cmembit.CLCRTS
beq XDOS.SetBuf.CLCRTS
cmp #'_'
beq cmembit.CLCRTS
beq XDOS.SetBuf.CLCRTS
.FIN
cmp #'A'
bcc XDOS.IsValidFirstChar.SEC
@ -817,7 +813,7 @@ whichbit .HS 8040201008040201
ofcbtbl .HS 0C0D1819151617
inftabl .HS 1E101F2080939421
.HS 22232418191A1B
deathmsg .AS "SYS ERR-$0"
deathmsg .AS -"SYS ERR-$0"
deathmsg.LEN .EQ *-deathmsg
*--------------------------------------
XDOS.DATA .DUMMY

View File

@ -132,14 +132,13 @@ pathbuf .EQ $D700
XDOS.ClockDrv .EQ $D742
prefixbuf .EQ $D742+125
*--------------------------------------
FCB.MAX .EQ 8
FCBs .EQ $D800
FCB.ID .EQ 0
FCB.DEVID .EQ 1
FCB.DEVID .EQ 1 d_dev -> d_dev+5
FCB.DIRHBLK .EQ 2 2 bytes
FCB.DIREBLK .EQ 4 2 bytes
FCB.DIRENUM .EQ 6
FCB.STYPE .EQ 7
FCB.F .EQ 8
FCB.F.STMOD .EQ %00001000