PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * !!!!!!!! DO NOT USE VCPU16 !!!!!!!! * !!!!!! DO NOT USE ZPQuickPTRs !!!!! *-------------------------------------- ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected ZPMemMgrTmp1 .EQ ZPMEMMGR+2 ZPMemMgrTmp2 .EQ ZPMEMMGR+4 ZPMemMgrTmp3 .EQ ZPMEMMGR+6 *-------------------------------------- * TODO : * - Create a 256 bytes table * mapping hMem's to real memory blocks to help * Garbage collector move blocks * - mem.ID=0 always used! useful to test if hMem=0 *-------------------------------------- * PUBLIC *-------------------------------------- * K.GetMem * In: * PULLB = FLAGS * PULLW = Size Requested * Out: * YA = PTR to Mem * X = S.MEM.ID * CS on err *-------------------------------------- K.GetMem >PULLB MemMgr.ReqFlags store requested flags and #S.MEM.F.AUX beq .11 sta SETREADAUX Aux Mem requested,switch to AUX sta SETWRITEAUX .11 >PULLAX Store requested size bit #$0F beq .10 and #$F0 clc adc #$10 bcc .10 inx .10 >STAX MemMgr.ReqSize >LDYAI MemMgr.Table >STYA ZPMemMgrSPtr ldx #0 Current slot=0 lda MemMgr.LastSlot Check if some free slot to reuse first beq .41 sta MemMgr.SlotCnt .1 inx move to next slot jsr MemMgr.NextSlot lda (ZPMemMgrSPtr) Get Flags bmi .4 in use ? .2 lda MemMgr.ReqFlags Found an empty slot and #S.MEM.F.ALIGN is request needs a page align ? beq .3 ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y get LO of PTR bne .4 not page-aligned .3 ldy #S.MEM.LEN lda (ZPMemMgrSPtr),y get LEN of this block cmp MemMgr.ReqSize compare with requested size bne .4 iny lda (ZPMemMgrSPtr),y cmp MemMgr.ReqSize+1 beq .7 requested size matches slot size !!! .4 dec MemMgr.SlotCnt any other slot to check? bne .1 last one, create a new slot *-------------- Create a New SLOT .41 lda MemMgr.ReqFlags and #S.MEM.F.ALIGN is request needs a page align ? beq .6 lda MemMgr.Free target PTR will be page aligned ? sec sbc MemMgr.ReqSize beq .6 yes, allocate tay no, reserve a free slot to fill gap lda #0 jsr MemMgr.AddSlot X = new slot bcs .9 .6 >LDYA MemMgr.ReqSize jsr MemMgr.AddSlot X = new slot bcs .9 *-------------- Reuse this SLOT .7 lda MemMgr.ReqFlags get requested flags ora #S.MEM.F.INUSE mark as in use sta (ZPMemMgrSPtr) and #S.MEM.F.INIT0 beq .8 phx save hMem jsr MemMgr.Init0 plx restore hMem .8 lda #0 ldy #S.MEM.BIN sta (ZPMemMgrSPtr),y inc Mark this slot used by one process ldy #S.MEM.REFCNT sta (ZPMemMgrSPtr),y ldy #S.PS.ID lda (pPs),y ldy #S.MEM.OWNERPID sta (ZPMemMgrSPtr),y ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y pha iny lda (ZPMemMgrSPtr),y A = HI PTR ply Y = LO PTR clc X = Current hMem .9 bit MemMgr.ReqFlags bpl .99 sta CLRREADAUX sta CLRWRITEAUX .99 rts *-------------------------------------- * MemMgr.AddSlot * In: * Y,A = Requested size * Out: *-------------------------------------- MemMgr.AddSlot >STYA ZPMemMgrTmp1 save req size ldx MemMgr.LastSlot inx beq .99 > 255 ERR:OUT OF SLOT lda MemMgr.Free Compute base PTR=FREE-REQ size sec sbc ZPMemMgrTmp1 sta ZPMemMgrTmp2 store new MemMgr.Free in ZPMemMgrTmp2 lda MemMgr.Free+1 sbc ZPMemMgrTmp1+1 sta ZPMemMgrTmp2+1 lda ZPMemMgrTmp2 ensure new MemMgr.Free is not lower sec than LoMem sbc MemMgr.LoMem lda ZPMemMgrTmp2+1 sbc MemMgr.LoMem+1 bcc .98 ERR out of mem jsr MemMgr.NextSlot ldy #S.MEM.PTR lda ZPMemMgrTmp2 get new MemMgr.Free sta MemMgr.Free set as system MemMgr.Free value sta (ZPMemMgrSPtr),y store is as base address of new slot iny lda ZPMemMgrTmp2+1 sta MemMgr.Free+1 sta (ZPMemMgrSPtr),y iny lda ZPMemMgrTmp1 get requested size sta (ZPMemMgrSPtr),y setup slot LEN iny lda ZPMemMgrTmp1+1 sta (ZPMemMgrSPtr),y stx MemMgr.LastSlot mark this slot allocated clc rts .98 lda #MemMgr.ERROOM sec rts .99 lda #MemMgr.ERROOH sec rts *-------------------------------------- MemMgr.NextSlot lda ZPMemMgrSPtr clc adc #S.MEM.SIZE sta ZPMemMgrSPtr bcc .8 inc ZPMemMgrSPtr+1 .8 rts *-------------------------------------- MemMgr.Init0 ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y ZPMemMgrSPtr already set sta .2+1 iny lda (ZPMemMgrSPtr),y sta .2+2 ldy #S.MEM.LEN lda (ZPMemMgrSPtr),y eor #$ff pha iny lda (ZPMemMgrSPtr),y eor #$ff a=not hi count ply y=not lo count ldx #0 .1 iny bne .2 inc beq .8 .2 stz $ffff,x inx bne .1 inc .2+2 bne .1 .8 rts *-------------------------------------- MemMgr.SlotCnt .BS 1 MemMgr.ReqFlags .BS 1 store requested Flags MemMgr.ReqSize .BS 2 store requested Size *-------------------------------------- * K.FreeMemA * In: * A = hMem To Free * Out: * X,Y unmodified *-------------------------------------- K.FreeMemA phy phx tax beq .8 Slot=0, reserved by Kernel jsr K.GetMemByIDA lda (ZPMemMgrSPtr) bpl * In use ? ldy #S.MEM.REFCNT lda (ZPMemMgrSPtr),y Get count of those referencing this hMem dec only one left ? sta (ZPMemMgrSPtr),y bne .8 no, must be a code segment loaded several times ldy #S.MEM.BIN lda (ZPMemMgrSPtr),y Any BINPATH to discard ? beq .1 pha save hMem >PUSHW ZPMemMgrSPtr pla jsr K.GetMemByIDA lda (ZPMemMgrSPtr) bpl * ***MUST BE ALLOCATED*** lda #0 mark BINPATH slot as free sta (ZPMemMgrSPtr) >PULLW ZPMemMgrSPtr .1 lda #0 mark this slot as free sta (ZPMemMgrSPtr) .2 lda MemMgr.LastSlot beq .8 jsr K.GetMemByIDA lda (ZPMemMgrSPtr) bmi .8 ldy #S.MEM.LEN lda (ZPMemMgrSPtr),y give back LEN bytes clc adc MemMgr.Free to MemMgr.Free sta MemMgr.Free iny lda (ZPMemMgrSPtr),y adc MemMgr.Free+1 sta MemMgr.Free+1 dec MemMgr.LastSlot discard last slot bne .2 no slot left, exit .8 plx ply clc rts *-------------------------------------- * K.GetMemPtrA * In: * A = hMem * Out: * Y,A = PTR to MemBlock * X unmodified *-------------------------------------- K.GetMemPtrA jsr K.GetMemByIDA ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y pha iny lda (ZPMemMgrSPtr),y ply rts *-------------------------------------- * K.GetMemByIDA * In: * A = hMem * Out: * Y,A = ZPMemMgrSPtr = PTR to S.MEM * X unmodified *-------------------------------------- K.GetMemByIDA stz ZPMemMgrSPtr+1 asl rol ZPMemMgrSPtr+1 asl rol ZPMemMgrSPtr+1 asl rol ZPMemMgrSPtr+1 * clc IMPLICIT adc #MemMgr.Table tay lda ZPMemMgrSPtr+1 adc /MemMgr.Table sty ZPMemMgrSPtr sta ZPMemMgrSPtr+1 rts *-------------------------------------- * In: * Y,A = BINPATH (PSTR) * Out: * Y,A = ZPMemMgrSPtr = PTR to S.MEM * X = hMem *-------------------------------------- K.GetMemByNameYA >STYA ZPMemMgrTmp1 save BINPATH >LDYAI MemMgr.Table >STYA ZPMemMgrTmp2 ldx #0 .1 cpx MemMgr.LastSlot beq .9 lda (ZPMemMgrTmp2) bpl .6 In Use? ldy #S.MEM.BIN any BIN PATH in this slot? lda (ZPMemMgrTmp2),y beq .6 jsr K.GetMemPtrA get pathname bcs * >STYA ZPMemMgrTmp3 lda (ZPMemMgrTmp1) cmp (ZPMemMgrTmp3) bne .6 tay .2 lda (ZPMemMgrTmp1),y cmp (ZPMemMgrTmp3),y bne .6 dey bne .2 >LDYA ZPMemMgrTmp2 clc rts .6 lda ZPMemMgrTmp2 clc adc #S.MEM.SIZE sta ZPMemMgrTmp2 bcc .7 inc ZPMemMgrTmp2+1 .7 inx bra .1 .9 sec rts *-------------------------------------- K.LoadStockObjectYA *-------------------------------------- K.GetStockObjectA *-------------------------------------- K.FreeStockObject *-------------------------------------- K.SetLoMem clc rts *-------------------------------------- K.GarbageCollector clc rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.MEM LOAD SYS/KERNEL.S ASM