diff --git a/cpu/CpuIntegration.h b/cpu/CpuIntegration.h index c5a933b..ca4b299 100644 --- a/cpu/CpuIntegration.h +++ b/cpu/CpuIntegration.h @@ -1,8 +1,6 @@ #ifndef CpuIntegration_H #define CpuIntegration_H -#include - #ifdef __cplusplus extern "C" { #endif @@ -16,6 +14,8 @@ typedef enum { M68EC20 = 9 } cpu_integration_models; +extern void cpuIntegrationCalculateMultiplier(void); + extern void cpuIntegrationSetUpInterruptEventHandler(void); extern void cpuIntegrationExecuteInstructionEventHandler68000Fast(void); extern void cpuIntegrationExecuteInstructionEventHandler68000General(void); diff --git a/cpu/CpuModule.c b/cpu/CpuModule.c index b2bfa06..f427a55 100644 --- a/cpu/CpuModule.c +++ b/cpu/CpuModule.c @@ -24,8 +24,7 @@ #include "defs.h" #include "CpuModule.h" -#include "fellow.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule_Internal.h" void cpuClearEverything(void) diff --git a/cpu/CpuModule.h b/cpu/CpuModule.h index 52035c8..c52df80 100644 --- a/cpu/CpuModule.h +++ b/cpu/CpuModule.h @@ -18,7 +18,7 @@ extern void cpuSetFLineExceptionFunc(cpuLineExceptionFunc func); typedef BOOLE (*cpuCheckPendingInterruptsFunc)(void); extern void cpuSetCheckPendingInterruptsFunc(cpuCheckPendingInterruptsFunc func); extern void cpuCheckPendingInterrupts(void); -void cpuSetUpInterrupt(ULO new_interrupt_level); +extern void cpuSetUpInterrupt(ULO new_interrupt_level); extern void cpuInitializeFromNewPC(ULO new_pc); @@ -77,12 +77,9 @@ extern ULO cpuGetInitialSP(void); extern ULO cpuGetInstructionTime(void); -extern BOOLE cpuSetIrqLevel(ULO new_interrupt_level); +extern BOOLE cpuSetIrqLevel(ULO irq_level); extern ULO cpuGetIrqLevel(void); -extern void cpuSetIrqAddress(ULO irq_address); -extern ULO cpuGetIrqAddress(void); - extern ULO cpuExecuteInstruction(void); extern ULO cpuDisOpcode(ULO disasm_pc, STR *saddress, STR *sdata, STR *sinstruction, STR *soperands); diff --git a/cpu/CpuModule_Code.h b/cpu/CpuModule_Code.h index c5ce164..58e4e33 100644 --- a/cpu/CpuModule_Code.h +++ b/cpu/CpuModule_Code.h @@ -5590,254 +5590,199 @@ static void DIVS_81C0(ULO*opc_data) { UWO src = cpuGetDRegWord(opc_data[0]); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81D0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA02(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81D8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA03(opc_data[0],2)); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81E0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA04(opc_data[0],2)); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81E8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA05(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81F0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA06(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81F8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA70()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81F9(ULO*opc_data) { UWO src = memoryReadWord(cpuEA71()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81FA(ULO*opc_data) { UWO src = memoryReadWord(cpuEA72()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81FB(ULO*opc_data) { UWO src = memoryReadWord(cpuEA73()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVS_81FC(ULO*opc_data) { UWO src = cpuGetNextWord(); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivsW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivsW(dst, src, opc_data[1], opc_data[2]); } static void DIVL_4C40(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = cpuGetDReg(opc_data[0]); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C50(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA02(opc_data[0])); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C58(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA03(opc_data[0],4)); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C60(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA04(opc_data[0],4)); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C68(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA05(opc_data[0])); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C70(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA06(opc_data[0])); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C78(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA70()); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C79(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA71()); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C7A(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA72()); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C7B(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = memoryReadLong(cpuEA73()); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVL_4C7C(ULO*opc_data) { UWO ext = cpuGetNextWord(); ULO src = cpuGetNextLong(); - cpuDivL(src, ext); - cpuSetInstructionTime(opc_data[2]); + cpuDivL(src, ext, opc_data[2]); } static void DIVU_80C0(ULO*opc_data) { UWO src = cpuGetDRegWord(opc_data[0]); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80D0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA02(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80D8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA03(opc_data[0],2)); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80E0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA04(opc_data[0],2)); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80E8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA05(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80F0(ULO*opc_data) { UWO src = memoryReadWord(cpuEA06(opc_data[0])); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80F8(ULO*opc_data) { UWO src = memoryReadWord(cpuEA70()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80F9(ULO*opc_data) { UWO src = memoryReadWord(cpuEA71()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80FA(ULO*opc_data) { UWO src = memoryReadWord(cpuEA72()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80FB(ULO*opc_data) { UWO src = memoryReadWord(cpuEA73()); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void DIVU_80FC(ULO*opc_data) { UWO src = cpuGetNextWord(); ULO dst = cpuGetDReg(opc_data[1]); - ULO res = cpuDivuW(dst, src); - cpuSetDReg(opc_data[1], res); - cpuSetInstructionTime(opc_data[2]); + cpuDivuW(dst, src, opc_data[1], opc_data[2]); } static void MOVEM_48A0(ULO*opc_data) { @@ -6483,42 +6428,42 @@ static void BFTST_E8FB(ULO*opc_data) static void BFCHG_EAC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfChgReg(opc_data[1], ext); + cpuBfChgReg(opc_data[0], ext); } static void BFCLR_ECC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfClrReg(opc_data[1], ext); + cpuBfClrReg(opc_data[0], ext); } static void BFEXTS_EBC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfExtsReg(opc_data[1], ext); + cpuBfExtsReg(opc_data[0], ext); } static void BFEXTU_E9C0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfExtuReg(opc_data[1], ext); + cpuBfExtuReg(opc_data[0], ext); } static void BFFFO_EDC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfFfoReg(opc_data[1], ext); + cpuBfFfoReg(opc_data[0], ext); } static void BFINS_EFC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfInsReg(opc_data[1], ext); + cpuBfInsReg(opc_data[0], ext); } static void BFSET_EEC0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfSetReg(opc_data[1], ext); + cpuBfSetReg(opc_data[0], ext); } static void BFTST_E8C0(ULO*opc_data) { UWO ext = cpuGetNextWord(); - cpuBfTstReg(opc_data[1], ext); + cpuBfTstReg(opc_data[0], ext); } static void MULL_4C00(ULO*opc_data) { @@ -7347,6 +7292,7 @@ static void TAS_4AC0(ULO*opc_data) UBY dst = cpuGetDRegByte(opc_data[0]); dst = cpuTas(dst); cpuSetDRegByte(opc_data[0], dst); + cpuSetInstructionTime(4); } static void TAS_4AD0(ULO*opc_data) { @@ -7354,6 +7300,7 @@ static void TAS_4AD0(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(14); } static void TAS_4AD8(ULO*opc_data) { @@ -7361,6 +7308,7 @@ static void TAS_4AD8(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(14); } static void TAS_4AE0(ULO*opc_data) { @@ -7368,6 +7316,7 @@ static void TAS_4AE0(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(16); } static void TAS_4AE8(ULO*opc_data) { @@ -7375,6 +7324,7 @@ static void TAS_4AE8(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(18); } static void TAS_4AF0(ULO*opc_data) { @@ -7382,6 +7332,7 @@ static void TAS_4AF0(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(20); } static void TAS_4AF8(ULO*opc_data) { @@ -7389,6 +7340,7 @@ static void TAS_4AF8(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(18); } static void TAS_4AF9(ULO*opc_data) { @@ -7396,6 +7348,7 @@ static void TAS_4AF9(ULO*opc_data) UBY dst = memoryReadByte(dstea); dst = cpuTas(dst); memoryWriteByte(dst, dstea); + cpuSetInstructionTime(22); } static void TST_4A00(ULO*opc_data) { @@ -7638,43 +7591,43 @@ static void PEA_4850(ULO*opc_data) { ULO dstea = cpuEA02(opc_data[0]); cpuPeaL(dstea); - cpuSetInstructionTime(8); + cpuSetInstructionTime(12); } static void PEA_4868(ULO*opc_data) { ULO dstea = cpuEA05(opc_data[0]); cpuPeaL(dstea); - cpuSetInstructionTime(10); + cpuSetInstructionTime(16); } static void PEA_4870(ULO*opc_data) { ULO dstea = cpuEA06(opc_data[0]); cpuPeaL(dstea); - cpuSetInstructionTime(14); + cpuSetInstructionTime(20); } static void PEA_4878(ULO*opc_data) { ULO dstea = cpuEA70(); cpuPeaL(dstea); - cpuSetInstructionTime(10); + cpuSetInstructionTime(16); } static void PEA_4879(ULO*opc_data) { ULO dstea = cpuEA71(); cpuPeaL(dstea); - cpuSetInstructionTime(12); + cpuSetInstructionTime(20); } static void PEA_487A(ULO*opc_data) { ULO dstea = cpuEA72(); cpuPeaL(dstea); - cpuSetInstructionTime(10); + cpuSetInstructionTime(16); } static void PEA_487B(ULO*opc_data) { ULO dstea = cpuEA73(); cpuPeaL(dstea); - cpuSetInstructionTime(14); + cpuSetInstructionTime(20); } static void JMP_4ED0(ULO*opc_data) { diff --git a/cpu/CpuModule_Disassembler.c b/cpu/CpuModule_Disassembler.c index d91ebf8..e1b4b32 100644 --- a/cpu/CpuModule_Disassembler.c +++ b/cpu/CpuModule_Disassembler.c @@ -23,7 +23,7 @@ /* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*=========================================================================*/ #include "defs.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_DisassemblerFunc.h" diff --git a/cpu/CpuModule_EffectiveAddress.c b/cpu/CpuModule_EffectiveAddress.c index e40331f..bab9350 100644 --- a/cpu/CpuModule_EffectiveAddress.c +++ b/cpu/CpuModule_EffectiveAddress.c @@ -24,8 +24,7 @@ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_Internal.h" diff --git a/cpu/CpuModule_Exceptions.c b/cpu/CpuModule_Exceptions.c index eda203e..717646f 100644 --- a/cpu/CpuModule_Exceptions.c +++ b/cpu/CpuModule_Exceptions.c @@ -24,8 +24,7 @@ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_Internal.h" @@ -194,10 +193,10 @@ void cpuThrowTrapVException(void) cpuThrowException(0x1c, cpuGetPC(), FALSE); } -void cpuThrowDivisionByZeroException(BOOLE executejmp) +void cpuThrowDivisionByZeroException() { // The saved pc points to the next instruction, which is now in pc - cpuThrowException(0x14, cpuGetPC(), executejmp); + cpuThrowException(0x14, cpuGetPC(), FALSE); } void cpuThrowTrapException(ULO vector_no) diff --git a/cpu/CpuModule_Flags.c b/cpu/CpuModule_Flags.c index aaca6b9..ccb28a5 100644 --- a/cpu/CpuModule_Flags.c +++ b/cpu/CpuModule_Flags.c @@ -22,7 +22,6 @@ /* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" #include "CpuModule.h" #include "CpuModule_Internal.h" @@ -195,7 +194,7 @@ void cpuSetFlags0100(void) /// /// Clear V and C. /// -static void cpuClearFlagsVC(void) +void cpuClearFlagsVC(void) { cpu_sr = cpu_sr & 0xfffc; } diff --git a/cpu/CpuModule_Instructions.c b/cpu/CpuModule_Instructions.c index 0a9e178..9363860 100644 --- a/cpu/CpuModule_Instructions.c +++ b/cpu/CpuModule_Instructions.c @@ -24,16 +24,10 @@ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_Internal.h" -#ifdef UAE_FILESYS -#include "uae2fell.h" -#include "autoconf.h" -#endif - static cpuLineExceptionFunc cpu_a_line_exception_func = NULL; static cpuLineExceptionFunc cpu_f_line_exception_func = NULL; @@ -168,24 +162,21 @@ static void cpuIllegal(void) } else if ((opcode & 0xa000) == 0xa000) { - -/* -#ifdef UAE_FILESYS + #if 0 if ((cpuGetPC() & 0xff0000) == 0xf00000) { call_calltrap(opcode & 0xfff); cpuInitializeFromNewPC(cpuGetPC()); cpuSetInstructionTime(512); } - else -#endif -*/ + #else if (cpu_a_line_exception_func) { cpu_a_line_exception_func(opcode); cpuInitializeFromNewPC(cpuGetPC()); cpuSetInstructionTime(512); } + #endif else { cpuThrowALineException(); @@ -1162,17 +1153,16 @@ static ULO cpuMuluW(UWO src2, UWO src1, ULO eatime) /// /// Divsw, src1 / src2 /// -static ULO cpuDivsW(ULO dst, UWO src1) +static void cpuDivsW(ULO dst, UWO src1, ULO destination_reg, ULO instruction_time) { - ULO result; if (src1 == 0) { // Alcatraz odyssey assumes that PC in this exception points after the instruction. - cpuThrowDivisionByZeroException(TRUE); - result = dst; + cpuThrowDivisionByZeroException(); } else { + ULO result; LON x = (LON) dst; LON y = (LON)(WOR) src1; LON res = x / y; @@ -1187,24 +1177,24 @@ static ULO cpuDivsW(ULO dst, UWO src1) result = (rem << 16) | (res & 0xffff); cpuSetFlagsNZVC(cpuIsZeroW((UWO) res), cpuMsbW((UWO) res), FALSE, FALSE); } + cpuSetDReg(destination_reg, result); + cpuSetInstructionTime(instruction_time); } - return result; } /// /// Divuw, src1 / src2 /// -static ULO cpuDivuW(ULO dst, UWO src1) +static void cpuDivuW(ULO dst, UWO src1, ULO destination_reg, ULO instruction_time) { - ULO result; if (src1 == 0) { // Alcatraz odyssey assumes that PC in this exception points after the instruction. - cpuThrowDivisionByZeroException(TRUE); - result = dst; + cpuThrowDivisionByZeroException(); } else { + ULO result; ULO x = dst; ULO y = (ULO) src1; ULO res = x / y; @@ -1219,11 +1209,12 @@ static ULO cpuDivuW(ULO dst, UWO src1) result = (rem << 16) | (res & 0xffff); cpuSetFlagsNZVC(cpuIsZeroW((UWO) res), cpuMsbW((UWO) res), FALSE, FALSE); } + cpuSetDReg(destination_reg, result); + cpuSetInstructionTime(instruction_time); } - return result; } -static void cpuDivL(ULO divisor, ULO ext) +static void cpuDivL(ULO divisor, ULO ext, ULO instruction_time) { if (divisor != 0) { @@ -1296,10 +1287,11 @@ static void cpuDivL(ULO divisor, ULO ext) cpuSetFlagsNZ00NewL((ULO) result); } } + cpuSetInstructionTime(instruction_time); } else { - cpuThrowDivisionByZeroException(FALSE); + cpuThrowDivisionByZeroException(); } } @@ -2462,7 +2454,7 @@ static void cpuCmpML(ULO regx, ULO regy) static void cpuChkW(UWO value, UWO ub) { cpuSetFlagZ(value == 0); - cpuSetFlagsVC(FALSE, FALSE); + cpuClearFlagsVC(); if (((WOR)value) < 0) { cpuSetFlagN(TRUE); @@ -2485,7 +2477,7 @@ static void cpuChkW(UWO value, UWO ub) static void cpuChkL(ULO value, ULO ub) { cpuSetFlagZ(value == 0); - cpuSetFlagsVC(FALSE, FALSE); + cpuClearFlagsVC(); if (((LON)value) < 0) { cpuSetFlagN(TRUE); @@ -2567,39 +2559,35 @@ static ULO cpuSubXL(ULO dst, ULO src) /// static UBY cpuAbcdB(UBY dst, UBY src) { - UBY xflag = (cpuGetFlagX()) ? 1:0; - UWO res = dst + src + xflag; - UWO res_unadjusted = res; - UBY res_bcd; - UBY low_nibble = (dst & 0xf) + (src & 0xf) + xflag; + UBY xflag = (cpuGetFlagX()) ? 1 : 0; + UWO low_nibble = (dst & 0xf) + (src & 0xf) + xflag; + UWO high_nibble = ((UWO)(dst & 0xf0)) + ((UWO)(src & 0xf0)); + UWO result_unadjusted = low_nibble + high_nibble; + UWO result_bcd = result_unadjusted; if (low_nibble > 9) { - res += 6; + result_bcd += 6; } - if (res > 0x99) + BOOLE xc_flags = (result_bcd & 0xfff0) > 0x90; + cpuSetFlagXC(xc_flags); + if (xc_flags) { - res += 0x60; - cpuSetFlagXC(TRUE); - } - else - { - cpuSetFlagXC(FALSE); + result_bcd += 0x60; } - res_bcd = (UBY) res; - - if (res_bcd != 0) + if (result_bcd & 0xff) { cpuSetFlagZ(FALSE); } - if (res_bcd & 0x80) + + if (cpuGetModelMajor() < 4) // 040 apparently does not set these flags { - cpuSetFlagN(TRUE); + cpuSetFlagN(result_bcd & 0x80); + cpuSetFlagV(((result_unadjusted & 0x80) == 0) && (result_bcd & 0x80)); } - cpuSetFlagV(((res_unadjusted & 0x80) == 0) && (res_bcd & 0x80)); - return res_bcd; + return (UBY)result_bcd; } /// @@ -2612,36 +2600,38 @@ static UBY cpuAbcdB(UBY dst, UBY src) /// static UBY cpuSbcdB(UBY dst, UBY src) { - UBY xflag = (cpuGetFlagX()) ? 1:0; - UWO res = dst - src - xflag; - UWO res_unadjusted = res; - UBY res_bcd; + UWO xflag = (cpuGetFlagX()) ? 1:0; + UWO result_plain_binary = (UWO)dst - (UWO)src - xflag; + UWO low_nibble = (UWO)(dst & 0xf) - (UWO)(src & 0xf) - xflag; + UWO high_nibble = ((UWO)(dst & 0xf0)) - ((UWO)(src & 0xf0)); + UWO result_unadjusted = low_nibble + high_nibble; + UWO result_bcd = result_unadjusted; - if (((src & 0xf) + xflag) > (dst & 0xf)) + if ((WOR)result_plain_binary < 0) { - res -= 6; + result_bcd -= 0x60; } - if (res & 0x80) - { - res -= 0x60; - cpuSetFlagXC(TRUE); - } - else - { - cpuSetFlagXC(FALSE); - } - res_bcd = (UBY) res; - if (res_bcd != 0) + if (((WOR)low_nibble) < 0) + { + result_bcd -= 6; + result_plain_binary -= 6; + } + + BOOLE borrow = ((WOR)result_plain_binary < 0); + cpuSetFlagXC(borrow); + + if (result_bcd & 0xff) { cpuSetFlagZ(FALSE); } - if (res_bcd & 0x80) + + if (cpuGetModelMajor() < 4) { - cpuSetFlagN(TRUE); + cpuSetFlagN(result_bcd & 0x80); + cpuSetFlagV(((result_unadjusted & 0x80) == 0x80) && !(result_bcd & 0x80)); } - cpuSetFlagV(((res_unadjusted & 0x80) == 0x80) && !(res_bcd & 0x80)); - return res_bcd; + return (UBY) result_bcd; } /// @@ -2743,9 +2733,9 @@ void cpuBfDecodeExtWordAndGetField(struct cpuBfData *bf_data, ULO ea_or_reg, boo ULO shift = (8 - bf_data->normalized_offset - bf_data->width) & 7; for (int i = bf_data->base_address_byte_count - 1; i >= 0; --i) { - ULL value = (ULL) memoryReadByte(address); - field_memory |= (value << (8*i)); - field |= ((value >> shift) << (8*i)); + ULL value = ((ULL)memoryReadByte(address)) << (8 * i); + field_memory |= value; + field |= (value >> shift); ++address; } @@ -3701,7 +3691,7 @@ static void cpuPtest040(ULO rw, ULO regno) #include "CpuModule_Decl.h" #include "CpuModule_Data.h" -//#include "CpuModule_Profile.h" +#include "CpuModule_Profile.h" #include "CpuModule_Code.h" cpuOpcodeData cpu_opcode_data_current[65536]; diff --git a/cpu/CpuModule_Internal.h b/cpu/CpuModule_Internal.h index 9f68069..3eef27b 100644 --- a/cpu/CpuModule_Internal.h +++ b/cpu/CpuModule_Internal.h @@ -51,10 +51,6 @@ extern void cpuSetCaar(ULO caar); extern ULO cpuGetCaar(void); extern void cpuSetSR(ULO sr); extern ULO cpuGetSR(void); -extern BOOLE cpuSetIrqLevel(ULO new_interrupt_level); -extern ULO cpuGetIrqLevel(void); -extern void cpuSetIrqAddress(ULO irq_address); -extern ULO cpuGetIrqAddress(void); extern void cpuSetInstructionTime(ULO cycles); extern ULO cpuGetInstructionTime(void); extern void cpuSetOriginalPC(ULO pc); @@ -140,6 +136,7 @@ extern UWO cpuGetZFlagL(ULO res); extern UWO cpuGetNFlagB(UBY res); extern UWO cpuGetNFlagW(UWO res); extern UWO cpuGetNFlagL(ULO res); +extern void cpuClearFlagsVC(void); extern BOOLE cpuCalculateConditionCode0(void); extern BOOLE cpuCalculateConditionCode1(void); @@ -180,7 +177,7 @@ extern void cpuThrowFLineException(void); extern void cpuThrowALineException(void); extern void cpuThrowTrapVException(void); extern void cpuThrowTrapException(ULO vector_no); -extern void cpuThrowDivisionByZeroException(BOOLE executejmp); +extern void cpuThrowDivisionByZeroException(); extern void cpuThrowChkException(void); extern void cpuThrowTraceException(void); extern void cpuThrowResetException(void); diff --git a/cpu/CpuModule_InternalState.c b/cpu/CpuModule_InternalState.c index acbec52..dfa80c1 100644 --- a/cpu/CpuModule_InternalState.c +++ b/cpu/CpuModule_InternalState.c @@ -23,8 +23,7 @@ /*=========================================================================*/ #include "defs.h" #include "CpuModule.h" -#include "fellow.h" -#include "fmem.h" +#include "CpuModule_Memory.h" #include "CpuModule_Internal.h" /* M68k registers */ diff --git a/cpu/CpuModule_Interrupts.c b/cpu/CpuModule_Interrupts.c index 0dab357..326fde2 100644 --- a/cpu/CpuModule_Interrupts.c +++ b/cpu/CpuModule_Interrupts.c @@ -22,9 +22,7 @@ /* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" -#include "fmem.h" - +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_Internal.h" diff --git a/cpu/CpuModule_Logging.c b/cpu/CpuModule_Logging.c index fde361f..026dd7d 100644 --- a/cpu/CpuModule_Logging.c +++ b/cpu/CpuModule_Logging.c @@ -24,8 +24,6 @@ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" - #include "CpuModule.h" #ifdef CPU_INSTRUCTION_LOGGING diff --git a/cpu/CpuModule_Memory.h b/cpu/CpuModule_Memory.h new file mode 100644 index 0000000..f9f29bf --- /dev/null +++ b/cpu/CpuModule_Memory.h @@ -0,0 +1 @@ +#include "fmem.h" \ No newline at end of file diff --git a/cpu/CpuModule_Profile.h b/cpu/CpuModule_Profile.h index 02d1f6c..75162ea 100644 --- a/cpu/CpuModule_Profile.h +++ b/cpu/CpuModule_Profile.h @@ -1,7 +1,6 @@ #ifndef CPUMODULE_PROFILE_H #define CPUMODULE_PROFILE_H -#include "fileops.h" void cpuProfileWrite(void) { } diff --git a/cpu/CpuModule_StackFrameGen.c b/cpu/CpuModule_StackFrameGen.c index 178c0d0..63b28fa 100644 --- a/cpu/CpuModule_StackFrameGen.c +++ b/cpu/CpuModule_StackFrameGen.c @@ -22,9 +22,7 @@ /* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*=========================================================================*/ #include "defs.h" -#include "fellow.h" -#include "fmem.h" - +#include "CpuModule_Memory.h" #include "CpuModule.h" #include "CpuModule_Internal.h"