A2osX/SYS/KERNEL.S.SLISTX.txt
2020-05-19 22:53:03 +02:00

503 lines
8.8 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
*--------------------------------------
ZPSListDataOfs .EQ ZPMEMMGR+8
ZPSListDataLen .EQ ZPMEMMGR+10
ZPSListIBlkPtr .EQ ZPMEMMGR+12
ZPSListDBlkPtr .EQ ZPMEMMGR+14
*--------------------------------------
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
SLIST.KeyID.Save .BS 2
*--------------------------------------
SLISTX.SListGetData
jsr SLIST.Select
jsr SLIST.SkipKey
jsr SLIST.GetDataLen
lda SLIST.DataLen
sec
sbc ZPSListDataOfs Offset
eor #$ff
sta SLIST.nDataCnt
lda SLIST.DataLen+1
sbc ZPSListDataOfs+1
eor #$ff
sta SLIST.nDataCnt+1 Data remaining
bcc .99 Offset Beyond DataLen
.10 lda ZPSListDataOfs Skip to Offset
ldx ZPSListDataOfs+1
jsr SLIST.SkipDataAX
lda FORPNT
ora FORPNT+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 .88+1
>STYA FORPNT
.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 .81
.3 bit SLIST.bStringMode
bmi .4 String mode : until CR
inc SLIST.nBufCnt
bne .4
inc SLIST.nBufCnt+1
beq .82 not string mode : end of buffer, no extra \0
.4 jsr SLIST.GetNextByte
bit SLIST.bStringMode
bpl .5
cmp #C.CR
beq .81
.5 jsr SHARED.FORPNT.PutNext
inc ZPSListDataLen
bne .2
inc ZPSListDataLen+1
bra .2
.99 lda #E.EMPTYKEY
sec
.9 rts
.80 bit SLIST.bStringMode
bpl .82
.81 lda #0
jsr SHARED.FORPNT.PutNext
.82 >LDYA ZPSListDataLen
.88 ldx #$ff SELF MODIFIED
clc
rts
*--------------------------------------
SLISTX.SListAddData
jsr SLIST.Select
jsr SLIST.SkipKey
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
sec
.1 inc ZPSListDataLen
bne .2
inc ZPSListDataLen+1
beq .8
.2 jsr SHARED.FORPNT.GetNext
bcc .3
jsr SLIST.SetBlockByte override ending 0, already allocated
clc
bra .1
.3 jsr SLIST.AddDataByte
bcc .1
rts
.8 lda #0
jmp SLIST.AddDataByte Add an extra 0 to stop Search here
*--------------------------------------
SLISTX.SListSetData
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.FORPNT.GetNext
jsr SLIST.SetBlockByte
bra .1
.8 clc
rts
.9 lda #E.DATALEN
sec
rts
*--------------------------------------
SLISTX.SListGetByID
jsr SLIST.Select
jsr SLIST.GetNextByte
tax
beq .9
ldy #0
.1 phy
jsr SLIST.GetNextByte
ply
jsr SHARED.FORPNT.PutNext
iny
dex
bne .1
txa lda #0
jsr SHARED.FORPNT.PutNext
jsr SLIST.SkipData
>LDYA SLIST.KeyID
clc
rts
.9 lda #E.NOKEY
sec
rts
*--------------------------------------
SLISTX.SListNewKey
jsr SLIST.Search
bcc .99
>LDYA SLIST.KeyID
>STYA SLIST.KeyID.Save End of list
lda SLIST.KeyLen
jsr SLIST.SetBlockByte override ending 0, already allocated
ldy #0
.1 jsr SHARED.TXTPTR.GetY
jsr SLIST.AddDataByte
bcs .9
iny
cpy SLIST.KeyLen
bne .1
lda #0 Data Len lo = 0
jsr SLIST.AddDataByte
bcs .9
lda #0 Data Len hi = 0
jsr SLIST.AddDataByte
bcs .9
lda #0 Ending Len = 0
jsr SLIST.AddDataByte
bcs .9
>LDYA SLIST.KeyID.Save
ldx SLIST.KeyLen
* clc
rts
.99 lda #E.DUPKEY
sec
.9 rts
*--------------------------------------
SLISTX.SListLookup
jsr SLIST.Search
bcs .9
ldx SLIST.KeyLen
.9 rts
*--------------------------------------
SLISTX.SListFree
pha
jsr K.GetMemPtr
>STYA .1+1
ldx #0
.1 lda $ffff,x SELF MODIFIED
beq .8
jsr K.FreeMem
inx
bra .1
.8 pla
jmp K.FreeMem
*--------------------------------------
SLISTX.SListNew >LDYAI 128 32k Max before out of memory!!!
ldx #S.MEM.F.INIT0+8 index
jsr MEM.GetMem.YAX
bcs .9
>STYA ZPSListIBlkPtr
stx .8+1
>LDYAI 256
ldx #4 data
jsr MEM.GetMem.YAX
bcs .9
>STYA ZPSListDBlkPtr
lda #0
sta (ZPSListDBlkPtr)
txa
sta (ZPSListIBlkPtr)
.8 lda #$ff SELF MODIFIED
.9 rts
*--------------------------------------
* PRIVATE
*--------------------------------------
SLIST.Search jsr K.GetMemPtr
>STYA ZPSListIBlkPtr
lda (ZPSListIBlkPtr)
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
ldy #$ff
.1 iny
jsr SHARED.TXTPTR.GetY
beq .11
jsr SHARED.IsIDValid
bcc .1
.11 sty SLIST.KeyLen
stz SLIST.BytePtr
stz SLIST.BlockPtr
.2 >LDYA SLIST.KeyID
>STYA SLIST.KeyID.Save
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.TXTPTR.GetY
.4 cmp #$ff SELF MODIFIED
bne .5
iny
cpy SLIST.KeyLen
bne .3
>LDYA SLIST.KeyID.Save
clc
rts
.5 >LDYA SLIST.KeyID.Save
jsr SLIST.Select.I move back...
jsr SLIST.Next
bra .2
.9 lda #E.NOKEY
sec
rts
*--------------------------------------
SLIST.Select jsr K.GetMemPtr
>STYA ZPSListIBlkPtr
>LDYA TXTPTR
SLIST.Select.I >STYA SLIST.KeyID
ldy SLIST.BlockPtr
lda (ZPSListIBlkPtr),y
jsr K.GetMemPtr
>STYA ZPSListDBlkPtr
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.AddDataByte
phy
ldy SLIST.BytePtr
sta (ZPSListDBlkPtr),y
inc SLIST.BytePtr
bne .8
phx
>LDYAI 256
ldx #4
jsr MEM.GetMem.YAX
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
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.SLISTX
LOAD USR/SRC/SYS/KERNEL.S
ASM