NEW
  AUTO 3,1
*--------------------------------------
ZPSListDataOfs 	.EQ ZPMEMMGR+8
ZPSListDataLen 	.EQ ZPMEMMGR+10
*--------------------------------------
SLISTX.Opt		.BS 1
SLISTX.KeyLen	.BS 1
SLISTX.DataLen	.BS 2
SLISTX.nDataCnt	.BS 2
SLISTX.nBufCnt	.BS 2
SLISTX.bStr		.BS 1
SLISTX.b0		.BS 1
SLISTX.KeyID	.BS 2
*--------------------------------------
SLISTX.GetData	jsr SLISTX.Select

				jsr SLISTX.SkipKey

				jsr SLISTX.GetDataLen

				lda SLISTX.DataLen
				sec
				sbc ZPSListDataOfs		Offset
				eor #$ff
				sta SLISTX.nDataCnt

				lda SLISTX.DataLen+1
				sbc ZPSListDataOfs+1
				eor #$ff
				sta SLISTX.nDataCnt+1	Data remaining

				bcc .99					Offset Beyond DataLen

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

				stz SLISTX.b0

				lda FORPNT
				ora FORPNT+1
				bne .12					buffer provided

				>LDYA SLISTX.DataLen

				iny
				bne .11

				inc						+1 for ending 0

				sec
				ror SLISTX.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 SLISTX.nBufCnt
				lda ZPSListDataLen+1
				eor #$ff
				sta SLISTX.nBufCnt+1
				clc

.1				ror SLISTX.bStr

				stz ZPSListDataLen
				stz ZPSListDataLen+1

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

.3				bit SLISTX.bStr
				bmi .4					String mode : until CR
				
				inc SLISTX.nBufCnt
				bne .4

				inc SLISTX.nBufCnt+1
				beq .80					not string mode : until end of buffer

.4				jsr BLISTX.GetNByte
				bit SLISTX.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 SLISTX.bStr
				ora SLISTX.b0
				bpl .82

.81				lda #0
				jsr SHARED.FORPNTpn

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

				jsr SLISTX.SkipKey

				jsr SLISTX.CheckLen
				
				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 SLISTX.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 SLISTX.Select

				jsr SLISTX.SkipKey

				jsr SLISTX.CheckLen

				jsr SLISTX.GetDataLen

				lda SLISTX.DataLen
				cmp ZPSListDataLen
				bne .9

				ldx SLISTX.DataLen+1
				cpx ZPSListDataLen+1
				bne .9

				eor #$ff
				sta SLISTX.nDataCnt
				txa
				eor #$ff
				sta SLISTX.nDataCnt+1
				
.1				inc SLISTX.nDataCnt
				bne .2
				
				inc SLISTX.nDataCnt+1
				beq .8
				
.2				jsr SHARED.FORPNTgn
				jsr BLISTX.SetBlkByte
				bra .1

.8				clc
				rts

.9				lda #E.DATALEN
				sec
				rts
*--------------------------------------
SLISTX.CheckLen	lda ZPSListDataLen
				ora ZPSListDataLen+1
				bne .8

				tax						ldx #0
				tay						ldy #0
				
				lda FORPNT+1
				pha
				
.1				jsr SHARED.FORPNTgY
				beq .2
				
				iny
				bne .1
				
				inx
				bra .1

.2				iny						add Ending \0
				bne .3
				
				inx
				
.3				sty ZPSListDataLen
				stx ZPSListDataLen+1
				
				pla
				sta FORPNT+1

.8				rts
*--------------------------------------
SLISTX.GetByID	jsr SLISTX.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		ending \0
				
				jsr BLISTX.GetNByte		ScopeID lo
				jsr SHARED.FORPNTpn

				jsr BLISTX.GetNByte		ScopeID hi
				jsr SHARED.FORPNTpn

				jsr SLISTX.SkipData
				>LDYA KeyID
				clc
				rts

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

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

				ldy #0

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

				iny
				cpy SLISTX.KeyLen
				bne .1

				lda FORPNT
				jsr BLISTX.AddByte		ScopeID lo
				bcs .9

				lda FORPNT+1			ScopeID hi
				jsr BLISTX.AddByte
				bcs .9

				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
				bcc SLISTX.8
				
				rts
				
.99				lda #E.DUPKEY
				sec
.9				rts
*--------------------------------------
SLISTX.8		>LDYA SLISTX.KeyID
				ldx SLISTX.KeyLen
				clc
				rts
*--------------------------------------
SLISTX.Lookup	jsr K.GetMemPtr
				>STYA IBlkPtr

				lda (IBlkPtr)	
				sta SLISTX.Opt
				
				stz iByte

				ldy #1
				sty iBlk

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

				ldy #$ff

.1				iny
				jsr SHARED.TXTPTRgY
				beq .2

				jsr SLISTX.IsIDValid
				bcc .1
				
.2				sty SLISTX.KeyLen

.3				>LDYA KeyID
				>STYA SLISTX.KeyID
				
				ldy iByte
				lda (DBlkPtr),y
				beq .9

				cmp SLISTX.KeyLen
				bne .6
				
				jsr BLISTX.GetNByte		Skip Len

				ldy #0

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

				iny
				cpy SLISTX.KeyLen
				bne .4

				jsr SLISTX.GetDataLen	Get Scope
				cmp FORPNT+1
				bne .6
				
				lda FORPNT
				cmp SLISTX.DataLen
				beq SLISTX.8

.6				>LDYA SLISTX.KeyID
				
				jsr SLISTX.Select.I		move back...
				jsr SLISTX.SkipKey			
				jsr SLISTX.SkipData
				bra	.3

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

				>LDYA TXTPTR

SLISTX.Select.I	>STYA KeyID

				ldy iBlk

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

				rts
*--------------------------------------
SLISTX.SkipKey	ldy iByte
				lda (DBlkPtr),y			Get KeyLen
				sec						len
				inc
				inc						Skip ScopeID
				adc iByte
				sta iByte
				bcc .8

				jmp BLISTX.2NBlk

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

				rts
*--------------------------------------
SLISTX.GetDataLen
				jsr BLISTX.GetNByte		Get DataLenLo
				sta SLISTX.DataLen
				jsr BLISTX.GetNByte		Get DataLenHI
				sta SLISTX.DataLen+1
				rts
*--------------------------------------
SLISTX.IsIDValid
				bit SLISTX.Opt
				bpl .2

				cmp #'.'
				beq .8

.1				bit SLISTX.Opt
.2				bvc .3

				cmp #'_'
				beq .8

.3				jmp SHARED.IsDigitOrL
				
.8				clc
				rts
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.slistx
LOAD usr/src/sys/kernel.s
ASM
