diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index c6af2dd2..04ea810b 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -29,14 +29,14 @@ pDrv .EQ $18 pPs .EQ $1A pDev .EQ $1C pEvent .EQ $1E - +*-------------------------------------- +* $3A-$3F ProDOS Block Device Drivers Main +* $5E-$C8 RESERVED APPLESOFT Main/Aux (ROM Call, no need to switch back MainZP) +*-------------------------------------- ZPDRV .EQ $80 ZPBIN .EQ $90 ZPLIB .EQ $A0 32 bytes for TCPIP *-------------------------------------- -* !!!!!!! RESERVED APPLESOFT.I !!!!!!! -* $5E -> $C8 -*-------------------------------------- R.VCPU16 .EQ $F0 R.AX .EQ R.VCPU16 R.AL .EQ R.VCPU16 @@ -297,51 +297,10 @@ SYS.MKDIRYA .EQ $FA SYS.MKNOD .EQ $FC SYS.MKFIFO .EQ $FE *-------------------------------------- -S.FINFO.ACCESS .EQ $00 -S.FINFO.TYPE .EQ $01 -S.FINFO.AUXTYPE .EQ $02 -S.FINFO.STORETYPE .EQ $04 -S.FINFO.BLOCKSUSED .EQ $05 -S.FINFO.MODDATE .EQ $07 -S.FINFO.MODTIME .EQ $09 -S.FINFO.CREATEDATE .EQ $0B -S.FINFO.CREATETIME .EQ $0D -S.FINFO .EQ $0F -*-------------------------------------- * ProDOS ERROR CODES : $00->$5F * Lib ERROR CODES : $80->$BF * Kernel ERROR CODES : $C0->$FF *-------------------------------------- -*$00 - No Error -*$01 - Bad Call Number -*$04 - Bad Parameter Count -*$25 - Interrupt Table Full -*$27 - I/O Error -*$28 - No Device Connected -*$2B - Write Protected -*$2E - Disk Switched -*$40 - Invalid Pathname -*$42 - Maximum Number of Files Open -*$43 - Invalid Reference Number -*$44 - Directory Not Found -*$45 - Volume Not Found -*$46 - File Not Found -*$47 - Duplicate File Name -*$48 - Volume Full -*$49 - Directory Full -*$4A - Incompatible File Format -*$4B - Unsupported Storage Type -*$4C - End of File, No More Data -*$4D - Beyond EOF -*$4E - File Access Error, File Locked -*$50 - File Already Open -*$51 - Directory Structure Damaged -*$53 - Invalid Parameter -*$55 - Too Many Volumes -*$56 - Bad Buffer Address -*$57 - Duplicate Volume -*$5A - File Structure Damaged -*-------------------------------------- MEMMGR.ERROOM .EQ $FF Out Of Memory Error MEMMGR.ERROOH .EQ $FE Out Of Handle Error *-------------------------------------- @@ -549,8 +508,10 @@ S.STAT.MTIME .EQ 26 DWORD S.STAT.CTIME .EQ 30 DWORD S.STAT.BLOCKS .EQ 34 DWORD S.STAT.BLKSIZE .EQ 38 WORD +S.STAT.TYPE .EQ 40 +S.STAT.AUXTYPE .EQ 41 * -S.STAT .EQ 40 +S.STAT .EQ 43 *-------------------------------------- * S.FILE for FOPEN,FREAD...... *-------------------------------------- @@ -574,7 +535,8 @@ S.FILE.PRODOS .EQ 4 * S.DIR for OpenDir,ReadDir,CloseDir *-------------------------------------- S.DIR.HANDLER .EQ 0 - +S.DIR.F .EQ 1 +S.DIR.F.NOMORE .EQ $80 S.DIR.PRODOS.REF .EQ 2 S.DIR.PRODOS.IOBUF .EQ 3 @@ -583,10 +545,9 @@ S.DIR.PRODOS .EQ 4 *-------------------------------------- * S.DIRENT for ReadDir *-------------------------------------- -S.DIRENT.STAT .EQ 0 -S.DIRENT.NAME .EQ S.STAT -* -S.DIRENT.PRODOS .EQ S.STAT+16 PSTR (LEN+15 MAX) +S.DIRENT.NAME .EQ 0 +* Variable size +S.DIRENT.STAT .EQ S.STAT *-------------------------------------- S.PFT.PATH .EQ 0 S.PFT.HANDLER .EQ 23 diff --git a/INC/PRODOS.I.txt b/INC/PRODOS.I.txt index 0882f6cc..2b4ffa69 100644 --- a/INC/PRODOS.I.txt +++ b/INC/PRODOS.I.txt @@ -39,6 +39,55 @@ MLIGETEOF .EQ $D1 MLISETBUF .EQ $D2 MLIGETBUF .EQ $D3 *-------------------------------------- +S.FILEINFO.ACCESS .EQ $03 +S.FILEINFO.ACCESS.R .EQ $01 +S.FILEINFO.ACCESS.W .EQ $02 +S.FILEINFO.ACCESS.B .EQ $20 +S.FILEINFO.ACCESS.RN .EQ $40 +S.FILEINFO.ACCESS.D .EQ $80 +S.FILEINFO.ACCESS.FULL .EQ $C3 +S.FILEINFO.TYPE .EQ $04 +S.FILEINFO.AUXTYPE .EQ $05 +S.FILEINFO.TOTALBLOCKS .EQ $05 +S.FILEINFO.STORETYPE .EQ $07 +S.FILEINFO.BLOCKSUSED .EQ $08 +S.FILEINFO.MODDATE .EQ $0A +S.FILEINFO.MODTIME .EQ $0C +S.FILEINFO.CREATEDATE .EQ $0E +S.FILEINFO.CREATETIME .EQ $10 +* +S.FILEINFO .EQ $12 +*-------------------------------------- +*$00 - No Error +*$01 - Bad Call Number +*$04 - Bad Parameter Count +*$25 - Interrupt Table Full +*$27 - I/O Error +*$28 - No Device Connected +*$2B - Write Protected +*$2E - Disk Switched +*$40 - Invalid Pathname +*$42 - Maximum Number of Files Open +*$43 - Invalid Reference Number +*$44 - Directory Not Found +*$45 - Volume Not Found +*$46 - File Not Found +*$47 - Duplicate File Name +*$48 - Volume Full +*$49 - Directory Full +*$4A - Incompatible File Format +*$4B - Unsupported Storage Type +*$4C - End of File, No More Data +*$4D - Beyond EOF +*$4E - File Access Error, File Locked +*$50 - File Already Open +*$51 - Directory Structure Damaged +*$53 - Invalid Parameter +*$55 - Too Many Volumes +*$56 - Bad Buffer Address +*$57 - Duplicate Volume +*$5A - File Structure Damaged +*-------------------------------------- MLI.ERR.BADCALL .EQ $01 MLI.ERR.BADCNT .EQ $04 MLI.ERR.IRQFULL .EQ $25 @@ -56,7 +105,6 @@ MLI.ERR.DUPFILE .EQ $47 MLI.ERR.OVERRUN .EQ $48 MLI.ERR.VOLFULL .EQ $49 MLI.ERR.EOF .EQ $4C - *-------------------------------------- MLI .EQ $BF00 JSPARE .EQ $BF03 @@ -97,21 +145,19 @@ LEVEL .EQ $BF94 BUBIT .EQ $BF95 SPARE1 .EQ $BF96 MACHID .EQ $BF98 -*-------------------------------------- -MACHID.TYPE .EQ %11001000 -MACHID.TYPE.II .EQ %00000000 -MACHID.TYPE.IIp .EQ %01000000 -MACHID.TYPE.IIe .EQ %10000000 -MACHID.TYPE.IIc .EQ %10001000 -MACHID.TYPE.III .EQ %11000000 -MACHID.RAM .EQ %00110000 -MACHID.RAM.128 .EQ %00110000 -MACHID.RAM.64 .EQ %00100000 -MACHID.RAM.48 .EQ %00010000 -MACHID.SPARE .EQ %00000100 -MACHID.COL80 .EQ %00000010 -MACHID.CLK .EQ %00000001 -*-------------------------------------- +MACHID.TYPE .EQ %11001000 +MACHID.TYPE.II .EQ %00000000 +MACHID.TYPE.IIp .EQ %01000000 +MACHID.TYPE.IIe .EQ %10000000 +MACHID.TYPE.IIc .EQ %10001000 +MACHID.TYPE.III .EQ %11000000 +MACHID.RAM .EQ %00110000 +MACHID.RAM.128 .EQ %00110000 +MACHID.RAM.64 .EQ %00100000 +MACHID.RAM.48 .EQ %00010000 +MACHID.SPARE .EQ %00000100 +MACHID.COL80 .EQ %00000010 +MACHID.CLK .EQ %00000001 SLTBYT .EQ $BF99 PFIXPTR .EQ $BF9A MLIACTV .EQ $BF9B diff --git a/SYS/KERNEL.S.DIR.txt b/SYS/KERNEL.S.DIR.txt index 3afac006..b6127b7a 100644 --- a/SYS/KERNEL.S.DIR.txt +++ b/SYS/KERNEL.S.DIR.txt @@ -74,81 +74,162 @@ hDIR .BS 1 S.READDIRA jsr S.PFTCHECKDIRA jsr S.GetMemPtrA >STYA ZPQuickPtr1 + + ldy #S.DIR.F + lda (ZPQuickPtr1),y + and #S.DIR.F.NOMORE + bne .9 + ldy #S.DIR.PRODOS.REF lda (ZPQuickPtr1),y beq S.READDIRA.ROOT jmp S.READDIRA.DIR -S.READDIRA.ROOT >PUSHWI 256 Get Buffer for ONLINE call - >PUSHBI 0 - jsr S.GetMem - bcs .99 - >STYA ZPQuickPtr2 - stx hONLINE - stz MLICALL.PARAMS+1 - >STYA MLICALL.PARAMS+2 - >MLICALL MLIONLINE - bcs .98 +.9 lda #0 + sec CS,A=0 no more entry +S.READDIRA.RTS rts - lda #1 Ending 0 +S.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes + >LDYAI KrnBuffer256 + >STYA MLICALL.PARAMS+2 + >STYA ZPQuickPtr2 For PASS #2 + >MLICALL MLIONLINE + bcs S.READDIRA.RTS + + lda #1 +1 for Ending 0 sta BufSize stz BufSize+1 ldy #0 -.1 lda (ZPQuickPtr2),y +.1 lda KrnBuffer256,y and #$0F beq .2 - sec Add Filelen +1 - adc BufSize - sta BufSize - lda #0 + sec Add Filelen +1 adc BufSize sta BufSize + bcc .11 + inc BufSize+1 - lda #S.STAT +.11 lda #S.STAT adc BufSize sta BufSize - lda /S.STAT - adc BufSize+1 - sta BufSize+1 - - inx + bcc .12 + inc BufSize+1 + +.12 inx .2 tya clc adc #16 tay - bcc .1 + bcc .1 loop until 256 bytes scanned txa - beq .99 A=0, CS no more DIRENT + beq S.READDIRA.RTS A=0, CS no more DIRENT + sta EntryCount + >PUSHW BufSize - >PUSHBI 0 + >PUSHBI S.MEM.F.INIT0 jsr S.GetMem - bcs .98 + bcs S.READDIRA.RTS + stx hDIRENT >STYA ZPQuickPtr3 >STYA ZPQuickPtr4 - ldy #0 - -.1 lda (ZPQuickPtr2),y +.3 lda (ZPQuickPtr2) and #$0F - beq .2 + beq .88 + tay + tax + sta (ZPQuickPtr3) + inc + sta VolName Build a string with leading / for GetFileInfo +.4 lda (ZPQuickPtr2),y + sta (ZPQuickPtr3),y + sta VolName+1,y + dey + bne .4 + lda #'/' + sta VolName+1 - lda #0 A=0, CS no more DIRENT - -.98 pha - lda hONLINE - jsr S.FreeMemA - pla + txa sec -.99 rts + adc ZPQuickPtr3 + sta ZPQuickPtr3 + bcc .41 + inc ZPQuickPtr3+1 + +.41 >LDYAI VolName + >STYA MLICALL.PARAMS+1 + >MLICALL MLIGETFILEINFO + bcs .80 + + lda MLICALL.PARAMS+S.FILEINFO.ACCESS + cmp #S.FILEINFO.ACCESS.FULL + bne .5 + + lda #S.STAT.MODE.XO+S.STAT.MODE.WO+S.STAT.MODE.RO + bra .6 + +.5 and #S.FILEINFO.ACCESS.R + beq .6 + lda #S.STAT.MODE.XO+S.STAT.MODE.RO + +.6 ldy #S.STAT.MODE + sta (ZPQuickPtr3),y + + ldy #S.STAT.BLOCKS + lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE + sta (ZPQuickPtr3),y + iny + lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE + sta (ZPQuickPtr3),y + ldy #S.STAT.BLKSIZE+1 + lda #2 Block size is $200 for ProDOS + sta (ZPQuickPtr3),y + +.80 lda ZPQuickPtr3 + clc + adc #S.STAT + sta ZPQuickPtr3 + bcc .88 + inc ZPQuickPtr3+1 + +.88 lda ZPQuickPtr2 + clc + adc #16 + sta ZPQuickPtr2 + bcc .89 + inc ZPQuickPtr2+1 +.89 dec EntryCount + bne .3 + + lda #0 + sta (ZPQuickPtr3) Ending 0 + + ldy #S.DIR.F + lda #S.DIR.F.NOMORE + sta (ZPQuickPtr1),y + + ldx hDIRENT + >LDYA ZPQuickPtr4 + clc + rts S.READDIRA.DIR + ldx #3 + ldy #S.STAT.TYPE + +.7 lda MLICALL.PARAMS+S.FILEINFO.TYPE,x + sta (ZPQuickPtr3),y + iny + dex + bne .7 + clc rts *-------------------------------------- @@ -177,7 +258,10 @@ S.CLOSEDIRA.1 ldy #S.DIR.PRODOS.REF rts *-------------------------------------- hONLINE .BS 1 +hDIRENT .BS 1 BufSize .BS 2 +EntryCount .BS 1 +VolName .BS 17 *-------------------------------------- MAN SAVE SYS/KERNEL.S.DIR