OSDN Git Service

[VM][General] Merge upstream 2015-10-07 .
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd7220.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : Neko Project 2
5         Author : Takeda.Toshiya
6         Date   : 2006.12.06 -
7
8         [ uPD7220 ]
9 */
10
11 #ifndef _UPD7220_H_
12 #define _UPD7220_H_
13
14 #include "vm.h"
15 #include "../emu.h"
16 #include "device.h"
17
18 #define MODE_MIX        ((sync[0] & 0x22) == 0x00)
19 #define MODE_GFX        ((sync[0] & 0x22) == 0x02)
20 #define MODE_CHR        ((sync[0] & 0x22) == 0x20)
21
22 #define RT_MULBIT       15
23 #define RT_TABLEBIT     12
24 #define RT_TABLEMAX     (1 << RT_TABLEBIT)
25
26 class FIFO;
27
28 class UPD7220 : public DEVICE
29 {
30 private:
31         // output signals
32         outputs_t outputs_drq;
33         outputs_t outputs_vsync;
34         
35         // vram
36         uint8* vram;
37         uint32 vram_size;
38         uint16 vram_data_mask;
39         
40         // regs
41         int cmdreg;
42         uint8 statreg;
43         
44         // params
45         uint8 sync[16];
46         int vtotal, vs, v1, v2;
47         int hc, h1, h2;
48         bool sync_changed;
49         bool master;
50         uint8 zoom, zr, zw;
51         uint8 ra[16];
52         uint8 cs[3];
53         uint8 pitch;
54         uint32 lad;
55         uint8 vect[11];
56         int ead, dad;
57         uint8 maskl, maskh;
58         uint8 mod;
59         bool hblank, vsync, start;
60         int blink_cursor;
61         int blink_attr;
62         int blink_rate;
63         bool low_high;
64         bool cmd_write_done;
65         
66         int cpu_clocks;
67 #ifdef UPD7220_HORIZ_FREQ
68         int horiz_freq, next_horiz_freq;
69 #endif
70         double frames_per_sec;
71         int lines_per_frame;
72         
73         // fifo buffers
74         uint8 params[16];
75         int params_count;
76         FIFO *fo;
77         
78         // draw
79         int rt[RT_TABLEMAX + 1];
80         int dx, dy;     // from ead, dad
81         int dir, dif, sl, dc, d, d2, d1, dm;
82         uint16 pattern;
83         
84         // command
85         void check_cmd();
86         void process_cmd();
87         
88         void cmd_reset();
89         void cmd_sync();
90         void cmd_master();
91         void cmd_slave();
92         void cmd_start();
93         void cmd_stop();
94         void cmd_zoom();
95         void cmd_scroll();
96         void cmd_csrform();
97         void cmd_pitch();
98         void cmd_lpen();
99         void cmd_vectw();
100         void cmd_vecte();
101         void cmd_texte();
102         void cmd_csrw();
103         void cmd_csrr();
104         void cmd_mask();
105         void cmd_write();
106         void cmd_read();
107         void cmd_dmaw();
108         void cmd_dmar();
109         void cmd_unk_5a();
110         
111         void cmd_write_sub(uint32 addr, uint8 data);
112         void write_vram(uint32 addr, uint8 data);
113         uint8 read_vram(uint32 addr);
114         void update_vect();
115         void reset_vect();
116         
117         void draw_vectl();
118         void draw_vectt();
119         void draw_vectc();
120         void draw_vectr();
121         void draw_text();
122         void draw_pset(int x, int y);
123         
124 public:
125         UPD7220(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
126         {
127                 init_output_signals(&outputs_drq);
128                 init_output_signals(&outputs_vsync);
129                 vram = NULL;
130                 vram_size = 0;
131                 vram_data_mask = 0xffff;
132         }
133         ~UPD7220() {}
134         
135         // common functions
136         void initialize();
137         void release();
138         void reset();
139         void write_dma_io8(uint32 addr, uint32 data);
140         uint32 read_dma_io8(uint32 addr);
141         void write_io8(uint32 addr, uint32 data);
142         uint32 read_io8(uint32 addr);
143         void event_pre_frame();
144         void event_frame();
145         void event_vline(int v, int clock);
146         void event_callback(int event_id, int err);
147         void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame);
148         void save_state(FILEIO* state_fio);
149         bool load_state(FILEIO* state_fio);
150         
151         // unique functions
152         void set_context_drq(DEVICE* device, int id, uint32 mask)
153         {
154                 register_output_signal(&outputs_drq, device, id, mask);
155         }
156         void set_context_vsync(DEVICE* device, int id, uint32 mask)
157         {
158                 register_output_signal(&outputs_vsync, device, id, mask);
159         }
160         void set_vram_ptr(uint8* ptr, uint32 size)
161         {
162                 vram = ptr;
163                 vram_size = size;
164         }
165         void set_vram_ptr(uint8* ptr, uint32 size, uint16 mask)
166         {
167                 vram = ptr;
168                 vram_size = size;
169                 vram_data_mask = mask;
170         }
171 #ifdef UPD7220_HORIZ_FREQ
172         void set_horiz_freq(int freq)
173         {
174                 next_horiz_freq = freq;
175         }
176 #endif
177         uint8* get_sync()
178         {
179                 return sync;
180         }
181         uint8* get_zoom()
182         {
183                 return &zoom;
184         }
185         uint8* get_ra()
186         {
187                 return ra;
188         }
189         uint8* get_cs()
190         {
191                 return cs;
192         }
193         int* get_ead()
194         {
195                 return &ead;
196         }
197         bool get_start()
198         {
199                 return start;
200         }
201         uint32 cursor_addr(uint32 mask);
202         int cursor_top();
203         int cursor_bottom();
204         bool attr_blink()
205         {
206                 return (blink_attr < (blink_rate * 3 / 4));
207         }
208 };
209
210 #endif
211