mirror of
https://github.com/open-goal/jak-project
synced 2026-07-30 16:04:33 -04:00
4f537d4a71
This sets up the C Kernel for Jak 3, and makes it possible to build and load code built with `goalc --jak3`. There's not too much interesting here, other than they switched to a system where symbol IDs (unique numbers less than 2^14) are generated at compile time, and those get included in the object file itself. This is kind of annoying, since it means all tools that produce a GOAL object file need to work together to assign unique symbol IDs. And since the symbol IDs can't conflict, and are only a number between 0 and 2^14, you can't just hash and hope for no collisions. We work around this by ignoring the IDs and re-assigning our own. I think this is very similar to what the C Kernel did on early builds of Jak 3 which supported loading old format level files, which didn't have the IDs included. As far as I can tell, this shouldn't cause any problems. It defeats all of their fancy tricks to save memory by not storing the symbol string, but we don't care.
30 lines
960 B
Common Lisp
30 lines
960 B
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: gkernel.gc
|
|
;; name in dgo: gkernel
|
|
;; dgos: KERNEL
|
|
|
|
;; DECOMP BEGINS
|
|
(define *use-old-listener-print* #f)
|
|
(define *kernel-version* (the binteger (logior (ash *kernel-major-version* 16) *kernel-minor-version*)))
|
|
|
|
(defun kernel-dispatcher ()
|
|
"Temporary kernel dispatcher for now."
|
|
|
|
;; execute the listener function, if we got one.
|
|
(when *listener-function*
|
|
(+! *enable-method-set* 1) ;; allow out-of-order method definitions (slower)
|
|
;; (let ((result (reset-and-call (-> *listener-process* main-thread) *listener-function*))) ;; run function!
|
|
(let ((result (*listener-function*)))
|
|
;; print result.
|
|
(if *use-old-listener-print*
|
|
(format #t "~D~%" result result result)
|
|
(format #t "~D #x~X ~F ~A~%" result result result result)
|
|
)
|
|
)
|
|
;; clear pending function
|
|
(set! *listener-function* #f)
|
|
(+! *enable-method-set* -1)
|
|
)
|
|
) |