OSDN Git Service

[VM][General] Merge Upstream 2021-05-06. Some variants of PC-6001 are temporally...
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / memory.h
1 /*
2         SHARP MZ-700 Emulator 'EmuZ-700'
3         SHARP MZ-800 Emulator 'EmuZ-800'
4         SHARP MZ-1500 Emulator 'EmuZ-1500'
5
6         Author : Takeda.Toshiya
7         Date   : 2008.06.05 -
8
9         [ memory ]
10 */
11
12 #ifndef _MZ700_MEMORY_H_
13 #define _MZ700_MEMORY_H_
14
15 #include "../vm.h"
16 #include "../../emu.h"
17 #include "../device.h"
18
19 #if defined(_MZ800)
20 class DISPLAY;
21 #endif
22
23 namespace MZ700 {
24         
25 class MEMORY : public DEVICE
26 {
27 private:
28         DEVICE *d_cpu, *d_pit, *d_pio;
29 #if defined(_MZ800)
30         DEVICE *d_pio_int;
31 #endif
32 #if defined(_MZ700) || defined(_MZ1500)
33         DEVICE *d_joystick;
34 #endif
35         
36         // memory
37         uint8_t* rbank[32];
38         uint8_t* wbank[32];
39         uint8_t wdmy[0x800];
40         uint8_t rdmy[0x800];
41         
42         uint8_t ipl[0x1000];    // IPL 4KB
43 #if defined(_MZ800)
44         uint8_t ext[0x2000];    // MZ-800 IPL 8KB
45 #elif defined(_MZ1500)
46         uint8_t ext[0x1800];    // MZ-1500 EXT 6KB
47 #endif
48         uint8_t font[0x1000];   // CGROM 4KB
49 #if defined(_MZ700)
50         uint8_t pcg[0x1000];    // PCG-700 2KB + Lower CGROM 2KB
51 #elif defined(_MZ1500)
52         uint8_t pcg[0x6000];    // MZ-1500 PCG 8KB * 3
53 #endif
54         uint8_t ram[0x10000];   // Main RAM 64KB
55 #if defined(_MZ800)
56         uint8_t vram[0x8000];   // MZ-800 VRAM 32KB
57 #else
58         uint8_t vram[0x1000];   // MZ-700/1500 VRAM 4KB
59 #endif
60         uint8_t mem_bank;
61 #if defined(_MZ700)
62         uint8_t pcg_data;
63         uint8_t pcg_addr;
64         uint8_t pcg_ctrl;
65 #elif defined(_MZ800)
66         uint8_t wf, rf;
67         uint8_t dmd;
68         uint32_t vram_addr_top;
69         bool is_mz800;
70 #elif defined(_MZ1500)
71         uint8_t pcg_bank;
72 #endif
73         
74         void update_map_low();
75         void update_map_middle();
76         void update_map_high();
77 #if defined(_MZ800)
78         int __FASTCALL vram_page_mask(uint8_t f);
79         int __FASTCALL vram_addr(int addr);
80 #endif
81         
82         // crtc
83 #if defined(_MZ800)
84         uint16_t sof;
85         uint8_t sw, ssa, sea;
86         uint8_t palette_sw, palette[4], palette16[16];
87 #elif defined(_MZ1500)
88         uint8_t priority, palette[8];
89 #endif
90         bool blink, tempo;
91         bool hblank, hsync;
92         bool vblank, vsync;
93 #if defined(_MZ700) || defined(_MZ1500)
94         bool hblank_vram;
95 #endif
96 #if defined(_MZ1500)
97         bool hblank_pcg;
98 #endif
99         void __FASTCALL set_vblank(bool val);
100         void __FASTCALL set_hblank(bool val);
101         
102         // renderer
103 #if defined(_MZ800)
104         uint8_t screen[200][640];
105         scrntype_t palette_mz800_pc[16];
106 #else
107         uint8_t screen[200][320];
108 #endif
109         scrntype_t palette_pc[8];
110         
111 #if defined(_MZ800)
112         void __FASTCALL draw_line_320x200_2bpp(int v);
113         void __FASTCALL draw_line_320x200_4bpp(int v);
114         void __FASTCALL draw_line_640x200_1bpp(int v);
115         void __FASTCALL draw_line_640x200_2bpp(int v);
116         void __FASTCALL draw_line_mz700(int v);
117 #endif
118         void __FASTCALL draw_line(int v);
119         
120 public:
121         MEMORY(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
122         {
123                 set_device_name(_T("Memory Bus"));
124         }
125         ~MEMORY() {}
126         
127         // common functions
128         void initialize();
129         void reset();
130 #if defined(_MZ800)
131         void update_config();
132 #endif
133         void event_vline(int v, int clock);
134         void __FASTCALL event_callback(int event_id, int err);
135         void __FASTCALL write_data8(uint32_t addr, uint32_t data);
136         uint32_t __FASTCALL read_data8(uint32_t addr);
137         void __FASTCALL write_data8w(uint32_t addr, uint32_t data, int* wait);
138         uint32_t __FASTCALL read_data8w(uint32_t addr, int* wait);
139         void __FASTCALL write_io8(uint32_t addr, uint32_t data);
140 #if defined(_MZ800)
141         uint32_t __FASTCALL read_io8(uint32_t addr);
142 #endif
143         bool process_state(FILEIO* state_fio, bool loading);
144         
145         // unique functions
146         void set_context_cpu(DEVICE* device)
147         {
148                 d_cpu = device;
149         }
150         void set_context_pit(DEVICE* device)
151         {
152                 d_pit = device;
153         }
154         void set_context_pio(DEVICE* device)
155         {
156                 d_pio = device;
157         }
158 #if defined(_MZ800)
159         void set_context_pio_int(DEVICE* device)
160         {
161                 d_pio_int = device;
162         }
163 #endif
164 #if defined(_MZ700) || defined(_MZ1500)
165         void set_context_joystick(DEVICE* device)
166         {
167                 d_joystick = device;
168         }
169 #endif
170         void draw_screen();
171 };
172
173 }
174 #endif
175