OSDN Git Service

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