diff --git a/data/behavior_data.c b/data/behavior_data.c index 6ea15514..4f8f5a05 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -242,6 +242,8 @@ #define BEGIN_REPEAT_UNUSED(count) \ BC_BB(0x26, count) +#define OR_LONG(field, value) LOAD_ANIMATIONS(field, value) + // Loads the animations for the object. is always set to oAnimations. #define LOAD_ANIMATIONS(field, anims) \ BC_BB(0x27, field), \ @@ -2001,7 +2003,7 @@ const BehaviorScript bhvBowserFlameSpawn[] = { const BehaviorScript bhvTiltingBowserLavaPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), @@ -2015,7 +2017,7 @@ const BehaviorScript bhvTiltingBowserLavaPlatform[] = { const BehaviorScript bhvFallingBowserPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), SET_HOME(), @@ -2188,7 +2190,7 @@ const BehaviorScript bhvWaterLevelPillar[] = { const BehaviorScript bhvDddWarp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oCollisionDistance, 30000), BEGIN_LOOP(), CALL_NATIVE(bhv_ddd_warp_loop), @@ -2657,7 +2659,7 @@ const BehaviorScript bhvBowserSubDoor[] = { const BehaviorScript bhvBowsersSub[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), LOAD_COLLISION_DATA(ddd_seg7_collision_submarine), @@ -2705,7 +2707,7 @@ const BehaviorScript bhvJrbSlidingBox[] = { const BehaviorScript bhvShipPart3[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(bhv_ship_part_3_loop), @@ -2714,7 +2716,7 @@ const BehaviorScript bhvShipPart3[] = { const BehaviorScript bhvInSunkenShip3[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_3), SET_HOME(), SET_FLOAT(oCollisionDistance, 4000), @@ -2726,7 +2728,7 @@ const BehaviorScript bhvInSunkenShip3[] = { const BehaviorScript bhvSunkenShipPart[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SCALE(/*Unused*/ 0, /*Field*/ 50), SET_HOME(), BEGIN_LOOP(), @@ -2743,7 +2745,7 @@ const BehaviorScript bhvSunkenShipSetRotation[] = { const BehaviorScript bhvSunkenShipPart2[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SCALE(/*Unused*/ 0, /*Field*/ 100), SET_FLOAT(oDrawingDistance, 6000), SET_HOME(), @@ -2761,7 +2763,7 @@ const BehaviorScript bhvInSunkenShip2[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_2), // Sunken ship - common: - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oCollisionDistance, 4000), CALL(bhvSunkenShipSetRotation), BEGIN_LOOP(), @@ -3152,7 +3154,7 @@ UNUSED static const BehaviorScript unused_1[] = { const BehaviorScript bhvStaticObject[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), BREAK(), }; @@ -3611,7 +3613,7 @@ const BehaviorScript bhvRandomAnimatedTexture[] = { const BehaviorScript bhvYellowBackgroundInMenu[] = { BEGIN(OBJ_LIST_LEVEL), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), CALL_NATIVE(beh_yellow_background_menu_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -3631,7 +3633,7 @@ const BehaviorScript bhvMenuButton[] = { const BehaviorScript bhvMenuButtonManager[] = { BEGIN(OBJ_LIST_LEVEL), - OR_INT(oFlags, (OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM | OBJ_FLAG_UPDATE_TRANSFORM_FOR_THROW_MATRIX | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM | OBJ_FLAG_UPDATE_TRANSFORM_FOR_THROW_MATRIX | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_menu_button_manager_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -4244,7 +4246,7 @@ const BehaviorScript bhvLllDrawbridge[] = { const BehaviorScript bhvSmallBomp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_small_bomp), CALL_NATIVE(bhv_small_bomp_init), BEGIN_LOOP(), @@ -4255,7 +4257,7 @@ const BehaviorScript bhvSmallBomp[] = { const BehaviorScript bhvLargeBomp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_large_bomp), CALL_NATIVE(bhv_large_bomp_init), BEGIN_LOOP(), @@ -4365,7 +4367,7 @@ const BehaviorScript bhvThiBowlingBallSpawner[] = { const BehaviorScript bhvRrCruiserWing[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), CALL_NATIVE(bhv_rr_cruiser_wing_init), BEGIN_LOOP(), CALL_NATIVE(bhv_rr_cruiser_wing_loop), @@ -4396,7 +4398,7 @@ const BehaviorScript bhvSslMovingPyramidWall[] = { const BehaviorScript bhvPyramidElevator[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_elevator), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -4418,7 +4420,7 @@ const BehaviorScript bhvPyramidElevatorTrajectoryMarkerBall[] = { const BehaviorScript bhvPyramidTop[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_top), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -5390,7 +5392,7 @@ const BehaviorScript bhvTrackBall[] = { const BehaviorScript bhvSeesawPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_seesaw_platform_init), BEGIN_LOOP(), CALL_NATIVE(bhv_seesaw_platform_update), @@ -5429,7 +5431,7 @@ const BehaviorScript bhvWaterBombSpawner[] = { const BehaviorScript bhvWaterBomb[] = { BEGIN(OBJ_LIST_GENACTOR), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 120, /*Gravity*/ -400, /*Bounciness*/ 0, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0), BEGIN_LOOP(), CALL_NATIVE(bhv_water_bomb_update), @@ -5461,7 +5463,7 @@ const BehaviorScript bhvTTCRotatingSolid[] = { const BehaviorScript bhvTTCPendulum[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(ttc_seg7_collision_clock_pendulum), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oCollisionDistance, 1500), CALL_NATIVE(bhv_ttc_pendulum_init), SET_FLOAT(oTTCPendulumAccelDir, 1), @@ -5474,9 +5476,9 @@ const BehaviorScript bhvTTCPendulum[] = { const BehaviorScript bhvTTCTreadmill[] = { BEGIN(OBJ_LIST_SURFACE), #ifdef PLATFORM_DISPLACEMENT_2 - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_VELOCITY_PLATFORM)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_VELOCITY_PLATFORM | OBJ_FLAG_UCODE_LARGE)), #else - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), #endif SET_FLOAT(oCollisionDistance, 750), CALL_NATIVE(bhv_ttc_treadmill_init), @@ -5624,7 +5626,7 @@ const BehaviorScript bhvAnimatesOnFloorSwitchPress[] = { const BehaviorScript bhvActivatedBackAndForthPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), CALL_NATIVE(bhv_activated_back_and_forth_platform_init), BEGIN_LOOP(), diff --git a/include/object_constants.h b/include/object_constants.h index ac73b2d5..6ddfe4bf 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -46,6 +46,7 @@ #define OBJ_FLAG_VELOCITY_PLATFORM (1 << 15) // 0x00008000 #define OBJ_FLAG_DONT_CALC_COLL_DIST (1 << 16) // 0x00010000 #define OBJ_FLAG_EMIT_LIGHT (1 << 17) // 0x00020000 +#define OBJ_FLAG_UCODE_LARGE (1 << 18) // 0x00040000 #define OBJ_FLAG_HITBOX_WAS_SET (1 << 30) // 0x40000000 /* oHeldState */ diff --git a/include/types.h b/include/types.h index 15ff15b7..b1219968 100644 --- a/include/types.h +++ b/include/types.h @@ -146,6 +146,7 @@ struct GraphNodeObject /*0x4C*/ struct SpawnInfo *unk4C; /*0x50*/ Mat4 *throwMatrix; // matrix ptr /*0x54*/ Vec3f cameraToObject; + u8 uCode; }; struct ObjectNode diff --git a/lib/rsp.s b/lib/rsp.s index 4c82b25a..a90f2a1c 100644 --- a/lib/rsp.s +++ b/lib/rsp.s @@ -22,27 +22,42 @@ glabel gspFast3D_fifoTextEnd #endif #else /* Use one of the Fast3DEX series grucodes. */ - #ifndef F3DZEX_GBI_2 #if F3DEX2PL_GBI == 1 glabel gspF3DEX2_PosLight_fifoTextStart .incbin "lib/PR/f3dex2pl/F3DEX2_PosLight.bin" glabel gspF3DEX2_PosLight_fifoTextEnd - #elif F3DEX_GBI_2 == 1 - glabel gspF3DEX2_fifoTextStart - .incbin "lib/PR/f3dex2/F3DEX2.bin" - glabel gspF3DEX2_fifoTextEnd #elif F3DEX_GBI == 1 glabel gspF3DEX_fifoTextStart .incbin "lib/PR/f3dex/F3DEX.bin" glabel gspF3DEX_fifoTextEnd #endif - #else /* Fast3DZEX */ - glabel gspF3DZEX2_PosLight_fifoTextStart - .incbin "lib/PR/f3dzex/F3DZEX.bin" - glabel gspF3DZEX2_PosLight_fifoTextEnd - #endif #endif +.balign 16 +glabel gspF3DEX2_fifoTextStart + .incbin "lib/PR/f3dex2/F3DEX2.bin" +glabel gspF3DEX2_fifoTextEnd + +.balign 16 +glabel gspF3DZEX2_PosLight_fifoTextStart + .incbin "lib/PR/f3dzex/F3DZEX.bin" +glabel gspF3DZEX2_PosLight_fifoTextEnd + +.balign 16 +glabel gspF3DLX2_Rej_fifoTextStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej.bin" +glabel gspF3DLX2_Rej_fifoTextEnd + +.balign 16 +glabel gspS2DEX2_fifoTextStart + .incbin "lib/PR/s2dex2/S2DEX2.bin" +glabel gspS2DEX2_fifoTextEnd + +.balign 16 +glabel gspL3DZEX2_PosLight_fifoTextStart + .incbin "lib/PR/f3dzex/L3DZEX.bin" +glabel gspL3DZEX2_PosLight_fifoTextEnd + /* Audio Bins */ /* @@ -145,22 +160,6 @@ glabel gspL3DEX2_fifoTextStart glabel gspL3DEX2_fifoTextEnd #endif -/* Line3DZEX Text */ -#ifdef L3DZEX_GBI -.balign 16 -glabel gspL3DZEX2_PosLight_fifoTextStart - .incbin "lib/PR/f3dzex/L3DZEX.bin" -glabel gspL3DZEX2_PosLight_fifoTextEnd -#endif - -/* S2DEX2 Text */ -#ifdef S2DEX_GBI_2 -.balign 16 -glabel gspS2DEX2_fifoTextStart - .incbin "lib/PR/s2dex2/S2DEX2.bin" -glabel gspS2DEX2_fifoTextEnd -#endif - /* DATA SECTION START */ .section .rodata @@ -171,34 +170,49 @@ glabel gspS2DEX2_fifoTextEnd glabel gspSuper3D_fifoDataStart .incbin "lib/PR/super3d/Super3D_data.bin" glabel gspSuper3D_fifoDataEnd -#else + #else glabel gspFast3D_fifoDataStart .incbin "rsp/fast3d_data.bin" glabel gspFast3D_fifoDataEnd -#endif + #endif #else /* Using one of the Fast3DEX series grucodes */ - #ifndef F3DZEX_GBI_2 #if F3DEX2PL_GBI == 1 glabel gspF3DEX2_PosLight_fifoDataStart .incbin "lib/PR/f3dex2pl/F3DEX2_PosLight_data.bin" glabel gspF3DEX2_PosLight_fifoDataEnd - #elif F3DEX_GBI_2 == 1 - glabel gspF3DEX2_fifoDataStart - .incbin "lib/PR/f3dex2/F3DEX2_data.bin" - glabel gspF3DEX2_fifoDataEnd #elif F3DEX_GBI == 1 glabel gspF3DEX_fifoDataStart .incbin "lib/PR/f3dex/F3DEX_data.bin" glabel gspF3DEX_fifoDataEnd #endif - #else /* Fast3DZEX */ - glabel gspF3DZEX2_PosLight_fifoDataStart - .incbin "lib/PR/f3dzex/F3DZEX_data.bin" - glabel gspF3DZEX2_PosLight_fifoDataEnd - #endif #endif +.balign 16 +glabel gspF3DEX2_fifoDataStart + .incbin "lib/PR/f3dex2/F3DEX2_data.bin" +glabel gspF3DEX2_fifoDataEnd + +.balign 16 +glabel gspF3DZEX2_PosLight_fifoDataStart + .incbin "lib/PR/f3dzex/F3DZEX_data.bin" +glabel gspF3DZEX2_PosLight_fifoDataEnd + +.balign 16 +glabel gspF3DLX2_Rej_fifoDataStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej_data.bin" +glabel gspF3DLX2_Rej_fifoDataEnd + +.balign 16 +glabel gspS2DEX_fifoDataStart + .incbin "lib/PR/s2dex/S2DEX_data.bin" +glabel gspS2DEX_fifoDataEnd + +.balign 16 +glabel gspS2DEX2_fifoDataStart + .incbin "lib/PR/s2dex2/S2DEX2_data.bin" +glabel gspS2DEX2_fifoDataEnd + /* Audio Data */ .balign 16 @@ -254,14 +268,6 @@ glabel gspL3DEX_fifoDataStart glabel gspL3DEX_fifoDataEnd #endif -/* S2DEX Data */ -#ifdef S2DEX_GBI -.balign 16 -glabel gspS2DEX_fifoDataStart - .incbin "lib/PR/s2dex/S2DEX_data.bin" -glabel gspS2DEX_fifoDataEnd -#endif - /* Fast3DEX2 Series */ /* Fast3DEX2 NoN Data */ @@ -303,11 +309,3 @@ glabel gspL3DZEX2_PosLight_fifoDataStart .incbin "lib/PR/f3dzex/L3DZEX_data.bin" glabel gspL3DZEX2_PosLight_fifoDataEnd #endif - -/* S2DEX2 Data */ -#ifdef S2DEX_GBI_2 -.balign 16 -glabel gspS2DEX2_fifoDataStart - .incbin "lib/PR/s2dex2/S2DEX2_data.bin" -glabel gspS2DEX2_fifoDataEnd -#endif diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 52b13e2c..d1542bb3 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -905,7 +905,7 @@ static BhvCommandProc BehaviorCmdTable[] = { // Execute the behavior script of the current object, process the object flags, and other miscellaneous code for updating objects. void cur_obj_update(void) { - s32 objFlags = gCurrentObject->oFlags; + u32 objFlags = gCurrentObject->oFlags; f32 distanceFromMario; BhvCommandProc bhvCmdProc; s32 bhvProcResult; @@ -981,6 +981,12 @@ void cur_obj_update(void) { obj_update_gfx_pos_and_angle(gCurrentObject); } + + if (objFlags & OBJ_FLAG_UCODE_LARGE) + gCurrentObject->header.gfx.uCode = UCODE_DEFAULT; + else + gCurrentObject->header.gfx.uCode = UCODE_REJ; + #ifdef PUPPYLIGHTS puppylights_object_emit(gCurrentObject); #endif diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index 89276f59..36b21220 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -7,6 +7,9 @@ #include "types.h" #include "game/memory.h" +#define UCODE_DEFAULT 0 +#define UCODE_REJ 1 + #define GRAPH_RENDER_ACTIVE (1 << 0) #define GRAPH_RENDER_CHILDREN_FIRST (1 << 1) #define GRAPH_RENDER_BILLBOARD (1 << 2) @@ -126,8 +129,8 @@ struct DisplayListNode struct GraphNodeMasterList { /*0x00*/ struct GraphNode node; - /*0x14*/ struct DisplayListNode *listHeads[GFX_NUM_MASTER_LISTS]; - /*0x34*/ struct DisplayListNode *listTails[GFX_NUM_MASTER_LISTS]; + /*0x14*/ struct DisplayListNode *listHeads[2][GFX_NUM_MASTER_LISTS]; + /*0x34*/ struct DisplayListNode *listTails[2][GFX_NUM_MASTER_LISTS]; }; /** Simply used as a parent to group multiple children. diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 239e79f5..7940c50e 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -963,7 +963,7 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { } profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); - init_rcp(); + init_rcp(CLEAR_ZBUFFER); render_game(); end_master_display_list(); alloc_display_list(0); diff --git a/src/game/crash_screen.c b/src/game/crash_screen.c index ac7a284f..d2b274b8 100644 --- a/src/game/crash_screen.c +++ b/src/game/crash_screen.c @@ -111,9 +111,8 @@ void crash_screen_print(s32 x, s32 y, const char *fmt, ...) { u32 glyph; s32 size; char buf[0x108]; - UNUSED s32 i = 0; - memset(buf, 0, sizeof(buf)); + bzero(&buf ,sizeof(buf)); va_list args; va_start(args, fmt); diff --git a/src/game/game_init.c b/src/game/game_init.c index e98fc46c..491d6a15 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -125,9 +125,7 @@ void init_rdp(void) { gDPSetColorDither(gDisplayListHead++, G_CD_MAGICSQ); gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); -#ifdef VERSION_SH gDPSetAlphaDither(gDisplayListHead++, G_AD_PATTERN); -#endif gDPPipeSync(gDisplayListHead++); } @@ -135,6 +133,7 @@ void init_rdp(void) { * Sets the initial RSP (Reality Signal Processor) settings. */ void init_rsp(void) { + gSPClearGeometryMode(gDisplayListHead++, G_SHADE | G_SHADING_SMOOTH | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD); @@ -153,13 +152,15 @@ void init_rsp(void) { /** * Initialize the z buffer for the current frame. */ -void init_z_buffer(void) { +void init_z_buffer(s32 resetZB) { gDPPipeSync(gDisplayListHead++); gDPSetDepthSource(gDisplayListHead++, G_ZS_PIXEL); gDPSetDepthImage(gDisplayListHead++, gPhysicalZBuffer); gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalZBuffer); + if (!resetZB) + return; gDPSetFillColor(gDisplayListHead++, GPACK_ZDZ(G_MAXFBZ, 0) << 16 | GPACK_ZDZ(G_MAXFBZ, 0)); @@ -273,7 +274,7 @@ void create_gfx_task_structure(void) { gGfxSPTask->task.t.type = M_GFXTASK; gGfxSPTask->task.t.ucode_boot = rspbootTextStart; gGfxSPTask->task.t.ucode_boot_size = ((u8 *) rspbootTextEnd - (u8 *) rspbootTextStart); - gGfxSPTask->task.t.flags = 0; + gGfxSPTask->task.t.flags = OS_TASK_LOADABLE | OS_TASK_DP_WAIT; #ifdef L3DEX2_ALONE gGfxSPTask->task.t.ucode = gspL3DEX2_fifoTextStart; gGfxSPTask->task.t.ucode_data = gspL3DEX2_fifoDataStart; @@ -312,11 +313,11 @@ void create_gfx_task_structure(void) { /** * Set default RCP (Reality Co-Processor) settings. */ -void init_rcp(void) { +void init_rcp(s32 resetZB) { move_segment_table_to_dmem(); init_rdp(); init_rsp(); - init_z_buffer(); + init_z_buffer(resetZB); select_frame_buffer(); } @@ -381,7 +382,7 @@ void render_init(void) { gGfxSPTask = &gGfxPool->spTask; gDisplayListHead = gGfxPool->buffer; gGfxPoolEnd = (u8 *)(gGfxPool->buffer + GFX_POOL_SIZE); - init_rcp(); + init_rcp(CLEAR_ZBUFFER); clear_frame_buffer(0); end_master_display_list(); exec_display_list(&gGfxPool->spTask); diff --git a/src/game/game_init.h b/src/game/game_init.h index a61e2d60..0c1d170d 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -24,6 +24,11 @@ struct DemoInput u8 buttonMask; }; +enum ZBmodes { + KEEP_ZBUFFER = 0, + CLEAR_ZBUFFER = 1, +}; + extern struct Controller gControllers[3]; extern OSContStatus gControllerStatuses[4]; extern OSContPad gControllerPads[4]; @@ -79,7 +84,7 @@ void thread5_game_loop(UNUSED void *arg); void clear_frame_buffer(s32 color); void clear_viewport(Vp *viewport, s32 color); void make_viewport_clip_rect(Vp *viewport); -void init_rcp(void); +void init_rcp(s32 resetZB); void end_master_display_list(void); void render_init(void); void select_gfx_pool(void); diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index a2bc7072..02701875 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -137,16 +137,54 @@ u16 gAreaUpdateCounter = 0; LookAt lookAt; #endif +u8 ucodeTestSwitch = 1; + /** - * Process a master list node. + * Process a master list node. This has been modified, so now it runs twice, for each microcode. + It iterates through the first 5 layers of if the first index using F3DLX2.Rej, then it switches + to F3DZEX and iterates through all layers, then switches back to F3DLX2.Rej and finishes the last + 3. It does this, because layers 5-7 are non zbuffered, and just doing 0-7 of ZEX, then 0-7 of REJ + would make the ZEX 0-4 render on top of Rej's 5-7. */ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; - s32 i; + s32 i = 0; + s32 j = 1; + s32 renderPhase = 0; s32 enableZBuffer = (node->node.flags & GRAPH_RENDER_Z_BUFFER) != 0; struct RenderModeContainer *modeList = &renderModeTable_1Cycle[enableZBuffer]; struct RenderModeContainer *mode2List = &renderModeTable_2Cycle[enableZBuffer]; + if (enableZBuffer != 0) + { + gDPPipeSync(gDisplayListHead++); + gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); + } + //if (gPlayer1Controller->buttonPressed & L_TRIG) + // ucodeTestSwitch ^= 1; + //print_text_fmt_int(32,32,"%d",ucodeTestSwitch); +#ifdef F3DZEX_GBI_2 + loopBegin: + //Load rejection on pass 2. ZEX is loaded afterwards. + if (renderPhase == 0 || renderPhase == 2) + { + gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); + init_rcp(KEEP_ZBUFFER); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); + } + else + if (renderPhase == 1) + { + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(KEEP_ZBUFFER); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); + } + if (enableZBuffer != 0) + { + gDPPipeSync(gDisplayListHead++); + gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); + } +#endif // @bug This is where the LookAt values should be calculated but aren't. // As a result, environment mapping is broken on Fast3DEX2 without the // changes below. @@ -154,24 +192,35 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { Mtx lMtx; guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); #endif - - if (enableZBuffer != 0) { - gDPPipeSync(gDisplayListHead++); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); - } - - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) { - if ((currList = node->listHeads[i]) != NULL) { + for (; i < GFX_NUM_MASTER_LISTS; i++) + { +#ifdef F3DZEX_GBI_2 + if (i == 5 && renderPhase == 0) + break; +#endif + if ((currList = node->listHeads[j][i]) != NULL) + { gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); - while (currList != NULL) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), - G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); + while (currList != NULL) + { + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPDisplayList(gDisplayListHead++, currList->displayList); currList = currList->next; } } } - if (enableZBuffer != 0) { +#ifdef F3DZEX_GBI_2 + switch (renderPhase) + { + case 0: renderPhase++; j = 0; i = 0; goto loopBegin; + case 1: renderPhase++; j = 1; i = 5; goto loopBegin; + } + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(KEEP_ZBUFFER); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); +#endif + if (enableZBuffer != 0) + { gDPPipeSync(gDisplayListHead++); gSPClearGeometryMode(gDisplayListHead++, G_ZBUFFER); } @@ -182,24 +231,35 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { * parameter. Look at the RenderModeContainer struct to see the corresponding * render modes of layers. */ -static void geo_append_display_list(void *displayList, s16 layer) { - +static void geo_append_display_list(void *displayList, s32 layer) +{ + s32 index = 0; #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); #endif - if (gCurGraphNodeMasterList != 0) { - struct DisplayListNode *listNode = - alloc_only_pool_alloc(gDisplayListHeap, sizeof(struct DisplayListNode)); +#ifdef F3DZEX_GBI_2 + if (gCurGraphNodeObject != NULL) + { + if (gCurGraphNodeObject->uCode == UCODE_REJ && ucodeTestSwitch) + index = 1; + } +#endif + if (gCurGraphNodeMasterList != 0) + { + struct DisplayListNode *listNode = alloc_only_pool_alloc(gDisplayListHeap, sizeof(struct DisplayListNode)); listNode->transform = gMatStackFixed[gMatStackIndex]; listNode->displayList = displayList; listNode->next = 0; - if (gCurGraphNodeMasterList->listHeads[layer] == 0) { - gCurGraphNodeMasterList->listHeads[layer] = listNode; - } else { - gCurGraphNodeMasterList->listTails[layer]->next = listNode; + if (gCurGraphNodeMasterList->listHeads[index][layer] == 0) + { + gCurGraphNodeMasterList->listHeads[index][layer] = listNode; } - gCurGraphNodeMasterList->listTails[layer] = listNode; + else + { + gCurGraphNodeMasterList->listTails[index][layer]->next = listNode; + } + gCurGraphNodeMasterList->listTails[index][layer] = listNode; } } @@ -209,13 +269,16 @@ static void geo_append_display_list(void *displayList, s16 layer) { static void geo_process_master_list(struct GraphNodeMasterList *node) { s32 i; - if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) { + if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) + { gCurGraphNodeMasterList = node; - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) { - node->listHeads[i] = NULL; + for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) + { + node->listHeads[0][i] = NULL; + node->listHeads[1][i] = NULL; } geo_process_node_and_siblings(node->node.children); - geo_process_master_list_sub(node); + geo_process_master_list_sub(gCurGraphNodeMasterList); gCurGraphNodeMasterList = NULL; } } @@ -772,8 +835,8 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { * Since (0,0,0) is unaffected by rotation, columns 0, 1 and 2 are ignored. */ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { - s16 cullingRadius; - s16 halfFov; // half of the fov in in-game angle units instead of degrees + s32 cullingRadius; + s32 halfFov; // half of the fov in in-game angle units instead of degrees struct GraphNode *geo; f32 hScreenEdge; diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index eb42bd04..f0064eec 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -286,6 +286,7 @@ struct Object *allocate_object(struct ObjectNode *objList) { obj->header.gfx.pos[1] = -10000.0f; obj->header.gfx.pos[2] = -10000.0f; obj->header.gfx.throwMatrix = NULL; + obj->header.gfx.uCode = UCODE_REJ; #ifdef PUPPYLIGHTS obj->oLightID = 0xFFFF; #endif diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 6e8dd3a8..34c9a064 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -510,11 +510,11 @@ static Gfx gd_dl_sparkle[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR), gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_NOOP2), gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON), - gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, + gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, + gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPSetTileSize(0, 0, 0, (32 - 1) << G_TEXTURE_IMAGE_FRAC, (32 - 1) << G_TEXTURE_IMAGE_FRAC), gsSPVertex(gd_vertex_sparkle, 4, 0), @@ -663,7 +663,7 @@ static Gfx gd_dl_mario_face_shine[] = { gsDPSetTexturePersp(G_TP_PERSP), gsDPSetTextureFilter(G_TF_BILERP), gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA), - gsDPLoadTextureBlock(gd_texture_mario_face_shine, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, + gsDPLoadTextureBlock(gd_texture_mario_face_shine, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 5, 5, G_TX_NOLOD, G_TX_NOLOD), gsDPPipeSync(), gsSPEndDisplayList(), @@ -1192,7 +1192,7 @@ void print_gdm_stats(void) { /* 24AC80 -> 24AD14; orig name: func_8019C4B0 */ struct ObjView *make_view_withgrp(char *name, struct ObjGroup *grp) { - struct ObjView *view = make_view(name, (VIEW_DRAW | VIEW_ALLOC_ZBUF | VIEW_MOVEMENT), 1, 0, 0, 320, 240, grp); + struct ObjView *view = make_view(name, (VIEW_DRAW | VIEW_ALLOC_ZBUF | VIEW_MOVEMENT), 1, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, grp); UNUSED struct ObjGroup *viewgrp = make_group(2, grp, view); view->lights = gGdLightGroup; @@ -1270,7 +1270,7 @@ void gd_vblank(void) { } /** - * Copies the player1 controller data from p1cont to sGdContPads[0]. + * Copies the player1 controller data from p1cont to sGdContPads[0]. */ void gd_copy_p1_contpad(OSContPad *p1cont) { u32 i; // 24 @@ -1942,7 +1942,7 @@ Vtx *gd_dl_make_vertex(f32 x, f32 y, f32 z, f32 alpha) { /* 24E6C0 -> 24E724 */ void func_8019FEF0(void) { sTriangleBufCount++; - if (sVertexBufCount >= 12) { + if (sVertexBufCount >= 30) { gd_dl_flush_vertices(); func_801A0038(); } @@ -2366,7 +2366,7 @@ void parse_p1_controller(void) { OSContPad *currInputs; OSContPad *prevInputs; - // Copy current inputs to previous + // Copy current inputs to previous u8 *src = (u8 *) gdctrl; u8 *dest = (u8 *) gdctrl->prevFrame; for (i = 0; i < sizeof(struct GdControl); i++) { @@ -2891,7 +2891,7 @@ void Unknown801A4F58(void) { cbufOn = sScreenView->colourBufs[gGdFrameBufNum]; zbuf = sScreenView->zbuf; - for (i = 0; i < (320 * 240); i++) { // L801A4FCC + for (i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i++) { // L801A4FCC colour = cbufOff[i]; if (colour) { r = (s16)(colour >> 11 & 0x1F); @@ -3000,7 +3000,7 @@ void gd_init(void) { sScreenView = make_view("screenview2", (VIEW_2_COL_BUF | VIEW_UNK_1000 | VIEW_COLOUR_BUF | VIEW_Z_BUF), 0, 0, - 0, 320, 240, NULL); + 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL); sScreenView->colour.r = 0.0f; sScreenView->colour.g = 0.0f; sScreenView->colour.b = 0.0f; @@ -3033,7 +3033,7 @@ void gd_init(void) { * functions from IRIS GL. * @param buf pointer to an array of 16-bit values * @param len maximum number of values to store - */ + */ void init_pick_buf(s16 *buf, s32 len) { buf[0] = 0; buf[1] = 0; @@ -3105,8 +3105,8 @@ void Unknown801A5C80(struct ObjGroup *parentGroup) { d_end_group("debugg"); debugGroup = (struct ObjGroup *) d_use_obj("debugg"); - make_view("debugview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_DRAW), 2, 0, 0, 320, - 240, debugGroup); + make_view("debugview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_DRAW), 2, 0, 0, SCREEN_WIDTH, + SCREEN_HEIGHT, debugGroup); if (parentGroup != NULL) { addto_group(parentGroup, &debugGroup->header); @@ -3149,7 +3149,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { d_add_valproc(cvrt_val_to_kb); sp23C = TRUE; sp244 += 14; - if (sp244 > 200) { + if (sp244 > SCREEN_HEIGHT) { break; } } @@ -3167,7 +3167,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { memview = make_view("memview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_UNK_2000 | VIEW_UNK_4000 | VIEW_1_CYCLE | VIEW_DRAW), - 2, 0, 10, 320, 200, labelgrp); + 2, 0, 10, SCREEN_WIDTH, SCREEN_HEIGHT-40, labelgrp); memview->colour.r = 0.0f; memview->colour.g = 0.0f; memview->colour.b = 0.0f; @@ -3407,7 +3407,7 @@ void make_timer_gadgets(void) { timerg = (struct ObjGroup *) d_use_obj("timerg"); timersview = make_view( "timersview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_MOVEMENT | VIEW_DRAW), 2, - 0, 10, 320, 270, timerg); + 0, 10, SCREEN_WIDTH, SCREEN_HEIGHT+30, timerg); timersview->colour.r = 0.0f; timersview->colour.g = 0.0f; timersview->colour.b = 0.0f; @@ -3472,7 +3472,7 @@ struct GdObj *load_dynlist(struct DynList *dynlist) { fatal_printf("load_dynlist() unkown bank"); } -#define PAGE_SIZE 65536 // size of a 64K TLB page +#define PAGE_SIZE 65536 // size of a 64K TLB page segSize = dynlistSegEnd - dynlistSegStart; allocSegSpace = gd_malloc_temp(segSize + PAGE_SIZE);