A2osX/SYS/KERNEL.S.FS.txt
burniouf 8dea8d82c3 ProDOS.FX : Many bugfixes & improvement
A2osX : bugfixes in KERNEL
2023-11-20 21:22:55 +01:00

382 lines
7.0 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
FS.OPEN.REG >MLICALL MLI.GFINFO
bcs .10
lda IO.Open.TYPE Already Exists
beq .2
cmp K.MLI.PARAMS+S.FI.T
beq .2
lda #MLI.E.INCFF
sec
rts
.10 bit IO.Open.FLAGS Create if not exists ?
bpl .9 No, return MLI error
ldx #2 Yes, Create...
.1 lda IO.Open.TYPE,x
sta K.MLI.PARAMS+4,x File type,Aux type
dex
bpl .1
lda #S.FI.ST.STD
jsr FS.MLICREATE
bcs .9
.2 lda #S.FD.T.REG
jsr DEV.MkFD
bcs .9
jsr FS.MLIOPEN
bcs FS.OPEN.ERR
lda IO.Open.FLAGS
bit #O.WRONLY
beq .5 Write mode ?
and #O.APPEND Append ?
bne .3 yes, go to end of file
stz K.MLI.PARAMS+2
stz K.MLI.PARAMS+3
stz K.MLI.PARAMS+4
>MLICALL MLI.SETEOF no, reset size to 0
bra .4
.3 >MLICALL MLI.GETEOF
bcs FS.OPEN.ERR
>MLICALL MLI.SETMARK
.4 bcs FS.OPEN.ERR
.5 lda IO.Open.FLAGS
and #O.TEXT Text Mode ?
beq .8
lda #$FF
sta K.MLI.PARAMS+2
lda #C.CR
sta K.MLI.PARAMS+3
>MLICALL MLI.NEWLINE
bcs FS.OPEN.ERR
.8 lda IO.hFD
* clc
.9 rts
*--------------------------------------
FS.OPEN.ERR pha Save Error Code
jsr FS.MLICLOSE
pla
sec
rts
*--------------------------------------
FS.OPEN.DIR lda #S.FD.T.DIR
jsr DEV.MkFD
bcs .9
lda K.MLI.PATH+2
beq .8 "/"
>MLICALL MLI.GFINFO
bcs .9
lda K.MLI.PARAMS+S.FI.T
cmp #S.FI.T.DIR
bne .99
jsr FS.MLIOPEN
bcs FS.OPEN.ERR
.8 lda IO.hFD
* clc
rts
.99 lda #MLI.E.UNSUPST
sec
.9 rts
*--------------------------------------
FS.READ.REG ldx #MLI.READ
.HS 2C BIT ABS
*--------------------------------------
FS.WRITE.REG ldx #MLI.WRITE
ldy #S.FD.REG.REF
lda (pFD),y
sta K.MLI.PARAMS+1
>PULLW K.MLI.PARAMS+4
>PULLW K.MLI.PARAMS+2
lda #4 Param Count = 4 for MLIREAD & MLIWRITE
jsr GP.MLICall
bcs .9
>LDYA K.MLI.PARAMS+6
.9 inc pStack
rts
*--------------------------------------
FS.EOF.REG >MLICALL MLI.GETMARK
bcs .9
ldy #2
.1 lda K.MLI.PARAMS+2,y
sta ACC32,y
dey
bpl .1
>MLICALL MLI.GETEOF
bcs .9
ldy #2
.2 lda K.MLI.PARAMS+2,y
eor ACC32,y
bne .8 FALSE
dey
bpl .2
lda #$ff TRUE
* clc
rts
.8 lda #0
* clc
.9 rts
*--------------------------------------
FS.CLOSE jsr FS.MLICLOSE
bcs FS.RTS
jmp DEV.FreeFD
*--------------------------------------
FS.MLICREATE sta K.MLI.PARAMS+7 Storage Type
ldx #3
.1 lda GP.DATE,x
sta K.MLI.PARAMS+8,x Create Date/Time
dex
bpl .1
lda #S.FI.A.FULL
sta K.MLI.PARAMS+3 Access
>MLICALL MLI.CREATE
rts
*--------------------------------------
FS.MLIOPEN >LDYAI 1024 get a ProDOS IOBUF
ldx #S.MEM.F.ALIGN
jsr MEM.GetMem.YAX
bcs FS.RTS
>STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call
txa
ldy #S.FD.REG.IOBUF
sta (pFD),y
>MLICALL MLI.OPEN
bcs FS.RTS
lda K.MLI.PARAMS+5 get ref_num
ldy #S.FD.REG.REF
sta (pFD),y
sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based
* clc
FS.RTS rts
*--------------------------------------
FS.MLICLOSE ldy #S.FD.REG.REF
lda (pFD),y
beq .1
sta K.MLI.PARAMS+1
>MLICALL MLI.CLOSE
bcs FS.RTS
.1 ldy #S.FD.REG.IOBUF
lda (pFD),y
beq .8
jmp K.FreeMem
.8 clc
rts
*--------------------------------------
FS.Stat bit A2osX.FSID
bmi FS.Stat.FX
FS.Stat.203 >MLICALL MLI.GFINFO
bcs FS.RTS
jsr FS.ClrStat
lda K.MLI.PARAMS+S.FI.T
cmp #S.FI.T.DIR
bne .1
lda /S.STAT.MODE.DIR
sta K.S.STAT+S.STAT.MODE+1
.1 lda K.MLI.PARAMS+S.FI.A
sta K.S.STAT+S.STAT.P.ACCESS
ldx #FS.GFI.Cnt
.3 ldy FS.GFI.Src-1,x
lda K.MLI.PARAMS,y
ldy FS.Stat.Dst-1,x
sta K.S.STAT,y
dex
bne .3
>LDYAI K.MLI.PARAMS+S.FI.CDATE
ldx #K.S.STAT+S.STAT.CTIME
jsr FS.PTime2StatYAX
>LDYAI K.MLI.PARAMS+S.FI.MDATE
ldx #K.S.STAT+S.STAT.MTIME
jmp FS.PTime2StatYAX
*--------------------------------------
FS.Stat.FX >MLICALL MLI.GFINFOEX
bcc .1
cmp #MLI.E.BADCALL
beq FS.Stat.203 Apple WS CARD
rts
.1 >LDYAI K.MLI.PARAMS+3
>STYA ZPPtr3
*--------------------------------------
FS.DirEnt2Stat jsr FS.ClrStat
ldx #FS.DirEnt.Cnt
.1 ldy FS.DirEnt.Src-1,x
lda (ZPPtr3),y
ldy FS.Stat.Dst-1,x
sta K.S.STAT,y
dex
bne .1
ldy #S.FIEX.ACCESS
lda (ZPPtr3),y
sta K.S.STAT+S.STAT.P.ACCESS
lda (ZPPtr3)
and #$F0
cmp #$D0 Dir Hdr or Dir ?
bcc .3
cmp #$F0 Vol Hdr ?
bne .2
stz K.S.STAT+S.STAT.SIZE
ldy #S.FIEX.AUXTYPE
lda (ZPPtr3),y
sta K.S.STAT+S.STAT.BLOCKS
asl
sta K.S.STAT+S.STAT.SIZE+1
iny
lda (ZPPtr3),y
sta K.S.STAT+S.STAT.BLOCKS+1
rol
sta K.S.STAT+S.STAT.SIZE+2
lda #0
rol K.S.STAT+S.STAT.SIZE+3
.2 lda /S.STAT.MODE.DIR
tsb K.S.STAT+S.STAT.MODE+1
.3 ldy #S.FIEX.ACL
lda (ZPPtr3),y
cmp #$57
bne .7
iny
lda (ZPPtr3),y
bne .7
ldy #S.FIEX.ACL.UID
lda (ZPPtr3),y
sta K.S.STAT+S.STAT.UID
ldy #S.FIEX.ACL.GID
lda (ZPPtr3),y
sta K.S.STAT+S.STAT.GID
ldy #S.FIEX.ACL.MOD
lda (ZPPtr3),y
tsb K.S.STAT+S.STAT.MODE
iny
lda (ZPPtr3),y
tsb K.S.STAT+S.STAT.MODE+1
.7 lda #S.FIEX.CTIME
ldx #K.S.STAT+S.STAT.CTIME
jsr FS.PTime2StatAX
lda #S.FIEX.MTIME
ldx #K.S.STAT+S.STAT.MTIME
* jmp FS.PTime2StatAX
*--------------------------------------
FS.PTime2StatAX clc
adc ZPPtr3
tay
lda ZPPtr3+1
adc #0
FS.PTime2StatYAX
>PUSHYA
>PUSHB /K.S.STAT
txa
>PUSHA
>SYSCALL2 PTime2Time
clc ignore bad date error
rts
*--------------------------------------
FS.ClrStat ldx #S.STAT-1
.1 stz K.S.STAT,x
dex
bpl .1
lda A2osX.FSID
sta K.S.STAT+S.STAT.FSID
lda #2
sta K.S.STAT+S.STAT.BLKSIZE+1 = 512 bytes
rts
*--------------------------------------
FS.GFI.Src .DA #S.FI.T,#S.FI.AUXTYPE,#S.FI.AUXTYPE+1
.DA #S.FI.UBLKS,#S.FI.UBLKS+1
FS.GFI.Cnt .EQ *-FS.GFI.Src
*--------------------------------------
FS.DirEnt.Src .DA #S.FIEX.TYPE,#S.FIEX.AUXTYPE,#S.FIEX.AUXTYPE+1
.DA #S.FIEX.BLKUSED,#S.FIEX.BLKUSED+1
.DA #S.FIEX.EOF,#S.FIEX.EOF+1,#S.FIEX.EOF+2
FS.DirEnt.Cnt .EQ *-FS.DirEnt.Src
*--------------------------------------
FS.Stat.Dst .DA #S.STAT.P.TYPE,#S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1
.DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1
.DA #S.STAT.SIZE,#S.STAT.SIZE+1,#S.STAT.SIZE+2
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.fs
LOAD usr/src/sys/kernel.s
ASM