jak3: hack level heap sizes (#3487)

This commit is contained in:
ManDude
2024-04-27 21:48:49 +01:00
committed by GitHub
parent 86d770aeeb
commit 1a058b418a
2 changed files with 176 additions and 135 deletions
-1
View File
@@ -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))
+176 -134
View File
@@ -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)
)