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 / mc6840.h
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2013.11.08-\r
6 \r
7         [ mc6840 ]\r
8 */\r
9 \r
10 #ifndef _MC6840_H_\r
11 #define _MC6840_H_\r
12 \r
13 #include "vm.h"\r
14 #include "../emu.h"\r
15 #include "device.h"\r
16 \r
17 #define SIG_MC6840_CLOCK_0      0\r
18 #define SIG_MC6840_CLOCK_1      1\r
19 #define SIG_MC6840_CLOCK_2      2\r
20 \r
21 class MC6840 : public DEVICE\r
22 {\r
23 private:\r
24         typedef struct {\r
25                 uint16 counter, latch;\r
26                 uint8 counter_lo, latch_hi;\r
27                 uint8 control;\r
28                 bool in_pin, out_pin;\r
29                 bool signal, once;\r
30                 int clocks, prescaler;\r
31                 // constant clock\r
32                 int freq;\r
33                 // output signals\r
34                 outputs_t outputs;\r
35         } timer_t;\r
36         timer_t timer[3];\r
37         uint8 status, status_read;\r
38         outputs_t outputs_irq;\r
39         \r
40         void set_control(int ch, uint32 data);\r
41         void set_counter(int ch);\r
42         void input_clocks(int ch, int clocks);\r
43         void set_irq(int ch, bool signal);\r
44         void set_signal(int ch, bool signal);\r
45         \r
46 public:\r
47         MC6840(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)\r
48         {\r
49                 for(int i = 0; i < 3; i++) {\r
50                         init_output_signals(&timer[i].outputs);\r
51                         counter[i].freq = 0;\r
52                 }\r
53         }\r
54         ~MC6840() {}\r
55         \r
56         // common functions\r
57         void initialize();\r
58         void reset();\r
59         void write_io8(uint32 addr, uint32 data);\r
60         uint32 read_io8(uint32 addr);\r
61         void event_callback(int event_id, int err);\r
62         void write_signal(int id, uint32 data, uint32 mask);\r
63         \r
64         // unique functions\r
65         void set_context_irq(DEVICE* device, int id, uint32 mask)\r
66         {\r
67                 register_output_signal(&outputs_irq, device, id, mask);\r
68         }\r
69         void set_context_ch0(DEVICE* device, int id, uint32 mask)\r
70         {\r
71                 register_output_signal(&timer[0].outputs, device, id, mask);\r
72         }\r
73         void set_context_ch1(DEVICE* device, int id, uint32 mask)\r
74         {\r
75                 register_output_signal(&timer[1].outputs, device, id, mask);\r
76         }\r
77         void set_context_ch2(DEVICE* device, int id, uint32 mask)\r
78         {\r
79                 register_output_signal(&timer[2].outputs, device, id, mask);\r
80         }\r
81         void set_constant_clock(int ch, uint32 hz)\r
82         {\r
83                 timer[ch].freq = hz;\r
84         }\r
85 };\r
86 \r
87 #endif\r
88 \r