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