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 / i8155.h
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2009.01.05-\r
6 \r
7         [ i8155 ]\r
8 */\r
9 \r
10 #ifndef _I8155_H_\r
11 #define _I8155_H_\r
12 \r
13 #include "vm.h"\r
14 #include "../emu.h"\r
15 #include "device.h"\r
16 \r
17 #define SIG_I8155_PORT_A        0\r
18 #define SIG_I8155_PORT_B        1\r
19 #define SIG_I8155_PORT_C        2\r
20 #define SIG_I8155_CLOCK         3\r
21 \r
22 class I8155 : public DEVICE\r
23 {\r
24 private:\r
25         uint16 count, countreg;\r
26         bool now_count, stop_tc, half;\r
27         bool prev_out, prev_in;\r
28         \r
29         // constant clock\r
30         uint64 freq;\r
31         int register_id;\r
32         uint32 input_clk, prev_clk;\r
33         int period;\r
34         uint64 cpu_clocks;\r
35         \r
36         typedef struct {\r
37                 uint8 wreg;\r
38                 uint8 rreg;\r
39                 uint8 rmask;\r
40                 uint8 mode;\r
41                 bool first;\r
42                 // output signals\r
43                 outputs_t outputs;\r
44         } port_t;\r
45         port_t pio[3];\r
46         outputs_t outputs_timer;\r
47         uint8 cmdreg, statreg;\r
48         \r
49         uint8 ram[256];\r
50         \r
51         void input_clock(int clock);\r
52         void start_count();\r
53         void stop_count();\r
54         void update_count();\r
55         int get_next_clock();\r
56         void set_signal(bool signal);\r
57         void set_pio(int ch, uint8 data);\r
58         \r
59 public:\r
60         I8155(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)\r
61         {\r
62                 for(int i = 0; i < 3; i++) {\r
63                         init_output_signals(&pio[i].outputs);\r
64                         pio[i].wreg = pio[i].rreg = 0;//0xff;\r
65                 }\r
66                 init_output_signals(&outputs_timer);\r
67                 freq = 0;\r
68         }\r
69         ~I8155() {}\r
70         \r
71         // common functions\r
72         void initialize();\r
73         void reset();\r
74         void write_data8(uint32 addr, uint32 data);\r
75         uint32 read_data8(uint32 addr);\r
76         void write_io8(uint32 addr, uint32 data);\r
77         uint32 read_io8(uint32 addr);\r
78         void write_signal(int id, uint32 data, uint32 mask);\r
79         void event_callback(int event_id, int err);\r
80         void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame)\r
81         {\r
82                 cpu_clocks = new_clocks;\r
83         }\r
84         \r
85         // unique functions\r
86         void set_context_port_a(DEVICE* device, int id, uint32 mask, int shift)\r
87         {\r
88                 register_output_signal(&pio[0].outputs, device, id, mask, shift);\r
89         }\r
90         void set_context_port_b(DEVICE* device, int id, uint32 mask, int shift)\r
91         {\r
92                 register_output_signal(&pio[1].outputs, device, id, mask, shift);\r
93         }\r
94         void set_context_port_c(DEVICE* device, int id, uint32 mask, int shift)\r
95         {\r
96                 register_output_signal(&pio[2].outputs, device, id, mask, shift);\r
97         }\r
98         void set_context_timer(DEVICE* device, int id, uint32 mask)\r
99         {\r
100                 register_output_signal(&outputs_timer, device, id, mask);\r
101         }\r
102         void set_constant_clock(uint32 hz)\r
103         {\r
104                 freq = hz;\r
105         }\r
106 };\r
107 \r
108 #endif\r
109 \r