diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index c8de6c94ba..c4ca7a0005 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -12311,13 +12311,14 @@ ) (deftype prototype-bucket-shrub (prototype-bucket) - ((next uint32 4 :offset-assert 64) ;; guessed by decompiler - (count uint16 4 :offset-assert 80) ;; guessed by decompiler - (mod-count uint16 4 :offset-assert 88) ;; guessed by decompiler - (last dma-packet 4 :offset-assert 96) ;; guessed by decompiler - (next-clear uint128 :offset 64) - (count-clear uint64 :offset 80) - (last-clear uint128 :offset 96) + ((next uint32 4 :offset-assert 64) ;; guessed by decompiler + (count uint16 4 :offset-assert 80) ;; guessed by decompiler + (mod-count uint16 4 :offset-assert 88) ;; guessed by decompiler + (last dma-packet 4 :offset-assert 96) ;; guessed by decompiler + (next-clear uint128 :offset 64) + (count-clear uint64 :offset 80) + (count-clear-qword uint128 :offset 80) + (last-clear uint128 :offset 96) ) :method-count-assert 9 :size-assert #x70 @@ -17231,7 +17232,7 @@ (deftype shrub-view-data (structure) ((data uint128 3 :offset-assert 0) ;; guessed by decompiler (texture-giftag gs-gif-tag :inline :offset 0) ;; was qword - (consts vector :inline :offset 16) + (consts vector :inline :offset 16 :score -1) (fog-clamp vector :inline :offset 32) (tex-start-ptr int32 :offset 16) (gifbufsum float :offset 16) @@ -17359,7 +17360,7 @@ (vertex-tmpl dma-packet :inline :offset-assert 64) (mscal-tmpl dma-packet :inline :offset-assert 80) (init-tmpl dma-packet :inline :offset-assert 96) - (init-data uint32 8 :offset-assert 112) ;; guessed by decompiler + (init-data qword 2 :inline :offset-assert 112) ) :method-count-assert 9 :size-assert #x90 @@ -22512,8 +22513,8 @@ ;; (define-extern generic-setup-constants function) ;; (function generic-constants int none) ;; (define-extern generic-add-constants function) ;; (function dma-buffer int none) ;; (define-extern generic-setup-shrub-constants function) -;; (define-extern generic-add-shrub-constants function) -;; (define-extern generic-init-buf function) ;; (function dma-buffer int gs-zbuf none) +(define-extern generic-add-shrub-constants (function dma-buffer int int int none)) +(define-extern generic-init-buf (function dma-buffer int gs-zbuf none)) ;; (define-extern generic-vu1-init-buf function) ;; (define-extern generic-vu1-init-buf-special function) (define-extern generic-vu1-init-buffers (function none)) @@ -22890,18 +22891,14 @@ ;; shrubbery ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#| (deftype dma-test (structure) - ((data UNKNOWN 101 :offset-assert 0) + ((data qword 101 :inline :offset-assert 0) ) :method-count-assert 9 :size-assert #x650 :flag-assert #x900000650 ) -|# -#| (deftype dma-test-work (structure) ((upload dma-packet :inline :offset-assert 0) (end dma-packet :inline :offset-assert 16) @@ -22910,26 +22907,25 @@ :size-assert #x20 :flag-assert #x900000020 ) -|# -;; (define-extern mem-usage-shrub-walk function) ;; (function draw-node int memory-usage-block int draw-node) -;; (define-extern shrub-vu1-block object) ;; vu-function -;; (define-extern shrub-num-tris function) ;; (function shrubbery uint) -(define-extern shrub-make-perspective-matrix (function matrix matrix)) ;; -;; (define-extern shrub-init-view-data function) ;; (function shrub-view-data symbol) -;; (define-extern shrub-upload-view-data function) ;; (function dma-buffer symbol) -;; (define-extern shrub-time function) ;; (function int int int int int int) -;; (define-extern shrub-do-init-frame function) ;; (function dma-buffer symbol) -;; (define-extern shrub-init-frame function) ;; (function dma-buffer gs-test none) -;; (define-extern shrub-upload-model function) ;; (function shrubbery dma-buffer int symbol) -;; (define-extern draw-inline-array-instance-shrub function) ;; (function dma-buffer drawable int (inline-array prototype-bucket-shrub) none) -;; (define-extern draw-prototype-inline-array-shrub function) ;; (function int (inline-array prototype-bucket-shrub) pointer) -;; (define-extern draw-drawable-tree-instance-shrub function) ;; (function drawable-tree-instance-shrub level none) -;; (define-extern *dma-test* object) -;; (define-extern *dma-test-work* object) -;; (define-extern init-dma-test function) -;; (define-extern dma-test-func function) -;; (define-extern move-test-func function) +(define-extern mem-usage-shrub-walk (function draw-node int memory-usage-block int draw-node)) +(define-extern shrub-vu1-block vu-function) +(define-extern shrub-num-tris (function shrubbery uint)) +(define-extern shrub-make-perspective-matrix (function matrix matrix matrix)) +(define-extern shrub-init-view-data (function shrub-view-data symbol)) +(define-extern shrub-upload-view-data (function dma-buffer symbol)) +(define-extern shrub-time (function int int int int int int)) +(define-extern shrub-do-init-frame (function dma-buffer symbol)) +(define-extern shrub-init-frame (function dma-buffer gs-test symbol)) +(define-extern shrub-upload-model (function shrubbery dma-buffer int symbol)) +(define-extern draw-inline-array-instance-shrub (function dma-buffer drawable int (inline-array prototype-bucket-shrub) none)) +(define-extern draw-prototype-inline-array-shrub (function int (inline-array prototype-bucket-shrub) pointer)) +(define-extern draw-drawable-tree-instance-shrub (function drawable-tree-instance-shrub level none)) +(define-extern *dma-test* dma-test) +(define-extern *dma-test-work* dma-test-work) +(define-extern init-dma-test (function none)) +(define-extern dma-test-func (function none)) +(define-extern move-test-func (function none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; shrub-work ;; diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index 543fab5683..9143ad1374 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -90,6 +90,8 @@ "(method 11 collide-mesh-cache)", "cpu-delay", "qword-read-time", + "dma-test-func", + "move-test-func", "symlink2", "blerc-a-fragment", @@ -114,6 +116,10 @@ "debug-line-clip?", // logand with #f arg "bugfix?", + // CFG failed + "draw-inline-array-instance-shrub", + // todo + "draw-prototype-inline-array-shrub", // "reset-target-tracking", "(anon-function 1 target)", @@ -248,6 +254,7 @@ "real-main-draw-hook": [114, 115, 116, 118], "sprite-draw-distorters": [4, 5], + "draw-drawable-tree-instance-shrub": [5, 7, 9, 11], "add-debug-box-with-transform": [0, 3], "add-debug-line-sphere": [0], diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 1cda02459d..641dc26387 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -1511,6 +1511,70 @@ [[38, 41], "v1", "vector"], [[55, 59], "s0", "(inline-array vector)"] ], + // shrubbery + "shrub-upload-view-data": [ + [[8, 16], "a0", "dma-packet"] + ], + "shrub-do-init-frame": [ + [[12, 21], "a0", "dma-packet"], + [[26, 29], "a0", "dma-packet"], + [33, "v1", "(pointer vif-tag)"], + [[35, 41], "v1", "(pointer uint32)"], + [42, "v1", "(pointer vif-tag)"], + [[44, 51], "v1", "(pointer uint32)"], + [52, "v1", "(pointer vif-tag)"], + [54, "v1", "(pointer uint32)"] + ], + "shrub-init-frame": [ + [[8, 12], "a0", "dma-packet"], + [[18, 21], "a0", "gs-gif-tag"], + [24, "v1", "(pointer gs-test)"], + [26, "v1", "(pointer gs-reg64)"] + ], + "shrub-upload-model": [ + [[17, 26], "a3", "dma-packet"], + [[33, 41], "a0", "dma-packet"], + [[47, 55], "a0", "dma-packet"] + ], + "draw-drawable-tree-instance-shrub": [ + [86, "a0", "drawable-group"] + ], + "draw-prototype-inline-array-shrub": [ + [[13, 56], "v1", "prototype-bucket-shrub"], + [[102, 114], "a0", "shrub-near-packet"], + [[114, 117], "v1", "vector4w-3"], + [118, "a1", "vector4w"], + [123, "v1", "dma-packet"], + [[124, 126], "v1", "vector4w"], + [[334, 364], "s1", "prototype-bucket-shrub"], + [416, "a0", "drawable-group"], + [420, "s1", "prototype-bucket-shrub"], + [525, "v1", "drawable-group"], + [[518, 535], "s1", "prototype-bucket-shrub"], + [558, "s1", "prototype-bucket-shrub"], + [[677, 718], "gp", "prototype-bucket-shrub"], + [[696, 706], "a1", "prototype-bucket-shrub"] + ], + "(method 8 drawable-tree-instance-shrub)": [ + [54, "v1", "drawable-group"] + ], + "(method 13 drawable-tree-instance-shrub)": [ + [[12, 151], "gp", "prototype-bucket-shrub"], + [19, "a1", "drawable-group"], + [44, "v1", "drawable-group"], + [66, "s3", "shrubbery"], + [92, "v1", "drawable-group"], + [114, "s3", "shrubbery"], + [160, "gp", "(inline-array prototype-bucket-shrub)"] + ], + "(method 9 shrubbery)": [ + [23, "a2", "(pointer int32)"], + [28, "a3", "(inline-array texture-masks)"] + ], + "init-dma-test": [ + [29, "v1", "(inline-array qword)"] + ], + "drawable-load": [[[25, 28], "s5", "drawable"]], "art-load": [[[13, 16], "s5", "art"]], "art-group-load-check": [[[43, 53], "s3", "art-group"]], diff --git a/decompiler/config/jak2/var_names.jsonc b/decompiler/config/jak2/var_names.jsonc index 394b2d3f71..331e8e2017 100644 --- a/decompiler/config/jak2/var_names.jsonc +++ b/decompiler/config/jak2/var_names.jsonc @@ -648,6 +648,67 @@ } }, + // shrubbery + "shrub-num-tris": { + "args": "shrub" + }, + "shrub-make-perspective-matrix": { + "args": ["out", "camera-temp"] + }, + "shrub-init-view-data": { + "args": "view-data" + }, + "shrub-upload-view-data": { + "args": "dma-buff", + "vars": { + "v1-0": "buf", + "a0-1": ["pkt", "dma-packet"], + "s5-0": "qwc" + } + }, + "shrub-do-init-frame": { + "args": "dma-buff", + "vars": { + "a0-3": ["pkt1", "dma-packet"], + "a0-5": ["pkt2", "dma-packet"] + } + }, + "shrub-init-frame": { + "args": ["dma-buff", "test"], + "vars": { + "a0-2": ["pkt", "dma-packet"], + "a0-4": ["giftag", "gs-gif-tag"] + } + }, + "shrub-upload-model": { + "args": ["shrub", "dma-buff", "arg2"], + "vars": { + "a3-0": ["a3-0", "dma-packet"], + "a0-9": ["a0-9", "dma-packet"], + "a0-11": ["a0-11", "dma-packet"] + } + }, + "draw-drawable-tree-instance-shrub": { + "args": ["tree", "level"], + "vars": { + "v1-24": "dma-buff", + "v1-16": "proto-array", + "s5-0": "proto-array-len", + "s4-0": "proto-array-data", + "a2-3": "proto", + "a1-5": "i", + "gp-0": "dma-start" + } + }, + "draw-prototype-inline-array-shrub": { + "args": ["proto-array-len", "proto-array"], + "vars": { + "v1-0": ["v1-0", "prototype-bucket-shrub"], + "a2-6": "dma-ptr", + "a0-14": ["a0-14", "shrub-near-packet"] + } + }, + "(method 10 cam-setting-data)": { "vars": { "v1-5": ["v1-5", "handle"], diff --git a/goal_src/jak2/engine/camera/cam-update.gc b/goal_src/jak2/engine/camera/cam-update.gc index 5887cd6426..648ed75212 100644 --- a/goal_src/jak2/engine/camera/cam-update.gc +++ b/goal_src/jak2/engine/camera/cam-update.gc @@ -451,30 +451,24 @@ ) (update-view-planes gp-0 (-> gp-0 plane) 1.0 (-> gp-0 inv-camera-rot)) (update-view-planes gp-0 (-> gp-0 guard-plane) 4.0 (-> gp-0 inv-camera-rot)) - (let ((t9-20 shrub-make-perspective-matrix) - (a0-56 (-> gp-0 shrub-mat)) - ) - (-> gp-0 camera-temp) - (t9-20 a0-56) - ) + (shrub-make-perspective-matrix (-> gp-0 shrub-mat) (-> gp-0 camera-temp)) (update-visible gp-0) (when (-> *time-of-day-context* use-camera-other) (let ((s5-4 (-> gp-0 camera-rot)) (s4-2 (-> gp-0 camera-rot-other)) (s3-2 (-> gp-0 inv-camera-rot-other)) + (s2-1 (-> gp-0 camera-temp-other)) ) - (let ((s2-1 (-> gp-0 camera-temp-other))) - (quaternion->matrix s4-2 (-> gp-0 quat-other)) - (set! (-> s4-2 trans quad) (-> gp-0 trans-other quad)) - (set! (-> s4-2 trans w) 1.0) - (matrix*! s4-2 s4-2 s5-4) - (matrix-inverse-of-rot-trans! s3-2 s4-2) - (matrix*! s2-1 s4-2 (-> gp-0 perspective)) - ) + (quaternion->matrix s4-2 (-> gp-0 quat-other)) + (set! (-> s4-2 trans quad) (-> gp-0 trans-other quad)) + (set! (-> s4-2 trans w) 1.0) + (matrix*! s4-2 s4-2 s5-4) + (matrix-inverse-of-rot-trans! s3-2 s4-2) + (matrix*! s2-1 s4-2 (-> gp-0 perspective)) (update-view-planes gp-0 (-> gp-0 plane-other) 1.0 s3-2) (update-view-planes gp-0 (-> gp-0 guard-plane-other) 4.0 s3-2) + (shrub-make-perspective-matrix (-> gp-0 shrub-mat-other) s2-1) ) - (shrub-make-perspective-matrix (-> gp-0 shrub-mat-other)) ) ) #f diff --git a/goal_src/jak2/engine/gfx/background/prototype-h.gc b/goal_src/jak2/engine/gfx/background/prototype-h.gc index e3e155f3ff..6e9c5e957d 100644 --- a/goal_src/jak2/engine/gfx/background/prototype-h.gc +++ b/goal_src/jak2/engine/gfx/background/prototype-h.gc @@ -43,13 +43,14 @@ ) (deftype prototype-bucket-shrub (prototype-bucket) - ((next uint32 4 :offset-assert 64) - (count uint16 4 :offset-assert 80) - (mod-count uint16 4 :offset-assert 88) - (last dma-packet 4 :offset-assert 96) - (next-clear uint128 :offset 64) - (count-clear uint64 :offset 80) - (last-clear uint128 :offset 96) + ((next uint32 4 :offset-assert 64) + (count uint16 4 :offset-assert 80) + (mod-count uint16 4 :offset-assert 88) + (last dma-packet 4 :offset-assert 96) + (next-clear uint128 :offset 64) + (count-clear uint64 :offset 80) + (count-clear-qword uint128 :offset 80) + (last-clear uint128 :offset 96) ) :method-count-assert 9 :size-assert #x70 diff --git a/goal_src/jak2/engine/gfx/shrub/shrubbery-h.gc b/goal_src/jak2/engine/gfx/shrub/shrubbery-h.gc index fc6fae8fa6..68869bcff6 100644 --- a/goal_src/jak2/engine/gfx/shrub/shrubbery-h.gc +++ b/goal_src/jak2/engine/gfx/shrub/shrubbery-h.gc @@ -8,7 +8,7 @@ ;; NOTE - for cam-update (declare-type instance-shrub-work structure) (define-extern *instance-shrub-work* instance-shrub-work) -(define-extern shrub-make-perspective-matrix (function matrix matrix)) +(define-extern shrub-make-perspective-matrix (function matrix matrix matrix)) ;; DECOMP BEGINS @@ -167,14 +167,14 @@ (define *shrub-state* 0) (deftype shrub-near-packet (structure) - ((matrix-tmpl dma-packet :inline :offset-assert 0) - (header-tmpl dma-packet :inline :offset-assert 16) - (stq-tmpl dma-packet :inline :offset-assert 32) - (color-tmpl dma-packet :inline :offset-assert 48) - (vertex-tmpl dma-packet :inline :offset-assert 64) - (mscal-tmpl dma-packet :inline :offset-assert 80) - (init-tmpl dma-packet :inline :offset-assert 96) - (init-data uint32 8 :offset-assert 112) + ((matrix-tmpl dma-packet :inline :offset-assert 0) + (header-tmpl dma-packet :inline :offset-assert 16) + (stq-tmpl dma-packet :inline :offset-assert 32) + (color-tmpl dma-packet :inline :offset-assert 48) + (vertex-tmpl dma-packet :inline :offset-assert 64) + (mscal-tmpl dma-packet :inline :offset-assert 80) + (init-tmpl dma-packet :inline :offset-assert 96) + (init-data qword 2 :inline :offset-assert 112) ) :method-count-assert 9 :size-assert #x90 diff --git a/goal_src/jak2/engine/gfx/shrub/shrubbery.gc b/goal_src/jak2/engine/gfx/shrub/shrubbery.gc index cc84a5cb67..80c3cd37b9 100644 --- a/goal_src/jak2/engine/gfx/shrub/shrubbery.gc +++ b/goal_src/jak2/engine/gfx/shrub/shrubbery.gc @@ -5,5 +5,679 @@ ;; name in dgo: shrubbery ;; dgos: ENGINE, GAME +(define-extern draw-inline-array-instance-shrub (function dma-buffer drawable int (inline-array prototype-bucket-shrub) none)) +(define-extern draw-prototype-inline-array-shrub (function int (inline-array prototype-bucket-shrub) pointer)) + ;; DECOMP BEGINS +;;-*-Lisp-*- +(in-package goal) + +(defmethod login billboard ((obj billboard)) + "Set up the billboard adgif shader" + (adgif-shader-login (-> obj flat)) + obj + ) + +(defmethod mem-usage billboard ((obj billboard) (arg0 memory-usage-block) (arg1 int)) + "Compute the memory used for the billboard." + (set! (-> arg0 length) (max 34 (-> arg0 length))) + (set! (-> arg0 data 33 name) "billboard") + (+! (-> arg0 data 33 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 33 used) v1-6) + (+! (-> arg0 data 33 total) (logand -16 (+ v1-6 15))) + ) + obj + ) + +(define-extern mem-usage-shrub-walk (function draw-node int memory-usage-block int draw-node)) +(defun mem-usage-shrub-walk ((arg0 draw-node) (arg1 int) (arg2 memory-usage-block) (arg3 int)) + "Recursively iterate through the entire shrub tree and compute memory usage for instances." + (set! (-> arg2 length) (max 64 (-> arg2 length))) + (set! (-> arg2 data 63 name) "draw-node") + (+! (-> arg2 data 63 count) arg1) + (let ((v1-5 (* arg1 32))) + (+! (-> arg2 data 63 used) v1-5) + (+! (-> arg2 data 63 total) (logand -16 (+ v1-5 15))) + ) + (let ((s2-0 arg0)) + (dotimes (s1-0 arg1) + (let ((a1-2 (-> s2-0 child-count))) + (cond + ((logtest? (-> s2-0 flags) 1) + (mem-usage-shrub-walk (the-as draw-node (-> s2-0 child)) (the-as int a1-2) arg2 arg3) + ) + (else + (set! (-> arg2 length) (max 35 (-> arg2 length))) + (set! (-> arg2 data 34 name) "instance-shrubbery") + (+! (-> arg2 data 34 count) a1-2) + (let ((v1-18 (* (the-as uint 80) a1-2))) + (+! (-> arg2 data 34 used) v1-18) + (+! (-> arg2 data 34 total) (logand -16 (+ v1-18 15))) + ) + ) + ) + ) + (&+! s2-0 32) + ) + ) + arg0 + ) + +(defmethod mem-usage drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 memory-usage-block) (arg1 int)) + "Compute memory usage for an entire shrub tree" + (set! (-> arg0 length) (max 1 (-> arg0 length))) + (set! (-> arg0 data 0 name) (symbol->string 'drawable-group)) + (+! (-> arg0 data 0 count) 1) + (let ((v1-7 32)) + (+! (-> arg0 data 0 used) v1-7) + (+! (-> arg0 data 0 total) (logand -16 (+ v1-7 15))) + ) + ;; time of day colors + (when (nonzero? (-> obj colors-added)) + (set! (-> arg0 length) (max 33 (-> arg0 length))) + (set! (-> arg0 data 32 name) "shrubbery-pal") + (+! (-> arg0 data 32 count) 1) + (let ((v1-19 (asize-of (-> obj colors-added)))) + (+! (-> arg0 data 32 used) v1-19) + (+! (-> arg0 data 32 total) (logand -16 (+ v1-19 15))) + ) + ) + ;; instance tree + (mem-usage-shrub-walk + (the-as draw-node (&+ (-> obj data 0) 32)) + (-> (the-as drawable-group (-> obj data 0)) length) + arg0 + arg1 + ) + ;; prototypes + (mem-usage (-> obj info prototype-inline-array-shrub) arg0 (logior arg1 1)) + obj + ) + +(defmethod login generic-shrub-fragment ((obj generic-shrub-fragment)) + "Set up shaders in a generic shrub fragment" + (let ((s5-0 (/ (-> obj cnt-qwc) (the-as uint 5)))) + (dotimes (s4-0 (the-as int s5-0)) + (adgif-shader-login-no-remap (-> obj textures s4-0)) + ) + ) + obj + ) + +(defmethod mem-usage generic-shrub-fragment ((obj generic-shrub-fragment) (arg0 memory-usage-block) (arg1 int)) + "Compute memory usage of generic shrub fragment" + (set! (-> arg0 length) (max 27 (-> arg0 length))) + (set! (-> arg0 data 25 name) "generic-shrub") + (+! (-> arg0 data 25 count) 1) + ;; the actual fragment object + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 25 used) v1-6) + (+! (-> arg0 data 25 total) (logand -16 (+ v1-6 15))) + ) + ;; the referenced data + (set! (-> arg0 data 26 name) "generic-shrub-data") + (+! (-> arg0 data 26 count) 1) + (let ((v1-17 (* (+ (-> obj cnt-qwc) (-> obj vtx-qwc) (-> obj col-qwc) (-> obj stq-qwc)) 16))) + (+! (-> arg0 data 26 used) v1-17) + (+! (-> arg0 data 26 total) (logand -16 (+ v1-17 15))) + ) + obj + ) + +(defmethod inspect prototype-shrubbery ((obj prototype-shrubbery)) + "Inspect all prototypes in a prototype array." + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tlength: ~D~%" (-> obj length)) + (format #t "~Tdata[~D]: @ #x~X~%" (-> obj length) (-> obj data)) + (dotimes (s5-0 (-> obj length)) + (format #t "~T [~D] ~A~%" s5-0 (-> obj data s5-0)) + ) + obj + ) + +(defmethod mem-usage prototype-shrubbery ((obj prototype-shrubbery) (arg0 memory-usage-block) (arg1 int)) + "Compute memory usage of all prototypes in a prototype array." + (set! (-> arg0 length) (max 1 (-> arg0 length))) + (set! (-> arg0 data 0 name) (symbol->string 'drawable-group)) + (+! (-> arg0 data 0 count) 1) + (let ((v1-7 32)) + (+! (-> arg0 data 0 used) v1-7) + (+! (-> arg0 data 0 total) (logand -16 (+ v1-7 15))) + ) + (dotimes (s3-0 (-> obj length)) + (mem-usage (-> obj data s3-0) arg0 arg1) + ) + obj + ) + +(defmethod login prototype-shrubbery ((obj prototype-shrubbery)) + "Login all prototypes in a prototype array" + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) + +(defmethod asize-of prototype-shrubbery ((obj prototype-shrubbery)) + "Compute the allocation size of a prototype shrubbery array (dynamically sized)" + (the-as int (+ (-> prototype-shrubbery size) (* (+ (-> obj length) -1) 32))) + ) + +(defmethod login prototype-generic-shrub ((obj prototype-generic-shrub)) + "Initialize all fragments in a generic prototype." + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) + +(defmethod login shrubbery ((obj shrubbery)) + "Initialize a shrubbery fragment." + (let ((s5-0 (* (-> obj header data 0) 2))) + (dotimes (s4-0 (the-as int s5-0)) + (let ((v1-3 (adgif-shader-login-no-remap (-> obj textures s4-0)))) + (when v1-3 + (dotimes (a0-5 3) + (dotimes (a1-0 3) + (set! (-> (the-as (pointer int32) (+ (+ (* a0-5 16) (* a1-0 4)) (the-as int *texture-masks*)))) + (logior (-> (the-as (pointer int32) (+ (* a1-0 4) (the-as int *texture-masks*) (* a0-5 16))) 0) + (-> (the-as (inline-array texture-masks) (+ (* a1-0 4) (the-as int v1-3) (* a0-5 16))) 1 data 0 mask w) + ) + ) + ) + (set! (-> *texture-masks* data a0-5 mask w) + (the-as int (fmax (-> *texture-masks* data a0-5 dist) (-> v1-3 masks data a0-5 dist))) + ) + ) + ) + ) + ) + ) + (shrubbery-login-post-texture obj) + obj + ) + +(defmethod mem-usage shrubbery ((obj shrubbery) (arg0 memory-usage-block) (arg1 int)) + "Compute the memory usage of a shrubbery fragment." + (set! (-> arg0 length) (max 28 (-> arg0 length))) + (set! (-> arg0 data 27 name) "shrubbery") + (+! (-> arg0 data 27 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 27 used) v1-6) + (+! (-> arg0 data 27 total) (logand -16 (+ v1-6 15))) + ) + (set! (-> arg0 length) (max 30 (-> arg0 length))) + (set! (-> arg0 data 29 name) "shrubbery-vertex") + (+! (-> arg0 data 29 count) 1) + (let ((v1-16 (* (-> obj vtx-qwc) 16))) + (+! (-> arg0 data 29 used) v1-16) + (+! (-> arg0 data 29 total) (logand -16 (+ v1-16 15))) + ) + (set! (-> arg0 length) (max 31 (-> arg0 length))) + (set! (-> arg0 data 30 name) "shrubbery-color") + (+! (-> arg0 data 30 count) 1) + (let ((v1-26 (* (-> obj col-qwc) 16))) + (+! (-> arg0 data 30 used) v1-26) + (+! (-> arg0 data 30 total) (logand -16 (+ v1-26 15))) + ) + (set! (-> arg0 length) (max 29 (-> arg0 length))) + (set! (-> arg0 data 28 name) "shrubbery-object") + (+! (-> arg0 data 28 count) 1) + (let ((v1-36 (* (-> obj obj-qwc) 16))) + (+! (-> arg0 data 28 used) v1-36) + (+! (-> arg0 data 28 total) (logand -16 (+ v1-36 15))) + ) + (set! (-> arg0 length) (max 32 (-> arg0 length))) + (set! (-> arg0 data 31 name) "shrubbery-stq") + (+! (-> arg0 data 31 count) 1) + (let ((v1-46 (* (-> obj stq-qwc) 16))) + (+! (-> arg0 data 31 used) v1-46) + (+! (-> arg0 data 31 total) (logand -16 (+ v1-46 15))) + ) + obj + ) + +(defmethod login drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub)) + "Initialize a shrubbery tree." + (if (nonzero? (-> obj info prototype-inline-array-shrub)) + (login (-> obj info prototype-inline-array-shrub)) + ) + obj + ) + +(define shrub-vu1-block (new 'static 'vu-function :length #x26a :qlength #x135)) + +(defun shrub-num-tris ((shrub shrubbery)) + "Get the number of triangles in a shrubbery fragment." + (the-as uint (- (-> shrub header data 2) (the-as uint (* (-> shrub header data 1) 2)))) + ) + +(defun shrub-make-perspective-matrix ((out matrix) (camera-temp matrix)) + "Compute the matrix used by the shrubbery VU1 program." + (let* ((v1-0 out) + (t0-0 camera-temp) + (a1-1 (-> t0-0 vector 0 quad)) + (a2-0 (-> t0-0 vector 1 quad)) + (a3-0 (-> t0-0 vector 2 quad)) + (t0-1 (-> t0-0 trans quad)) + ) + (set! (-> v1-0 vector 0 quad) a1-1) + (set! (-> v1-0 vector 1 quad) a2-0) + (set! (-> v1-0 vector 2 quad) a3-0) + (set! (-> v1-0 trans quad) t0-1) + ) + (let ((f0-1 (/ 1.0 (-> *math-camera* pfog0)))) + (set! (-> out vector 0 w) (* (-> out vector 0 w) f0-1)) + (set! (-> out vector 1 w) (* (-> out vector 1 w) f0-1)) + (set! (-> out vector 2 w) (* (-> out vector 2 w) f0-1)) + (set! (-> out trans w) (* (-> out trans w) f0-1)) + ) + (+! (-> out vector 0 x) (* (-> out vector 0 w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 1 x) (* (-> out vector 1 w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 2 x) (* (-> out vector 2 w) (-> *math-camera* hvdf-off x))) + (+! (-> out trans x) (* (-> out trans w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 0 y) (* (-> out vector 0 w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 1 y) (* (-> out vector 1 w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 2 y) (* (-> out vector 2 w) (-> *math-camera* hvdf-off y))) + (+! (-> out trans y) (* (-> out trans w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 0 z) (* (-> out vector 0 w) (-> *math-camera* hvdf-off z))) + (+! (-> out vector 1 z) (* (-> out vector 1 w) (-> *math-camera* hvdf-off z))) + (+! (-> out vector 2 z) (* (-> out vector 2 w) (-> *math-camera* hvdf-off z))) + (+! (-> out trans z) (* (-> out trans w) (-> *math-camera* hvdf-off z))) + out + ) + +(defun shrub-init-view-data ((view-data shrub-view-data)) + "Initialize shrubbery constants in place" + (set! (-> view-data texture-giftag tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x4)) + (set! (-> view-data texture-giftag regs) (new 'static 'gif-tag-regs + :regs0 (gif-reg-id a+d) + :regs1 (gif-reg-id a+d) + :regs2 (gif-reg-id a+d) + :regs3 (gif-reg-id a+d) + ) + ) + (set! (-> view-data texture-giftag word 3) (the-as uint #x40a00000)) + (set! (-> view-data tex-start-ptr) (the-as int 25167696.0)) + (set! (-> view-data mtx-buf-ptr) (the-as int 8388608.0)) + (set! (-> view-data fog-0) (-> *math-camera* pfog0)) + (set! (-> view-data fog-1) (-> *math-camera* pfog1)) + (set! (-> view-data fog-clamp x) (-> *math-camera* fog-min)) + (set! (-> view-data fog-clamp y) (-> *math-camera* fog-max)) + #f + ) + +(defun shrub-upload-view-data ((dma-buff dma-buffer)) + "Generate DMA data to upload shrubbery constants to VU1." + (let ((qwc 3)) + (let* ((buf dma-buff) + (pkt (the-as dma-packet (-> buf base))) + ) + (set! (-> pkt dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc qwc)) + (set! (-> pkt vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> pkt vif1) (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32) :num qwc)) + (set! (-> buf base) (&+ (the-as pointer pkt) 16)) + ) + (shrub-init-view-data (the-as shrub-view-data (-> dma-buff base))) + (&+! (-> dma-buff base) (* qwc 16)) + ) + #f + ) + +(defun shrub-time ((arg0 int) (arg1 int) (arg2 int) (arg3 int) (arg4 int)) + (+ (* arg0 8) 29 (* 22 arg2) (* 11 arg1) (* (+ (* arg4 2) 15 (* 5 arg2) (* 13 arg0)) arg3) 53) + ) + +(defun shrub-do-init-frame ((dma-buff dma-buffer)) + "Generate DMA to initialize the shrubbery renderer on VU1." + ;; upload VU1 program + (dma-buffer-add-vu-function dma-buff shrub-vu1-block 1) + ;; upload constants + (shrub-upload-view-data dma-buff) + ;; run program initialization function + (let* ((v1-0 dma-buff) + (pkt1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> pkt1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> pkt1 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #x0)) + (set! (-> pkt1 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer pkt1) 16)) + ) + ;; initialize VIF for shrubbery chains. + (let* ((v1-1 dma-buff) + (pkt2 (the-as dma-packet (-> v1-1 base))) + ) + (set! (-> pkt2 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt))) + (set! (-> pkt2 vif0) (new 'static 'vif-tag)) + (set! (-> pkt2 vif1) (new 'static 'vif-tag)) + (set! (-> v1-1 base) (&+ (the-as pointer pkt2) 16)) + ) + (let ((v1-2 (-> dma-buff base))) + (set! (-> (the-as (pointer vif-tag) v1-2) 0) (new 'static 'vif-tag :cmd (vif-cmd strow) :msk #x1)) + (set! (-> (the-as (pointer uint32) v1-2) 1) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 2) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 3) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 4) (the-as uint 0)) + (set! (-> (the-as (pointer vif-tag) v1-2) 5) (new 'static 'vif-tag :cmd (vif-cmd stcol) :msk #x1)) + (set! (-> (the-as (pointer uint32) v1-2) 6) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 7) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 8) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 9) (the-as uint 4096)) + (set! (-> (the-as (pointer vif-tag) v1-2) 10) (new 'static 'vif-tag :cmd (vif-cmd stmask))) + (set! (-> (the-as (pointer uint32) v1-2) 11) (the-as uint #xa0a0a0a0)) + (set! (-> dma-buff base) (&+ v1-2 48)) + ) + (set! *shrub-state* 2) + #f + ) + +(defun shrub-init-frame ((dma-buff dma-buffer) (test gs-test)) + "Generate DMA to initialize to shrubbery renderer VU1 and GS." + ;; init VU1 + (shrub-do-init-frame dma-buff) + ;; init GS. + (let* ((v1-0 dma-buff) + (pkt (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> pkt dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> pkt vif0) (new 'static 'vif-tag)) + (set! (-> pkt vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer pkt) 16)) + ) + (let* ((v1-1 dma-buff) + (giftag (the-as gs-gif-tag (-> v1-1 base))) + ) + (set! (-> giftag tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1)) + (set! (-> giftag regs) GIF_REGS_ALL_AD) + (set! (-> v1-1 base) (&+ (the-as pointer giftag) 16)) + ) + (let ((v1-2 (-> dma-buff base))) + (set! (-> (the-as (pointer gs-test) v1-2) 0) test) + (set! (-> (the-as (pointer gs-reg64) v1-2) 1) (gs-reg64 test-1)) + (set! (-> dma-buff base) (&+ v1-2 16)) + ) + #f + ) + +(defun shrub-upload-model ((shrub shrubbery) (dma-buff dma-buffer) (arg2 int)) + "Generate DMA to upload a shrub model" + (let* ((v1-0 dma-buff) + (a3-0 (the-as dma-packet (-> v1-0 base))) + ) + ;; upload the data + (set! (-> a3-0 dma) (new 'static 'dma-tag + :id (dma-tag-id ref) + :addr (the-as int (-> shrub obj)) + :qwc (+ (-> shrub obj-qwc) (-> shrub vtx-qwc) (-> shrub col-qwc) (-> shrub stq-qwc)) + ) + ) + (set! (-> a3-0 vif0) (new 'static 'vif-tag :cmd (vif-cmd base) :imm *shrub-state*)) + (set! (-> a3-0 vif1) (new 'static 'vif-tag :cmd (vif-cmd offset))) + (set! (-> v1-0 base) (&+ (the-as pointer a3-0) 16)) + ) + ;; run the program to init a model + (cond + ((= arg2 1) + (let* ((v1-2 dma-buff) + (a0-9 (the-as dma-packet (-> v1-2 base))) + ) + (set! (-> a0-9 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-9 vif0) (new 'static 'vif-tag)) + (set! (-> a0-9 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x11)) + (set! (-> v1-2 base) (&+ (the-as pointer a0-9) 16)) + ) + ) + (else + (let* ((v1-3 dma-buff) + (a0-11 (the-as dma-packet (-> v1-3 base))) + ) + (set! (-> a0-11 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-11 vif0) (new 'static 'vif-tag)) + (set! (-> a0-11 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x15)) + (set! (-> v1-3 base) (&+ (the-as pointer a0-11) 16)) + ) + ) + ) + + (set! *shrub-state* (- 164 *shrub-state*)) + #f + ) + +(defun draw-drawable-tree-instance-shrub ((tree drawable-tree-instance-shrub) (level level)) + (set! (-> *instance-shrub-work* texture-dists) (-> level bsp shrub-mask-count)) + (set! (-> *instance-shrub-work* near-last) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-next) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-count) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-last) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-next) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-count) (the-as uint 0)) + (set! (-> *instance-shrub-work* wind-vectors) (-> tree info wind-vectors)) + (set! (-> *instance-shrub-work* wait-to-spr) (the-as uint 0)) + (set! (-> *instance-shrub-work* wait-from-spr) (the-as uint 0)) + (when (logtest? (vu1-renderer-mask rn15 rn16 rn17 rn18) (-> *display* vu1-enable-user)) + (let* ((proto-array (-> tree info prototype-inline-array-shrub)) + (proto-array-len (-> proto-array length)) + (proto-array-data (-> proto-array data)) + ) + (countdown (i proto-array-len) + (let ((proto (-> proto-array data i))) + (set! (-> proto next-clear) (the-as uint128 0)) + (set! (-> proto last-clear) (the-as uint128 0)) + (set! (-> proto count-clear) (the-as uint 0)) + ) + 0 + ) + (let ((dma-buff (-> *display* frames (-> *display* on-screen) global-buf))) + (when (nonzero? (-> tree length)) + (let ((dma-start (-> *display* frames (-> *display* on-screen) global-buf base))) + + (reset! (-> *perf-stats* data (perf-stat-bucket inst-shrub))) + (draw-inline-array-instance-shrub + dma-buff + (&+ (-> tree data 0) 32) + (-> (the-as drawable-group (-> tree data 0)) length) + proto-array-data + ) + (read! (-> *perf-stats* data (perf-stat-bucket inst-shrub))) + + (reset! (-> *perf-stats* data (perf-stat-bucket proto-shrub))) + (draw-prototype-inline-array-shrub proto-array-len proto-array-data) + (read! (-> *perf-stats* data (perf-stat-bucket proto-shrub))) + + (let ((v1-33 *dma-mem-usage*)) + (when (nonzero? v1-33) + (set! (-> v1-33 length) (max 28 (-> v1-33 length))) + (set! (-> v1-33 data 27 name) "shrubbery") + (+! (-> v1-33 data 27 count) 1) + (+! (-> v1-33 data 27 used) + (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint dma-start)) + ) + (set! (-> v1-33 data 27 total) (-> v1-33 data 27 used)) + ) + ) + ) + ) + ) + ) + (update-wait-stats + (-> *perf-stats* data (perf-stat-bucket inst-shrub)) + (the-as uint 0) + (-> *instance-shrub-work* wait-to-spr) + (-> *instance-shrub-work* wait-from-spr) + ) + ) + 0 + (none) + ) + +(defmethod draw drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 drawable-tree-instance-shrub) (arg1 display-frame)) + (let ((v1-1 (-> *background-work* shrub-tree-count)) + (a1-4 (-> *level* draw-level *draw-index*)) + ) + (set! (-> *background-work* shrub-trees v1-1) obj) + (set! (-> *background-work* shrub-levels v1-1) a1-4) + ) + (+! (-> *background-work* shrub-tree-count) 1) + 0 + (none) + ) + +(defmethod unpack-vis drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 (pointer int8)) (arg1 (pointer int8))) + arg1 + ) + +(defmethod collect-stats drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub)) + (when (logtest? (vu1-renderer-mask rn15 rn16 rn17 rn18) (-> *display* vu1-enable-user)) + (let* ((v1-4 (-> obj info prototype-inline-array-shrub)) + (gp-0 (the-as object (-> v1-4 data))) + ) + (countdown (s5-0 (-> v1-4 length)) + (when (logtest? (vu1-renderer-mask rn16) (-> *display* vu1-enable-user)) + (let ((v1-8 (-> (the-as prototype-bucket-shrub gp-0) count 0)) + (a1-2 (-> (the-as prototype-bucket-shrub gp-0) geometry 0)) + ) + (when (nonzero? v1-8) + (let ((a0-4 (-> (the-as drawable-group a1-2) length))) + (+! (-> *terrain-stats* shrub groups) 1) + (+! (-> *terrain-stats* shrub fragments) (* a0-4 (the-as int v1-8))) + ) + (+! (-> *terrain-stats* shrub instances) v1-8) + ) + ) + ) + (when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask rn15)) + (let ((s4-0 (-> (the-as prototype-bucket-shrub gp-0) count 1)) + (v1-14 (-> (the-as prototype-bucket-shrub gp-0) geometry 1)) + ) + (when (nonzero? s4-0) + (let ((s3-0 (&+ v1-14 32)) + (s2-0 (-> (the-as drawable-group v1-14) length)) + ) + (+! (-> *terrain-stats* shrub groups) 1) + (+! (-> *terrain-stats* shrub fragments) s2-0) + (+! (-> *terrain-stats* shrub instances) s4-0) + (while (nonzero? s2-0) + (+! s2-0 -1) + (let ((a0-15 (* (shrub-num-tris (the-as shrubbery s3-0)) s4-0)) + (v1-26 (* (the-as uint (-> (the-as shrubbery s3-0) header data 2)) s4-0)) + ) + (+! (-> *terrain-stats* shrub tris) a0-15) + (+! (-> *terrain-stats* shrub dverts) v1-26) + ) + (&+! s3-0 32) + ) + ) + ) + ) + ) + (when (logtest? (vu1-renderer-mask rn18) (-> *display* vu1-enable-user)) + (let ((s4-1 (-> (the-as prototype-bucket-shrub gp-0) count 2)) + (v1-32 (-> (the-as prototype-bucket-shrub gp-0) geometry 2)) + ) + (when (nonzero? s4-1) + (let ((s3-1 (&+ v1-32 32)) + (s2-1 (-> (the-as drawable-group v1-32) length)) + ) + (+! (-> *terrain-stats* trans-shrub groups) 1) + (+! (-> *terrain-stats* trans-shrub fragments) s2-1) + (+! (-> *terrain-stats* trans-shrub instances) s4-1) + (while (nonzero? s2-1) + (+! s2-1 -1) + (let ((a0-28 (* (shrub-num-tris (the-as shrubbery s3-1)) s4-1)) + (v1-44 (* (the-as uint (-> (the-as shrubbery s3-1) header data 2)) s4-1)) + ) + (+! (-> *terrain-stats* trans-shrub tris) a0-28) + (+! (-> *terrain-stats* trans-shrub dverts) v1-44) + ) + (&+! s3-1 32) + ) + ) + ) + ) + ) + (when (logtest? (vu1-renderer-mask rn17) (-> *display* vu1-enable-user)) + (let ((v1-50 (-> (the-as prototype-bucket-shrub gp-0) count 3))) + (when (nonzero? v1-50) + (+! (-> *terrain-stats* billboard groups) 1) + (+! (-> *terrain-stats* billboard instances) v1-50) + (+! (-> *terrain-stats* billboard tris) (* v1-50 2)) + (+! (-> *terrain-stats* billboard dverts) (* v1-50 4)) + ) + ) + ) + (set! gp-0 (-> (the-as (inline-array prototype-bucket-shrub) gp-0) 1)) + ) + ) + ) + 0 + (none) + ) + +(deftype dma-test (structure) + ((data qword 101 :inline :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x650 + :flag-assert #x900000650 + ) + +(defmethod inspect dma-test ((obj dma-test)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'dma-test) + (format #t "~1Tdata[101] @ #x~X~%" (-> obj data)) + (label cfg-4) + obj + ) + +(define *dma-test* (new 'global 'dma-test)) + +(deftype dma-test-work (structure) + ((upload dma-packet :inline :offset-assert 0) + (end dma-packet :inline :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x20 + :flag-assert #x900000020 + ) + +(defmethod inspect dma-test-work ((obj dma-test-work)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'dma-test-work) + (format #t "~1Tupload: #~%" (-> obj upload)) + (format #t "~1Tend: #~%" (-> obj end)) + (label cfg-4) + obj + ) + +(define *dma-test-work* + (new 'static 'dma-test-work + :upload (new 'static 'dma-packet :dma (new 'static 'dma-tag :qwc #x20 :id (dma-tag-id ref))) + :end (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id end))) + ) + ) + +(defun init-dma-test () + (let ((a0-0 *dma-test-work*) + (v1-0 (the-as object *dma-test*)) + ) + (let ((a1-6 (-> *display* frames (-> *display* on-screen) calc-buf base))) + (dotimes (a2-1 100) + (set! (-> a0-0 upload dma addr) (the-as int a1-6)) + (set! (-> (the-as dma-test v1-0) data a2-1 quad) (-> a0-0 upload quad)) + (&+! a1-6 256) + ) + ) + (set! (-> (the-as (inline-array qword) v1-0) 101 quad) (-> a0-0 end quad)) + ) + (none) + ) + +(init-dma-test) diff --git a/test/decompiler/reference/jak2/engine/camera/cam-update_REF.gc b/test/decompiler/reference/jak2/engine/camera/cam-update_REF.gc index 20168f1cf4..5673af0c88 100644 --- a/test/decompiler/reference/jak2/engine/camera/cam-update_REF.gc +++ b/test/decompiler/reference/jak2/engine/camera/cam-update_REF.gc @@ -1286,30 +1286,24 @@ ) (update-view-planes gp-0 (-> gp-0 plane) 1.0 (-> gp-0 inv-camera-rot)) (update-view-planes gp-0 (-> gp-0 guard-plane) 4.0 (-> gp-0 inv-camera-rot)) - (let ((t9-20 shrub-make-perspective-matrix) - (a0-56 (-> gp-0 shrub-mat)) - ) - (-> gp-0 camera-temp) - (t9-20 a0-56) - ) + (shrub-make-perspective-matrix (-> gp-0 shrub-mat) (-> gp-0 camera-temp)) (update-visible gp-0) (when (-> *time-of-day-context* use-camera-other) (let ((s5-4 (-> gp-0 camera-rot)) (s4-2 (-> gp-0 camera-rot-other)) (s3-2 (-> gp-0 inv-camera-rot-other)) + (s2-1 (-> gp-0 camera-temp-other)) ) - (let ((s2-1 (-> gp-0 camera-temp-other))) - (quaternion->matrix s4-2 (-> gp-0 quat-other)) - (set! (-> s4-2 trans quad) (-> gp-0 trans-other quad)) - (set! (-> s4-2 trans w) 1.0) - (matrix*! s4-2 s4-2 s5-4) - (matrix-inverse-of-rot-trans! s3-2 s4-2) - (matrix*! s2-1 s4-2 (-> gp-0 perspective)) - ) + (quaternion->matrix s4-2 (-> gp-0 quat-other)) + (set! (-> s4-2 trans quad) (-> gp-0 trans-other quad)) + (set! (-> s4-2 trans w) 1.0) + (matrix*! s4-2 s4-2 s5-4) + (matrix-inverse-of-rot-trans! s3-2 s4-2) + (matrix*! s2-1 s4-2 (-> gp-0 perspective)) (update-view-planes gp-0 (-> gp-0 plane-other) 1.0 s3-2) (update-view-planes gp-0 (-> gp-0 guard-plane-other) 4.0 s3-2) + (shrub-make-perspective-matrix (-> gp-0 shrub-mat-other) s2-1) ) - (shrub-make-perspective-matrix (-> gp-0 shrub-mat-other)) ) ) #f diff --git a/test/decompiler/reference/jak2/engine/gfx/background/prototype-h_REF.gc b/test/decompiler/reference/jak2/engine/gfx/background/prototype-h_REF.gc index 3360445a2b..1315b79e36 100644 --- a/test/decompiler/reference/jak2/engine/gfx/background/prototype-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/background/prototype-h_REF.gc @@ -54,13 +54,14 @@ ;; definition of type prototype-bucket-shrub (deftype prototype-bucket-shrub (prototype-bucket) - ((next uint32 4 :offset-assert 64) - (count uint16 4 :offset-assert 80) - (mod-count uint16 4 :offset-assert 88) - (last dma-packet 4 :offset-assert 96) - (next-clear uint128 :offset 64) - (count-clear uint64 :offset 80) - (last-clear uint128 :offset 96) + ((next uint32 4 :offset-assert 64) + (count uint16 4 :offset-assert 80) + (mod-count uint16 4 :offset-assert 88) + (last dma-packet 4 :offset-assert 96) + (next-clear uint128 :offset 64) + (count-clear uint64 :offset 80) + (count-clear-qword uint128 :offset 80) + (last-clear uint128 :offset 96) ) :method-count-assert 9 :size-assert #x70 diff --git a/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery-h_REF.gc b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery-h_REF.gc index 4c308fb001..c8575e0bfa 100644 --- a/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery-h_REF.gc @@ -53,14 +53,14 @@ (format #t "[~8x] ~A~%" obj 'shrub-view-data) (format #t "~1Tdata[3] @ #x~X~%" (-> obj data)) (format #t "~1Ttexture-giftag: #~%" (-> obj data)) - (format #t "~1Tconsts: #~%" (-> obj consts)) + (format #t "~1Tconsts: #~%" (&-> obj tex-start-ptr)) (format #t "~1Tfog-clamp: #~%" (-> obj fog-clamp)) - (format #t "~1Ttex-start-ptr: ~D~%" (-> obj consts x)) - (format #t "~1Tgifbufsum: ~f~%" (-> obj consts x)) - (format #t "~1Tmtx-buf-ptr: ~D~%" (-> obj consts y)) - (format #t "~1Texp23: ~f~%" (-> obj consts y)) - (format #t "~1Tfog-0: ~f~%" (-> obj consts z)) - (format #t "~1Tfog-1: ~f~%" (-> obj consts w)) + (format #t "~1Ttex-start-ptr: ~D~%" (-> obj tex-start-ptr)) + (format #t "~1Tgifbufsum: ~f~%" (-> obj gifbufsum)) + (format #t "~1Tmtx-buf-ptr: ~D~%" (-> obj mtx-buf-ptr)) + (format #t "~1Texp23: ~f~%" (-> obj exp23)) + (format #t "~1Tfog-0: ~f~%" (-> obj fog-0)) + (format #t "~1Tfog-1: ~f~%" (-> obj fog-1)) (format #t "~1Tfog-min: ~f~%" (-> obj fog-clamp x)) (format #t "~1Tfog-max: ~f~%" (-> obj fog-clamp y)) (label cfg-4) @@ -288,14 +288,14 @@ ;; definition of type shrub-near-packet (deftype shrub-near-packet (structure) - ((matrix-tmpl dma-packet :inline :offset-assert 0) - (header-tmpl dma-packet :inline :offset-assert 16) - (stq-tmpl dma-packet :inline :offset-assert 32) - (color-tmpl dma-packet :inline :offset-assert 48) - (vertex-tmpl dma-packet :inline :offset-assert 64) - (mscal-tmpl dma-packet :inline :offset-assert 80) - (init-tmpl dma-packet :inline :offset-assert 96) - (init-data uint32 8 :offset-assert 112) + ((matrix-tmpl dma-packet :inline :offset-assert 0) + (header-tmpl dma-packet :inline :offset-assert 16) + (stq-tmpl dma-packet :inline :offset-assert 32) + (color-tmpl dma-packet :inline :offset-assert 48) + (vertex-tmpl dma-packet :inline :offset-assert 64) + (mscal-tmpl dma-packet :inline :offset-assert 80) + (init-tmpl dma-packet :inline :offset-assert 96) + (init-data qword 2 :inline :offset-assert 112) ) :method-count-assert 9 :size-assert #x90 diff --git a/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc new file mode 100644 index 0000000000..c8d28d014e --- /dev/null +++ b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc @@ -0,0 +1,779 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for method 9 of type billboard +(defmethod login billboard ((obj billboard)) + (adgif-shader-login (-> obj flat)) + obj + ) + +;; definition for method 8 of type billboard +(defmethod mem-usage billboard ((obj billboard) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 34 (-> arg0 length))) + (set! (-> arg0 data 33 name) "billboard") + (+! (-> arg0 data 33 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 33 used) v1-6) + (+! (-> arg0 data 33 total) (logand -16 (+ v1-6 15))) + ) + obj + ) + +;; definition for function mem-usage-shrub-walk +(defun mem-usage-shrub-walk ((arg0 draw-node) (arg1 int) (arg2 memory-usage-block) (arg3 int)) + (set! (-> arg2 length) (max 64 (-> arg2 length))) + (set! (-> arg2 data 63 name) "draw-node") + (+! (-> arg2 data 63 count) arg1) + (let ((v1-5 (* arg1 32))) + (+! (-> arg2 data 63 used) v1-5) + (+! (-> arg2 data 63 total) (logand -16 (+ v1-5 15))) + ) + (let ((s2-0 arg0)) + (dotimes (s1-0 arg1) + (let ((a1-2 (-> s2-0 child-count))) + (cond + ((logtest? (-> s2-0 flags) 1) + (mem-usage-shrub-walk (the-as draw-node (-> s2-0 child)) (the-as int a1-2) arg2 arg3) + ) + (else + (set! (-> arg2 length) (max 35 (-> arg2 length))) + (set! (-> arg2 data 34 name) "instance-shrubbery") + (+! (-> arg2 data 34 count) a1-2) + (let ((v1-18 (* (the-as uint 80) a1-2))) + (+! (-> arg2 data 34 used) v1-18) + (+! (-> arg2 data 34 total) (logand -16 (+ v1-18 15))) + ) + ) + ) + ) + (&+! s2-0 32) + ) + ) + arg0 + ) + +;; definition for method 8 of type drawable-tree-instance-shrub +(defmethod mem-usage drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 1 (-> arg0 length))) + (set! (-> arg0 data 0 name) (symbol->string 'drawable-group)) + (+! (-> arg0 data 0 count) 1) + (let ((v1-7 32)) + (+! (-> arg0 data 0 used) v1-7) + (+! (-> arg0 data 0 total) (logand -16 (+ v1-7 15))) + ) + (when (nonzero? (-> obj colors-added)) + (set! (-> arg0 length) (max 33 (-> arg0 length))) + (set! (-> arg0 data 32 name) "shrubbery-pal") + (+! (-> arg0 data 32 count) 1) + (let ((v1-19 (asize-of (-> obj colors-added)))) + (+! (-> arg0 data 32 used) v1-19) + (+! (-> arg0 data 32 total) (logand -16 (+ v1-19 15))) + ) + ) + (mem-usage-shrub-walk + (the-as draw-node (&+ (-> obj data 0) 32)) + (-> (the-as drawable-group (-> obj data 0)) length) + arg0 + arg1 + ) + (mem-usage (-> obj info prototype-inline-array-shrub) arg0 (logior arg1 1)) + obj + ) + +;; definition for method 9 of type generic-shrub-fragment +(defmethod login generic-shrub-fragment ((obj generic-shrub-fragment)) + (let ((s5-0 (/ (-> obj cnt-qwc) (the-as uint 5)))) + (dotimes (s4-0 (the-as int s5-0)) + (adgif-shader-login-no-remap (-> obj textures s4-0)) + ) + ) + obj + ) + +;; definition for method 8 of type generic-shrub-fragment +(defmethod mem-usage generic-shrub-fragment ((obj generic-shrub-fragment) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 27 (-> arg0 length))) + (set! (-> arg0 data 25 name) "generic-shrub") + (+! (-> arg0 data 25 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 25 used) v1-6) + (+! (-> arg0 data 25 total) (logand -16 (+ v1-6 15))) + ) + (set! (-> arg0 data 26 name) "generic-shrub-data") + (+! (-> arg0 data 26 count) 1) + (let ((v1-17 (* (+ (-> obj cnt-qwc) (-> obj vtx-qwc) (-> obj col-qwc) (-> obj stq-qwc)) 16))) + (+! (-> arg0 data 26 used) v1-17) + (+! (-> arg0 data 26 total) (logand -16 (+ v1-17 15))) + ) + obj + ) + +;; definition for method 3 of type prototype-shrubbery +(defmethod inspect prototype-shrubbery ((obj prototype-shrubbery)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tlength: ~D~%" (-> obj length)) + (format #t "~Tdata[~D]: @ #x~X~%" (-> obj length) (-> obj data)) + (dotimes (s5-0 (-> obj length)) + (format #t "~T [~D] ~A~%" s5-0 (-> obj data s5-0)) + ) + obj + ) + +;; definition for method 8 of type prototype-shrubbery +(defmethod mem-usage prototype-shrubbery ((obj prototype-shrubbery) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 1 (-> arg0 length))) + (set! (-> arg0 data 0 name) (symbol->string 'drawable-group)) + (+! (-> arg0 data 0 count) 1) + (let ((v1-7 32)) + (+! (-> arg0 data 0 used) v1-7) + (+! (-> arg0 data 0 total) (logand -16 (+ v1-7 15))) + ) + (dotimes (s3-0 (-> obj length)) + (mem-usage (-> obj data s3-0) arg0 arg1) + ) + obj + ) + +;; definition for method 9 of type prototype-shrubbery +(defmethod login prototype-shrubbery ((obj prototype-shrubbery)) + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) + +;; definition for method 5 of type prototype-shrubbery +;; WARN: Return type mismatch uint vs int. +(defmethod asize-of prototype-shrubbery ((obj prototype-shrubbery)) + (the-as int (+ (-> prototype-shrubbery size) (* (+ (-> obj length) -1) 32))) + ) + +;; definition for method 9 of type prototype-generic-shrub +(defmethod login prototype-generic-shrub ((obj prototype-generic-shrub)) + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) + +;; definition for method 9 of type shrubbery +(defmethod login shrubbery ((obj shrubbery)) + (let ((s5-0 (* (-> obj header data 0) 2))) + (dotimes (s4-0 (the-as int s5-0)) + (let ((v1-3 (adgif-shader-login-no-remap (-> obj textures s4-0)))) + (when v1-3 + (dotimes (a0-5 3) + (dotimes (a1-0 3) + (set! (-> (the-as (pointer int32) (+ (+ (* a0-5 16) (* a1-0 4)) (the-as int *texture-masks*)))) + (logior (-> (the-as (pointer int32) (+ (* a1-0 4) (the-as int *texture-masks*) (* a0-5 16))) 0) + (-> (the-as (inline-array texture-masks) (+ (* a1-0 4) (the-as int v1-3) (* a0-5 16))) 1 data 0 mask w) + ) + ) + ) + (set! (-> *texture-masks* data a0-5 mask w) + (the-as int (fmax (-> *texture-masks* data a0-5 dist) (-> v1-3 masks data a0-5 dist))) + ) + ) + ) + ) + ) + ) + (shrubbery-login-post-texture obj) + obj + ) + +;; definition for method 8 of type shrubbery +(defmethod mem-usage shrubbery ((obj shrubbery) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 28 (-> arg0 length))) + (set! (-> arg0 data 27 name) "shrubbery") + (+! (-> arg0 data 27 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 27 used) v1-6) + (+! (-> arg0 data 27 total) (logand -16 (+ v1-6 15))) + ) + (set! (-> arg0 length) (max 30 (-> arg0 length))) + (set! (-> arg0 data 29 name) "shrubbery-vertex") + (+! (-> arg0 data 29 count) 1) + (let ((v1-16 (* (-> obj vtx-qwc) 16))) + (+! (-> arg0 data 29 used) v1-16) + (+! (-> arg0 data 29 total) (logand -16 (+ v1-16 15))) + ) + (set! (-> arg0 length) (max 31 (-> arg0 length))) + (set! (-> arg0 data 30 name) "shrubbery-color") + (+! (-> arg0 data 30 count) 1) + (let ((v1-26 (* (-> obj col-qwc) 16))) + (+! (-> arg0 data 30 used) v1-26) + (+! (-> arg0 data 30 total) (logand -16 (+ v1-26 15))) + ) + (set! (-> arg0 length) (max 29 (-> arg0 length))) + (set! (-> arg0 data 28 name) "shrubbery-object") + (+! (-> arg0 data 28 count) 1) + (let ((v1-36 (* (-> obj obj-qwc) 16))) + (+! (-> arg0 data 28 used) v1-36) + (+! (-> arg0 data 28 total) (logand -16 (+ v1-36 15))) + ) + (set! (-> arg0 length) (max 32 (-> arg0 length))) + (set! (-> arg0 data 31 name) "shrubbery-stq") + (+! (-> arg0 data 31 count) 1) + (let ((v1-46 (* (-> obj stq-qwc) 16))) + (+! (-> arg0 data 31 used) v1-46) + (+! (-> arg0 data 31 total) (logand -16 (+ v1-46 15))) + ) + obj + ) + +;; definition for method 9 of type drawable-tree-instance-shrub +(defmethod login drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub)) + (if (nonzero? (-> obj info prototype-inline-array-shrub)) + (login (-> obj info prototype-inline-array-shrub)) + ) + obj + ) + +;; definition for symbol shrub-vu1-block, type vu-function +(define shrub-vu1-block (new 'static 'vu-function :length #x26a :qlength #x135)) + +;; definition for function shrub-num-tris +;; WARN: Return type mismatch uint32 vs uint. +(defun shrub-num-tris ((shrub shrubbery)) + (the-as uint (- (-> shrub header data 2) (the-as uint (* (-> shrub header data 1) 2)))) + ) + +;; definition for function shrub-make-perspective-matrix +;; INFO: Used lq/sq +(defun shrub-make-perspective-matrix ((out matrix) (camera-temp matrix)) + (let* ((v1-0 out) + (t0-0 camera-temp) + (a1-1 (-> t0-0 vector 0 quad)) + (a2-0 (-> t0-0 vector 1 quad)) + (a3-0 (-> t0-0 vector 2 quad)) + (t0-1 (-> t0-0 trans quad)) + ) + (set! (-> v1-0 vector 0 quad) a1-1) + (set! (-> v1-0 vector 1 quad) a2-0) + (set! (-> v1-0 vector 2 quad) a3-0) + (set! (-> v1-0 trans quad) t0-1) + ) + (let ((f0-1 (/ 1.0 (-> *math-camera* pfog0)))) + (set! (-> out vector 0 w) (* (-> out vector 0 w) f0-1)) + (set! (-> out vector 1 w) (* (-> out vector 1 w) f0-1)) + (set! (-> out vector 2 w) (* (-> out vector 2 w) f0-1)) + (set! (-> out trans w) (* (-> out trans w) f0-1)) + ) + (+! (-> out vector 0 x) (* (-> out vector 0 w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 1 x) (* (-> out vector 1 w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 2 x) (* (-> out vector 2 w) (-> *math-camera* hvdf-off x))) + (+! (-> out trans x) (* (-> out trans w) (-> *math-camera* hvdf-off x))) + (+! (-> out vector 0 y) (* (-> out vector 0 w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 1 y) (* (-> out vector 1 w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 2 y) (* (-> out vector 2 w) (-> *math-camera* hvdf-off y))) + (+! (-> out trans y) (* (-> out trans w) (-> *math-camera* hvdf-off y))) + (+! (-> out vector 0 z) (* (-> out vector 0 w) (-> *math-camera* hvdf-off z))) + (+! (-> out vector 1 z) (* (-> out vector 1 w) (-> *math-camera* hvdf-off z))) + (+! (-> out vector 2 z) (* (-> out vector 2 w) (-> *math-camera* hvdf-off z))) + (+! (-> out trans z) (* (-> out trans w) (-> *math-camera* hvdf-off z))) + out + ) + +;; definition for function shrub-init-view-data +(defun shrub-init-view-data ((view-data shrub-view-data)) + (set! (-> view-data texture-giftag tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x4)) + (set! (-> view-data texture-giftag regs) (new 'static 'gif-tag-regs + :regs0 (gif-reg-id a+d) + :regs1 (gif-reg-id a+d) + :regs2 (gif-reg-id a+d) + :regs3 (gif-reg-id a+d) + ) + ) + (set! (-> view-data texture-giftag word 3) (the-as uint #x40a00000)) + (set! (-> view-data tex-start-ptr) (the-as int 25167696.0)) + (set! (-> view-data mtx-buf-ptr) (the-as int 8388608.0)) + (set! (-> view-data fog-0) (-> *math-camera* pfog0)) + (set! (-> view-data fog-1) (-> *math-camera* pfog1)) + (set! (-> view-data fog-clamp x) (-> *math-camera* fog-min)) + (set! (-> view-data fog-clamp y) (-> *math-camera* fog-max)) + #f + ) + +;; definition for function shrub-upload-view-data +(defun shrub-upload-view-data ((dma-buff dma-buffer)) + (let ((qwc 3)) + (let* ((buf dma-buff) + (pkt (the-as dma-packet (-> buf base))) + ) + (set! (-> pkt dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc qwc)) + (set! (-> pkt vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> pkt vif1) (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32) :num qwc)) + (set! (-> buf base) (&+ (the-as pointer pkt) 16)) + ) + (shrub-init-view-data (the-as shrub-view-data (-> dma-buff base))) + (&+! (-> dma-buff base) (* qwc 16)) + ) + #f + ) + +;; definition for function shrub-time +(defun shrub-time ((arg0 int) (arg1 int) (arg2 int) (arg3 int) (arg4 int)) + (+ (* arg0 8) 29 (* 22 arg2) (* 11 arg1) (* (+ (* arg4 2) 15 (* 5 arg2) (* 13 arg0)) arg3) 53) + ) + +;; definition for function shrub-do-init-frame +(defun shrub-do-init-frame ((dma-buff dma-buffer)) + (dma-buffer-add-vu-function dma-buff shrub-vu1-block 1) + (shrub-upload-view-data dma-buff) + (let* ((v1-0 dma-buff) + (pkt1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> pkt1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> pkt1 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #x0)) + (set! (-> pkt1 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer pkt1) 16)) + ) + (let* ((v1-1 dma-buff) + (pkt2 (the-as dma-packet (-> v1-1 base))) + ) + (set! (-> pkt2 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt))) + (set! (-> pkt2 vif0) (new 'static 'vif-tag)) + (set! (-> pkt2 vif1) (new 'static 'vif-tag)) + (set! (-> v1-1 base) (&+ (the-as pointer pkt2) 16)) + ) + (let ((v1-2 (-> dma-buff base))) + (set! (-> (the-as (pointer vif-tag) v1-2) 0) (new 'static 'vif-tag :cmd (vif-cmd strow) :msk #x1)) + (set! (-> (the-as (pointer uint32) v1-2) 1) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 2) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 3) (the-as uint #x8080)) + (set! (-> (the-as (pointer uint32) v1-2) 4) (the-as uint 0)) + (set! (-> (the-as (pointer vif-tag) v1-2) 5) (new 'static 'vif-tag :cmd (vif-cmd stcol) :msk #x1)) + (set! (-> (the-as (pointer uint32) v1-2) 6) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 7) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 8) (the-as uint 4096)) + (set! (-> (the-as (pointer uint32) v1-2) 9) (the-as uint 4096)) + (set! (-> (the-as (pointer vif-tag) v1-2) 10) (new 'static 'vif-tag :cmd (vif-cmd stmask))) + (set! (-> (the-as (pointer uint32) v1-2) 11) (the-as uint #xa0a0a0a0)) + (set! (-> dma-buff base) (&+ v1-2 48)) + ) + (set! *shrub-state* 2) + #f + ) + +;; definition for function shrub-init-frame +(defun shrub-init-frame ((dma-buff dma-buffer) (test gs-test)) + (shrub-do-init-frame dma-buff) + (let* ((v1-0 dma-buff) + (pkt (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> pkt dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> pkt vif0) (new 'static 'vif-tag)) + (set! (-> pkt vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer pkt) 16)) + ) + (let* ((v1-1 dma-buff) + (giftag (the-as gs-gif-tag (-> v1-1 base))) + ) + (set! (-> giftag tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1)) + (set! (-> giftag regs) GIF_REGS_ALL_AD) + (set! (-> v1-1 base) (&+ (the-as pointer giftag) 16)) + ) + (let ((v1-2 (-> dma-buff base))) + (set! (-> (the-as (pointer gs-test) v1-2) 0) test) + (set! (-> (the-as (pointer gs-reg64) v1-2) 1) (gs-reg64 test-1)) + (set! (-> dma-buff base) (&+ v1-2 16)) + ) + #f + ) + +;; definition for function shrub-upload-model +(defun shrub-upload-model ((shrub shrubbery) (dma-buff dma-buffer) (arg2 int)) + (let* ((v1-0 dma-buff) + (a3-0 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a3-0 dma) (new 'static 'dma-tag + :id (dma-tag-id ref) + :addr (the-as int (-> shrub obj)) + :qwc (+ (-> shrub obj-qwc) (-> shrub vtx-qwc) (-> shrub col-qwc) (-> shrub stq-qwc)) + ) + ) + (set! (-> a3-0 vif0) (new 'static 'vif-tag :cmd (vif-cmd base) :imm *shrub-state*)) + (set! (-> a3-0 vif1) (new 'static 'vif-tag :cmd (vif-cmd offset))) + (set! (-> v1-0 base) (&+ (the-as pointer a3-0) 16)) + ) + (cond + ((= arg2 1) + (let* ((v1-2 dma-buff) + (a0-9 (the-as dma-packet (-> v1-2 base))) + ) + (set! (-> a0-9 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-9 vif0) (new 'static 'vif-tag)) + (set! (-> a0-9 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x11)) + (set! (-> v1-2 base) (&+ (the-as pointer a0-9) 16)) + ) + ) + (else + (let* ((v1-3 dma-buff) + (a0-11 (the-as dma-packet (-> v1-3 base))) + ) + (set! (-> a0-11 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-11 vif0) (new 'static 'vif-tag)) + (set! (-> a0-11 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x15)) + (set! (-> v1-3 base) (&+ (the-as pointer a0-11) 16)) + ) + ) + ) + (set! *shrub-state* (- 164 *shrub-state*)) + #f + ) + +;; definition for function draw-inline-array-instance-shrub +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function draw-prototype-inline-array-shrub +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function draw-drawable-tree-instance-shrub +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtpc pcr0, r0] +;; ERROR: Unsupported inline assembly instruction kind - [mtpc pcr1, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, a2] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mfpc a0, pcr0] +;; ERROR: Unsupported inline assembly instruction kind - [mfpc a0, pcr1] +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtpc pcr0, r0] +;; ERROR: Unsupported inline assembly instruction kind - [mtpc pcr1, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, a0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mtc0 Perf, r0] +;; ERROR: Unsupported inline assembly instruction kind - [sync.l] +;; ERROR: Unsupported inline assembly instruction kind - [sync.p] +;; ERROR: Unsupported inline assembly instruction kind - [mfpc a0, pcr0] +;; ERROR: Unsupported inline assembly instruction kind - [mfpc a0, pcr1] +(defun draw-drawable-tree-instance-shrub ((tree drawable-tree-instance-shrub) (level level)) + (local-vars (a0-4 int) (a0-6 int) (a0-11 int) (a0-13 int)) + (set! (-> *instance-shrub-work* texture-dists) (-> level bsp shrub-mask-count)) + (set! (-> *instance-shrub-work* near-last) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-next) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-count) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-last) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-next) (the-as uint 0)) + (set! (-> *instance-shrub-work* near-trans-count) (the-as uint 0)) + (set! (-> *instance-shrub-work* wind-vectors) (-> tree info wind-vectors)) + (set! (-> *instance-shrub-work* wait-to-spr) (the-as uint 0)) + (set! (-> *instance-shrub-work* wait-from-spr) (the-as uint 0)) + (when (logtest? (vu1-renderer-mask rn15 rn16 rn17 rn18) (-> *display* vu1-enable-user)) + (let* ((proto-array (-> tree info prototype-inline-array-shrub)) + (proto-array-len (-> proto-array length)) + (proto-array-data (-> proto-array data)) + ) + (countdown (i proto-array-len) + (let ((proto (-> proto-array data i))) + (set! (-> proto next-clear) (the-as uint128 0)) + (set! (-> proto last-clear) (the-as uint128 0)) + (set! (-> proto count-clear) (the-as uint 0)) + ) + 0 + ) + (let ((dma-buff (-> *display* frames (-> *display* on-screen) global-buf))) + (when (nonzero? (-> tree length)) + (let ((dma-start (-> *display* frames (-> *display* on-screen) global-buf base))) + (let* ((a1-16 (-> *perf-stats* data 44)) + (a2-6 (-> a1-16 ctrl)) + ) + (+! (-> a1-16 count) 1) + (b! (zero? a2-6) cfg-7 :delay (nop!)) + (.mtc0 Perf r0) + (.sync.l) + (.sync.p) + (.mtpc pcr0 r0) + (.mtpc pcr1 r0) + (.sync.l) + (.sync.p) + (.mtc0 Perf a2-6) + ) + (.sync.l) + (.sync.p) + (label cfg-7) + 0 + (draw-inline-array-instance-shrub + dma-buff + (&+ (-> tree data 0) 32) + (-> (the-as drawable-group (-> tree data 0)) length) + proto-array-data + ) + (let ((v1-26 (-> *perf-stats* data 44))) + (b! (zero? (-> v1-26 ctrl)) cfg-9 :delay (nop!)) + (.mtc0 Perf r0) + (.sync.l) + (.sync.p) + (.mfpc a0-4 pcr0) + (+! (-> v1-26 accum0) a0-4) + (.mfpc a0-6 pcr1) + (+! (-> v1-26 accum1) a0-6) + ) + (label cfg-9) + 0 + (let* ((v1-29 (-> *perf-stats* data 45)) + (a0-8 (-> v1-29 ctrl)) + ) + (+! (-> v1-29 count) 1) + (b! (zero? a0-8) cfg-11 :delay (nop!)) + (.mtc0 Perf r0) + (.sync.l) + (.sync.p) + (.mtpc pcr0 r0) + (.mtpc pcr1 r0) + (.sync.l) + (.sync.p) + (.mtc0 Perf a0-8) + ) + (.sync.l) + (.sync.p) + (label cfg-11) + 0 + (draw-prototype-inline-array-shrub proto-array-len proto-array-data) + (let ((v1-32 (-> *perf-stats* data 45))) + (b! (zero? (-> v1-32 ctrl)) cfg-13 :delay (nop!)) + (.mtc0 Perf r0) + (.sync.l) + (.sync.p) + (.mfpc a0-11 pcr0) + (+! (-> v1-32 accum0) a0-11) + (.mfpc a0-13 pcr1) + (+! (-> v1-32 accum1) a0-13) + ) + (label cfg-13) + 0 + (let ((v1-33 *dma-mem-usage*)) + (when (nonzero? v1-33) + (set! (-> v1-33 length) (max 28 (-> v1-33 length))) + (set! (-> v1-33 data 27 name) "shrubbery") + (+! (-> v1-33 data 27 count) 1) + (+! (-> v1-33 data 27 used) + (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint dma-start)) + ) + (set! (-> v1-33 data 27 total) (-> v1-33 data 27 used)) + ) + ) + ) + ) + ) + ) + (update-wait-stats + (-> *perf-stats* data 44) + (the-as uint 0) + (-> *instance-shrub-work* wait-to-spr) + (-> *instance-shrub-work* wait-from-spr) + ) + ) + 0 + (none) + ) + +;; definition for method 10 of type drawable-tree-instance-shrub +;; WARN: Return type mismatch int vs none. +(defmethod draw drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 drawable-tree-instance-shrub) (arg1 display-frame)) + (let ((v1-1 (-> *background-work* shrub-tree-count)) + (a1-4 (-> *level* draw-level *draw-index*)) + ) + (set! (-> *background-work* shrub-trees v1-1) obj) + (set! (-> *background-work* shrub-levels v1-1) a1-4) + ) + (+! (-> *background-work* shrub-tree-count) 1) + 0 + (none) + ) + +;; definition for method 15 of type drawable-tree-instance-shrub +(defmethod unpack-vis drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub) (arg0 (pointer int8)) (arg1 (pointer int8))) + arg1 + ) + +;; definition for method 13 of type drawable-tree-instance-shrub +;; WARN: Return type mismatch int vs none. +(defmethod collect-stats drawable-tree-instance-shrub ((obj drawable-tree-instance-shrub)) + (when (logtest? (vu1-renderer-mask rn15 rn16 rn17 rn18) (-> *display* vu1-enable-user)) + (let* ((v1-4 (-> obj info prototype-inline-array-shrub)) + (gp-0 (the-as object (-> v1-4 data))) + ) + (countdown (s5-0 (-> v1-4 length)) + (when (logtest? (vu1-renderer-mask rn16) (-> *display* vu1-enable-user)) + (let ((v1-8 (-> (the-as prototype-bucket-shrub gp-0) count 0)) + (a1-2 (-> (the-as prototype-bucket-shrub gp-0) geometry 0)) + ) + (when (nonzero? v1-8) + (let ((a0-4 (-> (the-as drawable-group a1-2) length))) + (+! (-> *terrain-stats* shrub groups) 1) + (+! (-> *terrain-stats* shrub fragments) (* a0-4 (the-as int v1-8))) + ) + (+! (-> *terrain-stats* shrub instances) v1-8) + ) + ) + ) + (when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask rn15)) + (let ((s4-0 (-> (the-as prototype-bucket-shrub gp-0) count 1)) + (v1-14 (-> (the-as prototype-bucket-shrub gp-0) geometry 1)) + ) + (when (nonzero? s4-0) + (let ((s3-0 (&+ v1-14 32)) + (s2-0 (-> (the-as drawable-group v1-14) length)) + ) + (+! (-> *terrain-stats* shrub groups) 1) + (+! (-> *terrain-stats* shrub fragments) s2-0) + (+! (-> *terrain-stats* shrub instances) s4-0) + (while (nonzero? s2-0) + (+! s2-0 -1) + (let ((a0-15 (* (shrub-num-tris (the-as shrubbery s3-0)) s4-0)) + (v1-26 (* (the-as uint (-> (the-as shrubbery s3-0) header data 2)) s4-0)) + ) + (+! (-> *terrain-stats* shrub tris) a0-15) + (+! (-> *terrain-stats* shrub dverts) v1-26) + ) + (&+! s3-0 32) + ) + ) + ) + ) + ) + (when (logtest? (vu1-renderer-mask rn18) (-> *display* vu1-enable-user)) + (let ((s4-1 (-> (the-as prototype-bucket-shrub gp-0) count 2)) + (v1-32 (-> (the-as prototype-bucket-shrub gp-0) geometry 2)) + ) + (when (nonzero? s4-1) + (let ((s3-1 (&+ v1-32 32)) + (s2-1 (-> (the-as drawable-group v1-32) length)) + ) + (+! (-> *terrain-stats* trans-shrub groups) 1) + (+! (-> *terrain-stats* trans-shrub fragments) s2-1) + (+! (-> *terrain-stats* trans-shrub instances) s4-1) + (while (nonzero? s2-1) + (+! s2-1 -1) + (let ((a0-28 (* (shrub-num-tris (the-as shrubbery s3-1)) s4-1)) + (v1-44 (* (the-as uint (-> (the-as shrubbery s3-1) header data 2)) s4-1)) + ) + (+! (-> *terrain-stats* trans-shrub tris) a0-28) + (+! (-> *terrain-stats* trans-shrub dverts) v1-44) + ) + (&+! s3-1 32) + ) + ) + ) + ) + ) + (when (logtest? (vu1-renderer-mask rn17) (-> *display* vu1-enable-user)) + (let ((v1-50 (-> (the-as prototype-bucket-shrub gp-0) count 3))) + (when (nonzero? v1-50) + (+! (-> *terrain-stats* billboard groups) 1) + (+! (-> *terrain-stats* billboard instances) v1-50) + (+! (-> *terrain-stats* billboard tris) (* v1-50 2)) + (+! (-> *terrain-stats* billboard dverts) (* v1-50 4)) + ) + ) + ) + (set! gp-0 (-> (the-as (inline-array prototype-bucket-shrub) gp-0) 1)) + ) + ) + ) + 0 + (none) + ) + +;; definition of type dma-test +(deftype dma-test (structure) + ((data qword 101 :inline :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x650 + :flag-assert #x900000650 + ) + +;; definition for method 3 of type dma-test +(defmethod inspect dma-test ((obj dma-test)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'dma-test) + (format #t "~1Tdata[101] @ #x~X~%" (-> obj data)) + (label cfg-4) + obj + ) + +;; definition for symbol *dma-test*, type dma-test +(define *dma-test* (new 'global 'dma-test)) + +;; definition of type dma-test-work +(deftype dma-test-work (structure) + ((upload dma-packet :inline :offset-assert 0) + (end dma-packet :inline :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x20 + :flag-assert #x900000020 + ) + +;; definition for method 3 of type dma-test-work +(defmethod inspect dma-test-work ((obj dma-test-work)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'dma-test-work) + (format #t "~1Tupload: #~%" (-> obj upload)) + (format #t "~1Tend: #~%" (-> obj end)) + (label cfg-4) + obj + ) + +;; definition for symbol *dma-test-work*, type dma-test-work +(define *dma-test-work* + (new 'static 'dma-test-work + :upload (new 'static 'dma-packet :dma (new 'static 'dma-tag :qwc #x20 :id (dma-tag-id ref))) + :end (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id end))) + ) + ) + +;; definition for function init-dma-test +;; INFO: Used lq/sq +;; WARN: Return type mismatch uint128 vs none. +(defun init-dma-test () + (let ((a0-0 *dma-test-work*) + (v1-0 (the-as object *dma-test*)) + ) + (let ((a1-6 (-> *display* frames (-> *display* on-screen) calc-buf base))) + (dotimes (a2-1 100) + (set! (-> a0-0 upload dma addr) (the-as int a1-6)) + (set! (-> (the-as dma-test v1-0) data a2-1 quad) (-> a0-0 upload quad)) + (&+! a1-6 256) + ) + ) + (set! (-> (the-as (inline-array qword) v1-0) 101 quad) (-> a0-0 end quad)) + ) + (none) + ) + +;; failed to figure out what this is: +(init-dma-test) + +;; definition for function dma-test-func +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function move-test-func +;; ERROR: function was not converted to expressions. Cannot decompile. + + + + diff --git a/test/decompiler/test_VuDisasm.cpp b/test/decompiler/test_VuDisasm.cpp index 26d990f413..b4706b41cc 100644 --- a/test/decompiler/test_VuDisasm.cpp +++ b/test/decompiler/test_VuDisasm.cpp @@ -44,6 +44,13 @@ TEST(VuDisasm, Emerc) { EXPECT_EQ(disasm.to_string(prog), get_expected("jak2/emerc-vu1")); } +TEST(VuDisasm, Shrub_Jak2) { + auto data = get_test_data("jak2/shrub"); + VuDisassembler disasm(VuDisassembler::VuKind::VU1); + auto prog = disasm.disassemble(data.data(), data.size() * 4, false); + EXPECT_EQ(disasm.to_string(prog), get_expected("jak2/shrub")); +} + TEST(VuDisasm, Sprite_Jak2) { auto data = get_test_data("jak2/sprite"); VuDisassembler disasm(VuDisassembler::VuKind::VU1); diff --git a/test/decompiler/vu_reference/jak2/shrub-result.txt b/test/decompiler/vu_reference/jak2/shrub-result.txt new file mode 100644 index 0000000000..5897efc088 --- /dev/null +++ b/test/decompiler/vu_reference/jak2/shrub-result.txt @@ -0,0 +1,681 @@ + lq.xyzw vf31, 0(vi00) | nop + lq.xyzw vf30, 1(vi00) | nop + lq.xyzw vf29, 2(vi00) | nop + iaddiu vi11, vi00, 0xa2 | nop + iaddiu vi01, vi00, 0x338 | nop + mfir.x vf17, vi01 | nop + mfir.z vf17, vi01 | nop + iaddiu vi01, vi00, 0x1a8 | nop + mfir.y vf17, vi01 | nop + mfir.w vf17, vi01 | nop + iaddi vi01, vi00, 0x1 | nop + mfir.z vf25, vi01 | nop + iaddi vi01, vi00, 0x1 | itof0.xyzw vf17, vf17 + mfir.z vf26, vi01 | nop + iaddi vi01, vi00, 0x1 | nop + mfir.z vf27, vi01 | nop :e + nop | addy.xyzw vf17, vf17, vf30 + iaddiu vi01, vi00, 0xa4 | subx.xz vf17, vf00, vf17 + isub vi11, vi01, vi11 | addy.xyzw vf28, vf00, vf30 + b L1 | nop + iaddiu vi13, vi00, 0x175 | nop + iaddiu vi01, vi00, 0xa4 | subx.xz vf17, vf00, vf17 + isub vi11, vi01, vi11 | addy.xyzw vf28, vf00, vf30 + iaddiu vi13, vi00, 0x142 | nop +L1: + isw.y vi13, 1(vi00) | nop + iaddi vi09, vi11, 0x1 | suby.xz vf17, vf17, vf17 + ilwr.y vi05, vi11 | nop + ilwr.x vi15, vi11 | nop + lqi.xyzw vf01, vi09 | nop + nop | addx.xz vf17, vf17, vf30 + nop | nop + iaddi vi15, vi15, -0x1 | nop + mtir vi04, vf01.w | nop + mtir vi02, vf17.x | nop + ibne vi00, vi15, L2 | nop + mtir vi03, vf17.y | nop + nop | addz.y vf28, vf28, vf31 +L2: + lqi.xyzw vf02, vi09 | nop + iadd vi01, vi04, vi02 | nop + iadd vi14, vi04, vi03 | nop + iaddi vi05, vi05, -0x1 | nop + mtir vi04, vf02.w | nop + sq.xyzw vf01, 0(vi01) | nop + ibeq vi00, vi05, L3 | nop + sq.xyzw vf01, 0(vi14) | nop + lqi.xyzw vf01, vi09 | nop + iadd vi01, vi04, vi02 | nop + iadd vi14, vi04, vi03 | nop + iaddi vi05, vi05, -0x1 | nop + mtir vi04, vf01.w | nop + sq.xyzw vf02, 0(vi01) | nop + ibne vi00, vi05, L2 | nop + sq.xyzw vf02, 0(vi14) | nop +L3: + iaddi vi09, vi09, -0x1 | nop + ilwr.x vi05, vi11 | nop +L4: + lqi.xyzw vf01, vi09 | nop + lqi.xyzw vf02, vi09 | nop + lqi.xyzw vf03, vi09 | nop + lqi.xyzw vf04, vi09 | nop + mtir vi04, vf01.w | nop + iaddi vi05, vi05, -0x1 | nop + nop | nop + nop | nop + iadd vi01, vi04, vi02 | nop + sq.xyzw vf31, 0(vi01) | nop + sq.xyzw vf01, 1(vi01) | nop + sq.xyzw vf02, 2(vi01) | nop + sq.xyzw vf03, 3(vi01) | nop + sq.xyzw vf04, 4(vi01) | nop + iadd vi01, vi04, vi03 | nop + sq.xyzw vf31, 0(vi01) | nop + sq.xyzw vf01, 1(vi01) | nop + sq.xyzw vf02, 2(vi01) | nop + sq.xyzw vf03, 3(vi01) | nop + ibne vi00, vi05, L4 | nop + sq.xyzw vf04, 4(vi01) | nop + ilwr.z vi12, vi11 | nop + ilwr.w vi06, vi11 | nop + isw.x vi09, 1(vi00) | nop + iaddi vi15, vi00, 0x1 | nop + ior vi05, vi12, vi00 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + iaddi vi05, vi05, 0x1 | nop +L5: + lq.xyzw vf01, 0(vi06) | nop + lq.xyz vf03, 0(vi07) | nop + lq.xyz vf05, 0(vi08) | nop + iaddi vi05, vi05, -0x2 | nop + lq.xyzw vf08, 1(vi06) | itof0.xyzw vf01, vf01 + lq.xyz vf10, 1(vi07) | itof0.xyzw vf03, vf03 + lq.xyz vf12, 1(vi08) | itof12.xyzw vf05, vf05 + nop | nop + sqi.xyzw vf01, vi06 | itof0.xyzw vf08, vf08 + sqi.xyz vf03, vi07 | itof0.xyzw vf10, vf10 + ibeq vi00, vi05, L6 | itof12.xyzw vf12, vf12 + sqi.xyz vf05, vi08 | nop + sqi.xyzw vf08, vi06 | nop + sqi.xyz vf10, vi07 | nop + ibne vi15, vi05, L5 | nop + sqi.xyz vf12, vi08 | nop +L6: + nop | nop :e + nop | nop + ilw.y vi13, 1(vi00) | nop + iaddiu vi01, vi00, 0x2b7 | nop + ilwr.w vi06, vi11 | nop + ilw.x vi09, 1(vi00) | nop + isub vi13, vi01, vi13 | nop + isw.y vi13, 1(vi00) | nop + ilwr.x vi14, vi13 | nop + lq.xyzw vf21, 4(vi13) | nop + lq.xyzw vf18, 1(vi13) | nop + lq.xyzw vf19, 2(vi13) | nop + lq.xyzw vf20, 3(vi13) | nop + lq.xyzw vf22, 5(vi13) | mulaz.w ACC, vf21, vf30 + iaddi vi13, vi13, 0x6 | maddw.w vf09, vf30, vf00 + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + move.w vf04, vf22 | miniy.w vf09, vf09, vf29 + move.w vf11, vf22 | nop + lqi.xyzw vf01, vi06 | nop + lqi.xyzw vf05, vi08 | nop + lqi.xyzw vf03, vi07 | ftoi4.w vf02, vf09 + lqi.xyzw vf08, vi06 | ftoi4.w vf09, vf09 + lqi.xyzw vf12, vi08 | add.xyzw vf07, vf01, vf17 + lqi.xyzw vf10, vi07 | mulaw.xyzw ACC, vf21, vf00 + nop | maddax.xyzw ACC, vf18, vf01 + nop | madday.xyzw ACC, vf19, vf01 + nop | maddz.xyzw vf01, vf20, vf01 + nop | add.xyzw vf14, vf08, vf17 + nop | mulaw.xyzw ACC, vf21, vf00 + nop | maddax.xyzw ACC, vf18, vf08 + div Q, vf00.w, vf01.w | madday.xyzw ACC, vf19, vf08 + nop | maddz.xyzw vf08, vf20, vf08 + nop | nop + nop | nop + nop | nop + nop | nop + nop | nop + nop | mul.xyz vf02, vf01, Q + nop | mul.xyzw vf06, vf05, Q + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | nop + mtir vi02, vf07.w | nop + lqi.xyzw vf03, vi07 | nop + nop | nop + nop | add.xyzw vf07, vf01, vf17 + nop | mulaw.xyzw ACC, vf21, vf00 + nop | maddax.xyzw ACC, vf18, vf01 + nop | madday.xyzw ACC, vf19, vf01 + nop | maddz.xyzw vf01, vf20, vf01 + nop | mul.xyz vf09, vf08, Q + nop | mul.xyzw vf13, vf12, Q +L7: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | nop + mtir vi05, vf14.w | nop + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + lqi.xyzw vf23, vi09 | mulaw.xyzw ACC, vf21, vf00 + lqi.xyzw vf24, vi09 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + isubiu vi10, vi00, 0x40 | maddz.xyzw vf08, vf20, vf08 +L8: + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf25, 0(vi02) | mul.xyzw vf06, vf05, Q + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | nop + mtir vi02, vf07.w | nop + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + nop | mulaw.xyzw ACC, vf21, vf00 + nop | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + nop | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf25, 0(vi05) | mul.xyzw vf13, vf12, Q + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulay.x ACC, vf15, vf16 + mtir vi05, vf14.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi01, L27 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 +L9: + ibeq vi01, vi03, L16 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + b L14 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q + nop | mul.xyzw vf06, vf05, Q +L10: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | nop + mtir vi02, vf07.w | nop + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + lqi.xyzw vf23, vi09 | mulaw.xyzw ACC, vf21, vf00 + lqi.xyzw vf24, vi09 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + isubiu vi10, vi00, 0x40 | maddz.xyzw vf01, vf20, vf01 +L11: + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf25, 0(vi05) | mul.xyzw vf13, vf12, Q + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | nop + mtir vi05, vf14.w | nop + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + nop | mulaw.xyzw ACC, vf21, vf00 + nop | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + nop | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf25, 0(vi02) | mul.xyzw vf06, vf05, Q + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulay.x ACC, vf15, vf16 + mtir vi02, vf07.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi04, L26 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 +L12: + ibeq vi04, vi03, L17 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + b L15 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L13: + sq.xyzw vf26, 0(vi02) | mul.xyzw vf06, vf05, Q +L14: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulay.x ACC, vf15, vf16 + mtir vi02, vf07.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi04, L22 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + ibeq vi04, vi03, L17 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf26, 0(vi05) | mul.xyzw vf13, vf12, Q +L15: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulay.x ACC, vf15, vf16 + mtir vi05, vf14.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi01, L23 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + ibne vi01, vi03, L13 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q +L16: + b L19 | nop + sq.xyzw vf24, 0(vi02) | mul.xyzw vf06, vf05, Q +L17: + b L20 | nop + sq.xyzw vf24, 0(vi05) | mul.xyzw vf13, vf12, Q +L18: + sq.xyzw vf27, 0(vi02) | mul.xyzw vf06, vf05, Q +L19: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulax.y ACC, vf15, vf16 + mtir vi02, vf07.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi04, L24 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + ibeq vi04, vi03, L21 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf27, 0(vi05) | mul.xyzw vf13, vf12, Q +L20: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulax.y ACC, vf15, vf16 + mtir vi05, vf14.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ibltz vi01, L25 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + ibne vi01, vi03, L18 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + b L14 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L21: + b L15 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L22: + ibne vi10, vi04, L28 | nop + iaddiu vi04, vi04, 0x80 | nop + lqi.xyzw vf23, vi09 | nop + b L11 | nop + lqi.xyzw vf24, vi09 | maddz.xyzw vf01, vf20, vf01 +L23: + ibne vi10, vi01, L33 | nop + iaddiu vi01, vi01, 0x80 | nop + lqi.xyzw vf23, vi09 | nop + b L8 | nop + lqi.xyzw vf24, vi09 | maddz.xyzw vf08, vf20, vf08 +L24: + ibne vi10, vi04, L38 | nop + iaddiu vi04, vi04, 0x80 | nop + lqi.xyzw vf23, vi09 | nop + b L11 | nop + lqi.xyzw vf24, vi09 | maddz.xyzw vf01, vf20, vf01 +L25: + ibne vi10, vi01, L43 | nop + iaddiu vi01, vi01, 0x80 | nop + lqi.xyzw vf23, vi09 | nop + b L8 | nop + lqi.xyzw vf24, vi09 | maddz.xyzw vf08, vf20, vf08 +L26: + ibeq vi10, vi04, L12 | nop + iaddiu vi04, vi04, 0x80 | nop + ilwr.w vi06, vi11 | maddz.xyzw vf01, vf20, vf01 + mr32.xyzw vf17, vf17 | mul.xyz vf09, vf08, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi04, vi03, L48 | nop + mtir vi04, vf10.w | nop + b L29 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L27: + ibeq vi10, vi01, L9 | nop + iaddiu vi01, vi01, 0x80 | nop + ilwr.w vi06, vi11 | maddz.xyzw vf08, vf20, vf08 + mr32.xyzw vf17, vf17 | mul.xyz vf02, vf01, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi01, vi03, L52 | nop + mtir vi01, vf03.w | nop + b L34 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L28: + ilwr.w vi06, vi11 | maddz.xyzw vf01, vf20, vf01 + mr32.xyzw vf17, vf17 | mul.xyz vf09, vf08, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi04, vi03, L48 | nop + mtir vi04, vf10.w | nop + sq.xyzw vf26, 0(vi05) | mul.xyzw vf13, vf12, Q +L29: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulay.x ACC, vf15, vf16 + mtir vi05, vf14.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ilw.x vi09, 1(vi00) | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + ibeq vi01, vi03, L49 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf26, 0(vi02) | mul.xyzw vf06, vf05, Q +L30: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulay.x ACC, vf15, vf16 + mtir vi02, vf07.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + mtir vi10, vf28.x | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + lqi.xyzw vf22, vi13 | mulz.w vf09, vf21, vf30 + ibeq vi04, vi03, L50 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf26, 0(vi05) | mul.xyzw vf13, vf12, Q +L31: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | mulay.x ACC, vf15, vf16 + lqi.xyzw vf12, vi08 | addw.w vf09, vf30, vf09 + mtir vi05, vf14.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + iaddi vi14, vi14, -0x1 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + mtir vi15, vf17.x | miniy.w vf09, vf09, vf29 + ibeq vi01, vi03, L51 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf26, 0(vi02) | mul.xyzw vf06, vf05, Q +L32: + move.w vf04, vf22 | addy.x vf28, vf00, vf28 + move.w vf11, vf22 | nop + iadd vi15, vi15, vi10 | nop + ibne vi00, vi14, L10 | ftoi4.w vf02, vf09 + xgkick vi15 | ftoi4.w vf09, vf09 + nop | nop :e + nop | nop +L33: + ilwr.w vi06, vi11 | maddz.xyzw vf08, vf20, vf08 + mr32.xyzw vf17, vf17 | mul.xyz vf02, vf01, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi01, vi03, L52 | nop + mtir vi01, vf03.w | nop + sq.xyzw vf26, 0(vi02) | mul.xyzw vf06, vf05, Q +L34: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulay.x ACC, vf15, vf16 + mtir vi02, vf07.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ilw.x vi09, 1(vi00) | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + ibeq vi04, vi03, L53 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf26, 0(vi05) | mul.xyzw vf13, vf12, Q +L35: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulay.x ACC, vf15, vf16 + mtir vi05, vf14.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + mtir vi10, vf28.x | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + lqi.xyzw vf22, vi13 | mulz.w vf02, vf21, vf30 + ibeq vi01, vi03, L54 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf26, 0(vi02) | mul.xyzw vf06, vf05, Q +L36: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | mulay.x ACC, vf15, vf16 + lqi.xyzw vf05, vi08 | addw.w vf02, vf30, vf02 + mtir vi02, vf07.w | msubay.x ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + iaddi vi14, vi14, -0x1 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + mtir vi15, vf17.x | miniy.w vf02, vf02, vf29 + ibeq vi04, vi03, L55 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf26, 0(vi05) | mul.xyzw vf13, vf12, Q +L37: + move.w vf04, vf22 | addy.x vf28, vf00, vf28 + move.w vf11, vf22 | nop + iadd vi15, vi15, vi10 | nop + ibne vi00, vi14, L7 | ftoi4.w vf09, vf02 + xgkick vi15 | ftoi4.w vf02, vf02 + nop | nop :e + nop | nop +L38: + ilwr.w vi06, vi11 | maddz.xyzw vf01, vf20, vf01 + mr32.xyzw vf17, vf17 | mul.xyz vf09, vf08, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi04, vi03, L56 | nop + mtir vi04, vf10.w | nop + sq.xyzw vf27, 0(vi05) | mul.xyzw vf13, vf12, Q +L39: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulax.y ACC, vf15, vf16 + mtir vi05, vf14.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ilw.x vi09, 1(vi00) | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + ibeq vi01, vi03, L57 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf27, 0(vi02) | mul.xyzw vf06, vf05, Q +L40: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulax.y ACC, vf15, vf16 + mtir vi02, vf07.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + mtir vi10, vf28.x | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + lqi.xyzw vf22, vi13 | mulz.w vf09, vf21, vf30 + ibeq vi04, vi03, L58 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf27, 0(vi05) | mul.xyzw vf13, vf12, Q +L41: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | mulax.y ACC, vf15, vf16 + lqi.xyzw vf12, vi08 | addw.w vf09, vf30, vf09 + mtir vi05, vf14.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + iaddi vi14, vi14, -0x1 | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + mtir vi15, vf17.x | miniy.w vf09, vf09, vf29 + ibeq vi01, vi03, L59 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf27, 0(vi02) | mul.xyzw vf06, vf05, Q +L42: + move.w vf04, vf22 | addy.x vf28, vf00, vf28 + move.w vf11, vf22 | nop + iadd vi15, vi15, vi10 | nop + ibne vi00, vi14, L10 | ftoi4.w vf02, vf09 + xgkick vi15 | ftoi4.w vf09, vf09 + nop | nop :e + nop | nop +L43: + ilwr.w vi06, vi11 | maddz.xyzw vf08, vf20, vf08 + mr32.xyzw vf17, vf17 | mul.xyz vf02, vf01, Q + lqi.xyzw vf18, vi13 | nop + lqi.xyzw vf19, vi13 | nop + lqi.xyzw vf20, vi13 | nop + lqi.xyzw vf21, vi13 | nop + iadd vi06, vi06, vi11 | nop + iadd vi07, vi06, vi12 | nop + iadd vi08, vi07, vi12 | nop + ibeq vi01, vi03, L60 | nop + mtir vi01, vf03.w | nop + sq.xyzw vf27, 0(vi02) | mul.xyzw vf06, vf05, Q +L44: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | nop + lqi.xyzw vf05, vi08 | mulax.y ACC, vf15, vf16 + mtir vi02, vf07.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + ilw.x vi09, 1(vi00) | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + ibeq vi04, vi03, L61 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf27, 0(vi05) | mul.xyzw vf13, vf12, Q +L45: + lqi.xyzw vf08, vi06 | mul.xyz vf11, vf10, vf22 + div Q, vf00.w, vf01.w | nop + lqi.xyzw vf12, vi08 | mulax.y ACC, vf15, vf16 + mtir vi05, vf14.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf10, vi07 | sub.xyzw vf15, vf02, vf09 + sq.xyzw vf06, 1(vi02) | ftoi4.xyz vf02, vf02 + sq.xyzw vf04, 2(vi02) | add.xyzw vf14, vf08, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + mtir vi10, vf28.x | maddax.xyzw ACC, vf18, vf08 + sq.xyzw vf02, 3(vi02) | madday.xyzw ACC, vf19, vf08 + lqi.xyzw vf22, vi13 | mulz.w vf02, vf21, vf30 + ibeq vi01, vi03, L62 | maddz.xyzw vf08, vf20, vf08 + mtir vi01, vf03.w | mul.xyz vf02, vf01, Q + sq.xyzw vf27, 0(vi02) | mul.xyzw vf06, vf05, Q +L46: + lqi.xyzw vf01, vi06 | mul.xyz vf04, vf03, vf22 + div Q, vf00.w, vf08.w | mulax.y ACC, vf15, vf16 + lqi.xyzw vf05, vi08 | addw.w vf02, vf30, vf02 + mtir vi02, vf07.w | msubax.y ACC, vf16, vf15 + lqi.xyzw vf03, vi07 | sub.xyzw vf16, vf09, vf02 + sq.xyzw vf13, 1(vi05) | ftoi4.xyz vf09, vf09 + sq.xyzw vf11, 2(vi05) | add.xyzw vf07, vf01, vf17 + fsand vi03, 0x2 | mulaw.xyzw ACC, vf21, vf00 + iaddi vi14, vi14, -0x1 | maddax.xyzw ACC, vf18, vf01 + sq.xyzw vf09, 3(vi05) | madday.xyzw ACC, vf19, vf01 + mtir vi15, vf17.x | miniy.w vf02, vf02, vf29 + ibeq vi04, vi03, L63 | maddz.xyzw vf01, vf20, vf01 + mtir vi04, vf10.w | mul.xyz vf09, vf08, Q + sq.xyzw vf27, 0(vi05) | mul.xyzw vf13, vf12, Q +L47: + move.w vf04, vf22 | addy.x vf28, vf00, vf28 + move.w vf11, vf22 | nop + iadd vi15, vi15, vi10 | nop + ibne vi00, vi14, L7 | ftoi4.w vf09, vf02 + xgkick vi15 | ftoi4.w vf02, vf02 + nop | nop :e + nop | nop +L48: + b L39 | nop + sq.xyzw vf24, 0(vi05) | mul.xyzw vf13, vf12, Q +L49: + b L40 | nop + sq.xyzw vf24, 0(vi02) | mul.xyzw vf06, vf05, Q +L50: + b L41 | nop + sq.xyzw vf24, 0(vi05) | mul.xyzw vf13, vf12, Q +L51: + b L42 | nop + sq.xyzw vf24, 0(vi02) | mul.xyzw vf06, vf05, Q +L52: + b L44 | nop + sq.xyzw vf24, 0(vi02) | mul.xyzw vf06, vf05, Q +L53: + b L45 | nop + sq.xyzw vf24, 0(vi05) | mul.xyzw vf13, vf12, Q +L54: + b L46 | nop + sq.xyzw vf24, 0(vi02) | mul.xyzw vf06, vf05, Q +L55: + b L47 | nop + sq.xyzw vf24, 0(vi05) | mul.xyzw vf13, vf12, Q +L56: + b L29 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L57: + b L30 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L58: + b L31 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L59: + b L32 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L60: + b L34 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L61: + b L35 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q +L62: + b L36 | nop + sq.xyzw vf23, 0(vi02) | mul.xyzw vf06, vf05, Q +L63: + b L37 | nop + sq.xyzw vf23, 0(vi05) | mul.xyzw vf13, vf12, Q diff --git a/test/decompiler/vu_reference/jak2/shrub.txt b/test/decompiler/vu_reference/jak2/shrub.txt new file mode 100644 index 0000000000..4bdad94def --- /dev/null +++ b/test/decompiler/vu_reference/jak2/shrub.txt @@ -0,0 +1,1236 @@ +.word 0x1ff0000 +.word 0x2ff +.word 0x1fe0001 +.word 0x2ff +.word 0x1fd0002 +.word 0x2ff +.word 0x100b00a2 +.word 0x2ff +.word 0x10010338 +.word 0x2ff +.word 0x81110bfd +.word 0x2ff +.word 0x80510bfd +.word 0x2ff +.word 0x100101a8 +.word 0x2ff +.word 0x80910bfd +.word 0x2ff +.word 0x80310bfd +.word 0x2ff +.word 0x80010072 +.word 0x2ff +.word 0x80590bfd +.word 0x2ff +.word 0x80010072 +.word 0x1f1893c +.word 0x805a0bfd +.word 0x2ff +.word 0x80010072 +.word 0x2ff +.word 0x805b0bfd +.word 0x400002ff +.word 0x80000030 +.word 0x1fe8c41 +.word 0x100100a4 +.word 0x1510444 +.word 0x800b0af1 +.word 0x1fe0701 +.word 0x40000004 +.word 0x2ff +.word 0x100d0175 +.word 0x2ff +.word 0x100100a4 +.word 0x1510444 +.word 0x800b0af1 +.word 0x1fe0701 +.word 0x100d0142 +.word 0x2ff +.word 0xa8d0001 +.word 0x2ff +.word 0x80095872 +.word 0x1518c45 +.word 0x80855bfe +.word 0x2ff +.word 0x810f5bfe +.word 0x2ff +.word 0x81e14b7c +.word 0x2ff +.word 0x80000030 +.word 0x15e8c40 +.word 0x80000030 +.word 0x2ff +.word 0x800f7ff2 +.word 0x2ff +.word 0x80640bfc +.word 0x2ff +.word 0x80028bfc +.word 0x2ff +.word 0x52007802 +.word 0x2ff +.word 0x80238bfc +.word 0x2ff +.word 0x80000030 +.word 0x9fe702 +.word 0x81e24b7c +.word 0x2ff +.word 0x80022070 +.word 0x2ff +.word 0x800323b0 +.word 0x2ff +.word 0x80052ff2 +.word 0x2ff +.word 0x806413fc +.word 0x2ff +.word 0x3e10800 +.word 0x2ff +.word 0x50002809 +.word 0x2ff +.word 0x3ee0800 +.word 0x2ff +.word 0x81e14b7c +.word 0x2ff +.word 0x80022070 +.word 0x2ff +.word 0x800323b0 +.word 0x2ff +.word 0x80052ff2 +.word 0x2ff +.word 0x80640bfc +.word 0x2ff +.word 0x3e11000 +.word 0x2ff +.word 0x52002ff1 +.word 0x2ff +.word 0x3ee1000 +.word 0x2ff +.word 0x80094ff2 +.word 0x2ff +.word 0x81055bfe +.word 0x2ff +.word 0x81e14b7c +.word 0x2ff +.word 0x81e24b7c +.word 0x2ff +.word 0x81e34b7c +.word 0x2ff +.word 0x81e44b7c +.word 0x2ff +.word 0x80640bfc +.word 0x2ff +.word 0x80052ff2 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80022070 +.word 0x2ff +.word 0x3e1f800 +.word 0x2ff +.word 0x3e10801 +.word 0x2ff +.word 0x3e11002 +.word 0x2ff +.word 0x3e11803 +.word 0x2ff +.word 0x3e12004 +.word 0x2ff +.word 0x80032070 +.word 0x2ff +.word 0x3e1f800 +.word 0x2ff +.word 0x3e10801 +.word 0x2ff +.word 0x3e11002 +.word 0x2ff +.word 0x3e11803 +.word 0x2ff +.word 0x52002fec +.word 0x2ff +.word 0x3e12004 +.word 0x2ff +.word 0x804c5bfe +.word 0x2ff +.word 0x80265bfe +.word 0x2ff +.word 0xb090001 +.word 0x2ff +.word 0x800f0072 +.word 0x2ff +.word 0x80006175 +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x80052872 +.word 0x2ff +.word 0x1e13000 +.word 0x2ff +.word 0x1c33800 +.word 0x2ff +.word 0x1c54000 +.word 0x2ff +.word 0x80052fb2 +.word 0x2ff +.word 0x1e83001 +.word 0x1e1093c +.word 0x1ca3801 +.word 0x1e3193c +.word 0x1cc4001 +.word 0x1e5293e +.word 0x80000030 +.word 0x2ff +.word 0x81e60b7d +.word 0x1e8413c +.word 0x81c71b7d +.word 0x1ea513c +.word 0x50002805 +.word 0x1ec613e +.word 0x81c82b7d +.word 0x2ff +.word 0x81e6437d +.word 0x2ff +.word 0x81c7537d +.word 0x2ff +.word 0x520f2ff1 +.word 0x2ff +.word 0x81c8637d +.word 0x2ff +.word 0x80000030 +.word 0x400002ff +.word 0x80000030 +.word 0x2ff +.word 0x88d0001 +.word 0x2ff +.word 0x100102b7 +.word 0x2ff +.word 0x80265bfe +.word 0x2ff +.word 0x9090001 +.word 0x2ff +.word 0x800d0b71 +.word 0x2ff +.word 0xa8d0001 +.word 0x2ff +.word 0x810e6bfe +.word 0x2ff +.word 0x1f56804 +.word 0x2ff +.word 0x1f26801 +.word 0x2ff +.word 0x1f36802 +.word 0x2ff +.word 0x1f46803 +.word 0x2ff +.word 0x1f66805 +.word 0x3ea9be +.word 0x800d69b2 +.word 0x20f24b +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x8024b33c +.word 0x3d4a55 +.word 0x802bb33c +.word 0x2ff +.word 0x81e1337c +.word 0x2ff +.word 0x81e5437c +.word 0x2ff +.word 0x81e33b7c +.word 0x22497d +.word 0x81e8337c +.word 0x29497d +.word 0x81ec437c +.word 0x1f109e8 +.word 0x81ea3b7c +.word 0x1e0a9bf +.word 0x80000030 +.word 0x1e190bc +.word 0x80000030 +.word 0x1e198bd +.word 0x80000030 +.word 0x1e1a04a +.word 0x80000030 +.word 0x1f143a8 +.word 0x80000030 +.word 0x1e0a9bf +.word 0x80000030 +.word 0x1e890bc +.word 0x81e103bc +.word 0x1e898bd +.word 0x80000030 +.word 0x1e8a20a +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x1c0089c +.word 0x80000030 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x2ff +.word 0x80623bfc +.word 0x2ff +.word 0x81e33b7c +.word 0x2ff +.word 0x80000030 +.word 0x2ff +.word 0x80000030 +.word 0x1f109e8 +.word 0x80000030 +.word 0x1e0a9bf +.word 0x80000030 +.word 0x1e190bc +.word 0x80000030 +.word 0x1e198bd +.word 0x80000030 +.word 0x1e1a04a +.word 0x80000030 +.word 0x1c0425c +.word 0x80000030 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x2ff +.word 0x806573fc +.word 0x2ff +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x81f74b7c +.word 0x1e0a9bf +.word 0x81f84b7c +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x120a0040 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2c800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x2ff +.word 0x80623bfc +.word 0x2ff +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x80000030 +.word 0x1e0a9bf +.word 0x80000030 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x80000030 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5c800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x11079bd +.word 0x806573fc +.word 0x10f80fd +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x5800088d +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x50011846 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x4000002b +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x80000030 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x2ff +.word 0x80623bfc +.word 0x2ff +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x81f74b7c +.word 0x1e0a9bf +.word 0x81f84b7c +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x120a0040 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5c800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x2ff +.word 0x806573fc +.word 0x2ff +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x80000030 +.word 0x1e0a9bf +.word 0x80000030 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x80000030 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2c800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x11079bd +.word 0x80623bfc +.word 0x10f80fd +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x58002055 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x5004181f +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x4000000f +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x3e2d000 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x11079bd +.word 0x80623bfc +.word 0x10f80fd +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x58002032 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x50041810 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d000 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x11079bd +.word 0x806573fc +.word 0x10f80fd +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x5800082a +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x52011fe7 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x40000004 +.word 0x2ff +.word 0x3e2c000 +.word 0x1e0299c +.word 0x4000000f +.word 0x2ff +.word 0x3e5c000 +.word 0x1e0635c +.word 0x3e2d800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x9079bc +.word 0x80623bfc +.word 0x8f80fc +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x5800201e +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x50041810 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x9079bc +.word 0x806573fc +.word 0x8f80fc +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x58000816 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x52011fe7 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x400007c8 +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x400007d3 +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x520a2031 +.word 0x2ff +.word 0x10042080 +.word 0x2ff +.word 0x81f74b7c +.word 0x2ff +.word 0x400007a3 +.word 0x2ff +.word 0x81f84b7c +.word 0x1e1a04a +.word 0x520a0868 +.word 0x2ff +.word 0x10010880 +.word 0x2ff +.word 0x81f74b7c +.word 0x2ff +.word 0x40000775 +.word 0x2ff +.word 0x81f84b7c +.word 0x1e8a20a +.word 0x520a209f +.word 0x2ff +.word 0x10042080 +.word 0x2ff +.word 0x81f74b7c +.word 0x2ff +.word 0x40000799 +.word 0x2ff +.word 0x81f84b7c +.word 0x1e1a04a +.word 0x520a08d6 +.word 0x2ff +.word 0x10010880 +.word 0x2ff +.word 0x81f74b7c +.word 0x2ff +.word 0x4000076b +.word 0x2ff +.word 0x81f84b7c +.word 0x1e8a20a +.word 0x500a27ab +.word 0x2ff +.word 0x10042080 +.word 0x2ff +.word 0x80265bfe +.word 0x1e1a04a +.word 0x81f18b3d +.word 0x1c0425c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x50041902 +.word 0x2ff +.word 0x806453fc +.word 0x2ff +.word 0x4000001c +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x500a0f73 +.word 0x2ff +.word 0x10010880 +.word 0x2ff +.word 0x80265bfe +.word 0x1e8a20a +.word 0x81f18b3d +.word 0x1c0089c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x500118fb +.word 0x2ff +.word 0x80611bfc +.word 0x2ff +.word 0x40000049 +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x80265bfe +.word 0x1e1a04a +.word 0x81f18b3d +.word 0x1c0425c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x500418e6 +.word 0x2ff +.word 0x806453fc +.word 0x2ff +.word 0x3e5d000 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x11079bd +.word 0x806573fc +.word 0x10f80fd +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x9090001 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x500118db +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d000 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x11079bd +.word 0x80623bfc +.word 0x10f80fd +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800ae3fc +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x81f66b7c +.word 0x3eaa5a +.word 0x500418cf +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d000 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x11079bd +.word 0x81ec437c +.word 0x29f243 +.word 0x806573fc +.word 0x10f80fd +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800e77f2 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x800f8bfc +.word 0x3d4a55 +.word 0x500118c3 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d000 +.word 0x1e0299c +.word 0x8024b33c +.word 0x11c0701 +.word 0x802bb33c +.word 0x2ff +.word 0x800a7bf0 +.word 0x2ff +.word 0x52007731 +.word 0x22497d +.word 0x80007efc +.word 0x29497d +.word 0x80000030 +.word 0x400002ff +.word 0x80000030 +.word 0x2ff +.word 0x80265bfe +.word 0x1e8a20a +.word 0x81f18b3d +.word 0x1c0089c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x500118b2 +.word 0x2ff +.word 0x80611bfc +.word 0x2ff +.word 0x3e2d000 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x11079bd +.word 0x80623bfc +.word 0x10f80fd +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x9090001 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x500418a7 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d000 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x11079bd +.word 0x806573fc +.word 0x10f80fd +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800ae3fc +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x81f66b7c +.word 0x3ea89a +.word 0x5001189b +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d000 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x11079bd +.word 0x81e5437c +.word 0x22f083 +.word 0x80623bfc +.word 0x10f80fd +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800e77f2 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x800f8bfc +.word 0x3d1095 +.word 0x5004188f +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d000 +.word 0x1e0635c +.word 0x8024b33c +.word 0x11c0701 +.word 0x802bb33c +.word 0x2ff +.word 0x800a7bf0 +.word 0x2ff +.word 0x520076cc +.word 0x29117d +.word 0x80007efc +.word 0x22117d +.word 0x80000030 +.word 0x400002ff +.word 0x80000030 +.word 0x2ff +.word 0x80265bfe +.word 0x1e1a04a +.word 0x81f18b3d +.word 0x1c0425c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x5004187e +.word 0x2ff +.word 0x806453fc +.word 0x2ff +.word 0x3e5d800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x9079bc +.word 0x806573fc +.word 0x8f80fc +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x9090001 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x50011873 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x9079bc +.word 0x80623bfc +.word 0x8f80fc +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800ae3fc +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x81f66b7c +.word 0x3eaa5a +.word 0x50041867 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x9079bc +.word 0x81ec437c +.word 0x29f243 +.word 0x806573fc +.word 0x8f80fc +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800e77f2 +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x800f8bfc +.word 0x3d4a55 +.word 0x5001185b +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d800 +.word 0x1e0299c +.word 0x8024b33c +.word 0x11c0701 +.word 0x802bb33c +.word 0x2ff +.word 0x800a7bf0 +.word 0x2ff +.word 0x520076b9 +.word 0x22497d +.word 0x80007efc +.word 0x29497d +.word 0x80000030 +.word 0x400002ff +.word 0x80000030 +.word 0x2ff +.word 0x80265bfe +.word 0x1e8a20a +.word 0x81f18b3d +.word 0x1c0089c +.word 0x81f26b7c +.word 0x2ff +.word 0x81f36b7c +.word 0x2ff +.word 0x81f46b7c +.word 0x2ff +.word 0x81f56b7c +.word 0x2ff +.word 0x800b31b0 +.word 0x2ff +.word 0x800c31f0 +.word 0x2ff +.word 0x800c3a30 +.word 0x2ff +.word 0x5001184a +.word 0x2ff +.word 0x80611bfc +.word 0x2ff +.word 0x3e2d800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x2ff +.word 0x81e5437c +.word 0x9079bc +.word 0x80623bfc +.word 0x8f80fc +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x9090001 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x5004183f +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d800 +.word 0x1e0635c +.word 0x81e8337c +.word 0x1d652ea +.word 0x81e103bc +.word 0x2ff +.word 0x81ec437c +.word 0x9079bc +.word 0x806573fc +.word 0x8f80fc +.word 0x81ea3b7c +.word 0x1e913ec +.word 0x3e23001 +.word 0x1c2117d +.word 0x3e22002 +.word 0x1f143a8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800ae3fc +.word 0x1e890bc +.word 0x3e21003 +.word 0x1e898bd +.word 0x81f66b7c +.word 0x3ea89a +.word 0x50011833 +.word 0x1e8a20a +.word 0x80611bfc +.word 0x1c0089c +.word 0x3e2d800 +.word 0x1e0299c +.word 0x81e1337c +.word 0x1d6192a +.word 0x81e803bc +.word 0x9079bc +.word 0x81e5437c +.word 0x22f083 +.word 0x80623bfc +.word 0x8f80fc +.word 0x81e33b7c +.word 0x1e24c2c +.word 0x3e56801 +.word 0x1c9497d +.word 0x3e55802 +.word 0x1f109e8 +.word 0x2c030002 +.word 0x1e0a9bf +.word 0x800e77f2 +.word 0x1e190bc +.word 0x3e54803 +.word 0x1e198bd +.word 0x800f8bfc +.word 0x3d1095 +.word 0x50041827 +.word 0x1e1a04a +.word 0x806453fc +.word 0x1c0425c +.word 0x3e5d800 +.word 0x1e0635c +.word 0x8024b33c +.word 0x11c0701 +.word 0x802bb33c +.word 0x2ff +.word 0x800a7bf0 +.word 0x2ff +.word 0x52007654 +.word 0x29117d +.word 0x80007efc +.word 0x22117d +.word 0x80000030 +.word 0x400002ff +.word 0x80000030 +.word 0x2ff +.word 0x40000793 +.word 0x2ff +.word 0x3e5c000 +.word 0x1e0635c +.word 0x4000079e +.word 0x2ff +.word 0x3e2c000 +.word 0x1e0299c +.word 0x400007aa +.word 0x2ff +.word 0x3e5c000 +.word 0x1e0635c +.word 0x400007b6 +.word 0x2ff +.word 0x3e2c000 +.word 0x1e0299c +.word 0x400007c7 +.word 0x2ff +.word 0x3e2c000 +.word 0x1e0299c +.word 0x400007d2 +.word 0x2ff +.word 0x3e5c000 +.word 0x1e0635c +.word 0x400007de +.word 0x2ff +.word 0x3e2c000 +.word 0x1e0299c +.word 0x400007ea +.word 0x2ff +.word 0x3e5c000 +.word 0x1e0635c +.word 0x4000070b +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x40000716 +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x40000722 +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x4000072e +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x4000073f +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x4000074a +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c +.word 0x40000756 +.word 0x2ff +.word 0x3e2b800 +.word 0x1e0299c +.word 0x40000762 +.word 0x2ff +.word 0x3e5b800 +.word 0x1e0635c \ No newline at end of file