FILE/DIR API (Work In Progress)

This commit is contained in:
Rémy GIBERT 2016-09-02 17:14:24 +02:00
parent ddfad8ff84
commit fe5b0ac0bf
3 changed files with 195 additions and 104 deletions

View File

@ -29,14 +29,14 @@ pDrv .EQ $18
pPs .EQ $1A pPs .EQ $1A
pDev .EQ $1C pDev .EQ $1C
pEvent .EQ $1E 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 ZPDRV .EQ $80
ZPBIN .EQ $90 ZPBIN .EQ $90
ZPLIB .EQ $A0 32 bytes for TCPIP ZPLIB .EQ $A0 32 bytes for TCPIP
*-------------------------------------- *--------------------------------------
* !!!!!!! RESERVED APPLESOFT.I !!!!!!!
* $5E -> $C8
*--------------------------------------
R.VCPU16 .EQ $F0 R.VCPU16 .EQ $F0
R.AX .EQ R.VCPU16 R.AX .EQ R.VCPU16
R.AL .EQ R.VCPU16 R.AL .EQ R.VCPU16
@ -297,51 +297,10 @@ SYS.MKDIRYA .EQ $FA
SYS.MKNOD .EQ $FC SYS.MKNOD .EQ $FC
SYS.MKFIFO .EQ $FE 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 * ProDOS ERROR CODES : $00->$5F
* Lib ERROR CODES : $80->$BF * Lib ERROR CODES : $80->$BF
* Kernel ERROR CODES : $C0->$FF * 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.ERROOM .EQ $FF Out Of Memory Error
MEMMGR.ERROOH .EQ $FE Out Of Handle 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.CTIME .EQ 30 DWORD
S.STAT.BLOCKS .EQ 34 DWORD S.STAT.BLOCKS .EQ 34 DWORD
S.STAT.BLKSIZE .EQ 38 WORD 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...... * S.FILE for FOPEN,FREAD......
*-------------------------------------- *--------------------------------------
@ -574,7 +535,8 @@ S.FILE.PRODOS .EQ 4
* S.DIR for OpenDir,ReadDir,CloseDir * S.DIR for OpenDir,ReadDir,CloseDir
*-------------------------------------- *--------------------------------------
S.DIR.HANDLER .EQ 0 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.REF .EQ 2
S.DIR.PRODOS.IOBUF .EQ 3 S.DIR.PRODOS.IOBUF .EQ 3
@ -583,10 +545,9 @@ S.DIR.PRODOS .EQ 4
*-------------------------------------- *--------------------------------------
* S.DIRENT for ReadDir * S.DIRENT for ReadDir
*-------------------------------------- *--------------------------------------
S.DIRENT.STAT .EQ 0 S.DIRENT.NAME .EQ 0
S.DIRENT.NAME .EQ S.STAT * Variable size
* S.DIRENT.STAT .EQ S.STAT
S.DIRENT.PRODOS .EQ S.STAT+16 PSTR (LEN+15 MAX)
*-------------------------------------- *--------------------------------------
S.PFT.PATH .EQ 0 S.PFT.PATH .EQ 0
S.PFT.HANDLER .EQ 23 S.PFT.HANDLER .EQ 23

View File

@ -39,6 +39,55 @@ MLIGETEOF .EQ $D1
MLISETBUF .EQ $D2 MLISETBUF .EQ $D2
MLIGETBUF .EQ $D3 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.BADCALL .EQ $01
MLI.ERR.BADCNT .EQ $04 MLI.ERR.BADCNT .EQ $04
MLI.ERR.IRQFULL .EQ $25 MLI.ERR.IRQFULL .EQ $25
@ -56,7 +105,6 @@ MLI.ERR.DUPFILE .EQ $47
MLI.ERR.OVERRUN .EQ $48 MLI.ERR.OVERRUN .EQ $48
MLI.ERR.VOLFULL .EQ $49 MLI.ERR.VOLFULL .EQ $49
MLI.ERR.EOF .EQ $4C MLI.ERR.EOF .EQ $4C
*-------------------------------------- *--------------------------------------
MLI .EQ $BF00 MLI .EQ $BF00
JSPARE .EQ $BF03 JSPARE .EQ $BF03
@ -97,21 +145,19 @@ LEVEL .EQ $BF94
BUBIT .EQ $BF95 BUBIT .EQ $BF95
SPARE1 .EQ $BF96 SPARE1 .EQ $BF96
MACHID .EQ $BF98 MACHID .EQ $BF98
*-------------------------------------- MACHID.TYPE .EQ %11001000
MACHID.TYPE .EQ %11001000 MACHID.TYPE.II .EQ %00000000
MACHID.TYPE.II .EQ %00000000 MACHID.TYPE.IIp .EQ %01000000
MACHID.TYPE.IIp .EQ %01000000 MACHID.TYPE.IIe .EQ %10000000
MACHID.TYPE.IIe .EQ %10000000 MACHID.TYPE.IIc .EQ %10001000
MACHID.TYPE.IIc .EQ %10001000 MACHID.TYPE.III .EQ %11000000
MACHID.TYPE.III .EQ %11000000 MACHID.RAM .EQ %00110000
MACHID.RAM .EQ %00110000 MACHID.RAM.128 .EQ %00110000
MACHID.RAM.128 .EQ %00110000 MACHID.RAM.64 .EQ %00100000
MACHID.RAM.64 .EQ %00100000 MACHID.RAM.48 .EQ %00010000
MACHID.RAM.48 .EQ %00010000 MACHID.SPARE .EQ %00000100
MACHID.SPARE .EQ %00000100 MACHID.COL80 .EQ %00000010
MACHID.COL80 .EQ %00000010 MACHID.CLK .EQ %00000001
MACHID.CLK .EQ %00000001
*--------------------------------------
SLTBYT .EQ $BF99 SLTBYT .EQ $BF99
PFIXPTR .EQ $BF9A PFIXPTR .EQ $BF9A
MLIACTV .EQ $BF9B MLIACTV .EQ $BF9B

