NEW
  AUTO 3,1
*--------------------------------------
ZPSListDataOfs 	.EQ ZPMEMMGR+8
ZPSListDataLen 	.EQ ZPMEMMGR+10
*--------------------------------------
SLIST.KeyLen	.BS 1
SLIST.DataLen	.BS 2
SLIST.nDataCnt	.BS 2
SLIST.nBufCnt	.BS 2
SLIST.bStr		.BS 1
SLIST.b0		.BS 1
SLIST.KeyID		.BS 2
*--------------------------------------
SLISTX.GetData	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

				lda ZPSListDataOfs		Skip to Offset
				ldx ZPSListDataOfs+1
				jsr SLIST.SkipDataAX

				stz SLIST.b0

				lda FORPNT
				ora FORPNT+1
				bne .12					buffer provided

				>LDYA SLIST.DataLen

				iny
				bne .11
				inc						+1 for ending 0

				sec
				ror SLIST.b0

.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.bStr

				stz ZPSListDataLen
				stz ZPSListDataLen+1

.2				inc SLIST.nDataCnt
				bne .3
				inc SLIST.nDataCnt+1
				beq .80

.3				bit SLIST.bStr
				bmi .4					String mode : until CR
				
				inc SLIST.nBufCnt
				bne .4
				inc SLIST.nBufCnt+1
				beq .80					not string mode : until end of buffer

.4				jsr BLISTX.GetNByte
				bit SLIST.bStr
				bpl .5

				cmp #C.CR
				beq .81

.5				jsr SHARED.FORPNTpn
				inc ZPSListDataLen
				bne .2
				inc ZPSListDataLen+1
				bra .2

.99				lda #E.EMPTYKEY
				sec
.9				rts

.80				lda SLIST.bStr
				ora SLIST.b0
				bpl .82

.81				lda #0
				jsr SHARED.FORPNTpn

.82				>LDYA ZPSListDataLen
.88				ldx #$ff				SELF MODIFIED
				clc
				rts
*--------------------------------------
SLISTX.AddData	jsr SLIST.Select

				jsr SLIST.SkipKey

				ldy iByte
				lda (DBlkPtr),y
				pha
				clc
				adc ZPSListDataLen
				sta (DBlkPtr),y
				php
				jsr BLISTX.2NByte		skip LEN lo

				plp
				ldy iByte
				lda (DBlkPtr),y
				pha
				adc ZPSListDataLen+1
				sta (DBlkPtr),y
				jsr BLISTX.2NByte		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.FORPNTgn
				bcc .3
				
				jsr BLISTX.SetBlkByte	override ending 0, already allocated
				clc
				bra .1
				
.3				jsr BLISTX.AddByte
				bcc .1
				rts

.8				lda #0
				jmp BLISTX.AddByte		Add an extra 0 to stop Search here
*--------------------------------------
SLISTX.SetData	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.FORPNTgn
				jsr BLISTX.SetBlkByte
				bra .1

.8				clc
				rts
.9				lda #E.DATALEN
				sec
				rts
*--------------------------------------
SLISTX.GetByID	jsr SLIST.Select

				jsr BLISTX.GetNByte
				tax
				beq .9
				
				ldy #0
				
.1				phy
				jsr BLISTX.GetNByte
				ply
				
				jsr SHARED.FORPNTpn

				iny
				dex
				bne .1
				
				txa 					lda #0

				jsr SHARED.FORPNTpn

				jsr SLIST.SkipData
				>LDYA KeyID
				clc
				rts

.9				lda #E.NOKEY
				sec
				rts
*--------------------------------------
SLISTX.NewKey	jsr SLIST.Search
				bcc .99

				>LDYA KeyID
				>STYA SLIST.KeyID		End of list
				
				lda SLIST.KeyLen
				jsr BLISTX.SetBlkByte	override ending 0, already allocated

				ldy #0

.1				jsr SHARED.TXTPTRgY
				jsr BLISTX.AddByte
				bcs .9

				iny
				cpy SLIST.KeyLen
				bne .1

				lda #0					Data Len lo = 0
				jsr BLISTX.AddByte
				bcs .9

				lda #0					Data Len hi = 0
				jsr BLISTX.AddByte
				bcs .9

				lda #0					Ending Len = 0
				jsr BLISTX.AddByte
				bcs .9

				>LDYA SLIST.KeyID
				ldx SLIST.KeyLen
*				clc
				rts

.99				lda #E.DUPKEY
				sec
.9				rts
*--------------------------------------
SLISTX.Lookup	jsr SLIST.Search
				bcs .9

				ldx SLIST.KeyLen
.9				rts
*--------------------------------------
* 				PRIVATE
*--------------------------------------
SLIST.Search	jsr K.GetMemPtr
				>STYA IBlkPtr

				lda (IBlkPtr)			
				jsr K.GetMemPtr
				>STYA DBlkPtr

				ldy #$ff

.1				iny
				jsr SHARED.TXTPTRgY
				beq .11

				jsr SHARED.IsIDValid
				bcc .1
				
.11				sty SLIST.KeyLen

				stz iByte
				stz iBlk

.2				>LDYA KeyID
				>STYA SLIST.KeyID
				
				ldy iByte
				lda (DBlkPtr),y
				beq .9

				cmp SLIST.KeyLen
				bne .5
				
				jsr BLISTX.GetNByte		Skip Len

				ldy #0

.3				phy
				jsr BLISTX.GetNByte
				sta .4+1
				ply
				
				jsr SHARED.TXTPTRgY
				
.4				cmp #$ff				SELF MODIFIED
				bne .5

				iny
				cpy SLIST.KeyLen
				bne .3

				>LDYA SLIST.KeyID
				clc
				rts

.5				>LDYA SLIST.KeyID
				
				jsr SLIST.Select.I		move back...
				jsr SLIST.Next			
				bra	.2

.9				lda #E.NOKEY
				sec
				rts
*--------------------------------------
SLIST.Select	jsr K.GetMemPtr
				>STYA IBlkPtr

				>LDYA TXTPTR

SLIST.Select.I	>STYA KeyID

				ldy iBlk

				lda (IBlkPtr),y
				jsr K.GetMemPtr
				>STYA DBlkPtr

				rts
*--------------------------------------
SLIST.Next		jsr SLIST.SkipKey

SLIST.SkipData	jsr SLIST.GetDataLen
		
				lda SLIST.DataLen
				ldx SLIST.DataLen+1
SLIST.SkipDataAX
				clc
				adc iByte
				sta iByte
				txa
				adc iBlk
				sta iBlk
				tay
				lda (IBlkPtr),y
				jsr K.GetMemPtr
				>STYA DBlkPtr

				rts
*--------------------------------------
SLIST.SkipKey	ldy iByte
				lda (DBlkPtr),y			Get KeyLen
				sec
				adc iByte
				sta iByte
				bcc .8

				jmp BLISTX.2NBlk

.8				rts
*--------------------------------------
SLIST.GetDataLen
				jsr BLISTX.GetNByte		Get DataLenLo
				sta SLIST.DataLen
				jsr BLISTX.GetNByte		Get DataLenHI
				sta SLIST.DataLen+1
				rts
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.slistx
LOAD usr/src/sys/kernel.s
ASM
