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