OSDN Git Service

[VM][COMMON_VM] Include IO:: class to common_vm.
[csp-qt/common_source_project-fm7.git] / source / src / vm / memory.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2010.09.16-
6
7         [ memory ]
8 */
9
10 #ifndef _MEMORY_H_
11 #define _MEMORY_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 //#ifndef MEMORY_ADDR_MAX
18 //#define MEMORY_ADDR_MAX 0x10000
19 //#endif
20 //#ifndef MEMORY_BANK_SIZE
21 //#define MEMORY_BANK_SIZE 0x1000
22 //#endif
23
24 class VM;
25 class EMU;
26 class MEMORY : public DEVICE
27 {
28 protected:
29         typedef struct {
30                 DEVICE* dev;
31                 uint8_t* memory;
32                 int wait;
33         } bank_t;
34         
35         bank_t *rd_table;
36         bank_t *wr_table;
37         
38         int addr_shift;
39         
40         uint8_t *rd_dummy;
41         uint8_t *wr_dummy;
42         
43         bool _MEMORY_DISABLE_DMA_MMIO;
44         bool bank_size_was_set;
45         bool addr_max_was_set;
46 public:
47         MEMORY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
48         {
49                 // Set temporally values.
50                 addr_max = 0x10000;
51                 bank_size = 0x1000;
52                 bank_size_was_set = false;
53                 addr_max_was_set = false;
54                 
55                 rd_table = wr_table = NULL;
56                 rd_dummy = wr_dummy = NULL;
57
58                 _MEMORY_DISABLE_DMA_MMIO = false;
59                 
60                 set_device_name(_T("Generic Memory Bus"));
61         }
62         ~MEMORY() {}
63         
64         // common functions
65         virtual void initialize();
66         virtual void release();
67         virtual uint32_t __FASTCALL read_data8(uint32_t addr);
68         virtual void __FASTCALL write_data8(uint32_t addr, uint32_t data);
69         virtual uint32_t __FASTCALL read_data16(uint32_t addr);
70         virtual void __FASTCALL write_data16(uint32_t addr, uint32_t data);
71         virtual uint32_t __FASTCALL read_data32(uint32_t addr);
72         virtual void __FASTCALL write_data32(uint32_t addr, uint32_t data);
73         virtual uint32_t __FASTCALL read_data8w(uint32_t addr, int* wait);
74         virtual void __FASTCALL write_data8w(uint32_t addr, uint32_t data, int* wait);
75         virtual uint32_t __FASTCALL read_data16w(uint32_t addr, int* wait);
76         virtual void __FASTCALL write_data16w(uint32_t addr, uint32_t data, int* wait);
77         virtual uint32_t __FASTCALL read_data32w(uint32_t addr, int* wait);
78         virtual void __FASTCALL write_data32w(uint32_t addr, uint32_t data, int* wait);
79
80         virtual uint32_t __FASTCALL read_dma_data8(uint32_t addr);
81         virtual void __FASTCALL write_dma_data8(uint32_t addr, uint32_t data);
82         virtual uint32_t __FASTCALL read_dma_data16(uint32_t addr);
83         virtual void __FASTCALL write_dma_data16(uint32_t addr, uint32_t data);
84         virtual uint32_t __FASTCALL read_dma_data32(uint32_t addr);
85         virtual void __FASTCALL write_dma_data32(uint32_t addr, uint32_t data);
86         
87         // unique functions
88         virtual void set_memory_r(uint32_t start, uint32_t end, uint8_t *memory);
89         virtual void set_memory_w(uint32_t start, uint32_t end, uint8_t *memory);
90         void set_memory_rw(uint32_t start, uint32_t end, uint8_t *memory)
91         {
92                 set_memory_r(start, end, memory);
93                 set_memory_w(start, end, memory);
94         }
95         virtual void set_memory_mapped_io_r(uint32_t start, uint32_t end, DEVICE *device);
96         virtual void set_memory_mapped_io_w(uint32_t start, uint32_t end, DEVICE *device);
97         void set_memory_mapped_io_rw(uint32_t start, uint32_t end, DEVICE *device)
98         {
99                 set_memory_mapped_io_r(start, end, device);
100                 set_memory_mapped_io_w(start, end, device);
101         }
102         virtual void set_wait_r(uint32_t start, uint32_t end, int wait);
103         virtual void set_wait_w(uint32_t start, uint32_t end, int wait);
104         void set_wait_rw(uint32_t start, uint32_t end, int wait)
105         {
106                 set_wait_r(start, end, wait);
107                 set_wait_w(start, end, wait);
108         }
109         virtual void unset_memory_r(uint32_t start, uint32_t end);
110         virtual void unset_memory_w(uint32_t start, uint32_t end);
111         void unset_memory_rw(uint32_t start, uint32_t end)
112         {
113                 unset_memory_r(start, end);
114                 unset_memory_w(start, end);
115         }
116         virtual void copy_table_r(uint32_t to, uint32_t start, uint32_t end);
117         virtual void copy_table_w(uint32_t to, uint32_t start, uint32_t end);
118         void copy_table_rw(uint32_t to, uint32_t start, uint32_t end) {
119                 copy_table_r(to, start, end);
120                 copy_table_w(to, start, end);
121         }
122         int read_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
123         bool write_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
124         bool read_image(const _TCHAR *file_path, uint8_t *buffer, int size);
125         bool write_image(const _TCHAR *file_path, uint8_t *buffer, int size);
126
127         // Unique functions.
128         void set_addr_max(int64_t size)
129         {
130                 // Allow to modify before initialize() or set_foo_r|w|rw()..
131                 if(rd_table == NULL) {
132                         addr_max_was_set = true;
133                         addr_max = size;
134                 }
135         }
136         void set_bank_size(int64_t size)
137         {
138                 if(rd_table == NULL) {
139                         bank_size_was_set = true;
140                         bank_size = size;
141                 }
142         }
143         uint64_t get_addr_max()
144         {
145                 return addr_max;
146         }
147         uint64_t get_bank_size()
148         {
149                 return bank_size;
150         }
151         
152         uint64_t addr_max;
153         uint64_t bank_size;
154
155         uint64_t addr_mask;
156         uint64_t bank_mask;
157
158 };
159
160 #endif
161