OSDN Git Service

[VM][Qt][LOGGER] Add setting on/off per device.
[csp-qt/common_source_project-fm7.git] / source / src / vm / tms9995.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME TMS99xx Core
5         Author : Takeda.Toshiya
6         Date   : 2007.07.14 -
7
8         [ TMS9995 ]
9 */
10
11 #ifndef _TMS9995_
12 #define _TMS9995_
13
14 #include "vm.h"
15 #include "../emu.h"
16 #include "device.h"
17
18 #define SIG_TMS9995_NMI         0
19 #define SIG_TMS9995_INT1        1
20 #define SIG_TMS9995_INT4        2
21
22 #ifdef USE_DEBUGGER
23 class DEBUGGER;
24 #endif
25
26 class TMS9995 : public DEVICE
27 {
28 private:
29         // contexts
30         DEVICE *d_mem, *d_io;
31 #ifdef USE_DEBUGGER
32         DEBUGGER *d_debugger;
33         DEVICE *d_mem_tmp, *d_io_tmp;
34 #endif
35         
36         // clocks
37         int count, period;
38         // register
39         uint16_t WP, PC, prevPC, ST;
40         uint8_t RAM[256];
41         // interrupt
42         uint8_t irq_level, int_state, int_latch;
43         bool int_pending, int_enabled;
44         // counter/timer
45         uint16_t dec_count, dec_interval;
46         int dec_timer;
47         bool dec_enabled;
48         // status
49         uint16_t mode;
50         uint8_t lastparity;
51         bool nmi, mid, idle;
52         
53         // memory functions
54         uint16_t RM16(uint16_t addr);
55         void WM16(uint16_t addr, uint16_t val);
56         uint8_t RM8(uint16_t addr);
57         void WM8(uint32_t addr, uint8_t val);
58         inline uint16_t FETCH16();
59         
60         // i/o functions
61         uint16_t IN8(int addr);
62         void OUT8(uint16_t addr, uint16_t val);
63         inline void EXTOUT8(uint16_t addr);
64         uint16_t RCRU(uint16_t addr, int bits);
65         void WCRU(uint16_t addr, int bits, uint16_t val);
66         
67         // cpu internal control
68         void set_irq_line(int irqline, bool state);
69         void update_int();
70         void update_dec();
71         void contextswitch(uint16_t addr);
72         
73         // opecode functions
74         void run_one_opecode();
75 #ifdef USE_DEBUGGER
76         void run_one_opecode_tmp();
77 #endif
78         void execute(uint16_t op);
79         void h0040(uint16_t op);
80         void h0100(uint16_t op);
81         void h0200(uint16_t op);
82         void h0400(uint16_t op);
83         void h0800(uint16_t op);
84         void h1000(uint16_t op);
85         void h2000(uint16_t op);
86         void xop(uint16_t op);
87         void ldcr_stcr(uint16_t op);
88         void h4000w(uint16_t op);
89         void h4000b(uint16_t op);
90         void illegal(uint16_t op);
91         uint16_t decipheraddr(uint16_t op);
92         uint16_t decipheraddrbyte(uint16_t op);
93         
94         // status functions
95         inline void setstat();
96         inline void getstat();
97         inline uint16_t logical_right_shift(uint16_t val, int c);
98         inline int16_t arithmetic_right_shift(int16_t val, int c);
99         inline void setst_lae(int16_t val);
100         inline void setst_byte_laep(int8_t val);
101         inline void setst_e(uint16_t val, uint16_t to);
102         inline void setst_c_lae(uint16_t to, uint16_t val);
103         inline int16_t setst_add_laeco(int a, int b);
104         inline int16_t setst_sub_laeco(int a, int b);
105         inline int8_t setst_addbyte_laecop(int a, int b);
106         inline int8_t setst_subbyte_laecop(int a, int b);
107         inline void setst_laeo(int16_t val);
108         inline uint16_t setst_sra_laec(int16_t a, uint16_t c);
109         inline uint16_t setst_srl_laec(uint16_t a,uint16_t c);
110         inline uint16_t setst_src_laec(uint16_t a,uint16_t c);
111         inline uint16_t setst_sla_laeco(uint16_t a, uint16_t c);
112         
113 public:
114         TMS9995(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
115         {
116                 // init registers
117                 WP = PC = ST = 0;
118                 memset(RAM, 0, sizeof(RAM));
119                 irq_level = int_state = int_latch = 0;
120                 int_pending = false;
121                 int_enabled = true;
122                 dec_count = dec_interval = 0;
123                 dec_timer = 0;
124                 dec_enabled = false;
125                 mode = 0;
126                 lastparity = 0;
127                 nmi = mid = idle = false;
128                 set_device_name(_T("TMS9955"));
129         }
130         ~TMS9995() {}
131         
132         // common functions
133         void initialize();
134         void reset();
135         int run(int clock);
136         void write_signal(int id, uint32_t data, uint32_t mask);
137         uint32_t get_pc()
138         {
139                 return prevPC;
140         }
141         uint32_t get_next_pc()
142         {
143                 return PC;
144         }
145 #ifdef USE_DEBUGGER
146         void *get_debugger()
147         {
148                 return d_debugger;
149         }
150         uint32_t get_debug_prog_addr_mask()
151         {
152                 return 0xffff;
153         }
154         uint32_t get_debug_data_addr_mask()
155         {
156                 return 0xffff;
157         }
158         void write_data8(uint32_t addr, uint32_t data);
159         uint32_t read_data8(uint32_t addr);
160         void write_data16(uint32_t addr, uint32_t data);
161         uint32_t read_data16(uint32_t addr);
162         void write_io8(uint32_t addr, uint32_t data);
163         uint32_t read_io8(uint32_t addr);
164         void write_debug_data8(uint32_t addr, uint32_t data);
165         uint32_t read_debug_data8(uint32_t addr);
166         void write_debug_data16(uint32_t addr, uint32_t data);
167         uint32_t read_debug_data16(uint32_t addr);
168         void write_debug_io8(uint32_t addr, uint32_t data);
169         uint32_t read_debug_io8(uint32_t addr);
170         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
171         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
172         int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
173 #endif
174         void save_state(FILEIO* state_fio);
175         bool load_state(FILEIO* state_fio);
176         // unique functions
177         void set_context_mem(DEVICE* device)
178         {
179                 d_mem = device;
180         }
181         void set_context_io(DEVICE* device)
182         {
183                 d_io = device;
184         }
185 #ifdef USE_DEBUGGER
186         void set_context_debugger(DEBUGGER* device)
187         {
188                 d_debugger = device;
189         }
190 #endif
191 };
192
193 #endif