26 #ifndef M68KCPU__HEADER
27 #define M68KCPU__HEADER
33 #if M68K_EMULATE_ADDRESS_ERROR
42 #if UINT_MAX > 0xffffffff
43 #define M68K_INT_GT_32_BIT 1
45 #define M68K_INT_GT_32_BIT 0
57 typedef int_least32_t
sint;
58 typedef uint_least32_t
uint;
68 #define UINT16 uint16_t
69 #define UINT64 uint64_t
71 #define MAKE_INT_8(A) (sint8)(A)
72 #define MAKE_INT_16(A) (sint16)(A)
73 #define MAKE_INT_32(A) (sint32)(A)
74 #define MAKE_UINT_8(A) (uint8)(A)
75 #define MAKE_UINT_16(A) (uint16)(A)
76 #define MAKE_UINT_32(A) (uint32)(A)
84 #define EXCEPTION_BUS_ERROR 2
85 #define EXCEPTION_ADDRESS_ERROR 3
86 #define EXCEPTION_ILLEGAL_INSTRUCTION 4
87 #define EXCEPTION_ZERO_DIVIDE 5
88 #define EXCEPTION_CHK 6
89 #define EXCEPTION_TRAPV 7
90 #define EXCEPTION_PRIVILEGE_VIOLATION 8
91 #define EXCEPTION_TRACE 9
92 #define EXCEPTION_1010 10
93 #define EXCEPTION_1111 11
94 #define EXCEPTION_FORMAT_ERROR 14
95 #define EXCEPTION_UNINITIALIZED_INTERRUPT 15
96 #define EXCEPTION_SPURIOUS_INTERRUPT 24
97 #define EXCEPTION_INTERRUPT_AUTOVECTOR 24
98 #define EXCEPTION_TRAP_BASE 32
101 #define FUNCTION_CODE_USER_DATA 1
102 #define FUNCTION_CODE_USER_PROGRAM 2
103 #define FUNCTION_CODE_SUPERVISOR_DATA 5
104 #define FUNCTION_CODE_SUPERVISOR_PROGRAM 6
105 #define FUNCTION_CODE_CPU_SPACE 7
108 #define CPU_TYPE_000 1
109 #define CPU_TYPE_008 2
110 #define CPU_TYPE_010 4
111 #define CPU_TYPE_EC020 8
112 #define CPU_TYPE_020 16
113 #define CPU_TYPE_040 32
116 #define STOP_LEVEL_STOP 1
117 #define STOP_LEVEL_HALT 2
120 #define INSTRUCTION_YES 0
121 #define INSTRUCTION_NO 0x08
122 #define MODE_READ 0x10
125 #define RUN_MODE_NORMAL 0
126 #define RUN_MODE_BERR_AERR_RESET 1
129 #define NULL ((void*)0)
140 #define BIT_0(A) ((A) & 0x00000001)
141 #define BIT_1(A) ((A) & 0x00000002)
142 #define BIT_2(A) ((A) & 0x00000004)
143 #define BIT_3(A) ((A) & 0x00000008)
144 #define BIT_4(A) ((A) & 0x00000010)
145 #define BIT_5(A) ((A) & 0x00000020)
146 #define BIT_6(A) ((A) & 0x00000040)
147 #define BIT_7(A) ((A) & 0x00000080)
148 #define BIT_8(A) ((A) & 0x00000100)
149 #define BIT_9(A) ((A) & 0x00000200)
150 #define BIT_A(A) ((A) & 0x00000400)
151 #define BIT_B(A) ((A) & 0x00000800)
152 #define BIT_C(A) ((A) & 0x00001000)
153 #define BIT_D(A) ((A) & 0x00002000)
154 #define BIT_E(A) ((A) & 0x00004000)
155 #define BIT_F(A) ((A) & 0x00008000)
156 #define BIT_10(A) ((A) & 0x00010000)
157 #define BIT_11(A) ((A) & 0x00020000)
158 #define BIT_12(A) ((A) & 0x00040000)
159 #define BIT_13(A) ((A) & 0x00080000)
160 #define BIT_14(A) ((A) & 0x00100000)
161 #define BIT_15(A) ((A) & 0x00200000)
162 #define BIT_16(A) ((A) & 0x00400000)
163 #define BIT_17(A) ((A) & 0x00800000)
164 #define BIT_18(A) ((A) & 0x01000000)
165 #define BIT_19(A) ((A) & 0x02000000)
166 #define BIT_1A(A) ((A) & 0x04000000)
167 #define BIT_1B(A) ((A) & 0x08000000)
168 #define BIT_1C(A) ((A) & 0x10000000)
169 #define BIT_1D(A) ((A) & 0x20000000)
170 #define BIT_1E(A) ((A) & 0x40000000)
171 #define BIT_1F(A) ((A) & 0x80000000)
174 #define GET_MSB_8(A) ((A) & 0x80)
175 #define GET_MSB_9(A) ((A) & 0x100)
176 #define GET_MSB_16(A) ((A) & 0x8000)
177 #define GET_MSB_17(A) ((A) & 0x10000)
178 #define GET_MSB_32(A) ((A) & 0x80000000)
180 #define GET_MSB_33(A) ((A) & 0x100000000)
184 #define LOW_NIBBLE(A) ((A) & 0x0f)
185 #define HIGH_NIBBLE(A) ((A) & 0xf0)
188 #define MASK_OUT_ABOVE_2(A) ((A) & 3)
189 #define MASK_OUT_ABOVE_8(A) ((A) & 0xff)
190 #define MASK_OUT_ABOVE_16(A) ((A) & 0xffff)
191 #define MASK_OUT_BELOW_2(A) ((A) & ~3)
192 #define MASK_OUT_BELOW_8(A) ((A) & ~0xff)
193 #define MASK_OUT_BELOW_16(A) ((A) & ~0xffff)
196 #if M68K_INT_GT_32_BIT || M68K_USE_64_BIT
197 #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff)
198 #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff)
200 #define MASK_OUT_ABOVE_32(A) (A)
201 #define MASK_OUT_BELOW_32(A) 0
205 #define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK)
209 #define LSL(A, C) ((A) << (C))
210 #define LSR(A, C) ((A) >> (C))
213 #if M68K_INT_GT_32_BIT
215 #define LSR_32(A, C) ((A) >> (C))
216 #define LSL_32(A, C) ((A) << (C))
221 #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0)
222 #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0)
226 #define LSL_32_64(A, C) ((A) << (C))
227 #define LSR_32_64(A, C) ((A) >> (C))
228 #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C)))
229 #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C)))
232 #define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C)))
233 #define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C)))
234 #define ROL_16(A, C) MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C)))
235 #define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C)))
236 #define ROL_32(A, C) MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C)))
237 #define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C)))
239 #define ROR_8(A, C) MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C)))
240 #define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C)))
241 #define ROR_16(A, C) MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C)))
242 #define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C)))
243 #define ROR_32(A, C) MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C)))
244 #define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C)))
251 #define CPU_TYPE m68ki_cpu.cpu_type
253 #define REG_DA m68ki_cpu.dar
254 #define REG_D m68ki_cpu.dar
255 #define REG_A (m68ki_cpu.dar+8)
256 #define REG_PPC m68ki_cpu.ppc
257 #define REG_PC m68ki_cpu.pc
258 #define REG_SP_BASE m68ki_cpu.sp
259 #define REG_USP m68ki_cpu.sp[0]
260 #define REG_ISP m68ki_cpu.sp[4]
261 #define REG_MSP m68ki_cpu.sp[6]
262 #define REG_SP m68ki_cpu.dar[15]
263 #define REG_VBR m68ki_cpu.vbr
264 #define REG_SFC m68ki_cpu.sfc
265 #define REG_DFC m68ki_cpu.dfc
266 #define REG_CACR m68ki_cpu.cacr
267 #define REG_CAAR m68ki_cpu.caar
268 #define REG_IR m68ki_cpu.ir
270 #define REG_FP m68ki_cpu.fpr
271 #define REG_FPCR m68ki_cpu.fpcr
272 #define REG_FPSR m68ki_cpu.fpsr
273 #define REG_FPIAR m68ki_cpu.fpiar
275 #define FLAG_T1 m68ki_cpu.t1_flag
276 #define FLAG_T0 m68ki_cpu.t0_flag
277 #define FLAG_S m68ki_cpu.s_flag
278 #define FLAG_M m68ki_cpu.m_flag
279 #define FLAG_X m68ki_cpu.x_flag
280 #define FLAG_N m68ki_cpu.n_flag
281 #define FLAG_Z m68ki_cpu.not_z_flag
282 #define FLAG_V m68ki_cpu.v_flag
283 #define FLAG_C m68ki_cpu.c_flag
284 #define FLAG_INT_MASK m68ki_cpu.int_mask
286 #define CPU_INT_LEVEL m68ki_cpu.int_level
287 #define CPU_INT_CYCLES m68ki_cpu.int_cycles
288 #define CPU_STOPPED m68ki_cpu.stopped
289 #define CPU_PREF_ADDR m68ki_cpu.pref_addr
290 #define CPU_PREF_DATA m68ki_cpu.pref_data
291 #define CPU_ADDRESS_MASK m68ki_cpu.address_mask
292 #define CPU_SR_MASK m68ki_cpu.sr_mask
293 #define CPU_INSTR_MODE m68ki_cpu.instr_mode
294 #define CPU_RUN_MODE m68ki_cpu.run_mode
296 #define CYC_INSTRUCTION m68ki_cpu.cyc_instruction
297 #define CYC_EXCEPTION m68ki_cpu.cyc_exception
298 #define CYC_BCC_NOTAKE_B m68ki_cpu.cyc_bcc_notake_b
299 #define CYC_BCC_NOTAKE_W m68ki_cpu.cyc_bcc_notake_w
300 #define CYC_DBCC_F_NOEXP m68ki_cpu.cyc_dbcc_f_noexp
301 #define CYC_DBCC_F_EXP m68ki_cpu.cyc_dbcc_f_exp
302 #define CYC_SCC_R_TRUE m68ki_cpu.cyc_scc_r_true
303 #define CYC_MOVEM_W m68ki_cpu.cyc_movem_w
304 #define CYC_MOVEM_L m68ki_cpu.cyc_movem_l
305 #define CYC_SHIFT m68ki_cpu.cyc_shift
306 #define CYC_RESET m68ki_cpu.cyc_reset
309 #define CALLBACK_INT_ACK m68ki_cpu.int_ack_callback
310 #define CALLBACK_BKPT_ACK m68ki_cpu.bkpt_ack_callback
311 #define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback
312 #define CALLBACK_CMPILD_INSTR m68ki_cpu.cmpild_instr_callback
313 #define CALLBACK_RTE_INSTR m68ki_cpu.rte_instr_callback
314 #define CALLBACK_TAS_INSTR m68ki_cpu.tas_instr_callback
315 #define CALLBACK_PC_CHANGED m68ki_cpu.pc_changed_callback
316 #define CALLBACK_SET_FC m68ki_cpu.set_fc_callback
317 #define CALLBACK_INSTR_HOOK m68ki_cpu.instr_hook_callback
327 #define CPU_TYPE_IS_040_PLUS(A) ((A) & CPU_TYPE_040)
328 #define CPU_TYPE_IS_040_LESS(A) 1
330 #define CPU_TYPE_IS_040_PLUS(A) 0
331 #define CPU_TYPE_IS_040_LESS(A) 1
335 #define CPU_TYPE_IS_020_PLUS(A) ((A) & (CPU_TYPE_020 | CPU_TYPE_040))
336 #define CPU_TYPE_IS_020_LESS(A) 1
338 #define CPU_TYPE_IS_020_PLUS(A) 0
339 #define CPU_TYPE_IS_020_LESS(A) 1
342 #if M68K_EMULATE_EC020
343 #define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
344 #define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020))
346 #define CPU_TYPE_IS_EC020_PLUS(A) CPU_TYPE_IS_020_PLUS(A)
347 #define CPU_TYPE_IS_EC020_LESS(A) CPU_TYPE_IS_020_LESS(A)
351 #define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010)
352 #define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
353 #define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010))
355 #define CPU_TYPE_IS_010(A) 0
356 #define CPU_TYPE_IS_010_PLUS(A) CPU_TYPE_IS_EC020_PLUS(A)
357 #define CPU_TYPE_IS_010_LESS(A) CPU_TYPE_IS_EC020_LESS(A)
360 #if M68K_EMULATE_020 || M68K_EMULATE_EC020
361 #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))
363 #define CPU_TYPE_IS_020_VARIANT(A) 0
366 #if M68K_EMULATE_040 || M68K_EMULATE_020 || M68K_EMULATE_EC020 || M68K_EMULATE_010
367 #define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000 || (A) == CPU_TYPE_008)
369 #define CPU_TYPE_IS_000(A) 1
373 #if !M68K_SEPARATE_READS
374 #define m68k_read_immediate_16(A) m68ki_read_program_16(A)
375 #define m68k_read_immediate_32(A) m68ki_read_program_32(A)
377 #define m68k_read_pcrelative_8(A) m68ki_read_program_8(A)
378 #define m68k_read_pcrelative_16(A) m68ki_read_program_16(A)
379 #define m68k_read_pcrelative_32(A) m68ki_read_program_32(A)
384 #if M68K_EMULATE_INT_ACK
385 #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER
386 #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A)
388 #define m68ki_int_ack(A) CALLBACK_INT_ACK(A)
392 #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR
395 #if M68K_EMULATE_BKPT_ACK
396 #if M68K_EMULATE_BKPT_ACK == OPT_SPECIFY_HANDLER
397 #define m68ki_bkpt_ack(A) M68K_BKPT_ACK_CALLBACK(A)
399 #define m68ki_bkpt_ack(A) CALLBACK_BKPT_ACK(A)
402 #define m68ki_bkpt_ack(A)
405 #if M68K_EMULATE_RESET
406 #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER
407 #define m68ki_output_reset() M68K_RESET_CALLBACK()
409 #define m68ki_output_reset() CALLBACK_RESET_INSTR()
412 #define m68ki_output_reset()
415 #if M68K_CMPILD_HAS_CALLBACK
416 #if M68K_CMPILD_HAS_CALLBACK == OPT_SPECIFY_HANDLER
417 #define m68ki_cmpild_callback(v,r) M68K_CMPILD_CALLBACK(v,r)
419 #define m68ki_cmpild_callback(v,r) CALLBACK_CMPILD_INSTR(v,r)
422 #define m68ki_cmpild_callback(v,r)
425 #if M68K_RTE_HAS_CALLBACK
426 #if M68K_RTE_HAS_CALLBACK == OPT_SPECIFY_HANDLER
427 #define m68ki_rte_callback() M68K_RTE_CALLBACK()
429 #define m68ki_rte_callback() CALLBACK_RTE_INSTR()
432 #define m68ki_rte_callback()
435 #if M68K_TAS_HAS_CALLBACK
436 #if M68K_TAS_HAS_CALLBACK == OPT_SPECIFY_HANDLER
437 #define m68ki_tas_callback() M68K_TAS_CALLBACK()
439 #define m68ki_tas_callback() CALLBACK_TAS_INSTR()
442 #define m68ki_tas_callback() 0
446 #if M68K_INSTRUCTION_HOOK
447 #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER
448 #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK()
450 #define m68ki_instr_hook() CALLBACK_INSTR_HOOK()
453 #define m68ki_instr_hook()
457 #if M68K_MONITOR_PC == OPT_SPECIFY_HANDLER
458 #define m68ki_pc_changed(A) M68K_SET_PC_CALLBACK(ADDRESS_68K(A))
460 #define m68ki_pc_changed(A) CALLBACK_PC_CHANGED(ADDRESS_68K(A))
463 #define m68ki_pc_changed(A)
469 #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER
470 #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A)
472 #define m68ki_set_fc(A) CALLBACK_SET_FC(A)
474 #define m68ki_use_data_space() m68ki_address_space = FUNCTION_CODE_USER_DATA
475 #define m68ki_use_program_space() m68ki_address_space = FUNCTION_CODE_USER_PROGRAM
476 #define m68ki_get_address_space() m68ki_address_space
478 #define m68ki_set_fc(A) (void)(A)
479 #define m68ki_use_data_space()
480 #define m68ki_use_program_space()
481 #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA
486 #if M68K_EMULATE_TRACE
488 #define m68ki_trace_t1() m68ki_tracing = FLAG_T1
490 #define m68ki_trace_t0() m68ki_tracing |= FLAG_T0
492 #define m68ki_clear_trace() m68ki_tracing = 0
494 #define m68ki_exception_if_trace() if(m68ki_tracing) m68ki_exception_trace()
496 #define m68ki_trace_t1()
497 #define m68ki_trace_t0()
498 #define m68ki_clear_trace()
499 #define m68ki_exception_if_trace()
505 #if M68K_EMULATE_ADDRESS_ERROR
507 extern jmp_buf m68ki_aerr_trap;
509 #define m68ki_set_address_error_trap() \
510 if(setjmp(m68ki_aerr_trap) != 0) \
512 m68ki_exception_address_error(); \
516 CPU_INT_CYCLES = 0; \
517 return m68ki_initial_cycles; \
521 #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) \
524 m68ki_aerr_address = ADDR; \
525 m68ki_aerr_write_mode = WRITE_MODE; \
526 m68ki_aerr_fc = FC; \
527 longjmp(m68ki_aerr_trap, 1); \
530 #define m68ki_check_address_error_010_less(ADDR, WRITE_MODE, FC) \
531 if (CPU_TYPE_IS_010_LESS(CPU_TYPE)) \
533 m68ki_check_address_error(ADDR, WRITE_MODE, FC) \
536 #define m68ki_set_address_error_trap()
537 #define m68ki_check_address_error(ADDR, WRITE_MODE, FC)
538 #define m68ki_check_address_error_010_less(ADDR, WRITE_MODE, FC)
547 #define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A
548 #if M68K_LOG_1010_1111
549 #define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A
551 #define M68K_DO_LOG_EMU(A)
554 #define M68K_DO_LOG(A)
555 #define M68K_DO_LOG_EMU(A)
568 #define DX (REG_D[(REG_IR >> 9) & 7])
569 #define DY (REG_D[REG_IR & 7])
571 #define AX (REG_A[(REG_IR >> 9) & 7])
572 #define AY (REG_A[REG_IR & 7])
576 #define EA_AY_AI_8() AY
577 #define EA_AY_AI_16() EA_AY_AI_8()
578 #define EA_AY_AI_32() EA_AY_AI_8()
579 #define EA_AY_PI_8() (AY++)
580 #define EA_AY_PI_16() ((AY+=2)-2)
581 #define EA_AY_PI_32() ((AY+=4)-4)
582 #define EA_AY_PD_8() (--AY)
583 #define EA_AY_PD_16() (AY-=2)
584 #define EA_AY_PD_32() (AY-=4)
585 #define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16()))
586 #define EA_AY_DI_16() EA_AY_DI_8()
587 #define EA_AY_DI_32() EA_AY_DI_8()
588 #define EA_AY_IX_8() m68ki_get_ea_ix(AY)
589 #define EA_AY_IX_16() EA_AY_IX_8()
590 #define EA_AY_IX_32() EA_AY_IX_8()
592 #define EA_AX_AI_8() AX
593 #define EA_AX_AI_16() EA_AX_AI_8()
594 #define EA_AX_AI_32() EA_AX_AI_8()
595 #define EA_AX_PI_8() (AX++)
596 #define EA_AX_PI_16() ((AX+=2)-2)
597 #define EA_AX_PI_32() ((AX+=4)-4)
598 #define EA_AX_PD_8() (--AX)
599 #define EA_AX_PD_16() (AX-=2)
600 #define EA_AX_PD_32() (AX-=4)
601 #define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16()))
602 #define EA_AX_DI_16() EA_AX_DI_8()
603 #define EA_AX_DI_32() EA_AX_DI_8()
604 #define EA_AX_IX_8() m68ki_get_ea_ix(AX)
605 #define EA_AX_IX_16() EA_AX_IX_8()
606 #define EA_AX_IX_32() EA_AX_IX_8()
608 #define EA_A7_PI_8() ((REG_A[7]+=2)-2)
609 #define EA_A7_PD_8() (REG_A[7]-=2)
611 #define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16())
612 #define EA_AW_16() EA_AW_8()
613 #define EA_AW_32() EA_AW_8()
614 #define EA_AL_8() m68ki_read_imm_32()
615 #define EA_AL_16() EA_AL_8()
616 #define EA_AL_32() EA_AL_8()
617 #define EA_PCDI_8() m68ki_get_ea_pcdi()
618 #define EA_PCDI_16() EA_PCDI_8()
619 #define EA_PCDI_32() EA_PCDI_8()
620 #define EA_PCIX_8() m68ki_get_ea_pcix()
621 #define EA_PCIX_16() EA_PCIX_8()
622 #define EA_PCIX_32() EA_PCIX_8()
625 #define OPER_I_8() m68ki_read_imm_8()
626 #define OPER_I_16() m68ki_read_imm_16()
627 #define OPER_I_32() m68ki_read_imm_32()
634 #define CFLAG_8(A) (A)
635 #define CFLAG_16(A) ((A)>>8)
637 #if M68K_INT_GT_32_BIT
638 #define CFLAG_ADD_32(S, D, R) ((R)>>24)
639 #define CFLAG_SUB_32(S, D, R) ((R)>>24)
641 #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23)
642 #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23)
645 #define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R))
646 #define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8)
647 #define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24)
649 #define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D))
650 #define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8)
651 #define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24)
653 #define NFLAG_8(A) (A)
654 #define NFLAG_16(A) ((A)>>8)
655 #define NFLAG_32(A) ((A)>>24)
656 #define NFLAG_64(A) ((A)>>56)
658 #define ZFLAG_8(A) MASK_OUT_ABOVE_8(A)
659 #define ZFLAG_16(A) MASK_OUT_ABOVE_16(A)
660 #define ZFLAG_32(A) MASK_OUT_ABOVE_32(A)
664 #define NFLAG_SET 0x80
665 #define NFLAG_CLEAR 0
666 #define CFLAG_SET 0x100
667 #define CFLAG_CLEAR 0
668 #define XFLAG_SET 0x100
669 #define XFLAG_CLEAR 0
670 #define VFLAG_SET 0x80
671 #define VFLAG_CLEAR 0
673 #define ZFLAG_CLEAR 0xffffffff
676 #define SFLAG_CLEAR 0
678 #define MFLAG_CLEAR 0
681 #define XFLAG_AS_1() ((FLAG_X>>8)&1)
682 #define NFLAG_AS_1() ((FLAG_N>>7)&1)
683 #define VFLAG_AS_1() ((FLAG_V>>7)&1)
684 #define ZFLAG_AS_1() (!FLAG_Z)
685 #define CFLAG_AS_1() ((FLAG_C>>8)&1)
689 #define COND_CS() (FLAG_C&0x100)
690 #define COND_CC() (!COND_CS())
691 #define COND_VS() (FLAG_V&0x80)
692 #define COND_VC() (!COND_VS())
693 #define COND_NE() FLAG_Z
694 #define COND_EQ() (!COND_NE())
695 #define COND_MI() (FLAG_N&0x80)
696 #define COND_PL() (!COND_MI())
697 #define COND_LT() ((FLAG_N^FLAG_V)&0x80)
698 #define COND_GE() (!COND_LT())
699 #define COND_HI() (COND_CC() && COND_NE())
700 #define COND_LS() (COND_CS() || COND_EQ())
701 #define COND_GT() (COND_GE() && COND_NE())
702 #define COND_LE() (COND_LT() || COND_EQ())
705 #define COND_NOT_CS() COND_CC()
706 #define COND_NOT_CC() COND_CS()
707 #define COND_NOT_VS() COND_VC()
708 #define COND_NOT_VC() COND_VS()
709 #define COND_NOT_NE() COND_EQ()
710 #define COND_NOT_EQ() COND_NE()
711 #define COND_NOT_MI() COND_PL()
712 #define COND_NOT_PL() COND_MI()
713 #define COND_NOT_LT() COND_GE()
714 #define COND_NOT_GE() COND_LT()
715 #define COND_NOT_HI() COND_LS()
716 #define COND_NOT_LS() COND_HI()
717 #define COND_NOT_GT() COND_LE()
718 #define COND_NOT_LE() COND_GT()
721 #define COND_XS() (FLAG_X&0x100)
722 #define COND_XC() (!COND_XS)
726 #define m68ki_get_ccr() ((COND_XS() >> 4) | \
733 #define m68ki_get_sr() ( FLAG_T1 | \
744 #define ADD_CYCLES(A) m68ki_remaining_cycles += (A)
745 #define USE_CYCLES(A) m68ki_remaining_cycles -= (A)
746 #define SET_CYCLES(A) m68ki_remaining_cycles = A
747 #define GET_CYCLES() m68ki_remaining_cycles
748 #define USE_ALL_CYCLES() m68ki_remaining_cycles = 0
755 #define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space())
756 #define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space())
757 #define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space())
760 #define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
761 #define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
762 #define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
764 #if M68K_SIMULATE_PD_WRITES
765 #define m68ki_write_32_pd(A, V) m68ki_write_32_pd_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
767 #define m68ki_write_32_pd(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
771 #define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16())
774 #define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A)
775 #define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A)
776 #define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A)
779 #define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
780 #define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
781 #define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
784 #define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
785 #define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
786 #define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
855 int (*int_ack_callback)(
int int_line);
856 void (*bkpt_ack_callback)(
unsigned int data);
857 void (*reset_instr_callback)(void);
858 void (*cmpild_instr_callback)(
unsigned int, int);
859 void (*rte_instr_callback)(void);
860 int (*tas_instr_callback)(void);
861 void (*pc_changed_callback)(
unsigned int new_pc);
862 void (*set_fc_callback)(
unsigned int new_fc);
863 int (*instr_hook_callback)(void);
895 #if M68K_SIMULATE_PD_WRITES
1016 #if M68K_EMULATE_PREFETCH
1031 #if M68K_EMULATE_PREFETCH
1064 #if M68K_REGISTER_MEMORY
1072 for (i = 0; (i != m68ki_cpu.
mem_len); ++
i) {
1075 if (((address ^ mem->
swab) >= mem->
addr) &&
1082 #define m68ki_read_memory_8_direct(a) \
1084 m68k_mem_t *mem = m68ki_locate_memory(a); \
1087 return ((uint8 *)mem->mem) \
1088 [((((a) - mem->addr) ^ mem->swab) & \
1093 #define m68ki_read_memory_16_direct(a) \
1095 m68k_mem_t *mem = m68ki_locate_memory(a); \
1097 if (mem != NULL) { \
1098 uint8 *m = &((uint8 *)mem->mem) \
1099 [(((a) - mem->addr) & mem->mask)]; \
1101 return ((m[mem->swab] << 8) | \
1102 m[(mem->swab ^ 1)]); \
1107 #define m68ki_read_memory_32_direct(a) \
1109 m68k_mem_t *mem = m68ki_locate_memory(a); \
1111 if (mem != NULL) { \
1112 uint8 *m = &((uint8 *)mem->mem) \
1113 [(((a) - mem->addr) & mem->mask)]; \
1115 return ((m[mem->swab] << 24) | \
1116 (m[(mem->swab ^ 1)] << 16) | \
1117 (m[(mem->swab + 2)] << 8) | \
1118 m[((mem->swab + 2) ^ 1)]); \
1123 #define m68ki_write_memory_8_direct(a, v) \
1125 m68k_mem_t *mem = m68ki_locate_memory(a); \
1127 if (mem != NULL) { \
1128 ((uint8 *)mem->mem) \
1129 [((((a) - mem->addr) ^ mem->swab) & \
1130 mem->mask)] = (v); \
1136 #define m68ki_write_memory_16_direct(a, v) \
1138 m68k_mem_t *mem = m68ki_locate_memory(a); \
1140 if (mem != NULL) { \
1141 uint8 *m = &((uint8 *)mem->mem) \
1142 [(((a) - mem->addr) & mem->mask)]; \
1144 m[mem->swab] = ((v) >> 8); \
1145 m[(mem->swab ^ 1)] = (v); \
1151 #define m68ki_write_memory_32_direct(a, v) \
1153 m68k_mem_t *mem = m68ki_locate_memory(a); \
1155 if (mem != NULL) { \
1156 uint8 *m = &((uint8 *)mem->mem) \
1157 [(((a) - mem->addr) & mem->mask)]; \
1159 m[mem->swab] = ((v) >> 24); \
1160 m[(mem->swab ^ 1)] = ((v) >> 16); \
1161 m[(mem->swab + 2)] = ((v) >> 8); \
1162 m[((mem->swab + 2) ^ 1)] = (v); \
1170 #define m68ki_read_memory_8_direct(a) (void)0
1171 #define m68ki_read_memory_16_direct(a) (void)0
1172 #define m68ki_read_memory_32_direct(a) (void)0
1174 #define m68ki_write_memory_8_direct(a, v) (void)0
1175 #define m68ki_write_memory_16_direct(a, v) (void)0
1176 #define m68ki_write_memory_32_direct(a, v) (void)0
1228 #if M68K_SIMULATE_PD_WRITES
1310 Xn =
REG_DA[extension>>12];
1311 if(!
BIT_B(extension))
1319 if(!
BIT_8(extension))
1322 Xn =
REG_DA[extension>>12];
1323 if(!
BIT_B(extension))
1327 Xn <<= (extension>>9) & 3;
1338 if(
BIT_7(extension))
1342 if(!
BIT_6(extension))
1344 Xn =
REG_DA[extension>>12];
1345 if(!
BIT_B(extension))
1347 Xn <<= (extension>>9) & 3;
1351 if(
BIT_5(extension))
1356 return An + bd + Xn;
1359 if(
BIT_1(extension))
1363 if(
BIT_2(extension))
1889 #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
1914 #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
1932 #if M68K_LOG_1010_1111 == OPT_ON
1951 #if M68K_LOG_1010_1111 == OPT_ON
1976 #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
2035 #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
2059 else if(vector > 255)
2094 #if !M68K_EMULATE_INT_ACK