Files
A2osX/SYS/KM.PASCAL.S.txt
burniouf db519193fc ADDED:NEW libcrypto by John LeFebvre
SRC REORG #6 in KERNEL
ProDOS.FX Tiny
2026-03-29 23:01:36 +02:00

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