A2osX/SYS/KERNEL.S.FILE.txt

452 lines
9.2 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.

PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*--------------------------------------
* For All SYS.xxxx calls, X = #SYSCall
* Must be kept in X before calling
* PFT.Check
*/--------------------------------------
* # FOpen
* Open a file
* ## In :
* PUSHW = AUXTYPE
* PUSHB = TYPE
* PUSHB = MODE
* SYS.FOpen.R : if R and !exists -> ERROR
* SYS.FOpen.W : if W and !exists -> CREATE
* SYS.FOpen.A : Append
* SYS.FOpen.T : Open/Append in Text mode
* SYS.FOpen.X : Create if not exists
* PUSHW = PATH (PSTR)
* ## Out :
* CC : A = hFILE
* CS : A = EC
*\--------------------------------------
K.FOpen jsr PFT.CheckPathSTK
>PULLW K.MLI.PARAMS+1
>PULLB K.FOpen.MODE
>PULLB K.FOpen.TYPE
>PULLW K.FOpen.AUXTYPE
>MLICALL MLIGETFILEINFO
bcc K.FOpen.10 Already Exists
bit K.FOpen.MODE Create if not exists ?
bpl K.FOpen.9 No, return MLI error
lda #S.FILEINFO.ACCESS.FULL Yes, Create...
sta K.MLI.PARAMS+3 Access
lda K.FOpen.TYPE
sta K.MLI.PARAMS+4 File type
>LDYA K.FOpen.AUXTYPE
>STYA K.MLI.PARAMS+5 Aux type
lda #S.FILEINFO.STORETYPE.STD
sta K.MLI.PARAMS+7
ldx #3
.1 lda DATELO,x
sta K.MLI.PARAMS+8,x
dex
bpl .1
>MLICALL MLICREATE
bcc K.FOpen.10
K.FOpen.9 rts
K.FOpen.10 >LDYAI S.NODE.REG
jsr K.GetMem0YA
bcs K.FOpen.9
>STYA ZPPtr1
stx hFILE
jsr FILE.SetIOBUF
bcs .98
>MLICALL MLIOPEN
bcs .98
lda K.MLI.PARAMS+5 get ref_num
ldy #S.NODE.REG.REF
sta (ZPPtr1),y
sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based
lda K.FOpen.MODE
bit #SYS.FOpen.W
beq .20 Write mode ?
and #SYS.FOpen.A Append ?
bne .11 yes, go to end of file
stz K.MLI.PARAMS+2
stz K.MLI.PARAMS+3
stz K.MLI.PARAMS+4
>MLICALL MLISETEOF no, reset size to 0
bcs .98
bra .20
.11 >MLICALL MLIGETEOF
bcs .98
>MLICALL MLISETMARK
bcs .98
.20 lda K.FOpen.MODE
and #SYS.FOpen.T Text Mode ?
beq .30
lda #$FF
sta K.MLI.PARAMS+2
lda #$0D
sta K.MLI.PARAMS+3
>MLICALL MLINEWLINE
.30 ldy #S.NODE.T
lda #S.NODE.T.REG
sta (ZPPtr1),y
lda hFILE
clc
rts CC
.98 pha save MLI error
lda hFILE
jsr K.FCloseA.1
pla get back MLI error
sec
rts
*--------------------------------------
K.FOpen.MODE .BS 1
K.FOpen.TYPE .BS 1
K.FOpen.AUXTYPE .BS 2
hFILE .BS 1
*/--------------------------------------
* # FCloseA
* Close a file
* ## In :
* A = hFILE
* ## Out :
*\--------------------------------------
K.FCloseA jsr PFT.CheckNodeA
pha
jsr K.GetMemPtrA
>STYA ZPPtr1
pla
K.FCloseA.1 sta K.FCloseA.2+1
ldy #S.NODE.REG.REF
lda (ZPPtr1),y
beq .1
sta K.MLI.PARAMS+1
>MLICALL MLICLOSE
.1 ldy #S.NODE.REG.IOBUF
lda (ZPPtr1),y
beq K.FCloseA.2
jsr K.FreeMemA
K.FCloseA.2 lda #$ff Self Modified
jmp K.FreeMemA
*/--------------------------------------
* # FReadA
* Read ONE byte from file
* ## In :
* A = hFILE
* ## Out :
* A = Byte Read
*\--------------------------------------
K.FReadA jsr PFT.CheckNodeA
ldx #MLIREAD
bra K.FReadWrite.0
*/--------------------------------------
* # FWriteAY
* ## In:
* A = hFILE
* Y = char
* # Out:
* Y,A = Bytes Written
*\--------------------------------------
K.FWriteAY jsr PFT.CheckNodeA
sty K.FWriteAY.Buf
ldx #MLIWRITE
K.FReadWrite.0 jsr FILE.SetupPrt1A
>LDYAI K.FWriteAY.Buf
>STYA K.MLI.PARAMS+2
lda #1
sta K.MLI.PARAMS+4
stz K.MLI.PARAMS+5
lda #4 Param Count = 4 for MLIREAD & MLIWRITE
jsr A2osX.MLICALL
bcs .9
lda K.FWriteAY.Buf
.9 rts
K.FWriteAY.Buf .BS 1
*/--------------------------------------
* # FRead
* Read bytes from file
* ## In :
* PUSHW = Dest Ptr
* PUSHW = Bytes To Read
* PUSHB = hFILE
* ## Out :
* Y,A = Bytes Read
*\--------------------------------------
K.FRead jsr PFT.CheckNodeSTK
ldx #MLIREAD
bra K.FReadWrite.1
*/--------------------------------------
* # FWrite
* ## In:
* PUSHW = Src Ptr
* PUSHW = Bytes To Write
* PUSHB = hFILE
* # Out:
* Y,A = Bytes Written
*\--------------------------------------
K.FWrite jsr PFT.CheckNodeSTK
ldx #MLIWRITE
K.FReadWrite.1 >PULLA
jsr FILE.SetupPrt1A
>PULLW K.MLI.PARAMS+4
>PULLW K.MLI.PARAMS+2
lda #4 Param Count = 4 for MLIREAD & MLIWRITE
jsr A2osX.MLICALL
bcs .9
>LDYA K.MLI.PARAMS+6
.9 rts
*/--------------------------------------
* # FFlushA
* ## In:
* A = hFILE
*\--------------------------------------
K.FFlushA jsr PFT.CheckNodeA
jsr FILE.SetupPrt1A
>MLICALL MLIFLUSH
rts
*/-------------------------------------
* # FSeek
* ## In:
* PUSHW = OffsetHi
* PUSHW = OffsetLo
* PUSHB = From
* PUSHB = hFILE
*\-------------------------------------
K.FSeek jsr PFT.CheckNodeSTK
>PULLA
jsr FILE.SetupPrt1A
>PULLA FROM
tax
>PULLW K.FSeek.OFFSET
>PULLW K.FSeek.OFFSET+2
cpx #SYS.FSeek.SET
bne .1
stz K.MLI.PARAMS+2
stz K.MLI.PARAMS+3
stz K.MLI.PARAMS+4
bra .8
.1 cpx #SYS.FSeek.CUR
bne .2
>MLICALL MLIGETMARK
bcc .8
rts
.2 cpx #SYS.FSeek.END
bne .98
>MLICALL MLIGETEOF
bcs .9
.8 ldx #0
ldy #3
clc
.81 lda K.MLI.PARAMS+2,x
adc K.FSeek.OFFSET,x
sta K.MLI.PARAMS+2,x
inx
dey
bne .81
bcs .99 Offset out of range!
>MLICALL MLISETMARK
.9 rts
.98 lda #SYSMGR.ERRSYN
.HS 2C bit abs
.99 lda #SYSMGR.ERRFTB
sec
rts
*--------------------------------------
K.FSeek.OFFSET .BS 4
*/--------------------------------------
* # FTellA
* ## In:
* A = hFILE
* ## Out:
* Y,A,X = Offset
*\--------------------------------------
K.FTellA jsr PFT.CheckNodeA
K.FTellA.1 jsr FILE.SetupPrt1A
>MLICALL MLIGETMARK
bcs .9
>LDYA K.MLI.PARAMS+2
ldx K.MLI.PARAMS+4
.9 rts
*/--------------------------------------
* # FEOFA
* ## In:
* A = hFILE
* ## Out:
* CC :
* A=0 EOF
* A !=0 NOT EOF
* CS :
*\--------------------------------------
K.FEOFA jsr PFT.CheckNodeA
jsr FILE.SetupPrt1A
jsr K.FTellA.1
bcs .9
>STYA K.FEOFA.MARK
stx K.FEOFA.MARK+2
>MLICALL MLIGETEOF
bcs .9
sec
lda K.MLI.PARAMS+2
sbc K.FEOFA.MARK
bne .8
lda K.MLI.PARAMS+3
sbc K.FEOFA.MARK+1
bne .8
lda K.MLI.PARAMS+4
sbc K.FEOFA.MARK+2
.8 clc
.9 rts
K.FEOFA.MARK .BS 3
*/--------------------------------------
* # RemoveYA
*\--------------------------------------
K.RemoveYA jsr PFT.CheckPathYA
>STYA K.MLI.PARAMS+1
>MLICALL MLIDESTROY
rts
*/--------------------------------------
* # Rename
* Rename a file
* ## In :
* PUSHW = New Name
* PUSHW = Old Name
* ## Out :
*\--------------------------------------
K.Rename jsr PFT.CheckPathSTK
>PULLW K.MLI.PARAMS+1
>PULLW K.MLI.PARAMS+3
>MLICALL MLIRename
rts
*/--------------------------------------
* # Stat
* Return information about a file
* ## In :
* PUSHW = PTR to S.STAT buffer
* PUSHW = PTR to Filename (PSTR)
* ## Out :
*\--------------------------------------
K.Stat jsr PFT.CheckPathSTK
>PULLW K.MLI.PARAMS+1
>PULLW ZPPtr2
>MLICALL MLIGETFILEINFO
bcs .9
ldx K.MLI.PARAMS+S.FILEINFO.ACCESS
lda #S.STAT.MODE.XO+S.STAT.MODE.WO+S.STAT.MODE.RO
cpx #S.FILEINFO.ACCESS.FULL
beq .2
lda #S.STAT.MODE.XO+S.STAT.MODE.RO
cpx #S.FILEINFO.ACCESS.R
beq .2
lda #0
.2 ldy #S.STAT.MODE
sta (ZPPtr2),y
ldx #K.Stat.DST-K.Stat.SRC
.3 ldy K.Stat.SRC-1,x
lda K.MLI.PARAMS,y
ldy K.Stat.DST-1,x
sta (ZPPtr2),y
dex
bne .3
ldy #S.STAT.SIZE
lda #0
sta (ZPPtr2),y
iny
lda K.MLI.PARAMS+S.FILEINFO.BLOCKSUSED
asl
sta (ZPPtr2),y
iny
lda K.MLI.PARAMS+S.FILEINFO.BLOCKSUSED+1
rol
sta (ZPPtr2),y
iny
lda #0
rol
sta (ZPPtr2),y
clc
.9 rts
*--------------------------------------
K.Stat.SRC .DA #S.FILEINFO.TYPE
.DA #S.FILEINFO.AUXTYPE,#S.FILEINFO.AUXTYPE+1
.DA #S.FILEINFO.BLOCKSUSED,#S.FILEINFO.BLOCKSUSED+1
K.Stat.DST .DA #S.STAT.P.TYPE
.DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1
.DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1
.DA #S.STAT.SIZE+1,#S.STAT.SIZE+2
*--------------------------------------
FILE.SetIOBUF >PUSHWI 1024 get a ProDOS IOBUF
>PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE
jsr K.GetMem
bcs .9
>STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call
txa
ldy #S.NODE.REG.IOBUF
sta (ZPPtr1),y
.9 rts
*--------------------------------------
FILE.SetupPrt1A jsr K.GetMemPtrA
>STYA ZPPtr1
ldy #S.NODE.REG.REF
lda (ZPPtr1),y
sta K.MLI.PARAMS+1
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.FILE
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM