#ifdef INTELLISENSE_DIRECTIVES #pragma once #endif // Auto-generated by ps1_meta.lua — DO NOT EDIT // Directory: C:\projects\Pikuma\ps1\code\duffle/ // source: C:\projects\Pikuma\ps1\code\duffle\word_count.metadata.h // source: C:\projects\Pikuma\ps1\code\duffle\dsl.h // source: C:\projects\Pikuma\ps1\code\duffle\memory.h // source: C:\projects\Pikuma\ps1\code\duffle\math.h // source: C:\projects\Pikuma\ps1\code\duffle\gcc_asm.h // source: C:\projects\Pikuma\ps1\code\duffle\mips.h // source: C:\projects\Pikuma\ps1\code\duffle\gp.h // source: C:\projects\Pikuma\ps1\code\duffle\gte.h // source: C:\projects\Pikuma\ps1\code\duffle\pad.h // source: C:\projects\Pikuma\ps1\code\duffle\dsl.atom.h // source: C:\projects\Pikuma\ps1\code\duffle\lottes_tape.h // source: C:\projects\Pikuma\ps1\code\duffle\bios.h // source: C:\projects\Pikuma\ps1\code\duffle\psyq.h // source: C:\projects\Pikuma\ps1\code\duffle\pad.c // source: C:\projects\Pikuma\ps1\code\duffle\math.atom.h // source: C:\projects\Pikuma\ps1\code\duffle\mips.atom.c // source: C:\projects\Pikuma\ps1\code\duffle\gte.atom.h // source: C:\projects\Pikuma\ps1\code\duffle\gp.atom.c // source: C:\projects\Pikuma\ps1\code\duffle\pad.atom.c // source: C:\projects\Pikuma\ps1\code\duffle\psyq.atom.c // Component atoms (MipsAtomComp_(ac_*)) -> macro variants (mac_*) #ifndef WORD_COUNT #define WORD_COUNT(name, count) enum { words_##name = (count) }; #endif /* atom_dbg_skip */ /* --------------------------------------------------------------------------- * MACRO ATOM Components (Reusable Assembly Components) * These do NOT yield. They are expanded inline inside Tape Atoms. * ---------------------------------------------------------------------------*/ // The 'Yield' sequence for Tape Atoms (mac_yield). #define mac_yield(...) \ load_word(R_AtomJmp, R_TapePtr, 0) \ LdSlot_ \ , add_ui_self( R_TapePtr, S_(MipsCode)) \ , jump_reg( R_AtomJmp) \ , BdSlot_ nop WORD_COUNT(mac_yield, 4) /* atom_dbg_skip */ #define mac_yield_load(...) \ load_word(R_AtomJmp, R_TapePtr, 0) WORD_COUNT(mac_yield_load, 1) /* atom_dbg_skip */ #define mac_yield_tail(...) \ add_ui_self(R_TapePtr, S_(MipsCode)) \ , jump_reg( R_AtomJmp) \ , BdSlot_ nop WORD_COUNT(mac_yield_tail, 3) /* atom_dbg_skip */ #define mac_load_half_v3(tx, ty, tz, base, offset) \ load_half(tx, base, offset + OA_(U2,[0])) \ , load_half(ty, base, offset + OA_(U2,[1])) \ , load_half(tz, base, offset + OA_(U2,[2])) WORD_COUNT(mac_load_half_v3, 3) #define mac_load_v3s2(transfer, base, offset) \ mac_load_half_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_load_v3s2, 3) /* atom_dbg_skip */ #define mac_load_v2s2(rs_x, rs_y, r_base, offset) \ load_half(rs_x, r_base, offset + O_(V3_S2,x)) \ , load_half(rs_y, r_base, offset + O_(V3_S2,y)) WORD_COUNT(mac_load_v2s2, 2) /* atom_dbg_skip */ #define mac_store_v2s2(rt_x, rt_y, base, offset) \ store_half(rt_x, base, offset + O_(V2_S2,x)) \ , store_half(rt_y, base, offset + O_(V2_S2,y)) WORD_COUNT(mac_store_v2s2, 2) /* atom_dbg_skip */ #define mac_load_word_v3(tx, ty, tz, base, offset) \ load_word(tx, base, offset + OA_(U4,[0])) \ , load_word(ty, base, offset + OA_(U4,[1])) \ , load_word(tz, base, offset + OA_(U4,[2])) WORD_COUNT(mac_load_word_v3, 3) #define mac_load_v3s4(transfer, base, offset) \ mac_load_word_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_load_v3s4, 3) #define mac_load_p3s4(transfer, base, offset) \ mac_load_word_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_load_p3s4, 3) /* atom_dbg_skip */ #define mac_store_half_v3(tx, ty, tz, base, offset) \ store_half(tx, base, offset + OA_(U2,[0])) \ , store_half(ty, base, offset + OA_(U2,[1])) \ , store_half(tz, base, offset + OA_(U2,[2])) WORD_COUNT(mac_store_half_v3, 3) #define mac_store_v3s2(transfer, base, offset) \ mac_store_half_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_store_v3s2, 3) /* atom_dbg_skip */ #define mac_store_word_v3(tx, ty, tz, base, offset) \ store_word(tx, base, offset + OA_(U4,[0])) \ , store_word(ty, base, offset + OA_(U4,[1])) \ , store_word(tz, base, offset + OA_(U4,[2])) WORD_COUNT(mac_store_word_v3, 3) #define mac_store_v3s4(transfer, base, offset) \ mac_store_word_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_store_v3s4, 3) #define mac_store_p3s4(transfer, base, offset) \ mac_store_word_v3(transfer.x, transfer.y, transfer.z, base, offset) WORD_COUNT(mac_store_p3s4, 3) /* atom_dbg_skip */ #define mac_add_si_v3s4(rt_x, rt_y, rt_z, base, offset) \ add_si(rt_x, base, O_(V3_S4,x)) \ , add_si(rt_y, base, O_(V3_S4,y)) \ , add_si(rt_z, base, O_(V3_S4,z)) WORD_COUNT(mac_add_si_v3s4, 3) /* atom_dbg_skip */ #define mac_sub_s_v3(dx, dy, dz, sx, sy, sz, tx, ty, tz) \ sub_s(dx, sx, tx) \ , sub_s(dy, sy, ty) \ , sub_s(dz, sz, tz) WORD_COUNT(mac_sub_s_v3, 3) #define mac_sub_v3s4(d, s, t) \ mac_sub_s_v3(d.x, d.y, d.z, s.x, s.y, s.z, t.x, t.y, t.z) WORD_COUNT(mac_sub_v3s4, 3) /* atom_dbg_skip */ #define mac_sub_s_v3_self(ds_x, ds_y, ds_z, tx, ty, tz) \ sub_s(ds_x, ds_x, tx) \ , sub_s(ds_y, ds_y, ty) \ , sub_s(ds_z, ds_z, tz) WORD_COUNT(mac_sub_s_v3_self, 3) #define mac_sub_v3s4_self(ds, t) \ mac_sub_s_v3_self(ds.x, ds.y, ds.z, t.x, t.y, t.z) WORD_COUNT(mac_sub_v3s4_self, 3) /* atom_dbg_skip */ #define mac_store_rects2(rt_x, rt_y, rt_width, rt_height, base, offset) \ store_half(rt_x, base, offset + O_(Rect_S2,x)) \ , store_half(rt_y, base, offset + O_(Rect_S2,y)) \ , store_half(rt_width, base, offset + O_(Rect_S2,width)) \ , store_half(rt_height, base, offset + O_(Rect_S2,height)) WORD_COUNT(mac_store_rects2, 4) /* atom_dbg_skip */ #define mac_load_word_imm(dst, imm) \ load_upper_i(dst, u4_hi(imm)) \ , or_i_self( dst, u4_lo(imm)) WORD_COUNT(mac_load_word_imm, 2) #define mac_shift_aright_v3_self(dt_x, dt_y, dt_z, shift_amount) \ shift_aright(dt_x, dt_x, shift_amount) \ , shift_aright(dt_y, dt_y, shift_amount) \ , shift_aright(dt_z, dt_z, shift_amount) WORD_COUNT(mac_shift_aright_v3_self, 3) #define mac_shift_aright_v3s4_self(dt, shift) \ mac_shift_aright_v3_self(dt.x, dt.y, dt.z, shift) WORD_COUNT(mac_shift_aright_v3s4_self, 3) #define mac_shift_aright_var_v3(rd_v0, rd_v1, rd_v2, rs_v0, rs_v1, rs_v2, r_shift) \ shift_aright_var(rd_v0, rs_v0, r_shift) \ , shift_aright_var(rd_v1, rs_v1, r_shift) \ , shift_aright_var(rd_v2, rs_v2, r_shift) WORD_COUNT(mac_shift_aright_var_v3, 3) /* atom_dbg_skip */ #define mac_shift_aright_var_v3_self(rds_v0, rds_v1, rds_v2, r_shift) \ shift_aright_var(rds_v0, rds_v0, r_shift) \ , shift_aright_var(rds_v1, rds_v1, r_shift) \ , shift_aright_var(rds_v2, rds_v2, r_shift) WORD_COUNT(mac_shift_aright_var_v3_self, 3) #define mac_shift_aright_var_v3s4_self(ds, shift) \ mac_shift_aright_var_v3_self(ds.x, ds.y, ds.z, shift) WORD_COUNT(mac_shift_aright_var_v3s4_self, 3) /* atom_dbg_skip */ #define mac_load_tri_indices(r_face_cusor, r_i0, r_i1, r_i2) \ load_half_u(r_i0, r_face_cusor, 0 * S_(S2)) \ , load_half_u(r_i1, r_face_cusor, 1 * S_(S2)) \ , load_half_u(r_i2, r_face_cusor, 2 * S_(S2)) WORD_COUNT(mac_load_tri_indices, 3) #define mac_gte_mv_to_cr_diag_v3s4(v) \ gte_mv_to_ctrl_r(v.y, gte_cr_RT13) \ , gte_mv_to_ctrl_r(v.z, gte_cr_RT22) \ , gte_mv_to_ctrl_r(v.x, gte_cr_RT11) WORD_COUNT(mac_gte_mv_to_cr_diag_v3s4, 3) #define mac_gte_ld_ir123_v3s4(v) \ gte_mv_to_data_r(v.x, C2_IR1) \ , gte_mv_to_data_r(v.y, C2_IR2) \ , gte_mv_to_data_r(v.z, C2_IR3) WORD_COUNT(mac_gte_ld_ir123_v3s4, 3) /* atom_dbg_skip */ #define mac_gte_op_cross_v3s4(a, b) \ mac_gte_mv_to_cr_diag_v3s4(a) \ GteDelay_ /* RT diagonal: D1 = a.x, D2 = a.y, D3 = a.z */ \ , mac_gte_ld_ir123_v3s4(b) \ GteDelay_ /* IR: second operand (b.xyz) */ \ , gte_cmdw_cross /* OP: MAC1/2/3 = a × b (S12.20) */ \ , mac_gte_mv_from_mac123_v3s4(a) \ GteDelay_ /* Read MAC1/2/3 → a.xyz (overwrites source-A's load targets) */ \ , mac_shift_aright_v3s4_self(a, 12) /* Right-shift MAC by 12 (S12.20 → S12.0 OuterProduct12) */ WORD_COUNT(mac_gte_op_cross_v3s4, 13) /* atom_dbg_skip */ #define mac_gte_store_f3(r_primitive_cursor) \ gte_sw(C2_SXY0, r_primitive_cursor, O_(Poly_F3,p0)) \ , gte_sw(C2_SXY1, r_primitive_cursor, O_(Poly_F3,p1)) \ , gte_sw(C2_SXY2, r_primitive_cursor, O_(Poly_F3,p2)) WORD_COUNT(mac_gte_store_f3, 3) /* atom_dbg_skip */ #define mac_gte_load_tri_verts(vbase, v0, v1, v2) \ shift_lleft(R_AT, v0, v3s2_byteoff) \ , add_u_self(R_AT, vbase) \ , load_word(R_V0, R_AT, O_(V3_S2,x)) \ , load_word(R_V1, R_AT, O_(V3_S2,z)) \ , LdSlot_ gte_mv_to_data_r(R_V0, C2_VXY0) \ , gte_mv_to_data_r(R_V1, C2_VZ0) \ , shift_lleft(R_AT, v1, v3s2_byteoff) \ , add_u_self(R_AT, vbase) \ , load_word(R_V0, R_AT, O_(V3_S2,x)) \ , load_word(R_V1, R_AT, O_(V3_S2,z)) \ , LdSlot_ gte_mv_to_data_r(R_V0, C2_VXY1) \ , gte_mv_to_data_r(R_V1, C2_VZ1) \ , shift_lleft(R_AT, v2, v3s2_byteoff) \ , add_u_self(R_AT, vbase) \ , load_word(R_V0, R_AT, O_(V3_S2,x)) \ , load_word(R_V1, R_AT, O_(V3_S2,z)) \ , LdSlot_ gte_mv_to_data_r(R_V0, C2_VXY2) \ , gte_mv_to_data_r(R_V1, C2_VZ2) WORD_COUNT(mac_gte_load_tri_verts, 18) /* atom_dbg_skip */ #define mac_gte_store_g4_p012(r_primitive_cursor) \ gte_sw(C2_SXY0, r_primitive_cursor, O_(Poly_G4,p0)) \ , gte_sw(C2_SXY1, r_primitive_cursor, O_(Poly_G4,p1)) \ , gte_sw(C2_SXY2, r_primitive_cursor, O_(Poly_G4,p2)) WORD_COUNT(mac_gte_store_g4_p012, 3) /* atom_dbg_skip */ #define mac_gte_store_g4_p3(r_primitive_cursor) \ gte_sw(C2_SXY2, r_primitive_cursor, O_(Poly_G4,p3)) WORD_COUNT(mac_gte_store_g4_p3, 1) /* atom_dbg_skip */ #define mac_gte_sqr_v3(r_sx, r_sy, r_sz, r_sq_x, r_sq_y, r_sq_z) \ mac_gte_sqr_v3s4(r_sx, r_sy, r_sz, nop) \ , gte_mv_from_data_r(r_sq_x, C2_MAC1) \ , gte_mv_from_data_r(r_sq_y, C2_MAC2) \ , gte_mv_from_data_r(r_sq_z, C2_MAC3) WORD_COUNT(mac_gte_sqr_v3, 8) /* atom_dbg_skip */ #define mac_gte_sqr_v3s4(sx, sy, sz, delay_slot) \ gte_mv_to_data_r(sx, C2_IR1) \ , gte_mv_to_data_r(sy, C2_IR2) \ , gte_mv_to_data_r(sz, C2_IR3) \ , delay_slot \ , gte_cmdw_sqr WORD_COUNT(mac_gte_sqr_v3s4, 5) /* atom_dbg_skip */ #define mac_gte_gpf_scale(r_sx, r_sy, r_sz, r_recip_est, r_shift, r_dx, r_dy, r_dz) \ gte_mv_to_data_r(r_recip_est, C2_IR0) \ , gte_mv_to_data_r(r_sx, C2_IR1) \ , gte_mv_to_data_r(r_sy, C2_IR2) \ , gte_mv_to_data_r(r_sz, C2_IR3) \ , GteDelay_ nop2 /* retire IR0..IR3 → GPF input pre-fill (matches libgte 0x80016134..0x80016138) */ \ , gte_cmdw_gpf \ , gte_mv_from_data_r(r_dx, C2_MAC1) \ , gte_mv_from_data_r(r_dy, C2_MAC2) \ , gte_mv_from_data_r(r_dz, C2_MAC3) \ , shift_aright_var(r_dx, r_dx, r_shift) \ , shift_aright_var(r_dy, r_dy, r_shift) \ , shift_aright_var(r_dz, r_dz, r_shift) WORD_COUNT(mac_gte_gpf_scale, 13) #define mac_trans_mt3s3s4(r_mtx, r_off, r_t0, r_t1, r_t2) \ load_word( r_t0, r_off, O_(V3_S4,x)) \ , load_word( r_t1, r_off, O_(V3_S4,y)) \ , load_word( r_t2, r_off, O_(V3_S4,z)) \ , store_word(r_t0, r_mtx, O_(MT3_S2S4,t[0])) \ , store_word(r_t1, r_mtx, O_(MT3_S2S4,t[1])) \ , store_word(r_t2, r_mtx, O_(MT3_S2S4,t[2])) WORD_COUNT(mac_trans_mt3s3s4, 6) /* atom_dbg_skip */ #define mac_lzcr_round_even_half_shift(shift, mag_sq, mag_sq_copy) \ and_i(shift, shift, gte_lzcr_even_mask) \ , or_u(mag_sq_copy, mag_sq, 0) \ , li_s( mag_sq, 31) \ , sub_s( mag_sq, mag_sq, shift) \ , shift_aright(mag_sq, mag_sq, 1) WORD_COUNT(mac_lzcr_round_even_half_shift, 5) #define mac_gte_general_purpose_interopolation(to_ir0, to_ir1, to_ir2, to_ir3, fr_mac1, fr_mac2, fr_mac3, nop_slot1, nop_slot2) \ gte_mv_to_data_r(to_ir0, C2_IR0) \ , gte_mv_to_data_r(to_ir1, C2_IR1) /* IR1 = src.x (preserved in r_tmp — r_mac2_scratch was clobbered to MAC2 in stage 1.5) */ \ , gte_mv_to_data_r(to_ir2, C2_IR2) \ , gte_mv_to_data_r(to_ir3, C2_IR3) /* IR3 = src.z (reloaded) */ \ , GteDelay_ nop_slot1 \ , GteDelay_ nop_slot2 \ , gte_cmdw_gpf \ , gte_mv_from_data_r(fr_mac1, C2_MAC1) \ , gte_mv_from_data_r(fr_mac2, C2_MAC2) \ , gte_mv_from_data_r(fr_mac3, C2_MAC3) WORD_COUNT(mac_gte_general_purpose_interopolation, 10) #define mac_gte_mv_from_data_r_mac123(fr_mac1, fr_mac2, fr_mac3) \ gte_mv_from_data_r(fr_mac1, C2_MAC1) \ , gte_mv_from_data_r(fr_mac2, C2_MAC2) \ , gte_mv_from_data_r(fr_mac3, C2_MAC3) WORD_COUNT(mac_gte_mv_from_data_r_mac123, 3) #define mac_gte_mv_from_mac123_v3s4(v) \ mac_gte_mv_from_data_r_mac123(v.x, v.y, v.z) WORD_COUNT(mac_gte_mv_from_mac123_v3s4, 3) /* atom_dbg_skip */ #define mac_gcmd_push(cmd, reg_transfer, reg_base, port) \ mac_load_word_imm(reg_transfer, cmd) \ , store_word( reg_transfer, reg_base, port) WORD_COUNT(mac_gcmd_push, 3) /* atom_dbg_skip */ #define mac_store_rgb8(rr, rg, rb, base, offset) \ store_byte(rr, base, offset + O_(RGB8,r)) \ , store_byte(rg, base, offset + O_(RGB8,g)) \ , store_byte(rb, base, offset + O_(RGB8,b)) WORD_COUNT(mac_store_rgb8, 3) /* atom_dbg_skip */ #define mac_pack_color_word(r_base, off, cmd, r, g, b) \ load_upper_i(R_AT, (cmd) << 8 | (b)) \ , or_i_self( R_AT, ((g) << 8) | (r)) \ , store_word( R_AT, r_base, (off)) WORD_COUNT(mac_pack_color_word, 3) /* atom_dbg_skip */ #define mac_format_f3_color(r_base, r, g, b) \ mac_pack_color_word(r_base, O_(Poly_F3,color), gp0_cmd_poly_f3, r, g, b) WORD_COUNT(mac_format_f3_color, 3) /* atom_dbg_skip */ #define mac_format_g4_color(r_prim_cursor, r0, g0, b0, r1, g1, b1, r2, g2, b2, r3, g3, b3) \ mac_pack_color_word(r_prim_cursor, O_(Poly_G4,c0), gp0_cmd_poly_g4, r0,g0,b0) \ , mac_pack_color_word(r_prim_cursor, O_(Poly_G4,c1), 0, r1,g1,b1) \ , mac_pack_color_word(r_prim_cursor, O_(Poly_G4,c2), 0, r2,g2,b2) \ , mac_pack_color_word(r_prim_cursor, O_(Poly_G4,c3), 0, r3,g3,b3) WORD_COUNT(mac_format_g4_color, 12) #define mac_insert_ot_tag(r_ot_base, r_prim_cursor, poly_size) \ shift_lleft( R_T1, R_T1, S_(U4)/2) /* T1 = otz * S_(U4) (otz arg is implicit R_T1) */ \ , add_u_self( R_T1, r_ot_base) /* T1 = & OrderingTable[OTZ] */ \ , load_word( R_AT, R_T1, O_(PolyTag,code)) /* AT = old_ot_head */ \ , load_upper_i(R_V0, (poly_size/S_(U4) - S_(PolyTag)/S_(U4)) << PolyTag_len_bits) \ , mask_upper( R_AT, R_AT, S_(PolyTag_len_bits)) /* Strip upper 8 bits (length from prev cell) → keep only low 24 */ \ , or_u( R_AT, R_AT, R_V0) /* Merge length */ \ , store_word( R_AT, r_prim_cursor, O_(PolyTag,code)) /* prim->tag = packed(prim_length, old_addr) */ \ , shift_lleft( R_AT, r_prim_cursor, S_(PolyTag_len_bits)) /* AT = (prim_length << 24) | old_addr */ \ , shift_lright(R_AT, R_AT, S_(PolyTag_len_bits)) \ , store_word( R_AT, R_T1, O_(PolyTag,code)) /* OrderingTable[OTZ] = PrimCursor */ WORD_COUNT(mac_insert_ot_tag, 11) /* atom_dbg_skip */ #define mac_pad_set_centered_axes(state, scratch) \ load_upper_i(scratch, (PadAxis_Centered >> 16) & 0xFFFF) \ , or_i_self( scratch, PadAxis_Centered & 0xFFFF) /* mac_load_word_imm(scratch, PadAxis_Centered), */ \ , store_word( scratch, state, O_(PadState,axes)) WORD_COUNT(mac_pad_set_centered_axes, 3) /* atom_dbg_skip */ #define mac_pad_set_id_byte(state, r_id, id_value) \ add_ui( r_id, R_0, id_value) \ , store_byte(r_id, state, O_(PadState,id)) WORD_COUNT(mac_pad_set_id_byte, 2) /* atom_dbg_skip */ #define mac_pad_set_status(r_tmp, r_state, pad_status) \ add_ui( r_tmp, R_0, pad_status) \ , store_word(r_tmp, r_state, O_(PadState,status)) WORD_COUNT(mac_pad_set_status, 2) /* atom_dbg_skip */ #define mac_pad_store_inverted_buttons(r_buttons, r_pad_state) \ nor_u( r_buttons, r_buttons, R_0) \ , store_half(r_buttons, r_pad_state, O_(PadState,buttons)) WORD_COUNT(mac_pad_store_inverted_buttons, 2)