OSDN Git Service

aff8bed82018b0accddfc7535dd7416fd905a0b2
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_display.h
1 /*
2  * Common source code project -> FM-7 -> Display
3  * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
4  * History:
5  *  Feb 10, 2015 : Initial.
6  */
7
8 #ifndef _CSP_FM7_DISPLAY_H
9 #define _CSP_FM7_DISPLAY_H
10
11 #include "../device.h"
12 #include "../memory.h"
13 #include "../mc6809.h"
14 #include "fm7_common.h"
15
16
17 class DEVICE;
18 class MEMORY;
19 class MC6809;
20
21 class DISPLAY: public MEMORY
22 {
23  protected:
24         EMU *p_emu;
25         VM *p_vm;
26
27         int nmi_count;
28         int irq_count;
29         int firq_count;
30         int halt_count;
31         int clr_count;
32    
33         void go_subcpu();
34         void halt_subcpu();
35    
36         void do_nmi(bool);
37         void do_irq(bool);
38         void do_firq(bool);
39         void set_multimode(uint8 val);
40         uint8 get_multimode(void);
41         uint8 get_cpuaccessmask(void);
42         void set_dpalette(uint32 addr, uint8 val);
43         uint8 get_dpalette(uint32 addr);
44         void enter_display(void);
45         void leave_display(void);
46         void halt_subsystem(void);
47         void restart_subsystem(void);
48         void set_crtflag(void);
49         void reset_crtflag(void);
50         uint8 acknowledge_irq(void);
51         uint8 beep(void);
52         uint8 attention_irq(void);
53         void set_cyclesteal(uint8 val);
54         uint8 set_vramaccess(void);
55         void reset_vramaccess(void);
56         uint8 reset_subbusy(void);
57         void set_subbusy(void);
58 #if defined(_FM77AV_VARIANTS)
59         void alu_write_cmdreg(uint8 val);
60         void alu_write_logical_color(uint8 val);
61         void alu_write_mask_reg(uint8 val);
62         void alu_write_cmpdata_reg(int addr, uint8 val);
63         void alu_write_disable_reg(uint8 val);
64         void alu_write_tilepaint_data(int addr, uint8 val);
65         void alu_write_offsetreg_hi(uint8 val);
66         void alu_write_offsetreg_lo(uint8 val);
67         void alu_write_linepattern_hi(uint8 val);
68         void alu_write_linepattern_lo(uint8 val);
69         void alu_write_line_position(int addr, uint8 val);
70         void select_sub_bank(uint8 val);
71         void select_vram_bank_av40(uint8 val);
72         uint8 get_miscreg(void);
73         void set_miscreg(uint8 val);
74         void set_monitor_bank(uint8 var);
75         void set_apalette_index_hi(uint8 val);
76         void set_apalette_index_lo(uint8 val);
77         void calc_apalette(uint32 index);
78         void set_apalette_b(uint8 val);
79         void set_apalette_r(uint8 val);
80         void set_apalette_g(uint8 val);
81         uint8 get_key_encoder(void);
82         void put_key_encoder(uint8 data);
83         uint8 get_key_encoder_status(void);
84
85 #endif // _FM77AV_VARIANTS
86
87  private:
88         bool sub_busy;
89         uint32  disp_mode;
90         bool vblank;
91         bool vsync;
92         bool hblank;
93         bool irq_backup;
94         bool firq_backup;
95         bool clock_fast;
96         uint32 displine;
97
98         bool subcpu_resetreq;
99         bool power_on_reset;
100         bool cancel_request;
101
102         DEVICE *ins_led;
103         DEVICE *kana_led;
104         DEVICE *caps_led;
105
106         // Event handler
107         int nmi_event_id;
108         int hblank_event_id;
109         int hdisp_event_id;
110         int vsync_event_id;
111         int vstart_event_id;
112         int halt_event_id;
113         int display_mode;
114         bool halt_flag;
115         uint32 prev_clock;
116
117 #if defined(_FM77_VARIANTS)
118         bool mode400line;
119         bool kanjisub;
120 #elif defined(_FM77AV_VARIANTS)
121         bool kanjisub;
122 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
123         bool mode400line;
124         bool mode256k;
125 #endif
126         bool mode320;
127         int display_page;
128         int active_page;
129         int cgrom_bank;
130         int vram_bank;
131         bool nmi_enable;
132         bool diag_load_subrom_a;
133         bool diag_load_subrom_b;
134         bool diag_load_subrom_cg;
135 #endif
136         bool diag_load_subrom_c;
137
138         scrntype dpalette_pixel[8];
139         uint8 dpalette_data[8];
140 #if defined(_FM77AV_VARIANTS)
141         pair apalette_index;
142         uint8 analog_palette_r[4096];
143         uint8 analog_palette_g[4096];
144         uint8 analog_palette_b[4096];
145         scrntype apalette_pixel[4096];
146 #endif // FM77AV etc...
147         int window_low;
148         int window_high;
149         int window_xbegin;
150         int window_xend;
151         bool window_opened;
152
153         uint8 multimode_accessmask;
154         uint8 multimode_dispmask;
155    
156         uint32 offset_point;
157         uint32 tmp_offset_point;
158         bool offset_changed;
159         bool offset_77av;
160    
161 #if defined(_FM77AV_VARIANTS)
162         uint8 subrom_bank;
163         uint8 subrom_bank_using;
164         uint32 offset_point_bank1;
165 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
166         bool monitor_ram;
167         bool monitor_ram_using;
168 #endif
169 #endif  
170
171 #if defined(_FM77AV_VARIANTS)
172         uint8 gvram[0x2000 * 12];
173 #elif defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)
174         uint8 gvram[0x4000 * 6];
175 #else
176         uint8 gvram[0x4000 * 3];
177 #endif
178
179         uint8 console_ram[0x1000];
180         uint8 work_ram[0x380];
181         uint8 shared_ram[0x80];
182    
183         uint8 subsys_c[0x2800];
184 #if defined(_FM77AV_VARIANTS)
185         uint8 subsys_a[0x2000];
186         uint8 subsys_b[0x2000];
187         uint8 subsys_cg[0x2000];
188         uint8 subsys_ram[0x2000];
189 #endif
190
191         bool sub_run;
192         bool crt_flag;
193         bool vram_accessflag;
194         bool vram_wait;
195         bool is_cyclesteal;
196         pair kanji1_addr;
197         MEMORY *kanjiclass1;
198 #if defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)   
199         bool kanji_level2;
200         pair kanji2_addr;
201         MEMORY *kanjiclass2;
202 #endif
203 #if defined(_FM77AV_VARIANTS)
204         bool use_alu;
205         DEVICE *alu;
206 #endif  
207         DEVICE *mainio;
208         DEVICE *subcpu;
209         DEVICE *keyboard;
210         bool vram_wrote;
211         inline int GETVRAM_8_200L(int yoff, scrntype *p, uint32 rgbmask);
212         inline int GETVRAM_4096(int yoff, scrntype *p, uint32 rgbmask);
213  public:
214         DISPLAY(VM *parent_vm, EMU *parent_emu);
215         ~DISPLAY();
216         void event_callback(int event_id, int err);
217         void write_signal(int id, uint32 data, uint32 mask);
218         uint32 read_signal(int id); 
219         uint32 read_data8(uint32 addr);
220         void write_data8(uint32 addr, uint32 data);
221         void initialize(void);
222         void release(void);
223         void reset(void);
224         void update_config(void);
225         
226         void draw_screen(void);
227         void event_frame(void);
228         void event_vline(int v, int clock);
229
230
231         void set_context_kanjiclass1(MEMORY *p) {
232 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS) // Really?
233                 kanji1_addr.d = 0;
234                 kanjiclass1 = p;
235 #endif
236         }
237         void set_context_kanjiclass2(MEMORY *p) {
238 #if defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)
239                 kanji2_addr.d = 0;
240                 kanjiclass2 = p;
241                 if(p != NULL) kanji_level2 = true;
242 #endif
243         }
244         void set_context_mainio(DEVICE *p) {
245                 mainio = p;
246         }
247         void set_context_keyboard(DEVICE *p) {
248                 keyboard = p;
249         }
250         void set_context_subcpu(DEVICE *p) {
251                 subcpu = p;
252         }
253 #if defined(_FM77AV_VARIANTS)
254         void set_context_alu(DEVICE *p) {
255                 alu = p;
256         }
257 #endif
258 };  
259 #endif //  _CSP_FM7_DISPLAY_H