OSDN Git Service

[VM][FM7][FM77AV] Set sub clock.
[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* 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 read_dummy[MEMORY_BANK_SIZE];
39         uint8 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         }
66         ~MEMORY() {}
67         
68         // common functions
69         void release();
70         uint32 read_data8(uint32 addr);
71         void write_data8(uint32 addr, uint32 data);
72         uint32 read_data16(uint32 addr);
73         void write_data16(uint32 addr, uint32 data);
74         uint32 read_data32(uint32 addr);
75         void write_data32(uint32 addr, uint32 data);
76         uint32 read_data8w(uint32 addr, int* wait);
77         void write_data8w(uint32 addr, uint32 data, int* wait);
78         uint32 read_data16w(uint32 addr, int* wait);
79         void write_data16w(uint32 addr, uint32 data, int* wait);
80         uint32 read_data32w(uint32 addr, int* wait);
81         void write_data32w(uint32 addr, uint32 data, int* wait);
82         
83         // unique functions
84         void set_memory_r(uint32 start, uint32 end, uint8 *memory);
85         void set_memory_w(uint32 start, uint32 end, uint8 *memory);
86         void set_memory_rw(uint32 start, uint32 end, uint8 *memory)
87         {
88                 set_memory_r(start, end, memory);
89                 set_memory_w(start, end, memory);
90         }
91         void set_memory_mapped_io_r(uint32 start, uint32 end, DEVICE *device);
92         void set_memory_mapped_io_w(uint32 start, uint32 end, DEVICE *device);
93         void set_memory_mapped_io_rw(uint32 start, uint32 end, DEVICE *device)
94         {
95                 set_memory_mapped_io_r(start, end, device);
96                 set_memory_mapped_io_w(start, end, device);
97         }
98         void set_wait_r(uint32 start, uint32 end, int wait);
99         void set_wait_w(uint32 start, uint32 end, int wait);
100         void set_wait_rw(uint32 start, uint32 end, int wait)
101         {
102                 set_wait_r(start, end, wait);
103                 set_wait_w(start, end, wait);
104         }
105         void unset_memory_r(uint32 start, uint32 end);
106         void unset_memory_w(uint32 start, uint32 end);
107         void unset_memory_rw(uint32 start, uint32 end)
108         {
109                 unset_memory_r(start, end);
110                 unset_memory_w(start, end);
111         }
112         int read_bios(_TCHAR *file_name, uint8 *buffer, int size);
113         bool write_bios(_TCHAR *file_name, uint8 *buffer, int size);
114         bool read_image(_TCHAR *file_path, uint8 *buffer, int size);
115         bool write_image(_TCHAR *file_path, uint8 *buffer, int size);
116 };
117
118 #endif
119