1 |
|
/* |
2 |
|
* emul_op.cpp - 68k opcodes for ROM patches |
3 |
|
* |
4 |
< |
* SheepShaver (C) 1997-2002 Christian Bauer and Marc Hellwig |
4 |
> |
* SheepShaver (C) 1997-2004 Christian Bauer and Marc Hellwig |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
45 |
|
#include "name_registry.h" |
46 |
|
#include "user_strings.h" |
47 |
|
#include "emul_op.h" |
48 |
+ |
#include "thunks.h" |
49 |
|
|
50 |
|
#define DEBUG 0 |
51 |
|
#include "debug.h" |
261 |
|
// Patch MakeExecutable() |
262 |
|
MakeExecutableTvec = (uint32 *)FindLibSymbol("\023PrivateInterfaceLib", "\016MakeExecutable"); |
263 |
|
D(bug("MakeExecutable TVECT at %p\n", MakeExecutableTvec)); |
264 |
< |
#if EMULATED_PPC |
265 |
< |
MakeExecutableTvec[0] = POWERPC_NATIVE_OP_FUNC(NATIVE_MAKE_EXECUTABLE); |
265 |
< |
#else |
266 |
< |
#ifdef __BEOS__ |
267 |
< |
MakeExecutableTvec[0] = ((uint32 *)MakeExecutable)[0]; |
268 |
< |
#else |
269 |
< |
MakeExecutableTvec[0] = (uint32)MakeExecutable; |
270 |
< |
#endif |
264 |
> |
MakeExecutableTvec[0] = htonl(NativeFunction(NATIVE_MAKE_EXECUTABLE)); |
265 |
> |
#if !EMULATED_PPC |
266 |
|
MakeExecutableTvec[1] = (uint32)TOC; |
267 |
|
#endif |
268 |
|
|
269 |
|
// Patch DebugStr() |
270 |
< |
static const uint8 proc[] = { |
271 |
< |
M68K_EMUL_OP_DEBUG_STR >> 8, M68K_EMUL_OP_DEBUG_STR & 0xff, |
272 |
< |
0x4e, 0x74, // rtd #4 |
273 |
< |
0x00, 0x04 |
270 |
> |
static const uint16 proc[] = { |
271 |
> |
PW(M68K_EMUL_OP_DEBUG_STR), |
272 |
> |
PW(0x4e74), // rtd #4 |
273 |
> |
PW(0x0004) |
274 |
|
}; |
275 |
|
WriteMacInt32(0x1dfc, (uint32)proc); |
276 |
|
break; |
287 |
|
TimerReset(); |
288 |
|
MacOSUtilReset(); |
289 |
|
AudioReset(); |
290 |
< |
#if 0 |
291 |
< |
printf("DR activated\n"); |
292 |
< |
WriteMacInt32(KernelDataAddr + 0x17a0, 3); // Prepare for DR emulator activation |
293 |
< |
WriteMacInt32(KernelDataAddr + 0x17c0, DR_CACHE_BASE); |
294 |
< |
WriteMacInt32(KernelDataAddr + 0x17c4, DR_CACHE_SIZE); |
295 |
< |
WriteMacInt32(KernelDataAddr + 0x1b00, DR_CACHE_BASE + 0x10000); |
296 |
< |
memcpy((void *)(DR_CACHE_BASE + 0x10000), (void *)(ROM_BASE + 0x370000), 0x10000); |
297 |
< |
clear_caches((void *)(DR_CACHE_BASE + 0x10000), 0x10000, B_INVALIDATE_ICACHE | B_FLUSH_DCACHE); |
298 |
< |
#endif |
290 |
> |
|
291 |
> |
// Enable DR emulator |
292 |
> |
if (PrefsFindBool("jit68k")) { |
293 |
> |
D(bug("DR activated\n")); |
294 |
> |
WriteMacInt32(KernelDataAddr + 0x17a0, 3); // Prepare for DR emulator activation |
295 |
> |
WriteMacInt32(KernelDataAddr + 0x17c0, DR_CACHE_BASE); |
296 |
> |
WriteMacInt32(KernelDataAddr + 0x17c4, DR_CACHE_SIZE); |
297 |
> |
WriteMacInt32(KernelDataAddr + 0x1b04, DR_CACHE_BASE); |
298 |
> |
WriteMacInt32(KernelDataAddr + 0x1b00, DR_EMULATOR_BASE); |
299 |
> |
memcpy((void *)DR_EMULATOR_BASE, (void *)(ROM_BASE + 0x370000), DR_EMULATOR_SIZE); |
300 |
> |
MakeExecutable(0, (void *)DR_EMULATOR_BASE, DR_EMULATOR_SIZE); |
301 |
> |
} |
302 |
|
break; |
303 |
|
|
304 |
|
case OP_IRQ: // Level 1 interrupt |
310 |
|
#if !PRECISE_TIMING |
311 |
|
TimerInterrupt(); |
312 |
|
#endif |
315 |
– |
#if EMULATED_PPC |
313 |
|
ExecuteNative(NATIVE_VIDEO_VBL); |
317 |
– |
#else |
318 |
– |
ExecutePPC(VideoVBL); |
319 |
– |
#endif |
314 |
|
|
315 |
|
static int tick_counter = 0; |
316 |
|
if (++tick_counter >= 60) { |
328 |
|
} |
329 |
|
if (InterruptFlags & INTFLAG_ETHER) { |
330 |
|
ClearInterruptFlag(INTFLAG_ETHER); |
337 |
– |
#if EMULATED_PPC |
331 |
|
ExecuteNative(NATIVE_ETHER_IRQ); |
339 |
– |
#else |
340 |
– |
ExecutePPC(EtherIRQ); |
341 |
– |
#endif |
332 |
|
} |
333 |
|
if (InterruptFlags & INTFLAG_TIMER) { |
334 |
|
ClearInterruptFlag(INTFLAG_TIMER); |
435 |
|
PatchNativeResourceManager(); |
436 |
|
break; |
437 |
|
|
438 |
+ |
case OP_NTRB_17_PATCH4: |
439 |
+ |
r->d[0] = ReadMacInt16(r->a[7]); |
440 |
+ |
r->a[7] += 2; |
441 |
+ |
D(bug("%d %d\n", ReadMacInt16(r->a[2]), ReadMacInt16(r->a[2] + 6))); |
442 |
+ |
if (ReadMacInt16(r->a[2]) == 11 && ReadMacInt16(r->a[2] + 6) == 17) |
443 |
+ |
PatchNativeResourceManager(); |
444 |
+ |
break; |
445 |
+ |
|
446 |
|
case OP_CHECKLOAD: { // vCheckLoad() patch |
447 |
|
uint32 type = ReadMacInt32(r->a[7]); |
448 |
|
r->a[7] += 4; |
467 |
|
break; |
468 |
|
|
469 |
|
case OP_IDLE_TIME: |
472 |
– |
#if __BEOS__ |
470 |
|
// Sleep if no events pending |
471 |
< |
if (ReadMacInt32(0x14c) == 0) { |
472 |
< |
sleep(16667); |
476 |
< |
} |
477 |
< |
#endif |
471 |
> |
if (ReadMacInt32(0x14c) == 0) |
472 |
> |
Delay_usec(16667); |
473 |
|
r->a[0] = ReadMacInt32(0x2b6); |
474 |
|
break; |
475 |
|
|
476 |
+ |
case OP_IDLE_TIME_2: |
477 |
+ |
// Sleep if no events pending |
478 |
+ |
if (ReadMacInt32(0x14c) == 0) |
479 |
+ |
Delay_usec(16667); |
480 |
+ |
r->d[0] = (uint32)-2; |
481 |
+ |
break; |
482 |
+ |
|
483 |
|
default: |
484 |
|
printf("FATAL: EMUL_OP called with bogus selector %08x\n", selector); |
485 |
|
QuitEmulator(); |