OSDN Git Service

[FM7][DISPLAY] Force SYNC submemory and mainmemory to SUBCPU.
[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 "../memory.h"
14 #include "../mc6809.h"
15 #define MEMORY_ADDR_MAX  0x20000
16 #define MEMORY_BANK_SIZE 0x20000
17 #define MEMORY_BANK_SIZE 0x10
18 #define MEMORY_ADDR_MAX (FM7_MAINMEM_END * MEMORY_BANK_SIZE)
19
20 class DEVICE;
21 class MEMORY;
22 class FM7_MAINIO;
23
24 class FM7_MAINMEM : public MEMORY
25 {
26  private:
27         typedef struct {
28                 DEVICE* dev;
29                 uint8* memory;
30                 int wait;
31         } bank_t;
32         bank_t read_table[FM7_MAINMEM_END];
33         bank_t write_table[FM7_MAINMEM_END];
34         bool ioaccess_wait;
35         int waitfactor;
36         int waitcount;
37         bool sub_halted;
38  protected:
39         EMU *p_emu;
40         VM *p_vm;
41    
42         uint8 fm7_mainmem_omote[0x8000];
43         uint8 fm7_mainmem_ura[0x7c00];
44         uint8 fm7_mainmem_basicrom[0x7c00];
45         uint8 fm7_mainmem_bioswork[0x80];
46         uint8 *fm7_bootroms[4];
47         uint8 fm7_mainmem_bootrom_vector[0x1e]; // Without
48         uint8 fm7_mainmem_reset_vector[2]; // Without
49         uint8 fm7_mainmem_null[1];
50
51 #ifdef HAS_MMR
52 #ifdef _FM77AV_VARIANTS
53         uint8 fm7_mainmem_mmrbank_0[0x10000]; // $00000-$0ffff
54         uint8 fm7_mainmem_mmrbank_2[0x10000]; // $20000-$2ffff 
55 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20)
56         uint8 *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
57         uint8 fm7_mainmem_extrarom[0x20000]; // $20000-$2ffff, banked
58         uint8 fm7_mainmem_dictrom[0x20000]; // $20000-$2ffff, banked
59 # endif
60 #else
61         uint8 *fm7_mainmem_extram; // $00000-$2ffff
62 #endif
63 #endif
64         KANJIROM *kanjiclass1;
65         KANJIROM *kanjiclass2;
66         MC6809 *maincpu;
67         
68         bool diag_load_basicrom;
69         bool diag_load_bootrom_bas;
70         bool diag_load_bootrom_dos;
71         bool diag_load_bootrom_mmr;
72
73         bool extram_connected;
74         uint8 extram_pages; // Per 64KB, MAX=3(77) or 12(77AV40)
75         int getbank(uint32 addr, uint32 *realaddr);
76         int window_convert(uint32 addr, uint32 *realaddr);
77         int mmr_convert(uint32 addr, uint32 *realaddr);
78         int nonmmr_convert(uint32 addr, uint32 *realaddr);
79         uint32 read_bios(const char *name, uint8 *ptr, uint32 size);
80
81         DEVICE *mainio;
82         DEVICE *display;
83  public:
84         FM7_MAINMEM(VM* parent_vm, EMU* parent_emu);
85         ~FM7_MAINMEM();
86         virtual uint32 read_data8(uint32 addr);
87         virtual void write_data8(uint32 addr, uint32 data);
88         virtual uint32 read_data16(uint32 addr);
89         virtual void write_data16(uint32 addr, uint32 data);
90         virtual uint32 read_data32(uint32 addr);
91         virtual void write_data32(uint32 addr, uint32 data);
92         void initialize(void);
93         void wait(void);
94
95         bool get_loadstat_basicrom(void);
96         bool get_loadstat_bootrom_bas(void);
97         bool get_loadstat_bootrom_dos(void);
98
99         void set_context_display(DEVICE *p){
100                 display = p;
101         }
102         void set_context_mainio(DEVICE *p){
103                 int i;
104                 mainio = p;
105                 i = FM7_MAINMEM_MMIO;
106                 read_table[i].dev = mainio;
107                 read_table[i].memory = NULL;
108                 write_table[i].dev = mainio;
109                 write_table[i].memory = NULL;
110                 
111         }
112         void write_signal(int sigid, uint32 data, uint32 mask);
113 };
114
115 #endif