📄 sim-main.h
字号:
SIM_SIGNAL excep, uint16 addr, const char *message);inline address_wordphys_to_virt (sim_cpu *cpu, address_word addr){ if (addr >= cpu->bank_start && addr < cpu->bank_end) return ((address_word) (addr - cpu->bank_start) + (((address_word) cpu->cpu_regs.page) << cpu->bank_shift) + cpu->bank_virtual); else return (address_word) (addr);}inline uint8memory_read8 (sim_cpu *cpu, uint16 addr){ uint8 val; if (sim_core_read_buffer (CPU_STATE (cpu), cpu, 0, &val, addr, 1) != 1) { cpu_memory_exception (cpu, SIM_SIGSEGV, addr, "Read error"); } return val;}inline voidmemory_write8 (sim_cpu *cpu, uint16 addr, uint8 val){ if (sim_core_write_buffer (CPU_STATE (cpu), cpu, 0, &val, addr, 1) != 1) { cpu_memory_exception (cpu, SIM_SIGSEGV, addr, "Write error"); }}inline uint16memory_read16 (sim_cpu *cpu, uint16 addr){ uint8 b[2]; if (sim_core_read_buffer (CPU_STATE (cpu), cpu, 0, b, addr, 2) != 2) { cpu_memory_exception (cpu, SIM_SIGSEGV, addr, "Read error"); } return (((uint16) (b[0])) << 8) | ((uint16) b[1]);}inline voidmemory_write16 (sim_cpu *cpu, uint16 addr, uint16 val){ uint8 b[2]; b[0] = val >> 8; b[1] = val; if (sim_core_write_buffer (CPU_STATE (cpu), cpu, 0, b, addr, 2) != 2) { cpu_memory_exception (cpu, SIM_SIGSEGV, addr, "Write error"); }}extern voidcpu_ccr_update_tst8 (sim_cpu *proc, uint8 val); inline voidcpu_ccr_update_tst16 (sim_cpu *proc, uint16 val){ cpu_set_ccr_V (proc, 0); cpu_set_ccr_N (proc, val & 0x8000 ? 1 : 0); cpu_set_ccr_Z (proc, val == 0 ? 1 : 0);} inline voidcpu_ccr_update_shift8 (sim_cpu *proc, uint8 val){ cpu_set_ccr_N (proc, val & 0x80 ? 1 : 0); cpu_set_ccr_Z (proc, val == 0 ? 1 : 0); cpu_set_ccr_V (proc, cpu_get_ccr_N (proc) ^ cpu_get_ccr_C (proc));} inline voidcpu_ccr_update_shift16 (sim_cpu *proc, uint16 val){ cpu_set_ccr_N (proc, val & 0x8000 ? 1 : 0); cpu_set_ccr_Z (proc, val == 0 ? 1 : 0); cpu_set_ccr_V (proc, cpu_get_ccr_N (proc) ^ cpu_get_ccr_C (proc));}inline voidcpu_ccr_update_add8 (sim_cpu *proc, uint8 r, uint8 a, uint8 b){ cpu_set_ccr_C (proc, ((a & b) | (b & ~r) | (a & ~r)) & 0x80 ? 1 : 0); cpu_set_ccr_V (proc, ((a & b & ~r) | (~a & ~b & r)) & 0x80 ? 1 : 0); cpu_set_ccr_Z (proc, r == 0); cpu_set_ccr_N (proc, r & 0x80 ? 1 : 0);}inline voidcpu_ccr_update_sub8 (sim_cpu *proc, uint8 r, uint8 a, uint8 b){ cpu_set_ccr_C (proc, ((~a & b) | (b & r) | (~a & r)) & 0x80 ? 1 : 0); cpu_set_ccr_V (proc, ((a & ~b & ~r) | (~a & b & r)) & 0x80 ? 1 : 0); cpu_set_ccr_Z (proc, r == 0); cpu_set_ccr_N (proc, r & 0x80 ? 1 : 0);}inline voidcpu_ccr_update_add16 (sim_cpu *proc, uint16 r, uint16 a, uint16 b){ cpu_set_ccr_C (proc, ((a & b) | (b & ~r) | (a & ~r)) & 0x8000 ? 1 : 0); cpu_set_ccr_V (proc, ((a & b & ~r) | (~a & ~b & r)) & 0x8000 ? 1 : 0); cpu_set_ccr_Z (proc, r == 0); cpu_set_ccr_N (proc, r & 0x8000 ? 1 : 0);}inline voidcpu_ccr_update_sub16 (sim_cpu *proc, uint16 r, uint16 a, uint16 b){ cpu_set_ccr_C (proc, ((~a & b) | (b & r) | (~a & r)) & 0x8000 ? 1 : 0); cpu_set_ccr_V (proc, ((a & ~b & ~r) | (~a & b & r)) & 0x8000 ? 1 : 0); cpu_set_ccr_Z (proc, r == 0); cpu_set_ccr_N (proc, r & 0x8000 ? 1 : 0);}/* Push and pop instructions for 68HC11 (next-available stack mode). */inline voidcpu_m68hc11_push_uint8 (sim_cpu *proc, uint8 val){ uint16 addr = proc->cpu_regs.sp; memory_write8 (proc, addr, val); proc->cpu_regs.sp = addr - 1;}inline voidcpu_m68hc11_push_uint16 (sim_cpu *proc, uint16 val){ uint16 addr = proc->cpu_regs.sp - 1; memory_write16 (proc, addr, val); proc->cpu_regs.sp = addr - 1;}inline uint8cpu_m68hc11_pop_uint8 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.sp; uint8 val; val = memory_read8 (proc, addr + 1); proc->cpu_regs.sp = addr + 1; return val;}inline uint16cpu_m68hc11_pop_uint16 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.sp; uint16 val; val = memory_read16 (proc, addr + 1); proc->cpu_regs.sp = addr + 2; return val;}/* Push and pop instructions for 68HC12 (last-used stack mode). */inline voidcpu_m68hc12_push_uint8 (sim_cpu *proc, uint8 val){ uint16 addr = proc->cpu_regs.sp; addr --; memory_write8 (proc, addr, val); proc->cpu_regs.sp = addr;}inline voidcpu_m68hc12_push_uint16 (sim_cpu *proc, uint16 val){ uint16 addr = proc->cpu_regs.sp; addr -= 2; memory_write16 (proc, addr, val); proc->cpu_regs.sp = addr;}inline uint8cpu_m68hc12_pop_uint8 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.sp; uint8 val; val = memory_read8 (proc, addr); proc->cpu_regs.sp = addr + 1; return val;}inline uint16cpu_m68hc12_pop_uint16 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.sp; uint16 val; val = memory_read16 (proc, addr); proc->cpu_regs.sp = addr + 2; return val;}/* Fetch a 8/16 bit value and update the PC. */inline uint8cpu_fetch8 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.pc; uint8 val; val = memory_read8 (proc, addr); proc->cpu_regs.pc = addr + 1; return val;}inline uint16cpu_fetch16 (sim_cpu *proc){ uint16 addr = proc->cpu_regs.pc; uint16 val; val = memory_read16 (proc, addr); proc->cpu_regs.pc = addr + 2; return val;}extern void cpu_call (sim_cpu* proc, uint16 addr);extern void cpu_exg (sim_cpu* proc, uint8 code);extern void cpu_dbcc (sim_cpu* proc);extern void cpu_special (sim_cpu *proc, enum M6811_Special special);extern void cpu_move8 (sim_cpu *proc, uint8 op);extern void cpu_move16 (sim_cpu *proc, uint8 op);extern uint16 cpu_fetch_relbranch (sim_cpu *proc);extern uint16 cpu_fetch_relbranch16 (sim_cpu *proc);extern void cpu_push_all (sim_cpu *proc);extern void cpu_single_step (sim_cpu *proc);extern void cpu_info (SIM_DESC sd, sim_cpu *proc);extern int cpu_initialize (SIM_DESC sd, sim_cpu *cpu);/* Returns the address of a 68HC12 indexed operand. Pre and post modifications are handled on the source register. */extern uint16 cpu_get_indexed_operand_addr (sim_cpu* cpu, int restrict);extern void cpu_return (sim_cpu *cpu);extern void cpu_set_sp (sim_cpu *cpu, uint16 val);extern int cpu_reset (sim_cpu *cpu);extern int cpu_restart (sim_cpu *cpu);extern void sim_memory_error (sim_cpu *cpu, SIM_SIGNAL excep, uint16 addr, const char *message, ...);extern void emul_os (int op, sim_cpu *cpu);extern void cpu_interp_m6811 (sim_cpu *cpu);extern void cpu_interp_m6812 (sim_cpu *cpu);extern int m68hc11cpu_set_oscillator (SIM_DESC sd, const char *port, double ton, double toff, signed64 repeat);extern int m68hc11cpu_clear_oscillator (SIM_DESC sd, const char *port);extern void m68hc11cpu_set_port (struct hw *me, sim_cpu *cpu, unsigned addr, uint8 val);/* The current state of the processor; registers, memory, etc. */#define CIA_GET(CPU) (cpu_get_pc (CPU))#define CIA_SET(CPU,VAL) (cpu_set_pc ((CPU), (VAL)))#if (WITH_SMP)#define STATE_CPU(sd,n) (&(sd)->cpu[n])#else#define STATE_CPU(sd,n) (&(sd)->cpu[0])#endifstruct sim_state { sim_cpu cpu[MAX_NR_PROCESSORS]; device *devices; sim_state_base base;};extern void sim_set_profile (int n);extern void sim_set_profile_size (int n);extern void sim_board_reset (SIM_DESC sd);#define PRINT_TIME 0x01#define PRINT_CYCLE 0x02extern const char *cycle_to_string (sim_cpu *cpu, signed64 t, int flags);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -