2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
18 //#if defined(HAS_MC6801) || defined(HAS_HD6301)
19 //#define SIG_MC6801_PORT_1 0
20 //#define SIG_MC6801_PORT_2 1
21 //#define SIG_MC6801_PORT_3 2
22 //#define SIG_MC6801_PORT_4 3
23 //#define SIG_MC6801_PORT_3_SC1 4
24 //#define SIG_MC6801_PORT_3_SC2 5
25 //#define SIG_MC6801_SIO_RECV 6
34 class MC6800 : public DEVICE
44 static const uint8_t flags8i[256];
45 static const uint8_t flags8d[256];
46 #define XX 5 // invalid opcode unknown cc
47 const uint8_t cycles[256] = {
48 //#if defined(HAS_MC6800)
49 XX, 2,XX,XX,XX,XX, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2,
50 2, 2,XX,XX,XX,XX, 2, 2,XX, 2,XX, 2,XX,XX,XX,XX,
51 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
52 4, 4, 4, 4, 4, 4, 4, 4,XX, 5,XX,10,XX,XX, 9,12,
53 2,XX,XX, 2, 2,XX, 2, 2, 2, 2, 2,XX, 2, 2,XX, 2,
54 2,XX,XX, 2, 2,XX, 2, 2, 2, 2, 2,XX, 2, 2,XX, 2,
55 7,XX,XX, 7, 7,XX, 7, 7, 7, 7, 7,XX, 7, 7, 4, 7,
56 6,XX,XX, 6, 6,XX, 6, 6, 6, 6, 6,XX, 6, 6, 3, 6,
57 2, 2, 2,XX, 2, 2, 2, 3, 2, 2, 2, 2, 3, 8, 3, 4,
58 3, 3, 3,XX, 3, 3, 3, 4, 3, 3, 3, 3, 4, 6, 4, 5,
59 5, 5, 5,XX, 5, 5, 5, 6, 5, 5, 5, 5, 6, 8, 6, 7,
60 4, 4, 4,XX, 4, 4, 4, 5, 4, 4, 4, 4, 5, 9, 5, 6,
61 2, 2, 2,XX, 2, 2, 2, 3, 2, 2, 2, 2,XX,XX, 3, 4,
62 3, 3, 3,XX, 3, 3, 3, 4, 3, 3, 3, 3,XX,XX, 4, 5,
63 5, 5, 5,XX, 5, 5, 5, 6, 5, 5, 5, 5,XX,XX, 6, 7,
64 4, 4, 4,XX, 4, 4, 4, 5, 4, 4, 4, 4,XX,XX, 5, 6
66 #undef XX // invalid opcode unknown cc
80 uint64_t total_icount;
81 uint64_t prev_total_icount;
86 virtual uint32_t RM(uint32_t Addr);
87 virtual void WM(uint32_t Addr, uint32_t Value);
88 uint32_t RM16(uint32_t Addr);
89 void WM16(uint32_t Addr, pair32_t *p);
92 virtual void increment_counter(int amount);
93 virtual void run_one_opecode();
94 void enter_interrupt(uint16_t irq_vector);
95 virtual void insn(uint8_t code);
197 virtual void illegal();
306 unsigned Dasm680x(int subtype, _TCHAR *buf, unsigned pc, const UINT8 *oprom, const UINT8 *opram, symbol_t *first_symbol);
310 MC6800(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
315 __USE_DEBUGGER = false;
316 //#if defined(HAS_MC6801) || defined(HAS_HD6301)
317 // for(int i = 0; i < 4; i++) {
318 // initialize_output_signals(&port[i].outputs);
319 // port[i].wreg = port[i].rreg = 0;//0xff;
321 // initialize_output_signals(&outputs_sio);
323 //#if defined(HAS_MC6801)
324 // set_device_name(_T("MC6801 MPU"));
325 //#elif defined(HAS_HD6301)
326 // set_device_name(_T("HD6301 MPU"));
328 set_device_name(_T("MC6800 MPU"));
334 virtual void initialize();
335 virtual void reset();
336 virtual int run(int clock);
338 virtual void write_signal(int id, uint32_t data, uint32_t mask);
343 uint32_t get_next_pc()
347 //#ifdef USE_DEBUGGER
352 uint32_t get_debug_prog_addr_mask()
356 uint32_t get_debug_data_addr_mask()
360 void write_debug_data8(uint32_t addr, uint32_t data);
361 uint32_t read_debug_data8(uint32_t addr);
362 // implement 16bit/32bit functions because this cpu is big endian
363 void write_debug_data16(uint32_t addr, uint32_t data);
364 uint32_t read_debug_data16(uint32_t addr);
365 void write_debug_data32(uint32_t addr, uint32_t data);
366 uint32_t read_debug_data32(uint32_t addr);
367 bool write_debug_reg(const _TCHAR *reg, uint32_t data);
368 bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
369 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
371 virtual bool process_state(FILEIO* state_fio, bool loading);
374 void set_context_mem(DEVICE* device)
378 //#ifdef USE_DEBUGGER
379 void set_context_debugger(DEBUGGER* device)