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
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

View File

@ -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

View File

@ -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