diff --git a/goal_src/jak2/engine/level/level.gc b/goal_src/jak2/engine/level/level.gc index a2bc8344a9..f2dea4faa9 100644 --- a/goal_src/jak2/engine/level/level.gc +++ b/goal_src/jak2/engine/level/level.gc @@ -1870,7 +1870,6 @@ into 7 sections, which might explain the weird sizes in the center. ) (gp-1 (-> this heap)) ) - (start-debug "about to allocate level heap with size #x~X (~f MB)~%" s5-1 (/ (the float s5-1) 1024.)) (set! (-> gp-1 base) (kmalloc global s5-1 (kmalloc-flags) "heap")) (set! (-> gp-1 current) (-> gp-1 base)) (set! (-> gp-1 top-base) (&+ (-> gp-1 base) s5-1)) diff --git a/goal_src/jak3/engine/level/level.gc b/goal_src/jak3/engine/level/level.gc index 663f0e57bd..6502592979 100644 --- a/goal_src/jak3/engine/level/level.gc +++ b/goal_src/jak3/engine/level/level.gc @@ -9,6 +9,22 @@ (define-extern *level-type-list* type) (define-extern city-sound-expand-want-list (function none)) +(defglobalconstant NUM_LEVEL_PAGES 146) +(defglobalconstant LEVEL_PAGE_SIZE_KB 126) ;; original value +(defglobalconstant LEVEL_PAGE_SIZE (* LEVEL_PAGE_SIZE_KB 1024)) ;; original value + +(defglobalconstant LEVEL_HEAP_SIZE (* NUM_LEVEL_PAGES LEVEL_PAGE_SIZE)) +;(defglobalconstant DEBUG_LEVEL_HEAP_MULT 1.5) ;; level heap in debug mode is 1.5x larger +(defglobalconstant DEBUG_LEVEL_HEAP_MULT 1.1) ;; we're gonna use debug mode-style heaps but we don't actually need them at 1.5x size right now +(defglobalconstant DEBUG_LEVEL_PAGE_SIZE (* 1024 (* DEBUG_LEVEL_HEAP_MULT LEVEL_PAGE_SIZE_KB))) +(defglobalconstant DEBUG_LEVEL_HEAP_SIZE (* NUM_LEVEL_PAGES DEBUG_LEVEL_PAGE_SIZE)) + +;; multiplier for borrow heap size. It is a bit of a hack required to load the slightly larger PC port levels. +;; in the original game, borrow levels never got extra room, even with big level heaps +;; Setting this means that borrow won't work with normal-size level heaps, but this is probably okay +;; because normal-size level heaps don't work at all. +(defglobalconstant BORROW_MULT DEBUG_LEVEL_HEAP_MULT) + (defmacro start-debug (str &rest args) `(format 0 ,(string-append "[START] " str) ,@args) ) @@ -695,10 +711,10 @@ "Resize and relocate the DGO load buffers, making sure there is enough room to both load objects and heap alloc in the linker." (case (-> arg0 load-buffer-mode) (((level-memory-mode tiny)) - (set! (-> arg0 load-buffer-size) (the-as uint (min #x113000 (the-as int (-> arg0 load-buffer-size))))) + (set! (-> arg0 load-buffer-size) (the-as uint (min (* 1100 1024) (the-as int (-> arg0 load-buffer-size))))) ) (((level-memory-mode tiny-edge)) - (set! (-> arg0 load-buffer-size) (+ (-> arg1 length) 2048)) + (set! (-> arg0 load-buffer-size) (+ (-> arg1 length) (* 2 1024))) ) ) (let ((v1-4 (logand -64 (+ (-> arg0 load-buffer-size) 63)))) @@ -980,10 +996,10 @@ (local-vars (sv-16 level) (memory-unused? (function level-group int symbol)) - (sv-24 int) - (mask int) - (sv-40 int) - (sv-48 int) + (level-page-offset int) + (micro-mask int) + (tiny-mask int) + (heap-size int) (sv-56 int) ) (dotimes (v1-0 5) @@ -1031,9 +1047,9 @@ #t ) ) - (set! sv-24 0) - (set! mask 0) - (set! sv-40 0) + (set! level-page-offset 0) + (set! micro-mask 0) + (set! tiny-mask 0) (dotimes (v1-15 10) (let ((lev (-> *level* level v1-15))) (when (and (or (= (-> lev status) 'active) (= (-> lev status) 'loaded)) @@ -1043,13 +1059,13 @@ ) (case (-> lev info memory-mode) (((level-memory-mode city-tiny-edge)) - (set! mask (if (or (= (-> lev memory-mask) 60) (= (-> lev memory-mask) #x3c000)) + (set! micro-mask (if (or (= (-> lev memory-mask) 60) (= (-> lev memory-mask) #x3c000)) 3 #x30000 ) ) - (if (zero? sv-40) - (set! sv-40 (if (or (= (-> lev memory-mask) 15) (= (-> lev memory-mask) #x3c000)) + (if (zero? tiny-mask) + (set! tiny-mask (if (or (= (-> lev memory-mask) 15) (= (-> lev memory-mask) #x3c000)) #x3c000 60 ) @@ -1057,60 +1073,73 @@ ) ) (((level-memory-mode micro)) - (set! mask (the-as int (-> lev memory-mask))) + (set! micro-mask (the-as int (-> lev memory-mask))) ) ) ) ) ) (let ((v1-18 mem-mode)) - (set! sv-48 (cond - ((= v1-18 (level-memory-mode large)) - #xbd0000 - ) - ((= v1-18 (level-memory-mode medium)) - #x8fb800 - ) - ((or (= v1-18 (level-memory-mode small-center)) (= v1-18 (level-memory-mode city-center))) - #x627000 - ) - ((or (= v1-18 (level-memory-mode city-tiny-edge)) - (= v1-18 (level-memory-mode tiny-center)) - (= v1-18 (level-memory-mode tiny-edge)) - (= v1-18 (level-memory-mode tiny)) - ) - #x3f0000 - ) - ((= v1-18 (level-memory-mode micro)) - #x1f8000 - ) - ((= v1-18 (level-memory-mode tiny-center-micro)) - #x2f4000 - ) - ((= v1-18 (level-memory-mode tiny-center-small)) - #x4ec000 - ) - (else - #x5e8000 - ) - ) + (set! heap-size (cond + ((= v1-18 (level-memory-mode large)) + ;; 96 pages. this uses up 12 of the 18 chunks, meaning you can only have a small level alongside a large level. + ;; because two of the chunks are gonna be in the middle, there is actually space for 98 pages. + ;; but it seems ndi did not notice that when writing this code. + (* LEVEL_PAGE_SIZE 96) + ) + ((= v1-18 (level-memory-mode medium)) + ;; 73 pages. this uses up 9 of the 18 chunks, one of them being a middle chunk + ;; which is 1 page larger than non-middle sections. 8 * 8 + 9 * 1 = 73. + ;; this means you can either have a medium or small level alongside this. + (* LEVEL_PAGE_SIZE 73) + ) + ((or (= v1-18 (level-memory-mode small-center)) (= v1-18 (level-memory-mode city-center))) + ;; 50 pages. this uses up the two middle chunks. 9 * 2 + 8 * 4 = 50. + (* LEVEL_PAGE_SIZE 50) + ) + ((or (= v1-18 (level-memory-mode city-tiny-edge)) + (= v1-18 (level-memory-mode tiny-center)) + (= v1-18 (level-memory-mode tiny-edge)) + (= v1-18 (level-memory-mode tiny)) + ) + ;; 32 pages. city-tiny-edge can coexist with micro. + (* LEVEL_PAGE_SIZE 32) + ) + ((= v1-18 (level-memory-mode micro)) + ;; 16 pages. this is the smallest memory mode, and is placed + ;; either at the very top of the level heap or the very bottom. + (* LEVEL_PAGE_SIZE 16) + ) + ((= v1-18 (level-memory-mode tiny-center-micro)) + ;; 24 pages. this is the second smallest memory mode. can coexist with city-tiny-edge. + (* LEVEL_PAGE_SIZE 24) + ) + ((= v1-18 (level-memory-mode tiny-center-small)) + ;; 40 pages. strange name, as it is larger than all other tiny modes. + (* LEVEL_PAGE_SIZE 40) + ) + (else + ;; 48 pages. this uses 6 chunks, and does NOT use any of the middle chunks. 8 * 6 = 48. + (* LEVEL_PAGE_SIZE 48) + ) + ) ) ) (set! sv-56 0) (case mem-mode (((level-memory-mode large)) - (case mask + (case micro-mask ((3) (let ((s4-0 #x3ffc0)) (when (memory-unused? *level* s4-0) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-0) (goto cfg-322) ) ) (let ((s4-1 #x3ffc)) (when (memory-unused? *level* s4-1) - (set! sv-24 16) + (set! level-page-offset 16) (set! sv-56 s4-1) (goto cfg-322) ) @@ -1119,14 +1148,14 @@ ((#x30000) (let ((s4-2 4095)) (when (memory-unused? *level* s4-2) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-2) (goto cfg-322) ) ) (let ((s4-3 #xfff0)) (when (memory-unused? *level* s4-3) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-3) (goto cfg-322) ) @@ -1135,14 +1164,14 @@ (else (let ((s4-4 4095)) (when (memory-unused? *level* s4-4) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-4) (goto cfg-322) ) ) (let ((s4-5 #x3ffc0)) (when (memory-unused? *level* s4-5) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-5) (goto cfg-322) ) @@ -1153,27 +1182,27 @@ (((level-memory-mode medium)) (let ((s4-6 511)) (when (memory-unused? *level* s4-6) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-6) (goto cfg-322) ) ) (let ((s4-7 #x3fe00)) (when (memory-unused? *level* s4-7) - (set! sv-24 73) + (set! level-page-offset 73) (set! sv-56 s4-7) (goto cfg-322) ) ) ) (((level-memory-mode small-center)) - (case mask + (case micro-mask ((3) - (case sv-40 + (case tiny-mask ((#x3c000) (let ((s4-8 #x3f00)) (when (memory-unused? *level* s4-8) - (set! sv-24 64) + (set! level-page-offset 64) (set! sv-56 s4-8) (goto cfg-322) ) @@ -1182,7 +1211,7 @@ (else (let ((s4-9 4032)) (when (memory-unused? *level* s4-9) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-9) (goto cfg-322) ) @@ -1191,11 +1220,11 @@ ) ) ((#x30000) - (case sv-40 + (case tiny-mask ((#x3c000) (let ((s4-10 1008)) (when (memory-unused? *level* s4-10) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-10) (goto cfg-322) ) @@ -1204,7 +1233,7 @@ (else (let ((s4-11 4032)) (when (memory-unused? *level* s4-11) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-11) (goto cfg-322) ) @@ -1215,7 +1244,7 @@ (else (let ((s4-12 4032)) (when (memory-unused? *level* s4-12) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-12) (goto cfg-322) ) @@ -1226,27 +1255,27 @@ (((level-memory-mode city-center)) (let ((s4-13 4032)) (when (memory-unused? *level* s4-13) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-13) (goto cfg-322) ) ) ) (((level-memory-mode small-edge)) - (case mask + (case micro-mask ((3) - (case sv-40 + (case tiny-mask ((#x3c000) (let ((s4-14 252)) (when (memory-unused? *level* s4-14) - (set! sv-24 16) + (set! level-page-offset 16) (set! sv-56 s4-14) (goto cfg-322) ) ) (let ((s4-15 #x3f00)) (when (memory-unused? *level* s4-15) - (set! sv-24 64) + (set! level-page-offset 64) (set! sv-56 s4-15) (goto cfg-322) ) @@ -1255,14 +1284,14 @@ (else (let ((s4-16 #x3f000)) (when (memory-unused? *level* s4-16) - (set! sv-24 98) + (set! level-page-offset 98) (set! sv-56 s4-16) (goto cfg-322) ) ) (let ((s4-17 4032)) (when (memory-unused? *level* s4-17) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-17) (goto cfg-322) ) @@ -1271,18 +1300,18 @@ ) ) ((#x30000) - (case sv-40 + (case tiny-mask ((#x3c000) (let ((s4-18 #xfc00)) (when (memory-unused? *level* s4-18) - (set! sv-24 82) + (set! level-page-offset 82) (set! sv-56 s4-18) (goto cfg-322) ) ) (let ((s4-19 1008)) (when (memory-unused? *level* s4-19) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-19) (goto cfg-322) ) @@ -1291,14 +1320,14 @@ (else (let ((s4-20 63)) (when (memory-unused? *level* s4-20) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-20) (goto cfg-322) ) ) (let ((s4-21 4032)) (when (memory-unused? *level* s4-21) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-21) (goto cfg-322) ) @@ -1309,14 +1338,14 @@ (else (let ((s4-22 63)) (when (memory-unused? *level* s4-22) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-22) (goto cfg-322) ) ) (let ((s4-23 #x3f000)) (when (memory-unused? *level* s4-23) - (set! sv-24 98) + (set! level-page-offset 98) (set! sv-56 s4-23) (goto cfg-322) ) @@ -1327,33 +1356,33 @@ (((level-memory-mode micro)) (let ((s4-24 3)) (when (memory-unused? *level* s4-24) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-24) (goto cfg-322) ) ) (let ((s4-25 #x30000)) (when (memory-unused? *level* s4-25) - (set! sv-24 130) + (set! level-page-offset 130) (set! sv-56 s4-25) (goto cfg-322) ) ) ) (((level-memory-mode tiny-edge) (level-memory-mode city-tiny-edge)) - (let ((v1-126 mask)) + (let ((v1-126 micro-mask)) (cond ((or (zero? v1-126) (= v1-126 3)) (let ((s4-26 60)) (when (memory-unused? *level* s4-26) - (set! sv-24 16) + (set! level-page-offset 16) (set! sv-56 s4-26) (goto cfg-322) ) ) (let ((s4-27 #x3c000)) (when (memory-unused? *level* s4-27) - (set! sv-24 114) + (set! level-page-offset 114) (set! sv-56 s4-27) (goto cfg-322) ) @@ -1362,14 +1391,14 @@ ((= v1-126 #x30000) (let ((s4-28 #xf000)) (when (memory-unused? *level* s4-28) - (set! sv-24 98) + (set! level-page-offset 98) (set! sv-56 s4-28) (goto cfg-322) ) ) (let ((s4-29 15)) (when (memory-unused? *level* s4-29) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-29) (goto cfg-322) ) @@ -1379,33 +1408,33 @@ ) ) (((level-memory-mode tiny)) - (let ((v1-143 mask)) + (let ((v1-143 micro-mask)) (cond ((or (zero? v1-143) (= v1-143 3)) (let ((s4-30 60)) (when (memory-unused? *level* s4-30) - (set! sv-24 16) + (set! level-page-offset 16) (set! sv-56 s4-30) (goto cfg-322) ) ) (let ((s4-31 #x3c000)) (when (memory-unused? *level* s4-31) - (set! sv-24 114) + (set! level-page-offset 114) (set! sv-56 s4-31) (goto cfg-322) ) ) (let ((s4-32 #x3c00)) (when (memory-unused? *level* s4-32) - (set! sv-24 82) + (set! level-page-offset 82) (set! sv-56 s4-32) (goto cfg-322) ) ) (let ((s4-33 960)) (when (memory-unused? *level* s4-33) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-33) (goto cfg-322) ) @@ -1414,28 +1443,28 @@ ((= v1-143 #x30000) (let ((s4-34 #xf000)) (when (memory-unused? *level* s4-34) - (set! sv-24 98) + (set! level-page-offset 98) (set! sv-56 s4-34) (goto cfg-322) ) ) (let ((s4-35 15)) (when (memory-unused? *level* s4-35) - (set! sv-24 0) + (set! level-page-offset 0) (set! sv-56 s4-35) (goto cfg-322) ) ) (let ((s4-36 240)) (when (memory-unused? *level* s4-36) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-36) (goto cfg-322) ) ) (let ((s4-37 3840)) (when (memory-unused? *level* s4-37) - (set! sv-24 64) + (set! level-page-offset 64) (set! sv-56 s4-37) (goto cfg-322) ) @@ -1445,19 +1474,19 @@ ) ) (((level-memory-mode tiny-center)) - (let ((v1-176 mask)) + (let ((v1-176 micro-mask)) (cond ((or (zero? v1-176) (= v1-176 3)) (let ((s4-38 #x3c00)) (when (memory-unused? *level* s4-38) - (set! sv-24 82) + (set! level-page-offset 82) (set! sv-56 s4-38) (goto cfg-322) ) ) (let ((s4-39 960)) (when (memory-unused? *level* s4-39) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-39) (goto cfg-322) ) @@ -1466,14 +1495,14 @@ ((= v1-176 #x30000) (let ((s4-40 240)) (when (memory-unused? *level* s4-40) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-40) (goto cfg-322) ) ) (let ((s4-41 3840)) (when (memory-unused? *level* s4-41) - (set! sv-24 64) + (set! level-page-offset 64) (set! sv-56 s4-41) (goto cfg-322) ) @@ -1483,19 +1512,19 @@ ) ) (((level-memory-mode tiny-center-small)) - (let ((v1-194 mask)) + (let ((v1-194 micro-mask)) (cond ((or (zero? v1-194) (= v1-194 3)) (let ((s4-42 #x3e00)) (when (memory-unused? *level* s4-42) - (set! sv-24 72) + (set! level-page-offset 72) (set! sv-56 s4-42) (goto cfg-322) ) ) (let ((s4-43 1984)) (when (memory-unused? *level* s4-43) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-43) (goto cfg-322) ) @@ -1504,14 +1533,14 @@ ((= v1-194 #x30000) (let ((s4-44 496)) (when (memory-unused? *level* s4-44) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-44) (goto cfg-322) ) ) (let ((s4-45 3968)) (when (memory-unused? *level* s4-45) - (set! sv-24 56) + (set! level-page-offset 56) (set! sv-56 s4-45) (goto cfg-322) ) @@ -1521,19 +1550,19 @@ ) ) (((level-memory-mode tiny-center-micro)) - (let ((v1-213 mask)) + (let ((v1-213 micro-mask)) (cond ((or (zero? v1-213) (= v1-213 3)) (let ((s4-46 448)) (when (memory-unused? *level* s4-46) - (set! sv-24 48) + (set! level-page-offset 48) (set! sv-56 s4-46) (goto cfg-322) ) ) (let ((s4-47 #x3800)) (when (memory-unused? *level* s4-47) - (set! sv-24 90) + (set! level-page-offset 90) (set! sv-56 s4-47) (goto cfg-322) ) @@ -1542,14 +1571,14 @@ ((= v1-213 #x30000) (let ((s4-48 3584)) (when (memory-unused? *level* s4-48) - (set! sv-24 72) + (set! level-page-offset 72) (set! sv-56 s4-48) (goto cfg-322) ) ) (let ((s4-49 112)) (when (memory-unused? *level* s4-49) - (set! sv-24 32) + (set! level-page-offset 32) (set! sv-56 s4-49) (goto cfg-322) ) @@ -1567,8 +1596,8 @@ "ERROR: level ~A could not find free ~S bank in the level-group heap (micro ~X tiny ~X)~%" (-> this name) (level-memory-mode->string mem-mode) - mask - sv-40 + micro-mask + tiny-mask ) (dotimes (s5-1 11) (let ((s4-51 (-> *level* level s5-1))) @@ -1591,25 +1620,31 @@ ) (else (set! (-> this memory-mask) (the-as uint sv-56)) - (format 0 "lev ~A ~X micro ~X tiny ~X~%" (-> this name) (-> this memory-mask) mask sv-40) - (cond - ((= (&- (-> *level* heap top) (the-as uint (-> *level* heap base))) #x1af2800) - (let ((v1-245 (-> this heap))) - (set! (-> v1-245 base) (&+ (-> *level* heap base) (* #x2f400 sv-24))) - (set! (-> v1-245 current) (-> v1-245 base)) - (set! (-> v1-245 top-base) (&+ (-> v1-245 base) (+ sv-48 (/ sv-48 2)))) - (set! (-> v1-245 top) (-> v1-245 top-base)) + (format 0 "lev ~A ~X micro ~X tiny ~X~%" (-> this name) (-> this memory-mask) micro-mask tiny-mask) + (cond + ;; are we using debug sized large level? + ((= (&- (-> *level* heap top) (the-as uint (-> *level* heap base))) DEBUG_LEVEL_HEAP_SIZE) + ;; if so, everything is bigger! + (let ((v1-245 (-> this heap))) + (set! (-> v1-245 base) (&+ (-> *level* heap base) (* DEBUG_LEVEL_PAGE_SIZE level-page-offset))) + (set! (-> v1-245 current) (-> v1-245 base)) + ;(set! (-> v1-245 top-base) (&+ (-> v1-245 base) (+ heap-size (/ heap-size 2)))) + ;; og:preserve-this modified the math here so we can just use a float to change the size + (set! (-> v1-245 top-base) (&+ (-> v1-245 base) (* DEBUG_LEVEL_PAGE_SIZE (/ heap-size LEVEL_PAGE_SIZE)))) + (set! (-> v1-245 top) (-> v1-245 top-base)) + ) ) - ) - (else - (let ((v1-246 (-> this heap))) - (set! (-> v1-246 base) (&+ (-> *level* heap base) (* #x1f800 sv-24))) - (set! (-> v1-246 current) (-> v1-246 base)) - (set! (-> v1-246 top-base) (&+ (-> v1-246 base) sv-48)) - (set! (-> v1-246 top) (-> v1-246 top-base)) + (else + (let ((v1-246 (-> this heap))) + ;; no debug size heaps. set up our heap. + ;; level-page-offset is in 146ths (1 level heap page) of the total size. + (set! (-> v1-246 base) (&+ (-> *level* heap base) (* LEVEL_PAGE_SIZE level-page-offset))) + (set! (-> v1-246 current) (-> v1-246 base)) + (set! (-> v1-246 top-base) (&+ (-> v1-246 base) heap-size)) + (set! (-> v1-246 top) (-> v1-246 top-base)) + ) ) ) - ) ) ) ) @@ -2037,13 +2072,15 @@ (when (-> arg0 info borrow) (dotimes (v1-229 5) (set! (-> arg0 heap top-base) - (the pointer (&- (-> arg0 heap top-base) (the-as uint (shl (-> arg0 info borrow borrow-size v1-229) 10)))) + ;; og:preserve-this + (the pointer (&- (-> arg0 heap top-base) (the uint (shl (the int (* BORROW_MULT (-> arg0 info borrow borrow-size v1-229))) 10)))) ) (set! (-> arg0 heap top) (-> arg0 heap top-base)) (let ((a0-121 (-> arg0 borrow-heap v1-229))) (set! (-> a0-121 base) (-> arg0 heap top)) (set! (-> a0-121 current) (-> a0-121 base)) - (set! (-> a0-121 top-base) (&+ (-> a0-121 base) (shl (-> arg0 info borrow borrow-size v1-229) 10))) + ;; MODIFIED + (set! (-> a0-121 top-base) (&+ (-> a0-121 base) (the int (shl (the int (* BORROW_MULT (-> arg0 info borrow borrow-size v1-229))) 10)))) (set! (-> a0-121 top) (-> a0-121 top-base)) ) ) @@ -2504,8 +2541,8 @@ (load-package "common" global) ) (let ((s5-1 (if (and arg0 (not *debug-segment*)) - #x11f7000 - #x1af2800 + (#if PC_PORT DEBUG_LEVEL_HEAP_SIZE LEVEL_HEAP_SIZE) + DEBUG_LEVEL_HEAP_SIZE ) ) (gp-1 (-> this heap)) @@ -2515,10 +2552,6 @@ (set! (-> gp-1 top-base) (&+ (-> gp-1 base) s5-1)) (set! (-> gp-1 top) (-> gp-1 top-base)) ) - (start-debug "GLOBAL~%") - (inspect global) - (start-debug "LEVEL~%") - (inspect (-> this heap)) (kmemclose) ) 0 @@ -3305,10 +3338,19 @@ ) ) ) + ;; og:preserve-this + ;; did we find one to unload? + ;; PC NOTE : added an extra check for DGO time and name. If you start a load and discard it on the next frame, + ;; you may attempt to start a new load right away before the ISO thread can properly stop the previous load + ;; which will just crash the game. Sadly this means loads may sometimes be delayed by one frame. The horror. (when (>= a0-3 0) - (let ((s3-0 (-> *level* level a0-3))) - (format 0 "Discarding level ~A~%" (-> s3-0 name)) - (level-status-update! s3-0 'inactive) + (format 0 " level loading : want to unload ~A. load-level is ~A~%" (-> *level* level a0-3 load-name) (-> *level* load-level)) + (when (or (!= (-> *level* level a0-3 load-name) (-> *level* load-level)) + (< 1 (- (-> *display* real-clock integral-frame-counter) *dgo-time*))) + (let ((lev-to-unload (-> *level* level a0-3))) + (format 0 "Discarding level ~A~%" (-> lev-to-unload name)) + (level-status-update! lev-to-unload 'inactive) ;; kill it. + ) ) (set! v1-3 #t) )