OSDN Git Service

[VM] TRY:Use namespace {VMNAME} to separate around VMs. This feature still apply...
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / mainmem_page2.cpp
1 /*
2  * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_PAGE2]
3  *  Author: K.Ohta
4  *  Date  : 2017.04.01-
5  *  License: GPLv2
6  *
7  */
8 #include "vm.h"
9 #include "emu.h"
10 #include "fm7_mainmem.h"
11 #include "./kanjirom.h"
12
13 namespace FM7 {
14
15 int FM7_MAINMEM::check_page2(uint32_t addr, uint32_t *realaddr, bool write_state, bool dmamode)
16 {
17 #if defined(_FM77AV_VARIANTS)
18         uint32_t mmr_bank = (addr >> 12) & 0x3f;
19         uint32_t raddr = addr & 0x00fff;
20 #  if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
21         if((mmr_bank == 0x2e) && (!write_state)) {
22                 int banknum = check_extrom(raddr, realaddr);
23                 if(banknum >= 0) {
24                         return banknum;
25                 } else {
26 #    if defined(CAPABLE_DICTROM)
27                         if(dictrom_connected && dictrom_enabled) { // Dictionary ROM
28                                 uint32_t dbank = extcard_bank & 0x3f;
29                                 *realaddr = raddr | (dbank << 12);
30                                 return FM7_MAINMEM_DICTROM;
31                         }
32 #    else
33                         *realaddr = 0;
34                         return FM7_MAINMEM_NULL;
35 #    endif                         
36                 }
37         }
38 #    if defined(CAPABLE_DICTROM)
39         switch(mmr_bank) {
40         case 0x28:
41         case 0x29: // Backuped RAM
42                 if(dictrom_connected && dictram_enabled){ // Battery backuped RAM
43                         raddr = (((uint32_t)mmr_bank & 0x01) << 12) | raddr;
44                         raddr =  raddr & 0x1fff;
45                         *realaddr = raddr;
46                         return FM7_MAINMEM_BACKUPED_RAM;
47                 }
48                 break;
49         }
50 #    endif
51 #  elif defined(CAPABLE_DICTROM)  // FM77AV etc With DICT CARD.
52         {
53                 if((mmr_bank == 0x2e) && (!write_state)) {  // ToDo: DICTROM ouside of DICTIONARY.
54                         if(dictrom_connected && dictrom_enabled) { // Dictionary ROM
55                                 uint32_t dbank = extcard_bank & 0x3f;
56                                 *realaddr = raddr | (dbank << 12);
57                                 return FM7_MAINMEM_DICTROM;
58                         }
59                 }
60                 switch(mmr_bank) {
61                 case 0x28:
62                 case 0x29: // Backuped RAM
63                         if(dictrom_connected && dictram_enabled){ // Battery backuped RAM
64                                 raddr = (((uint32_t)mmr_bank & 0x01) << 12) | raddr;
65                                 raddr =  raddr & 0x1fff;
66                                 *realaddr = raddr;
67                                 return FM7_MAINMEM_BACKUPED_RAM;
68                         }
69                         break;
70                 }
71         }
72 #  endif
73         if(use_page2_extram || dictrom_connected) {
74                 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
75                 return FM7_MAINMEM_AV_PAGE2;
76         } else {
77                 *realaddr = 0;
78                 return FM7_MAINMEM_NULL;
79         }
80 #endif
81         return -1;
82 }
83
84 uint8_t FM7_MAINMEM::read_page2(uint32_t addr, bool dmamode)
85 {
86         uint32_t raddr;
87         int stat;
88 #if defined(_FM77AV_VARIANTS)
89         addr = (addr & 0xffff) | 0x20000; 
90         stat = check_page2(addr, &raddr, false, dmamode);
91         if(stat < 0) return 0xff;
92         switch(stat) {
93         case FM7_MAINMEM_AV_PAGE2:
94                 return fm7_mainmem_mmrbank_2[raddr & 0xffff];
95                 break;
96 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
97         case FM7_MAINMEM_77AV40_EXTRAROM:
98                 return fm7_mainmem_extrarom[raddr & 0xffff];
99                 break;
100 # endif
101 # if defined(CAPABLE_DICTROM)
102         case FM7_MAINMEM_KANJI_DUMMYADDR:
103                 return raddr & 0x01;
104                 break;
105         case FM7_MAINMEM_KANJI_LEVEL1:
106                 return read_kanjirom_level1(raddr, dmamode);
107                 break;
108         case FM7_MAINMEM_BASICROM:
109                 return fm7_mainmem_basicrom[raddr & 0x7fff];
110                 break;
111         case FM7_MAINMEM_BOOTROM_MMR:
112                 return fm77av_hidden_bootmmr[raddr & 0x01ff];
113                 break;
114         case FM7_MAINMEM_RESET_VECTOR:
115                 return fm7_mainmem_reset_vector[raddr & 0x01];
116                 break;
117         case FM7_MAINMEM_DICTROM:
118                 return fm7_mainmem_dictrom[raddr];
119                 break;
120         case FM7_MAINMEM_BACKUPED_RAM:
121                 return fm7_mainmem_learndata[raddr & 0x1fff];
122                 break;
123 # endif
124         case FM7_MAINMEM_NULL:
125                 return 0xff;
126                 break;
127         default:
128                 return 0xff;
129                 break;
130         }
131 #else
132         return 0xff;
133 #endif
134 }
135
136 void FM7_MAINMEM::write_page2(uint32_t addr, uint32_t data, bool dmamode)
137 {
138 #if defined(_FM77AV_VARIANTS)
139         uint32_t raddr;
140         int stat;
141         addr = (addr & 0xffff) | 0x20000; 
142         stat = check_page2(addr, &raddr, true, dmamode);
143         if(stat < 0) return;
144         switch(stat) {
145         case FM7_MAINMEM_AV_PAGE2:
146                 fm7_mainmem_mmrbank_2[raddr & 0xffff] = (uint8_t)data;
147                 break;
148         case FM7_MAINMEM_RESET_VECTOR:
149                 fm7_mainmem_reset_vector[raddr & 0x01] = (uint8_t)data;
150                 break;
151 #  if defined(CAPABLE_DICTROM)
152         case FM7_MAINMEM_BACKUPED_RAM:
153                 fm7_mainmem_learndata[raddr & 0x1fff] = (uint8_t)data;
154                 break;
155 #  endif
156         default:
157                 break;
158         }
159 #endif
160 }
161
162 uint8_t FM7_MAINMEM::read_kanjirom_level1(uint32_t realaddr, bool dmamode)
163 {
164 #if defined(CAPABLE_DICTROM)
165         return call_read_data8(kanjiclass1, KANJIROM_DIRECTADDR + realaddr);
166 #else
167         return 0xff;
168 #endif
169 }
170
171 uint8_t FM7_MAINMEM::read_kanji_dummyaddr(uint32_t realaddr, bool dmamode)
172 {
173                 return (realaddr & 0x01);
174 }
175
176 }