OSDN Git Service

[DOC] For release 2017-01-24.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mc6809.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.142
5         Author : Takeda.Toshiya
6         Date   : 2011.05.06-
7
8         [ MC6809 ]
9 */
10
11 #ifndef _MC6809_H_
12 #define _MC6809_H_
13
14 #include "vm.h"
15 #include "../emu.h"
16 #include "device.h"
17
18 #ifdef USE_DEBUGGER
19 class DEBUGGER;
20 #endif
21
22 class MC6809 : public DEVICE
23 {
24 private:
25         // context
26         DEVICE *d_mem;
27 #ifdef USE_DEBUGGER
28         DEBUGGER *d_debugger;
29         DEVICE *d_mem_stored;
30         int dasm_ptr;
31 #endif
32         outputs_t outputs_bus_halt; // For sync
33
34         outputs_t outputs_bus_clr; // If clr() insn used, write "1" or "2".
35         bool clr_used;
36
37         // registers
38         pair_t pc;      /* Program counter */
39         pair_t ppc;     /* Previous program counter */
40         pair_t acc;     /* Accumulator a and b */
41         pair_t dp;      /* Direct Page register (page in MSB) */
42         pair_t u, s;    /* Stack pointers */
43         pair_t x, y;    /* Index registers */
44         uint8_t cc;
45         pair_t ea;      /* effective address */
46         
47         uint32_t int_state;
48         bool busreq;
49         int icount;
50         int extra_icount;
51         void WM16(uint32_t Addr, pair_t *p);
52         void cpu_irq(void);
53         void cpu_firq(void);
54         void cpu_nmi(void);
55         
56         // opcodes
57         void run_one_opecode();
58         void op(uint8_t ireg);
59         void fetch_effective_address();
60         void fetch_effective_address_IDX(uint8_t upper, uint8_t lower);
61         // Useful routines.
62         inline void BRANCH(bool cond);
63         inline void LBRANCH(bool cond);
64         
65         inline pair_t RM16_PAIR(uint32_t addr);
66         inline uint8_t GET_INDEXED_DATA(void);
67         inline pair_t GET_INDEXED_DATA16(void);
68         
69         inline void  NEG_MEM(uint8_t a_neg);
70         inline uint8_t NEG_REG(uint8_t r_neg);
71         inline void  COM_MEM(uint8_t a_neg);
72         inline uint8_t COM_REG(uint8_t r_neg);
73         inline void  LSR_MEM(uint8_t a_neg);
74         inline uint8_t LSR_REG(uint8_t r_neg);
75         inline void  ROR_MEM(uint8_t a_neg);
76         inline uint8_t ROR_REG(uint8_t r_neg);
77         inline void  ASR_MEM(uint8_t a_neg);
78         inline uint8_t ASR_REG(uint8_t r_neg);
79         inline void  ASL_MEM(uint8_t a_neg);
80         inline uint8_t ASL_REG(uint8_t r_neg);
81         inline void  ROL_MEM(uint8_t a_neg);
82         inline uint8_t ROL_REG(uint8_t r_neg);
83         inline void  DEC_MEM(uint8_t a_neg);
84         inline uint8_t DEC_REG(uint8_t r_neg);
85         inline void  DCC_MEM(uint8_t a_neg);
86         inline uint8_t DCC_REG(uint8_t r_neg);
87         inline void  INC_MEM(uint8_t a_neg);
88         inline uint8_t INC_REG(uint8_t r_neg);
89         inline void  TST_MEM(uint8_t a_neg);
90         inline uint8_t TST_REG(uint8_t r_neg);
91         inline uint8_t CLC_REG(uint8_t r_neg);
92         inline void  CLR_MEM(uint8_t a_neg);
93         inline uint8_t CLR_REG(uint8_t r_neg);
94         
95         inline uint8_t SUB8_REG(uint8_t reg, uint8_t data);
96         inline uint8_t CMP8_REG(uint8_t reg, uint8_t data);
97         inline uint8_t SBC8_REG(uint8_t reg, uint8_t data);
98         inline uint8_t AND8_REG(uint8_t reg, uint8_t data);
99         inline uint8_t BIT8_REG(uint8_t reg, uint8_t data);
100         inline uint8_t OR8_REG(uint8_t reg, uint8_t data);
101         inline uint8_t EOR8_REG(uint8_t reg, uint8_t data);
102         inline uint8_t ADD8_REG(uint8_t reg, uint8_t data);
103         inline uint8_t ADC8_REG(uint8_t reg, uint8_t data);
104         inline void  STORE8_REG(uint8_t reg);
105         inline uint8_t LOAD8_REG(uint8_t reg);
106
107         inline uint16_t SUB16_REG(uint16_t reg, uint16_t data);
108         inline uint16_t ADD16_REG(uint16_t reg, uint16_t data);
109         inline uint16_t CMP16_REG(uint16_t reg, uint16_t data);
110         inline uint16_t LOAD16_REG(uint16_t reg);
111         inline void STORE16_REG(pair_t *p);
112
113  public:
114         void abx();
115         void adca_di();
116         void adca_ex();
117         inline void adca_im();
118         void adca_ix();
119         void adcb_di();
120          void adcb_ex();
121          void adcb_im();
122          void adcb_ix();
123          void adda_di();
124          void adda_ex();
125          void adda_im();
126          void adda_ix();
127          void addb_di();
128          void addb_ex();
129          void addb_im();
130          void addb_ix();
131          void addd_di();
132          void addd_ex();
133          void addd_im();
134          void addd_ix();
135          void anda_di();
136          void anda_ex();
137          void anda_im();
138          void anda_ix();
139          void andb_di();
140          void andb_ex();
141          void andb_im();
142          void andb_ix();
143          void andcc();
144          void asla();
145          void aslb();
146          void aslcc_in();
147          void asl_di();
148          void asl_ex();
149          void asl_ix();
150          void asra();
151          void asrb();
152          void asr_di();
153          void asr_ex();
154          void asr_ix();
155          void bcc();
156          void bcs();
157          void beq();
158          void bge();
159          void bgt();
160          void bhi();
161          void bita_di();
162          void bita_ex();
163          void bita_im();
164          void bita_ix();
165          void bitb_di();
166          void bitb_ex();
167          void bitb_im();
168          void bitb_ix();
169          void ble();
170          void bls();
171          void blt();
172          void bmi();
173          void bne();
174          void bpl();
175          void bra();
176          void brn();
177          void bsr();
178          void bvc();
179          void bvs();
180          void clca();
181          void clcb();
182          void clra();
183          void clrb();
184          void clr_di();
185          void clr_ex();
186          void clr_ix();
187          void cmpa_di();
188          void cmpa_ex();
189          void cmpa_im();
190          void cmpa_ix();
191          void cmpb_di();
192          void cmpb_ex();
193          void cmpb_im();
194          void cmpb_ix();
195          void cmpd_di();
196          void cmpd_ex();
197          void cmpd_im();
198          void cmpd_ix();
199          void cmps_di();
200          void cmps_ex();
201          void cmps_im();
202          void cmps_ix();
203          void cmpu_di();
204          void cmpu_ex();
205          void cmpu_im();
206          void cmpu_ix();
207          void cmpx_di();
208          void cmpx_ex();
209          void cmpx_im();
210          void cmpx_ix();
211          void cmpy_di();
212          void cmpy_ex();
213          void cmpy_im();
214          void cmpy_ix();
215          void coma();
216          void comb();
217          void com_di();
218          void com_ex();
219          void com_ix();
220          void cwai();
221          void daa();
222          void dcca();
223          void dccb();
224          void dcc_di();
225          void dcc_ex();
226          void dcc_ix();
227          void deca();
228          void decb();
229          void dec_di();
230          void dec_ex();
231          void dec_ix();
232          void eora_di();
233          void eora_ex();
234          void eora_im();
235          void eora_ix();
236          void eorb_di();
237          void eorb_ex();
238          void eorb_im();
239          void eorb_ix();
240          void exg();
241          void flag8_im();
242          void flag16_im();
243          void illegal();
244          void inca();
245          void incb();
246          void inc_di();
247          void inc_ex();
248          void inc_ix();
249          void jmp_di();
250          void jmp_ex();
251          void jmp_ix();
252          void jsr_di();
253          void jsr_ex();
254          void jsr_ix();
255          void lbcc();
256          void lbcs();
257          void lbeq();
258          void lbge();
259          void lbgt();
260          void lbhi();
261          void lble();
262          void lbls();
263          void lblt();
264          void lbmi();
265          void lbne();
266          void lbpl();
267          void lbra();
268          void lbrn();
269          void lbsr();
270          void lbvc();
271          void lbvs();
272          void lda_di();
273          void lda_ex();
274          void lda_im();
275          void lda_ix();
276          void ldb_di();
277          void ldb_ex();
278          void ldb_im();
279          void ldb_ix();
280          void ldd_di();
281          void ldd_ex();
282          void ldd_im();
283          void ldd_ix();
284          void lds_di();
285          void lds_ex();
286          void lds_im();
287          void lds_ix();
288          void ldu_di();
289          void ldu_ex();
290          void ldu_im();
291          void ldu_ix();
292          void ldx_di();
293          void ldx_ex();
294          void ldx_im();
295          void ldx_ix();
296          void ldy_di();
297          void ldy_ex();
298          void ldy_im();
299          void ldy_ix();
300          void leas();
301          void leau();
302          void leax();
303          void leay();
304          void lsra();
305          void lsrb();
306          void lsr_di();
307          void lsr_ex();
308          void lsr_ix();
309          void mul();
310          void nega();
311          void negb();
312          void neg_di();
313          void neg_ex();
314          void neg_ix();
315          void ngca();
316          void ngcb();
317          void ngc_di();
318          void ngc_ex();
319          void ngc_ix();
320          void nop();
321          void ora_di();
322          void ora_ex();
323          void ora_im();
324          void ora_ix();
325          void orb_di();
326          void orb_ex();
327          void orb_im();
328          void orb_ix();
329          void orcc();
330          void pref10();
331          void pref11();
332          void pshs();
333          void pshu();
334          void puls();
335          void pulu();
336          void rola();
337          void rolb();
338          void rol_di();
339          void rol_ex();
340          void rol_ix();
341          void rora();
342          void rorb();
343          void ror_di();
344          void ror_ex();
345          void ror_ix();
346          void rst();
347          void rti();    
348          void rts();    
349          void sbca_di();
350          void sbca_ex();
351          void sbca_im();
352          void sbca_ix();
353          void sbcb_di();
354          void sbcb_ex();
355          void sbcb_im();
356          void sbcb_ix();
357          void sex();
358          void sta_di();
359          void sta_ex();
360          void sta_im();
361          void sta_ix();
362          void stb_di();
363          void stb_ex();
364          void stb_im();
365          void stb_ix();
366          void std_di();
367          void std_ex();
368          void std_im();
369          void std_ix();
370          void sts_di();
371          void sts_ex();
372          void sts_im();
373          void sts_ix();
374          void stu_di();
375          void stu_ex();
376          void stu_im();
377          void stu_ix();
378          void stx_di();
379          void stx_ex();
380          void stx_im();
381          void stx_ix();
382          void sty_di();
383          void sty_ex();
384          void sty_im();
385          void sty_ix();
386          void suba_di();
387          void suba_ex();
388          void suba_im();
389          void suba_ix();
390          void subb_di();
391          void subb_ex();
392          void subb_im();
393          void subb_ix();
394          void subd_di();
395          void subd_ex();
396          void subd_im();
397          void subd_ix();
398          void swi2();
399          void swi3();
400          void swi();
401          void sync_09();
402          void tfr();
403          void trap();
404          void tsta();
405          void tstb();
406          void tst_di();
407          void tst_ex();
408          void tst_ix();
409
410         
411 public:
412         MC6809(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) 
413         {
414                 initialize_output_signals(&outputs_bus_clr);
415                 initialize_output_signals(&outputs_bus_halt);
416                 set_device_name(_T("MC6809 MPU"));
417         }
418         ~MC6809() {}
419         
420 #ifdef USE_DEBUGGER
421         void *get_debugger()
422         {
423                 return d_debugger;
424         }
425         uint32_t get_debug_prog_addr_mask()
426         {
427                 return 0xffff;
428         }
429         uint32_t get_debug_data_addr_mask()
430         {
431                 return 0xffff;
432         }
433         void write_debug_data8(uint32_t addr, uint32_t data);
434         uint32_t read_debug_data8(uint32_t addr);
435         void write_debug_data16(uint32_t addr, uint32_t data)
436         {
437                 write_debug_data8(addr, (data >> 8) & 0xff);
438                 write_debug_data8(addr + 1, data & 0xff);
439         }
440         uint32_t read_debug_data16(uint32_t addr)
441         {
442                 uint32_t val = read_debug_data8(addr) << 8;
443                 val |= read_debug_data8(addr + 1);
444                 return val;
445         }
446         void write_debug_data32(uint32_t addr, uint32_t data)
447         {
448                 write_debug_data16(addr, (data >> 16) & 0xffff);
449                 write_debug_data16(addr + 2, data & 0xffff);
450         }
451         uint32_t read_debug_data32(uint32_t addr)
452         {
453                 uint32_t val = read_debug_data16(addr) << 16;
454                 val |= read_debug_data16(addr + 2);
455                 return val;
456         }
457         void write_debug_io8(uint32_t addr, uint32_t data);
458         uint32_t read_debug_io8(uint32_t addr);
459         void write_debug_io16(uint32_t addr, uint32_t data)
460         {
461                 write_debug_io8(addr, (data >> 8) & 0xff);
462                 write_debug_io8(addr + 1, data & 0xff);
463         }
464         uint32_t read_debug_io16(uint32_t addr)
465         {
466                 uint32_t val = read_debug_io8(addr) << 8;
467                 val |= read_debug_io8(addr + 1);
468                 return val;
469         }
470         void write_debug_io32(uint32_t addr, uint32_t data)
471         {
472                 write_debug_io16(addr, (data >> 16) & 0xffff);
473                 write_debug_io16(addr + 2, data & 0xffff);
474         }
475         uint32_t read_debug_io32(uint32_t addr)
476         {
477                 uint32_t val = read_debug_io16(addr) << 16;
478                 val |= read_debug_io16(addr + 2);
479                 return val;
480         }
481         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
482         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
483         int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
484         uint32_t cpu_disassemble_m6809(_TCHAR *buffer, uint32_t pc, const uint8_t *oprom, const uint8_t *opram);
485 #endif
486         // common functions
487         void reset();
488         void initialize();
489         int run(int clock);
490         void write_signal(int id, uint32_t data, uint32_t mask);
491         void save_state(FILEIO* state_fio);
492         bool load_state(FILEIO* state_fio);
493         void set_extra_clock(int clock)
494         {
495                 extra_icount += clock;
496         }
497         int get_extra_clock()
498         {
499                 return extra_icount;
500         }
501         uint32_t get_pc()
502         {
503                 return ppc.w.l;
504         }
505         uint32_t get_next_pc()
506         {
507                 return pc.w.l;
508         }
509         // For debug
510         uint32_t get_ix()
511         {
512                 return x.w.l;
513         }
514         uint32_t get_iy()
515         {
516                 return y.w.l;
517         }
518         uint32_t get_ustack()
519         {
520                 return u.w.l;
521         }
522         uint32_t get_sstack()
523         {
524                 return s.w.l;
525         }
526         uint32_t get_acca()
527         {
528                 return acc.b.h;
529         }
530         uint32_t get_accb()
531         {
532                 return acc.b.l;
533         }
534         uint32_t get_cc()
535         {
536                 return cc;
537         }
538         uint32_t get_dp()
539         {
540                 return dp.b.h;
541         }
542
543         // unique function
544         void set_context_mem(DEVICE* device)
545         {
546                 d_mem = device;
547         }
548         void set_context_bus_halt(DEVICE* device, int id, uint32_t mask)
549         {
550                 register_output_signal(&outputs_bus_halt, device, id, mask);
551         }
552         void set_context_bus_clr(DEVICE* device, int id, uint32_t mask)
553         {
554                 register_output_signal(&outputs_bus_clr, device, id, mask);
555         }
556 #ifdef USE_DEBUGGER
557         void set_context_debugger(DEBUGGER* device)
558         {
559                 d_debugger = device;
560         }
561 #endif
562 };
563
564 #endif
565