OSDN Git Service

[VM][General][WIP] Syncing to UPSTREAM 2015-01-21 , work-in-progress.
[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         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[3];\r
36         uint8 status, status_read;\r
37         outputs_t outputs_irq;\r
38         \r
39         void set_control(int ch, uint32 data);\r
40         void set_counter(int ch);\r
41         void input_clocks(int ch, int clocks);\r
42         void set_irq(int ch, bool signal);\r
43         void set_signal(int ch, bool signal);\r
44         \r
45 public:\r
46         MC6840(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)\r
47         {\r
48                 for(int i = 0; i < 3; i++) {\r
49                         init_output_signals(&timer[i].outputs);\r
50                         counter[i].freq = 0;\r
51                 }\r
52         }\r
53         ~MC6840() {}\r
54         \r
55         // common functions\r
56         void initialize();\r
57         void reset();\r
58         void write_io8(uint32 addr, uint32 data);\r
59         uint32 read_io8(uint32 addr);\r
60         void event_callback(int event_id, int err);\r
61         void write_signal(int id, uint32 data, uint32 mask);\r
62         void save_state(FILEIO* state_fio);\r
63         bool load_state(FILEIO* state_fio);\r
64         \r
65         // unique functions\r
66         void set_context_irq(DEVICE* device, int id, uint32 mask)\r
67         {\r
68                 register_output_signal(&outputs_irq, device, id, mask);\r
69         }\r
70         void set_context_ch0(DEVICE* device, int id, uint32 mask)\r
71         {\r
72                 register_output_signal(&timer[0].outputs, device, id, mask);\r
73         }\r
74         void set_context_ch1(DEVICE* device, int id, uint32 mask)\r
75         {\r
76                 register_output_signal(&timer[1].outputs, device, id, mask);\r
77         }\r
78         void set_context_ch2(DEVICE* device, int id, uint32 mask)\r
79         {\r
80                 register_output_signal(&timer[2].outputs, device, id, mask);\r
81         }\r
82         void set_constant_clock(int ch, uint32 hz)\r
83         {\r
84                 timer[ch].freq = hz;\r
85         }\r
86 };\r
87 \r
88 #endif\r
89 \r