OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_mainmem.h
1 /*
2  * Main memory without MMR for FM-7 [FM7_MAINMEM]
3  *  Author: K.Ohta
4  *  Date  : 2015.01.01-
5  *
6  */
7
8 #ifndef _FM7_MAINMEM_H_
9 #define _FM7_MAINMEM_H_
10
11 #include "../vm.h"
12 #include "fm7_common.h"
13
14 #include "../device.h"
15 #include "../mc6809.h"
16
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
21 #else
22 #define ADDRESS_SPACE 0x10000
23 #endif
24
25 class DEVICE;
26 class MEMORY;
27
28 namespace FM7 {
29         class FM7_MAINIO;
30         class KANJIROM;
31         class DISPLAY;
32 }
33
34 namespace FM7 {
35 class FM7_MAINMEM : public DEVICE
36 {
37  private:
38         typedef struct {
39                 uint8_t *read_data;
40                 uint8_t (__FASTCALL FM7_MAINMEM::*read_func)(uint32_t, bool);
41                 uint8_t *write_data;
42                 void (__FASTCALL FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool);
43         } data_func_table_t;
44
45         data_func_table_t data_table[ADDRESS_SPACE / 0x80];
46         //data_func_table_t data_table[0x100000 / 0x80];
47 #if defined(HAS_MMR)
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];
51 # endif
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];
55 #endif
56         bool ioaccess_wait;
57         int waitfactor;
58         int waitcount;
59         int cpu_clocks;
60
61         bool sub_halted;
62         // V2
63 #ifdef HAS_MMR
64         bool window_enabled;
65         bool window_fast;
66         bool mmr_enabled;
67         bool mmr_fast;
68         bool mmr_extend;
69         bool refresh_fast;
70         uint16_t window_offset;
71         uint8_t mmr_segment;
72         uint8_t mmr_map_data[0x80];
73 #endif
74         bool is_basicrom;
75         bool clockmode;
76         bool basicrom_fd0f;
77         uint32_t bootmode;
78 #ifdef _FM77AV_VARIANTS
79         uint32_t extcard_bank;
80         bool extrom_bank;
81         bool initiator_enabled;
82 #endif
83 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
84         bool boot_ram_write;
85 #endif
86  protected:
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];
91 #if !defined(_FM77AV)
92         uint8_t fm7_bootroms[8][0x200];
93 #endif
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
98 #endif
99 # if defined(_FM8)
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;
107 #endif
108 #ifdef HAS_MMR
109         bool extram_connected;
110
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;
118
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];
127 #  endif
128 #  if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
129         bool diag_load_extrarom;
130         uint8_t fm7_mainmem_extrarom[0x10000]; // $20000-$2bfff, banked
131         int extram_pages;
132         uint32_t extram_size;
133         uint8_t *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
134 #  endif
135 # endif
136 # if defined(_FM77_VARIANTS)
137         int extram_pages;
138         uint32_t extram_size;
139         uint8_t *fm7_mainmem_extram; // $00000-$2ffff
140         uint8_t fm77_shadowram[0x200];
141 # endif
142 #endif
143 #if defined(CAPABLE_DICTROM)
144         FM7::KANJIROM *kanjiclass1;
145         //KANJIROM *kanjiclass2;
146 #endif
147         MC6809 *maincpu;
148         FM7::FM7_MAINIO *mainio;
149         FM7::DISPLAY *display;
150
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;
159
160         uint32_t mem_waitfactor;
161         uint32_t mem_waitcount;
162
163         int check_extrom(uint32_t raddr, uint32_t *realaddr);
164
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);
169
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);
185
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);
191
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);
198
199         template <class T>
200         void __FASTCALL call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
201         {
202                 //T *nnp = static_cast<T *>(np);
203                 static_cast<T *>(np)->write_signal(id, data, mask);
204         }
205         template <class T>
206                 void call_write_data8(T *np, uint32_t addr, uint32_t data)
207         {
208                 //T *nnp = static_cast<T *>(np);
209                 static_cast<T *>(np)->write_data8(addr, data);
210         }
211         template <class T>
212                 uint32_t call_read_data8(T *np, uint32_t addr)
213         {
214                 //T *nnp = static_cast<T *>(np);
215                 return static_cast<T *>(np)->read_data8(addr);
216         }
217         template <class T>
218                 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
219         {
220                 //T *nnp = static_cast<T *>(np);
221                 static_cast<T *>(np)->write_dma_data8(addr, data);
222         }
223         template <class T>
224                 uint32_t call_read_dma_data8(T *np, uint32_t addr)
225         {
226                 //T *nnp = static_cast<T *>(np);
227                 return static_cast<T *>(np)->read_dma_data8(addr);
228         }
229  public:
230         FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu);
231         ~FM7_MAINMEM();
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);
236
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);
241
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);
246
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);
251
252         void initialize(void);
253         void __FASTCALL iowait(void);
254         void __FASTCALL dram_refresh(void);
255         void reset(void);
256         void release(void);
257
258         bool get_loadstat_basicrom(void);
259         bool get_loadstat_bootrom_bas(void);
260         bool get_loadstat_bootrom_dos(void);
261         void update_config();
262
263         bool process_state(FILEIO *state_fio, bool loading);
264
265         void set_context_display(DEVICE *p){
266                 display = (FM7::DISPLAY *)p;
267         }
268         void set_context_maincpu(MC6809 *p){
269                 maincpu = (MC6809 *)p;
270         }
271         void set_context_mainio(DEVICE *p){
272                 mainio = (FM7::FM7_MAINIO *)p;
273         }
274 #if defined(CAPABLE_DICTROM)
275         void set_context_kanjirom_class1(DEVICE *p){
276                 kanjiclass1 = (FM7::KANJIROM *)p;
277         }
278 #endif
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);
283 };
284 }
285
286 #endif