(module (global $cnvs_size (import "global" "cnvs_size") i32) (global $noh_color (import "global" "noh_color") i32) (global $hit_color (import "global" "hit_color") i32) (global $obj_start (import "global" "obj_start") i32) (global $obj_size (import "global" "obj_size") i32) (global $obj_cnt (import "global" "obj_cnt") i32) (global $stride_shift (import "global" "stride_shift") i32) (global $x_offset (import "global" "x_offset") i32) ;; bytes 00-03 (global $y_offset (import "global" "y_offset") i32) ;; bytes 04-07 (global $xv_offset (import "global" "xv_offset") i32) ;; bytes 08-11 (global $yv_offset (import "global" "yv_offset") i32) ;; bytes 12-15 (import "js" "buffer" (memory 80)) ;; canvas buffer (func $blank (local $i i32) (local $pixels i32) get_global $cnvs_size get_global $cnvs_size i32.mul ;; multiply $width and $height i32.const 2 i32.shl ;; multiply by 4 set_local $pixels ;; $pixels = $width * $height (loop $pixel_loop (i64.store (get_local $i) (i64.const 0xff00_0000_ff00_0000)) (i32.add (get_local $i) (i32.const 8)) set_local $i (br_if $pixel_loop (i32.lt_u (get_local $i) (get_local $pixels))) ;; break loop if all pixels set ) ) (func $set_pixel (param $x i32) ;; $var0 (param $y i32) ;; $var1 (param $c i32) ;; $var2 get_local $x get_global $cnvs_size i32.ge_u if return end get_local $y get_global $cnvs_size i32.ge_u if return end get_local $y i32.const 10 i32.shl get_local $x i32.add i32.const 2 i32.shl get_local $c i32.store ) (func $draw_obj (param $x i32) ;; $var0 (param $y i32) ;; $var1 (param $c i32) ;; $var2 (local $max_x i32) ;; $var3 (local $max_y i32) ;; $var4 (local $xi i32) ;; $var5 (local $yi i32) ;; $var6 (local $mem_pos i32) ;; $var7 get_local $x i32.const 0x3ff i32.and tee_local $xi get_global $obj_size i32.add set_local $max_x ;; $max_x = $x + $obj_size get_local $y i32.const 0x3ff i32.and tee_local $yi get_global $obj_size i32.add set_local $max_y ;; $max_x = $x + $obj_size (loop $continue (block $break get_local $xi get_local $yi get_local $c call $set_pixel get_local $xi i32.const 1 i32.add tee_local $xi get_local $max_x i32.ge_u if get_local $x set_local $xi get_local $yi i32.const 1 i32.add tee_local $yi get_local $max_y i32.ge_u br_if $break end br $continue )) ) (func $set_obj_attr (param $obj_number i32) (param $attr_offset i32) (param $value i32) get_local $obj_number i32.const 4 i32.shl get_global $obj_start i32.add get_local $attr_offset i32.add get_local $value i32.store ) (func $collisions (local $i i32) (local $j i32) (local $outer_ptr i32) (local $inner_ptr i32) (local $x1 i32) (local $x2 i32) (local $y1 i32) (local $y2 i32) (local $xdist i32) (local $ydist i32) (local $mem_pos i32) ;; $var10 (local $i_hit i32) (local $xv i32) (local $yv i32) (local $i_start i32) (local $j_start i32) (loop $outer_continue (block $outer_break i32.const 0 tee_local $j ;; setting j to 0 ;; i_hit is a boolean value. 0 for false, 1 for true set_local $i_hit ;; setting i_hit to 0 ;; get x attribute localtion ;; (call $get_obj_attr (get_local $i) (get_global $x_offset)) get_local $i i32.const 4 i32.shl get_global $obj_start i32.add tee_local $i_start get_global $x_offset i32.add i32.load ;; load the pointer above set_local $x1 ;; (call $log (i32.const 6) (get_local $mem_pos) (get_local $i) (get_local $x1)) ;; get x attribute localtion ;; (call $get_obj_attr (get_local $i) (get_global $y_offset)) get_local $i_start get_global $y_offset i32.add i32.load ;; load the pointer above set_local $y1 ;; (call $log (i32.const 7) (get_local $mem_pos) (get_local $i) (get_local $y1)) ;; (call $get_obj_attr (get_local $i) (get_global $xv_offset)) get_local $i_start get_global $xv_offset i32.add i32.load ;; load the pointer above set_local $xv ;; (call $log (i32.const 6) (get_local $mem_pos) (get_local $i) (get_local $xv)) ;; (call $get_obj_attr (get_local $i) (get_global $yv_offset)) get_local $i_start get_global $yv_offset i32.add i32.load ;; load the pointer above set_local $yv ;; (call $log (i32.const 7) (get_local $mem_pos) (get_local $i) (get_local $yv)) (i32.add (get_local $xv) (get_local $x1)) i32.const 0x3ff i32.and set_local $x1 (i32.add (get_local $yv) (get_local $y1)) i32.const 0x3ff i32.and set_local $y1 (call $set_obj_attr (get_local $i) (get_global $x_offset) (get_local $x1) ) (call $set_obj_attr (get_local $i) (get_global $y_offset) (get_local $y1) ) (loop $inner_continue (block $inner_break get_local $i get_local $j i32.eq if get_local $j i32.const 1 i32.add set_local $j end get_local $j get_global $obj_cnt i32.ge_u if br $inner_break end ;; (call $get_obj_attr (get_local $j) (get_global $x_offset)) ;; get x attribute localtion get_local $j i32.const 4 i32.shl get_global $obj_start i32.add tee_local $j_start get_global $x_offset i32.add i32.load ;; load the pointer above set_local $x2 ;; (call $log (i32.const 8) (get_local $mem_pos) (get_local $j) (get_local $x2)) (select (i32.sub (get_local $x1) (get_local $x2)) (i32.sub (get_local $x2) (get_local $x1)) (i32.gt_u (get_local $x1) (get_local $x2)) ) ;; call $abs tee_local $xdist get_global $obj_size i32.ge_u if get_local $j i32.const 1 i32.add set_local $j br $inner_continue end ;; (call $get_obj_attr (get_local $j) (get_global $y_offset)) ;; get x attribute localtion get_local $j_start get_global $y_offset i32.add i32.load ;; load the pointer above set_local $y2 (select (i32.sub (get_local $y1) (get_local $y2)) (i32.sub (get_local $y2) (get_local $y1)) (i32.gt_u (get_local $y1) (get_local $y2)) ) ;; call $abs tee_local $ydist get_global $obj_size i32.ge_u if get_local $j i32.const 1 i32.add set_local $j br $inner_continue end ;; we only want to draw this if this is the last j ;; if j is greater than object count ;; (call $log (i32.const 1) (get_local $i) (get_local $x1) (get_local $y1)) (call $draw_obj (get_local $x1) (get_local $y1) (get_global $hit_color)) i32.const 1 set_local $i_hit )) get_local $i_hit i32.const 0 i32.eq if (call $draw_obj (get_local $x1) (get_local $y1) (get_global $noh_color)) end get_local $i i32.const 1 i32.add tee_local $i get_global $obj_cnt i32.lt_u if br $outer_continue end )) ) (func $main (export "main") (call $blank) (call $collisions) ;; (call $pause) ) )