OSDN Git Service

Merge branch 'master' of github.com:Artanejp/common_source_project-fm7
[csp-qt/common_source_project-fm7.git] / source / src / vm / i8255.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.09.14 -
6
7         [ i8255 ]
8 */
9
10 #ifndef _I8255_H_
11 #define _I8255_H_
12
13 //#include "vm.h"
14 //#include "../emu.h"
15 #include "device.h"
16
17 #define SIG_I8255_PORT_A        0
18 #define SIG_I8255_PORT_B        1
19 #define SIG_I8255_PORT_C        2
20
21 class I8255 : public DEVICE
22 {
23 private:
24         struct {
25                 uint8_t wreg;
26                 uint8_t rreg;
27                 uint8_t rmask;
28                 uint8_t mode;
29                 bool first;
30                 // output signals
31                 outputs_t outputs;
32         } port[3];
33         bool __I8255_AUTO_HAND_SHAKE;
34         
35 public:
36         I8255(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
37         {
38                 for(int i = 0; i < 3; i++) {
39                         initialize_output_signals(&port[i].outputs);
40                         port[i].wreg = port[i].rreg = 0;//0xff;
41                 }
42                 clear_ports_by_cmdreg = false;
43                 __I8255_AUTO_HAND_SHAKE = false;
44                 set_device_name(_T("i8255 PIO"));
45         }
46         ~I8255() {}
47         
48         // common functions
49         void initialize();
50         void reset();
51         void write_io8(uint32_t addr, uint32_t data);
52         uint32_t read_io8(uint32_t addr);
53         void write_signal(int id, uint32_t data, uint32_t mask);
54         uint32_t read_signal(int id);
55         void decl_state();
56         void save_state(FILEIO* state_fio);
57         bool load_state(FILEIO* state_fio);
58         // unique functions
59         void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
60         {
61                 register_output_signal(&port[0].outputs, device, id, mask, shift);
62         }
63         void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
64         {
65                 register_output_signal(&port[1].outputs, device, id, mask, shift);
66         }
67         void set_context_port_c(DEVICE* device, int id, uint32_t mask, int shift)
68         {
69                 register_output_signal(&port[2].outputs, device, id, mask, shift);
70         }
71         bool clear_ports_by_cmdreg;
72 };
73
74 #endif
75