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 / bubcom80 / display.h
1 /*
2         Systems Formulate BUBCOM80 Emulator 'eBUBCOM80'
3
4         Author : Takeda.Toshiya
5         Date   : 2018.05.08-
6
7         [ display ]
8 */
9
10 #ifndef _DISPLAY_H_
11 #define _DISPLAY_H_
12
13 #include "../vm.h"
14 #include "../../emu.h"
15 #include "../device.h"
16
17 #define SIG_DISPLAY_DMAC_CH0    0
18 #define SIG_DISPLAY_DMAC_CH1    1
19 #define SIG_DISPLAY_DMAC_CH2    2
20 #define SIG_DISPLAY_DMAC_CH3    3
21
22 class Z80;
23
24 namespace BUBCOM80 {
25 typedef struct {
26         struct {
27                 int rate, counter;
28                 uint8_t cursor, attrib;
29         } blink;
30         struct {
31                 int type, mode;
32                 int x, y;
33         } cursor;
34         struct {
35                 uint8_t data;
36                 int num;
37                 uint8_t expand[200][80];
38         } attrib;
39         struct {
40                 uint8_t expand[200][80];
41         } text;
42         int width, height;
43         int char_height;
44         bool skip_line;
45         int vretrace;
46         bool timing_changed;
47         uint8_t buffer[120 * 200];
48         int buffer_ptr;
49         uint8_t cmd;
50         int cmd_ptr;
51         uint8_t mode, reverse, intr_mask, status;
52         bool vblank;
53         
54         void reset();
55         void write_cmd(uint8_t data);
56         void write_param(uint8_t data);
57         uint32_t read_param();
58         uint32_t read_status();
59         void start();
60         void finish();
61         void write_buffer(uint8_t data);
62         uint8_t read_buffer(int ofs);
63         void update_blink();
64         void expand_buffer();
65         void set_attrib(uint8_t code);
66 } crtc_t;
67
68 typedef struct {
69         struct {
70                 pair_t addr, count;
71                 uint8_t mode;
72                 int nbytes;
73                 DEVICE *io;
74                 bool running;
75         } ch[4];
76         uint8_t mode, status;
77         bool high_low;
78         DEVICE *mem;
79         
80         void write_io8(uint32_t addr, uint32_t data);
81         uint32_t read_io8(uint32_t addr);
82         void start(int c);
83         void finish(int c);
84         void run(int c);
85 } dmac_t;
86
87 class DISPLAY : public DEVICE
88 {
89 private:
90         Z80 *d_cpu;
91         DEVICE *d_cmt, *d_pcm, *d_prn;
92         
93         uint8_t sg_pattern[0x800];
94         uint8_t font[0x800];
95         uint8_t vram[0x10000];
96         
97         int busreq_clocks;
98         bool color;
99         bool width40;
100         uint8_t mode;
101         
102         crtc_t crtc;
103         dmac_t dmac;
104         
105         scrntype_t palette_text_pc[8];
106         scrntype_t palette_graph_pc[8];
107         uint8_t text[200][640];
108         uint8_t graph[200][640];
109         
110         void update_timing();
111         void draw_text();
112         void draw_graph();
113         
114 public:
115         DISPLAY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
116         {
117                 for(int i = 0; i < 4; i++) {
118                         dmac.ch[i].io = parent_vm->dummy;
119                 }
120                 dmac.mem = parent_vm->dummy;
121                 
122                 set_device_name(_T("Display"));
123         }
124         ~DISPLAY() {}
125         
126         // common functions
127         void initialize();
128         void reset();
129         void write_io8(uint32_t addr, uint32_t data);
130         uint32_t read_io8(uint32_t addr);
131         void write_dma_io8(uint32_t addr, uint32_t data);
132         void write_signal(int id, uint32_t data, uint32_t mask);
133         void event_callback(int event_id, int err);
134         void event_frame();
135         void event_vline(int v, int clock);
136         bool process_state(FILEIO* state_fio, bool loading);
137         
138         // unique functions
139         void set_context_cpu(Z80* device)
140         {
141                 d_cpu = device;
142         }
143         void set_context_cmt(DEVICE* device)
144         {
145                 d_cmt = device;
146         }
147         void set_context_pcm(DEVICE* device)
148         {
149                 d_pcm = device;
150         }
151         void set_context_prn(DEVICE* device)
152         {
153                 d_prn = device;
154         }
155         void set_context_dmac_mem(DEVICE* device)
156         {
157                 dmac.mem = device;
158         }
159         void set_context_dmac_ch0(DEVICE* device)
160         {
161                 dmac.ch[0].io = device;
162         }
163         void set_context_dmac_ch2(DEVICE* device)
164         {
165                 dmac.ch[2].io = device;
166         }
167         void draw_screen();
168 };
169 }
170
171 #endif