NEW
PREFIX
AUTO 4,1
*--------------------------------------
X.SLIST			jmp (.1-SYS.SListAddData,x)
.1				.DA SLIST.Add
				.DA SLIST.Lookup
				.DA SLIST.GetByID
				.DA SLIST.UpdateByID
				.DA SLIST.New
				.DA SLIST.Free
*--------------------------------------
SLIST.Add		jsr SLIST.Search
				bcc .99					Lookup succeeded...DUP
				
				ldy #$ff
				
.1				iny
				jsr MEM.GetKeyCharY
				bcc .1
				
				sty .8+1
				tya
				beq .9					CS
				
				jsr SLIST.AddBlockByte
				bcs .9
				
				ldy #0
				
.2				jsr MEM.GetKeyCharY
				bcs .3
				
				jsr SLIST.AddBlockByte
				bcs .9
				iny
				bra .2
				
.3				jsr MEM.GetDataByte
				tax

				jsr SLIST.AddBlockByte
				bcs .9
				
.4				jsr MEM.GetDataByte
								
				jsr SLIST.AddBlockByte
				bcs .9

				dex
				bne .4
				
.8				lda #$ff				SELF MODIFIED

				clc
				.HS B0					BCS
				
.99				sec
				ldx ZPSListID
				ldy ZPSListID+1

.9				rts
*--------------------------------------
SLIST.Lookup	jsr SLIST.Search
				
				bcs .9

				sty .8+1				Save Key Length
				
				jsr SLIST.GetBlockByte
				tax
				jsr MEM.SetDataByte

.1				jsr SLIST.GetNextBlockByte
				jsr MEM.SetDataByte
				dex
				bne .1

.8				lda #$ff				SELF MODIFIED
				ldx ZPSListID
				ldy ZPSListID+1
				
				clc				
.9				rts
*--------------------------------------
SLIST.GetByID	jsr SLIST.Select

				jsr SLIST.GetBlockByte
				
				tax
				beq .9
				
				ldy #0
				
				jsr MEM.SetKeyCharY
				
.1				jsr SLIST.GetNextBlockByte
				iny
				jsr MEM.SetKeyCharY
				dex
				bne .1
				
				jsr SLIST.GetNextBlockByte
				
				tax
				
				jsr MEM.SetDataByte
				
.2				jsr SLIST.GetNextBlockByte
				jsr MEM.SetDataByte
				dex
				bne .2
				
				jsr SLIST.GetNextBlockByte
								
				clc
				.HS B0					BCS
.9				sec
				ldx SLIST.BlockOfs
				ldy SLIST.IndexOfs
				rts
*--------------------------------------
SLIST.UpdateByID
				jsr SLIST.Select
				
				jsr SLIST.GetBlockByte
				tax
				
.1				jsr SLIST.GetNextBlockByte
				dex
				bne .1
				
				jsr SLIST.GetNextBlockByte	set pos at DATALEN
				
				jsr MEM.GetDataByte
				tax
				
				jsr SLIST.SetBlockByte
				
.4				jsr MEM.GetDataByte
				jsr SLIST.SetBlockByte
				dex
				bne .4
				
				clc
				rts
*--------------------------------------
SLIST.New		>LDYAI 160				40k Max before out of memory!!!
				jsr K.GetMem0
				bcs .9
				>STYA ZPSListIBlkPtr
				stx .8+1
				
				>LDYAI 256
				jsr K.GetMem0
				bcs .9
				txa
				sta (ZPSListIBlkPtr)
				
.8				lda #$ff				SELF MODIFIED				
				
.9				rts
*--------------------------------------
SLIST.Free		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
*--------------------------------------
SLIST.Select	jsr K.GetMemPtr
				>STYA ZPSListIBlkPtr

				ldy ZPSListID+1
				sty SLIST.IndexOfs
				
				lda (ZPSListIBlkPtr),y				
				jsr K.GetMemPtr
				>STYA ZPSListDBlkPtr
				
				lda ZPSListID
				sta SLIST.BlockOfs
				rts
*--------------------------------------				
SLIST.Search	jsr K.GetMemPtr
				>STYA ZPSListIBlkPtr

				stz SLIST.IndexOfs
				stz	ZPSListID+1
				
				lda (ZPSListIBlkPtr)			
				jsr K.GetMemPtr
				>STYA ZPSListDBlkPtr
				
				stz SLIST.BlockOfs
				stz ZPSListID
				
				jsr SLIST.GetBlockByte
				tax
				beq .9

.1				ldy #0
				
.2				jsr MEM.GetKeyCharY
				bcs .40
				iny
				sta .3+1 
				
				jsr SLIST.GetNextBlockByte
.3				cmp #$ff				SELF MODIFIED
				bne .4
				
				dex
				bne .2
				
				jsr MEM.GetKeyCharY
				bcs .8					End of Key....match!!!!
				
				jsr SLIST.GetNextBlockByte
				bra .41
				
.8				jsr SLIST.GetNextBlockByte	Advance to DATA LEN
				
				clc						Y = Key Length
				rts
				
.40				inx
				
.4				jsr SLIST.GetNextBlockByte	skip remaining key chars
				dex
				bne .4
				
.41				tax						A=get Data Len
				
.5				jsr SLIST.GetNextBlockByte	skip data bytes
				dex
				bne .5
				
				jsr SLIST.GetNextBlockByte
				
				ldx SLIST.IndexOfs
				stx	ZPSListID+1
				ldx SLIST.BlockOfs
				stx ZPSListID
				
				tax
				bne .1
				
.9				sec
				rts
*--------------------------------------
SLIST.GetNextBlockByte
				phy
				ldy SLIST.BlockOfs
				iny
				beq .1
				
				lda (ZPSListDBlkPtr),y
				sty SLIST.BlockOfs
				ply
				rts
				
.1				ldy SLIST.IndexOfs 
				iny
				lda (ZPSListIBlkPtr),y
				beq .9					Exit with A=0
				
				sty SLIST.IndexOfs
				
				jsr K.GetMemPtr
				>STYA ZPSListDBlkPtr
				stz SLIST.BlockOfs

				lda (ZPSListDBlkPtr)
.9				ply
				rts
				
SLIST.GetBlockByte
				phy
				ldy SLIST.BlockOfs
				lda (ZPSListDBlkPtr),y
				ply
				rts
*--------------------------------------
SLIST.AddBlockByte
				phy
				ldy SLIST.BlockOfs
				sta (ZPSListDBlkPtr),y
				inc SLIST.BlockOfs
				bne .8
				
				phx
				>LDYAI 256
				jsr K.GetMem0
				bcs .9
				>STYA ZPSListDBlkPtr
				txa

				inc SLIST.IndexOfs 
				ldy SLIST.IndexOfs 
				sta (ZPSListIBlkPtr),y

*				stz SLIST.BlockOfs
				
				plx
				
.8				ply
				clc
				rts

.9				plx
				ply
				sec
				rts				
*--------------------------------------
SLIST.SetBlockByte
				phy
				ldy SLIST.BlockOfs
				sta (ZPSListDBlkPtr),y
				inc SLIST.BlockOfs
				bne .8
				
				inc SLIST.IndexOfs 
				
				ldy SLIST.IndexOfs 
				lda (ZPSListIBlkPtr),y
				beq *
				jsr K.GetMemPtr
				>STYA ZPSListDBlkPtr
*				stz SLIST.BlockOfs
				
.8				ply
				rts
*--------------------------------------
SLIST.IndexOfs	.BS 1
SLIST.BlockOfs	.BS 1
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.SLIST
LOAD USR/SRC/SYS/KERNEL.S
ASM
