OSDN Git Service

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