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 buffer provided >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 .80 .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