--- SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2006/01/21 17:18:53 1.67 +++ SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2006/07/09 12:15:48 1.71 @@ -89,6 +89,7 @@ extern uintptr SignalStackBase(); // From rsrc_patches.cpp extern "C" void check_load_invoc(uint32 type, int16 id, uint32 h); +extern "C" void named_check_load_invoc(uint32 type, uint32 name, uint32 h); // PowerPC EmulOp to exit from emulation looop const uint32 POWERPC_EXEC_RETURN = POWERPC_EMUL_OP | 1; @@ -335,6 +336,7 @@ int sheepshaver_cpu::compile1(codegen_co status = COMPILE_CODE_OK; break; } +#endif case NATIVE_CHECK_LOAD_INVOC: dg.gen_load_T0_GPR(3); dg.gen_load_T1_GPR(4); @@ -343,18 +345,48 @@ int sheepshaver_cpu::compile1(codegen_co dg.gen_invoke_T0_T1_T2((void (*)(uint32, uint32, uint32))check_load_invoc); status = COMPILE_CODE_OK; break; -#endif - case NATIVE_BITBLT: + case NATIVE_NAMED_CHECK_LOAD_INVOC: + dg.gen_load_T0_GPR(3); + dg.gen_load_T1_GPR(4); + dg.gen_load_T2_GPR(5); + dg.gen_invoke_T0_T1_T2((void (*)(uint32, uint32, uint32))named_check_load_invoc); + status = COMPILE_CODE_OK; + break; + case NATIVE_NQD_SYNC_HOOK: + dg.gen_load_T0_GPR(3); + dg.gen_invoke_T0_ret_T0((uint32 (*)(uint32))NQD_sync_hook); + dg.gen_store_T0_GPR(3); + status = COMPILE_CODE_OK; + break; + case NATIVE_NQD_BITBLT_HOOK: + dg.gen_load_T0_GPR(3); + dg.gen_invoke_T0_ret_T0((uint32 (*)(uint32))NQD_bitblt_hook); + dg.gen_store_T0_GPR(3); + status = COMPILE_CODE_OK; + break; + case NATIVE_NQD_FILLRECT_HOOK: + dg.gen_load_T0_GPR(3); + dg.gen_invoke_T0_ret_T0((uint32 (*)(uint32))NQD_fillrect_hook); + dg.gen_store_T0_GPR(3); + status = COMPILE_CODE_OK; + break; + case NATIVE_NQD_UNKNOWN_HOOK: + dg.gen_load_T0_GPR(3); + dg.gen_invoke_T0_ret_T0((uint32 (*)(uint32))NQD_unknown_hook); + dg.gen_store_T0_GPR(3); + status = COMPILE_CODE_OK; + break; + case NATIVE_NQD_BITBLT: dg.gen_load_T0_GPR(3); dg.gen_invoke_T0((void (*)(uint32))NQD_bitblt); status = COMPILE_CODE_OK; break; - case NATIVE_INVRECT: + case NATIVE_NQD_INVRECT: dg.gen_load_T0_GPR(3); dg.gen_invoke_T0((void (*)(uint32))NQD_invrect); status = COMPILE_CODE_OK; break; - case NATIVE_FILLRECT: + case NATIVE_NQD_FILLRECT: dg.gen_load_T0_GPR(3); dg.gen_invoke_T0((void (*)(uint32))NQD_fillrect); status = COMPILE_CODE_OK; @@ -365,8 +397,8 @@ int sheepshaver_cpu::compile1(codegen_co if (!FN_field::test(opcode)) cg_context.done_compile = false; else { - dg.gen_load_A0_LR(); - dg.gen_set_PC_A0(); + dg.gen_load_T0_LR_aligned(); + dg.gen_set_PC_T0(); cg_context.done_compile = true; } break; @@ -376,8 +408,8 @@ int sheepshaver_cpu::compile1(codegen_co if (!FN_field::test(opcode)) dg.gen_set_PC_im(cg_context.pc + 4); else { - dg.gen_load_A0_LR(); - dg.gen_set_PC_A0(); + dg.gen_load_T0_LR_aligned(); + dg.gen_set_PC_T0(); } dg.gen_mov_32_T0_im(selector); dg.gen_jmp(native_op_trampoline); @@ -971,12 +1003,6 @@ void HandleInterrupt(powerpc_registers * } } -static void get_resource(void); -static void get_1_resource(void); -static void get_ind_resource(void); -static void get_1_ind_resource(void); -static void r_get_resource(void); - // Execute NATIVE_OP routine void sheepshaver_cpu::execute_native_op(uint32 selector) { @@ -1031,22 +1057,25 @@ void sheepshaver_cpu::execute_native_op( case NATIVE_ETHER_RSRV: gpr(3) = ether_rsrv((queue_t *)gpr(3)); break; - case NATIVE_SYNC_HOOK: + case NATIVE_NQD_SYNC_HOOK: gpr(3) = NQD_sync_hook(gpr(3)); break; - case NATIVE_BITBLT_HOOK: + case NATIVE_NQD_UNKNOWN_HOOK: + gpr(3) = NQD_unknown_hook(gpr(3)); + break; + case NATIVE_NQD_BITBLT_HOOK: gpr(3) = NQD_bitblt_hook(gpr(3)); break; - case NATIVE_BITBLT: + case NATIVE_NQD_BITBLT: NQD_bitblt(gpr(3)); break; - case NATIVE_FILLRECT_HOOK: + case NATIVE_NQD_FILLRECT_HOOK: gpr(3) = NQD_fillrect_hook(gpr(3)); break; - case NATIVE_INVRECT: + case NATIVE_NQD_INVRECT: NQD_invrect(gpr(3)); break; - case NATIVE_FILLRECT: + case NATIVE_NQD_FILLRECT: NQD_fillrect(gpr(3)); break; case NATIVE_SERIAL_NOTHING: @@ -1070,27 +1099,29 @@ void sheepshaver_cpu::execute_native_op( break; } case NATIVE_GET_RESOURCE: + get_resource(ReadMacInt32(XLM_GET_RESOURCE)); + break; case NATIVE_GET_1_RESOURCE: + get_resource(ReadMacInt32(XLM_GET_1_RESOURCE)); + break; case NATIVE_GET_IND_RESOURCE: + get_resource(ReadMacInt32(XLM_GET_IND_RESOURCE)); + break; case NATIVE_GET_1_IND_RESOURCE: - case NATIVE_R_GET_RESOURCE: { - typedef void (*GetResourceCallback)(void); - static const GetResourceCallback get_resource_callbacks[] = { - ::get_resource, - ::get_1_resource, - ::get_ind_resource, - ::get_1_ind_resource, - ::r_get_resource - }; - get_resource_callbacks[selector - NATIVE_GET_RESOURCE](); + get_resource(ReadMacInt32(XLM_GET_1_IND_RESOURCE)); + break; + case NATIVE_R_GET_RESOURCE: + get_resource(ReadMacInt32(XLM_R_GET_RESOURCE)); break; - } case NATIVE_MAKE_EXECUTABLE: MakeExecutable(0, gpr(4), gpr(5)); break; case NATIVE_CHECK_LOAD_INVOC: check_load_invoc(gpr(3), gpr(4), gpr(5)); break; + case NATIVE_NAMED_CHECK_LOAD_INVOC: + named_check_load_invoc(gpr(3), gpr(4), gpr(5)); + break; default: printf("FATAL: NATIVE_OP called with bogus selector %d\n", selector); QuitEmulator(); @@ -1177,32 +1208,3 @@ uint32 call_macos7(uint32 tvect, uint32 const uint32 args[] = { arg1, arg2, arg3, arg4, arg5, arg6, arg7 }; return ppc_cpu->execute_macos_code(tvect, sizeof(args)/sizeof(args[0]), args); } - -/* - * Resource Manager thunks - */ - -void get_resource(void) -{ - ppc_cpu->get_resource(ReadMacInt32(XLM_GET_RESOURCE)); -} - -void get_1_resource(void) -{ - ppc_cpu->get_resource(ReadMacInt32(XLM_GET_1_RESOURCE)); -} - -void get_ind_resource(void) -{ - ppc_cpu->get_resource(ReadMacInt32(XLM_GET_IND_RESOURCE)); -} - -void get_1_ind_resource(void) -{ - ppc_cpu->get_resource(ReadMacInt32(XLM_GET_1_IND_RESOURCE)); -} - -void r_get_resource(void) -{ - ppc_cpu->get_resource(ReadMacInt32(XLM_R_GET_RESOURCE)); -}