2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #ifndef _FM7_MAINMEM_H_
9 #define _FM7_MAINMEM_H_
12 #include "fm7_common.h"
14 #include "../device.h"
15 #include "../mc6809.h"
17 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
18 #define ADDRESS_SPACE 0x100000
19 #elif defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
20 #define ADDRESS_SPACE 0x40000
22 #define ADDRESS_SPACE 0x10000
35 class FM7_MAINMEM : public DEVICE
40 uint8_t (__FASTCALL FM7_MAINMEM::*read_func)(uint32_t, bool);
42 void (__FASTCALL FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool);
45 data_func_table_t data_table[ADDRESS_SPACE / 0x80];
46 //data_func_table_t data_table[0x100000 / 0x80];
48 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
49 data_func_table_t mmr_update_table_ext[(0x80 * 0x1000) / 0x80];
50 uint32_t mmr_baseaddr_table_ext[(0x80 * 0x1000) / 0x80];
52 data_func_table_t mmr_update_table_nor[(0x80 * 0x1000) / 0x80];
53 uint32_t mmr_bank_table[(0x80 * 0x1000) / 0x80];
54 uint32_t mmr_baseaddr_table_nor[(0x80 * 0x1000) / 0x80];
70 uint16_t window_offset;
72 uint8_t mmr_map_data[0x80];
78 #ifdef _FM77AV_VARIANTS
79 uint32_t extcard_bank;
81 bool initiator_enabled;
83 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
87 uint8_t fm7_mainmem_omote[0x8000];
88 uint8_t fm7_mainmem_ura[0x7c00];
89 uint8_t fm7_mainmem_basicrom[0x7c00];
90 uint8_t fm7_mainmem_bioswork[0x80];
92 uint8_t fm7_bootroms[8][0x200];
94 uint8_t fm7_mainmem_bootrom_vector[0x1e]; // Without
95 uint8_t fm7_mainmem_reset_vector[2]; // Without
96 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
97 uint8_t fm7_bootram[0x200]; // $00000-$0ffff
100 bool diag_load_sm11_14;
101 bool diag_load_sm11_15;
102 # elif defined(_FM77_VARIANTS)
103 bool diag_load_wb11_12;
104 # elif defined(_FM7) || defined(_FMNEW7)
105 bool diag_load_tl11_11;
106 bool diag_load_tl11_12;
109 bool extram_connected;
111 # if defined(_FM77AV_VARIANTS)
112 bool diag_load_initrom;
113 bool diag_load_dictrom;
114 bool diag_load_learndata;
115 bool dictrom_connected;
116 bool dictrom_enabled;
117 bool dictram_enabled;
119 bool use_page2_extram;
120 uint8_t fm7_mainmem_initrom[0x2000]; // $00000-$0ffff
121 uint8_t fm77av_hidden_bootmmr[0x200];
122 uint8_t fm7_mainmem_mmrbank_0[0x10000]; // $00000-$0ffff
123 uint8_t fm7_mainmem_mmrbank_2[0x10000]; // $20000-$2ffff
124 # if defined(CAPABLE_DICTROM)
125 uint8_t fm7_mainmem_dictrom[0x40000]; // $00000-$3ffff, banked
126 uint8_t fm7_mainmem_learndata[0x2000];
128 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
129 bool diag_load_extrarom;
130 uint8_t fm7_mainmem_extrarom[0x10000]; // $20000-$2bfff, banked
132 uint32_t extram_size;
133 uint8_t *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
136 # if defined(_FM77_VARIANTS)
138 uint32_t extram_size;
139 uint8_t *fm7_mainmem_extram; // $00000-$2ffff
140 uint8_t fm77_shadowram[0x200];
143 #if defined(CAPABLE_DICTROM)
144 FM7::KANJIROM *kanjiclass1;
145 //KANJIROM *kanjiclass2;
148 FM7::FM7_MAINIO *mainio;
149 FM7::DISPLAY *display;
151 bool diag_load_basicrom;
152 bool diag_load_bootrom_bas;
153 bool diag_load_bootrom_dos;
154 bool diag_load_bootrom_mmr;
155 bool diag_load_bootrom_bubble;
156 bool diag_load_bootrom_bubble_128k;
157 bool diag_load_bootrom_sfd8;
158 bool diag_load_bootrom_2hd;
160 uint32_t mem_waitfactor;
161 uint32_t mem_waitcount;
163 int check_extrom(uint32_t raddr, uint32_t *realaddr);
165 int window_convert(uint32_t addr, uint32_t *realaddr);
166 uint32_t read_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
167 uint32_t write_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
168 void setclock(int mode);
170 uint8_t __FASTCALL read_shared_ram(uint32_t realaddr, bool dmamode);
171 void __FASTCALL write_shared_ram(uint32_t realaddr, uint32_t data, bool dmamode);
172 uint8_t __FASTCALL read_direct_access(uint32_t realaddr, bool dmamode);
173 void __FASTCALL write_direct_access(uint32_t realaddr, uint32_t data, bool dmamode);
174 uint8_t __FASTCALL read_kanjirom_level1(uint32_t realaddr, bool dmamode);
175 uint8_t __FASTCALL read_kanji_dummyaddr(uint32_t realaddr, bool dmamode);
176 uint8_t __FASTCALL read_ura_basicrom(uint32_t addr, bool dmamode);
177 void __FASTCALL write_ura_basicrom(uint32_t addr, uint32_t data, bool dmamode);
178 uint8_t __FASTCALL read_mmio(uint32_t addr, bool dmamode);
179 void __FASTCALL write_mmio(uint32_t addr, uint32_t data, bool dmamode);
180 uint8_t __FASTCALL read_bootrom(uint32_t addr, bool dmamode);
181 void __FASTCALL write_bootrom(uint32_t addr, uint32_t data, bool dmamode);
182 uint8_t __FASTCALL read_page2(uint32_t addr, bool dmamode);
183 void __FASTCALL write_page2(uint32_t addr, uint32_t data, bool dmamode);
184 int __FASTCALL check_page2(uint32_t addr, uint32_t *realaddr, bool write_state, bool dmamode);
186 void init_data_table(void);
187 uint8_t __FASTCALL read_data(uint32_t addr, bool dmamode);
188 void __FASTCALL write_data(uint32_t addr, uint32_t data, bool dmamode);
189 uint8_t __FASTCALL read_data_tbl(uint32_t addr, bool dmamode);
190 void __FASTCALL write_data_tbl(uint32_t addr, uint32_t data, bool dmamode);
192 void __FASTCALL update_mmr_jumptable(uint32_t pos);
193 void __FASTCALL update_all_mmr_jumptable(void);
194 uint8_t __FASTCALL read_segment_3f(uint32_t addr, bool dmamode);
195 void __FASTCALL write_segment_3f(uint32_t addr, uint32_t data, bool dmamode);
196 uint8_t __FASTCALL read_with_mmr(uint32_t addr, uint32_t segment, uint32_t dmamode);
197 void __FASTCALL write_with_mmr(uint32_t addr, uint32_t segment, uint32_t data, uint32_t dmamode);
200 void __FASTCALL call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
202 //T *nnp = static_cast<T *>(np);
203 static_cast<T *>(np)->write_signal(id, data, mask);
206 void call_write_data8(T *np, uint32_t addr, uint32_t data)
208 //T *nnp = static_cast<T *>(np);
209 static_cast<T *>(np)->write_data8(addr, data);
212 uint32_t call_read_data8(T *np, uint32_t addr)
214 //T *nnp = static_cast<T *>(np);
215 return static_cast<T *>(np)->read_data8(addr);
218 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
220 //T *nnp = static_cast<T *>(np);
221 static_cast<T *>(np)->write_dma_data8(addr, data);
224 uint32_t call_read_dma_data8(T *np, uint32_t addr)
226 //T *nnp = static_cast<T *>(np);
227 return static_cast<T *>(np)->read_dma_data8(addr);
230 FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu);
232 uint32_t __FASTCALL read_data8(uint32_t addr);
233 uint32_t __FASTCALL read_dma_data8(uint32_t addr);
234 uint32_t __FASTCALL read_dma_io8(uint32_t addr);
235 uint32_t __FASTCALL read_data8_main(uint32_t addr, bool dmamode);
237 void __FASTCALL write_data8(uint32_t addr, uint32_t data);
238 void __FASTCALL write_dma_data8(uint32_t addr, uint32_t data);
239 void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
240 void __FASTCALL write_data8_main(uint32_t addr, uint32_t data, bool dmamode);
242 virtual uint32_t __FASTCALL read_data16(uint32_t addr);
243 virtual void __FASTCALL write_data16(uint32_t addr, uint32_t data);
244 virtual uint32_t read_data16w(uint32_t addr, int *wait);
245 virtual void write_data16w(uint32_t addr, uint32_t data, int *wait);
247 virtual uint32_t __FASTCALL read_data32(uint32_t addr);
248 virtual void __FASTCALL write_data32(uint32_t addr, uint32_t data);
249 virtual uint32_t read_data32w(uint32_t addr, int *wait);
250 virtual void write_data32w(uint32_t addr, uint32_t data, int *wait);
252 void initialize(void);
253 void __FASTCALL iowait(void);
254 void __FASTCALL dram_refresh(void);
258 bool get_loadstat_basicrom(void);
259 bool get_loadstat_bootrom_bas(void);
260 bool get_loadstat_bootrom_dos(void);
261 void update_config();
263 bool process_state(FILEIO *state_fio, bool loading);
265 void set_context_display(DEVICE *p){
266 display = (FM7::DISPLAY *)p;
268 void set_context_maincpu(MC6809 *p){
269 maincpu = (MC6809 *)p;
271 void set_context_mainio(DEVICE *p){
272 mainio = (FM7::FM7_MAINIO *)p;
274 #if defined(CAPABLE_DICTROM)
275 void set_context_kanjirom_class1(DEVICE *p){
276 kanjiclass1 = (FM7::KANJIROM *)p;
279 void __FASTCALL write_signal(int sigid, uint32_t data, uint32_t mask);
280 uint32_t __FASTCALL read_signal(int sigid);
281 uint32_t __FASTCALL read_io8(uint32_t addr);
282 void __FASTCALL write_io8(uint32_t addr, uint32_t data);