diff --git a/code/duffle/dsl.h b/code/duffle/dsl.h index a5e9551..cc0a71a 100644 --- a/code/duffle/dsl.h +++ b/code/duffle/dsl.h @@ -121,6 +121,11 @@ typedef unsigned char TSet_(B1); typedef __UINT16_TYPE__ TSet_(B2); typedef __UINT32_TYPE__ TSet_(B4); + +#define b1_(value) C_(B1, value) +#define b2_(value) C_(B2, value) +#define b4_(value) C_(B4, value) + #define u1_(value) C_(U1, value) #define u2_(value) C_(U2, value) #define u4_(value) C_(U4, value) @@ -128,6 +133,13 @@ typedef __UINT32_TYPE__ TSet_(B4); #define s2_(value) C_(S2, value) #define s4_(value) C_(S4, value) +#define b1_r(value) C_(B1*R_, value) +#define b2_r(value) C_(B2*R_, value) +#define b4_r(value) C_(B4*R_, value) +#define b1_v(value) C_(B1 V_*, value) +#define b2_v(value) C_(B2 V_*, value) +#define b4_v(value) C_(B4 V_*, value) + #define u1_r(value) C_(U1 *R_, value) #define u2_r(value) C_(U2 *R_, value) #define u4_r(value) C_(U4 *R_, value) diff --git a/code/duffle/gp.atom.c b/code/duffle/gp.atom.c index e1e9056..4d67e9e 100644 --- a/code/duffle/gp.atom.c +++ b/code/duffle/gp.atom.c @@ -8,7 +8,7 @@ ATOM_FILE_DEBUGGER_LINE_MARKER(gp_atom_c); #pragma region MACs (Mips Atom Components) -FI_ Slice_MipsCode ac_gcmd_push(AtomBuilder_R ab, U4 cmd, U4 reg_transfer, U4 reg_base, U2 port) +FI_ Slice_MipsCode ac_gcmd_push(AtomBuilder_R ab, U2 cmd, Reg reg_transfer, Reg reg_base, U2 port) atom_dbg_skip MipsAtomComp_Proc_(ab, { mac_load_word_imm(reg_transfer, cmd), store_word( reg_transfer, reg_base, port), diff --git a/code/duffle/gp.h b/code/duffle/gp.h index 9261267..14eddee 100644 --- a/code/duffle/gp.h +++ b/code/duffle/gp.h @@ -386,7 +386,7 @@ enum { * ============================================================================ */ /* ---------- RGB8 (3-byte packed color) ---------- */ -typedef Struct_(RGB8) { B1 r; B1 g; B1 b; }; +typedef Struct_(RGB8) { U1 r; U1 g; U1 b; }; #define rgb8(r,g,b) ((RGB8){r,g,b}) /* ---------- PolyTag (the OT-link header; 1 word) ---------- */ @@ -416,7 +416,7 @@ typedef Struct_(PolyTag) { typedef Struct_(Poly_F3) { U4 tag; RGB8 color; - B1 code; + U1 code; union { struct { V2_S2 p0; V2_S2 p1; V2_S2 p2; }; A3_V2_S2 points; @@ -427,7 +427,7 @@ typedef Struct_(Poly_F3) { typedef Struct_(Poly_F4) { U4 tag; RGB8 color; - B1 code; + U1 code; union { struct { V2_S2 p0; V2_S2 p1; V2_S2 p2; V2_S2 p3; }; A4_V2_S2 points; @@ -436,18 +436,18 @@ typedef Struct_(Poly_F4) { /* ---------- Poly_G3 (Gouraud Triangle; 7 words) ---------- */ typedef Struct_(Poly_G3) { - U4 tag; RGB8 c0; B1 code; - V2_S2 p0; RGB8 c1; B1 pad1; - V2_S2 p1; RGB8 c2; B1 pad2; + U4 tag; RGB8 c0; U1 code; + V2_S2 p0; RGB8 c1; U1 pad1; + V2_S2 p1; RGB8 c2; U1 pad2; V2_S2 p2; }; /* ---------- Poly_G4 (Gouraud Quad; 9 words) ---------- */ typedef Struct_(Poly_G4) { - U4 tag; RGB8 c0; B1 code; - V2_S2 p0; RGB8 c1; B1 pad1; - V2_S2 p1; RGB8 c2; B1 pad2; - V2_S2 p2; RGB8 c3; B1 pad3; + U4 tag; RGB8 c0; U1 code; + V2_S2 p0; RGB8 c1; U1 pad1; + V2_S2 p1; RGB8 c2; U1 pad2; + V2_S2 p2; RGB8 c3; U1 pad3; V2_S2 p3; }; @@ -456,7 +456,7 @@ typedef Struct_(Poly_G4) { typedef Struct_(Poly_FT3) { U4 tag; RGB8 color; - B1 code; + U1 code; U4 tpage; U4 clut; V2_S2 p0; U1 u0; U1 v0; @@ -468,7 +468,7 @@ typedef Struct_(Poly_FT3) { typedef Struct_(Poly_FT4) { U4 tag; RGB8 color; - B1 code; + U1 code; U4 tpage; U4 clut; V2_S2 p0; U1 u0; U1 v0; @@ -479,9 +479,9 @@ typedef Struct_(Poly_FT4) { /* ---------- Poly_GT3 (Gouraud Textured Triangle) ---------- */ typedef Struct_(Poly_GT3) { - U4 tag; RGB8 c0; B1 code; - V2_S2 p0; RGB8 c1; B1 pad1; - V2_S2 p1; RGB8 c2; B1 pad2; + U4 tag; RGB8 c0; U1 code; + V2_S2 p0; RGB8 c1; U1 pad1; + V2_S2 p1; RGB8 c2; U1 pad2; V2_S2 p2; U4 tpage; U4 clut; @@ -492,10 +492,10 @@ typedef Struct_(Poly_GT3) { /* ---------- Poly_GT4 (Gouraud Textured Quad) ---------- */ typedef Struct_(Poly_GT4) { - U4 tag; RGB8 c0; B1 code; - V2_S2 p0; RGB8 c1; B1 pad1; - V2_S2 p1; RGB8 c2; B1 pad2; - V2_S2 p2; RGB8 c3; B1 pad3; + U4 tag; RGB8 c0; U1 code; + V2_S2 p0; RGB8 c1; U1 pad1; + V2_S2 p1; RGB8 c2; U1 pad2; + V2_S2 p2; RGB8 c3; U1 pad3; V2_S2 p3; U4 tpage; U4 clut; diff --git a/code/duffle/memory.h b/code/duffle/memory.h index dcebd0c..bcf952d 100644 --- a/code/duffle/memory.h +++ b/code/duffle/memory.h @@ -23,10 +23,10 @@ FI_ void mem_bump(U4 cap, U4*R_ used, U4 amount) { used[0] += amount; } -FI_ U4 mem_copy (U4 dest, U4 src, U4 len) { return (U4)(__builtin_memcpy ((void*)dest, (void const*)src, len)); } -FI_ U4 mem_copy_overlapping(U4 dest, U4 src, U4 len) { return (U4)(__builtin_memmove((void*)dest, (void const*)src, len)); } -FI_ U4 mem_fill (U4 dest, U4 value, U4 len) { return (U4)(__builtin_memset ((void*)dest, (int) value, len)); } -FI_ B4 mem_zero (U4 dest, U4 len) { if(dest == 0){return false;} mem_fill(dest, 0, len); return true; } +FI_ U4 mem_copy (U1_R dest, U1_R src, U4 len) { return (U4)(__builtin_memcpy ((void*)dest, (void const*)src, len)); } +FI_ U4 mem_copy_overlapping(U1* dest, U1* src, U4 len) { return (U4)(__builtin_memmove((void*)dest, (void const*)src, len)); } +FI_ U4 mem_fill (U1_R dest, U4 value, U4 len) { return (U4)(__builtin_memset ((void*)dest, (int) value, len)); } +FI_ B4 mem_zero (U1_R dest, U4 len) { if(dest == 0){return false;} mem_fill(dest, 0, len); return true; } #pragma region DAG @@ -58,31 +58,30 @@ typedef Struct_(Str8) { UTF8* ptr; U4 len; }; typedef Struct_(Slice_Str8) { Str8* ptr; U4 len; }; #define slit(string_literal) (Str8){ (UTF8*) string_literal, S_(string_literal) - 1 } -typedef Struct_(Slice) { B1* ptr; U4 len; }; -FI_ Slice slice_ut_(U4 ptr, U4 len) { return (Slice){(B1*)ptr, len}; } +typedef Struct_(Slice) { U1* ptr; U4 len; }; +FI_ Slice slice_ut_(U1* ptr, U4 len) { return (Slice){ptr, len}; } #define Slice_(type) Struct_(tmpl(Slice,type)) { type* ptr; U4 len; } -typedef Slice_(B1); #define slice_assert(s) do { assert((s).ptr != 0); assert((s).len > 0); } while(0) -#define slice_end(slice) ((slice).ptr + S_slice(slice) / S_(B1)) +#define slice_end(slice) ((slice).ptr + S_slice(slice)) #define S_slice(s) ((s).len * S_((s).ptr[0])) -#define slice_ut(ptr,len) slice_ut_(u4_(ptr), u4_(len)) -#define slice_ut_arr(a) slice_ut_(u4_(a), S_(a)) -#define slice_to_ut(s) slice_ut_(u4_((s).ptr), S_slice(s)) +#define slice_ut(ptr,len) slice_ut_(C_(U1*,ptr), u4_(len)) +#define slice_ut_arr(a) slice_ut_(C_(U1*,a), S_(a)) +#define slice_to_ut(s) slice_ut_(C_(U1*,(s).ptr), S_slice(s)) #define slice_iter(container, iter) (T_((container).ptr) iter = (container).ptr; iter != slice_end(container); ++ iter) #define slice_arg_from_array(type, ...) & (tmpl(Slice,type)) { .ptr = Array_decl(type,__VA_ARGS__), .len = Array_len( Array_decl(type,__VA_ARGS__)) } #define slice_from_array(type, array) (tmpl(Slice,type)) { .ptr = array, .len = Array_len(array) } -FI_ void slice_zero_(Slice s) { slice_assert(s); mem_zero(u4_(s.ptr), s.len); } +FI_ void slice_zero_(Slice s) { slice_assert(s); mem_zero(s.ptr, s.len); } #define slice_zero(s) slice_zero_(slice_to_ut(s)) FI_ void slice_copy_(Slice dest, Slice src) { assert(S_slice(dest) >= S_slice(src)); slice_assert(dest); slice_assert(src); - mem_copy(u4_(dest.ptr), u4_(src.ptr), S_slice(src)); + mem_copy(dest.ptr, src.ptr, S_slice(src)); } #define slice_copy(dest, src) do { \ static_assert(T_same(dest, src)); \ @@ -95,6 +94,7 @@ FI_ Slice slice_bump(U4_R used, U4 start, U4 len, U4 amount) { return slice_ut(ptr, amount); } +typedef Slice_(B1); typedef Slice_(U1); typedef Slice_(U4); @@ -117,7 +117,7 @@ I_ Slice farena_push(FArena_R arena, U4 amount, Opt_farena o) { U4 to_commit = align_pow2(desired, o.alignment ? o.alignment : MEM_ALIGNMENT_DEFAULT); U4 ptr = arena->start + arena->used; mem_bump(arena->capacity, & arena->used, to_commit); - return (Slice){ (B1*)ptr, to_commit }; + return (Slice){ (U1*)ptr, to_commit }; } FI_ void farena_reset (FArena_R arena) { arena->used = 0; } FI_ void farena_rewind(FArena_R arena, U4 save_point) { diff --git a/code/duffle/tape.h b/code/duffle/tape.h index bcb3b2f..d511f93 100644 --- a/code/duffle/tape.h +++ b/code/duffle/tape.h @@ -121,7 +121,7 @@ typedef U2 Reg; // Register parameter used with atom or atom component procedure typedef U4 const MipsCode; // Underlying type to mips asm words. typedef Slice_(MipsCode); -typedef U4 const MipsAtom; // Underlying type to a mips atom defnition +typedef U4 const MipsAtom; // Underlying type to a mips atom definition typedef Slice_(MipsAtom); // Sometimes a user will define a bundle of atoms that represent a procedure of work as: @@ -176,7 +176,7 @@ typedef Slice_(MipsAtom); The constant is in `.rodata` so the linker may eliminate it. */ #define ATOM_FILE_DEBUGGER_LINE_MARKER(file_name) internal U4 const tmpl(atom_file_debugger_line_marker,file_name) = 0 -typedef Slice_MipsAtom Tape; +typedef Struct_(Tape) { union { MipsAtom* ptr; U4* inlaid_data; }; U4 len; }; typedef Struct_(TapeHostFrame) { U4 s0; @@ -249,12 +249,8 @@ FI_ void tb_emit(TapeBuilder* tb, MipsAtom* atom) { u4_r(tb->ptr)[tb->used] = u4 FI_ void tb_data(TapeBuilder* tb, U4 data) { u4_r(tb->ptr)[tb->used] = u4_(data); ++ tb->used; } #define tb_emit_(atom) tb_emit(& tb, atom) -FI_ void tb_bind(TapeBuilder* tb, Slice data) { mem_copy(tb->ptr + tb->used * S_(MipsCode), u4_(data.ptr), data.len); tb->used += data.len / S_(MipsCode); } -#define tb_bind_(tb,type,...) tb_bind(tb, (Slice){ (B1*)(& (type){__VA_ARGS__}), S_(type) }); static_assert(S_(type) % S_(MipsCode) == 0) - -// NOTE(Ed): Wip still ideating convention. Possibly will never use a composite. -#define tb_emit_wbind_(tb,atom,...) tb_emit(tb,atom); tb_bind_(tb,tmpl(Binds,atom),__VA_ARGS__) -#define tb_emit_wbind2_(tb,atom,type,...) tb_emit(tb,atom); tb_bind_(tb,type,__VA_ARGS__) +FI_ void tb_bind(TapeBuilder* tb, Slice data) { mem_copy(b1_r(tb->ptr + tb->used * S_(MipsCode)), data.ptr, data.len); tb->used += data.len / S_(MipsCode); } +#define tb_bind_(tb,type,...) tb_bind(tb, (Slice){ (U1*)(& (type){__VA_ARGS__}), S_(type) }); static_assert(S_(type) % S_(MipsCode) == 0) FI_ Tape tb_end (TapeBuilder* tb) { tb_emit(tb,tape_exit); return (Tape){ C_(U4*,tb->ptr), tb->used }; } FI_ Tape tb_slice(TapeBuilder tb) { return (Tape){ C_(U4*,tb.ptr), tb.used }; } @@ -262,6 +258,12 @@ FI_ Tape tb_slice(TapeBuilder tb) { return (Tape){ C_(U4 FI_ void tb_scope_run_end(TapeBuilder* tb) { tb_emit(tb,tape_exit); tape_run(tb_slice(tb[0])); } #define tb_scope_run(tb) for(U4 tbs_once=0;tbs_once==0;++tbs_once,tb_scope_run_end(tb)) + + +// NOTE(Ed): Wip still ideating convention. Possibly will never use a composite. +#define tb_emit_wbind_(tb,atom,...) tb_emit(tb,atom); tb_bind_(tb,tmpl(Binds,atom),__VA_ARGS__) +#define tb_emit_wbind2_(tb,atom,type,...) tb_emit(tb,atom); tb_bind_(tb,type,__VA_ARGS__) + #pragma endregion Tape Drive #pragma region Macro Mips Atom Components @@ -299,7 +301,7 @@ typedef Relative_(FArena) Struct_(AtomBuilder) { U4 start; U4 capacity; U4 used; FI_ void atombuilder_push(AtomBuilder_R ab, Slice_MipsCode code) { assert(ab->capacity - ab->used - code.len); U4 dest = ab->start + ab->used * S_(MipsCode); U4 size = S_slice(code); - mem_copy(dest, u4_(code.ptr), size); ab->used += size; + mem_copy(b1_r(dest), b1_r(code.ptr), size); ab->used += size; } #define atombuilder_push_mac(ab, mac) atombuilder_push(ab, slice_arg_from_array(Slice_MipsCode, mac)) @@ -323,7 +325,7 @@ FI_ AtomArena atomarena_make(Slice mem) { AtomArena a; atomarena_init(& a, mem); FI_ MipsAtom* atomarena_push(AtomArena_R aa, Slice_MipsCode code) { assert(aa->capacity - aa->used - code.len); U4 dest = atomarena_unused_start(aa[0]); U4 size = S_slice(code); - mem_copy(dest, u4_(code.ptr), size); aa->used += size; + mem_copy(b1_r(dest), b1_r(code.ptr), size); aa->used += size; return C_(MipsAtom*, dest); } FI_ void atomarena_reset(AtomArena_R aa) { aa->used = 0; } diff --git a/code/hello_camera/hello_camera.atom.c b/code/hello_camera/hello_camera.atom.c index eff53c0..f68a9a7 100644 --- a/code/hello_camera/hello_camera.atom.c +++ b/code/hello_camera/hello_camera.atom.c @@ -237,8 +237,8 @@ enum { }; //screen_env_init. Mirrors the libpsyx's SetDefDispEnv + SetDefDrawEnv + the manual enable_auto_clear / initial_bg_color writes. internal MipsAtom_(screen_env_init) atom_info(atom_phase(screen_init) -, atom_reads(R_T0, R_ScreenX, R_ScreenY, R_ScreenBuf) -, atom_writes(R_T0, R_ScreenX, R_ScreenY) +, atom_reads(R_ScreenBuf) +, atom_writes(R_ScreenBuf) ) { /* display[0] = (0, 0, 320, 240); rest of struct zeroed. */ add_ui(R_ScreenX, R_0, ScreenRes_X), add_ui(R_ScreenY, R_0, ScreenRes_Y), @@ -441,7 +441,7 @@ typedef Struct_(Binds_PadInputCam) { Camera* cam; }; internal MipsAtom_(pad_input_cam) atom_info(atom_bind(Binds_PadInputCam) -, atom_reads( R_Cam, R_CamPadState, R_TapePtr) +, atom_reads( R_Cam, R_CamPadState) , atom_writes(R_Cam) ) { /* Bind pop: state → R_CamPadState (R_T5), cam → R_Cam (R_T4), advance R_TapePtr by 8. */ @@ -504,10 +504,7 @@ typedef Struct_(Binds_CubeTri) { V3_S2* VertBase; U4* OtBase; }; -internal MipsAtom_(rbind_cube_g4_face) atom_info(atom_bind(Binds_CubeTri), atom_phase(cube_g4) -, atom_reads(R_TapePtr) -, atom_writes(R_PrimCursor, R_FaceCursor, R_VertBase, R_OtBase, R_TapePtr) -){ +internal MipsAtom_(rbind_cube_g4_face) atom_info(atom_bind(Binds_CubeTri), atom_phase(cube_g4)){ /* Pop 4 arguments from the tape directly into the workspace registers */ load_word(R_PrimCursor, R_TapePtr, O_(Binds_CubeTri,PrimCursor)), load_word(R_FaceCursor, R_TapePtr, O_(Binds_CubeTri,FaceCursor)), @@ -530,11 +527,11 @@ MipsAtom_(cube_g4_face) atom_info(atom_phase(cube_g4), LdSlot_ mac_gte_load_tri_verts(R_VertBase, R_T0, R_T1, R_T2), GteDelay_ load_half_u(R_T3, R_FaceCursor, 3 * S_(S2)), LdSlot_ - GteDelay_ load_word(R_AtomJmp, R_TapePtr, 0), LdSlot_ //ac_yield: word 2, + GteDelay_ load_word(R_AtomJmp, R_TapePtr, 0), LdSlot_ //ac_yield: word 1, gte_cmdw_rotate_translate_perspective_triple, gte_cmdw_nclip, - gte_mv_from_data_r(R_T0, C2_MAC0), GteDelay_ add_ui_self(R_TapePtr, S_(MipsCode)), // ac_yield: word 1 + gte_mv_from_data_r(R_T0, C2_MAC0), GteDelay_ add_ui_self(R_TapePtr, S_(MipsCode)), // ac_yield: word 2 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 — @@ -628,8 +625,7 @@ atom_label(floor_f3_face_exit) typedef Struct_(Binds_SyncPrimitiveArena) { U4 used; U4 cursor; }; internal MipsAtom_(sync_primitive_arena) atom_info(atom_bind(Binds_SyncPrimitiveArena) - , atom_reads( R_TapePtr, R_PrimCursor) - , atom_writes(R_TapePtr) + , atom_reads(R_PrimCursor), atom_writes(R_AT) ){ load_word(R_AT, R_TapePtr, O_(Binds_SyncPrimitiveArena,used)), load_word(R_T0, R_TapePtr, O_(Binds_SyncPrimitiveArena,cursor)), LdSlot_ diff --git a/code/hello_camera/hello_camera.c b/code/hello_camera/hello_camera.c index 0796d54..7ca6468 100644 --- a/code/hello_camera/hello_camera.c +++ b/code/hello_camera/hello_camera.c @@ -93,11 +93,11 @@ extern SMemory smem; #define pad0_btn_(btn) btn & smem.pad[0].buttons #define pad1_btn_(btn) btn & smem.pad[1].buttons -I_ B1* prim__alloc(U4 type_width, Str8 type_name) { +I_ U1* prim__alloc(U4 type_width, Str8 type_name) { gknown PrimitiveArena* pa = & smem.primitives; - gknown B1* buf = (B1*) r_(smem.primitives.buf)[smem.active_buf_id]; + gknown U1* buf = (U1*) r_(smem.primitives.buf)[smem.active_buf_id]; assert(pa->used + type_width < PrimitiveBuff_Len); - B1* next = buf + pa->used; + U1* next = buf + pa->used; pa->used += type_width; return next; } @@ -242,28 +242,18 @@ void update(PrimitiveArena* pa, U4* ordering_buf) { TapeBuilder tb = tb_make(slice_ut_arr(smem.MemTape)); - // Pad Input - { + /*Pad Input*/ { tb.used = 0; tb_scope_run(& tb) { // Grab latest state from bios. tb_emit_(pad_bios_snapshot); - tb_data(& tb, u4_(& smem.pad_raw[0])); + tb_data(& tb, u4_(& smem.pad_raw[0])); tb_data(& tb, u4_(& smem.pad[0])); - // tb_emit_(pad_bios_snapshot); - // tb_data_(raw, & smem.pad_raw[1]); - // tb_data_(state, & smem.pad[1]); - tb_emit_(pad_input_cam); tb_data(& tb, u4_(& smem.pad[0])); tb_data(& tb, u4_(& smem.cam)); - - // tb_emit_(pad_input_cube_rotation); - // tb_data_(state, & smem.pad[0]); - // tb_data_(cube_rot, & smem.cube.rot); - // tb_data_(floor_rot, & smem.floor.rot); } } - + orderingtbl_clear_reverse(ordering_buf, OrderingTbl_Len); // Update the position based on acceleration and velocity @@ -390,6 +380,19 @@ void gp_display_frame(DoubleBuffer* screen_buf, S4* active_buf_id, U4* ordering_ int main(void) { smem = (SMemory){0}; + + B4 basic_sample = false; if (basic_sample) { + // We will be defining the tape here along with its atom, then running the tape after. + TapeBuilder tb = tb_make(slice_ut_arr(smem.MemTape)); + MipsCode add_one_to_R_T1[] = { + add_ui_self(R_T1, 1), + mac_yield(), + }; + tb_emit(& tb, C_(MipsAtom*, add_one_to_R_T1)); + Tape tape = tb_end(& tb); + tape_run(tape); + } + // smem.primitives.used = 0; // smem.active_buf_id = 0; smem.cam.pos = v3s4(500, -1000, -1500); diff --git a/code/hello_camera/hello_camera.h b/code/hello_camera/hello_camera.h index e1cc70b..db3e50d 100644 --- a/code/hello_camera/hello_camera.h +++ b/code/hello_camera/hello_camera.h @@ -24,7 +24,7 @@ enum { typedef U4 OrderingTable_Buffer[OrderingTbl_Len]; typedef Array_(OrderingTable_Buffer, 2); -typedef B1 PrimitiveBuffer[PrimitiveBuff_Len]; +typedef U1 PrimitiveBuffer[PrimitiveBuff_Len]; typedef Array_(PrimitiveBuffer, 2); typedef Struct_(PrimitiveArena) { A2_PrimitiveBuffer buf; @@ -54,8 +54,8 @@ I_ void ent_cube128_init(A8_V3_S2* verts, A6_V4_S2* faces) { { 2, 3, 6, 7 }, { 3, 0, 7, 4 }, }; - mem_copy(u4_(verts), u4_(& baked_verts), S_(A8_V3_S2) ); - mem_copy(u4_(faces), u4_(& baked_faces), S_(A6_V4_S2) ); + mem_copy(b1_r(verts), b1_r(& baked_verts), S_(A8_V3_S2) ); + mem_copy(b1_r(faces), b1_r(& baked_faces), S_(A6_V4_S2) ); return; } typedef Struct_(Ent_Cube) { @@ -83,8 +83,8 @@ I_ void ent_floor_init(A4_V3_S2* verts, A2_V3_S2* faces) { { 0, 1, 2 }, { 1, 3, 2 }, }; - mem_copy(u4_(verts), u4_(& baked_verts), S_(A4_V3_S2)); - mem_copy(u4_(faces), u4_(& baked_faces), S_(A2_V3_S2)); + mem_copy(b1_r(verts), b1_r(& baked_verts), S_(A4_V3_S2)); + mem_copy(b1_r(faces), b1_r(& baked_faces), S_(A2_V3_S2)); }; typedef Struct_(Ent_Floor) { V3_S4 accel;