OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz5500 / memory.cpp
1 /*
2         SHARP MZ-5500 Emulator 'EmuZ-5500'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.04.10 -
6
7         [ memory ]
8 */
9
10 #include "./memory.h"
11
12 namespace MZ5500 {
13
14 #define SET_BANK(s, e, w, r) { \
15         int sb = (s) >> 14, eb = (e) >> 14; \
16         for(int i = sb; i <= eb; i++) { \
17                 if((w) == wdmy) { \
18                         wbank[i] = wdmy; \
19                 } else { \
20                         wbank[i] = (w) + 0x4000 * (i - sb); \
21                 } \
22                 if((r) == rdmy) { \
23                         rbank[i] = rdmy; \
24                 } else { \
25                         rbank[i] = (r) + 0x4000 * (i - sb); \
26                 } \
27         } \
28 }
29
30 void MEMORY::initialize()
31 {
32         // init memory
33         memset(ram, 0, sizeof(ram));
34         memset(vram, 0, sizeof(vram));
35         memset(ipl, 0xff, sizeof(ipl));
36         memset(kanji, 0xff, sizeof(kanji));
37         memset(dic, 0xff, sizeof(dic));
38 #ifdef _MZ6550
39         memset(dic2, 0xff, sizeof(dic2));
40 #endif
41 #if defined(_MZ6500) || defined(_MZ6550)
42         memset(mz1r32, 0, sizeof(mz1r32));
43 #endif
44         memset(rdmy, 0xff, sizeof(rdmy));
45         
46         // load rom images
47         FILEIO* fio = new FILEIO();
48         if(fio->Fopen(create_local_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {
49                 fio->Fread(ipl, sizeof(ipl), 1);
50                 fio->Fclose();
51         }
52         if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
53                 fio->Fread(kanji, sizeof(kanji), 1);
54                 fio->Fclose();
55         }
56         if(fio->Fopen(create_local_path(_T("DICT.ROM")), FILEIO_READ_BINARY)) {
57                 fio->Fread(dic, sizeof(dic), 1);
58                 fio->Fclose();
59         }
60 #ifdef _MZ6550
61         if(fio->Fopen(create_local_path(_T("DICT2.ROM")), FILEIO_READ_BINARY)) {
62                 fio->Fread(dic2, sizeof(dic2), 1);
63                 fio->Fclose();
64         }
65 #endif
66         delete fio;
67         
68         // set memory bank
69 #if defined(_MZ6500) || defined(_MZ6550)
70         SET_BANK(0x00000, 0x9ffff, ram, ram);
71 #else
72         SET_BANK(0x00000, 0x7ffff, ram, ram);
73         SET_BANK(0x80000, 0x9ffff, wdmy, rdmy); // aux
74 #endif
75         SET_BANK(0xa0000, 0xbffff, wdmy, kanji);
76         SET_BANK(0xc0000, 0xeffff, vram, vram);
77 #ifdef _MZ6550
78         SET_BANK(0xf0000, 0xf7fff, wdmy, rdmy); // aux
79         SET_BANK(0xf8000, 0xfffff, wdmy, ipl);
80 #else
81         SET_BANK(0xf0000, 0xfbfff, wdmy, rdmy); // aux
82         SET_BANK(0xfc000, 0xfffff, wdmy, ipl);
83 #endif
84         
85         // init dmac
86         haddr = 0;
87 }
88
89 void MEMORY::reset()
90 {
91         bank1 = 0xe0;
92         bank2 = 0;
93         update_bank();
94 }
95
96 void MEMORY::write_data8(uint32_t addr, uint32_t data)
97 {
98         addr &= 0xfffff;
99 //      if((0x80000 <= addr && addr < 0xa0000) || (0xf0000 <= addr && addr < 0xfc000)) {
100 //              d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
101 //      }
102         wbank[addr >> 14][addr & 0x3fff] = data;
103 }
104
105 uint32_t MEMORY::read_data8(uint32_t addr)
106 {
107         addr &= 0xfffff;
108 //      if((0x80000 <= addr && addr < 0xa0000) || (0xf0000 <= addr && addr < 0xfc000)) {
109 //              d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
110 //      }
111         return rbank[addr >> 14][addr & 0x3fff];
112 }
113
114 void MEMORY::write_dma_data8(uint32_t addr, uint32_t data)
115 {
116         addr = (addr & 0xffff) | haddr;
117 //      if((0x80000 <= addr && addr < 0xa0000) || (0xf0000 <= addr && addr < 0xfc000)) {
118 //              d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
119 //      }
120         wbank[addr >> 14][addr & 0x3fff] = data;
121 }
122
123 uint32_t MEMORY::read_dma_data8(uint32_t addr)
124 {
125         addr = (addr & 0xffff) | haddr;
126 //      if((0x80000 <= addr && addr < 0xa0000) || (0xf0000 <= addr && addr < 0xfc000)) {
127 //              d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
128 //      }
129         return rbank[addr >> 14][addr & 0x3fff];
130 }
131
132 void MEMORY::write_io8(uint32_t addr, uint32_t data)
133 {
134         switch(addr & 0xff) {
135         case 0x50:
136                 haddr = (data & 0xf0) << 12;
137                 break;
138 #if defined(_MZ6500) || defined(_MZ6550)
139         case 0xcd:
140                 // MZ-1R32
141                 if(bank2 != (data & 0x0f)) {
142                         bank2 = data & 0x0f;
143                         update_bank();
144                 }
145                 break;
146 #endif
147         }
148 }
149
150 uint32_t MEMORY::read_io8(uint32_t addr)
151 {
152         return 0xf0 | bank2;    // ???
153 }
154
155 void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
156 {
157         if(bank1 != data) {
158                 bank1 = data;
159                 update_bank();
160         }
161 }
162
163 void MEMORY::update_bank()
164 {
165         switch(bank1 & 0xe0) {
166         case 0xe0:
167                 SET_BANK(0x0a0000, 0x0bffff, wdmy, kanji);
168                 break;
169         case 0xc0:
170                 SET_BANK(0x0a0000, 0x0bffff, wdmy, kanji + 0x20000);
171                 break;
172         case 0xa0:
173                 SET_BANK(0x0a0000, 0x0bffff, wdmy, dic);
174                 break;
175         case 0x80:
176                 SET_BANK(0x0a0000, 0x0bffff, wdmy, dic + 0x20000);
177                 break;
178 #if defined(_MZ6500) || defined(_MZ6550)
179         case 0x60:
180                 // MZ-1R32
181                 {
182                         int ofs = 0x20000 * ((bank2 >> 1) & 7);
183                         SET_BANK(0x0a0000, 0x0bffff, mz1r32 + ofs, mz1r32 + ofs);
184                 }
185                 break;
186 #endif
187         default:
188                 SET_BANK(0x0a0000, 0x0bffff, wdmy, rdmy);
189                 break;
190         }
191 }
192
193 #define STATE_VERSION   1
194
195 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
196 {
197         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
198                 return false;
199         }
200         if(!state_fio->StateCheckInt32(this_device_id)) {
201                 return false;
202         }
203         state_fio->StateBuffer(ram, sizeof(ram), 1);
204         state_fio->StateBuffer(vram, sizeof(vram), 1);
205 #if defined(_MZ6500) || defined(_MZ6550)
206         state_fio->StateBuffer(mz1r32, sizeof(mz1r32), 1);
207 #endif
208         state_fio->StateUint8(bank1);
209         state_fio->StateUint8(bank2);
210         state_fio->StateUint32(haddr);
211         
212         // post process
213         if(loading) {
214                  update_bank();
215                 }
216         return true;
217 }
218
219 }