mirror of
https://github.com/Ed94/pikuma_ps1.git
synced 2026-08-04 14:48:48 +00:00
Made the atom offset/label metaprogram! Still need to support more than one branch per-atom.
This commit is contained in:
@@ -67,8 +67,8 @@
|
||||
*
|
||||
* asm volatile("nop" : : : reg_str(R_RA), "memory"); // clobber list */
|
||||
#define rlit_stringfy(n) "$" stringify(n)
|
||||
#define rlit_tmpl(n) rlit_stringfy(tmpl(n,Code))
|
||||
#define rlit(n) rlit_tmpl(n)
|
||||
#define rlit_tmpl(n) rlit_stringfy(tmpl(n,Code))
|
||||
#define rlit(n) rlit_tmpl(n)
|
||||
|
||||
/* ------------------------------------------------------------------------ *
|
||||
* rgcc(n) — GCC-specific bundle for register-variable declarations.
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
// Auto-generated by gen_atom_offsets.lua — DO NOT EDIT
|
||||
// Source: C:\projects\Pikuma\ps1\code\duffle\lottes_tape.h
|
||||
#ifndef LOTTES_TAPE_OFFSETS_H
|
||||
#define LOTTES_TAPE_OFFSETS_H
|
||||
|
||||
#pragma region lottes_tape
|
||||
|
||||
// Override the placeholder atom_offset() to dispatch via token pasting.
|
||||
#undef atom_offset
|
||||
#define atom_offset(name) atom_offset_##name
|
||||
|
||||
// --- atom: sym (8 words) ---
|
||||
|
||||
|
||||
// --- atom: tape_exit (2 words) ---
|
||||
|
||||
|
||||
// --- atom: yield (4 words) ---
|
||||
|
||||
|
||||
// --- atom: mips_flush_icache (13 words) ---
|
||||
|
||||
|
||||
// --- atom: sync_prim_cursor (6 words) ---
|
||||
|
||||
|
||||
// --- atom: set_gte_world (22 words) ---
|
||||
|
||||
|
||||
// --- atom: rbind_cube_tri (6 words) ---
|
||||
|
||||
|
||||
// --- atom: cube_tri (74 words) ---
|
||||
|
||||
|
||||
// --- atom: rbind_floor_tri (6 words) ---
|
||||
|
||||
|
||||
// --- atom: diag_yield (4 words) ---
|
||||
|
||||
|
||||
// --- atom: diag_color (28 words) ---
|
||||
|
||||
|
||||
// --- atom: diag_gte (34 words) ---
|
||||
|
||||
|
||||
#pragma endregion lottes_tape
|
||||
|
||||
#endif // LOTTES_TAPE_OFFSETS_H
|
||||
+1
-1
@@ -663,7 +663,7 @@ enum {
|
||||
asm_clobber: clb_system, rlit(R_T4), rlit(R_T5), rlit(R_T6) \
|
||||
)
|
||||
|
||||
#pragma region ASM DSL
|
||||
#pragma endregion ASM DSL
|
||||
|
||||
#pragma region Reserved
|
||||
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
# include "memory.h"
|
||||
#endif
|
||||
|
||||
typedef U4 const MipsCode;
|
||||
#define MipsAtom_(sym) MipsCode tmpl(code,sym) [] align_(4) =
|
||||
|
||||
#pragma region Tape Drive
|
||||
/* ---------------------------------------------------------------------------
|
||||
* TAPE DRIVE ABI & REGISTER ALIASES
|
||||
* ---------------------------------------------------------------------------
|
||||
@@ -63,12 +66,14 @@ FI_ TapeBuilder tb_make( FArena* arena) { return (TapeBuilder){
|
||||
|
||||
#define tb_emit_(tb, atom) tb_emit(tb, tmpl(code,atom))
|
||||
FI_ void tb_emit(TapeBuilder* tb, MipsCode* atom) { u4_r(tb->ptr)[tb->used] = u4_(atom); ++ tb->used; }
|
||||
FI_ void tb_data(TapeBuilder* tb, U4 data) { u4_r(tb->ptr)[tb->used] = u4_(data); ++ tb->used; }
|
||||
FI_ void tb_data(TapeBuilder* tb, U4 data) { u4_r(tb->ptr)[tb->used] = u4_(data); ++ tb->used; }
|
||||
|
||||
FI_ Slice_U4 tb_end (TapeBuilder* tb) { tb_emit(tb,code_tape_exit); return (Slice_U4){ C_(U4*,tb->ptr), tb->used }; }
|
||||
FI_ Slice_U4 tb_slice(TapeBuilder tb) { return (Slice_U4){ C_(U4*,tb.ptr), tb.used }; }
|
||||
#define tb_scope(tb) for(U4 tbs_once=0;tbs_once==0;++tbs_once,tb_emit(tb,code_tape_exit))
|
||||
|
||||
#pragma endregion Tape Drive
|
||||
|
||||
#pragma region Macro Mips Atom Components
|
||||
/* ---------------------------------------------------------------------------
|
||||
* MACRO ATOM Components (Reusable Assembly Components)
|
||||
@@ -150,6 +155,35 @@ FI_ void atombuilder_end(MipsAtomBuilder_R ab) {
|
||||
#pragma region Baked Mips Atoms
|
||||
// These atoms are resolved at compile time and are (usually) statically linked readonly data.
|
||||
|
||||
enum {
|
||||
bios_flushcache = 0x44,
|
||||
bios_table_addr = 0xA0,
|
||||
};
|
||||
|
||||
/* Flushes the Instruction Cache (PSX A-function 0x44 via BIOS stub at 0xA0).
|
||||
*
|
||||
* Sequence (per MIPS ABI; arguments in arg registers, RA pushed to stack):
|
||||
* 1. sp -= 8; sw $ra, 4($sp) ; save RA
|
||||
* 2. $a0 = bios_flushcache (arg0)
|
||||
* 3. $t0 = bios_table_addr ; t0 = &BIOS A-function table
|
||||
* 4. jalr $t0, $ra ; call BIOS(flushcache)
|
||||
* nop ; branch delay slot
|
||||
* 5. lw $ra, 4($sp); jr $ra ; restore & return
|
||||
* 6. sp += 8
|
||||
*/
|
||||
internal MipsAtom_(mips_flush_icache) {
|
||||
add_ui(rstack_ptr, rstack_ptr, -8) /* sp -= 8 */
|
||||
, store_word(rret_addr, rstack_ptr, 4) /* sw $ra, 4($sp) */
|
||||
, add_ui(rret_0, rdiscard, bios_flushcache) /* addiu $a0, $0, 0x44 */
|
||||
, add_ui(rtmp_0, rdiscard, bios_table_addr) /* addiu $t0, $0, 0xA0 */
|
||||
, jump_link(rtmp_0, rret_addr) /* jalr $t0, $ra */
|
||||
, nop /* BD slot */
|
||||
, load_word(rret_addr, rstack_ptr, 4) /* lw $ra, 4($sp) */
|
||||
, jump_reg(rret_addr) /* jr $ra */
|
||||
, add_ui(rstack_ptr, rstack_ptr, 8) /* sp += 8 (BD) */
|
||||
, mac_yield()
|
||||
};
|
||||
|
||||
typedef Struct_(Binds_SyncPrimCursor) {
|
||||
U4 PrimtiveArena_Used;
|
||||
U4 PrimtiveBase;
|
||||
|
||||
@@ -482,39 +482,6 @@ enum { _BitOffsets = 0
|
||||
} \
|
||||
} while (0 )
|
||||
|
||||
// Binary Metaprogramming
|
||||
|
||||
typedef U4 const MipsCode;
|
||||
#define MipsAtom_(sym) MipsCode tmpl(code,sym) [] align_(4) =
|
||||
|
||||
enum {
|
||||
bios_flushcache = 0x44,
|
||||
bios_table_addr = 0xA0,
|
||||
};
|
||||
|
||||
/* Flushes the Instruction Cache (PSX A-function 0x44 via BIOS stub at 0xA0).
|
||||
*
|
||||
* Sequence (per MIPS ABI; arguments in arg registers, RA pushed to stack):
|
||||
* 1. sp -= 8; sw $ra, 4($sp) ; save RA
|
||||
* 2. $a0 = bios_flushcache (arg0)
|
||||
* 3. $t0 = bios_table_addr ; t0 = &BIOS A-function table
|
||||
* 4. jalr $t0, $ra ; call BIOS(flushcache)
|
||||
* nop ; branch delay slot
|
||||
* 5. lw $ra, 4($sp); jr $ra ; restore & return
|
||||
* 6. sp += 8
|
||||
*/
|
||||
internal MipsAtom_(mips_flush_icache) {
|
||||
add_ui(rstack_ptr, rstack_ptr, -8) /* sp -= 8 */
|
||||
, store_word(rret_addr, rstack_ptr, 4) /* sw $ra, 4($sp) */
|
||||
, add_ui(rret_0, rdiscard, bios_flushcache) /* addiu $a0, $0, 0x44 */
|
||||
, add_ui(rtmp_0, rdiscard, bios_table_addr) /* addiu $t0, $0, 0xA0 */
|
||||
, jump_link(rtmp_0, rret_addr) /* jalr $t0, $ra */
|
||||
, nop /* BD slot */
|
||||
, load_word(rret_addr, rstack_ptr, 4) /* lw $ra, 4($sp) */
|
||||
, jump_reg(rret_addr) /* jr $ra */
|
||||
, add_ui(rstack_ptr, rstack_ptr, 8) /* sp += 8 (BD) */
|
||||
};
|
||||
I_ void mips_flush_icache(void) { C_(VoidFn*, code_mips_flush_icache)(); }
|
||||
|
||||
/* Standard clobber list for pure-MIPS asm volatile blocks: caller-saved
|
||||
* GPRs that the kernel treats as volatile (v0/v1/t0/t1/ra) plus the
|
||||
@@ -533,7 +500,3 @@ I_ void mips_flush_icache(void) { C_(VoidFn*, code_mips_flush_icache)(); }
|
||||
, jump_reg(rret_addr) \
|
||||
, add_ui(rstack_ptr, rstack_ptr, 8) \
|
||||
) asm_clobber: clb_system )
|
||||
|
||||
void test_mips_asm() {
|
||||
asm_mips_flush_icache();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// Auto-generated by gen_atom_offsets.lua — DO NOT EDIT
|
||||
// Source: C:\projects\Pikuma\ps1\code\gte_hello\hello_gte_tape.c
|
||||
#ifndef HELLO_GTE_TAPE_OFFSETS_H
|
||||
#define HELLO_GTE_TAPE_OFFSETS_H
|
||||
|
||||
#pragma region hello_gte_tape
|
||||
|
||||
// Override the placeholder atom_offset() to dispatch via token pasting.
|
||||
#undef atom_offset
|
||||
#define atom_offset(name) atom_offset_##name
|
||||
|
||||
// --- atom: floor_tri (49 words) ---
|
||||
|
||||
#define atom_offset_floor_tri_exit (17)
|
||||
|
||||
#pragma endregion hello_gte_tape
|
||||
|
||||
#endif // HELLO_GTE_TAPE_OFFSETS_H
|
||||
@@ -12,7 +12,12 @@
|
||||
#include "duffle/mips.h"
|
||||
#include "duffle/gp.h"
|
||||
#include "duffle/gte.h"
|
||||
|
||||
# include "duffle/gen/lottes_tape.offsets.h"
|
||||
#include "duffle/lottes_tape.h"
|
||||
|
||||
# include "tape_atom.metadata.h"
|
||||
# include "gen/hello_gte_tape.offsets.h"
|
||||
#include "hello_gte.h"
|
||||
#include "hello_gte_tape.c"
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifdef INTELLISENSE_DIRECTIVES
|
||||
# include "duffle/lottes_tape.h"
|
||||
# include "hello_gte.h"
|
||||
# include "tape_atom.metadata.h"
|
||||
# include "gen/hello_gte_tape.offsets.h"
|
||||
#endif
|
||||
|
||||
#pragma region MACs
|
||||
@@ -32,7 +34,7 @@ internal MipsAtom_(floor_tri) {
|
||||
|
||||
/* 4. Culling (Branch forward 29 instructions if Backface) */
|
||||
gte_mf(R_T0, C2_MAC0),
|
||||
nop, branch_le_zero(R_T0, 29),
|
||||
nop, branch_le_zero(R_T0, atom_offset(floor_tri_exit)),
|
||||
nop,
|
||||
|
||||
/* 5. Format Primitive */
|
||||
@@ -54,6 +56,7 @@ internal MipsAtom_(floor_tri) {
|
||||
add_ui(R_PrimCur, R_PrimCur, S_(Poly_F3)), /* Advance Prim Cursor (5 words) */
|
||||
|
||||
/* 9. Advance Input Cursor & Yield (Both branch targets land here) */
|
||||
atom_label(floor_tri_exit)
|
||||
add_ui(R_FaceCur, R_FaceCur, S_(S2) * 4), /* Advance Face Cursor (4 * S2 = 8 bytes) */
|
||||
mac_yield()
|
||||
};
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
// tape_atom.metadata.h
|
||||
// Single source of truth for instruction-word counts.
|
||||
// Used by C (to define compile-time constants) AND Python (to count positions).
|
||||
//
|
||||
// Format: WORD_COUNT(MACRO_NAME, COUNT)
|
||||
// One line per macro that appears in your atom sources.
|
||||
//
|
||||
// To regenerate: hand-count the instructions in each macro definition.
|
||||
// (You'll only need to do this once per macro — they don't change often.)
|
||||
#define WORD_COUNT(name, count) enum { words_##name = (count) };
|
||||
|
||||
WORD_COUNT(nop, 1)
|
||||
WORD_COUNT(branch_le_zero, 1)
|
||||
WORD_COUNT(branch_equal, 1)
|
||||
WORD_COUNT(add_ui, 1)
|
||||
WORD_COUNT(slt_u, 1)
|
||||
WORD_COUNT(load_ui, 1)
|
||||
WORD_COUNT(load_word, 1)
|
||||
WORD_COUNT(load_half_u, 1)
|
||||
WORD_COUNT(store_word, 1)
|
||||
WORD_COUNT(gte_mf, 1)
|
||||
WORD_COUNT(gte_mt, 1)
|
||||
WORD_COUNT(gte_ct, 1)
|
||||
WORD_COUNT(gte_sw, 1)
|
||||
WORD_COUNT(gte_cmdw_rtpt, 1)
|
||||
WORD_COUNT(gte_cmdw_nclip, 1)
|
||||
WORD_COUNT(gte_avg_sort_z3, 1)
|
||||
WORD_COUNT(mac_load_tri_indices, 3)
|
||||
WORD_COUNT(mac_load_tri_verts, 18)
|
||||
WORD_COUNT(mac_format_f3_color, 3)
|
||||
WORD_COUNT(mac_gte_store_f3, 3)
|
||||
WORD_COUNT(mac_insert_ot_tag, 11)
|
||||
WORD_COUNT(mac_yield, 4)
|
||||
|
||||
#undef WORD_COUNT
|
||||
|
||||
// Used to define word markers for the lua metaprogram to calculate offsets from.
|
||||
#define atom_label(sym)
|
||||
// #define atom_offset(sym) // will be generated based on usage within a baked atom.
|
||||
Reference in New Issue
Block a user