From c43c51e28efac877a3a70643c35bf4f029198657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 10 Nov 2019 19:28:06 +0100 Subject: [PATCH] Kernel 0.93+ --- .Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes .Floppies/A2OSX.TEST.po | Bin 819200 -> 819200 bytes ProDOS.FX/ProDOS.S.LDR.txt | 109 ++------ ProDOS.FX/ProDOS.S.XDOS.A.txt | 503 +++++++++++++++++++++++++++++++--- ProDOS.FX/ProDOS.S.XDOS.B.txt | 451 ++++++++---------------------- ProDOS.FX/ProDOS.S.XDOS.C.txt | 36 ++- ProDOS.FX/ProDOS.S.XDOS.E.txt | 101 +++++-- ProDOS.FX/ProDOS.S.XDOS.F.txt | 107 ++++++-- ProDOS.FX/ProDOS.S.XRW.txt | 19 +- ProDOS.FX/ProDOS.S.txt | 17 +- SYS/KM.RAMWORKS.S.txt | 2 +- 12 files changed, 836 insertions(+), 509 deletions(-) diff --git a/.Floppies/A2OSX.BOOT.po b/.Floppies/A2OSX.BOOT.po index 94548d69bff8b00f60051a9b9ec57d42f0d29acd..0dc2d2193e4017e50198211184a7d4fe5baf7d4c 100644 GIT binary patch delta 21983 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 delta 19136 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 XZh+sxAK*{$7x)|e(`X(4+i1{#v*4QX delta 58681 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%0D!xKVT81~h*Xy}Ci}3m&S+M%f7-Du1KQroK}) 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 Psvf55998GrYW(^?jB`52 delta 956 zcmX}qO>5LZ90qXylecc&LrW0$DobN)J+!4>LKS-{2tneh;4N7E3b_Wl4xulnK+{w3 z6pvdF5^pVqf&Boo)R%*}P(oZD1uUG2#vMs zn{~FlHygZiqH97Zh6+eP5^{5$^`Qt#p&>MGWKUncNBPB$xmrItW&d8Oll<0gArwOe zBp?a76P@*;2uh(LG}fwbCT#hmI>NwEuMk2pR6qifko!SreJFy`M(v;M<%4K diff --git a/ProDOS.FX/ProDOS.S.LDR.txt b/ProDOS.FX/ProDOS.S.LDR.txt index 8fe033ad..f578ec2c 100644 --- a/ProDOS.FX/ProDOS.S.LDR.txt +++ b/ProDOS.FX/ProDOS.S.LDR.txt @@ -151,37 +151,22 @@ m128k sta idapple Save MACHID in temp location lda #$01 patch for the gs rom trb statereg to force off intcxrom - lda PAKME.ILDR - sta ZPInBufPtr - lda PAKME.ILDR+1 - sta ZPInBufPtr+1 - lda #ILDR.START - sta ZPOutBufPtr + ldx #PAKME.ILDR-PAKME.Table + ldy #ILDR.START lda /ILDR.START - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA - lda PAKME.GP - sta ZPInBufPtr - lda PAKME.GP+1 - sta ZPInBufPtr+1 - lda #MLI - sta ZPOutBufPtr + ldx #PAKME.GP-PAKME.Table + ldy #MLI lda /MLI - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA jsr lc1in switch in language card bank 1. - lda PAKME.XRW - sta ZPInBufPtr - lda PAKME.XRW+1 - sta ZPInBufPtr+1 - lda #$D000 - sta ZPOutBufPtr + ldx #PAKME.XRW-PAKME.Table + ldy #$D000 lda /$D000 - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA ldx #0 @@ -196,15 +181,10 @@ m128k sta idapple Save MACHID in temp location inx bne .1 - lda PAKME.XDOS - sta ZPInBufPtr - lda PAKME.XDOS+1 - sta ZPInBufPtr+1 - lda #$DE00 - sta ZPOutBufPtr + ldx #PAKME.XDOS-PAKME.Table + ldy #$DE00 lda /$DE00 - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA ldx #XDOS.DATA.LEN0 @@ -212,15 +192,10 @@ m128k sta idapple Save MACHID in temp location dex bne .3 - lda PAKME.IRQ - sta ZPInBufPtr - lda PAKME.IRQ+1 - sta ZPInBufPtr+1 - lda #$FF9B - sta ZPOutBufPtr + ldx #PAKME.IRQ-PAKME.Table + ldy #$FF9B lda /$FF9B - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA LDR.IRQ lda RROMWRAMBNK2 ldy irqv interrupt vector @@ -269,19 +244,12 @@ LDR.IIGS sta cortflag ldy PAKME.CCLK+1 jsr LDR.SetupCLK - ldx PAKME.SEL2 - ldy PAKME.SEL2+1 +* ldx #PAKME.SEL2-PAKME.Table +* ldy #$1000 +* lda /$1000 +* jsr X.Unpak.XatYA - stx ZPInBufPtr - sty ZPInBufPtr+1 - lda #$1000 - sta ZPOutBufPtr - lda /$1000 - sta ZPOutBufPtr+1 - jsr X.Unpak - - ldx PAKME.SEL2 - ldy PAKME.SEL2+1 + ldx #PAKME.SEL2-PAKME.Table jsr LDR.SetupQC *-------------------------------------- lda LDR.BootFlag @@ -294,8 +262,7 @@ LDR.IIGS sta cortflag .1 bra LDR.Common *-------------------------------------- -LDR.II ldx PAKME.SEL1 - ldy PAKME.SEL1+1 +LDR.II ldx #PAKME.SEL1-PAKME.Table jsr LDR.SetupQC jsr LDR.ClkDevScan @@ -366,18 +333,14 @@ LDR.ReadRoot lda LDR.MLIOL.P+1 place boot devnum in globals .9 ldx #LDR.MSG.ROOTERR jsr LDR.PrintX - bmi * + bra * *-------------------------------------- LDR.SetupQC bit RRAMWRAMBNK2 read/write RAM bank 2 bit RRAMWRAMBNK2 - stx ZPInBufPtr - sty ZPInBufPtr+1 - lda #$D100 - sta ZPOutBufPtr + ldy #$D100 lda /$D100 - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA lda #$EE byte to distinguish LC bank 2 sta $D000 @@ -520,29 +483,17 @@ LDR.SetupRAM lda DEVCNT jsr lc1in - ldx PAKME.RAM - ldy PAKME.RAM+1 - - stx ZPInBufPtr - sty ZPInBufPtr+1 - lda #$FF00 - sta ZPOutBufPtr + ldx #PAKME.RAM-PAKME.Table + ldy #$FF00 lda /$FF00 - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA sta SETWRITEAUX - ldx PAKME.RAMX - ldy PAKME.RAMX+1 - - stx ZPInBufPtr - sty ZPInBufPtr+1 - lda #$0200 - sta ZPOutBufPtr + ldx #PAKME.RAMX-PAKME.Table + ldy #$0200 lda /$0200 - sta ZPOutBufPtr+1 - jsr X.Unpak + jsr X.Unpak.XatYA sta CLRWRITEAUX diff --git a/ProDOS.FX/ProDOS.S.XDOS.A.txt b/ProDOS.FX/ProDOS.S.XDOS.A.txt index 90a45ffa..74c01904 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.A.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.A.txt @@ -203,13 +203,15 @@ XDOS.syserr sta p8error P8 error code plx pop 1 level of return sec rts - +*-------------------------------------- sysdeath1 tax death error code. sta CLR80DISP disable 80 col hardware. lda SETTEXT switch in text. lda cortflag is this a Cortland? beq H321A if not, don't use super hires switch. + stz newvideo force off super hires. + H321A lda CLRPAGE2 switch in text page 1. ldy #$13 @@ -263,7 +265,7 @@ H3274 jsr $FFFF SELF MODIFIED : execute command errorsys jsr GP.P8errv goodop rts - +*-------------------------------------- setpath ldy #$01 index to pathname pointer lda (A3L),y low pointer address sta zpt @@ -275,101 +277,126 @@ setpath ldy #$01 index to pathname pointer synpath ldx #$00 x = index to pathbuf ldy #$00 y = index to input pathname. - stx prfxflg assume prefix is in use. - stx pathbuf mark pathbuf = nothing processed. + + stz prfxflg assume prefix is in use. + stz pathbuf mark pathbuf = nothing processed. + lda (zpt),y validate pathname length > 0 and < 65 beq errsyn + cmp #$41 bcs errsyn + sta pathcnt this is used to compare for inc pathcnt end of pathname processing. + iny now check for full pathname... lda (zpt),y (full name if starts with '/') - ora #$80 - cmp #$AF + and #$7F + cmp #'/' bne H32AD branch if prefix appended. - sta prfxflg set prefix flag = prefix not used. + + dec prfxflg set prefix flag = prefix not used. iny index to 1st character of pathname. + H32AD lda #$FF set current position of pathbuf sta pathbuf,x to indicate end of pathname. + sta namcnt $FF = no chars processed in local name. stx namptr pointer to local name length byte. + H32B8 cpy pathcnt done with pathname processing? bcs endpath + lda (zpt),y get character and #$7F inx prepare for next char iny - cmp #$2F is it delimiter '/' ? + cmp #'/' is it delimiter '/' ? beq endname yes - cmp #$61 lowercase? - bcc H32CD no + + .DO LOWERCASE=0 + cmp #'a' lowercase? + bcc .1 no + and #$5F shift to uppercase -H32CD sta pathbuf,x store char +.1 .FIN + + sta pathbuf,x store char inc namcnt is it the 1st char of a local name? - bne H32DA no + bne .2 no + inc namcnt increment to 1 - bne H32E6 1st char must be alpha (always taken) -H32DA cmp #$2E is it '.' ? - beq H32B8 ok, then do next char - cmp #$30 at least a '0' ? - bcc errsyn error if not - cmp #$3A is it numeric? - bcc H32B8 yes, get next char -H32E6 cmp #$41 at least an 'a' ? - bcc errsyn error if not - cmp #$5B is it > 'z' ? - bcc H32B8 branch if valid alpha to get next char -errsyn sec bad pathname - lda #$40 + jsr XDOS.IsValidFirstChar + bcc H32B8 + + bra errsyn + +.2 jsr XDOS.IsValidChar + bcc H32B8 + +errsyn lda #MLI.E.INVPATH + sec rts + endpath lda #$00 end pathname with a 0 bit namcnt also make sure count is positive bpl H32FD + sta namcnt dex + H32FD inx sta pathbuf,x beq errsyn error if '/' only. + stx pathcnt save length of pathname tax + endname lda namcnt validate local name < 16 - cmp #$10 + cmp #16 bcs errsyn - phx save pointer + + phx save pointer ldx namptr get index to beginning of local name sta pathbuf,x save local name's length plx restore pointer bne H32AD branch if more names to process + clc probably no error, but lda prfxflg make sure all pathnames are prefixed bne H3323 or begin with a '/'. + lda newpfxptr must be non-zero beq errsyn H3323 rts - -* set prefix command - -setprefx jsr setpath call is made to detect if a null path. +*-------------------------------------- +XDOS.SetPrefix jsr setpath call is made to detect if a null path. bcc H3333 path ok. + ldy pathbuf is it a null pathname? bne pfxerr error if not + sty newpfxptr fix appletalk PFI bug sty preflag prefix flag clc no error rts + H3333 jsr findfile go find specified prefix directory. bcc H333C if no error. - cmp #$40 bad pathname. + cmp #MLI.E.INVPATH bad pathname. bne pfxerr branch if error is not root directory. H333C lda d_stor make sure last local name is dir type and #$D0 (either root or sub). eor #$D0 directory? bne ptyperr wrong type + ldy prfxflg new or appended prefix? bne H334D + lda newpfxptr append new prefix to old + H334D tay sec find new beginning of prefix sbc pathcnt @@ -391,15 +418,15 @@ movprfx lda pathbuf,y iny inx bne movprfx + clc good prefix rts + ptyperr lda #$4B filetype error (not a directory) pfxerr sec rts - -* get prefix command - -getprefx clc calc how big a buffer is needed. +*-------------------------------------- +XDOS.GetPrefix clc calc how big a buffer is needed. ldy #$01 get index to users pathname buffer lda (A3L),y sta usrbuf user buffer ptr @@ -411,16 +438,21 @@ getprefx clc calc how big a buffer is needed. sta cbytes jsr valdbuf go validate prefix buffer address bcs pfxerr + ldy #$00 y = indirect index to user buffer. lda newpfxptr get address of beginning of prefix tax beq nulprfx if null prefix. + eor #$FF get total length of prefix adc #$02 add 2 for leading and trailing slashes. + nulprfx sta (usrbuf),y store length in user's buffer. beq gotprfx branch if null prefix. + sendprfx iny inc to next user buffer location. lda pathbuf,x get next char of prefix. + sndlimit sta (usrbuf),y give char to user. and #$F0 check for length descriptor. bne H33B3 branch if regular character @@ -435,11 +467,14 @@ H33B3 inx sta (usrbuf),y gotprfx clc no error rts + findfcb 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. bcs badref + pha dec lsr @@ -451,6 +486,7 @@ findfcb ldy #$01 index to ref# pla restore ref# in acc cmp fcbbuf,y bne errnoref + fndfcbuf lda fcbbuf+11,y get page address of file buffer. jsr getbufadr get file's address into bufaddrl,h ldx bufaddrh (y=fcbptr preserved) @@ -464,16 +500,19 @@ fndfcbuf lda fcbbuf+11,y get page address of file buffer. lda bufaddrl sta datptr index and data buffers always on sta zpt page boundaries. + fndfvol tax search for associated vcb lda vcbbuf+16,x cmp fcbbuf+1,y is this vcb the same device? beq tstvopen if it is, make sure volume is active. + nxtfvol txa adjust index to next vcb. clc adc #$20 bcc fndfvol loop until volume found. + lda #$0A open file has no volume so - jsr sysdeath kill the system. + .HS 2C BIT ABS fcbdead lda #$0B fcb error so jsr sysdeath kill the system. @@ -490,10 +529,9 @@ errnoref lda #$00 put a zero into this fcb to badref lda #MLI.E.BADREF requested refnum is sec illegal (out of range) rts +*-------------------------------------- +XDOS.Online jsr mvdbufr figure out how big buffer has to be. -* online command - -online jsr mvdbufr figure out how big buffer has to be. stz cbytes set this for valdbuf routine. stz cbytes+1 ldy #$01 @@ -501,21 +539,29 @@ online jsr mvdbufr figure out how big buffer has to be. and #$F0 device. mask out unused nibble. sta devnum last device used. beq H343C branch if all devices. + lda #$10 cbytes = $010 sta cbytes bne H343F always taken + H343C inc cbytes+1 cbytes = $100 + H343F jsr valdbuf go validate buffer range against bcs onlinerr allocated memory. + lda #$00 zero out user buffer space ldy cbytes + H3449 dey sta (usrbuf),y bne H3449 + sta namptr used as pointer to user buffer. lda devnum get device # again. bne online1 branch if only 1 device to process. + jsr mvdevnums get list of currently recognized dev's. + H3459 phx save index to last item on list lda loklst,x sta devnum save desired device to look at. @@ -527,37 +573,47 @@ H3459 phx save index to last item on list plx get index to device list. dex next device. bpl H3459 branch if there is another device. + lda #$00 no errors for multiple on-line clc onlinerr rts - +*-------------------------------------- online1 jsr fnddvcb see if it has already been logged in. bcs olinerr1 branch if vcb is full. + ldx #$00 read in root (volume) directory lda #$02 jsr rdblk read it into general purpose buffer. ldx vcbptr index to the vcb entry. bcc volfound branch if read was ok. + tay error value. lda vcbbuf+17,x don't take the vcb offline if bne rtrnerr there are active files present. + sta vcbbuf,x now take the volume offline sta vcbbuf+16,x rtrnerr tya error value. bcs olinerr1 branch if unable to read. + volfound lda vcbbuf,x has it been logged in before? beq H349E if not. + lda vcbbuf+17,x it has, are there active files? bmi H34AA branch if volume is currently busy. + H349E jsr logvcb1 go log it in. bcs olinerr1 branch if there is a problem. + lda #$57 anticipate a duplicate active volume bit duplflag exits. bmi olinerr1 branch if so. + H34AA ldx vcbptr jsr cmpvcb does vol read compare with logged vol? lda #$2E anticipate wrong volume mounted. bcc H34D0 branch if ok. + olinerr1 pha save error code. jsr svdevn report what device has problem. pla error code. @@ -572,6 +628,7 @@ olinerr1 pha save error code. sta (usrbuf),y stz duplflag clear duplicate flag. lda #$57 duplicate volume error code. + H34CE sec flag error rts @@ -590,9 +647,373 @@ svdevn ldy namptr index to 1st byte of this entry. lda devnum upper nibble = device# and ora (usrbuf),y lower nibble = name length. sta (usrbuf),y + clc no errors rts end of block file manager *-------------------------------------- +XDOS.Create jsr lookfile check for duplicate, get free entry + bcc duperr error code may be 'file not found' + +tstfnf cmp #MLI.E.FNOTFND 'file not found' is ok + bne crerr1 otherwise exit with error. + + ldy #$07 test for tree or directory file, + lda (A3L),y no other kinds are legal. + cmp #$04 is it seed, sapling or tree? + bcc tstdspc branch if it is + + cmp #$0D + bne ctyperr report type error if not directory. + +tstdspc lda devnum make sure destination device + jsr twrprot1 is not write protected. + bcs H351D + + lda nofree is there space in directory to + beq xtndir add this file? branch if not + jmp creat1 otherwise, go create file. + +xtndir lda own_blk before extending directory, + ora own_blk+1 make sure it's a subdirectory. + bne H352A + + lda #MLI.E.DIRFULL otherwise, directory full error + .HS 2C BIT ABS +ctyperr lda #MLI.E.UNSUPST filetype error + .HS 2C BIT ABS +duperr lda #MLI.E.DUPFILE name already exists +crerr1 sec +H351D rts + +H352A lda bloknml preserve disk address of current (last) + pha directory link, before allocating an + lda bloknml+1 extended block. + pha + jsr alc1blk allocate a block for extending directory + plx + stx bloknml+1 restore block addr of dir info in gbuf + plx + stx bloknml + bcs H351D unable to allocate. + + sta gbuf+2 save block address in y,a to + sty gbuf+3 current directory. + jsr wrtgbuf update directory block with new link. + bcs H351D if error + + ldx #$01 + +swpbloks lda bloknml,x prepare new directory block + sta gbuf,x using current block as back link + lda gbuf+2,x + sta bloknml,x and save new block as next to be written + dex + bpl swpbloks + inx + txa x and a = 0 + +clrdir sta gbuf+2,x + sta gbuf+$100,x + inx + bne clrdir + + jsr wrtgbuf write prepared directory extension. + bcs H351D if error + + lda own_blk + ldx own_blk+1 + jsr rdblk read in parent directory block + ldx own_ent and calc entry address. + lda /gbuf + sta zpt+1 + lda #$04 +ocalc clc + dex has entry address been calulated? + beq H3584 if yes. + adc own_len next entry address + bcc ocalc + inc zpt+1 entry must be in 2nd 256 bytes of block + bcs ocalc always taken. + +H3584 sta zpt + ldy #$13 index to block count +H3588 lda (zpt),y + adc dinctbl-$13,y add 1 to block count and + sta (zpt),y + iny + tya $200 to the directory's eof. + eor #$18 done with usage/eof update? + bne H3588 branch if not. + + jsr wrtgbuf go update parent. + bcs crerr2 + + jmp XDOS.Create +crerr2 rts return and report errors + +creat1 ldx #$00 zero out gbuf + +H35A0 stz gbuf,x + stz gbuf+$100,x and data block of file. + inx + bne H35A0 + + ldy #$0B move user specified date/time + +cmvtime lda (A3L),y to directory. + sta d_filid,y + txa if all 4 bytes of date/time = 0 + ora (A3L),y then use built-in date/time. + tax + dey + cpy #$07 + bne cmvtime + + txa does user want default time? + bne cmvname if not. + + ldx #$03 + +mvdftime lda p8date,x move current default date/time + sta d_credt,x + dex + bpl mvdftime + +cmvname lda (A3L),y y = index to file kind. + cmp #$04 + lda #$10 assume tree type + bcc csvfkind + lda #$D0 it's directory. + +csvfkind ldx namptr index to local name of pathname. + ora pathbuf,x combine file kind with name length. + sta d_stor sos calls this 'storage type'. + and #$0F strip back to name length + tay and use as counter for move. + clc + adc namptr calc end of name + tax + + .DO LOWERCASE=1 + stz d_sosver + stz d_comp + .FIN + +crname lda pathbuf,x move local name as filename + sta d_stor,y + + .DO LOWERCASE=1 + cmp #'a' + bcc .3 + cmp #'z'+1 + bcs .3 + + eor #$20 + sta d_stor,y + + cpy #8 + bcs .1 + + lda whichbit,y + tsb d_sosver + bra .2 + +.1 lda whichbit-8,y + tsb d_comp + +.2 lda #$80 + tsb d_sosver +.3 .FIN + dex + dey + bne crname + + ldy #$03 index to 'access' parameter + lda (A3L),y + sta d_attr + iny also move 'file identification' + lda (A3L),y + sta d_filid + +cmvauxid iny move auxillary identification bytes + lda (A3L),y + sta d_auxid-5,y + cpy #$06 + bne cmvauxid + + .DO LOWERCASE=0 + lda xdosver save current xdos version # + sta d_sosver + + lda compat and backward compatibility # + sta d_comp + .FIN + + lda #$01 usage is always 1 block + sta d_usage + lda d_head place back pointer to header block + sta d_dhdr + + lda d_head+1 + sta d_dhdr+1 + + lda d_stor storage type. + and #$E0 is it a directory? + beq cralcblk branch if seed file. + + ldx #$1E move header to data block + +cmvheadr lda d_stor,x + sta gbuf+4,x + dex + bpl cmvheadr + + eor #$30 + sta gbuf+4 make it a directory header mark. + + ldx #$07 overwrite password area and other + +cmvpass lda pass,x header info. + sta gbuf+20,x + + lda xdosver,x + sta gbuf+32,x + dex + bpl cmvpass + + ldx #$02 and include info about parent directory + stx d_eof+1 + +cmvparnt lda d_entblk,x + sta gbuf+39,x + dex + bpl cmvparnt + + lda h_entln lastly, the length of parent's + sta gbuf+42 directory entries. +cralcblk jsr alc1blk get address of file's data block + bcs crerr3 + sta d_frst + sty d_frst+1 + sta bloknml + sty bloknml+1 + jsr wrtgbuf go write data block of file + bcs crerr3 + inc h_fcnt add 1 to total # of files in this dir + bne credone + inc h_fcnt+1 +credone jsr drevise go revise directories with new file + bcs crerr3 + jmp upbmap lastly, update volume bitmap +entcalc lda /gbuf set high address of dir entry + sta zpt+1 index pointer. + lda #$04 calc address of entry based + ldx d_entnum on the entry #. +H3689 clc +H368A dex addr = gbuf + ((d_entnum-1) * h_entln) + beq H3696 branch with carry clear = no errors. + adc h_entln + bcc H368A + inc zpt+1 inc hi address. + bcs H3689 always. +H3696 sta zpt newly calculated low address. +crerr3 rts carry set if error. + +drevise lda p8date + beq drevise1 if no clock, then don't mod date/time. + ldx #$03 +modtime lda p8date,x move last modification date/time + sta d_moddt,x to entry being updated. + dex + bpl modtime +drevise1 lda d_attr mark entry as backupable + ora bkbitflg (bit 5 = backup needed) + sta d_attr + lda d_dev get device # of directory + sta devnum to be revised + lda d_entblk and address of direcotry block. + ldx d_entblk+1 + jsr rdblk read block into general purpose buffer + bcs crerr3 + jsr entcalc fix up ptr to entry location within gbuf. + ldy h_entln now move 'd.' info to directory. + dey +H36CA lda d_stor,y + sta (zpt),y + dey + bpl H36CA + lda d_head is the entry block same as + cmp bloknml the entry's header block? + bne H36E0 if no, go save entry block + lda d_head+1 then maybe, so test high addresses. + cmp bloknml+1 + beq uphead branch if they are the same block. +H36E0 jsr wrtgbuf go write updated directory block. + bcs crerr3 + lda d_head get address of header block and + ldx d_head+1 + jsr rdblk go read in header block to modify. + bcs crerr3 +uphead ldy #$01 update current # of files in this dir. +H36F2 lda h_fcnt,y + sta gbuf+37,y (current entry count) + dey + bpl H36F2 + lda h_attr also update header's attributes. + sta gbuf+34 + jsr wrtgbuf go write updated header + bcs H375A +ripple lda gbuf+4 test for 'root' directory because + and #$F0 if it is, then directory revision + eor #$F0 is complete (leaves carry clear). + beq H3770 branch if done. + lda gbuf+41 get entry # + sta d_entnum + lda gbuf+42 and the length of ertries in that dir + sta h_entln + lda gbuf+39 get addr of parent entry's dir block + ldx gbuf+40 + jsr rdblk read it + bcs H375A + jsr entcalc get indirect ptr to parent entry in gbuf + lda p8date don't touch mod + beq H373B if no clock... + ldx #$03 update the modification date & time + ldy #$24 for this entry too +H3732 lda p8date,x + sta (zpt),y + dey + dex + bpl H3732 +H373B jsr wrtgbuf write updated entry back to disk. + bcs H375A if error. + ldy #$25 compare current block # to this + lda (zpt),y entry's header block. + iny + cmp bloknml are low addresses the same? + sta bloknml + bne H3751 branch if entry doesn't reside in same + lda (zpt),y block as header. + cmp bloknml+1 are high address the same? + beq ripple they are the same, continue to root dir. +H3751 lda (zpt),y not same so read in this dir's header. + sta bloknml+1 + jsr rdgbuf + bcc ripple continue if read was good +H375A rts +tsterr lda #$52 not tree or dir, unrecognized type + sec + rts +tstsos lda gbuf pointer to previous dir block + ora gbuf+1 must be null + bne tsterr + lda gbuf+4 test for header + and #$E0 + cmp #$E0 + bne tsterr +H3770 clc no error + rts +*-------------------------------------- MAN SAVE USR/SRC/PRODOS.FX/PRODOS.S.XDOS.A LOAD USR/SRC/PRODOS.FX/PRODOS.S diff --git a/ProDOS.FX/ProDOS.S.XDOS.B.txt b/ProDOS.FX/ProDOS.S.XDOS.B.txt index 4b7fbf70..25cd3a12 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.B.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.B.txt @@ -1,341 +1,72 @@ NEW AUTO 3,1 - -* create file - -create jsr lookfile check for duplicate, get free entry - bcs tstfnf error code may be 'file not found' - lda #MLI.E.DUPFILE name already exists -crerr1 sec - rts - -tstfnf cmp #MLI.E.FNOTFND 'file not found' is ok - bne crerr1 otherwise exit with error. - - ldy #$07 test for tree or directory file, - lda (A3L),y no other kinds are legal. - cmp #$04 is it seed, sapling or tree? - bcc tstdspc branch if it is - - cmp #$0D - bne ctyperr report type error if not directory. - -tstdspc lda devnum make sure destination device - jsr twrprot1 is not write protected. - bcs H351D - - lda nofree is there space in directory to - beq xtndir add this file? branch if not - jmp creat1 otherwise, go create file. - -ctyperr lda #MLI.E.UNSUPST filetype error - sec -H351D rts - -xtndir lda own_blk before extending directory, - ora own_blk+1 make sure it's a subdirectory. - bne H352A - - lda #MLI.E.DIRFULL otherwise, directory full error - sec - rts - -H352A lda bloknml preserve disk address of current (last) - pha directory link, before allocating an - lda bloknml+1 extended block. - pha - jsr alc1blk allocate a block for extending directory - plx - stx bloknml+1 restore block addr of dir info in gbuf - plx - stx bloknml - bcs H351D unable to allocate. - - sta gbuf+2 save block address in y,a to - sty gbuf+3 current directory. - jsr wrtgbuf update directory block with new link. - bcs H351D if error - - ldx #$01 - -swpbloks lda bloknml,x prepare new directory block - sta gbuf,x using current block as back link - lda gbuf+2,x - sta bloknml,x and save new block as next to be written - dex - bpl swpbloks - inx - txa x and a = 0 - -clrdir sta gbuf+2,x - sta gbuf+$100,x - inx - bne clrdir - - jsr wrtgbuf write prepared directory extension. - bcs H351D if error - - lda own_blk - ldx own_blk+1 - jsr rdblk read in parent directory block - ldx own_ent and calc entry address. - lda /gbuf - sta zpt+1 - lda #$04 -ocalc clc - dex has entry address been calulated? - beq H3584 if yes. - adc own_len next entry address - bcc ocalc - inc zpt+1 entry must be in 2nd 256 bytes of block - bcs ocalc always taken. - -H3584 sta zpt - ldy #$13 index to block count -H3588 lda (zpt),y - adc dinctbl-$13,y add 1 to block count and - sta (zpt),y - iny - tya $200 to the directory's eof. - eor #$18 done with usage/eof update? - bne H3588 branch if not. - - jsr wrtgbuf go update parent. - bcs crerr2 - - jmp create -crerr2 rts return and report errors - -creat1 ldx #$00 zero out gbuf -H35A0 stz gbuf,x - stz gbuf+$100,x and data block of file. - inx - bne H35A0 - ldy #$0B move user specified date/time -cmvtime lda (A3L),y to directory. - sta d_filid,y - txa if all 4 bytes of date/time = 0 - ora (A3L),y then use built-in date/time. - tax - dey - cpy #$07 - bne cmvtime - txa does user want default time? - bne cmvname if not. - ldx #$03 -mvdftime lda p8date,x move current default date/time - sta d_credt,x - dex - bpl mvdftime -cmvname lda (A3L),y y = index to file kind. - cmp #$04 - lda #$10 assume tree type - bcc csvfkind - lda #$D0 it's directory. -csvfkind ldx namptr index to local name of pathname. - ora pathbuf,x combine file kind with name length. - sta d_stor sos calls this 'storage type'. - and #$0F strip back to name length - tay and use as counter for move. - clc - adc namptr calc end of name - tax -crname lda pathbuf,x move local name as filename - sta d_stor,y - dex - dey - bne crname - ldy #$03 index to 'access' parameter - lda (A3L),y - sta d_attr - iny also move 'file identification' - lda (A3L),y - sta d_filid -cmvauxid iny move auxillary identification bytes - lda (A3L),y - sta d_auxid-5,y - cpy #$06 - bne cmvauxid - lda xdosver save current xdos version # - sta d_sosver - lda compat and backward compatibility # - sta d_comp - lda #$01 usage is always 1 block - sta d_usage - lda d_head place back pointer to header block - sta d_dhdr - lda d_head+1 - sta d_dhdr+1 - lda d_stor storage type. - and #$E0 is it a directory? - beq cralcblk branch if seed file. - - ldx #$1E move header to data block - -cmvheadr lda d_stor,x - sta gbuf+4,x - dex - bpl cmvheadr - - eor #$30 - sta gbuf+4 make it a directory header mark. - - ldx #$07 overwrite password area and other - -cmvpass lda pass,x header info. - sta gbuf+20,x - - lda xdosver,x - sta gbuf+32,x - dex - bpl cmvpass - - ldx #$02 and include info about parent directory - stx d_eof+1 - -cmvparnt lda d_entblk,x - sta gbuf+39,x - dex - bpl cmvparnt - - lda h_entln lastly, the length of parent's - sta gbuf+42 directory entries. -cralcblk jsr alc1blk get address of file's data block - bcs crerr3 - sta d_frst - sty d_frst+1 - sta bloknml - sty bloknml+1 - jsr wrtgbuf go write data block of file - bcs crerr3 - inc h_fcnt add 1 to total # of files in this dir - bne credone - inc h_fcnt+1 -credone jsr drevise go revise directories with new file - bcs crerr3 - jmp upbmap lastly, update volume bitmap -entcalc lda /gbuf set high address of dir entry - sta zpt+1 index pointer. - lda #$04 calc address of entry based - ldx d_entnum on the entry #. -H3689 clc -H368A dex addr = gbuf + ((d_entnum-1) * h_entln) - beq H3696 branch with carry clear = no errors. - adc h_entln - bcc H368A - inc zpt+1 inc hi address. - bcs H3689 always. -H3696 sta zpt newly calculated low address. -crerr3 rts carry set if error. - -drevise lda p8date - beq drevise1 if no clock, then don't mod date/time. - ldx #$03 -modtime lda p8date,x move last modification date/time - sta d_moddt,x to entry being updated. - dex - bpl modtime -drevise1 lda d_attr mark entry as backupable - ora bkbitflg (bit 5 = backup needed) - sta d_attr - lda d_dev get device # of directory - sta devnum to be revised - lda d_entblk and address of direcotry block. - ldx d_entblk+1 - jsr rdblk read block into general purpose buffer - bcs crerr3 - jsr entcalc fix up ptr to entry location within gbuf. - ldy h_entln now move 'd.' info to directory. - dey -H36CA lda d_stor,y - sta (zpt),y - dey - bpl H36CA - lda d_head is the entry block same as - cmp bloknml the entry's header block? - bne H36E0 if no, go save entry block - lda d_head+1 then maybe, so test high addresses. - cmp bloknml+1 - beq uphead branch if they are the same block. -H36E0 jsr wrtgbuf go write updated directory block. - bcs crerr3 - lda d_head get address of header block and - ldx d_head+1 - jsr rdblk go read in header block to modify. - bcs crerr3 -uphead ldy #$01 update current # of files in this dir. -H36F2 lda h_fcnt,y - sta gbuf+37,y (current entry count) - dey - bpl H36F2 - lda h_attr also update header's attributes. - sta gbuf+34 - jsr wrtgbuf go write updated header - bcs H375A -ripple lda gbuf+4 test for 'root' directory because - and #$F0 if it is, then directory revision - eor #$F0 is complete (leaves carry clear). - beq H3770 branch if done. - lda gbuf+41 get entry # - sta d_entnum - lda gbuf+42 and the length of ertries in that dir - sta h_entln - lda gbuf+39 get addr of parent entry's dir block - ldx gbuf+40 - jsr rdblk read it - bcs H375A - jsr entcalc get indirect ptr to parent entry in gbuf - lda p8date don't touch mod - beq H373B if no clock... - ldx #$03 update the modification date & time - ldy #$24 for this entry too -H3732 lda p8date,x - sta (zpt),y - dey - dex - bpl H3732 -H373B jsr wrtgbuf write updated entry back to disk. - bcs H375A if error. - ldy #$25 compare current block # to this - lda (zpt),y entry's header block. - iny - cmp bloknml are low addresses the same? - sta bloknml - bne H3751 branch if entry doesn't reside in same - lda (zpt),y block as header. - cmp bloknml+1 are high address the same? - beq ripple they are the same, continue to root dir. -H3751 lda (zpt),y not same so read in this dir's header. - sta bloknml+1 - jsr rdgbuf - bcc ripple continue if read was good -H375A rts -tsterr lda #$52 not tree or dir, unrecognized type - sec - rts -tstsos lda gbuf pointer to previous dir block - ora gbuf+1 must be null - bne tsterr - lda gbuf+4 test for header - and #$E0 - cmp #$E0 - bne tsterr -H3770 clc no error - rts +*-------------------------------------- findfile jsr lookfile see if file exists bcs nofind -moventry ldy h_entln -H377A lda (zpt),y move entry into storage - sta d_stor,y - dey - bpl H377A - lda #$00 no errors -nofind rts +moventry ldy h_entln Get FileInfo From Directory Block Buffer + +.1 dey + lda (zpt),y move entry into storage + sta d_stor,y + tya + bne .1 + + .DO LOWERCASE=1 + lda d_stor + and #$F0 + cmp #$F0 + beq .8 + + bit d_sosver + bpl .8 no lowercase bitmap + + lda d_stor + and #$0F + tax + + beq .8 deleted entry + + ldy #0 + +.2 iny + lda whichbit,y + bit d_sosver + beq .3 + + lda d_stor,y + jsr XDOS.ToLower + sta d_stor,y + +.3 dex + beq .8 + + cpy #7 + bne .2 + +.4 iny + lda whichbit-8,y + bit d_comp + beq .5 + + lda d_stor,y + jsr XDOS.ToLower + sta d_stor,y + +.5 iny + dex + bne .4 + .FIN + +.8 lda #$00 no errors + clc +nofind rts +*-------------------------------------- lookfile jsr preproot go find volume bcs fnderr bne lookfil0 branch if more than root + lda /gbuf otherwise, report a bad path error sta zpt+1 (but 1st create a phantom entry lda #$04 for open) @@ -354,29 +85,37 @@ phantm2 lda rootstuf-$10,y dey cpy #$0F bne phantm2 + lda #$D0 fake directory file sta d_stor lda gbuf+2 check forward link. ora gbuf+3 if non-zero, assume full sized directory bne H37C2 else assume it's the slot 3 /RAM volume + lda #$02 so reset eof and blocks_used fields sta d_eof+1 lda #$01 sta d_usage + H37C2 lda #MLI.E.INVPATH bad path (carry set) rts + lookfil0 stz nofree reset free entry indicator. sec dir to be searched has header in this block. L37C9 stz totent reset entry counter. + jsr looknam look for name pointed to by pnptr. bcc namfound if name was found. + lda entcntl have we looked at all of the sbc totent entries in this directory? bcc L37E2 maybe, check hi count. bne L37EB no, read next directory block. + cmp entcnth has the last entry been looked at? beq errfnf yes, give 'file not found' error bne L37EB or branch always. + L37E2 dec entcnth should be at least one bpl L37EB so this should be branch always... @@ -395,18 +134,21 @@ L37FC ldx gbuf+3 acc has value for block# (low). jsr rdblk go read the next linked directory. bcc L37C9 if no error. rts return error in acc. + errfnf lda nofree was any free entry found? bne fnf0 lda gbuf+2 test link bne L3814 cmp gbuf+3 if both are 0 then give up. beq fnf0 report 'not found'. + L3814 sta d_entblk lda gbuf+3 sta d_entblk+1 assume 1st entry of next block lda #$01 is free for use. sta d_entnum mark as valid (for create) sta nofree + fnf0 jsr nxtpnam1 'file not found' or 'path not found'? errpath1 sec if non-zero then 'path not found' beq fnf1 @@ -416,14 +158,16 @@ errpath1 sec if non-zero then 'path not found' fnf1 lda #MLI.E.FNOTFND file not found rts - +*-------------------------------------- namfound jsr nxtpname adj index to next name in path. beq filfound branch if that was the last name. + ldy #$00 be sure this is a directory entry. lda (zpt),y high nibble will tell. and #$F0 cmp #$D0 is it a subdirectory? bne errpath1 error if not. + ldy #$11 get address of 1st subdirectory block lda (zpt),y sta bloknml (no checking done for a valid block#) @@ -443,15 +187,18 @@ namfound jsr nxtpname adj index to next name in path. sec rol L3869 bcc L386C + inx L386C asl bne L3869 + cpx #$05 is password disabled? beq movhead lda #MLI.E.INCFF directory is not compatible fnderr1 sec rts + movhead jsr movhed0 move directory info. jmp lookfil0 do next local pathname. @@ -470,7 +217,7 @@ L3893 lda gbuf+39,x this header. dex bpl L3893 L389C rts - +*-------------------------------------- filfound lda h_maxent figure out which entry # this is sec sbc cntent max entries - count entries + 1 @@ -482,13 +229,17 @@ filfound lda h_maxent figure out which entry # this is sta d_entblk+1 clc rts + looknam lda h_maxent reset count of files per block sta cntent + lda /gbuf sta zpt+1 lda #$04 + L38C1 sta zpt reset indirect pointer to gbuf bcs L38F8 branch if this block contains a header + ldy #$00 lda (zpt),y get length of name in directory. bne isname branch if there is a name. @@ -498,21 +249,37 @@ L38C1 sta zpt reset indirect pointer to gbuf inc nofree indicate a free spot has been found. bne L38F8 always. + isname and #$0F strip byte (is checked by 'filfound') inc totent inc count of valid files found. sta namcnt save name length as counter. + ldx namptr get index to current path. cmp pathbuf,x are both names the same length? bne L38F8 no, inc to next entry. + cmpname inx (first) next letter index iny + + .DO LOWERCASE=0 lda (zpt),y compare names letter by letter cmp pathbuf,x + .ELSE + lda pathbuf,x + jsr XDOS.ToUpper + cmp (zpt),y compare names letter by letter + .FIN bne L38F8 + dec namcnt all letters compared? bne cmpname no, continue. + + .DO LOWERCASEMATCH=1 + .FIN + clc a match is found. noname rts + L38F8 dec cntent checked all entries in this block? sec beq noname yes, no name match. @@ -520,6 +287,7 @@ L38F8 dec cntent checked all entries in this block? clc adc zpt bcc L38C1 branch if still in 1st page. + inc zpt+1 look on 2nd page. clc carry should always be clear before bcc L38C1 looking at next. @@ -548,21 +316,25 @@ L3929 lda vcbbuf+18,x misc info includes dex dey bpl L3929 + nxtpname jsr nxtpnam1 get new namptr in y and namlen in acc. sty namptr save new pathname pointer. rts (status reg according to accumulator) + nxtpnam1 ldy namptr inc pathname pointer to next name lda pathbuf,y in the path. sec adc namptr if this addition results in zero, tay then prefixed directory has been moved bne L395F to another device. branch if not. + lda devnum revise devnum for prefixed directory sta p_dev + L395F lda pathbuf,y test for end of name. clc no errors novolume rts - +*-------------------------------------- findvol lda #$00 ldy preflag use prefix volume name to look up vcb. bit prfxflg is this a prefixed path? @@ -580,14 +352,21 @@ L397C ldy vnptr restore pointer to requested vol name. adc #$20 bcc L3975 branch if more vcb's to check bcs L39D4 otherwise go look for unlogged volumes. + L3987 sta namcnt save length of vol name to be compared. + L398A cmp pathbuf,y is it the same as requested vol name? bne L397C branch if not + inx iny next character lda vcbbuf,x dec namcnt last character? bpl L398A if not. + + .DO LOWERCASEMATCH=1 + .FIN + plx restore pointer to matching vcb. stx vcbptr save it for future reference. lda vcbbuf+16,x get it's device # @@ -596,12 +375,14 @@ L398A cmp pathbuf,y is it the same as requested vol name? lda #$02 that root directory is to be used. sta bloknml lda vnptr = 0 if no prefix. + L39AC tay if prefix then find ptr to prefixed sta namptr dir name. save path ptr. beq L39C2 branch if no prefix. sec adc pathbuf,y inc to next dir in prefix path. bcc L39AC branch if another dir in prefix. + lda p_blok volume verification will occur at sta bloknml subdirectory level. lda p_blok+1 @@ -654,6 +435,7 @@ L3A16 lda #$02 go read root dir into gbuf jsr cmppnam is this the volume ? bcs L39E2 if not L3A29 rts +*-------------------------------------- mvdevnums ldx DEVCNT copy all dev #'s to be checked. L3A2D lda DEVLST,x active device list. and #$F0 strip device type info. @@ -715,6 +497,9 @@ L3A95 cmp pathbuf,y dec namcnt bpl L3A92 if more to compare. + .DO LOWERCASEMATCH=1 + .FIN + clc match found rts @@ -784,6 +569,7 @@ L3B1E sec anticipate different names. clc indicate match. L3B26 ldx xvcbptr offset to start of vcb (rev note #23) rts + tstdupvol lda #$00 check for other logged in volumes with the same name. L3B2C tax jsr cmpvcb @@ -894,6 +680,7 @@ L3C0B tya lsr lsr rts +*-------------------------------------- MAN SAVE USR/SRC/PRODOS.FX/PRODOS.S.XDOS.B LOAD USR/SRC/PRODOS.FX/PRODOS.S diff --git a/ProDOS.FX/ProDOS.S.XDOS.C.txt b/ProDOS.FX/ProDOS.S.XDOS.C.txt index 8d0dea8a..7d39c0d7 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.C.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.C.txt @@ -432,7 +432,8 @@ clrstats ldy fcbptr clear allocation states for data block rts or unnecessary for current position. dirmark cmp #$0D is it a directory ? beq L3F9C yes... - lda #$4A no, so compatability problem. + + lda #MLI.E.INCFF no, so compatability problem. jsr GP.P8errv should not have been opened !!! L3F9C lda scrtch recover results of previous subtraction. @@ -560,40 +561,52 @@ L408D ldy fcbptr change status byte to reflect and fcbbuf+8,y successful disk file update. sta fcbbuf+8,y (carry is unaffected) L4096 rts - -openf jsr findfile look up the file. +*-------------------------------------- +XDOS.Open jsr findfile look up the file. bcc L40A0 if ok. - cmp #$40 is this opening a root directory ? + + cmp #MLI.E.INVPATH is this opening a root directory ? bne L40A7 if not, then error. + L40A0 jsr tstopen are any other files writing to this bcc L40AD same file ? branch if not. -L40A5 lda #$50 file is busy, shared access not allowed. + +L40A5 lda #MLI.E.OPEN file is busy, shared access not allowed. L40A7 sec rts -L40A9 lda #$4B file is wrong storage type. + +L40A9 lda #MLI.E.UNSUPST file is wrong storage type. sec rts + L40AD ldy fcbptr get address of 1st free fcb found. lda fcbflg if this byte <> 0 then free fcb found bne L40B9 and available for use. - lda #$42 fcb full error. + + lda #MLI.E.FCBFULL fcb full error. sec rts + L40B9 ldx #$1F assign fcb, - lda #$00 but clean it first. -L40BD sta fcbbuf,y + + lda #0 + +L40BD sta fcbbuf,y but clean it first. 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 fcbbuf,y note: this code depends upon the defined dey order of both the fcb and directory dex entry buffer. bne L40CB + lda d_stor get storage type and lsr strip off file name length lsr by dividing by 16. @@ -609,13 +622,18 @@ L40CB lda d_dev-1,x move ownership info. L40EB sta fcbbuf+9,y and #$02 check for write enabled request. beq L40F7 branch for open as read-only + lda totent otherwise, be sure no one else is bne L40A5 reading the same file. branch if busy. + L40F7 cpx #$04 is it a tree file type ? bcc L40FF yes. + cpx #$0D is it a directory type ? bne L40A9 if not, wrong storage type. + L40FF ldx #$06 move address of 1st block of file, end + L4101 sta bloknml+1 of file and current usage count. lda fcbptr ora ofcbtbl,x this is done via a translation table diff --git a/ProDOS.FX/ProDOS.S.XDOS.E.txt b/ProDOS.FX/ProDOS.S.XDOS.E.txt index 3dc296a3..ff9bc14b 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.E.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.E.txt @@ -1,9 +1,7 @@ NEW AUTO 3,1 - -* close command - -closef ldy #$01 close all ? +*-------------------------------------- +XDOS.Close ldy #$01 close all ? lda (A3L),y bne L4683 no, just one of them. sta cferr clear global close error. @@ -51,10 +49,8 @@ close2 ldy fcbptr L46B4 clc rts L46B6 bcs L46E6 don't report close all error now. - -* flush command - -flushf ldy #$01 flush all ? +*-------------------------------------- +XDOS.Flush ldy #$01 flush all ? lda (A3L),y bne flush1 no, just one of them. sta cferr clear global flush error. @@ -125,7 +121,9 @@ L474E sta bloknml sty bloknml+1 jsr rdgbuf get block with file entry in general L4755 jsr entcalc buffer. set up pointer to entry. + jsr moventry move entry to temp entry buffer in + ldy fcbptr 'work space'. update 'blocks used' count lda fcbbuf+24,y sta d_usage @@ -374,12 +372,15 @@ newline ldy #$02 adjust newline status for open file. sta fcbbuf+10,x clc no error possible rts - -getinfo jsr findfile look for file. +*-------------------------------------- +XDOS.GetFileInfo + jsr findfile look for file. bcc L4988 no error. + cmp #$40 was it a root directory file ? sec (in case of no match) bne L49A4 if not, then error. + lda #$F0 sta d_stor for get info, report proper storage stz reql type. forca a count of free blocks. @@ -402,13 +403,16 @@ getinfo jsr findfile look for file. pla sbc reqh sta d_usage+1 + L4988 lda d_stor 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 d_stor + ldy #$11 index to last of user's spec table. + L4994 lda inftabl-3,y and #$7F strip bit used by setinfo tax @@ -417,90 +421,125 @@ L4994 lda inftabl-3,y dey cpy #$03 bcs L4994 if all info bytes moved, retn carry clr -L49A4 rts -setinfo jsr findfile get the file to work on. +L49A4 rts +*-------------------------------------- +XDOS.SetFileInfo + jsr findfile get the file to work on. bcs L49CF if error. + lda bubit see if backup bit can be cleared eor #$20 and d_attr and #$20 sta bkbitflg or preserve current... + ldy #$0D init pointer to user supplied list. + L49B9 ldx inftabl-3,y get index to corresponding 'd.' table. bmi L49C3 branch if parameter can't be set. + lda (A3L),y sta d_stor,x + L49C3 dey has user's request been satisfied ? cpy #$03 bcs L49B9 no, move next byte. + and #$18 make sure no illegal access bits were beq L49D0 set !! branch if legal access. + lda #$4E otherwise, access error. sec L49CF rts + L49D0 ldy #$0B lda (A3L),y was clock null input ? beq L49D9 if yes. + jmp drevise1 end by updating directory. L49D9 jmp drevise update with clock also... - -rename jsr lookfile look for source (original) file. +*-------------------------------------- +XDOS.Rename jsr lookfile look for source (original) file. bcc L4A1E if found. + cmp #$40 trying to rename a volume ? bne L49FD no, return error. + jsr renpath syntax new name. bcs L49FD rename error. + ldy pathbuf find out if only rootname for new name iny lda pathbuf,y must be $FF if volume name only. bne L4A72 if not single name + ldx vcbptr check for open files before changing. lda vcbbuf+17,x bpl L49FF if volume not busy. + lda #$50 file busy error. L49FD sec rts + L49FF ldy #$00 get newname's length lda pathbuf,y ora #$F0 (root file storage type) jsr mvrotnam update root directory. bcs L4A74 rename error. + ldy #$00 ldx vcbptr update vcb also. + L4A10 lda pathbuf,y move new name to vcb. beq L4A1C sta vcbbuf,x iny next character inx bne L4A10 always. + L4A1C clc no errors rts +*-------------------------------------- L4A1E jsr getnamptr set y = 1st char of path, x = 0. + L4A21 lda pathbuf,y move original name to gbuf sta gbuf,x for later comparison to new name. bmi L4A2D if last character has been moved iny otherwise, get the next one. inx - bne L4A21 always. + bra L4A21 always. + L4A2D jsr renpath get new name syntaxed. bcs L4A74 rename error. + jsr getnamptr set y = path, x = 0. + lda pathbuf,y now compare new name with old name + L4A38 cmp 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 pathbuf,y was it the last character ? bne L4A38 if not. + + .DO LOWERCASE=1 + + + + .FIN + clc no operation, names were the same. rts + L4A52 ldy rnptr index to last name in the chain. lda pathbuf,y get last name length. sec @@ -508,6 +547,7 @@ L4A52 ldy rnptr index to last name in the chain. tay lda pathbuf,y this byte should be $00 ! bne L4A72 if not, bad path error. + ldx namptr index to last of original name lda gbuf,x sec @@ -515,48 +555,62 @@ L4A52 ldy rnptr index to last name in the chain. tax lda gbuf,x this byte should also be $00. beq L4A76 if so, continue processing. -L4A72 lda #$40 bad pathname error. + +L4A72 lda #MLI.E.INVPATH bad pathname error. L4A74 sec rts + L4A76 jsr lookfile test for duplicate file name. bcs L4A7F branch if file not found, which is ok !! - lda #$47 duplicate name error. + lda #MLI.E.DUPFILE duplicate name error. sec rts -L4A7F cmp #$46 was it a valid file not found ? + +L4A7F cmp #MLI.E.FNOTFND was it a valid file not found ? bne L4A74 no, rename error. + jsr setpath syntax pathname of file to be changed. jsr findfile get all the info on this file. bcs L4A74 rename error. + jsr tstopen is file in use ? - lda #$50 anticipate file busy error. + lda #MLI.E.OPEN anticipate file busy error. bcs L4A74 error if in use. + lda d_attr test bit which allows rename. and #$40 bne L4A9D branch if ok to rename - lda #$4E otherwise, illegal access. + + lda #MLI.E.LOCKED otherwise, illegal access. L4A9B sec rts + L4A9D lda d_stor 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 ? bcc L4AAE then ok. - lda #$4A file incompatible error. + + lda #MLI.E.INCFF file incompatible error. bne L4A9B always. + L4AAE jsr renpath 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 pathbuf,y length. adj y to last char of new name. tya tya adc pathbuf,y tay + L4ABE lda pathbuf,y move local name to dir entry workspace. sta d_stor,x dey dex bne L4ABE + lda d_stor preserve file storage type. and #$F0 strip off old name length. tax @@ -564,15 +618,19 @@ L4ABE lda pathbuf,y move local name to dir entry workspace. sta d_stor cpx #$D0 that file must be changed also. bne L4AF0 branch if not directory type. + lda d_frst read in 1st header block of subdir ldx d_frst+1 + jsr rdblk bcs L4A74 errors. + ldy rnptr change the header's name to match the lda pathbuf,y owner's new name. get local name length. ora #$E0 assume it's a header. jsr mvrotnam bcs L4A74 + L4AF0 jmp drevise1 end by updating all path directories. mvrotnam ldx #$00 @@ -582,6 +640,7 @@ L4AF5 sta gbuf+4,x lda pathbuf,y bne L4AF5 jmp wrtgbuf write changed header block. + renpath ldy #$03 get address to new pathname lda (A3L),y iny diff --git a/ProDOS.FX/ProDOS.S.XDOS.F.txt b/ProDOS.FX/ProDOS.S.XDOS.F.txt index 2e781b17..116cfffb 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.F.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.F.txt @@ -1,17 +1,21 @@ NEW AUTO 3,1 *-------------------------------------- -destroy jsr findfile look for file to be destroyed. +XDOS.Destroy jsr findfile look for file to be destroyed. bcs L4B66 if error. + jsr tstopen 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 jsr tstfrblk proper) bcc L4B39 no errors. - cmp #$48 was error a full disk ? + + cmp #MLI.E.VOLFULL was error a full disk ? bne L4B66 no, report error. + L4B39 lda d_attr make sure ok to destroy file. and #$80 bne L4B45 branch if ok to destroy. @@ -21,6 +25,7 @@ L4B39 lda d_attr make sure ok to destroy file. L4B45 lda devnum last device used. jsr twrprot1 test for write protected hardware bcs L4B66 before going thru deallocation. + lda d_frst 'detree' needs first block address sta firstbl lda d_frst+1 @@ -30,31 +35,39 @@ L4B45 lda devnum last device used. cmp #$40 is it a seed, sapling or tree ? bcc L4B68 branch if it is. bra L4BCF otherwise, test for directory destroy. -L4B64 lda #$50 file busy error. + +L4B64 lda #MLI.E.OPEN file busy error. L4B66 sec can't be destroyed rts + L4B68 sta stortyp destroy a tree file. save storage type. ldx #$05 lda #$00 set 'detree' input variables, must be + L4B6F sta 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 dealloc bcs L4B93 + jsr upbmap + L4B93 pha save possible error code. lda #$00 update directory to free entry space. sta d_stor cmp h_fcnt file entry wrap ? bne L4BA1 branch if no carry adjustment. + dec h_fcnt+1 take carry from hi byte of file entries. L4BA1 dec h_fcnt mark header with one less file. jsr dvcbrev go update block count in vcb (ignore @@ -63,8 +76,10 @@ L4BA1 dec h_fcnt mark header with one less file. 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 + dvcbrev ldy vcbptr update block free count in vcb. point to vcb of correct device. lda deblock get # of blocks recently freed. adc vcbbuf+20,y @@ -75,31 +90,41 @@ dvcbrev ldy vcbptr update block free count in vcb. point to vcb of correct lda #$00 force re-scan from 1st bitmap sta vcbbuf+28,y rts + L4BCD bcc L4B85 branch widened (always taken) + L4BCF cmp #$D0 is this a directory file ? bne L4C1B no, file incompatible. + jsr fndbmap make sure a buffer available for bitmap bcs L4C1A if error. + lda d_frst read 1st block of directory into gbuf sta bloknml lda d_frst+1 sta bloknml+1 jsr rdgbuf bcs L4C1A + lda gbuf+37 do any files exist in this directory ? bne L4BF1 if so, access error. + lda gbuf+38 beq L4BF6 -L4BF1 lda #$4E access error. + +L4BF1 lda #MLI.E.LOCKED access error. jsr GP.P8errv + L4BF6 sta gbuf+4 make it an invalid subdirectory jsr wrtgbuf bcs L4C1A + L4BFE lda gbuf+2 get forward link. cmp #$01 test for null block into carry. ldx 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 dealloc free this block. bcs L4C1A lda gbuf+2 @@ -107,6 +132,7 @@ L4C0A jsr dealloc free this block. jsr rdblk bcc L4BFE loop until all freed L4C1A rts + L4C1B lda #MLI.E.INCFF file incompatible jsr GP.P8errv @@ -415,11 +441,11 @@ L4E43 dex drop to next lower page. bne L4E43 no. L4E54 clc no error. rts - +*-------------------------------------- * calculate memory allocation bit position. * on entry: x = high address of buffer, low address assumed zero. * on exit: acc = allocation bit mask, x = unchanged, y = pointer to memtabl byte - +*-------------------------------------- cmembit txa page address and #$07 which page in any 2k set ? tay use as index to determine @@ -432,6 +458,7 @@ cmembit txa page address tay return it in y. pla restore bit mask. return bit position rts in a & y, pointer to memtabl in x. + valdbuf lda usrbuf+1 high address of user's buffer cmp #$02 must be greater than page 2. bcc L4E1E report bad buffer @@ -484,9 +511,52 @@ L4EB8 lda (usrbuf),y move all 4 pages of the buffer to inc usrbuf+1 dex bpl L4EB8 +cmembit.CLCRTS clc no errors L4EC7 rts *-------------------------------------- +XDOS.IsValidChar + cmp #'0' + bcc XDOS.IsValidFirstChar + cmp #'9'+1 + bcc XDOS.IsValidFirstChar.RTS +XDOS.IsValidFirstChar + .DO ENHFILENAME=1 + cmp #'.' + beq cmembit.CLCRTS + cmp #'_' + beq cmembit.CLCRTS + .FIN + cmp #'A' + bcc XDOS.IsValidFirstChar.SEC + cmp #'Z'+1 + .DO LOWERCASE=1 + bcc XDOS.IsValidFirstChar.RTS + cmp #'a' + bcc XDOS.IsValidFirstChar.SEC + cmp #'z'+1 + .FIN +XDOS.IsValidFirstChar.RTS + rts + +XDOS.IsValidFirstChar.SEC + sec + rts +*-------------------------------------- +XDOS.ToUpper cmp #'a' + bcc .8 + cmp #'z'+1 + bcs .8 + eor #$20 +.8 rts +*-------------------------------------- +XDOS.ToLower cmp #'A' + bcc .8 + cmp #'Z'+1 + bcs .8 + eor #$20 +.8 rts +*-------------------------------------- * move 3 pages of dispatcher from 'displc2' to 'dispadr' * this move routine must be resident above $E000 at all times *-------------------------------------- @@ -608,20 +678,21 @@ pcntbl .HS 02FFFFFF parameter counts for the calls .HS 04070102070A0201 .HS 0103030404010102 .HS 02FF020202 -cmdtable .DA create - .DA destroy - .DA rename - .DA setinfo - .DA getinfo - .DA online - .DA setprefx - .DA getprefx - .DA openf + +cmdtable .DA XDOS.Create + .DA XDOS.Destroy + .DA XDOS.Rename + .DA XDOS.SetFileInfo + .DA XDOS.GetFileInfo + .DA XDOS.Online + .DA XDOS.SetPrefix + .DA XDOS.GetPrefix + .DA XDOS.Open .DA newline .DA readf .DA writef - .DA closef - .DA flushf + .DA XDOS.Close + .DA XDOS.Flush .DA setmark .DA getmark .DA seteof @@ -659,6 +730,7 @@ XDOS.DATA .DUMMY own_blk .HS 0000 own_ent .HS 00 own_len .HS 00 + h_credt .HS 0000 directory creation date .HS 0000 directory creation time .HS 00 version under which this dir created @@ -669,6 +741,7 @@ h_maxent .HS 00 maximum number of entries per block h_fcnt .HS 0000 current # of files in this directory h_bmap .HS 0000 address of first allocation bitmap h_tblk .HS 0000 total number of blocks on this unit + d_dev .HS 00 device number of this directory entry d_head .HS 0000 address of directory header d_entblk .HS 0000 address of block which contains entry diff --git a/ProDOS.FX/ProDOS.S.XRW.txt b/ProDOS.FX/ProDOS.S.XRW.txt index 2f116f07..a9e64a09 100644 --- a/ProDOS.FX/ProDOS.S.XRW.txt +++ b/ProDOS.FX/ProDOS.S.XRW.txt @@ -1,8 +1,6 @@ NEW AUTO 3,1 *-------------------------------------- -FASTSEEK .EQ 0 -*-------------------------------------- XRW.START cld $D8 to flag language card bank 1 (main) jsr rsetphse lda q7l,x turn off write enable @@ -10,14 +8,19 @@ XRW.START cld $D8 to flag language card bank 1 (main) nop jsr docheck bcs L5334 branch if block # is out of range + ldy #$05 + L5310 asl rol ibtrk dey bne L5310 + asl bcc L531C + ora #$10 adjust for upper 4 bits of track + L531C lsr lsr lsr @@ -26,12 +29,16 @@ L531C lsr jsr regrwts pla bcs L5330 if error + inc buf+1 adc #$02 jsr regrwts get 2nd half of block + dec buf+1 + L5330 lda ibstat rts + L5334 lda #MLI.E.IO sec rts @@ -859,12 +866,14 @@ prn3 lda $10AC,y warning: self modified. get byte from highest group. sta nbuf2,x save in nibl buffer. iny inc to next set. bne prn1 loop until all $56 nibls formed. + ldy buf now prepare data bytes for write16 subr. dey prepare end address. sty A2H lda buf sta wrefd1+1 warning: the following storage addresses beq L595F starting with 'wref' are refs into code + eor #$FF space, changed by this routine. tay index to last byte of page in (buf). lda (buf),y pre-niblize the last byte of the page @@ -873,9 +882,11 @@ prn3 lda $10AC,y warning: self modified. get byte from highest group. and #$FC tax lda nibl,x get disk 7-bit nible equivalent. + L595F sta pch - beq L596F branch if data to be written is page - lda A2H aligned. check if last byte is even + beq L596F branch if data to be written is page aligned. + + lda A2H check if last byte is even lsr or odd address. shift even/odd -> carry. lda (buf),y if even, then leave intact. bcc L596D branch if odd. diff --git a/ProDOS.FX/ProDOS.S.txt b/ProDOS.FX/ProDOS.S.txt index 981f6a08..77f0b0bf 100644 --- a/ProDOS.FX/ProDOS.S.txt +++ b/ProDOS.FX/ProDOS.S.txt @@ -4,6 +4,12 @@ NEW .OP 65816 .OR $2000 .TF PRODOS.FX,TSYS +*-------------------------------------- +ENHFILENAME .EQ 1 +LOWERCASE .EQ 1 +LOWERCASEMATCH .EQ 0 +FASTSEEK .EQ 0 +FASTWRITE .EQ 0 *-------------------------------------- .INB INC/ZP.I .INB INC/IO.I @@ -113,15 +119,10 @@ txtp2 .EQ $0400 test location for aux card vmode .EQ $04FB video firmware operating mode ch80col .EQ $057B 80 column ch position -vline5 .EQ $0600 line 5 of display -vline10 .EQ $04A8 line 10 of display vline11 .EQ $0528 line 11 of display vline12 .EQ $05A8 line 12 of display vline13 .EQ $0628 line 13 of display -vline14 .EQ $06A8 line 14 of display vline16 .EQ $07A8 line 16 of display -vline23 .EQ $0750 line 23 of display -vline24 .EQ $07D0 line 24 of display dbuf .EQ $0C00 8 page directory buffer vblock1 .EQ $0E00 ramdisk directory block @@ -163,6 +164,12 @@ ZPBLLenBits .BS 1 .ED *-------------------------------------- .INB USR/SRC/PRODOS.FX/PRODOS.S.LDR +X.Unpak.XatYA sty ZPOutBufPtr + sta ZPOutBufPtr+1 + lda PAKME.Table,x + sta ZPInBufPtr + lda PAKME.Table+1,x + sta ZPInBufPtr+1 .INB USR/SRC/SHARED/X.UNPAK.S *-------------------------------------- PAKME.Table diff --git a/SYS/KM.RAMWORKS.S.txt b/SYS/KM.RAMWORKS.S.txt index 3380ca7c..e2d7dabd 100644 --- a/SYS/KM.RAMWORKS.S.txt +++ b/SYS/KM.RAMWORKS.S.txt @@ -3,7 +3,7 @@ NEW .LIST OFF .OP 65C02 .OR $2000 - .TF SYS/KM.RAMWORKS + .TF SYS/KM/KM.RAMWORKS *-------------------------------------- .INB INC/MACROS.I .INB INC/IO.I