View File

@ -74,81 +74,162 @@ hDIR .BS 1
S.READDIRA jsr S.PFTCHECKDIRA S.READDIRA jsr S.PFTCHECKDIRA
jsr S.GetMemPtrA jsr S.GetMemPtrA
>STYA ZPQuickPtr1 >STYA ZPQuickPtr1
ldy #S.DIR.F
lda (ZPQuickPtr1),y
and #S.DIR.F.NOMORE
bne .9
ldy #S.DIR.PRODOS.REF ldy #S.DIR.PRODOS.REF
lda (ZPQuickPtr1),y lda (ZPQuickPtr1),y
beq S.READDIRA.ROOT beq S.READDIRA.ROOT
jmp S.READDIRA.DIR jmp S.READDIRA.DIR
S.READDIRA.ROOT >PUSHWI 256 Get Buffer for ONLINE call .9 lda #0
>PUSHBI 0 sec CS,A=0 no more entry
jsr S.GetMem S.READDIRA.RTS rts
bcs .99
>STYA ZPQuickPtr2
stx hONLINE
stz MLICALL.PARAMS+1
>STYA MLICALL.PARAMS+2
>MLICALL MLIONLINE
bcs .98
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 sta BufSize
stz BufSize+1 stz BufSize+1
ldy #0 ldy #0
.1 lda (ZPQuickPtr2),y .1 lda KrnBuffer256,y
and #$0F and #$0F
beq .2 beq .2
sec Add Filelen +1 sec Add Filelen +1
adc BufSize
sta BufSize
lda #0
adc BufSize adc BufSize
sta BufSize sta BufSize
bcc .11
inc BufSize+1
lda #S.STAT .11 lda #S.STAT
adc BufSize adc BufSize
sta BufSize sta BufSize
lda /S.STAT bcc .12
adc BufSize+1 inc BufSize+1
sta BufSize+1
.12 inx
inx
.2 tya .2 tya
clc clc
adc #16 adc #16
tay tay
bcc .1 bcc .1 loop until 256 bytes scanned
txa txa
beq .99 A=0, CS no more DIRENT beq S.READDIRA.RTS A=0, CS no more DIRENT
sta EntryCount
>PUSHW BufSize >PUSHW BufSize
>PUSHBI 0 >PUSHBI S.MEM.F.INIT0
jsr S.GetMem jsr S.GetMem
bcs .98 bcs S.READDIRA.RTS
stx hDIRENT
>STYA ZPQuickPtr3 >STYA ZPQuickPtr3
>STYA ZPQuickPtr4 >STYA ZPQuickPtr4
ldy #0 .3 lda (ZPQuickPtr2)
.1 lda (ZPQuickPtr2),y
and #$0F 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 txa
.98 pha
lda hONLINE
jsr S.FreeMemA
pla
sec 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 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 clc
rts rts
*-------------------------------------- *--------------------------------------
@ -177,7 +258,10 @@ S.CLOSEDIRA.1 ldy #S.DIR.PRODOS.REF
rts rts
*-------------------------------------- *--------------------------------------
hONLINE .BS 1 hONLINE .BS 1
hDIRENT .BS 1
BufSize .BS 2 BufSize .BS 2
EntryCount .BS 1
VolName .BS 17
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE SYS/KERNEL.S.DIR SAVE SYS/KERNEL.S.DIR