This is a custom function written by Simon Lothar as there is no syscall which directly complements GetGetkeyToMainFunctionReturnFlag. However, EnableGetkeyToMainFunctionReturn and DisableGetkeyToMainFunctionReturn can enable and disable this (set to 1 or 0, respectively).
If SetGetkeyToMainFunctionReturnFlag is set to 0, Main Menu access will be disabled. Set to 1 to re-enable.
// the function assumes, that the RAM-pointer to GetkeyToMainFunctionReturnFlag is loaded
// immediately by a "Move Immediate Data"-instruction
unsigned int SetGetkeyToMainFunctionReturnFlag( unsigned int enabled ){
int addr, addr2;
// get the pointer to the syscall table
addr = *(unsigned char*)0x80020071; // get displacement
addr++;
addr *= 4;
addr += 0x80020070;
addr = *(unsigned int*)addr;
if ( addr < 0x80020070 ) return 0x101;
if ( addr >= 0x81000000 ) return 0x102;
// get the pointer to syscall 1E99
addr += 0x1E99*4;
if ( addr < 0x80020070 ) return 0x103;
if ( addr >= 0x81000000 ) return 0x104;
addr = *(unsigned int*)addr;
if ( addr < 0x80020070 ) return 0x105;
if ( addr >= 0x81000000 ) return 0x106;
switch ( *(unsigned char*)addr ){
case 0xD0 : // MOV.L @( disp, PC), Rn (REJ09B0317-0400 Rev. 4.00 May 15, 2006 page 216)
case 0xD1 :
case 0xD2 :
case 0xD3 :
case 0xD4 :
case 0xD5 :
case 0xD6 :
case 0xD7 :
case 0xD8 :
addr2 = *(unsigned char*)( addr + 1 ); // get displacement
addr2++;
addr2 *= 4;
addr2 += addr;
addr2 &= ~3;
if ( addr2 < 0x80020070 ) return 0x107;
if ( addr2 >= 0x81000000 ) return 0x108;
addr = *(unsigned int*)addr2;
if ( ( addr & 0xFF000000 ) != 0x88000000 && ( addr & 0xFF000000 ) != 0x8C000000 ) return 0x109; // Changed to work on fx-CG 50 as well as 10/20.
// finally perform the desired operation and set the flag:
if ( enabled ) *(unsigned char*)addr = 0;
else *(unsigned char*)addr = 3;
break;
default : addr = 0x100;
}
return addr;
}