OSDN Git Service

[VM] Add vm_template.h . This class, VM_TEMPLATE:: must be mother of VM:: .See fm7...
[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 "fm7_common.h"
12
13 #include "../device.h"
14 #include "../mc6809.h"
15
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
20 #else
21 #define ADDRESS_SPACE 0x10000
22 #endif
23
24 class DEVICE;
25 class MEMORY;
26 class FM7_MAINIO;
27 class KANJIROM;
28 class DISPLAY;
29
30 class FM7_MAINMEM : public DEVICE
31 {
32  private:
33         typedef struct {
34                 uint8_t *read_data;
35                 uint8_t (FM7_MAINMEM::*read_func)(uint32_t, bool);
36                 uint8_t *write_data;
37                 void (FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool);
38         } data_func_table_t;
39         
40         data_func_table_t data_table[ADDRESS_SPACE / 0x80];
41 #if defined(HAS_MMR)
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];
45 # endif
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];
49 #endif
50         bool ioaccess_wait;
51         int waitfactor;
52         int waitcount;
53         int cpu_clocks;
54         
55         bool sub_halted;
56         // V2
57 #ifdef HAS_MMR
58         bool window_enabled;
59         bool window_fast;
60         bool mmr_enabled;
61         bool mmr_fast;
62         bool mmr_extend;
63         bool refresh_fast;
64         uint16_t window_offset;
65         uint8_t mmr_segment;
66         uint8_t mmr_map_data[0x80];
67 #endif
68         bool is_basicrom;
69         bool clockmode;
70         bool basicrom_fd0f;
71         uint32_t bootmode;
72 #ifdef _FM77AV_VARIANTS
73         uint32_t extcard_bank;
74         bool extrom_bank;
75         bool initiator_enabled;
76 #endif
77 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
78         bool boot_ram_write;
79 #endif
80  protected:
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];
85 #if !defined(_FM77AV)
86         uint8_t *fm7_bootroms[8];
87 #endif  
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
93 #endif
94 # if defined(_FM8)
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;
102 #endif
103 #ifdef HAS_MMR
104         bool extram_connected;
105
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;
113         
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];
122 #  endif
123 #  if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) 
124         bool diag_load_extrarom;
125         uint8_t fm7_mainmem_extrarom[0x10000]; // $20000-$2bfff, banked
126         int extram_pages;
127         uint32_t extram_size;
128         uint8_t *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
129 #  endif
130 # endif
131 # if defined(_FM77_VARIANTS)
132         int extram_pages;
133         uint32_t extram_size;
134         uint8_t *fm7_mainmem_extram; // $00000-$2ffff
135         uint8_t fm77_shadowram[0x200];
136 # endif
137 #endif
138 #if defined(CAPABLE_DICTROM)
139         KANJIROM *kanjiclass1;
140         //KANJIROM *kanjiclass2;
141 #endif  
142         MC6809 *maincpu;
143         FM7_MAINIO *mainio;
144         DISPLAY *display;
145         
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;
154
155         uint32_t mem_waitfactor;
156         uint32_t mem_waitcount;
157
158         int check_extrom(uint32_t raddr, uint32_t *realaddr);
159         
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);
164         
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);
180         
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);
186
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);
193
194         template <class T>
195         void call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
196         {
197                 //T *nnp = static_cast<T *>(np);
198                 static_cast<T *>(np)->write_signal(id, data, mask);
199         }
200         template <class T>
201                 void call_write_data8(T *np, uint32_t addr, uint32_t data)
202         {
203                 //T *nnp = static_cast<T *>(np);
204                 static_cast<T *>(np)->write_data8(addr, data);
205         }
206         template <class T>
207                 uint32_t call_read_data8(T *np, uint32_t addr)
208         {
209                 //T *nnp = static_cast<T *>(np);
210                 return static_cast<T *>(np)->read_data8(addr);
211         }
212         template <class T>
213                 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
214         {
215                 //T *nnp = static_cast<T *>(np);
216                 static_cast<T *>(np)->write_dma_data8(addr, data);
217         }
218         template <class T>
219                 uint32_t call_read_dma_data8(T *np, uint32_t addr)
220         {
221                 //T *nnp = static_cast<T *>(np);
222                 return static_cast<T *>(np)->read_dma_data8(addr);
223         }
224  public:
225         FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU* parent_emu);
226         ~FM7_MAINMEM();
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);
231
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);
236    
237         virtual uint32_t read_data16(uint32_t addr);
238         virtual void write_data16(uint32_t addr, uint32_t data);
239    
240         virtual uint32_t read_data32(uint32_t addr);
241         virtual void write_data32(uint32_t addr, uint32_t data);
242    
243         void initialize(void);
244         void iowait(void);
245         void dram_refresh(void);
246         void reset(void);
247         void release(void);
248
249         bool get_loadstat_basicrom(void);
250         bool get_loadstat_bootrom_bas(void);
251         bool get_loadstat_bootrom_dos(void);
252         void decl_state();
253         void save_state(FILEIO *state_fio);
254         void update_config();
255         bool load_state(FILEIO *state_fio);
256
257         void set_context_display(DEVICE *p){
258                 display = (DISPLAY *)p;
259         }
260         void set_context_maincpu(MC6809 *p){
261                 maincpu = (MC6809 *)p;
262         }
263         void set_context_mainio(DEVICE *p){
264                 mainio = (FM7_MAINIO *)p;
265         }
266 #if defined(CAPABLE_DICTROM)
267         void set_context_kanjirom_class1(DEVICE *p){
268                 kanjiclass1 = (KANJIROM *)p;
269         }
270 #endif  
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);
275 };
276
277 #endif