2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #ifndef _FM7_MAINMEM_H_
9 #define _FM7_MAINMEM_H_
11 #include "fm7_common.h"
13 #include "../device.h"
14 #include "../mc6809.h"
16 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
17 #define ADDRESS_SPACE 0x100000
18 #elif defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
19 #define ADDRESS_SPACE 0x40000
21 #define ADDRESS_SPACE 0x10000
30 class FM7_MAINMEM : public DEVICE
35 uint8_t (FM7_MAINMEM::*read_func)(uint32_t, bool);
37 void (FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool);
40 data_func_table_t data_table[ADDRESS_SPACE / 0x80];
42 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
43 data_func_table_t mmr_update_table_ext[(0x80 * 0x1000) / 0x80];
44 uint32_t mmr_baseaddr_table_ext[(0x80 * 0x1000) / 0x80];
46 data_func_table_t mmr_update_table_nor[(0x80 * 0x1000) / 0x80];
47 uint32_t mmr_bank_table[(0x80 * 0x1000) / 0x80];
48 uint32_t mmr_baseaddr_table_nor[(0x80 * 0x1000) / 0x80];
64 uint16_t window_offset;
66 uint8_t mmr_map_data[0x80];
72 #ifdef _FM77AV_VARIANTS
73 uint32_t extcard_bank;
75 bool initiator_enabled;
77 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
81 uint8_t fm7_mainmem_omote[0x8000];
82 uint8_t fm7_mainmem_ura[0x7c00];
83 uint8_t fm7_mainmem_basicrom[0x7c00];
84 uint8_t fm7_mainmem_bioswork[0x80];
86 uint8_t *fm7_bootroms[8];
88 uint8_t fm7_mainmem_bootrom_vector[0x1e]; // Without
89 uint8_t fm7_mainmem_reset_vector[2]; // Without
90 uint8_t fm7_mainmem_null[1];
91 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
92 uint8_t fm7_bootram[0x200]; // $00000-$0ffff
95 bool diag_load_sm11_14;
96 bool diag_load_sm11_15;
97 # elif defined(_FM77_VARIANTS)
98 bool diag_load_wb11_12;
99 # elif defined(_FM7) || defined(_FMNEW7)
100 bool diag_load_tl11_11;
101 bool diag_load_tl11_12;
104 bool extram_connected;
106 # if defined(_FM77AV_VARIANTS)
107 bool diag_load_initrom;
108 bool diag_load_dictrom;
109 bool diag_load_learndata;
110 bool dictrom_connected;
111 bool dictrom_enabled;
112 bool dictram_enabled;
114 bool use_page2_extram;
115 uint8_t fm7_mainmem_initrom[0x2000]; // $00000-$0ffff
116 uint8_t fm77av_hidden_bootmmr[0x200];
117 uint8_t fm7_mainmem_mmrbank_0[0x10000]; // $00000-$0ffff
118 uint8_t fm7_mainmem_mmrbank_2[0x10000]; // $20000-$2ffff
119 # if defined(CAPABLE_DICTROM)
120 uint8_t fm7_mainmem_dictrom[0x40000]; // $00000-$3ffff, banked
121 uint8_t fm7_mainmem_learndata[0x2000];
123 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
124 bool diag_load_extrarom;
125 uint8_t fm7_mainmem_extrarom[0x10000]; // $20000-$2bfff, banked
127 uint32_t extram_size;
128 uint8_t *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
131 # if defined(_FM77_VARIANTS)
133 uint32_t extram_size;
134 uint8_t *fm7_mainmem_extram; // $00000-$2ffff
135 uint8_t fm77_shadowram[0x200];
138 #if defined(CAPABLE_DICTROM)
139 KANJIROM *kanjiclass1;
140 //KANJIROM *kanjiclass2;
146 bool diag_load_basicrom;
147 bool diag_load_bootrom_bas;
148 bool diag_load_bootrom_dos;
149 bool diag_load_bootrom_mmr;
150 bool diag_load_bootrom_bubble;
151 bool diag_load_bootrom_bubble_128k;
152 bool diag_load_bootrom_sfd8;
153 bool diag_load_bootrom_2hd;
155 uint32_t mem_waitfactor;
156 uint32_t mem_waitcount;
158 int check_extrom(uint32_t raddr, uint32_t *realaddr);
160 int window_convert(uint32_t addr, uint32_t *realaddr);
161 uint32_t read_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
162 uint32_t write_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
163 void setclock(int mode);
165 uint8_t read_shared_ram(uint32_t realaddr, bool dmamode);
166 void write_shared_ram(uint32_t realaddr, uint32_t data, bool dmamode);
167 uint8_t read_direct_access(uint32_t realaddr, bool dmamode);
168 void write_direct_access(uint32_t realaddr, uint32_t data, bool dmamode);
169 uint8_t read_kanjirom_level1(uint32_t realaddr, bool dmamode);
170 uint8_t read_kanji_dummyaddr(uint32_t realaddr, bool dmamode);
171 uint8_t read_ura_basicrom(uint32_t addr, bool dmamode);
172 void write_ura_basicrom(uint32_t addr, uint32_t data, bool dmamode);
173 uint8_t read_mmio(uint32_t addr, bool dmamode);
174 void write_mmio(uint32_t addr, uint32_t data, bool dmamode);
175 uint8_t read_bootrom(uint32_t addr, bool dmamode);
176 void write_bootrom(uint32_t addr, uint32_t data, bool dmamode);
177 uint8_t read_page2(uint32_t addr, bool dmamode);
178 void write_page2(uint32_t addr, uint32_t data, bool dmamode);
179 int check_page2(uint32_t addr, uint32_t *realaddr, bool write_state, bool dmamode);
181 void init_data_table(void);
182 uint8_t read_data(uint32_t addr, bool dmamode);
183 void write_data(uint32_t addr, uint32_t data, bool dmamode);
184 uint8_t read_data_tbl(uint32_t addr, bool dmamode);
185 void write_data_tbl(uint32_t addr, uint32_t data, bool dmamode);
187 void update_mmr_jumptable(uint32_t pos);
188 void update_all_mmr_jumptable(void);
189 uint8_t read_segment_3f(uint32_t addr, bool dmamode);
190 void write_segment_3f(uint32_t addr, uint32_t data, bool dmamode);
191 uint8_t read_with_mmr(uint32_t addr, uint32_t segment, uint32_t dmamode);
192 void write_with_mmr(uint32_t addr, uint32_t segment, uint32_t data, uint32_t dmamode);
195 void call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
197 //T *nnp = static_cast<T *>(np);
198 static_cast<T *>(np)->write_signal(id, data, mask);
201 void call_write_data8(T *np, uint32_t addr, uint32_t data)
203 //T *nnp = static_cast<T *>(np);
204 static_cast<T *>(np)->write_data8(addr, data);
207 uint32_t call_read_data8(T *np, uint32_t addr)
209 //T *nnp = static_cast<T *>(np);
210 return static_cast<T *>(np)->read_data8(addr);
213 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
215 //T *nnp = static_cast<T *>(np);
216 static_cast<T *>(np)->write_dma_data8(addr, data);
219 uint32_t call_read_dma_data8(T *np, uint32_t addr)
221 //T *nnp = static_cast<T *>(np);
222 return static_cast<T *>(np)->read_dma_data8(addr);
225 FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU* parent_emu);
227 uint32_t read_data8(uint32_t addr);
228 uint32_t read_dma_data8(uint32_t addr);
229 uint32_t read_dma_io8(uint32_t addr);
230 uint32_t read_data8_main(uint32_t addr, bool dmamode);
232 void write_data8(uint32_t addr, uint32_t data);
233 void write_dma_data8(uint32_t addr, uint32_t data);
234 void write_dma_io8(uint32_t addr, uint32_t data);
235 void write_data8_main(uint32_t addr, uint32_t data, bool dmamode);
237 virtual uint32_t read_data16(uint32_t addr);
238 virtual void write_data16(uint32_t addr, uint32_t data);
240 virtual uint32_t read_data32(uint32_t addr);
241 virtual void write_data32(uint32_t addr, uint32_t data);
243 void initialize(void);
245 void dram_refresh(void);
249 bool get_loadstat_basicrom(void);
250 bool get_loadstat_bootrom_bas(void);
251 bool get_loadstat_bootrom_dos(void);
253 void save_state(FILEIO *state_fio);
254 void update_config();
255 bool load_state(FILEIO *state_fio);
257 void set_context_display(DEVICE *p){
258 display = (DISPLAY *)p;
260 void set_context_maincpu(MC6809 *p){
261 maincpu = (MC6809 *)p;
263 void set_context_mainio(DEVICE *p){
264 mainio = (FM7_MAINIO *)p;
266 #if defined(CAPABLE_DICTROM)
267 void set_context_kanjirom_class1(DEVICE *p){
268 kanjiclass1 = (KANJIROM *)p;
271 void write_signal(int sigid, uint32_t data, uint32_t mask);
272 uint32_t read_signal(int sigid);
273 uint32_t read_io8(uint32_t addr);
274 void write_io8(uint32_t addr, uint32_t data);