OSDN Git Service

[VM][i286] Save CPUSTATE per method(s).Not use saving as one block.
[csp-qt/common_source_project-fm7.git] / source / src / vm / i286.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date  : 2012.10.18-
6
7         [ i286 ]
8 */
9
10 #ifndef _I286_H_ 
11 #define _I286_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 #define SIG_I86_TEST    0
18 #define SIG_I86_A20     1
19
20 #ifdef USE_DEBUGGER
21 class DEBUGGER;
22 #endif
23
24 class I286 : public DEVICE
25 {
26 private:
27         DEVICE *d_mem, *d_io, *d_pic;
28 #ifdef I86_PSEUDO_BIOS
29         DEVICE *d_bios;
30 #endif
31 #ifdef SINGLE_MODE_DMA
32         DEVICE *d_dma;
33 #endif
34 #ifdef USE_DEBUGGER
35         DEBUGGER *d_debugger;
36 #endif
37         void *opaque;
38         
39 public:
40         I286(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
41         {
42 #ifdef I86_PSEUDO_BIOS
43                 d_bios = NULL;
44 #endif
45 #ifdef SINGLE_MODE_DMA
46                 d_dma = NULL;
47 #endif
48 #if defined(HAS_I86)
49                 set_device_name(_T("8086 CPU"));
50 #elif defined(HAS_I88)
51                 set_device_name(_T("8088 CPU"));
52 #elif defined(HAS_I186)
53                 set_device_name(_T("80186 CPU"));
54 #elif defined(HAS_V30)
55                 set_device_name(_T("V30 CPU"));
56 #elif defined(HAS_I286)
57                 set_device_name(_T("80286 CPU"));
58 #endif
59         }
60         ~I286() {}
61         
62         // common functions
63         void initialize();
64         void release();
65         void reset();
66         int run(int icount);
67         void write_signal(int id, uint32_t data, uint32_t mask);
68         void set_intr_line(bool line, bool pending, uint32_t bit);
69         void set_extra_clock(int icount);
70         int get_extra_clock();
71         uint32_t get_pc();
72         uint32_t get_next_pc();
73 #ifdef USE_DEBUGGER
74         void *get_debugger()
75         {
76                 return d_debugger;
77         }
78         uint32_t get_debug_prog_addr_mask()
79         {
80 #ifdef HAS_I286
81                 return 0xffffff;
82 #else
83                 return 0xfffff;
84 #endif
85         }
86         uint32_t get_debug_data_addr_mask()
87         {
88 #ifdef HAS_I286
89                 return 0xffffff;
90 #else
91                 return 0xfffff;
92 #endif
93         }
94         void write_debug_data8(uint32_t addr, uint32_t data);
95         uint32_t read_debug_data8(uint32_t addr);
96         void write_debug_data16(uint32_t addr, uint32_t data);
97         uint32_t read_debug_data16(uint32_t addr);
98         void write_debug_io8(uint32_t addr, uint32_t data);
99         uint32_t read_debug_io8(uint32_t addr);
100         void write_debug_io16(uint32_t addr, uint32_t data);
101         uint32_t read_debug_io16(uint32_t addr);
102         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
103         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
104         int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
105 #endif
106         void save_state_cpustate(FILEIO* state_fio);
107         void load_state_cpustate(FILEIO* state_fio);
108         
109         void save_state(FILEIO* state_fio);
110         bool load_state(FILEIO* state_fio);
111         
112         // unique function
113         void set_context_mem(DEVICE* device)
114         {
115                 d_mem = device;
116         }
117         void set_context_io(DEVICE* device)
118         {
119                 d_io = device;
120         }
121         void set_context_intr(DEVICE* device)
122         {
123                 d_pic = device;
124         }
125 #ifdef I86_PSEUDO_BIOS
126         void set_context_bios(DEVICE* device)
127         {
128                 d_bios = device;
129         }
130 #endif
131 #ifdef SINGLE_MODE_DMA
132         void set_context_dma(DEVICE* device)
133         {
134                 d_dma = device;
135         }
136 #endif
137 #ifdef USE_DEBUGGER
138         void set_context_debugger(DEBUGGER* device)
139         {
140                 d_debugger = device;
141         }
142 #endif
143 #ifdef HAS_I286
144         void set_address_mask(uint32_t mask);
145         uint32_t get_address_mask();
146         void set_shutdown_flag(int shutdown);
147         int get_shutdown_flag();
148 #endif
149 };
150
151 #endif