NEW AUTO 3,1 *-------------------------------------- XDOS.Close ldy #$01 close all ? lda (ZP.A3L),y bne XDOS.CloseOne no, just one of them. sta cferr clear global close error. * lda #$00 start at the beginning. .1 sta XDOS.FCBPtr save current low byte of pointer. tax get the level at which the file lda XDOS.FCBs+FCB.FLEVEL,x was opened. cmp GP.FLEVEL if file's level is < global level bcc .2 then don't close. lda XDOS.FCBs+FCB.ID,x is this reference file open ? beq .2 no, try next. jsr flush2 clean it out... bcs L46B6 return flush errors. jsr close2 update fcb & vcb ldy #$01 lda (ZP.A3L),y beq .2 no error if close all. bcs L46B6 close error. .2 lda XDOS.FCBPtr inc pointer to next fcb clc adc #FCB bcc .1 branch if within same page. lda cferr on final close report logged errors. beq L46B4 branch if errors. rts (carry already set). *-------------------------------------- XDOS.CloseOne jsr XDOS.FlushOne flush file 1st (including updating bitmap) * bcs L46B6 branch if errors. bcc close2 php pha jsr close2 pla plp rts close2 ldx XDOS.FCBPtr lda XDOS.FCBs+FCB.BUFID,x release file buffer jsr relbuffr bcs L46B6 jsr XDOS.FCBDevIDSelect stz XDOS.FCBs,x free fcb too jsr XDOS.FindVCBForDevNum get vcb pointer. dec XDOS.VCBs+VCB.OFCNT,x indicate one less file open. L46B4 clc rts L46B6 bcs L46E6 don't report close all error now. *-------------------------------------- XDOS.Flush ldy #$01 flush all ? lda (ZP.A3L),y bne XDOS.FlushOne no, just one of them. sta cferr clear global flush error. * lda #$00 start at the beginning. L46C3 sta XDOS.FCBPtr save current low byte of pointer. tax index to ref #. lda XDOS.FCBs,x is this reference file open ? beq L46D1 no, try next. jsr flush2 clean it out... bcs L46E6 return anty errors. L46D1 lda XDOS.FCBPtr inc pointer to next fcb. clc adc #FCB bcc L46C3 branch if within same page L46D9 clc lda cferr on last flush, beq L46E0 branch if no logged errors. sec report error now L46E0 rts *-------------------------------------- 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. XDOS.FlushOne stz cferr for normal refnum flush, clear global error. jsr XDOS.GetFCB setup pointer to fcb user references. bcs L46E6 return any errors. L46F1 lda XDOS.FCBs+FCB.ACCESS,x test to see if file is modified. and #$02 is it write enabled ? beq L46D9 branch if 'read only' lda XDOS.FCBs+FCB.DIRTY,x has eof been modified ? bmi L4704 if yes. jsr XDOS.GetFCBStatus has data been modified ? and #$70 (was written to while it's been open?) beq L46D9 if not. L4704 jsr XDOS.GetFCBStatus and #$40 does current data buffer need to be beq L4710 written ? branch if not. jsr XDOS.WriteDBLK if so, go write it. bcs L46E6 if error. 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. bpl L471C jsr XDOS.WriteIBLK bcs L46E6 return any errors. L471C ldy #0 jsr XDOS.FCBDevIDSelect X = XDOS.FCBPtr L4723 lda XDOS.FCBs+FCB.DEVID,x note: this code depends on the defined sta XDOS.DE.DevID,y order of the file control block and the inx temporary directory area in 'work space' iny cpy #6 bne L4723 lda XDOS.DE.DirHBlk read the directory header for this file ldx XDOS.DE.DirHBlk+1 .DO LOWERCASE=1 jsr XDOS.ReadGBufAXDir .ELSE jsr XDOS.ReadGBufAX read DIR into the general purpose buffer. .FIN bcs L46E6 if error. jsr XDOS.GetDH move header info. lda XDOS.DE.DirEBlk get address of directory block that ldx XDOS.DE.DirEBlk+1 contains the file entry. cmp XDOS.DE.DirHBlk test to see if it's the same block the bne .1 header is in. branch if not. cpx XDOS.DE.DirHBlk+1 beq L4755 branch if header block = entry block .1 .DO LOWERCASE=1 jsr XDOS.ReadGBufAXDir .ELSE jsr XDOS.ReadGBufAX read DIR block with file entry in general buffer. .FIN L4755 jsr XDOS.ZPT.SetEIB set up pointer to entry. jsr XDOS.ZPT.GetDE move entry to temp entry buffer in ldx XDOS.FCBPtr 'work space'. update 'blocks used' count lda XDOS.FCBs+FCB.UBLK,x sta XDOS.DE.BlkUsed lda XDOS.FCBs+FCB.UBLK+1,x sta XDOS.DE.BlkUsed+1 ldy #0 and move in end of file mark whether L476C lda XDOS.FCBs+FCB.EOF,x needed or not. sta XDOS.DE.EOF,y iny cpy #$03 move all 3 bytes beq L4780 lda XDOS.FCBs+FCB.1stBLK,x also move in the address of the file's sta XDOS.DE.Type,y first block since it might have changed inx since the file first opened. bne L476C branch always. L4780 ldx XDOS.FCBPtr lda XDOS.FCBs+FCB.STYPE,x the last thing to update is storage asl type (y=XDOS.FCBPtr+2). shift into high asl nibble. asl asl sta scrtch lda XDOS.DE.Filename get old type byte (might be the same). and #$0F strip off old type, ora scrtch add in the new type sta XDOS.DE.Filename and put it away. jsr XDOS.DE.Update go update directory. bcs glberr error. ldx XDOS.FCBPtr mark stz XDOS.FCBs+FCB.DIRTY,x fcb/directory as undirty. lda XDOS.DE.DevID see if bitmap should be written. cmp XDOS.BM.DevID is it in same as current file ? bne L47B2 yes, put it on the disk if necessary. jsr XDOS.FlushBM go put it away. bcs glberr flush error L47B2 clc rts *-------------------------------------- * report error only if not a close all or flush all *-------------------------------------- glberr ldy #$01 pha lda (ZP.A3L),y bne L47C1 not an 'all' so report now clc pla sta cferr save for later rts L47C1 pla rts *-------------------------------------- XDOS.FCBDevIDSelect ldx XDOS.FCBPtr lda XDOS.FCBs+FCB.DEVID,x sta GP.DEVNUM rts *-------------------------------------- XDOS.SetFCBSType lsr lsr lsr lsr ldy XDOS.FCBPtr and save it in fcb. sta XDOS.FCBs+FCB.STYPE,y rts *-------------------------------------- XDOS.ClrFCBStatus ldy XDOS.FCBPtr clear allocation states for data block lda XDOS.FCBs+FCB.F,y and both levels of indexes/ and #$F8 sta XDOS.FCBs+FCB.F,y indicates that either they exist now rts or unnecessary for current position. *-------------------------------------- XDOS.GetFCBStatus ldx XDOS.FCBPtr index to fcb. lda XDOS.FCBs+FCB.F,x return status byte. rts *-------------------------------------- XDOS.SetFCBStatus ldx XDOS.FCBPtr ora XDOS.FCBs+FCB.F,x sta XDOS.FCBs+FCB.F,x rts *-------------------------------------- L47CA lda #MLI.E.LOCKED access error sec L47CD rts *-------------------------------------- XDOS.SetEOF jsr XDOS.GetFCB.ST can only move end of tree, sapling or seed. cmp #$04 tree type ? bcs L47CA if not then access error asl asl asl asl sta stortyp may be used later. lda XDOS.FCBs+FCB.ACCESS,y and #$02 is write enabled to set new eof ? beq L47CA no, access error. jsr XDOS.TestWP hardware write protected ? bcs L47CA yes, access error. ldy XDOS.FCBPtr save old eof so it can be seen iny whether blocks need to be released iny upon contraction. ldx #$02 all 3 bytes of the eof L47EF lda XDOS.FCBs+FCB.EOF,y sta oldeof,x dey dex bpl L47EF ldy #$04 ldx #$02 L47FD lda (ZP.A3L),y position mark to new eof sta tposll,x dey dex bpl L47FD ldx #$02 point to 3rd byte. L4808 lda oldeof,x see if eof moved backwards so blocks cmp tposll,x can be released. bcc eofset (branch if not) bne purge branch if blocks to be released dex bpl L4808 all 3 bytes eofset ldy #$04 ldx XDOS.FCBPtr place new end of file into fcb inx inx L481C lda (ZP.A3L),y sta XDOS.FCBs+FCB.EOF,x dex dey cpy #$02 all 3 bytes moved ? bcs L481C no. jmp XDOS.SetFCB.DIRTY mark fcb as dirty. purge jsr XDOS.FlushOne make sure file is current bcs L47CD ldx ZP.DataPtr+1 pointer to index block inx inx stx zpt+1 (zero page conflict with dir buf ptr) ldx ZP.DataPtr stx zpt ldy XDOS.FCBPtr check if eof < mark iny iny ldx #$02 L4840 lda XDOS.FCBs+FCB.MARK,y cmp tposll,x compare until not equal or carry clear. bcc L485F branch if eof > mark. bne L484E branch if eof < mark. dey dex bpl L4840 compare all 3 bytes L484E ldy XDOS.FCBPtr ldx #$00 L4853 lda tposll,x fake position, correct position will sta XDOS.FCBs+FCB.MARK,y be made below... iny inx cpx #$03 move all 3 bytes bne L4853 L485F jsr XDOS.GetFreeCntVCBX force free block count before releasing lda tposll blocks. prepare for purge of excess... sta dseed all blocks and bytes beyond new eof lda tposlh must be zero'd sta dsap and #$01 sta dseed+1 lda tposhi lsr sta dtree ror dsap pass position in terms of block & bytes. lda dseed now adjust for boundaries of $200 ora dseed+1 bne L48A2 branch if no adjustment necessary. lda dsap get correct block positions for sap sec and tree levels. sbc #$01 sta dsap deallocate for last (phantom) block lda #$02 and don't modify last data block. bcs L489F branch if tree level unaffected. dec dtree bpl L489F branch if new eof not zero lda #$00 sta dtree otherwise, make a null seed out of it. sta dsap L489F sta dseed+1 L48A2 ldy XDOS.FCBPtr also must pass file's 1st block address. lda XDOS.FCBs+FCB.1stBLK,y sta firstbl lda XDOS.FCBs+FCB.1stBLK+1,y sta firstbh stz deblock lastly, initialize # of blocks to stz deblock+1 be free'd. jsr detree deallocate blocks from tree. php save any error status until fcb pha is cleaned up. sec ldy XDOS.FCBPtr ldx #$ff L48C2 inx lda firstbl,x sta XDOS.FCBs+FCB.1stBLK,y move in possible new first file block lda XDOS.FCBs+FCB.UBLK,y address. adjust usage count also sbc deblock,x sta XDOS.FCBs+FCB.UBLK,y iny txa beq L48C2 without disturbing carry. lda stortyp get possibly modified storage type jsr XDOS.SetFCBSType jsr XDOS.ClrFCBStatus make it look as though position has jsr XDOS.SetVCB.FBLK nothing allocated, update total blocks ldy XDOS.FCBPtr in fcb and correct position. iny iny ldx #2 L48F2 lda XDOS.FCBs+FCB.MARK,y tell 'rdposn' to go to correct sta tposll,x eor #$80 position from incorrect place. sta XDOS.FCBs+FCB.MARK,y dey dex bpl L48F2 jsr rdposn go to correct position. bcc L490D if no error. plx discard latest error code to stack plp sec php pha save new error. * mark file as in need of a flush and update fcb with new end of file, * then flush it. L490D jsr eofset go mark and update jsr XDOS.FlushOne then go do the flush. bcc L491C branch if no error. plx clean previous error off stack plx and previous P rts L491C pla report any errors that may have plp appeared. rts *-------------------------------------- XDOS.GetEOF ldx XDOS.FCBPtr index to end of file mark ldy #$02 and index to user's call parameters L4924 lda XDOS.FCBs+FCB.EOF,x sta (ZP.A3L),y inx iny cpy #$05 bne L4924 loop until all 3 bytes moved clc no errors rts *-------------------------------------- XDOS.NewLine ldy #$02 adjust newline status for open file. lda (ZP.A3L),y on or off ? ldx XDOS.FCBPtr it will be 0 if off. sta XDOS.FCBs+FCB.NLMASK,x set new line mask iny lda (ZP.A3L),y and move in 'new-line' byte sta XDOS.FCBs+FCB.NLBYTE,x clc no error possible rts *-------------------------------------- XDOS.GetFileInfo jsr XDOS.FindFile look for file. bcc .1 no error. jsr XDOS.GetFileInfoVol bcs .9 .1 lda XDOS.DE.Filename transfer bytes from internal order to lsr call spec via 'inftabl' translation lsr table but first change storage type to lsr external (low nibble) format. lsr sta XDOS.DE.Filename ldy #$11 index to last of user's spec table. .2 lda inftabl-3,y and #$7F strip bit used by setinfo tax lda XDOS.DE.Filename,x move directory info to call spec. table sta (ZP.A3L),y dey cpy #$03 bcs .2 if all info bytes moved, retn carry clr * clc .9 rts *-------------------------------------- XDOS.SetFileInfo jsr XDOS.FindFile get the file to work on. bcs .3 if error. lda GP.BUBIT see if backup bit can be cleared eor #$20 and XDOS.DE.Access and #$20 sta bkbitflg or preserve current... ldy #$0D init pointer to user supplied list. .1 ldx inftabl-3,y get index to corresponding 'd.' table. bmi .2 branch if parameter can't be set. lda (ZP.A3L),y sta XDOS.DE.Filename,x .2 dey has user's request been satisfied ? cpy #$03 bcs .1 no, move next byte. and #$18 make sure no illegal access bits were beq .4 set !! branch if legal access. lda #MLI.E.LOCKED otherwise, access error. sec .3 rts .4 ldy #$0B lda (ZP.A3L),y was clock null input ? bne XDOS.SetFileInfoEx.8 jmp XDOS.DE.Update update with clock also... *-------------------------------------- XDOS.SetFileInfoEx jsr XDOS.FindFile bcs XDOS.GetFileInfoEx.RTS ldx #S.FIEX.BLKPTR+2-1 ldy #S.FIEX.BLKPTR+2-1+3 .2 lda (ZP.A3L),y sta XDOS.DE.Filename,x dey dex bpl .2 XDOS.SetFileInfoEx.8 jmp XDOS.DE.UpdateNoMTime *-------------------------------------- XDOS.GetFileInfoEx jsr XDOS.FindFile bcc .1 jsr XDOS.GetFileInfoVol bcs .9 .1 ldx #S.FIEX.BLKPTR+2-1 ldy #S.FIEX.BLKPTR+2-1+3 .2 lda XDOS.DE.Filename,x sta (ZP.A3L),y dey dex bpl .2 ldx #7 ldy #S.FIEX.ACL+7+3 .DO ACL=1 .3 lda XDOS.DH.ACL,x sta (ZP.A3L),y dey dex bpl .3 .ELSE lda #0 .3 sta (ZP.A3L),y dey dex bpl .3 .FIN * clc .9 XDOS.GetFileInfoEx.RTS rts *-------------------------------------- XDOS.GetFileInfoVol cmp #MLI.E.INVPATH was it a root directory file ? sec (in case of no match) bne .9 if not, then error. lda #$F0 sta XDOS.DE.Filename for get info, report proper storage type stz reql force a count of free blocks. stz reqh ldx XDOS.VCBPtr jsr XDOS.GetFreeCntVCBX get a fresh count of free blocks on ldx XDOS.VCBPtr this volume. lda XDOS.VCBs+VCB.FBLK+1,x return total blocks and total in use. sta reqh 1st transfer 'free' blocks to zpage lda XDOS.VCBs+VCB.FBLK,x for later subtraction to determine sta reql the 'used' count. lda XDOS.VCBs+VCB.TBLK+1,x transfer to 'd.' table as aux id sta XDOS.DE.AuxType+1 (total block count is considered aux id pha for the volume) lda XDOS.VCBs+VCB.TBLK,x sta XDOS.DE.AuxType sec subtract and report the number of sbc reql blocks 'in use' sta XDOS.DE.BlkUsed pla sbc reqh sta XDOS.DE.BlkUsed+1 clc .9 rts *-------------------------------------- XDOS.ACL jsr XDOS.FindDirOrVol bcs .9 jsr XDOS.ReadGBufDEKeyPtr bcs .9 ldx #7 ldy #S.FIEX.ACL+3 lda (ZP.A3L),y beq .2 ldy #S.FIEX.ACL+7+3 .1 lda (ZP.A3L),y sta XDOS.GBuf+20,x dey dex bpl .1 .DO LOWERCASE=1 jmp XDOS.WriteGBufDir .ELSE jmp XDOS.WriteGBuf .FIN .2 ldy #S.FIEX.ACL+7+3 .3 lda XDOS.GBuf+20,x sta (ZP.A3L),y dey dex bpl .3 * clc .9 rts *-------------------------------------- XDOS.Rename jsr XDOS.CheckPath look for source (original) file. bcc XDOS.RenameFileDir if found. cmp #$40 trying to rename a volume ? bne L49FD no, return error. XDOS.RenameVol jsr XDOS.GetRenPath syntax new name. bcs L49FD rename error. ldy XDOS.PathBuf find out if only rootname for new name iny lda XDOS.PathBuf,y must be $FF if volume name only. bne L4A72 if not single name ldx XDOS.VCBPtr check for open files before changing. lda XDOS.VCBs+VCB.OFCNT,x beq L49FF if volume not busy. lda #MLI.E.OPEN file busy error. L49FD sec rts L49FF ldy #0 get newname's length lda XDOS.PathBuf,y ora #$F0 (root file storage type) jsr XDOS.UpdateHdr update root directory. bcs .9 rename error. ldy #$00 ldx XDOS.VCBPtr update vcb also. .3 lda XDOS.PathBuf,y move new name to vcb. beq .8 sta XDOS.VCBs,x iny next character inx bra .3 .8 * clc no errors .9 rts *-------------------------------------- XDOS.RenameFileDir jsr XDOS.GetNamPtr set y = 1st char of path, x = 0. L4A21 lda XDOS.PathBuf,y move original name to XDOS.GBuf sta XDOS.GBuf,x for later comparison to new name. bmi L4A2D if last character has been moved iny otherwise, get the next one. inx bra L4A21 L4A2D jsr XDOS.GetRenPath get new name syntaxed. bcs L4A74 rename error. jsr XDOS.GetNamPtr set y = path, x = 0. lda XDOS.PathBuf,y now compare new name with old name L4A38 cmp XDOS.GBuf,x to make sure they are in the same dir. php save result of comparison. and #$F0 was last char really a count ? bne L4A46 if not. sty rnptr save pointer to next name, it might stx namptr be the last. L4A46 plp result of last comparison ? bne L4A52 branch if different character or count. inx bump pointers. iny lda XDOS.PathBuf,y was it the last character ? bne L4A38 if not. clc no operation, names were the same. rts L4A52 ldy rnptr index to last name in the chain. lda XDOS.PathBuf,y get last name length. sec adc rnptr tay lda XDOS.PathBuf,y this byte should be $00 ! bne L4A72 if not, bad path error. ldx namptr index to last of original name lda XDOS.GBuf,x sec adc namptr tax lda XDOS.GBuf,x this byte should also be $00. beq L4A76 if so, continue processing. L4A72 lda #MLI.E.INVPATH bad pathname error. .HS 2C BIT ABS L4A7F lda #MLI.E.DUPFILE L4A74 sec rts L4A76 jsr XDOS.CheckPath test for duplicate file name. bcc L4A7F duplicate name error. cmp #MLI.E.FNOTFND was it a valid file not found ? bne L4A74 no, rename error. jsr XDOS.GetPath syntax pathname of file to be changed. jsr XDOS.FindFile get all the info on this file. bcs L4A74 rename error. jsr XDOS.IsOpened is file in use ? lda #MLI.E.OPEN anticipate file busy error. bcs L4A74 error if in use. lda XDOS.DE.Access test bit which allows rename. and #$40 bne L4A9D branch if ok to rename lda #MLI.E.LOCKED otherwise, illegal access. .HS 2C BIT ABS L4A98 lda #MLI.E.INCFF sec rts L4A9D lda XDOS.DE.Filename find out which storage type. and #$F0 strip off name length. cmp #$D0 is it a directory ? beq L4AAE then ok. cmp #$40 is it a seed, sapling or tree ? bcs L4A98 file incompatible error. L4AAE jsr XDOS.GetRenPath since both names go into the directory, bcs L4A74 syntax the new name to get the local ldy rnptr name address. y = index to local name ldx XDOS.PathBuf,y length. adj y to last char of new name. tya adc XDOS.PathBuf,y tay L4ABE lda XDOS.PathBuf,y move local name to dir entry workspace. sta XDOS.DE.Filename,x dey dex bne L4ABE lda XDOS.DE.Filename preserve file storage type. and #$F0 strip off old name length. tax ora XDOS.PathBuf,y add in new name's length. sta XDOS.DE.Filename cpx #$D0 that file must be changed also. bne L4AF0 branch if not directory type. jsr XDOS.ReadGBufDEKeyPtr bcs L4A74 errors. ldy rnptr change the header's name to match the lda XDOS.PathBuf,y owner's new name. get local name length. ora #$E0 assume it's a header. jsr XDOS.UpdateHdr bcs L4A74 L4AF0 jmp XDOS.DE.UpdateNoMTime end by updating all path directories. *-------------------------------------- XDOS.GetNamPtr ldy #$00 return pointer to 1st name of path. bit prfxflg is this a prefixed name ? bmi .1 branch if not. ldy GP.NEWPFXPTR .1 ldx #$00 rts *-------------------------------------- XDOS.UpdateHdr ldx #$00 .1 sta XDOS.GBuf+4,x inx iny lda XDOS.PathBuf,y bne .1 .DO LOWERCASE=1 jmp XDOS.WriteGBufDir .ELSE jmp XDOS.WriteGBuf write changed header block. .FIN *-------------------------------------- XDOS.Destroy jsr XDOS.FindFile look for file to be destroyed. bcs L4B67 if error. jsr XDOS.IsOpened is it open ? lda totent bne L4B64 error if open. stz reql force proper free count in volume. stz reqh (no disk access occurs if already proper) jsr XDOS.CheckFree bcc L4B39 no errors. cmp #MLI.E.VOLFULL was error a full disk ? bne L4B66 no, report error. L4B39 lda XDOS.DE.Access make sure ok to destroy file. * and #$80 * bne L4B45 bmi L4B45 lda #MLI.E.LOCKED access error jsr GP.SYSERR L4B45 lda GP.DEVNUM last device used. jsr XDOS.TestWPA test for write protected hardware bcs L4B67 before going thru deallocation. lda XDOS.DE.KeyPtr 'detree' needs first block address sta firstbl lda XDOS.DE.KeyPtr+1 sta firstbh lda XDOS.DE.Filename find out which storage type. and #$F0 strip off name length. cmp #$40 is it a seed, sapling or tree ? bcc XDOS.DestroyFile branch if it is. bra XDOS.DestroyDir otherwise, test for directory destroy. L4B64 lda #MLI.E.OPEN file busy error. L4B66 sec can't be destroyed L4B67 rts *-------------------------------------- XDOS.DestroyFile sta stortyp destroy a tree file. save storage type. ldx #$05 * lda #$00 set 'detree' input variables, must be L4B6F stz stortyp,x in order: deblock, dtree, dsap, dseed. dex bne L4B6F loop until all zero'd. lda #$02 this avoids an extra file i/o and pre- sta dseed+1 vents destruction of any deleted data. inc delflag don't allow detree to zero index blocks. jsr detree make trees and saplings into seeds. dec delflag reset flag. bcs L4B93 (de-evolution) L4B85 ldx firstbh lda firstbl now deallocate seed. jsr XDOS.DeallocAX bcs L4B93 jsr XDOS.FlushBM L4B93 pha save possible error code. stz XDOS.DE.Filename update directory to free entry space. jsr XDOS.DH.DecFileCnt mark header with one less file. jsr XDOS.SetVCB.FBLK go update block count in vcb (ignore jsr XDOS.DE.Update error, if any) and update dir last. tax save possible new error code, pla restore possible old error code. bcc L4BAF branch if last call succeeded. txa last call failed, use it's error code. L4BAF cmp #$01 adjust carry accordingly rts *-------------------------------------- L4BCD bcc L4B85 branch widened (always taken) XDOS.DestroyDir cmp #$D0 is this a directory file ? bne L4C1B no, file incompatible. jsr XDOS.GetBM make sure a buffer available for bitmap bcs L4C1A if error. jsr XDOS.ReadGBufDEKeyPtr read 1st block of directory into XDOS.GBuf bcs L4C1A lda XDOS.GBuf+37 do any files exist in this directory ? ora XDOS.GBuf+38 bne L4C1Abis if so, access error. L4BF6 sta XDOS.GBuf+4 make it an invalid subdirectory .DO LOWERCASE=1 jsr XDOS.WriteGBufDir .ELSE jsr XDOS.WriteGBuf .FIN bcs L4C1A L4BFE lda XDOS.GBuf+2 get forward link. cmp #$01 test for null block into carry. ldx XDOS.GBuf+3 get the rest of the block address. bne L4C0A branch if not null. bcc L4BCD was the low part null as well ? L4C0A jsr XDOS.DeallocAX free this block. bcs L4C1A lda XDOS.GBuf+2 ldx XDOS.GBuf+3 jsr XDOS.ReadGBufAX read next DIR block (no need to unpack) bcc L4BFE loop until all freed L4C1A rts L4C1Abis lda #MLI.E.LOCKED access error. .HS 2C BIT ABS L4C1B lda #MLI.E.INCFF file incompatible jsr GP.SYSERR *-------------------------------------- XDOS.SetFCB.DIRTY pha mark fcb as dirty so the directory will be flushed on 'flush'. phy save regs. ldy XDOS.FCBPtr lda #$80 mark fcb as dirty. sta XDOS.FCBs+FCB.DIRTY,y save it back ply and restore regs. pla rts *-------------------------------------- XDOS.SetVCB.FBLK ldx XDOS.VCBPtr update block free count in vcb. point to vcb of correct device. lda deblock get # of blocks recently freed. adc XDOS.VCBs+VCB.FBLK,x sta XDOS.VCBs+VCB.FBLK,x update current free block count. lda deblock+1 adc XDOS.VCBs+VCB.FBLK+1,x sta XDOS.VCBs+VCB.FBLK+1,x stz XDOS.VCBs+VCB.BMAPIDX,x force re-scan from 1st bitmap * lda #0 ????? rts *-------------------------------------- MAN SAVE usr/src/prodos.fx/prodos.s.xdos.e LOAD usr/src/prodos.fx/prodos.s ASM