OSDN Git Service

[VM][FM7] Add memory, OpenCL renderer.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_mainmem.cpp
1 /*
2  * Main memory without MMR for FM-7 [FM7_MAINMEM]
3  *  Author: K.Ohta
4  *  Date  : 2015.01.01-
5  *
6  */
7
8 #include "fm7_mainmem.h"
9
10 int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr)
11 {
12    if(realaddr == NULL) return -1; // Not effect.
13    
14    addr = addr & 0xffff;
15    if(window != NULL) {
16       if(window->isenabled() && ((addr >= 0x7c00) && (addr < 0x8000)) { // Window open
17          *realaddr = (addr + window->getwindow() * 256) & 0xffff;
18          if(window->is77av()) return FM7_MAINMEM_AV_PAGE0; // 77AV
19          return FM7_MAINMEM_TVRAM; // FM77
20       }
21    }
22    if(mmr != NULL) {
23       int  mmr_page;
24       uint32 mmr_offset;
25       if(!mmr->isenabled()) goto _fm7_0;
26       if(addr < 0xfc00) { // MMR Banked
27          mmr_page = mmr->getpage(addr);
28          mmr_offset = addr & 0x0fff;
29          
30          if(mmr->is77av() != true) { // FM77
31             if(mmr_page < 0x30) {
32                if(extram != NULL) {
33                   if(extram->isenabled()) { // EXTEND RAM, 192KB.
34                      *realaddr = mmr_offset + mmr_page * 0x1000;
35                      return FM7_MAINMEM_77EXTRAM;
36                   }
37                }
38             } else if((mmr_page & 0x30) == 0x30) {
39                if(mmr_page == 0x3f) { // $3f000 - $3ffff
40                     if(mmr_offset < 0x0c00) {
41                        addr = mmr_offset + 0xf000;
42                        goto _fm7_0;
43                     }
44                     if((mmr_offset < 0x0e00)) {
45                        *realaddr = mmr_offset - 0x0c00;
46                        if(mainio->get_rommode_fd0f() == true) {
47                           return FM7_MAINMEN_77_NULLRAM;
48                        }
49                        return FM7_MAINMEM_77_SHADOWRAM;
50                     }
51                     addr = mmr_offset + 0xf000;
52                     goto _fm7_0; // 
53                }
54                // $30000 - $3efff
55                addr = mmr_offset + (mmr_page & 0x0f) * 0x1000;
56                goto _fm7_0;
57             }
58            *realaddr = mmr_offset;
59            return -1; // Illegal
60          } else { // FM77AV
61             if((mmr_page & 0x30) == 0x30) { // 77AV RAM/ROM Page1
62                uint32 a;
63                a = (mmr_page & 0x0f) * 0x1000 + mmr_offset;
64                if((a < 0xfd80) && (a > 0xfd97)) { // Okay.
65                   addr = a;
66                   goto _fm7_0;
67                }
68                // MMR Area is illegal.
69                *realaddr = 0;
70                return -1;
71             }
72             if(mmr_page < 0x10) { // 77AV RAM PAGE0
73                *realaddr = mmr_page * 0x1000 + mmr_offset;
74                return FM7_MAINMEM_AV_PAGE0;
75             }
76             if(mmr_page < 0x20) { // 77AV VRAM
77                *realaddr = ((mmr_page & 0x0f) * 0x1000) + mmr_offset;
78                return FM7_MAINMEM_AV_SUBMEM;
79             }
80             if(mmr_page < 0x30) { // 77AV Jcard
81                if(jcard != NULL) {
82                     if(jcard->isenabled()) {
83                        *realaddr = ((mmr_page & 0x0f) * 0x1000) + mmr_offset;
84                        return FM7_MAINMEM_AV_JCARD;
85                     }
86                }
87                *realaddr = mmr_offset;
88                return -1; // Illegal
89             }
90             if(av_extram != NULL) {
91                  if(av_extram->isenabled()) {
92                     *realaddr = ((mmr_page - 0x40) * 0x1000) + mmr_offset;
93                     return FM7_MAINMEM_AV_EXTRAM768K;
94                  }
95             }
96             // Illegal Page
97             *realaddr = offset;
98             return -1;
99          }
100       }
101    }
102
103 _fm7_0:     
104       addr = addr & 0x0ffff;
105       if(mainio->is_initiaterom()) { // Initiate rom enabled, force overwrite vector.
106         if(addr >= 0xfffe) {
107            *realaddr = addr - 0xe000;
108            return FM7_MAINMEM_AV_INITROM;
109         }
110         if((addr >= 0x6000) && (addr < 0x8000)){ // Real addr: $6000 - $7fff
111            *realaddr = addr - 0x6000;
112            return FM7_MAINMEM_AV_INITROM;
113         }
114       }
115    
116       if(addr < 0x8000) {
117          *realaddr = addr - 0;
118          return FM7_MAINMEM_OMOTE;
119       }
120    
121       if(addr < 0xfc00) {
122          *realaddr = addr - 0x8000;
123         if(mainio->get_rommode_fd0f() == true) return FM7_MAINMEM_BASICROM;
124         return FM7_MAINMEM_URA;
125       }
126       if(addr < 0xfc80) {
127          *realaddr = addr - 0xfc00;
128          return FM7_MAINMEM_BIOSWORK;
129       }
130    
131       if(addr < 0xfd00) {
132          *realaddr = addr - 0xfc80;
133          return FM7_MAINMEM_SHAREDRAM;
134       }
135       if(addr < 0xfe00) {
136         *realaddr = addr - 0xfd00;
137         return FM7_MAINMEM_MMIO;
138       }
139       if(addr < 0xfff0) {
140         *realaddr = addr - 0xfe00;
141         if(mainio->get_boot_romram() != true) return FM7_MAINMEM_BOOTROM_RAM;
142         switch(dipsw->get_boot_mode()) {
143          case FM7_BOOTMODE_BASIC:
144            return FM7_MAIMEM_BOOTROM_BAS;
145            break;
146          case FM7_BOOTMODE_DOS:
147            return FM7_MAIMEM_BOOTROM_DOS;
148            break;
149          case FM7_BOOTMODE_ROM3:
150            return FM7_MAIMEM_BOOTROM_ROM3;
151            break;
152          default:
153            return FM7_MAINMEM_BOOTROM_BAS; // Really?
154            break;
155         }
156       }
157    
158      if(addr < 0xfffe) {
159         *realaddr = addr - 0xfff0;
160         return FM7_MAINMEM_VECTOR;
161      }
162      if(addr < 0x10000) {
163         *realaddr = addr - 0xfffe;
164         return FM7_MAINMEM_VECTOR_RESET;
165      }
166      // Over
167      realaddr = addr;
168      return -1;
169 }
170
171 uint32 FM7_MAINMEM::read_data8(uint32 addr)
172 {
173    uint32 ret;
174    uint32 realaddr;
175    int bank;
176
177    bank = getbank(addr, &realaddr);
178    if(bank < 0) return 0xff; // Illegal
179    
180    if(read_table[bank].dev != NULL) {
181         return read_table[bank].dev->read_memory_mapped_io8(realaddr);
182    } else {
183         if(read_table[bank].memory != NULL) {
184            return read_table[bank].memory[realaddr];
185         }
186       return 0xff; // Dummy
187    }
188    
189 }
190
191 void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
192 {
193    uint32 ret;
194    uint32 realaddr;
195    int bank;
196    
197    bank = getbank(addr, &realaddr);
198    if(bank < 0) return; // Illegal
199    
200    if(write_table[bank].dev != NULL) {
201         write_table[bank].dev->write_memory_mapped_io8(realaddr, data);
202    } else {
203         if(write_table[bank].memory != NULL) {
204            write_table[bank].memory[realaddr] = (uint8)(data & 0x000000ff);
205         }
206    }
207    
208 }
209
210 // Read / Write data(s) as big endian.
211 uint32 FM7_MAINMEM::read_data16(uint32 addr)
212 {
213    uint32 hi, lo;
214    uint32 val;
215    
216    hi = read_data8(addr) & 0xff;
217    lo = read_data8(addr + 1) & 0xff;
218    
219    val = hi * 256 + lo;
220    return val;
221 }
222
223 uint32 FM7_MAINMEM::read_data32(uint32 addr)
224 {
225    uint32 ah, a2, a3, al;
226    uint32 val;
227    
228    ah = read_data8(addr) & 0xff;
229    a2 = read_data8(addr + 1) & 0xff;
230    a3 = read_data8(addr + 2) & 0xff;
231    al = read_data8(addr + 3) & 0xff;
232    
233    val = ah * (65536 * 256) + a2 * 65536 + a3 * 256 + al;
234    return val;
235 }
236
237 void FM7_MAINMEM::write_data16(uint32 addr, uint32 data)
238 {
239    uint32 d = data;
240    
241    write_data8(addr + 1, d & 0xff);
242    d = d / 256;
243    write_data8(addr + 0, d & 0xff);
244    
245 }
246
247 void FM7_MAINMEM::write_data32(uint32 addr, uint32 data)
248 {
249    uint32 d = data;
250    
251    write_data8(addr + 3, d & 0xff);
252    d = d / 256;
253    write_data8(addr + 2, d & 0xff);
254    d = d / 256;
255    write_data8(addr + 1, d & 0xff);
256    d = d / 256;
257    write_data8(addr + 0, d & 0xff);
258    
259 }
260
261
262 bool FM7_MAINMEM::get_loadstat_basicrom(void)
263 {
264    return diag_load_basicrom;
265 }
266
267 bool FM7_MAINMEM::get_loadstat_bootrom_bas(void)
268 {
269    return diag_load_bootrom_bas;
270 }
271
272 bool FM7_MAINMEM::get_loadstat_bootrom_dos(void)
273 {
274    return diag_load_bootrom_dos;
275 }
276