OSDN Git Service

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