2 * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_PAGE2]
10 #include "fm7_mainmem.h"
11 #include "./kanjirom.h"
15 int FM7_MAINMEM::check_page2(uint32_t addr, uint32_t *realaddr, bool write_state, bool dmamode)
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);
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;
34 return FM7_MAINMEM_NULL;
38 # if defined(CAPABLE_DICTROM)
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;
46 return FM7_MAINMEM_BACKUPED_RAM;
51 # elif defined(CAPABLE_DICTROM) // FM77AV etc With DICT CARD.
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;
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;
67 return FM7_MAINMEM_BACKUPED_RAM;
73 if(use_page2_extram || dictrom_connected) {
74 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
75 return FM7_MAINMEM_AV_PAGE2;
78 return FM7_MAINMEM_NULL;
84 uint8_t FM7_MAINMEM::read_page2(uint32_t addr, bool dmamode)
88 #if defined(_FM77AV_VARIANTS)
89 addr = (addr & 0xffff) | 0x20000;
90 stat = check_page2(addr, &raddr, false, dmamode);
91 if(stat < 0) return 0xff;
93 case FM7_MAINMEM_AV_PAGE2:
94 return fm7_mainmem_mmrbank_2[raddr & 0xffff];
96 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
97 case FM7_MAINMEM_77AV40_EXTRAROM:
98 return fm7_mainmem_extrarom[raddr & 0xffff];
101 # if defined(CAPABLE_DICTROM)
102 case FM7_MAINMEM_KANJI_DUMMYADDR:
105 case FM7_MAINMEM_KANJI_LEVEL1:
106 return read_kanjirom_level1(raddr, dmamode);
108 case FM7_MAINMEM_BASICROM:
109 return fm7_mainmem_basicrom[raddr & 0x7fff];
111 case FM7_MAINMEM_BOOTROM_MMR:
112 return fm77av_hidden_bootmmr[raddr & 0x01ff];
114 case FM7_MAINMEM_RESET_VECTOR:
115 return fm7_mainmem_reset_vector[raddr & 0x01];
117 case FM7_MAINMEM_DICTROM:
118 return fm7_mainmem_dictrom[raddr];
120 case FM7_MAINMEM_BACKUPED_RAM:
121 return fm7_mainmem_learndata[raddr & 0x1fff];
124 case FM7_MAINMEM_NULL:
136 void FM7_MAINMEM::write_page2(uint32_t addr, uint32_t data, bool dmamode)
138 #if defined(_FM77AV_VARIANTS)
141 addr = (addr & 0xffff) | 0x20000;
142 stat = check_page2(addr, &raddr, true, dmamode);
145 case FM7_MAINMEM_AV_PAGE2:
146 fm7_mainmem_mmrbank_2[raddr & 0xffff] = (uint8_t)data;
148 case FM7_MAINMEM_RESET_VECTOR:
149 fm7_mainmem_reset_vector[raddr & 0x01] = (uint8_t)data;
151 # if defined(CAPABLE_DICTROM)
152 case FM7_MAINMEM_BACKUPED_RAM:
153 fm7_mainmem_learndata[raddr & 0x1fff] = (uint8_t)data;
162 uint8_t FM7_MAINMEM::read_kanjirom_level1(uint32_t realaddr, bool dmamode)
164 #if defined(CAPABLE_DICTROM)
165 return call_read_data8(kanjiclass1, KANJIROM_DIRECTADDR + realaddr);
171 uint8_t FM7_MAINMEM::read_kanji_dummyaddr(uint32_t realaddr, bool dmamode)
173 return (realaddr & 0x01);