OSDN Git Service

[VM] Add vm_template.h . This class, VM_TEMPLATE:: must be mother of VM:: .See fm7...
[csp-qt/common_source_project-fm7.git] / source / src / vm / i8080_base.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME
5         Author : Takeda.Toshiya
6         Date   : 2008.11.04 -
7
8         [ i8080 / i8085 ]
9 */
10
11 #ifndef _I8080_BASE_H_ 
12 #define _I8080_BASE_H_
13
14 //#include "vm.h"
15 //#include "../emu.h"
16 #include "device.h"
17
18 #define SIG_I8080_INTR  0
19 //#ifdef HAS_I8085
20 #define SIG_I8085_RST5  1
21 #define SIG_I8085_RST6  2
22 #define SIG_I8085_RST7  3
23 #define SIG_I8085_SID   4
24 //#endif
25 #define SIG_I8080_INTE  5
26
27 //#ifdef USE_DEBUGGER
28 class DEBUGGER;
29 //#endif
30
31 class I8080_BASE : public DEVICE
32 {
33 protected:
34         /* ---------------------------------------------------------------------------
35         contexts
36         --------------------------------------------------------------------------- */
37         
38         DEVICE *d_mem, *d_io, *d_pic;
39 //#ifdef USE_DEBUGGER
40         DEBUGGER *d_debugger;
41         DEVICE *d_mem_stored, *d_io_stored;
42 //#endif
43         
44         // output signals
45         outputs_t outputs_busack;
46         outputs_t outputs_sod;
47         
48         /* ---------------------------------------------------------------------------
49         registers
50         --------------------------------------------------------------------------- */
51         
52         int count;
53         pair_t regs[4];
54         uint16_t SP, PC, prevPC;
55         uint16_t IM, RIM_IEN;
56         bool afterHALT, BUSREQ, SID, afterEI;
57         
58         static const int cc_op_8080[0x100];
59         static const int cc_op_8085[0x100];
60         
61         static const uint8_t ZS[256];
62         static const uint8_t ZSP[256];
63         static const uint16_t DAA[2048];
64
65         virtual void dec_count(uint8_t code) {}
66         virtual void check_reg_c(uint8_t val) {}
67         virtual void check_reg_e(uint8_t val) {}
68         virtual void check_reg_l(uint8_t val) {}
69         virtual void check_reg_sp(uint8_t val) {}
70         virtual void INSN_0x08(void) {}
71         virtual void INSN_0x10(void) {}
72         virtual void RLDE(void) {}
73         virtual void RIM(void) {}
74         virtual void _DAA(void) {}
75         virtual void LDEH(void) {}
76         virtual void CMA(void) {}
77         virtual void SIM(void) {}
78         virtual void LDES(void) {}
79         virtual void INSN_0xcb(void) {}
80         virtual void INSN_0xd9(void) {}
81         virtual void INSN_0xdd(void) {}
82         virtual void INSN_0xed(void) {}
83         virtual void INSN_0xfd(void) {}
84
85
86         virtual void JMP(uint8_t c);
87         virtual void CALL(uint8_t c);
88         virtual void ANA(uint8_t n);
89
90         virtual uint8_t RM8(uint16_t addr) { return 0xff;}
91         virtual void WM8(uint16_t addr, uint8_t val) {}
92         virtual uint16_t RM16(uint16_t addr) { return 0xffff;}
93         virtual void WM16(uint16_t addr, uint16_t val) {}
94         virtual uint8_t IN8(uint8_t addr) { return 0xff; }
95         virtual void OUT8(uint8_t addr, uint8_t val) {}
96         virtual uint8_t FETCHOP() { return 0xff;}
97         virtual uint8_t FETCH8() { return 0xff;}
98         virtual uint16_t FETCH16()  { return 0xffff; }
99         virtual uint16_t POP16() { return 0xff;}
100         virtual void PUSH16(uint16_t val) {}
101         virtual uint32_t ACK_INTR() {return 0xffffffff; }
102         
103         void DSUB();
104
105         inline void INT(uint16_t v);
106         inline void RST(uint16_t n);
107
108         void OP(uint8_t code);
109
110         uint64_t total_count;
111         uint64_t prev_total_count;
112 public:
113         I8080_BASE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
114         {
115                 BUSREQ = false;
116                 SID = true;
117                 initialize_output_signals(&outputs_busack);
118                 initialize_output_signals(&outputs_sod);
119                 d_mem = d_pic = d_io = NULL;
120                 d_mem_stored = d_io_stored = NULL;
121                 d_debugger = NULL;
122                 total_count = prev_total_count = 0;
123                 set_device_name(_T("i8080 CPU"));
124         }
125         ~I8080_BASE() {}
126         virtual void initialize();
127         virtual void reset();
128         virtual int run(int clock);
129         virtual void write_signal(int id, uint32_t data, uint32_t mask);
130         uint32_t read_signal(int ch);
131         void set_intr_line(bool line, bool pending, uint32_t bit);
132         uint32_t get_pc()
133         {
134                 return prevPC;
135         }
136         uint32_t get_next_pc()
137         {
138                 return PC;
139         }
140 //#ifdef USE_DEBUGGER
141         void *get_debugger()
142         {
143                 return d_debugger;
144         }
145         uint32_t get_debug_prog_addr_mask()
146         {
147                 return 0xffff;
148         }
149         uint32_t get_debug_data_addr_mask()
150         {
151                 return 0xffff;
152         }
153         void write_debug_data8(uint32_t addr, uint32_t data);
154         uint32_t read_debug_data8(uint32_t addr);
155         void write_debug_io8(uint32_t addr, uint32_t data);
156         uint32_t read_debug_io8(uint32_t addr);
157         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
158         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
159         int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
160 //#endif
161         // unique function
162         void set_context_mem(DEVICE* device)
163         {
164                 d_mem = device;
165         }
166         void set_context_io(DEVICE* device)
167         {
168                 d_io = device;
169         }
170         void set_context_intr(DEVICE* device)
171         {
172                 d_pic = device;
173         }
174         void set_context_busack(DEVICE* device, int id, uint32_t mask)
175         {
176                 register_output_signal(&outputs_busack, device, id, mask);
177         }
178         void set_context_sod(DEVICE* device, int id, uint32_t mask)
179         {
180                 register_output_signal(&outputs_sod, device, id, mask);
181         }
182
183 };
184
185 inline void I8080_BASE::INT(uint16_t v)
186 {                                                                                               \
187         if(afterHALT) {
188                 PC++; afterHALT = 0;
189         }
190         PUSH16(PC); PC = (v);
191 }
192
193 inline void I8080_BASE::RST(uint16_t n)
194 {                               
195         PUSH16(PC); 
196         PC = 8 * n; 
197 }
198
199 #endif