A2osX/SYS/KERNEL.S.SLISTX.txt
2020-01-26 20:36:49 +01:00

543 lines
11 KiB
Plaintext
Raw 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.

NEW
AUTO 3,1
*--------------------------------------
ZPSListKeyID .EQ ZPMEMMGR+6
ZPSListDataPtr .EQ ZPMEMMGR+8
ZPSListDataLen .EQ ZPMEMMGR+10
ZPSListIBlkPtr .EQ ZPMEMMGR+12
ZPSListDBlkPtr .EQ ZPMEMMGR+14
*/--------------------------------------
* # SListGetData
* ## ASM
* `PUSHW DataOfs` (Start offset in Data)
* `PUSHW DataLen` (Data bytes to return, 0 if String mode)
* `PUSHW DataPtr` (0 if KERNEL should allocate a buffer)
* `PUSHW KeyID`
* `lda hSList`
* `>SYSCALL SListGetData`
* ## RETURN VALUE
* Y,A = Byte Count
* X = hMem (if DataPtr = 0)
*\--------------------------------------
K.SListGetData sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListKeyID
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SHARED.PullYA
>STYA ZPSListDataLen
jsr SHARED.PullYA
>STYA ZPMemMgrSize
jsr SLIST.Select
jsr SLIST.SkipKey
jsr SLIST.GetDataLen
lda SLIST.DataLen
sec
sbc ZPMemMgrSize Offset
eor #$ff
sta SLIST.nDataCnt
lda SLIST.DataLen+1
sbc ZPMemMgrSize+1
eor #$ff
sta SLIST.nDataCnt+1 Data remaining
bcc .99 Offset Beyond DataLen
.10 lda ZPMemMgrSize Skip to Offset
ldx ZPMemMgrSize+1
jsr SLIST.SkipDataAX
lda ZPSListDataPtr
ora ZPSListDataPtr+1
bne .12
>LDYA SLIST.DataLen
iny
bne .11
inc +1 for ending 0
.11 ldx #SYS.GetMem
jsr K.SYSCALL2.MAIN !!! Get a buffer In MAIN Mem !!!
bcs .9
stx .82+1
>STYA ZPSListDataPtr
.12 lda ZPSListDataLen
ora ZPSListDataLen+1
sec
beq .1 String Mode
lda ZPSListDataLen
eor #$ff
sta SLIST.nBufCnt
lda ZPSListDataLen+1
eor #$ff
sta SLIST.nBufCnt+1
clc
.1 ror SLIST.bStringMode
stz ZPSListDataLen
stz ZPSListDataLen+1
.2 inc SLIST.nDataCnt
bne .3
inc SLIST.nDataCnt+1
beq .8
.3 bit SLIST.bStringMode
bmi .4 String mode : until CR
inc SLIST.nBufCnt
bne .4
inc SLIST.nBufCnt+1
beq .8
.4 jsr SLIST.GetNextByte
bit SLIST.bStringMode
bpl .5
cmp #C.CR
beq .8
.5 jsr SHARED.SetDataByte
inc ZPSListDataLen
bne .2
inc ZPSListDataLen+1
bra .2
.99 lda #E.EMPTYKEY
sec
.9 rts
.8 lda #0
jsr SHARED.SetDataByte
.81 >LDYA ZPSListDataLen
.82 ldx #$ff SELF MODIFIED
clc
rts
*/--------------------------------------
* # SListAddData
* ## ASM
* `PUSHW DataLen`
* `PUSHW DataPtr`
* `PUSHW KeyID`
* `lda hSList`
* `>SYSCALL SListAddData`
* ## RETURN VALUE
*\--------------------------------------
K.SListAddData sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListKeyID
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SHARED.PullYA
>STYA ZPSListDataLen
jsr SLIST.Select
jsr SLIST.SkipKey
>LDYA SLIST.KeyID Save DataLen location
>STYA ZPSListKeyID to update later
ldy SLIST.BytePtr
lda (ZPSListDBlkPtr),y
pha
clc
adc ZPSListDataLen
sta (ZPSListDBlkPtr),y
php
jsr SLIST.ToNextByte skip LEN lo
plp
ldy SLIST.BytePtr
lda (ZPSListDBlkPtr),y
pha
adc ZPSListDataLen+1
sta (ZPSListDBlkPtr),y
jsr SLIST.ToNextByte skip LEN hi
plx
pla
jsr SLIST.SkipDataAX
lda ZPSListDataLen
eor #$ff
sta ZPSListDataLen
lda ZPSListDataLen+1
eor #$ff
sta ZPSListDataLen+1
.1 inc ZPSListDataLen
bne .2
inc ZPSListDataLen+1
beq .8
.2 jsr SHARED.GetDataByte
jsr SLIST.AddBlockByte
bcc .1
rts
.8 lda #0
jsr SLIST.AddBlockByte Add an extra 0 to stop Search here
clc
rts
*/--------------------------------------
* # SListSetData
* ## ASM
* `PUSHW DataLen`
* `PUSHW DataPtr`
* `PUSHW KeyID`
* `lda hSList`
* `>SYSCALL SListSetData`
* ## RETURN VALUE
*\--------------------------------------
K.SListSetData sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListKeyID
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SHARED.PullYA
>STYA ZPSListDataLen
jsr SLIST.Select
jsr SLIST.SkipKey
jsr SLIST.GetDataLen
lda SLIST.DataLen
cmp ZPSListDataLen
bne .9
ldx SLIST.DataLen+1
cpx ZPSListDataLen+1
bne .9
eor #$ff
sta SLIST.nDataCnt
txa
eor #$ff
sta SLIST.nDataCnt+1
.1 inc SLIST.nDataCnt
bne .2
inc SLIST.nDataCnt+1
beq .8
.2 jsr SHARED.GetDataByte
jsr SLIST.SetBlockByte
bra .1
.8 clc
rts
.9 lda #E.DATALEN
sec
rts
*/--------------------------------------
* # SListGetByID
* ## ASM
* `PUSHW KeyPtr`
* `PUSHW KeyID`
* `lda hSList`
* `>SYSCALL SListGetByID`
* ## RETURN VALUE
* Y,A = Next KeyID
*\--------------------------------------
K.SListGetByID sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListKeyID
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SLIST.Select
jsr SLIST.GetNextByte
tax
beq .9
ldy #0
.1 phy
jsr SLIST.GetNextByte
ply
jsr SHARED.SetKeyCharY
iny
dex
bne .1
txa lda #0
jsr SHARED.SetKeyCharY
jsr SLIST.SkipData
>LDYA SLIST.KeyID
clc
rts
.9 lda #E.NOKEY
sec
rts
*/--------------------------------------
* # SListNewKey
* ## ASM
* `PUSHW KeyPtr`
* `lda hSList`
* `>SYSCALL SListNewKey`
* ## RETURN VALUE
* Y,A = KeyID
* X = KeyLen
*\--------------------------------------
K.SListNewKey sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SLIST.Search
bcc .99
lda SLIST.KeyLen
jsr SLIST.AddBlockByte
bcs .9
ldy #0
.1 jsr SHARED.GetKeyCharY
jsr SLIST.AddBlockByte
bcs .9
iny
cpy SLIST.KeyLen
bne .1
lda #0 Data Len = 0
jsr SLIST.AddBlockByte
bcs .9
lda #0
jsr SLIST.AddBlockByte
bcs .9
lda #0 Next Len = 0
jsr SLIST.AddBlockByte
bcs .9
>LDYA ZPSListKeyID
ldx SLIST.KeyLen
clc
rts
.99 lda #E.DUPKEY
sec
.9 rts
*/--------------------------------------
* # SListLookup
* ## ASM
* `PUSHW KeyPtr`
* `lda hSList`
* `>SYSCALL SListLookup`
* ## RETURN VALUE
* Y,A = KeyID
* X = Key Length
*\--------------------------------------
K.SListLookup sta SLIST.hList
jsr SHARED.PullYA
>STYA ZPSListDataPtr
jsr SLIST.Search
bcs .9
>LDYA ZPSListKeyID
ldx SLIST.KeyLen
.9 rts
*/--------------------------------------
* # SListNew
* ## ASM
* `>SYSCALL SListNew`
* ## RETURN VALUE
* A=hSList
*\--------------------------------------
K.SListNew >LDYAI 160 40k Max before out of memory!!!
jsr K.GetMem0
bcs .9
>STYA ZPSListIBlkPtr
stx .8+1
>LDYAI 256
jsr K.GetMem
bcs .9
>STYA ZPSListDBlkPtr
lda #0
sta (ZPSListDBlkPtr)
txa
sta (ZPSListIBlkPtr)
.8 lda #$ff SELF MODIFIED
.9 rts
*/--------------------------------------
* # SListFree
* ## ASM
* `lda hSList`
* `>SYSCALL SListFree`
* ## RETURN VALUE
*\--------------------------------------
K.SListFree sta .8+1
jsr K.GetMemPtr
>STYA .1+1
ldx #0
.1 lda $ffff,x SELF MODIFIED
beq .8
jsr K.FreeMem
inx
bra .1
.8 lda #$ff SELF MODIFIED
jmp K.FreeMem
*--------------------------------------
* PRIVATE
*--------------------------------------
SLIST.Search lda SLIST.hList
jsr K.GetMemPtr
>STYA ZPSListIBlkPtr
lda (ZPSListIBlkPtr)
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
ldy #$ff
.1 iny
jsr SHARED.GetKeyCharY
bcc .1
sty SLIST.KeyLen
stz SLIST.BytePtr
stz SLIST.BlockPtr
.2 >LDYA SLIST.KeyID
>STYA ZPSListKeyID
ldy SLIST.BytePtr
lda (ZPSListDBlkPtr),y
beq .9
cmp SLIST.KeyLen
bne .5
jsr SLIST.GetNextByte Skip Len
ldy #0
.3 phy
jsr SLIST.GetNextByte
sta .4+1
ply
jsr SHARED.GetKeyCharY
.4 cmp #$ff SELF MODIFIED
bne .5
iny
cpy SLIST.KeyLen
bne .3
clc
rts
.5 jsr SLIST.Select.I move back to ZPSListKeyID
jsr SLIST.Next
bra .2
.9 lda #E.NOKEY
sec
rts
*--------------------------------------
SLIST.Select lda SLIST.hList
jsr K.GetMemPtr
>STYA ZPSListIBlkPtr
SLIST.Select.I ldy ZPSListKeyID+1
sty SLIST.BlockPtr
lda (ZPSListIBlkPtr),y
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
lda ZPSListKeyID
sta SLIST.BytePtr
rts
*--------------------------------------
SLIST.Next jsr SLIST.SkipKey
SLIST.SkipData jsr SLIST.GetDataLen
lda SLIST.DataLen
ldx SLIST.DataLen+1
SLIST.SkipDataAX
clc
adc SLIST.BytePtr
sta SLIST.BytePtr
txa
adc SLIST.BlockPtr
sta SLIST.BlockPtr
tay
lda (ZPSListIBlkPtr),y
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
rts
*--------------------------------------
SLIST.SkipKey ldy SLIST.BytePtr
lda (ZPSListDBlkPtr),y Get KeyLen
sec
adc SLIST.BytePtr
sta SLIST.BytePtr
bcs SLIST.ToNextBlock
.8 rts
*--------------------------------------
SLIST.GetDataLen
jsr SLIST.GetNextByte Get DataLenLo
sta SLIST.DataLen
jsr SLIST.GetNextByte Get DataLenHI
sta SLIST.DataLen+1
rts
*--------------------------------------
SLIST.GetNextByte
ldy SLIST.BytePtr
lda (ZPSListDBlkPtr),y
SLIST.ToNextByte
inc SLIST.BytePtr
bne .8
pha
jsr SLIST.ToNextBlock
pla
.8 rts
*--------------------------------------
SLIST.AddBlockByte
phy
ldy SLIST.BytePtr
sta (ZPSListDBlkPtr),y
inc SLIST.BytePtr
bne .8
phx
>LDYAI 256
jsr K.GetMem
bcs .9
>STYA ZPSListDBlkPtr
txa
inc SLIST.BlockPtr
ldy SLIST.BlockPtr
sta (ZPSListIBlkPtr),y
* stz SLIST.BytePtr
plx
.8 ply
clc
rts
.9 plx
ply
rts
*--------------------------------------
SLIST.SetBlockByte
ldy SLIST.BytePtr
sta (ZPSListDBlkPtr),y
inc SLIST.BytePtr
bne SLIST.ToNextBlock.RTS
*--------------------------------------
SLIST.ToNextBlock
inc SLIST.BlockPtr
ldy SLIST.BlockPtr
lda (ZPSListIBlkPtr),y
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
SLIST.ToNextBlock.RTS
rts
*--------------------------------------
SLIST.hList .BS 1
SLIST.KeyLen .BS 1
SLIST.DataLen .BS 2
SLIST.nDataCnt .BS 2
SLIST.nBufCnt .BS 2
SLIST.bStringMode .BS 1
SLIST.KeyID .EQ *
SLIST.BytePtr .BS 1
SLIST.BlockPtr .BS 1
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.SLISTX
LOAD USR/SRC/SYS/KERNEL.S
ASM