2525
2626#define JF_CAMBASE 0x1FFE7C
2727#define JF_CAMBASE_SANITY_1_VALUE 0x450B0010
28+ #define JF_CAMBASE_SANITY_2_VALUE 0x17040010
2829// offsets from cambase
2930#define JF_CAMX 0x74
3031#define JF_CAMY 0x78
3132#define JF_CAMY_SIGN 0x7A
3233#define JF_CAMBASE_SANITY_1 -0x30
33- #define JF_DISABLE_CAMY 0xDD760
3434
35- // #define JF_CAMX 0x138144
36- // #define JF_CAMY 0x138148
37- // #define JF_CAMY_SIGN 0x13814A
38- #define JF_AUTO_LOOK_BELOW 0x102724
3935#define JF_IS_STAGE_CLEAR 0x1FDBE0
36+ #define JF_IS_PAUSED 0x47E54
4037
4138static uint8_t PS1_JF_Status (void );
4239static uint8_t PS1_JF_IsCambaseValid (void );
@@ -63,12 +60,20 @@ static float yAccumulator = 0.f;
6360//==========================================================================
6461static uint8_t PS1_JF_Status (void )
6562{
66- return (PS1_MEM_ReadWord (0x943C ) == 0x53435553U && PS1_MEM_ReadWord (0x9440 ) == 0x5F393431U && PS1_MEM_ReadWord (0x9444 ) == 0x2E30333BU );
63+ return (PS1_MEM_ReadWord (0x943C ) == 0x53435553U &&
64+ PS1_MEM_ReadWord (0x9440 ) == 0x5F393431U &&
65+ PS1_MEM_ReadWord (0x9444 ) == 0x2E30333BU );
66+
67+ // for no$psx debugger
68+ // return (PS1_MEM_ReadWord(0x0) == 0x03000000 &&
69+ // PS1_MEM_ReadWord(0x4) == 0x800C5A27 &&
70+ // PS1_MEM_ReadWord(0x8) == 0x08004003);
6771}
6872
6973static uint8_t PS1_JF_IsCambaseValid (void )
7074{
71- if (PS1_MEM_ReadWord (camBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_1_VALUE ){
75+ if (PS1_MEM_ReadWord (camBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_1_VALUE ||
76+ PS1_MEM_ReadWord (camBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_2_VALUE ){
7277 return 1 ;
7378 }
7479 return 0 ;
@@ -77,7 +82,8 @@ static uint8_t PS1_JF_IsCambaseValid(void)
7782static uint8_t PS1_JF_DetectCambase (void )
7883{
7984 uint32_t tempCamBase = PS1_MEM_ReadPointer (JF_CAMBASE );
80- if (PS1_MEM_ReadWord (tempCamBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_1_VALUE )
85+ if (PS1_MEM_ReadWord (tempCamBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_1_VALUE ||
86+ PS1_MEM_ReadWord (tempCamBase + JF_CAMBASE_SANITY_1 ) == JF_CAMBASE_SANITY_2_VALUE )
8187 {
8288 camBase = tempCamBase ;
8389 return 1 ;
@@ -91,14 +97,7 @@ static uint8_t PS1_JF_DetectCambase(void)
9197//==========================================================================
9298static void PS1_JF_Inject (void )
9399{
94- // TODO: find auto-center cheat/solution that doesn't wholly disable camY movement with controller
95- // TODO: disable mouse movement on stage clear, on platform, boss defeated
96- // TODO: disable mouse movement in menu/paused
97- // TODO: find cheat for Extra World 2
98-
99- // PS1_MEM_WriteWord(JF_AUTO_LOOK_BELOW, 0x0);
100-
101- // PS1_MEM_WriteWord(JF_DISABLE_CAMY, 0x0);
100+ // TODO: find better camBase sanity
102101
103102 if (xmouse == 0 && ymouse == 0 ) // if mouse is idle
104103 return ;
@@ -112,9 +111,12 @@ static void PS1_JF_Inject(void)
112111
113112 if (PS1_MEM_ReadWord (JF_IS_STAGE_CLEAR ))
114113 return ;
114+
115+ if (PS1_MEM_ReadWord (JF_IS_PAUSED ))
116+ return ;
115117
116118 uint16_t camX = PS1_MEM_ReadHalfword (camBase + JF_CAMX );
117- uint16_t camY = PS1_MEM_ReadHalfword (camBase + JF_CAMY );
119+ int16_t camY = PS1_MEM_ReadInt16 (camBase + JF_CAMY );
118120 float camXF = (float )camX ;
119121 float camYF = (float )camY ;
120122
@@ -128,26 +130,9 @@ static void PS1_JF_Inject(void)
128130 float dy = - ym * looksensitivity * scale ;
129131 AccumulateAddRemainder (& camYF , & yAccumulator , - ym , dy );
130132
131- camX = (uint16_t )camXF ;
132- camY = (uint16_t )camYF ;
133-
134- // if (camYF < 0 || camY > 32000)
135- if (camY > 32000 )
136- PS1_MEM_WriteHalfword (camBase + JF_CAMY_SIGN , 0xFFFF );
137- else
138- PS1_MEM_WriteHalfword (camBase + JF_CAMY_SIGN , 0x0 );
139-
140-
141133 // clamp y-axis
142- if (camY > 776 && camY < 32000 )
143- camY = 776 ;
144- if (camY < 64640 && camY > 32000 )
145- camY = 64640 ;
146-
147- PS1_MEM_WriteHalfword (camBase + JF_CAMX , (uint16_t )camX );
148- PS1_MEM_WriteHalfword (camBase + JF_CAMY , (uint16_t )camY );
134+ camYF = ClampFloat (camYF , -896 , 896 );
149135
150- // PS1_MEM_WriteHalfword(JF_CAMX, (uint16_t)camXF);
151- // PS1_MEM_WriteHalfword(JF_CAMY, (uint16_t)camYF);
152- // PS1_MEM_WriteWord(JF_CAMY, (uint32_t)camYF);
136+ PS1_MEM_WriteHalfword (camBase + JF_CAMX , (uint16_t )camXF );
137+ PS1_MEM_WriteInt16 (camBase + JF_CAMY , (int16_t )camYF );
153138}
0 commit comments