OSDN Git Service

[DOC] For release 2017-01-24.
[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 MEMORY : public DEVICE
25 {
26 private:
27         typedef struct {
28                 DEVICE* dev;
29                 uint8_t* memory;
30                 int wait;
31         } bank_t;
32         
33         bank_t *read_table;
34         bank_t *write_table;
35         
36         int addr_shift;
37         
38         uint8_t read_dummy[MEMORY_BANK_SIZE];
39         uint8_t write_dummy[MEMORY_BANK_SIZE];
40         
41 public:
42         MEMORY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
43         {
44                 int bank_num = MEMORY_ADDR_MAX / MEMORY_BANK_SIZE;
45                 
46                 read_table = (bank_t *)malloc(sizeof(bank_t) * bank_num);
47                 write_table = (bank_t *)malloc(sizeof(bank_t) * bank_num);
48                 
49                 for(int i = 0; i < bank_num; i++) {
50                         read_table[i].dev = NULL;
51                         read_table[i].memory = read_dummy;
52                         read_table[i].wait = 0;
53                         
54                         write_table[i].dev = NULL;
55                         write_table[i].memory = write_dummy;
56                         read_table[i].wait = 0;
57                 }
58                 for(int i = 0;; i++) {
59                         if(MEMORY_BANK_SIZE == (1 << i)) {
60                                 addr_shift = i;
61                                 break;
62                         }
63                 }
64                 memset(read_dummy, 0xff, MEMORY_BANK_SIZE);
65                 set_device_name(_T("GENERIC MEMORY"));
66         }
67         ~MEMORY() {}
68         
69         // common functions
70         void release();
71         uint32_t read_data8(uint32_t addr);
72         void write_data8(uint32_t addr, uint32_t data);
73         uint32_t read_data16(uint32_t addr);
74         void write_data16(uint32_t addr, uint32_t data);
75         uint32_t read_data32(uint32_t addr);
76         void write_data32(uint32_t addr, uint32_t data);
77         uint32_t read_data8w(uint32_t addr, int* wait);
78         void write_data8w(uint32_t addr, uint32_t data, int* wait);
79         uint32_t read_data16w(uint32_t addr, int* wait);
80         void write_data16w(uint32_t addr, uint32_t data, int* wait);
81         uint32_t read_data32w(uint32_t addr, int* wait);
82         void write_data32w(uint32_t addr, uint32_t data, int* wait);
83         
84         // unique functions
85         void set_memory_r(uint32_t start, uint32_t end, uint8_t *memory);
86         void set_memory_w(uint32_t start, uint32_t end, uint8_t *memory);
87         void set_memory_rw(uint32_t start, uint32_t end, uint8_t *memory)
88         {
89                 set_memory_r(start, end, memory);
90                 set_memory_w(start, end, memory);
91         }
92         void set_memory_mapped_io_r(uint32_t start, uint32_t end, DEVICE *device);
93         void set_memory_mapped_io_w(uint32_t start, uint32_t end, DEVICE *device);
94         void set_memory_mapped_io_rw(uint32_t start, uint32_t end, DEVICE *device)
95         {
96                 set_memory_mapped_io_r(start, end, device);
97                 set_memory_mapped_io_w(start, end, device);
98         }
99         void set_wait_r(uint32_t start, uint32_t end, int wait);
100         void set_wait_w(uint32_t start, uint32_t end, int wait);
101         void set_wait_rw(uint32_t start, uint32_t end, int wait)
102         {
103                 set_wait_r(start, end, wait);
104                 set_wait_w(start, end, wait);
105         }
106         void unset_memory_r(uint32_t start, uint32_t end);
107         void unset_memory_w(uint32_t start, uint32_t end);
108         void unset_memory_rw(uint32_t start, uint32_t end)
109         {
110                 unset_memory_r(start, end);
111                 unset_memory_w(start, end);
112         }
113         int read_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
114         bool write_bios(const _TCHAR *file_name, uint8_t *buffer, int size);
115         bool read_image(const _TCHAR *file_path, uint8_t *buffer, int size);
116         bool write_image(const _TCHAR *file_path, uint8_t *buffer, int size);
117 };
118
119 #endif
120