mirror of
https://github.com/A2osX/A2osX.git
synced 2026-04-20 21:16:51 +00:00
db519193fc
SRC REORG #6 in KERNEL ProDOS.FX Tiny
986 lines
16 KiB
Plaintext
986 lines
16 KiB
Plaintext
NEW
|
|
AUTO 3,1
|
|
.LIST OFF
|
|
.OP 65C02
|
|
.OR $2000
|
|
.TF sys/km.pascal
|
|
*--------------------------------------
|
|
.INB inc/macros.i
|
|
.INB inc/a2osx.i
|
|
.INB inc/a2osx.api.i
|
|
.INB inc/kernel.i
|
|
.INB inc/io.i
|
|
.INB inc/mli.i
|
|
.INB inc/mli.e.i
|
|
*--------------------------------------
|
|
.DUMMY
|
|
.OR ZPDRV+4 ZPpBuf,ZPCnt
|
|
ZS.START
|
|
ZS.END .ED
|
|
*--------------------------------------
|
|
* File Header (16 Bytes)
|
|
*--------------------------------------
|
|
CS.START cld
|
|
jmp KM.Init cld,jmp abs=DRV
|
|
.DA #$61 6502,Level 1 (65c02)
|
|
.DA #2 DRV Layout Version 2
|
|
.DA 0
|
|
.DA CS.END
|
|
.DA ID.END
|
|
.DA 0
|
|
.DA 0
|
|
*--------------------------------------
|
|
* Relocation Table
|
|
*--------------------------------------
|
|
L.KM.CS.START .DA KM.CS.START
|
|
|
|
|
|
.DA 0 End Of Reloc Table
|
|
*--------------------------------------
|
|
KM.INIT >SS
|
|
>PUSHW L.KM.CS.START
|
|
>PUSHWI KM.CS.START
|
|
>PUSHWI KM.CS.END
|
|
>PUSHWI KM.ID.END
|
|
>KAPI InsDrv
|
|
>SR
|
|
bcs .9
|
|
|
|
>STYA A2osX.pFSs+FS_PASCAL
|
|
|
|
.9 rts
|
|
*--------------------------------------
|
|
CS.END .EQ *
|
|
*--------------------------------------
|
|
* +$00 / 2: system area start block number (always 0)
|
|
* +$02 / 2: next block (first block after directory; always 6)
|
|
* +$04 / 2: file type ($00)
|
|
* +$06 / 8: volume name, prefixed with length byte
|
|
* +$0e / 2: number of blocks in volume
|
|
* +$10 / 2: number of files in directory
|
|
* +$12 / 2: last access time (declared as "integer", definition unclear; always zero?)
|
|
* +$14 / 2: most recently set date value
|
|
* +$16 / 4: (reserved)
|
|
|
|
* +$00 / 2: file start block number
|
|
* +$02 / 2: first block past end of file (i.e. last block + 1)
|
|
* +$04 / 2: file type in bits 0-3; bit 15 used "for filer wildcards"; other bits reserved
|
|
* +$06 /16: file name, prefixed with length byte
|
|
* +$16 / 2: number of bytes used in last block
|
|
* +$18 / 2: modification date
|
|
|
|
* 0 untypedfile - used for the volume directory header entry
|
|
* 1 xdskfile / .BAD - used to mark physically damaged disk blocks
|
|
* 2 codefile / .CODE - machine-executable code
|
|
* 3 textfile / .TEXT - human-readable text
|
|
* 4 infofile / .INFO - (not used)
|
|
* 5 datafile / .DATA - arbitrary data
|
|
* 6 graffile / .GRAF - (not used)
|
|
* 7 fotofile / .FOTO - (not used)
|
|
* 8 securedir - (unknown)
|
|
|
|
* YYYYYYY DDDDD MMMM
|
|
*--------------------------------------
|
|
PASCAL_DIR_EL .EQ 26
|
|
PASCAL_DIR_EPB .EQ 19
|
|
*--------------------------------------
|
|
* KM Code
|
|
*--------------------------------------
|
|
.DUMMY
|
|
.OR ZPDRV+4 ZPpBuf,ZPCnt
|
|
pDirEnt .BS 2
|
|
pFilename .BS 2
|
|
|
|
DSSS0000 .BS 1
|
|
OLBufPtr .BS 1
|
|
|
|
ByteCnt .BS 2
|
|
|
|
FPOS .BS 4
|
|
FSIZE .BS 4
|
|
DWORD .BS 4
|
|
|
|
.ED
|
|
*--------------------------------------
|
|
KM.CS.START cld
|
|
jmp (.1,x)
|
|
|
|
.1 .DA KM.StatDevA
|
|
|
|
.DA KM.Stat
|
|
|
|
.DA KM.OpenDir
|
|
.DA KM.ReadDir
|
|
.DA KM.CloseDir
|
|
|
|
.DA KM.Open
|
|
|
|
.DA KM.FStat
|
|
.DA KM.Close
|
|
.DA KM.Read
|
|
.DA KM.Write
|
|
.DA KM.Flush
|
|
.DA KM.Seek
|
|
.DA KM.EOF
|
|
.DA KM.Tell
|
|
|
|
.DA KM.Remove
|
|
.DA KM.Rename
|
|
|
|
.DA KM.MKDir
|
|
|
|
.DA KM.ChOwn
|
|
.DA KM.ChMod
|
|
.DA KM.ChTyp
|
|
.DA KM.ChAux
|
|
.DA KM.ChAttr
|
|
|
|
.DA 0
|
|
*--------------------------------------
|
|
KM.StatDevA sta DSSS0000
|
|
jsr KM.ChkVolA
|
|
bcs .99
|
|
|
|
ldx #0
|
|
* ldy K.Buf512+6 vol name len
|
|
|
|
.2 lda K.Buf512+7,x
|
|
jsr KM.AddA2pBuf
|
|
inx
|
|
dey
|
|
bne .2
|
|
|
|
tya Add ending 0 for C String
|
|
jsr KM.AddA2pBuf
|
|
|
|
lda DSSS0000
|
|
jsr KM.StatVol
|
|
|
|
jmp KM.AddStat2pBuf
|
|
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.Stat jsr KM.FindVol
|
|
bcs .99
|
|
|
|
bvc .1 extra path, a filename
|
|
|
|
jmp KM.StatVol
|
|
|
|
.1 jsr KM.FindFile
|
|
bcs .99
|
|
|
|
jsr KM.ClrStat
|
|
|
|
jsr KM.Dirent2Stat
|
|
|
|
jsr KM.ModDate2Stat
|
|
|
|
clc
|
|
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.OpenDir jsr KM.FindVol
|
|
bcs .99
|
|
|
|
bvc .9 extra path...error
|
|
|
|
lda #FS_PASCAL
|
|
ldy #S.FD.FSID
|
|
sta (pFD),y
|
|
|
|
ldy #S.FD.DIR.FC
|
|
lda K.Buf512+16
|
|
sta (pFD),y
|
|
iny
|
|
lda K.Buf512+17
|
|
sta (pFD),y
|
|
|
|
>LDYAI 2048 store whole catalog (4 blocks)
|
|
>DAPI KMalloc
|
|
bcs .9
|
|
|
|
>STYA ZPPtr3
|
|
|
|
phy
|
|
ldy #S.FD.REG.IOBUF+1
|
|
sta (pFD),y
|
|
pla
|
|
dey
|
|
sta (pFD),y
|
|
|
|
.1 ldy #0
|
|
|
|
.2 lda K.Buf512,y
|
|
sta (ZPPtr3),y
|
|
iny
|
|
bne .2
|
|
|
|
inc ZPPtr3+1
|
|
|
|
.3 lda K.Buf512+$100,y
|
|
sta (ZPPtr3),y
|
|
iny
|
|
bne .3
|
|
|
|
inc ZPPtr3+1
|
|
|
|
inc K.MLI.PARAMS+4
|
|
lda K.MLI.PARAMS+4
|
|
cmp #6
|
|
beq .8
|
|
|
|
jsr KM.MLI.ReadBlock
|
|
bcc .1
|
|
|
|
rts
|
|
|
|
.8 clc
|
|
|
|
rts
|
|
|
|
.9 lda #MLI.E.PNOTFND
|
|
sec
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.ReadDir ldy #S.FD.DIR.FC
|
|
|
|
lda (pFD),y
|
|
bne .1
|
|
|
|
lda #MLI.E.EOF
|
|
sec
|
|
rts
|
|
|
|
.1 >LDYAI 16+S.STAT*77+1
|
|
>DAPI Malloc
|
|
bcs .99
|
|
|
|
>STYA ZPpBuf
|
|
>STYA ZPPtr4
|
|
|
|
ldy #S.FD.REG.IOBUF+1
|
|
lda (pFD),y
|
|
sta pDirEnt+1
|
|
dey
|
|
lda (pFD),y
|
|
sta pDirEnt
|
|
|
|
jsr KM.NextDirEnt skip VOL header
|
|
|
|
.2 ldy #S.FD.DIR.FC
|
|
lda (pFD),y
|
|
beq .8
|
|
|
|
dec
|
|
sta (pFD),y
|
|
|
|
ldy #6 Filename len
|
|
lda (pDirEnt),y
|
|
tax
|
|
|
|
.3 iny
|
|
|
|
lda (pDirEnt),y
|
|
jsr KM.AddA2pBuf
|
|
dex
|
|
bne .3
|
|
|
|
txa
|
|
jsr KM.AddA2pBuf
|
|
|
|
jsr KM.ClrStat
|
|
|
|
jsr KM.Dirent2Stat
|
|
|
|
jsr KM.ModDate2Stat
|
|
|
|
jsr KM.AddStat2pBuf
|
|
jsr KM.NextDirEnt
|
|
bra .2
|
|
|
|
.8 >LDYA ZPPtr4
|
|
|
|
clc
|
|
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.Open jsr KM.FindVol
|
|
bcs .99
|
|
|
|
bvs .98 no extra path...error
|
|
|
|
ldy #S.FD.REG.REF+1 A = DSSS0000
|
|
sta (pFD),y
|
|
|
|
jsr KM.FindFile
|
|
bcs .99
|
|
|
|
jsr KM.Dirent2Stat
|
|
|
|
ldy #S.FD.REG.FSIZE+3
|
|
ldx #3
|
|
|
|
.1 lda K.S.STAT+S.STAT.SIZE,x
|
|
sta (pFD),y
|
|
dey
|
|
dex
|
|
bpl .1
|
|
|
|
lda (pDirEnt)
|
|
ldy #S.FD.REG.FSIZE+4 1st BLK
|
|
sta (pFD),y
|
|
|
|
ldy #1
|
|
lda (pDirEnt),y
|
|
ldy #S.FD.REG.FSIZE+5
|
|
sta (pFD),y
|
|
|
|
lda #FS_PASCAL
|
|
ldy #S.FD.FSID
|
|
sta (pFD),y
|
|
|
|
* clc
|
|
rts
|
|
|
|
.98 lda #MLI.E.IO
|
|
sec
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.CloseDir
|
|
*--------------------------------------
|
|
KM.Close ldy #S.FD.REG.IOBUF+1
|
|
lda (pFD),y
|
|
beq .8
|
|
|
|
pha
|
|
dey
|
|
lda (pFD),y
|
|
tay
|
|
pla
|
|
>DAPI KFree
|
|
|
|
ldy #S.FD.REG.IOBUF+1
|
|
lda #0
|
|
sta (pFD),y
|
|
|
|
.8 clc
|
|
|
|
rts
|
|
*--------------------------------------
|
|
KM.Read ldy #S.FD.REG.FPOS+7
|
|
ldx #7
|
|
|
|
.1 lda (pFD),y
|
|
sta FPOS,x
|
|
dey
|
|
dex
|
|
bpl .1
|
|
|
|
ldx #0
|
|
|
|
sec
|
|
|
|
.2 lda FSIZE,x
|
|
sbc FPOS,x
|
|
sta DWORD,x
|
|
inx
|
|
txa
|
|
eor #4
|
|
bne .2 DWORD = SIZE-FPOS
|
|
|
|
bcc .98 SIZE < FPOS -> BEOF
|
|
|
|
lda DWORD
|
|
ora DWORD+1
|
|
ora DWORD+2
|
|
ora DWORD+3
|
|
beq .97 SIZE == FPOS -> EOF
|
|
|
|
ldy #2 Buf
|
|
jsr K.GetStkYW
|
|
>STYA ZPpBuf User buffer
|
|
|
|
ldy #0 ByteCnt to read
|
|
jsr K.GetStkYW
|
|
|
|
>STYA ZPCnt
|
|
>STYA ByteCnt
|
|
|
|
lda DWORD
|
|
cmp ZPCnt
|
|
lda DWORD+1
|
|
sbc ZPCnt+1
|
|
bcs .3 ZPCnt <= remaining bytes
|
|
|
|
lda DWORD+2
|
|
ora DWORD+3
|
|
bne .3
|
|
|
|
>LDYA DWORD
|
|
>STYA ZPCnt
|
|
>STYA ByteCnt
|
|
*--------------------------------------
|
|
.3 ldy #S.FD.REG.REF+1
|
|
lda (pFD),y
|
|
sta K.MLI.PARAMS+1
|
|
|
|
.4 lda FPOS
|
|
bne .5
|
|
|
|
lda FPOS+1
|
|
and #1
|
|
bne .5 not at block boundary
|
|
|
|
lda ZPCnt+1
|
|
cmp #2
|
|
bcc .5 not a full 512 block to read
|
|
|
|
jsr KM.ReadDirect
|
|
bcc .7
|
|
|
|
rts
|
|
|
|
.5 jsr KM.ReadIndirect
|
|
bcs .99
|
|
|
|
.7 lda ZPCnt
|
|
ora ZPCnt+1
|
|
bne .4
|
|
|
|
ldy #S.FD.REG.FPOS+3
|
|
ldx #3
|
|
|
|
.8 lda FPOS,x
|
|
sta (pFD),y
|
|
dey
|
|
dex
|
|
bpl .8
|
|
|
|
>LDYA ByteCnt
|
|
|
|
* clc
|
|
rts
|
|
|
|
.97 lda #MLI.E.EOF
|
|
sec
|
|
rts
|
|
|
|
.98 lda #MLI.E.BEYEOF
|
|
sec
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.ReadDirect >LDYA ZPpBuf
|
|
>STYA K.MLI.PARAMS+2
|
|
|
|
jsr KM.GetCurBlock
|
|
|
|
lda A2osX.IOOpt AUX ?
|
|
sta MLI.IOBANK
|
|
|
|
jsr KM.MLI.ReadBlock
|
|
|
|
stz MLI.IOBANK
|
|
|
|
bcs .9
|
|
|
|
lda FPOS+1
|
|
|
|
* clc
|
|
adc #2
|
|
sta FPOS+1
|
|
bcc .1
|
|
|
|
inc FPOS+2
|
|
|
|
.1 lda ZPCnt+1
|
|
sec
|
|
sbc #2
|
|
sta ZPCnt+1
|
|
|
|
lda ZPpBuf+1
|
|
clc
|
|
adc #2
|
|
sta ZPpBuf+1
|
|
|
|
* clc
|
|
|
|
.9 rts
|
|
*--------------------------------------
|
|
KM.ReadIndirect ldy #S.FD.REG.IOBUF+1
|
|
lda (pFD),y
|
|
bne .1
|
|
|
|
>LDYAI 512
|
|
>DAPI KMalloc
|
|
bcs .9
|
|
|
|
>STYA K.MLI.PARAMS+2
|
|
pha
|
|
tya
|
|
ldy #S.FD.REG.IOBUF
|
|
sta (pFD),y
|
|
iny
|
|
pla
|
|
sta (pFD),y
|
|
|
|
jsr KM.GetCurBlock
|
|
|
|
jsr KM.MLI.ReadBlock
|
|
bcs .9
|
|
|
|
.1 lda FPOS
|
|
|
|
clc
|
|
|
|
ldy #S.FD.REG.IOBUF
|
|
adc (pFD),y
|
|
sta A1
|
|
|
|
lda FPOS+1
|
|
and #1
|
|
iny
|
|
adc (pFD),y
|
|
sta A1+1 A1 = ptr in Disk Block
|
|
|
|
ldy #0
|
|
|
|
bit A2osX.IOOpt AUX ?
|
|
bpl .2
|
|
|
|
sta IO.SETWRITEAUX
|
|
|
|
.2 lda ZPCnt
|
|
bne .3
|
|
|
|
lda ZPCnt+1
|
|
beq .8
|
|
|
|
dec ZPCnt+1
|
|
|
|
.3 dec ZPCnt
|
|
|
|
lda (A1),y
|
|
sta (ZPpBuf)
|
|
>INCW ZPpBuf
|
|
iny
|
|
bne .4
|
|
|
|
inc A1+1
|
|
|
|
.4 inc FPOS
|
|
bne .2
|
|
|
|
inc FPOS+1
|
|
lda FPOS+1
|
|
lsr
|
|
bcs .2
|
|
|
|
sta IO.CLRWRITEAUX
|
|
|
|
ldy #S.FD.REG.IOBUF
|
|
lda (pFD),y
|
|
pha
|
|
iny
|
|
lda (pFD),y
|
|
ply
|
|
>DAPI KFree
|
|
|
|
ldy #S.FD.REG.IOBUF+1
|
|
lda #0
|
|
sta (pFD),y
|
|
|
|
* clc
|
|
|
|
rts
|
|
|
|
.8 sta IO.CLRWRITEAUX
|
|
|
|
clc
|
|
|
|
.9 rts
|
|
*--------------------------------------
|
|
KM.GetCurBlock lda FPOS+2
|
|
lsr
|
|
pha
|
|
lda FPOS+1
|
|
ror
|
|
|
|
* clc
|
|
|
|
ldy #S.FD.REG.FSIZE+4 1st BLK
|
|
adc (pFD),y
|
|
sta K.MLI.PARAMS+4
|
|
|
|
pla
|
|
iny
|
|
adc (pFD),y
|
|
sta K.MLI.PARAMS+5
|
|
rts
|
|
*--------------------------------------
|
|
KM.Write
|
|
|
|
KM.ChOwn
|
|
KM.ChMod
|
|
KM.MKDir
|
|
KM.Remove
|
|
KM.Rename
|
|
KM.ChTyp
|
|
KM.ChAux
|
|
KM.ChAttr
|
|
|
|
lda #MLI.E.LOCKED
|
|
sec
|
|
rts
|
|
*--------------------------------------
|
|
KM.Flush
|
|
KM.Seek
|
|
KM.EOF
|
|
KM.Tell
|
|
KM.FStat
|
|
lda #MLI.E.IO
|
|
sec
|
|
rts
|
|
*--------------------------------------
|
|
* In: K.MLI.P1
|
|
* Out:
|
|
* A = DSSS0000
|
|
* CC,VC : /PASCALVOL/FILE
|
|
* CC,VS : /PASCALVOL/
|
|
*--------------------------------------
|
|
KM.FindVol ldx #0
|
|
|
|
.1 stx OLBufPtr
|
|
|
|
lda K.OLBuf,x
|
|
and #$0F
|
|
bne .7
|
|
|
|
lda K.OLBuf+1,x
|
|
cmp #MLI.E.NOTPRODOS
|
|
bne .7
|
|
|
|
lda K.OLBuf,x
|
|
|
|
jsr KM.ChkVolA
|
|
bcs .7
|
|
|
|
ldx #0
|
|
|
|
.2 inx
|
|
lda K.Buf512+6,x skip LEN
|
|
cmp K.MLI.P1+1,x skip LEN + /
|
|
bne .7
|
|
|
|
cpx K.Buf512+6 Pascal volname len
|
|
bne .2
|
|
|
|
bit .9 Set V, K.MLI.P1=/VOL/ or /VOL
|
|
|
|
inx
|
|
cpx K.MLI.P1
|
|
beq .8 K.MLI.P1=/VOL
|
|
|
|
lda K.MLI.P1+1,x
|
|
cmp #'/'
|
|
bne .7
|
|
|
|
inx
|
|
|
|
cpx K.MLI.P1
|
|
beq .8 K.MLI.P1=/VOL/
|
|
|
|
txa X = /FILE Ptr in K.MLI.P1
|
|
sta K.MLI.P1,x
|
|
|
|
clc
|
|
adc #K.MLI.P1
|
|
sta pFilename
|
|
lda /K.MLI.P1
|
|
sta pFilename+1
|
|
|
|
lda K.MLI.P1
|
|
sec
|
|
sbc K.MLI.P1,x
|
|
sta K.MLI.P1,x
|
|
|
|
clv Clr V, K.MLI.P1=/VOL/FILE
|
|
|
|
.8 ldx OLBufPtr
|
|
lda K.OLBuf,x A = DSSS0000
|
|
|
|
clc
|
|
|
|
rts
|
|
|
|
.7 lda OLBufPtr
|
|
clc
|
|
adc #16
|
|
tax
|
|
bcc .1
|
|
|
|
lda #MLI.E.VNOTFND
|
|
* sec
|
|
.9 rts
|
|
*--------------------------------------
|
|
KM.StatVol jsr KM.ClrStat.SD
|
|
|
|
lda K.Buf512+14
|
|
sta K.S.STAT+S.STAT.BLOCKS
|
|
sta K.S.STAT+S.STAT.SIZE+1
|
|
|
|
lda K.Buf512+15
|
|
sta K.S.STAT+S.STAT.BLOCKS+1
|
|
|
|
asl K.S.STAT+S.STAT.SIZE+1
|
|
rol
|
|
sta K.S.STAT+S.STAT.SIZE+2
|
|
rol K.S.STAT+S.STAT.SIZE+3
|
|
|
|
clc
|
|
rts
|
|
*--------------------------------------
|
|
KM.ChkVolA sta K.MLI.PARAMS+1 A = DSSS0000
|
|
|
|
>LDYAI K.Buf512
|
|
>STYA K.MLI.PARAMS+2
|
|
>LDYAI 2
|
|
>STYA K.MLI.PARAMS+4
|
|
jsr KM.MLI.ReadBlock
|
|
bcs .9
|
|
|
|
ldx #5
|
|
|
|
sec
|
|
|
|
.1 lda K.Buf512,x
|
|
eor KM.VOLID,x
|
|
bne .9
|
|
|
|
dex
|
|
bpl .1
|
|
|
|
ldy K.Buf512+6
|
|
beq .9
|
|
|
|
cpy #8
|
|
|
|
.9 rts Y = VOLNAME len
|
|
*--------------------------------------
|
|
* pFilename = LEN + FILENAME
|
|
*--------------------------------------
|
|
KM.FindFile lda #4
|
|
sta ZPCnt+1
|
|
|
|
>LDYAI K.Buf512+PASCAL_DIR_EL+6
|
|
ldx #PASCAL_DIR_EPB-1
|
|
|
|
.1 >STYA pDirEnt
|
|
stx ZPCnt
|
|
|
|
.2 lda (pDirEnt)
|
|
beq .6
|
|
|
|
cmp (pFilename)
|
|
bne .6
|
|
|
|
tay
|
|
|
|
.3 lda (pDirEnt),y
|
|
cmp (pFilename),y
|
|
bne .6
|
|
|
|
dey
|
|
bne .3
|
|
|
|
* sec
|
|
lda pDirEnt
|
|
sbc #6
|
|
sta pDirEnt
|
|
lda pDirEnt+1
|
|
sbc #0
|
|
sta pDirEnt+1
|
|
|
|
clc
|
|
rts
|
|
|
|
.6 jsr KM.NextDirEnt
|
|
dec ZPCnt
|
|
bne .2
|
|
|
|
dec ZPCnt+1
|
|
beq .9
|
|
|
|
inc K.MLI.PARAMS+4
|
|
jsr KM.MLI.ReadBlock
|
|
bcs .99
|
|
|
|
>LDYAI K.Buf512+6
|
|
ldx #PASCAL_DIR_EPB
|
|
bra .1
|
|
|
|
.9 lda #MLI.E.FNOTFND
|
|
sec
|
|
.99 rts
|
|
*--------------------------------------
|
|
KM.ClrStat.SD pha
|
|
jsr KM.ClrStat
|
|
|
|
lda /S.STAT.MODE.DIR
|
|
sta K.S.STAT+S.STAT.MODE+1
|
|
|
|
inc K.S.STAT+S.STAT.P.DRIVE
|
|
|
|
pla DSSS0000
|
|
bpl .2
|
|
|
|
inc K.S.STAT+S.STAT.P.DRIVE
|
|
and #$70
|
|
|
|
.2 lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
sta K.S.STAT+S.STAT.P.SLOT
|
|
|
|
rts
|
|
*--------------------------------------
|
|
KM.ClrStat ldx #S.STAT-1
|
|
|
|
.1 stz K.S.STAT,x
|
|
dex
|
|
bpl .1
|
|
|
|
lda #FS_PASCAL
|
|
sta K.S.STAT+S.STAT.FSID
|
|
|
|
lda #2
|
|
sta K.S.STAT+S.STAT.BLKSIZE+1 = 512 bytes
|
|
|
|
rts
|
|
*--------------------------------------
|
|
KM.Dirent2Stat ldy #4
|
|
lda (pDirEnt),y
|
|
and #$f
|
|
sta K.S.STAT+S.STAT.P.TYPE
|
|
|
|
ldy #2
|
|
lda (pDirEnt),y
|
|
clc next-start-1
|
|
sbc (pDirEnt)
|
|
sta K.S.STAT+S.STAT.BLOCKS
|
|
sta K.S.STAT+S.STAT.SIZE+1
|
|
|
|
iny
|
|
lda (pDirEnt),y
|
|
ldy #1
|
|
sbc (pDirEnt),y
|
|
sta K.S.STAT+S.STAT.BLOCKS+1
|
|
|
|
asl K.S.STAT+S.STAT.SIZE+1
|
|
rol
|
|
sta K.S.STAT+S.STAT.SIZE+2
|
|
|
|
>INCW K.S.STAT+S.STAT.BLOCKS
|
|
|
|
ldy #22
|
|
lda (pDirEnt),y
|
|
adc K.S.STAT+S.STAT.SIZE
|
|
sta K.S.STAT+S.STAT.SIZE
|
|
iny
|
|
lda (pDirEnt),y
|
|
adc K.S.STAT+S.STAT.SIZE+1
|
|
sta K.S.STAT+S.STAT.SIZE+1
|
|
|
|
rts
|
|
*--------------------------------------
|
|
KM.ModDate2Stat ldy #24
|
|
lda (pDirEnt),y
|
|
and #$f
|
|
beq .8
|
|
|
|
cmp #13
|
|
beq .8
|
|
|
|
sta K.S.STAT+S.STAT.MTIME+S.TIME.MONTH
|
|
|
|
iny
|
|
lda (pDirEnt),y
|
|
lsr
|
|
sta K.S.STAT+S.STAT.MTIME+S.TIME.YEAR
|
|
tax
|
|
dey
|
|
lda (pDirEnt),y
|
|
ror
|
|
lsr
|
|
lsr
|
|
lsr
|
|
sta K.S.STAT+S.STAT.MTIME+S.TIME.DAY
|
|
lda #20
|
|
cpx #40
|
|
sbc #255
|
|
sta K.S.STAT+S.STAT.MTIME*S.TIME.CENTURY
|
|
|
|
.8 rts
|
|
*--------------------------------------
|
|
KM.NextDirEnt lda pDirEnt
|
|
clc
|
|
adc #PASCAL_DIR_EL
|
|
sta pDirEnt
|
|
bcc .8
|
|
|
|
inc pDirEnt+1
|
|
|
|
.8 rts
|
|
*--------------------------------------
|
|
KM.AddStat2pBuf sta IO.SETWRITEAUX
|
|
|
|
ldy #S.STAT-1
|
|
|
|
.1 lda K.S.STAT,y
|
|
sta (ZPpBuf),y
|
|
dey
|
|
bpl .1
|
|
|
|
sta IO.CLRWRITEAUX
|
|
|
|
lda #S.STAT
|
|
clc
|
|
adc ZPpBuf
|
|
sta ZPpBuf
|
|
bcc .8
|
|
|
|
inc ZPpBuf+1
|
|
|
|
.8 rts
|
|
*--------------------------------------
|
|
KM.AddA2pBuf sta IO.SETWRITEAUX
|
|
sta (ZPpBuf)
|
|
sta IO.CLRWRITEAUX
|
|
>INCW ZPpBuf
|
|
|
|
rts
|
|
*--------------------------------------
|
|
KM.MLI.ReadBlock
|
|
lda #3
|
|
sta K.MLI.PARAMS
|
|
|
|
jsr MLI
|
|
.DA #MLI.READBLOCK
|
|
.DA K.MLI.PARAMS
|
|
rts
|
|
*--------------------------------------
|
|
KM.CS.END .EQ *
|
|
*--------------------------------------
|
|
KM.VOLID .HS 000006000000 Pascal VOLUME signature
|
|
*--------------------------------------
|
|
KM.ID.END .EQ *
|
|
*--------------------------------------
|
|
|
|
*--------------------------------------
|
|
ID.END .EQ *
|
|
*--------------------------------------
|
|
MAN
|
|
SAVE usr/src/sys/km.pascal.s
|
|
ASM
|