NEW
  AUTO 3,1
*--------------------------------------
FS.OPEN.REG		>MLICALL MLIGETFILEINFO
				bcc .2					Already Exists

				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.CREATE
				bcs .9

.2				ldx #0
				jsr DEV.MkFD
				bcs .9

				jsr FS.MLIOPEN
				bcs .99

				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 MLISETEOF		no, reset size to 0
				bra .4

.3				>MLICALL MLIGETEOF
				bcs .99

				>MLICALL MLISETMARK
.4				bcs .99

.5				lda IO.Open.FLAGS
				and #O.TEXT				Text Mode ?
				beq .6

				lda #$FF
				sta K.MLI.PARAMS+2
				lda #C.CR
				sta K.MLI.PARAMS+3
				>MLICALL MLINEWLINE
				bcs .99
				
.6				>LDYAI K.MLI.PATH+1
				>STYA ZPPtr1
				jsr K.MkNod.I
				bcc .8

.99				pha						Save Error Code
				lda IO.hFD
				jsr K.Close
				pla
				sec

.8

.9				rts
*--------------------------------------
FS.OPEN.DIR		ldx #1
				jsr DEV.MkFD
				bcs .9

				lda K.MLI.PATH+2
				beq .8					"/"

				>MLICALL MLIGETFILEINFO
				bcs .9
				
				lda K.MLI.PARAMS+S.FI.T
				cmp #S.FI.T.DIR
				bne .99
				
				jsr FS.MLIOPEN
				bcs .98
				
.8				>LDYAI K.MLI.PATH+1
				>STYA ZPPtr1
				jsr K.MkNod.I
				bcc .9

.98				pha						Save Error Code
				lda IO.hFD
				jsr K.Close
				pla
				sec
				rts
				
.99				lda #MLI.E.UNSUPST
				sec
.9				rts
*--------------------------------------
FS.CLOSE.REG
FS.CLOSE.DIR	ldy #S.FD.REG.REF
				lda (pFD),y
				beq .1

				sta K.MLI.PARAMS+1
				>MLICALL MLICLOSE
*				bcs FS.RTS

.1				ldy #S.FD.REG.IOBUF
				lda (pFD),y
				beq .2

				jsr K.FreeMem

.2				jmp DEV.Destroy
*--------------------------------------
FS.READ.REG		ldx #MLIREAD
				.HS 2C					BIT ABS
*--------------------------------------
FS.WRITE.REG	ldx #MLIWRITE

				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 MLIGETMARK
				bcs .9
				ldy #2
.1				lda K.MLI.PARAMS+2,y
				sta ACC32,y
				dey
				bpl .1

				>MLICALL MLIGETEOF
				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.CREATE		sta K.MLI.PARAMS+7		Storage Type
				ldx #3

.1				lda DATELO,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 MLICREATE
				rts
*--------------------------------------
FS.MLIOPEN		>LDYAI 1024				get a ProDOS IOBUF
				ldx #S.MEM.F.ALIGN
				jsr MEM.GetMem.YAX
				bcs .9

				>STYA K.MLI.PARAMS+3	Save Ptr to IOBUF for MLIOPEN call
				txa
				ldy #S.FD.REG.IOBUF
				sta (pFD),y

				>MLICALL MLIOPEN
				bcs .9

				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

.9
FS.RTS			rts
*--------------------------------------
FS.Stat			bit A2osX.FSID
				bmi FS.Stat.FX

FS.Stat.203		>MLICALL MLIGETFILEINFO
				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 MLIGETFILEINFOEX
				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

				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

				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.T,#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
