OSDN Git Service

8c8e76c21b40cbc5e6874f6543bcfc61b33a37df
[csp-qt/common_source_project-fm7.git] / source / src / vm / z80pio.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.09.17 -
6
7         [ Z80PIO ]
8 */
9
10 #ifndef _Z80PIO_H_
11 #define _Z80PIO_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 #define SIG_Z80PIO_PORT_A       0
18 #define SIG_Z80PIO_PORT_B       1
19 #define SIG_Z80PIO_STROBE_A     2
20 #define SIG_Z80PIO_STROBE_B     3
21
22 class Z80PIO : public DEVICE
23 {
24 private:
25         struct {
26                 uint32 wreg;
27                 uint8 rreg;
28                 uint8 mode;
29                 uint8 ctrl1;
30                 uint8 ctrl2;
31                 uint8 dir;
32                 uint8 mask;
33                 uint8 vector;
34                 bool set_dir;
35                 bool set_mask;
36                 // ready signal
37                 bool hand_shake;
38                 int ready_signal;
39                 bool input_empty;
40                 bool output_ready;
41                 // interrupt
42                 bool enb_intr;
43                 bool enb_intr_tmp;
44                 bool req_intr;
45                 bool in_service;
46                 // output signals
47                 outputs_t outputs_data;
48                 outputs_t outputs_ready;
49         } port[2];
50         
51         void update_ready();
52         void check_mode3_intr(int ch);
53         
54         // daisy chain
55         DEVICE *d_cpu, *d_child;
56         bool iei, oei;
57         uint32 intr_bit;
58         void update_intr();
59         
60 public:
61         Z80PIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
62         {
63                 memset(port, 0, sizeof(port));
64                 for(int i = 0; i < 2; i++) {
65                         initialize_output_signals(&port[i].outputs_data);
66                         initialize_output_signals(&port[i].outputs_ready);
67                         port[i].wreg = 0xffffff00;
68                         port[i].rreg = 0;
69                 }
70                 d_cpu = d_child = NULL;
71         }
72         ~Z80PIO() {}
73         
74         // common functions
75         void reset();
76         void write_io8(uint32 addr, uint32 data);
77         uint32 read_io8(uint32 addr);
78         void write_signal(int id, uint32 data, uint32 mask);
79         void save_state(FILEIO* state_fio);
80         bool load_state(FILEIO* state_fio);
81         
82         // interrupt common functions
83         void set_context_intr(DEVICE* device, uint32 bit)
84         {
85                 d_cpu = device;
86                 intr_bit = bit;
87         }
88         void set_context_child(DEVICE* device)
89         {
90                 d_child = device;
91         }
92         void set_intr_iei(bool val);
93         uint32 get_intr_ack();
94         void notify_intr_reti();
95         
96         // unique functions
97         void set_context_port_a(DEVICE* device, int id, uint32 mask, int shift)
98         {
99                 register_output_signal(&port[0].outputs_data, device, id, mask, shift);
100         }
101         void set_context_port_b(DEVICE* device, int id, uint32 mask, int shift)
102         {
103                 register_output_signal(&port[1].outputs_data, device, id, mask, shift);
104         }
105         void set_context_ready_a(DEVICE* device, int id, uint32 mask)
106         {
107                 register_output_signal(&port[0].outputs_ready, device, id, mask);
108         }
109         void set_context_ready_b(DEVICE* device, int id, uint32 mask)
110         {
111                 register_output_signal(&port[1].outputs_ready, device, id, mask);
112         }
113         void set_hand_shake(int ch, bool value)
114         {
115                 port[ch].hand_shake = value;
116         }
117 };
118
119 #endif
120