OSDN Git Service

[VM] Merge Upstream 2018-02-23.
[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
21 class IO : public DEVICE
22 {
23 private:
24         // i/o map
25         typedef struct {
26                 DEVICE* dev;
27                 uint32_t addr;
28                 int wait;
29                 bool is_flipflop;
30         } wr_bank_t;
31         
32         typedef struct {
33                 DEVICE* dev;
34                 uint32_t addr;
35                 int wait;
36                 bool value_registered;
37                 uint32_t value;
38         } rd_bank_t;
39         
40         wr_bank_t *wr_table;
41         rd_bank_t *rd_table;
42         
43         void write_port8(uint32_t addr, uint32_t data, bool is_dma);
44         uint32_t read_port8(uint32_t addr, bool is_dma);
45         void write_port16(uint32_t addr, uint32_t data, bool is_dma);
46         uint32_t read_port16(uint32_t addr, bool is_dma);
47         void write_port32(uint32_t addr, uint32_t data, bool is_dma);
48         uint32_t read_port32(uint32_t addr, bool is_dma);
49         
50 public:
51         IO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
52         {
53 #ifdef _IO_DEBUG_LOG
54                 cpu_index = 0;
55 #endif
56                 addr_max = IO_ADDR_MAX;
57                 
58                 wr_table = NULL;
59                 rd_table = NULL;
60                 
61                 set_device_name(_T("Generic I/O Bus"));
62         }
63         ~IO() {}
64         
65         // common functions
66         void initialize();
67         void release();
68         void write_io8(uint32_t addr, uint32_t data);
69         uint32_t read_io8(uint32_t addr);
70         void write_io16(uint32_t addr, uint32_t data);
71         uint32_t read_io16(uint32_t addr);
72         void write_io32(uint32_t addr, uint32_t data);
73         uint32_t read_io32(uint32_t addr);
74         void write_io8w(uint32_t addr, uint32_t data, int* wait);
75         uint32_t read_io8w(uint32_t addr, int* wait);
76         void write_io16w(uint32_t addr, uint32_t data, int* wait);
77         uint32_t read_io16w(uint32_t addr, int* wait);
78         void write_io32w(uint32_t addr, uint32_t data, int* wait);
79         uint32_t read_io32w(uint32_t addr, int* wait);
80         void write_dma_io8(uint32_t addr, uint32_t data);
81         uint32_t read_dma_io8(uint32_t addr);
82         void write_dma_io16(uint32_t addr, uint32_t data);
83         uint32_t read_dma_io16(uint32_t addr);
84         void write_dma_io32(uint32_t addr, uint32_t data);
85         uint32_t read_dma_io32(uint32_t addr);
86         void save_state(FILEIO* state_fio);
87         bool load_state(FILEIO* state_fio);
88         
89         // unique functions
90         void set_iomap_single_r(uint32_t addr, DEVICE* device);
91         void set_iomap_single_w(uint32_t addr, DEVICE* device);
92         void set_iomap_single_rw(uint32_t addr, DEVICE* device);
93         void set_iomap_alias_r(uint32_t addr, DEVICE* device, uint32_t alias);
94         void set_iomap_alias_w(uint32_t addr, DEVICE* device, uint32_t alias);
95         void set_iomap_alias_rw(uint32_t addr, DEVICE* device, uint32_t alias);
96         void set_iomap_range_r(uint32_t s, uint32_t e, DEVICE* device);
97         void set_iomap_range_w(uint32_t s, uint32_t e, DEVICE* device);
98         void set_iomap_range_rw(uint32_t s, uint32_t e, DEVICE* device);
99         
100         void set_iovalue_single_r(uint32_t addr, uint32_t value);
101         void set_iovalue_range_r(uint32_t s, uint32_t e, uint32_t value);
102         void set_flipflop_single_rw(uint32_t addr, uint32_t value);
103         void set_flipflop_range_rw(uint32_t s, uint32_t e, uint32_t value);
104         
105         void set_iowait_single_r(uint32_t addr, int wait);
106         void set_iowait_single_w(uint32_t addr, int wait);
107         void set_iowait_single_rw(uint32_t addr, int wait);
108         void set_iowait_range_r(uint32_t s, uint32_t e, int wait);
109         void set_iowait_range_w(uint32_t s, uint32_t e, int wait);
110         void set_iowait_range_rw(uint32_t s, uint32_t e, int wait);
111         
112 #ifdef _IO_DEBUG_LOG
113         int cpu_index;
114 #endif
115         int addr_max;
116 };
117
118 #endif
119