OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[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_template.h"
14 #include "../emu_template.h"
15 #include "device.h"
16
17 class  DLL_PREFIX MEMORY : public DEVICE
18 {
19 protected:
20         typedef struct {
21                 DEVICE *device;
22                 uint8_t *memory;
23                 bool wait_registered;
24                 int wait;
25         } bank_t;
26
27         uint8_t *rd_dummy;
28         uint8_t *wr_dummy;
29
30         int addr_shift;
31 public:
32         MEMORY(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
33         {
34                 space = 0x10000;
35                 bank_size = 0x1000;
36
37                 rd_table = wr_table = NULL;
38                 rd_dummy = wr_dummy = NULL;
39
40                 bus_width = 8;
41                 addr_shift = 0;
42
43                 set_device_name(_T("Generic Memory Bus"));
44         }
45         ~MEMORY() {}
46
47         // common functions
48         virtual void initialize() override;
49         virtual void release() override;
50
51         virtual uint32_t __FASTCALL read_data8(uint32_t addr) override;
52         virtual void __FASTCALL write_data8(uint32_t addr, uint32_t data) override;
53         virtual uint32_t __FASTCALL read_data16(uint32_t addr) override;
54         virtual void __FASTCALL write_data16(uint32_t addr, uint32_t data) override;
55         virtual uint32_t __FASTCALL read_data32(uint32_t addr) override;
56         virtual void __FASTCALL write_data32(uint32_t addr, uint32_t data) override;
57         virtual uint32_t __FASTCALL read_data8w(uint32_t addr, int* wait) override;
58         virtual void __FASTCALL write_data8w(uint32_t addr, uint32_t data, int* wait) override;
59         virtual uint32_t __FASTCALL read_data16w(uint32_t addr, int* wait) override;
60         virtual void __FASTCALL write_data16w(uint32_t addr, uint32_t data, int* wait) override;
61         virtual uint32_t __FASTCALL read_data32w(uint32_t addr, int* wait) override;
62         virtual void __FASTCALL write_data32w(uint32_t addr, uint32_t data, int* wait) override;
63
64         // unique functions
65         inline int get_bank(uint32_t addr) const
66         {
67                 const uint64_t _mask = space - 1;
68
69                 return (uint32_t)(((uint64_t)addr & _mask) >> addr_shift);
70         }
71         inline int bus_access_times_16(uint32_t addr) const
72         {
73                 if(bus_width >= 32) {
74                         return ((addr & 3) == 3 ? 2 : 1);
75                 } else if(bus_width >= 16) {
76                         return ((addr & 1) == 1 ? 2 : 1);
77                 } else {
78                         return 2;
79                 }
80         }
81         inline int bus_access_times_32(uint32_t addr) const
82         {
83                 if(bus_width >= 32) {
84                         return ((addr & 3) != 0 ? 2 : 1);
85                 } else if(bus_width >= 16) {
86                         return ((addr & 1) == 1 ? 3 : 2);
87                 } else {
88                         return 4;
89                 }
90         }
91         virtual void set_memory_r(uint32_t start, uint32_t end, uint8_t *memory);
92         virtual void set_memory_w(uint32_t start, uint32_t end, uint8_t *memory);
93         inline void set_memory_rw(uint32_t start, uint32_t end, uint8_t *memory)
94         {
95                 set_memory_r(start, end, memory);
96                 set_memory_w(start, end, memory);
97         }
98         virtual void set_memory_mapped_io_r(uint32_t start, uint32_t end, DEVICE *device);
99         virtual void set_memory_mapped_io_w(uint32_t start, uint32_t end, DEVICE *device);
100         inline void set_memory_mapped_io_rw(uint32_t start, uint32_t end, DEVICE *device)
101         {
102                 set_memory_mapped_io_r(start, end, device);
103                 set_memory_mapped_io_w(start, end, device);
104         }
105         virtual void set_wait_r(uint32_t start, uint32_t end, int wait);
106         virtual void set_wait_w(uint32_t start, uint32_t end, int wait);
107         inline void set_wait_rw(uint32_t start, uint32_t end, int wait)
108         {
109                 set_wait_r(start, end, wait);
110                 set_wait_w(start, end, wait);
111         }
112         virtual void unset_memory_r(uint32_t start, uint32_t end);
113         virtual void unset_memory_w(uint32_t start, uint32_t end);
114         inline void unset_memory_rw(uint32_t start, uint32_t end)
115         {
116                 unset_memory_r(start, end);
117                 unset_memory_w(start, end);
118         }
119         virtual void copy_table_r(uint32_t to, uint32_t start, uint32_t end);
120         virtual void copy_table_w(uint32_t to, uint32_t start, uint32_t end);
121         inline void copy_table_rw(uint32_t to, uint32_t start, uint32_t end)
122         {
123                 copy_table_r(to, start, end);
124                 copy_table_w(to, start, end);
125         }
126         virtual void unset_wait_r(uint32_t start, uint32_t end);
127         virtual void unset_wait_w(uint32_t start, uint32_t end);
128         inline void unset_wait_rw(uint32_t start, uint32_t end)
129         {
130                 unset_wait_r(start, end);
131                 unset_wait_w(start, end);
132         }
133         int read_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
134         bool write_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
135         bool read_image(const _TCHAR *file_path, uint8_t *buffer, int size);
136         bool write_image(const _TCHAR *file_path, uint8_t *buffer, int size);
137
138         bank_t *rd_table;
139         bank_t *wr_table;
140
141         uint64_t space;
142         uint32_t bank_size;
143         int bus_width;
144 };
145
146 #endif