From 76a5e63bd2f442598a877b7c724797b8c563b457 Mon Sep 17 00:00:00 2001 From: gbeauche <> Date: Sat, 10 Jan 2004 08:46:57 +0000 Subject: [PATCH] Make sure 68k procedures are stored on 16-bit word boundaries. --- SheepShaver/src/BeOS/sysdeps.h | 2 ++ SheepShaver/src/Unix/clip_unix.cpp | 20 +++++------ SheepShaver/src/emul_op.cpp | 8 ++--- SheepShaver/src/include/cpu_emulation.h | 7 ++++ SheepShaver/src/macos_util.cpp | 44 ++++++++++++------------- 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/SheepShaver/src/BeOS/sysdeps.h b/SheepShaver/src/BeOS/sysdeps.h index 33149296..d4af6d49 100644 --- a/SheepShaver/src/BeOS/sysdeps.h +++ b/SheepShaver/src/BeOS/sysdeps.h @@ -35,8 +35,10 @@ // Are we using a PPC emulator or the real thing? #ifdef __POWERPC__ #define EMULATED_PPC 0 +#define WORDS_BIGENDIAN 1 #else #define EMULATED_PPC 1 +#undef WORDS_BIGENDIAN #endif #define POWERPC_ROM 1 diff --git a/SheepShaver/src/Unix/clip_unix.cpp b/SheepShaver/src/Unix/clip_unix.cpp index 8039b82b..9dea33c7 100644 --- a/SheepShaver/src/Unix/clip_unix.cpp +++ b/SheepShaver/src/Unix/clip_unix.cpp @@ -487,17 +487,17 @@ static void do_getscrap(void **handle, uint32 type, int32 offset) } // Add new data to clipboard - static uint8 proc[] = { - 0x59, 0x8f, // subq.l #4,sp - 0xa9, 0xfc, // ZeroScrap() - 0x2f, 0x3c, 0, 0, 0, 0, // move.l #length,-(sp) - 0x2f, 0x3c, 0, 0, 0, 0, // move.l #type,-(sp) - 0x2f, 0x3c, 0, 0, 0, 0, // move.l #outbuf,-(sp) - 0xa9, 0xfe, // PutScrap() - 0x58, 0x8f, // addq.l #4,sp - M68K_RTS >> 8, M68K_RTS + static uint16 proc[] = { + PW(0x598f), // subq.l #4,sp + PW(0xa9fc), // ZeroScrap() + PW(0x2f3c), 0, 0, // move.l #length,-(sp) + PW(0x2f3c), 0, 0, // move.l #type,-(sp) + PW(0x2f3c), 0, 0, // move.l #outbuf,-(sp) + PW(0xa9fe), // PutScrap() + PW(0x588f), // addq.l #4,sp + PW(M68K_RTS) }; - uint32 proc_area = (uint32)proc; // FIXME: make sure 32-bit relocs are used + uint32 proc_area = (uint32)proc; WriteMacInt32(proc_area + 6, data.size()); WriteMacInt32(proc_area + 12, type); WriteMacInt32(proc_area + 18, scrap_area); diff --git a/SheepShaver/src/emul_op.cpp b/SheepShaver/src/emul_op.cpp index 80bc24ca..d3e5a3d9 100644 --- a/SheepShaver/src/emul_op.cpp +++ b/SheepShaver/src/emul_op.cpp @@ -267,10 +267,10 @@ void EmulOp(M68kRegisters *r, uint32 pc, int selector) #endif // Patch DebugStr() - static const uint8 proc[] = { - M68K_EMUL_OP_DEBUG_STR >> 8, M68K_EMUL_OP_DEBUG_STR & 0xff, - 0x4e, 0x74, // rtd #4 - 0x00, 0x04 + static const uint16 proc[] = { + PW(M68K_EMUL_OP_DEBUG_STR), + PW(0x4e74), // rtd #4 + PW(0x0004) }; WriteMacInt32(0x1dfc, (uint32)proc); break; diff --git a/SheepShaver/src/include/cpu_emulation.h b/SheepShaver/src/include/cpu_emulation.h index 9ea13011..dbe3b8f6 100644 --- a/SheepShaver/src/include/cpu_emulation.h +++ b/SheepShaver/src/include/cpu_emulation.h @@ -90,6 +90,13 @@ static inline void *Mac2Mac_memcpy(uint32 dest, uint32 src, size_t n) {return me * 680x0 and PPC emulation */ +// 68k procedure helper to write a big endian 16-bit word +#ifdef WORDS_BIGENDIAN +#define PW(W) W +#else +#define PW(X) ((((X) >> 8) & 0xff) | (((X) & 0xff) << 8)) +#endif + struct M68kRegisters; extern void Execute68k(uint32, M68kRegisters *r); // Execute 68k subroutine from EMUL_OP routine, must be ended with RTS extern void Execute68kTrap(uint16 trap, M68kRegisters *r); // Execute 68k A-Trap from EMUL_OP routine diff --git a/SheepShaver/src/macos_util.cpp b/SheepShaver/src/macos_util.cpp index 8df3f422..b6e1c475 100644 --- a/SheepShaver/src/macos_util.cpp +++ b/SheepShaver/src/macos_util.cpp @@ -169,18 +169,18 @@ void *FindLibSymbol(char *lib_str, char *sym_str) M68kRegisters r; // Find shared library - static const uint8 proc1[] = { - 0x55, 0x8f, // subq.l #2,a7 - 0x2f, 0x08, // move.l a0,-(a7) - 0x2f, 0x3c, 0x70, 0x77, 0x70, 0x63, // move.l #'pwpc',-(a7) - 0x2f, 0x3c, 0x00, 0x00, 0x00, 0x01, // move.l #kReferenceCFrag,-(a7) - 0x2f, 0x09, // move.l a1,-(a7) - 0x2f, 0x0a, // move.l a2,-(a7) - 0x2f, 0x0b, // move.l a3,-(a7) - 0x3f, 0x3c, 0x00, 0x01, // (GetSharedLibrary) - 0xaa, 0x5a, // CFMDispatch - 0x30, 0x1f, // move.w (a7)+,d0 - M68K_RTS >> 8, M68K_RTS & 0xff + static const uint16 proc1[] = { + PW(0x558f), // subq.l #2,a7 + PW(0x2f08), // move.l a0,-(a7) + PW(0x2f3c), PW(0x7077), PW(0x7063), // move.l #'pwpc',-(a7) + PW(0x2f3c), PW(0x0000), PW(0x0001), // move.l #kReferenceCFrag,-(a7) + PW(0x2f09), // move.l a1,-(a7) + PW(0x2f0a), // move.l a2,-(a7) + PW(0x2f0b), // move.l a3,-(a7) + PW(0x3f3c), PW(0x0001), // (GetSharedLibrary) + PW(0xaa5a), // CFMDispatch + PW(0x301f), // move.w (a7)+,d0 + PW(M68K_RTS) }; r.a[0] = lib.addr(); r.a[1] = conn_id.addr(); @@ -192,16 +192,16 @@ void *FindLibSymbol(char *lib_str, char *sym_str) return NULL; // Find symbol - static const uint8 proc2[] = { - 0x55, 0x8f, // subq.l #2,a7 - 0x2f, 0x00, // move.l d0,-(a7) - 0x2f, 0x08, // move.l a0,-(a7) - 0x2f, 0x09, // move.l a1,-(a7) - 0x2f, 0x0a, // move.l a2,-(a7) - 0x3f, 0x3c, 0x00, 0x05, // (FindSymbol) - 0xaa, 0x5a, // CFMDispatch - 0x30, 0x1f, // move.w (a7)+,d0 - M68K_RTS >> 8, M68K_RTS & 0xff + static const uint16 proc2[] = { + PW(0x558f), // subq.l #2,a7 + PW(0x2f00), // move.l d0,-(a7) + PW(0x2f08), // move.l a0,-(a7) + PW(0x2f09), // move.l a1,-(a7) + PW(0x2f0a), // move.l a2,-(a7) + PW(0x3f3c), PW(0x0005), // (FindSymbol) + PW(0xaa5a), // CFMDispatch + PW(0x301f), // move.w (a7)+,d0 + PW(M68K_RTS) }; r.d[0] = conn_id.value(); r.a[0] = sym.addr();