;;-*-Lisp-*- (in-package goal) (bundles "ENGINE.CGO" "GAME.CGO") (require "engine/ps2/rpc-h.gc") ;; see game/overlord/ramdisk.cpp ;; unlike most other loads, ramdisk actually uses the response buffer of the RPC ;; to send the data. (defconstant RAMDISK_RPC_FILL_FNO (the uint 1)) ;; DECOMP BEGINS ;; command to load something into the OVERLORD RAMDISK from the DVD ;; use with fno = 1 (deftype ramdisk-rpc-fill (structure) ((rsvd1 int32) (ee-id int32) (rsvd2 int32 2) (filename uint128))) ;; get data in ramdisk on EE. (deftype ramdisk-rpc-load (structure) ((rsvd int32) (ee-id int32) (offset uint32) (length uint32))) ;; load file directly to EE. ;; this seems very similar to some functionality in STR. (deftype ramdisk-rpc-load-to-ee (structure) ((rsvd int32) (addr int32) (offset int32) (length int32) (filename uint128))) ;; allocate the ramdisk RPC buffer (define *ramdisk-rpc* (new 'global 'rpc-buffer-pair (the-as uint 32) (the-as uint 1) RPC-RAMDISK)) (define *current-ramdisk-id* 0) (defun ramdisk-load ((file-id int) (offset uint) (length uint) (buffer pointer)) "Helper to grab load from ramdisk to ee" (let ((cmd (the-as ramdisk-rpc-load (add-element *ramdisk-rpc*)))) (set! (-> cmd offset) offset) (set! (-> cmd ee-id) file-id) (set! (-> cmd length) length)) (call *ramdisk-rpc* (the-as uint 0) buffer length) 0) (defun ramdisk-sync () "Wait for ramdisk RPC to complete." (sync *ramdisk-rpc* #t) 0 (none))