Fixed memory manager init that didn't properly copy heap code.

This commit is contained in:
Martin Haye 2015-08-28 08:24:21 -07:00
parent f3b8b7b48d
commit ec6368a10b
2 changed files with 102 additions and 13 deletions

View File

@ -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 +

View File

@ -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