OSDN Git Service

e2cdeeedbdc95b61f53607b887a45e441de741b8
[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         bool first_pass;
39  protected:
40         EMU *p_emu;
41         VM *p_vm;
42    
43         uint8 fm7_mainmem_omote[0x8000];
44         uint8 fm7_mainmem_ura[0x7c00];
45         uint8 fm7_mainmem_basicrom[0x7c00];
46         uint8 fm7_mainmem_bioswork[0x80];
47         uint8 *fm7_bootroms[4];
48         uint8 fm7_mainmem_bootrom_vector[0x1e]; // Without
49         uint8 fm7_mainmem_reset_vector[2]; // Without
50         uint8 fm7_mainmem_null[1];
51
52 #ifdef HAS_MMR
53 #ifdef _FM77AV_VARIANTS
54         uint8 fm7_mainmem_mmrbank_0[0x10000]; // $00000-$0ffff
55         uint8 fm7_mainmem_mmrbank_2[0x10000]; // $20000-$2ffff 
56 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20)
57         uint8 *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000)
58         uint8 fm7_mainmem_extrarom[0x20000]; // $20000-$2ffff, banked
59         uint8 fm7_mainmem_dictrom[0x20000]; // $20000-$2ffff, banked
60 # endif
61 #else
62         uint8 *fm7_mainmem_extram; // $00000-$2ffff
63 #endif
64 #endif
65         KANJIROM *kanjiclass1;
66         KANJIROM *kanjiclass2;
67         MC6809 *maincpu;
68         
69         bool diag_load_basicrom;
70         bool diag_load_bootrom_bas;
71         bool diag_load_bootrom_dos;
72         bool diag_load_bootrom_mmr;
73
74         bool extram_connected;
75         uint8 extram_pages; // Per 64KB, MAX=3(77) or 12(77AV40)
76         int getbank(uint32 addr, uint32 *realaddr);
77         int window_convert(uint32 addr, uint32 *realaddr);
78         int mmr_convert(uint32 addr, uint32 *realaddr);
79         int nonmmr_convert(uint32 addr, uint32 *realaddr);
80         uint32 read_bios(const char *name, uint8 *ptr, uint32 size);
81
82         DEVICE *mainio;
83         DEVICE *display;
84  public:
85         FM7_MAINMEM(VM* parent_vm, EMU* parent_emu);
86         ~FM7_MAINMEM();
87         virtual uint32 read_data8(uint32 addr);
88         virtual void write_data8(uint32 addr, uint32 data);
89         virtual uint32 read_data16(uint32 addr);
90         virtual void write_data16(uint32 addr, uint32 data);
91         virtual uint32 read_data32(uint32 addr);
92         virtual void write_data32(uint32 addr, uint32 data);
93         void initialize(void);
94         void wait(void);
95         void reset(void);
96
97         bool get_loadstat_basicrom(void);
98         bool get_loadstat_bootrom_bas(void);
99         bool get_loadstat_bootrom_dos(void);
100
101         void set_context_display(DEVICE *p){
102                 display = p;
103         }
104         void set_context_mainio(DEVICE *p){
105                 int i;
106                 mainio = p;
107                 i = FM7_MAINMEM_MMIO;
108                 read_table[i].dev = mainio;
109                 read_table[i].memory = NULL;
110                 write_table[i].dev = mainio;
111                 write_table[i].memory = NULL;
112                 
113         }
114         void write_signal(int sigid, uint32 data, uint32 mask);
115 };
116
117 #endif