From 888ffce8596ea826a3e7473d2bcb5c70d13d5f7e Mon Sep 17 00:00:00 2001 From: Ed_ Date: Tue, 4 Aug 2026 16:49:02 -0400 Subject: [PATCH] Finished: Pikuma Linking multiple files (not applying to codebase only watched) --- code/hello_gte/hello_gte.tape.c | 6 +- code/hello_joypad/gen/hello_joypad.offsets.h | 4 +- code/hello_joypad/hello_joypad.c | 8 +-- code/hello_joypad/hello_joypad.h | 6 +- code/hello_joypad/hello_joypad.tape.c | 67 ++------------------ scripts/duffle.lua | 3 + 6 files changed, 20 insertions(+), 74 deletions(-) diff --git a/code/hello_gte/hello_gte.tape.c b/code/hello_gte/hello_gte.tape.c index 6a69826..e10d6ec 100644 --- a/code/hello_gte/hello_gte.tape.c +++ b/code/hello_gte/hello_gte.tape.c @@ -125,9 +125,9 @@ MipsAtom_(cube_g4_face) atom_info(atom_phase(cube_g4), gte_cmdw_avg_sort_z4, gte_mv_from_data_r(R_T1, C2_OTZ), - add_ui( R_AT, R_0, OrderingTbl_Len), - set_lt_u( R_AT, R_T1, R_AT), + add_ui( R_AT, R_0, OrderingTbl_Len), + set_lt_u( R_AT, R_T1, R_AT), branch_equal(R_AT, R_0, atom_offset(bounds_chk, cube_g4_face_exit)), nop, mac_insert_ot_tag_g4(), mac_format_g4_color( @@ -184,7 +184,7 @@ MipsAtom_(floor_f3_face) atom_info(atom_phase(floor_f3) /* Calculate Depth */ gte_avg_sort_z3, gte_mv_from_data_r(R_T1, C2_OTZ), - /* Bounds Check OTZ < 2048 (Branch forward to skip insertion) */ + /* Bounds Check OTZ < OrderingTbl_Len (Branch forward to skip insertion) */ add_ui( R_AT, R_0, OrderingTbl_Len), set_lt_u( R_AT, R_T1, R_AT), branch_equal(R_AT, R_0, atom_offset(bounds_chk, floor_f3_face_exit)), nop, diff --git a/code/hello_joypad/gen/hello_joypad.offsets.h b/code/hello_joypad/gen/hello_joypad.offsets.h index 359b63f..44a9c6c 100644 --- a/code/hello_joypad/gen/hello_joypad.offsets.h +++ b/code/hello_joypad/gen/hello_joypad.offsets.h @@ -5,9 +5,9 @@ #pragma region hello_joypad.tape -// --- atom: cube_g4_face (77 words) --- +// --- atom: cube_g4_face (76 words) --- -#define _atom_offset_cull_cube_g4_face_exit 42 +#define _atom_offset_cull_cube_g4_face_exit 41 #define _atom_offset_bounds_chk_cube_g4_face_exit 24 enum { diff --git a/code/hello_joypad/hello_joypad.c b/code/hello_joypad/hello_joypad.c index dd94764..666c182 100644 --- a/code/hello_joypad/hello_joypad.c +++ b/code/hello_joypad/hello_joypad.c @@ -111,13 +111,13 @@ enum { MemTape_Len = 512, }; typedef Struct_(SMemory) { - U4 MemTape[MemTape_Len]; - - DoubleBuffer screen_buf; - A2_OrderingTable_Buffer ordering_tbl; PrimitiveArena primitives; + A2_OrderingTable_Buffer ordering_tbl; + DoubleBuffer screen_buf; S4 active_buf_id; + U4 MemTape[MemTape_Len]; + M3_S2 tform_world; Ent_Cube cube; diff --git a/code/hello_joypad/hello_joypad.h b/code/hello_joypad/hello_joypad.h index 4b24989..d44e6be 100644 --- a/code/hello_joypad/hello_joypad.h +++ b/code/hello_joypad/hello_joypad.h @@ -7,8 +7,10 @@ #endif enum { - PrimitiveBuff_Len = 4096, - OrderingTbl_Len = 2048 + // PrimitiveBuff_Len = 4096, + // OrderingTbl_Len = 2048, + PrimitiveBuff_Len = 131072, + OrderingTbl_Len = 8192, }; enum { diff --git a/code/hello_joypad/hello_joypad.tape.c b/code/hello_joypad/hello_joypad.tape.c index 929a4db..a86c4d3 100644 --- a/code/hello_joypad/hello_joypad.tape.c +++ b/code/hello_joypad/hello_joypad.tape.c @@ -114,68 +114,6 @@ MipsAtomComp_Proc_(ac_put_draw_env, { #pragma region Baked Atoms -/* DIAGNOSTIC 1: Pure tape loop test */ -internal MipsAtom_(diag_yield) { mac_yield() }; - -/* DIAGNOSTIC 2: Pure memory test (No GTE). Draws a fixed cyan triangle. */ -internal MipsAtom_(diag_color) { - store_word( R_0, R_T7, 0), - load_upper_i(R_AT, gp0_cmd_poly_f3 << 8 | 0xFF), /* High: MipsCode Poly_F3(0x20) + Color B:FF */ - or_i_self( R_AT, 0xFF00), /* Low: Color G:FF, R:00 (Cyan) */ - store_word( R_AT, R_T7, 4), - - /* Fake coordinates - Swapped winding order to prevent GPU culling! */ - load_upper_i(R_AT, 0x0010), or_i_self(R_AT, 0x0010), store_word(R_AT, R_T7, 8), /* (16, 16) */ - load_upper_i(R_AT, 0x0050), or_i_self(R_AT, 0x0010), store_word(R_AT, R_T7, 12), /* (80, 16) */ - load_upper_i(R_AT, 0x0010), or_i_self(R_AT, 0x0050), store_word(R_AT, R_T7, 16), /* (16, 80) */ - - add_ui( R_T1, R_0, 10), - shift_lleft_self(R_T1, S_(U4)/2), - add_u_self( R_T1, R_T6), - - load_word( R_AT, R_T1, 0), - load_upper_i(R_V0, (S_(Poly_F3)/S_(U4) - S_(PolyTag)/S_(U4)) << PolyTag_len_bits), - store_word( R_AT, R_T7, 0), - shift_lleft(R_AT, R_T7, S_(PolyTag_len_bits)), shift_lright(R_AT, R_AT, S_(PolyTag_len_bits)), - or_u_self( R_AT, R_V0), - store_word( R_AT, R_T1, 0), - - add_ui(R_T7, R_T7, 20), - - mac_yield() -}; - -/* DIAGNOSTIC 3: Pure GTE test (No Memory Writes) */ -internal MipsAtom_(diag_gte) { - /* Load 3 indices */ - load_half_u(R_T0, R_T4, 0), - load_half_u(R_T1, R_T4, 2), - load_half_u(R_T2, R_T4, 4), - - /* Load Vertices into GTE */ - shift_lleft( R_AT, R_T0, 3), add_u( R_AT, R_AT, R_T5), - load_word(R_V0, R_AT, 0), load_word(R_V1, R_AT, 4), - gte_mv_to_data_r(R_V0, C2_VXY0), gte_mv_to_data_r(R_V1, C2_VZ0), - - shift_lleft( R_AT, R_T1, 3), add_u(R_AT, R_AT, R_T5), - load_word(R_V0, R_AT, 0), load_word(R_V1, R_AT, 4), - gte_mv_to_data_r(R_V0, C2_VXY1), gte_mv_to_data_r(R_V1, C2_VZ1), - - shift_lleft(R_AT, R_T2, 3), add_u(R_AT, R_AT, R_T5), - load_word(R_V0, R_AT, 0), load_word(R_V1, R_AT, 4), - gte_mv_to_data_r(R_V0, C2_VXY2), gte_mv_to_data_r(R_V1, C2_VZ2), - - /* Run Math */ - nop2, gte_cmdw_rtpt, - nop2, gte_cmdw_nclip, - nop2, - - /* Advance Face Cursor and Yield */ - add_ui(R_T4, R_T4, 8), - - mac_yield() -}; - enum { R_ScreenX = R_T5 atom_reg atom_type(U2), R_ScreenY = R_T6 atom_reg atom_type(U2), @@ -299,7 +237,10 @@ MipsAtom_(cube_g4_face) atom_info(atom_phase(cube_g4), gte_cmdw_nclip, gte_mv_from_data_r(R_T0, C2_MAC0), nop, - branch_le_zero(R_T0, atom_offset(cull, cube_g4_face_exit)), nop, + branch_le_zero(R_T0, atom_offset(cull, cube_g4_face_exit)), + /* BD-slot: write the prim tag (R_0=0; overwrites the legacy tag word in the prim_buffer). + * If branch IS taken (face culled), the body is skipped and this 0-tag is stranded — harmless + * because the OT entry that points to this prim is created later, only on the body path. */ store_word(R_0, R_PrimCursor, O_(Poly_G4, tag)), shift_lleft(R_AT, R_T3, v3s2_byteoff), add_u(R_AT, R_AT, R_VertBase), load_word(R_V0, R_AT, O_(V3_S2, x)), load_word(R_V1, R_AT, O_(V3_S2, z)), diff --git a/scripts/duffle.lua b/scripts/duffle.lua index b0b4857..35d925a 100644 --- a/scripts/duffle.lua +++ b/scripts/duffle.lua @@ -1503,6 +1503,9 @@ M.INSTRUCTION_LATENCY = { ["branch_equal"] = 2, ["branch_ne"] = 2, ["branch_le_zero"] = 2, ["branch_lt_zero"] = 2, ["branch_ge_zero"] = 2, ["branch_gt_zero"] = 2, + -- `jump_rel(off)` is the within-atom-safe unconditional-jump alias for `branch_equal(R_0, R_0, off)` (see `code/duffle/mips.h`). + -- Same cost as the underlying branch (1 instruction + 1 mandatory BD-slot nop = 2 cycles). + ["jump_rel"] = 2, -- Jumps (jump + BD slot nop = 2 cycles) ["jump"] = 2, ["jump_reg"] = 2, ["jump_link"] = 2, ["call_reg"] = 2,