From ec6368a10b547e3dbfc069da344bf48b0fddc59c Mon Sep 17 00:00:00 2001 From: Martin Haye Date: Fri, 28 Aug 2015 08:24:21 -0700 Subject: [PATCH] Fixed memory manager init that didn't properly copy heap code. --- Platform/Apple/virtual/src/core/mem.s | 23 +++-- .../Apple/virtual/src/plasma/gameloop.pla | 92 ++++++++++++++++++- 2 files changed, 102 insertions(+), 13 deletions(-) diff --git a/Platform/Apple/virtual/src/core/mem.s b/Platform/Apple/virtual/src/core/mem.s index 958e26a3..bba80e59 100644 --- a/Platform/Apple/virtual/src/core/mem.s +++ b/Platform/Apple/virtual/src/core/mem.s @@ -19,8 +19,8 @@ MAX_SEGS = 96 DO_COMP_CHECKSUMS = 0 ; during compression debugging DEBUG_DECOMP = 0 -DEBUG = 0 -SANITY_CHECK = 0 ; also prints out request data +DEBUG = 1 +SANITY_CHECK = 1 ; also prints out request data ; Zero page temporary variables tmp = $2 ; len 2 @@ -56,14 +56,17 @@ prodosMemMap = $BF58 ;------------------------------------------------------------------------------ ; Relocate all the pieces to their correct locations relocate: -; first our lo memory piece goes to $800 (two pages should be plenty) +; first our lo memory piece goes to $800 ldy #0 -- lda loMemBegin,y - sta $800,y - lda loMemBegin+$100,y - sta $900,y + ldx #>(loMemEnd-loMemBegin+$FF) +.lold lda loMemBegin,y +.lost sta $800,y iny - bne - + bne .lold + inc .lold+2 + inc .lost+2 + dex + bne .lold ; set up to copy the ProDOS code from main memory to aux bit setLcRW+lcBank1 ; only copy bank 1, because bank 2 is PLASMA runtime bit setLcRW+lcBank1 ; write to it @@ -1167,7 +1170,7 @@ scanForAvail: !zone ;------------------------------------------------------------------------------ main_dispatch: !zone !if SANITY_CHECK { jsr saneStart : jsr + : jmp saneEnd } - pha ++ pha lda #0 beq .go aux_dispatch: @@ -1193,7 +1196,7 @@ aux_dispatch: !if DEBUG { + cmp #DEBUG_MEM bne + - jmp mem_debug + jmp printMem } + cmp #CALC_FREE bne + diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index 39ec75ed..10a43ce5 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -6,10 +6,13 @@ const NULL = 0 /////////////////////////////////////////////////////////////////////////////////////////////////// // Fixed memory locations -const seed = $4E // Incremented continuously by montitor's rdkey routine +const seed = $4E // Incremented continuously by keyboard read routine const displayEngine = $6000 // main mem (raycaster and tile engine at same location) const expandVec = $2000 // aux mem (only for raycaster) const fontEngine = $E000 // main mem +const heapStart = $F000 // main mem + +const heapSize = $800 /////////////////////////////////////////////////////////////////////////////////////////////////// // Resource numbers @@ -70,6 +73,44 @@ const callbacks = $300 const OVERMAP_NUM = 1 const OVERMAP_IS_3D = 0 +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Structures for testing the heap system +const TYPE_GLOBAL = $80 +struc Global + byte type + word id + word players +end + +const TYPE_PLAYER = $81 +struc Player + byte type + word id + word nextObj + word name + byte muscle + byte quickness + word items + word health +end + +const TYPE_ITEM = $82 +struc Item + byte type + word id + word nextObj + word name + byte kind + byte cost +end + +// Table per type, starts with length, then pointer offsets, ending with zero. +byte typeTbl_Global[] = Global, players, 0 +byte typeTbl_Player[] = Player, nextObj, items, 0 +byte typeTbl_Item[] = Item, nextObj, 0 + +byte typeCounts[256] + /////////////////////////////////////////////////////////////////////////////////////////////////// // Predefined functions, for circular calls or out-of-order calls predef setWindow2, initCmds @@ -482,9 +523,9 @@ asm mmgr +asmPlasm 2 lda evalStkL+1,x ; command code pha - ldy evalStkH,x ; address (or other param) + ldy evalStkH,x ; address (or other param)... hi byte in Y lda evalStkL,x - tax + tax ; ...lo byte in X pla jsr mainLoader ; ret value in X=lo/Y=hi txa ; to A=lo/Y=hi for asmPlasm @@ -1349,6 +1390,8 @@ def loadTitle() puts("Loading Lawless Legends.\n") // Load the title screen + mmgr(UNLOCK_MEMORY, $2000) + mmgr(FREE_MEMORY, $2000) mmgr(SET_MEM_TARGET, $2000) mmgr(QUEUE_LOAD, 1<<8 | RES_TYPE_SCREEN) // title screen is fixed at #1 mmgr(LOCK_MEMORY, $2000) @@ -1428,9 +1471,52 @@ def setCallbacks() callbacks:40 = @clearWindow end +/////////////////////////////////////////////////////////////////////////////////////////////////// +def newObj(typeNum) + typeCounts[typeNum] = typeCounts[typeNum] + 1 + return mmgr(HEAP_ALLOC, type) +end + +/////////////////////////////////////////////////////////////////////////////////////////////////// +def freeObj(ptr) + byte typeNum + if ptr == NULL; return; fin + typeNum = ^ptr + typeCounts[typeNum] = typeCounts[typeNum] - 1 + if typeCounts[typeNum] == 0 + when type + is TYPE_GLOBAL + fatal("can't free global obj") + is TYPE_PLAYER + freeObj(ptr:nextObj) + freeObj(ptr:name) + freeObj(ptr:items) + break + is TYPE_ITEM + freeObj(ptr:nextObj) + freeObj(ptr:name) + break + wend + fin +end + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Set up the small-object heap +def initHeap() + mmgr(SET_MEM_TARGET, heapStart) + mmgr(REQUEST_MEMORY, heapSize) + mmgr(LOCK_MEMORY, heapStart) + mmgr(HEAP_SET, heapStart) + mmgr(HEAP_ADD_TYPE, typeTbl_Global) + mmgr(HEAP_ADD_TYPE, typeTbl_Player) + mmgr(HEAP_ADD_TYPE, typeTbl_Item) + newObj(TYPE_GLOBAL) +end + /////////////////////////////////////////////////////////////////////////////////////////////////// // Main code. // +initHeap() loadTitle() setCallbacks() mapIs3D = OVERMAP_IS_3D