OSDN Git Service

[VM] Update emu->out_debug_log to [DEVICE]->out_debug_log .
[csp-qt/common_source_project-fm7.git] / source / src / vm / io.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2008.12.29 -
6
7         [ i/o bus ]
8 */
9
10 #ifndef _IO_H_
11 #define _IO_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 #ifndef IO_ADDR_MAX
18 #define IO_ADDR_MAX 0x100
19 #endif
20 #define IO_ADDR_MASK (IO_ADDR_MAX - 1)
21
22 class IO : public DEVICE
23 {
24 private:
25         // i/o map
26         struct {
27                 DEVICE* dev;
28                 uint32_t addr;
29                 int wait;
30                 bool is_flipflop;
31         } wr_table[IO_ADDR_MAX];
32         
33         struct {
34                 DEVICE* dev;
35                 uint32_t addr;
36                 int wait;
37                 bool value_registered;
38                 uint32_t value;
39         } rd_table[IO_ADDR_MAX];
40         
41         void write_port8(uint32_t addr, uint32_t data, bool is_dma);
42         uint32_t read_port8(uint32_t addr, bool is_dma);
43         void write_port16(uint32_t addr, uint32_t data, bool is_dma);
44         uint32_t read_port16(uint32_t addr, bool is_dma);
45         void write_port32(uint32_t addr, uint32_t data, bool is_dma);
46         uint32_t read_port32(uint32_t addr, bool is_dma);
47         
48 public:
49         IO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
50         {
51                 memset(wr_table, 0, sizeof(wr_table));
52                 memset(rd_table, 0, sizeof(rd_table));
53                 
54                 // vm->dummy must be generated first !
55                 for(int i = 0; i < IO_ADDR_MAX; i++) {
56                         wr_table[i].dev = rd_table[i].dev = vm->dummy;
57                         wr_table[i].addr = rd_table[i].addr = i;
58                 }
59 #ifdef _IO_DEBUG_LOG
60                 cpu_index = 0;
61 #endif
62                 set_device_name(_T("GENERIC I/O"));
63         }
64         ~IO() {}
65         
66         // common functions
67         void write_io8(uint32_t addr, uint32_t data);
68         uint32_t read_io8(uint32_t addr);
69         void write_io16(uint32_t addr, uint32_t data);
70         uint32_t read_io16(uint32_t addr);
71         void write_io32(uint32_t addr, uint32_t data);
72         uint32_t read_io32(uint32_t addr);
73         void write_io8w(uint32_t addr, uint32_t data, int* wait);
74         uint32_t read_io8w(uint32_t addr, int* wait);
75         void write_io16w(uint32_t addr, uint32_t data, int* wait);
76         uint32_t read_io16w(uint32_t addr, int* wait);
77         void write_io32w(uint32_t addr, uint32_t data, int* wait);
78         uint32_t read_io32w(uint32_t addr, int* wait);
79         void write_dma_io8(uint32_t addr, uint32_t data);
80         uint32_t read_dma_io8(uint32_t addr);
81         void write_dma_io16(uint32_t addr, uint32_t data);
82         uint32_t read_dma_io16(uint32_t addr);
83         void write_dma_io32(uint32_t addr, uint32_t data);
84         uint32_t read_dma_io32(uint32_t addr);
85         void save_state(FILEIO* state_fio);
86         bool load_state(FILEIO* state_fio);
87         const _TCHAR *get_device_name()
88         {
89                 return _T("Standard I/O Bus");
90         }
91         
92         // unique functions
93         void set_iomap_single_r(uint32_t addr, DEVICE* device);
94         void set_iomap_single_w(uint32_t addr, DEVICE* device);
95         void set_iomap_single_rw(uint32_t addr, DEVICE* device);
96         void set_iomap_alias_r(uint32_t addr, DEVICE* device, uint32_t alias);
97         void set_iomap_alias_w(uint32_t addr, DEVICE* device, uint32_t alias);
98         void set_iomap_alias_rw(uint32_t addr, DEVICE* device, uint32_t alias);
99         void set_iomap_range_r(uint32_t s, uint32_t e, DEVICE* device);
100         void set_iomap_range_w(uint32_t s, uint32_t e, DEVICE* device);
101         void set_iomap_range_rw(uint32_t s, uint32_t e, DEVICE* device);
102         
103         void set_iovalue_single_r(uint32_t addr, uint32_t value);
104         void set_iovalue_range_r(uint32_t s, uint32_t e, uint32_t value);
105         void set_flipflop_single_rw(uint32_t addr, uint32_t value);
106         void set_flipflop_range_rw(uint32_t s, uint32_t e, uint32_t value);
107         
108         void set_iowait_single_r(uint32_t addr, int wait);
109         void set_iowait_single_w(uint32_t addr, int wait);
110         void set_iowait_single_rw(uint32_t addr, int wait);
111         void set_iowait_range_r(uint32_t s, uint32_t e, int wait);
112         void set_iowait_range_w(uint32_t s, uint32_t e, int wait);
113         void set_iowait_range_rw(uint32_t s, uint32_t e, int wait);
114         
115 #ifdef _IO_DEBUG_LOG
116         int cpu_index;
117 #endif
118 };
119
120 #endif
121