From 4616f436f120a61b799ffd30dcd05e248f8d479f Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Wed, 1 Sep 2021 21:02:16 -0400 Subject: [PATCH] fix missing bitfield (#811) --- decompiler/IR2/FormExpressionAnalysis.cpp | 19 ++++++++--- decompiler/config/all-types.gc | 4 ++- .../jak1_ntsc_black_label/type_casts.jsonc | 4 --- goal_src/engine/nav/navigate-h.gc | 2 ++ goal_src/levels/common/nav-enemy.gc | 33 ++++++++++++------- goal_src/levels/common/rigid-body.gc | 2 +- goal_src/levels/misty/misty-warehouse.gc | 9 +++-- .../reference/engine/dma/dma-disasm_REF.gc | 2 +- .../reference/engine/gfx/merc/merc_REF.gc | 10 ++++-- .../reference/engine/gfx/vis/bsp_REF.gc | 4 ++- .../reference/kernel/gkernel_REF.gc | 18 +++++----- .../reference/levels/common/nav-enemy_REF.gc | 29 ++++++++++------ .../reference/levels/common/rigid-body_REF.gc | 2 +- .../levels/misty/misty-warehouse_REF.gc | 8 +++-- 14 files changed, 94 insertions(+), 52 deletions(-) diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index 48383f272..337913931 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -1588,12 +1588,21 @@ FormElement* SimpleExpressionElement::update_from_stack_logor_or_logand_helper( bool arg1_int_like = env.dts->ts.tc(TypeSpec("integer"), arg1_type); if ((arg0_int_like) && (arg1_int_like)) { - auto new_form = pool.alloc_element(GenericOperator::make_fixed(kind), - args.at(0), args.at(1)); - return new_form; - // types bad, insert cast. + // we might have a bitfield in arg1. + auto arg1_bitfield = dynamic_cast(env.dts->ts.lookup_type(arg1_type)); + auto arg1_enum = dynamic_cast(env.dts->ts.lookup_type(arg1_type)); + if ((arg1_bitfield || arg1_enum) && arg0_type != arg1_type) { + auto new_form = pool.alloc_element( + GenericOperator::make_fixed(kind), cast_form(args.at(0), arg1_type, pool, env), + args.at(1)); + return new_form; + } else { + auto new_form = pool.alloc_element(GenericOperator::make_fixed(kind), + args.at(0), args.at(1)); + return new_form; + } } - + // types bad, insert cast. auto cast = pool.alloc_single_element_form( nullptr, TypeSpec(arg0_i ? "int" : "uint"), args.at(1)); auto new_form = diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 1452c32e4..f6388a5e2 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -651,7 +651,9 @@ (bit8 8) (bit10 10) ;; TODO - nav-enemy::nav-enemy-patrol-post (bit13 13) + (bit17 17) (bit19 19) ;; TODO - nav-enemy::lambda::17 + (bit21 21) ) (defenum task-status @@ -32632,7 +32634,7 @@ ;; - Functions -(define-extern misty-camera-view (function int :behavior silostep)) +(define-extern misty-camera-view (function handle :behavior silostep)) ;; - Unknowns diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 395c98f65..4008cadb8 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -1886,10 +1886,6 @@ [50, "v1", "vector"] ], - "(method 11 rigid-body-platform)": [ - [5, "v1", "process-mask"] - ], - "(method 22 mud)": [ [35, "v0", "(pointer float)"] ], diff --git a/goal_src/engine/nav/navigate-h.gc b/goal_src/engine/nav/navigate-h.gc index f43e5edd4..5f40be3bf 100644 --- a/goal_src/engine/nav/navigate-h.gc +++ b/goal_src/engine/nav/navigate-h.gc @@ -19,7 +19,9 @@ (bit8 8) (bit10 10) ;; TODO - nav-enemy::nav-enemy-patrol-post (bit13 13) + (bit17 17) (bit19 19) ;; TODO - nav-enemy::lambda::17 + (bit21 21) ) (deftype nav-poly (structure) diff --git a/goal_src/levels/common/nav-enemy.gc b/goal_src/levels/common/nav-enemy.gc index 6e957a783..f5668a8b5 100644 --- a/goal_src/levels/common/nav-enemy.gc +++ b/goal_src/levels/common/nav-enemy.gc @@ -51,7 +51,7 @@ (-> obj initial-velocity) time ) - (+! (-> result y) (* (* (* 0.5 time) time) (-> obj gravity))) + (+! (-> result y) (* 0.5 time time (-> obj gravity))) result ) @@ -454,7 +454,7 @@ nav-enemy-default-event-handler (if (or (logtest? (-> obj nav-enemy-flags) 128) - (logtest? #x80000 (-> obj nav flags)) + (logtest? (nav-control-flags bit19) (-> obj nav flags)) ) (seek-to-point-toward-point! (-> obj collide-info) @@ -531,7 +531,10 @@ nav-enemy-default-event-handler ;; INFO: Return type mismatch int vs none. (defbehavior nav-enemy-patrol-post nav-enemy () (when - (or (logtest? #x80000 (-> self nav flags)) (< 2.0 (-> self nav block-count))) + (or + (logtest? (nav-control-flags bit19) (-> self nav flags)) + (< 2.0 (-> self nav block-count)) + ) (set! (-> self nav block-count) 2.0) (logior! (-> self nav flags) (nav-control-flags bit10)) (nav-enemy-get-new-patrol-point) @@ -543,7 +546,7 @@ nav-enemy-default-event-handler (-> self nav destination-pos) (-> self rotate-speed) ) - (if (logtest? #x200000 (-> self nav flags)) + (if (logtest? (nav-control-flags bit21) (-> self nav flags)) (logclear! (-> self nav flags) (nav-control-flags bit10)) ) (nav-enemy-travel-post) @@ -1194,7 +1197,10 @@ nav-enemy-default-event-handler ) (set! (-> self nav flags) - (the-as nav-control-flags (the-as int (logior #x80000 (-> self nav flags)))) + (the-as + nav-control-flags + (the-as int (logior (nav-control-flags bit19) (-> self nav flags))) + ) ) (set! (-> self nav-enemy-flags) (logand -5 (-> self nav-enemy-flags))) (logior! (-> self nav-enemy-flags) 8) @@ -1890,7 +1896,7 @@ nav-enemy-default-event-handler (go-virtual nav-enemy-stop-chase) ) (cond - ((logtest? #x20000 (-> self nav flags)) + ((logtest? (nav-control-flags bit17) (-> self nav flags)) (if (>= (- (-> *display* base-frame-counter) (-> self free-time)) 300) (go-virtual nav-enemy-patrol) ) @@ -2005,7 +2011,7 @@ nav-enemy-default-event-handler ) ) ) - (logtest? #x20000 (-> self nav flags)) + (logtest? (nav-control-flags bit17) (-> self nav flags)) (>= (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) (-> self state-timeout) @@ -2164,7 +2170,7 @@ nav-enemy-default-event-handler ) ) ) - (logtest? #x20000 (-> self nav flags)) + (logtest? (nav-control-flags bit17) (-> self nav flags)) ) (go-virtual nav-enemy-give-up) ) @@ -2815,7 +2821,7 @@ nav-enemy-default-event-handler (if (or (logtest? (-> self nav-enemy-flags) 128) - (logtest? #x80000 (-> self nav flags)) + (logtest? (nav-control-flags bit19) (-> self nav flags)) ) (seek-to-point-toward-point! (-> self collide-info) @@ -2880,7 +2886,7 @@ nav-enemy-default-event-handler (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) 150 ) - (logtest? #x80000 (-> self nav flags)) + (logtest? (nav-control-flags bit19) (-> self nav flags)) ) (go-virtual nav-enemy-chase) ) @@ -3105,7 +3111,10 @@ nav-enemy-default-event-handler (defmethod TODO-RENAME-45 nav-enemy ((obj nav-enemy) (arg0 nav-enemy-info)) (set! (-> obj rand-gen) (new 'process 'random-generator)) (set! (-> obj rand-gen seed) (the-as uint #x666edd1e)) - (set! (-> obj mask) (the-as process-mask (logior #x20000 (-> obj mask)))) + (set! + (-> obj mask) + (the-as process-mask (logior (process-mask enemy) (-> obj mask))) + ) (TODO-RENAME-49 obj arg0) (if (-> obj draw shadow) (set! @@ -3273,4 +3282,4 @@ nav-enemy-default-event-handler ) ) #f - ) \ No newline at end of file + ) diff --git a/goal_src/levels/common/rigid-body.gc b/goal_src/levels/common/rigid-body.gc index 6914307c6..35d4aa040 100644 --- a/goal_src/levels/common/rigid-body.gc +++ b/goal_src/levels/common/rigid-body.gc @@ -1196,7 +1196,7 @@ copy-defaults! rigid-body-platform ((obj rigid-body-platform) (arg0 res-lump)) - (set! (-> obj mask) (the-as process-mask (logior #x80000 (-> obj mask)))) + (set! (-> obj mask) (logior (process-mask platform) (-> obj mask))) (TODO-RENAME-30 obj) (process-drawable-from-entity! obj arg0) (TODO-RENAME-31 obj) diff --git a/goal_src/levels/misty/misty-warehouse.gc b/goal_src/levels/misty/misty-warehouse.gc index b149dabbe..2cbd78041 100644 --- a/goal_src/levels/misty/misty-warehouse.gc +++ b/goal_src/levels/misty/misty-warehouse.gc @@ -24,7 +24,6 @@ (define-extern silostep-idle (state silostep)) (define-extern silostep-camera (state silostep)) - ;; failed to figure out what this is: (let ((v1-1 @@ -80,6 +79,7 @@ ) ;; definition for function misty-camera-view +;; INFO: Return type mismatch int vs handle. (defbehavior misty-camera-view silostep () (let* ((gp-0 (get-process *default-dead-pool* camera-tracker #x4000)) (v1-1 (when gp-0 @@ -119,11 +119,14 @@ ) ) (v0-3 - (logior (shl (-> v1-1 0 pid) 32) (new 'static 'handle :process v1-1)) + (logior + (new 'static 'handle :pid (-> v1-1 0 pid)) + (new 'static 'handle :process v1-1) + ) ) ) (set! (-> self cam-tracker) (the-as uint v0-3)) - v0-3 + (the-as handle v0-3) ) ) diff --git a/test/decompiler/reference/engine/dma/dma-disasm_REF.gc b/test/decompiler/reference/engine/dma/dma-disasm_REF.gc index 3415a03d7..c42c00c5b 100644 --- a/test/decompiler/reference/engine/dma/dma-disasm_REF.gc +++ b/test/decompiler/reference/engine/dma/dma-disasm_REF.gc @@ -680,7 +680,7 @@ (format stream-2 "ERROR: dma-list data pointer invalid~%") (set! end-condition 'error) ) - (when (logtest? #x3ff0000 current-tag) + (when (logtest? (the-as dma-tag #x3ff0000) current-tag) (format stream-2 "ERROR: dma tag has data in reserved bits ~X~%") (set! end-condition 'error) ) diff --git a/test/decompiler/reference/engine/gfx/merc/merc_REF.gc b/test/decompiler/reference/engine/gfx/merc/merc_REF.gc index b98ca7d9b..a910383f2 100644 --- a/test/decompiler/reference/engine/gfx/merc/merc_REF.gc +++ b/test/decompiler/reference/engine/gfx/merc/merc_REF.gc @@ -25,7 +25,10 @@ ) (dotimes (s2-0 (the-as int (-> fp-data shader-cnt))) (cond - ((and eye-ctrl (= (logand -256 (-> shader texture-id)) #x1cf06f00)) + ((and + eye-ctrl + (= (logand (the-as texture-id -256) (-> shader texture-id)) #x1cf06f00) + ) (adgif-shader-login shader) (let ((eye-tex-block (get-eye-block (-> eye-ctrl eye-slot) 0))) (set! (-> shader tex0 tbp0) eye-tex-block) @@ -46,7 +49,10 @@ ) ) ) - ((and eye-ctrl (= (logand -256 (-> shader texture-id)) #x1cf07000)) + ((and + eye-ctrl + (= (logand (the-as texture-id -256) (-> shader texture-id)) #x1cf07000) + ) (adgif-shader-login shader) (let ((eye-tex-block-2 (get-eye-block (-> eye-ctrl eye-slot) 1))) (set! (-> shader tex0 tbp0) eye-tex-block-2) diff --git a/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc b/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc index fd99a743c..3e6a9ab08 100644 --- a/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc +++ b/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc @@ -589,7 +589,9 @@ (table-data-start (-> bsp-hdr texture-remap-table)) (table-data-ptr table-data-start) (mask1 (the-as uint #xfffffff8)) - (masked-tex-id (logand (the-as uint #xffffff00) tex-id)) + (masked-tex-id + (logand (new 'static 'texture-id :index #xfff :page #xfff) tex-id) + ) (table-data-end (&+ table-data-ptr (* table-size 8))) ) (label cfg-2) diff --git a/test/decompiler/reference/kernel/gkernel_REF.gc b/test/decompiler/reference/kernel/gkernel_REF.gc index 60368302e..dda88472f 100644 --- a/test/decompiler/reference/kernel/gkernel_REF.gc +++ b/test/decompiler/reference/kernel/gkernel_REF.gc @@ -203,31 +203,31 @@ ;; definition (debug) for function stream<-process-mask (defun-debug stream<-process-mask ((arg0 object) (arg1 process-mask)) (let ((s4-0 arg1)) - (if (= (logand #x1000000 s4-0) (process-mask death)) + (if (= (logand (process-mask death) s4-0) (process-mask death)) (format arg0 "death ") ) - (if (= (logand #x800000 s4-0) (process-mask attackable)) + (if (= (logand (process-mask attackable) s4-0) (process-mask attackable)) (format arg0 "attackable ") ) - (if (= (logand #x400000 s4-0) (process-mask projectile)) + (if (= (logand (process-mask projectile) s4-0) (process-mask projectile)) (format arg0 "projectile ") ) - (if (= (logand #x200000 s4-0) (process-mask entity)) + (if (= (logand (process-mask entity) s4-0) (process-mask entity)) (format arg0 "entity ") ) - (if (= (logand #x100000 s4-0) (process-mask ambient)) + (if (= (logand (process-mask ambient) s4-0) (process-mask ambient)) (format arg0 "ambient ") ) - (if (= (logand #x80000 s4-0) (process-mask platform)) + (if (= (logand (process-mask platform) s4-0) (process-mask platform)) (format arg0 "platform ") ) - (if (= (logand #x40000 s4-0) (process-mask camera)) + (if (= (logand (process-mask camera) s4-0) (process-mask camera)) (format arg0 "camera ") ) - (if (= (logand #x20000 s4-0) (process-mask enemy)) + (if (= (logand (process-mask enemy) s4-0) (process-mask enemy)) (format arg0 "enemy ") ) - (if (= (logand #x10000 s4-0) (process-mask collectable)) + (if (= (logand (process-mask collectable) s4-0) (process-mask collectable)) (format arg0 "collectable ") ) (if (= (logand s4-0 (process-mask crate)) (process-mask crate)) diff --git a/test/decompiler/reference/levels/common/nav-enemy_REF.gc b/test/decompiler/reference/levels/common/nav-enemy_REF.gc index e5952be64..de69fbf7f 100644 --- a/test/decompiler/reference/levels/common/nav-enemy_REF.gc +++ b/test/decompiler/reference/levels/common/nav-enemy_REF.gc @@ -450,7 +450,7 @@ nav-enemy-default-event-handler (if (or (logtest? (-> obj nav-enemy-flags) 128) - (logtest? #x80000 (-> obj nav flags)) + (logtest? (nav-control-flags bit19) (-> obj nav flags)) ) (seek-to-point-toward-point! (-> obj collide-info) @@ -527,7 +527,10 @@ nav-enemy-default-event-handler ;; INFO: Return type mismatch int vs none. (defbehavior nav-enemy-patrol-post nav-enemy () (when - (or (logtest? #x80000 (-> self nav flags)) (< 2.0 (-> self nav block-count))) + (or + (logtest? (nav-control-flags bit19) (-> self nav flags)) + (< 2.0 (-> self nav block-count)) + ) (set! (-> self nav block-count) 2.0) (logior! (-> self nav flags) (nav-control-flags bit10)) (nav-enemy-get-new-patrol-point) @@ -539,7 +542,7 @@ nav-enemy-default-event-handler (-> self nav destination-pos) (-> self rotate-speed) ) - (if (logtest? #x200000 (-> self nav flags)) + (if (logtest? (nav-control-flags bit21) (-> self nav flags)) (logclear! (-> self nav flags) (nav-control-flags bit10)) ) (nav-enemy-travel-post) @@ -1190,7 +1193,10 @@ nav-enemy-default-event-handler ) (set! (-> self nav flags) - (the-as nav-control-flags (the-as int (logior #x80000 (-> self nav flags)))) + (the-as + nav-control-flags + (the-as int (logior (nav-control-flags bit19) (-> self nav flags))) + ) ) (set! (-> self nav-enemy-flags) (logand -5 (-> self nav-enemy-flags))) (logior! (-> self nav-enemy-flags) 8) @@ -1886,7 +1892,7 @@ nav-enemy-default-event-handler (go-virtual nav-enemy-stop-chase) ) (cond - ((logtest? #x20000 (-> self nav flags)) + ((logtest? (nav-control-flags bit17) (-> self nav flags)) (if (>= (- (-> *display* base-frame-counter) (-> self free-time)) 300) (go-virtual nav-enemy-patrol) ) @@ -2001,7 +2007,7 @@ nav-enemy-default-event-handler ) ) ) - (logtest? #x20000 (-> self nav flags)) + (logtest? (nav-control-flags bit17) (-> self nav flags)) (>= (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) (-> self state-timeout) @@ -2160,7 +2166,7 @@ nav-enemy-default-event-handler ) ) ) - (logtest? #x20000 (-> self nav flags)) + (logtest? (nav-control-flags bit17) (-> self nav flags)) ) (go-virtual nav-enemy-give-up) ) @@ -2811,7 +2817,7 @@ nav-enemy-default-event-handler (if (or (logtest? (-> self nav-enemy-flags) 128) - (logtest? #x80000 (-> self nav flags)) + (logtest? (nav-control-flags bit19) (-> self nav flags)) ) (seek-to-point-toward-point! (-> self collide-info) @@ -2876,7 +2882,7 @@ nav-enemy-default-event-handler (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) 150 ) - (logtest? #x80000 (-> self nav flags)) + (logtest? (nav-control-flags bit19) (-> self nav flags)) ) (go-virtual nav-enemy-chase) ) @@ -3101,7 +3107,10 @@ nav-enemy-default-event-handler (defmethod TODO-RENAME-45 nav-enemy ((obj nav-enemy) (arg0 nav-enemy-info)) (set! (-> obj rand-gen) (new 'process 'random-generator)) (set! (-> obj rand-gen seed) (the-as uint #x666edd1e)) - (set! (-> obj mask) (the-as process-mask (logior #x20000 (-> obj mask)))) + (set! + (-> obj mask) + (the-as process-mask (logior (process-mask enemy) (-> obj mask))) + ) (TODO-RENAME-49 obj arg0) (if (-> obj draw shadow) (set! diff --git a/test/decompiler/reference/levels/common/rigid-body_REF.gc b/test/decompiler/reference/levels/common/rigid-body_REF.gc index 63fbb8698..f42b626f0 100644 --- a/test/decompiler/reference/levels/common/rigid-body_REF.gc +++ b/test/decompiler/reference/levels/common/rigid-body_REF.gc @@ -1191,7 +1191,7 @@ copy-defaults! rigid-body-platform ((obj rigid-body-platform) (arg0 res-lump)) - (set! (-> obj mask) (the-as process-mask (logior #x80000 (-> obj mask)))) + (set! (-> obj mask) (logior (process-mask platform) (-> obj mask))) (TODO-RENAME-30 obj) (process-drawable-from-entity! obj arg0) (TODO-RENAME-31 obj) diff --git a/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc b/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc index 86a003c94..57bf2a44e 100644 --- a/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc +++ b/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc @@ -77,6 +77,7 @@ ) ;; definition for function misty-camera-view +;; INFO: Return type mismatch int vs handle. (defbehavior misty-camera-view silostep () (let* ((gp-0 (get-process *default-dead-pool* camera-tracker #x4000)) (v1-1 (when gp-0 @@ -116,11 +117,14 @@ ) ) (v0-3 - (logior (shl (-> v1-1 0 pid) 32) (new 'static 'handle :process v1-1)) + (logior + (new 'static 'handle :pid (-> v1-1 0 pid)) + (new 'static 'handle :process v1-1) + ) ) ) (set! (-> self cam-tracker) (the-as uint v0-3)) - v0-3 + (the-as handle v0-3) ) )