OSDN Git Service

[VM] TRY:Use namespace {VMNAME} to separate around VMs. This feature still apply...
[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 "../../common.h"
12 #include "../device.h"
13 #include "../mc6809.h"
14 #include "fm7_common.h"
15
16
17 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
18 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 24)
19 #elif defined(_FM77AV40)
20 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 18)
21 #elif defined(_FM77AV_VARIANTS)
22 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 12)
23 #else
24 #define __FM7_GVRAM_PAG_SIZE (0x4000 * 3)
25 #endif
26
27 class DEVICE;
28 class MC6809;
29 class MB61VH010;
30 #if defined(_FM77L4)
31 class HD46505;
32 #endif
33
34 namespace FM7 {
35         class FM7_MAINIO;
36         class KEYBOARD;
37         class KANJIROM;
38 }
39
40 namespace FM7 {
41
42 class DISPLAY: public DEVICE
43 {
44 private:
45
46         uint16_t bit_trans_table_0[256][8];
47         uint16_t bit_trans_table_1[256][8];
48         uint16_t bit_trans_table_2[256][8];
49         uint16_t bit_trans_table_3[256][8];
50 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
51         uint16_t bit_trans_table_4[256][8];
52         uint16_t bit_trans_table_5[256][8];
53 #endif
54 protected:
55         uint32_t (DISPLAY::*read_cpu_func_table[512])(uint32_t);
56         uint32_t (DISPLAY::*read_dma_func_table[512])(uint32_t);
57         void (DISPLAY::*write_cpu_func_table[512])(uint32_t, uint8_t);
58         void (DISPLAY::*write_dma_func_table[512])(uint32_t, uint8_t);
59         
60         bool delay_busy;
61         bool screen_update_flag;
62         bool crt_flag_bak;
63         
64         void go_subcpu();
65         void halt_subcpu();
66         void setup_display_mode(void);
67    
68         void do_nmi(bool);
69         void do_irq(bool);
70         void do_firq(bool);
71         void set_multimode(uint8_t val);
72         uint8_t get_multimode(void);
73         uint8_t get_cpuaccessmask(void);
74         void set_dpalette(uint32_t addr, uint8_t val);
75         uint8_t get_dpalette(uint32_t addr);
76         void enter_display(void);
77         void leave_display(void);
78         void halt_subsystem(void);
79         void restart_subsystem(void);
80         void set_crtflag(void);
81         void reset_crtflag(void);
82         uint8_t acknowledge_irq(void);
83         uint8_t beep(void);
84         uint8_t attention_irq(void);
85         void set_cyclesteal(uint8_t val);
86         uint8_t set_vramaccess(void);
87         void reset_vramaccess(void);
88         uint8_t reset_subbusy(void);
89         void set_subbusy(void);
90         void reset_some_devices(void);
91         void reset_subcpu(bool _check_firq);
92         void setup_400linemode(uint8_t val);
93    
94 #if defined(_FM77AV_VARIANTS)
95         void alu_write_cmdreg(uint32_t val);
96         void alu_write_logical_color(uint8_t val);
97         void alu_write_mask_reg(uint8_t val);
98         void alu_write_cmpdata_reg(int addr, uint8_t val);
99         void alu_write_disable_reg(uint8_t val);
100         void alu_write_tilepaint_data(uint32_t addr, uint8_t val);
101         void alu_write_offsetreg_hi(uint8_t val);
102         void alu_write_offsetreg_lo(uint8_t val);
103         void alu_write_linepattern_hi(uint8_t val);
104         void alu_write_linepattern_lo(uint8_t val);
105         void alu_write_line_position(int addr, uint8_t val);
106         
107         uint8_t get_miscreg(void);
108         void set_miscreg(uint8_t val);
109         void set_monitor_bank(uint8_t var);
110         void set_apalette_index_hi(uint8_t val);
111         void set_apalette_index_lo(uint8_t val);
112         void set_apalette_b(uint8_t val);
113         void set_apalette_r(uint8_t val);
114         void set_apalette_g(uint8_t val);
115         void calc_apalette(uint16_t idx);
116
117 #endif // _FM77AV_VARIANTS
118         
119         void copy_vram_all();
120         void copy_vram_per_line(int begin, int end);
121         void copy_vram_blank_area(void);
122
123  private:
124         bool sub_busy;
125         bool firq_mask;
126         bool vblank;
127         bool vsync;
128         bool hblank;
129         bool cancel_request;
130         bool key_firq_req;
131         bool clock_fast;
132         int display_mode;
133         bool halt_flag;
134         int active_page; // GVRAM is Double-Buffer.
135         uint32_t page_offset;
136         uint32_t page_mask;
137         uint32_t pagemod_mask;
138         
139         uint32_t prev_clock;
140         uint8_t frame_skip_count_draw;
141         uint8_t frame_skip_count_transfer;
142         bool need_transfer_line;
143         bool palette_changed;
144         
145         // Event handler
146         int nmi_event_id;
147
148 //#if defined(_FM77AV_VARIANTS) || defined(_FM77L4)
149         int hblank_event_id;
150         int hdisp_event_id;
151         int vsync_event_id;
152         int vstart_event_id;
153
154         int vblank_count;
155 //#endif
156 #if defined(_FM77AV_VARIANTS)
157         bool subcpu_resetreq;
158         bool power_on_reset;
159 #endif  
160         uint32_t displine;
161         
162         DEVICE *ins_led;
163         DEVICE *kana_led;
164         DEVICE *caps_led;
165         
166         int8_t display_page;
167         int8_t display_page_bak;
168 #if defined(_FM77_VARIANTS)
169 # if defined(_FM77L4)
170         bool mode400line;
171         bool stat_400linecard;
172 # endif 
173         bool kanjisub;
174         pair_t kanjiaddr;
175 #elif defined(_FM77AV_VARIANTS)
176         bool kanjisub;
177         pair_t kanjiaddr;
178 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
179      defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
180         bool mode400line;
181         bool mode256k;
182 # endif
183         bool mode320;
184         int cgrom_bank;
185 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
186     defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
187         int vram_bank;
188         bool vram_page;
189         uint8_t console_ram_bank;
190         uint8_t vram_active_block;
191         uint8_t vram_display_block;
192         
193 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
194         uint16_t window_low;
195         uint16_t window_high;
196         uint16_t window_xbegin;
197         uint16_t window_xend;
198
199         bool window_opened;
200 # endif 
201 #endif  
202         bool nmi_enable;
203         bool diag_load_subrom_a;
204         bool diag_load_subrom_b;
205         bool diag_load_subrom_cg;
206 #endif
207         bool diag_load_subrom_c;
208
209         scrntype_t dpalette_pixel[8];
210         scrntype_t dpalette_pixel_tmp[8];
211 #if defined(USE_GREEN_DISPLAY)
212         scrntype_t dpalette_pixel_green[8];
213         scrntype_t dpalette_green_tmp[8];
214         bool use_green_monitor;
215 #endif
216         
217         uint8_t dpalette_data[8];
218 #if defined(_FM77AV_VARIANTS)
219         pair_t apalette_index;
220         uint8_t analog_palette_r[4096];
221         uint8_t analog_palette_g[4096];
222         uint8_t analog_palette_b[4096];
223         scrntype_t analog_palette_pixel[4096];
224         scrntype_t analog_palette_pixel_tmp[4096];
225 #endif // FM77AV etc...
226 #if defined(_FM77AV_VARIANTS)
227         uint8_t io_w_latch[0x40];
228 #elif !defined(_FM77AV40EX) && !defined(_FM77AV40SX)
229         uint8_t io_w_latch[0x10];
230 #else
231         uint8_t io_w_latch[0x100];
232 #endif
233         uint8_t multimode_accessmask;
234         uint8_t multimode_dispmask;
235         bool multimode_accessflags[4];
236         bool multimode_dispflags[4];
237    
238         uint32_t offset_point;
239         pair_t tmp_offset_point[2];
240         bool offset_changed[2];
241         bool offset_77av;
242    
243 #if defined(_FM77AV_VARIANTS)
244         uint8_t subrom_bank;
245         uint8_t subrom_bank_using;
246         uint32_t offset_point_bank1;
247 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
248         bool monitor_ram;
249         bool ram_protect;
250 # endif
251 #endif  
252
253         // VRAM Write Page.
254         //uint8_t  write_access_page;
255         
256         // ROM/RAM on Sub-System.
257         uint8_t gvram[__FM7_GVRAM_PAG_SIZE];
258         uint8_t gvram_shadow[__FM7_GVRAM_PAG_SIZE];
259         
260         uint8_t console_ram[0x1000];
261         uint8_t work_ram[0x380];
262         uint8_t shared_ram[0x80];
263    
264         uint8_t subsys_c[0x2800];
265 #if defined(_FM77AV_VARIANTS)
266         uint8_t subsys_a[0x2000];
267         uint8_t subsys_b[0x2000];
268         uint8_t subsys_cg[0x2000];
269         uint8_t submem_hidden[0x300];
270 #endif
271
272         bool crt_flag;
273         bool vram_accessflag;
274         bool is_cyclesteal;
275 #if defined(_FM77L4)
276         uint8_t subsys_cg_l4[0x1000];
277         uint8_t subsys_l4[0x4800];
278         uint8_t text_vram[0x1000];
279         uint8_t crtc_regs[18];
280         uint8_t text_scroll_count;
281         bool workram_l4;
282         bool cursor_lsb;
283         
284         bool text_blink;
285         bool cursor_blink;
286         bool text_width40;
287         
288         pair_t text_start_addr;
289         uint32_t text_lines;
290         uint32_t text_xmax;
291         uint32_t text_ymax;
292         
293         pair_t cursor_addr;
294         int cursor_start;
295         int cursor_end;
296         uint8_t cursor_type;
297         
298         int event_id_l4_text_blink;
299         int event_id_l4_cursor_blink;
300 #endif
301         
302 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
303         uint8_t submem_cgram[0x4000];
304         uint8_t submem_console_av40[0x2000];
305         uint8_t subsys_ram[0x2000];
306         uint8_t cgram_bank;
307         bool kanji_level2;
308         FM7::KANJIROM *kanjiclass1;
309         FM7::KANJIROM *kanjiclass2;
310 #elif defined(_FM77_VARIANTS)
311         FM7::KANJIROM *kanjiclass1;
312 #endif
313         bool force_update;
314         bool vram_wrote_shadow;
315         bool vram_wrote_table[411 * 5];
316         bool vram_draw_table[411];
317         //uint8_t vram_wrote_pages[411];
318         uint32_t vram_wrote_addr_1[411];
319         uint32_t vram_wrote_addr_2[411];
320 #if defined(_FM77AV_VARIANTS)
321         bool use_alu;
322         MB61VH010 *alu;
323 #endif  
324         FM7::FM7_MAINIO *mainio;
325         FM7::KEYBOARD *keyboard;
326         bool vram_wrote;
327 #if defined(_FM77L4)
328         HD46505 *l4crtc;
329 #endif
330         MC6809 *subcpu;
331         
332 #if defined(USE_GREEN_DISPLAY)
333         void GETVRAM_8_200L_GREEN(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
334 #endif
335 #if defined(_FM77L4)
336         scrntype_t GETVRAM_TEXTCOLOR(uint8_t attr, bool do_green);
337         uint8_t GETVRAM_TEXTPIX(uint8_t bitdata, bool reverse, bool cursor_rev);
338         void GETVRAM_1_400L(int yoff, scrntype_t *p);
339         void GETVRAM_1_400L_GREEN(int yoff, scrntype_t *p);
340         void cursor_blink_77l4();
341         void text_blink_77l4();
342 #endif
343         
344         void GETVRAM_8_200L(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
345 #if defined(_FM77AV_VARIANTS)   
346         void GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px, uint32_t rgbmask, bool window_inv = false, bool scan_line = false);
347 #endif
348 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
349         void GETVRAM_8_400L(int yoff, scrntype_t *p, bool window_inv = false);
350         void GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line = false);
351 #endif   
352         uint32_t read_mmio(uint32_t addr);
353         
354         void init_read_table(void);
355         void init_write_table(void);
356         
357         uint32_t read_vram_data8(uint32_t addr);
358         uint32_t read_cpu_vram_data8(uint32_t addr);
359         uint32_t read_dma_vram_data8(uint32_t addr);
360         uint32_t read_console_ram(uint32_t addr);
361         uint32_t read_work_ram(uint32_t addr);
362         uint32_t read_shared_ram(uint32_t addr);
363 #if defined(_FM77AV_VARIANTS)
364         uint32_t read_hidden_ram(uint32_t addr);
365 #endif
366         uint32_t read_cgrom(uint32_t addr);
367         uint32_t read_subsys_monitor(uint32_t addr);
368         
369         void write_vram_data8(uint32_t addr, uint8_t data);
370         void write_cpu_vram_data8(uint32_t addr, uint8_t data);
371         void write_dma_vram_data8(uint32_t addr, uint8_t data);
372         void write_console_ram(uint32_t addr, uint8_t data);
373         void write_work_ram(uint32_t addr, uint8_t data);
374         void write_shared_ram(uint32_t addr, uint8_t data);
375 #if defined(_FM77AV_VARIANTS)
376         void write_hidden_ram(uint32_t addr, uint8_t data);
377 #endif
378 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
379         void write_subsys_cgram(uint32_t addr, uint8_t data);
380         void write_subsys_ram(uint32_t addr, uint8_t data);
381 #endif
382         void write_mmio(uint32_t addr, uint8_t data);
383         void write_dummy(uint32_t addr, uint8_t data);
384    
385         uint32_t read_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
386         void draw_screen2();
387
388         void event_callback_vstart(void);
389         void event_callback_vsync(void);
390         void event_callback_hdisp(void);
391         void event_callback_hblank(void);
392
393         template <class T>
394         void call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
395         {
396                 //T *nnp = static_cast<T *>(np);
397                 static_cast<T *>(np)->write_signal(id, data, mask);
398         }
399         template <class T>
400                 void call_write_data8(T *np, uint32_t addr, uint32_t data)
401         {
402                 //T *nnp = static_cast<T *>(np);
403                 static_cast<T *>(np)->write_data8(addr, data);
404         }
405         template <class T>
406                 uint32_t call_read_data8(T *np, uint32_t addr)
407         {
408                 //T *nnp = static_cast<T *>(np);
409                 return static_cast<T *>(np)->read_data8(addr);
410         }
411         template <class T>
412                 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
413         {
414                 //T *nnp = static_cast<T *>(np);
415                 static_cast<T *>(np)->write_dma_data8(addr, data);
416         }
417         template <class T>
418                 uint32_t call_read_dma_data8(T *np, uint32_t addr)
419         {
420                 //T *nnp = static_cast<T *>(np);
421                 return static_cast<T *>(np)->read_dma_data8(addr);
422         }
423
424 public:
425         DISPLAY(VM_TEMPLATE* parent_vm, EMU *parent_emu);
426         ~DISPLAY();
427         void event_callback(int event_id, int err);
428         void write_signal(int id, uint32_t data, uint32_t mask);
429         uint32_t read_signal(int id);
430         
431         uint32_t read_data8(uint32_t addr);
432         void write_data8(uint32_t addr, uint32_t data);
433         
434         uint32_t read_dma_data8(uint32_t addr);
435         void write_dma_data8(uint32_t addr, uint32_t data);
436         
437         void initialize();
438         void release();
439         void reset();
440         void update_config();
441         
442         void draw_screen();
443         void event_frame();
444         void event_vline(int v, int clock);
445         bool process_state(FILEIO *state_fio, bool loading);
446         
447         int get_screen_mode(void) {
448                 return display_mode;
449         }
450         uint32_t read_io8(uint32_t addr) { // This is only for debug.
451 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
452                 return io_w_latch[addr & 0xff];
453 #elif defined(_FM77AV_VARIANTS) // Really?
454                 return io_w_latch[addr & 0x3f];
455 #else
456                 return io_w_latch[addr & 0x0f];
457 #endif
458         }
459         bool screen_update(void);
460         void reset_screen_update(void);
461         void set_context_kanjiclass1(DEVICE *p) {
462 #if defined(_FM77_VARIANTS) || \
463     defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
464     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
465                 kanjiclass1 = (FM7::KANJIROM *)p;
466 #endif
467         }
468         void set_context_kanjiclass2(DEVICE *p) {
469 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
470     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
471                 kanjiclass2 = (FM7::KANJIROM *)p;
472                 if(p != NULL) kanji_level2 = true;
473 #endif
474         }
475         void set_context_mainio(DEVICE *p) {
476                 mainio = (FM7::FM7_MAINIO *)p;
477         }
478         void set_context_keyboard(DEVICE *p) {
479                 keyboard = (FM7::KEYBOARD *)p;
480         }
481         void set_context_subcpu(DEVICE *p) {
482                 subcpu = (MC6809 *)p;
483         }
484 #if defined(_FM77AV_VARIANTS)
485         void set_context_alu(DEVICE *p) {
486                 alu = (MB61VH010 *)p;
487         }
488 #endif
489 #if defined(_FM77L4)
490         void set_context_l4crtc(HD46505 *p) {
491                 l4crtc = p;
492         }
493 #endif
494 };  
495
496 }
497
498 #endif //  _CSP_FM7_DISPLAY_H