NEW AUTO 3,1 *-------------------------------------- ZPSListKeyID .EQ ZPMEMMGR+6 ZPSListDataPtr .EQ ZPMEMMGR+8 ZPSListDataLen .EQ ZPMEMMGR+10 ZPSListIBlkPtr .EQ ZPMEMMGR+12 ZPSListDBlkPtr .EQ ZPMEMMGR+14 */-------------------------------------- * # SListGetData * ## ASM * `PUSHW DataOfs` (Start offset in Data) * `PUSHW DataLen` (Data bytes to return, 0 if String mode) * `PUSHW DataPtr` (0 if KERNEL should allocate a buffer) * `PUSHW KeyID` * `lda hSList` * `>SYSCALL SListGetData` * ## RETURN VALUE * Y,A = Byte Count * X = hMem (if DataPtr = 0) *\-------------------------------------- K.SListGetData sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListKeyID jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SHARED.PullYA >STYA ZPSListDataLen jsr SHARED.PullYA >STYA ZPMemMgrSize jsr SLIST.Select jsr SLIST.SkipKey jsr SLIST.GetDataLen lda SLIST.DataLen sec sbc ZPMemMgrSize Offset eor #$ff sta SLIST.nDataCnt lda SLIST.DataLen+1 sbc ZPMemMgrSize+1 eor #$ff sta SLIST.nDataCnt+1 Data remaining bcc .99 Offset Beyond DataLen .10 lda ZPMemMgrSize Skip to Offset ldx ZPMemMgrSize+1 jsr SLIST.SkipDataAX lda ZPSListDataPtr ora ZPSListDataPtr+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 .82+1 >STYA ZPSListDataPtr .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 .8 .3 bit SLIST.bStringMode bmi .4 String mode : until CR inc SLIST.nBufCnt bne .4 inc SLIST.nBufCnt+1 beq .8 .4 jsr SLIST.GetNextByte bit SLIST.bStringMode bpl .5 cmp #C.CR beq .8 .5 jsr SHARED.SetDataByte inc ZPSListDataLen bne .2 inc ZPSListDataLen+1 bra .2 .99 lda #E.EMPTYKEY sec .9 rts .8 lda #0 jsr SHARED.SetDataByte .81 >LDYA ZPSListDataLen .82 ldx #$ff SELF MODIFIED clc rts */-------------------------------------- * # SListAddData * ## ASM * `PUSHW DataLen` * `PUSHW DataPtr` * `PUSHW KeyID` * `lda hSList` * `>SYSCALL SListAddData` * ## RETURN VALUE *\-------------------------------------- K.SListAddData sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListKeyID jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SHARED.PullYA >STYA ZPSListDataLen jsr SLIST.Select jsr SLIST.SkipKey >LDYA SLIST.KeyID Save DataLen location >STYA ZPSListKeyID to update later 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 .1 inc ZPSListDataLen bne .2 inc ZPSListDataLen+1 beq .8 .2 jsr SHARED.GetDataByte jsr SLIST.AddBlockByte bcc .1 rts .8 lda #0 jsr SLIST.AddBlockByte Add an extra 0 to stop Search here clc rts */-------------------------------------- * # SListSetData * ## ASM * `PUSHW DataLen` * `PUSHW DataPtr` * `PUSHW KeyID` * `lda hSList` * `>SYSCALL SListSetData` * ## RETURN VALUE *\-------------------------------------- K.SListSetData sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListKeyID jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SHARED.PullYA >STYA ZPSListDataLen 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.GetDataByte jsr SLIST.SetBlockByte bra .1 .8 clc rts .9 lda #E.DATALEN sec rts */-------------------------------------- * # SListGetByID * ## ASM * `PUSHW KeyPtr` * `PUSHW KeyID` * `lda hSList` * `>SYSCALL SListGetByID` * ## RETURN VALUE * Y,A = Next KeyID *\-------------------------------------- K.SListGetByID sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListKeyID jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SLIST.Select jsr SLIST.GetNextByte tax beq .9 ldy #0 .1 phy jsr SLIST.GetNextByte ply jsr SHARED.SetKeyCharY iny dex bne .1 txa lda #0 jsr SHARED.SetKeyCharY jsr SLIST.SkipData >LDYA SLIST.KeyID clc rts .9 lda #E.NOKEY sec rts */-------------------------------------- * # SListNewKey * ## ASM * `PUSHW KeyPtr` * `lda hSList` * `>SYSCALL SListNewKey` * ## RETURN VALUE * Y,A = KeyID * X = KeyLen *\-------------------------------------- K.SListNewKey sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SLIST.Search bcc .99 lda SLIST.KeyLen jsr SLIST.AddBlockByte bcs .9 ldy #0 .1 jsr SHARED.GetKeyCharY jsr SLIST.AddBlockByte bcs .9 iny cpy SLIST.KeyLen bne .1 lda #0 Data Len = 0 jsr SLIST.AddBlockByte bcs .9 lda #0 jsr SLIST.AddBlockByte bcs .9 lda #0 Next Len = 0 jsr SLIST.AddBlockByte bcs .9 >LDYA ZPSListKeyID ldx SLIST.KeyLen clc rts .99 lda #E.DUPKEY sec .9 rts */-------------------------------------- * # SListLookup * ## ASM * `PUSHW KeyPtr` * `lda hSList` * `>SYSCALL SListLookup` * ## RETURN VALUE * Y,A = KeyID * X = Key Length *\-------------------------------------- K.SListLookup sta SLIST.hList jsr SHARED.PullYA >STYA ZPSListDataPtr jsr SLIST.Search bcs .9 >LDYA ZPSListKeyID ldx SLIST.KeyLen .9 rts */-------------------------------------- * # SListNew * ## ASM * `>SYSCALL SListNew` * ## RETURN VALUE * A=hSList *\-------------------------------------- K.SListNew >LDYAI 160 40k Max before out of memory!!! jsr K.GetMem0 bcs .9 >STYA ZPSListIBlkPtr stx .8+1 >LDYAI 256 jsr K.GetMem bcs .9 >STYA ZPSListDBlkPtr lda #0 sta (ZPSListDBlkPtr) txa sta (ZPSListIBlkPtr) .8 lda #$ff SELF MODIFIED .9 rts */-------------------------------------- * # SListFree * ## ASM * `lda hSList` * `>SYSCALL SListFree` * ## RETURN VALUE *\-------------------------------------- K.SListFree 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 *-------------------------------------- * PRIVATE *-------------------------------------- SLIST.Search lda SLIST.hList jsr K.GetMemPtr >STYA ZPSListIBlkPtr lda (ZPSListIBlkPtr) jsr K.GetMemPtr >STYA ZPSListDBlkPtr ldy #$ff .1 iny jsr SHARED.GetKeyCharY bcc .1 sty SLIST.KeyLen stz SLIST.BytePtr stz SLIST.BlockPtr .2 >LDYA SLIST.KeyID >STYA ZPSListKeyID 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.GetKeyCharY .4 cmp #$ff SELF MODIFIED bne .5 iny cpy SLIST.KeyLen bne .3 clc rts .5 jsr SLIST.Select.I move back to ZPSListKeyID jsr SLIST.Next bra .2 .9 lda #E.NOKEY sec rts *-------------------------------------- SLIST.Select lda SLIST.hList jsr K.GetMemPtr >STYA ZPSListIBlkPtr SLIST.Select.I ldy ZPSListKeyID+1 sty SLIST.BlockPtr lda (ZPSListIBlkPtr),y jsr K.GetMemPtr >STYA ZPSListDBlkPtr lda ZPSListKeyID sta SLIST.BytePtr 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.AddBlockByte phy ldy SLIST.BytePtr sta (ZPSListDBlkPtr),y inc SLIST.BytePtr bne .8 phx >LDYAI 256 jsr K.GetMem 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 *-------------------------------------- SLIST.hList .BS 1 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 *-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.SLISTX LOAD USR/SRC/SYS/KERNEL.S ASM