Make sure 68k procedures are stored on 16-bit word boundaries.

This commit is contained in:
gbeauche 2004-01-10 08:46:57 +00:00
parent 1b0e88041e
commit 76a5e63bd2
5 changed files with 45 additions and 36 deletions

View File

@ -35,8 +35,10 @@
// Are we using a PPC emulator or the real thing? // Are we using a PPC emulator or the real thing?
#ifdef __POWERPC__ #ifdef __POWERPC__
#define EMULATED_PPC 0 #define EMULATED_PPC 0
#define WORDS_BIGENDIAN 1
#else #else
#define EMULATED_PPC 1 #define EMULATED_PPC 1
#undef WORDS_BIGENDIAN
#endif #endif
#define POWERPC_ROM 1 #define POWERPC_ROM 1

View File

@ -487,17 +487,17 @@ static void do_getscrap(void **handle, uint32 type, int32 offset)
} }
// Add new data to clipboard // Add new data to clipboard
static uint8 proc[] = { static uint16 proc[] = {
0x59, 0x8f, // subq.l #4,sp PW(0x598f), // subq.l #4,sp
0xa9, 0xfc, // ZeroScrap() PW(0xa9fc), // ZeroScrap()
0x2f, 0x3c, 0, 0, 0, 0, // move.l #length,-(sp) PW(0x2f3c), 0, 0, // move.l #length,-(sp)
0x2f, 0x3c, 0, 0, 0, 0, // move.l #type,-(sp) PW(0x2f3c), 0, 0, // move.l #type,-(sp)
0x2f, 0x3c, 0, 0, 0, 0, // move.l #outbuf,-(sp) PW(0x2f3c), 0, 0, // move.l #outbuf,-(sp)
0xa9, 0xfe, // PutScrap() PW(0xa9fe), // PutScrap()
0x58, 0x8f, // addq.l #4,sp PW(0x588f), // addq.l #4,sp
M68K_RTS >> 8, M68K_RTS 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 + 6, data.size());
WriteMacInt32(proc_area + 12, type); WriteMacInt32(proc_area + 12, type);
WriteMacInt32(proc_area + 18, scrap_area); WriteMacInt32(proc_area + 18, scrap_area);

View File

@ -267,10 +267,10 @@ void EmulOp(M68kRegisters *r, uint32 pc, int selector)
#endif #endif
// Patch DebugStr() // Patch DebugStr()
static const uint8 proc[] = { static const uint16 proc[] = {
M68K_EMUL_OP_DEBUG_STR >> 8, M68K_EMUL_OP_DEBUG_STR & 0xff, PW(M68K_EMUL_OP_DEBUG_STR),
0x4e, 0x74, // rtd #4 PW(0x4e74), // rtd #4
0x00, 0x04 PW(0x0004)
}; };
WriteMacInt32(0x1dfc, (uint32)proc); WriteMacInt32(0x1dfc, (uint32)proc);
break; break;

View File

@ -90,6 +90,13 @@ static inline void *Mac2Mac_memcpy(uint32 dest, uint32 src, size_t n) {return me
* 680x0 and PPC emulation * 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; struct M68kRegisters;
extern void Execute68k(uint32, M68kRegisters *r); // Execute 68k subroutine from EMUL_OP routine, must be ended with RTS 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 extern void Execute68kTrap(uint16 trap, M68kRegisters *r); // Execute 68k A-Trap from EMUL_OP routine

View File

@ -169,18 +169,18 @@ void *FindLibSymbol(char *lib_str, char *sym_str)
M68kRegisters r; M68kRegisters r;
// Find shared library // Find shared library
static const uint8 proc1[] = { static const uint16 proc1[] = {
0x55, 0x8f, // subq.l #2,a7 PW(0x558f), // subq.l #2,a7
0x2f, 0x08, // move.l a0,-(a7) PW(0x2f08), // move.l a0,-(a7)
0x2f, 0x3c, 0x70, 0x77, 0x70, 0x63, // move.l #'pwpc',-(a7) PW(0x2f3c), PW(0x7077), PW(0x7063), // move.l #'pwpc',-(a7)
0x2f, 0x3c, 0x00, 0x00, 0x00, 0x01, // move.l #kReferenceCFrag,-(a7) PW(0x2f3c), PW(0x0000), PW(0x0001), // move.l #kReferenceCFrag,-(a7)
0x2f, 0x09, // move.l a1,-(a7) PW(0x2f09), // move.l a1,-(a7)
0x2f, 0x0a, // move.l a2,-(a7) PW(0x2f0a), // move.l a2,-(a7)
0x2f, 0x0b, // move.l a3,-(a7) PW(0x2f0b), // move.l a3,-(a7)
0x3f, 0x3c, 0x00, 0x01, // (GetSharedLibrary) PW(0x3f3c), PW(0x0001), // (GetSharedLibrary)
0xaa, 0x5a, // CFMDispatch PW(0xaa5a), // CFMDispatch
0x30, 0x1f, // move.w (a7)+,d0 PW(0x301f), // move.w (a7)+,d0
M68K_RTS >> 8, M68K_RTS & 0xff PW(M68K_RTS)
}; };
r.a[0] = lib.addr(); r.a[0] = lib.addr();
r.a[1] = conn_id.addr(); r.a[1] = conn_id.addr();
@ -192,16 +192,16 @@ void *FindLibSymbol(char *lib_str, char *sym_str)
return NULL; return NULL;
// Find symbol // Find symbol
static const uint8 proc2[] = { static const uint16 proc2[] = {
0x55, 0x8f, // subq.l #2,a7 PW(0x558f), // subq.l #2,a7
0x2f, 0x00, // move.l d0,-(a7) PW(0x2f00), // move.l d0,-(a7)
0x2f, 0x08, // move.l a0,-(a7) PW(0x2f08), // move.l a0,-(a7)
0x2f, 0x09, // move.l a1,-(a7) PW(0x2f09), // move.l a1,-(a7)
0x2f, 0x0a, // move.l a2,-(a7) PW(0x2f0a), // move.l a2,-(a7)
0x3f, 0x3c, 0x00, 0x05, // (FindSymbol) PW(0x3f3c), PW(0x0005), // (FindSymbol)
0xaa, 0x5a, // CFMDispatch PW(0xaa5a), // CFMDispatch
0x30, 0x1f, // move.w (a7)+,d0 PW(0x301f), // move.w (a7)+,d0
M68K_RTS >> 8, M68K_RTS & 0xff PW(M68K_RTS)
}; };
r.d[0] = conn_id.value(); r.d[0] = conn_id.value();
r.a[0] = sym.addr(); r.a[0] = sym.addr();