OSDN Git Service

[VM] .
[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 VM;
23 class EMU;
24 class Z80PIO : public DEVICE
25 {
26 private:
27         struct {
28                 uint32_t wreg;
29                 uint8_t rreg;
30                 uint8_t mode;
31                 uint8_t ctrl1;
32                 uint8_t ctrl2;
33                 uint8_t dir;
34                 uint8_t mask;
35                 uint8_t vector;
36                 bool set_dir;
37                 bool set_mask;
38                 // ready signal
39                 bool hand_shake;
40                 int ready_signal;
41                 bool input_empty;
42                 bool output_ready;
43                 // interrupt
44                 bool enb_intr;
45                 bool enb_intr_tmp;
46                 bool req_intr;
47                 bool in_service;
48                 // output signals
49                 outputs_t outputs_data;
50                 outputs_t outputs_ready;
51         } port[2];
52         
53         void update_ready();
54         void check_mode3_intr(int ch);
55         
56         // daisy chain
57         DEVICE *d_cpu, *d_child;
58         bool iei, oei;
59         uint32_t intr_bit;
60         void update_intr();
61         
62 public:
63         Z80PIO(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
64         {
65                 memset(port, 0, sizeof(port));
66                 for(int i = 0; i < 2; i++) {
67                         initialize_output_signals(&port[i].outputs_data);
68                         initialize_output_signals(&port[i].outputs_ready);
69                         port[i].wreg = 0xffffff00;
70                         port[i].rreg = 0;
71                 }
72                 d_cpu = d_child = NULL;
73                 set_device_name(_T("Z80 PIO"));
74         }
75         ~Z80PIO() {}
76         
77         // common functions
78         void reset();
79         void write_io8(uint32_t addr, uint32_t data);
80         uint32_t read_io8(uint32_t addr);
81         void write_signal(int id, uint32_t data, uint32_t mask);
82         bool process_state(FILEIO* state_fio, bool loading);
83         // interrupt common functions
84         void set_context_intr(DEVICE* device, uint32_t bit)
85         {
86                 d_cpu = device;
87                 intr_bit = bit;
88         }
89         void set_context_child(DEVICE* device)
90         {
91                 d_child = device;
92         }
93         void set_intr_iei(bool val);
94         uint32_t get_intr_ack();
95         void notify_intr_reti();
96         
97         // unique functions
98         void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
99         {
100                 register_output_signal(&port[0].outputs_data, device, id, mask, shift);
101         }
102         void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
103         {
104                 register_output_signal(&port[1].outputs_data, device, id, mask, shift);
105         }
106         void set_context_ready_a(DEVICE* device, int id, uint32_t mask)
107         {
108                 register_output_signal(&port[0].outputs_ready, device, id, mask);
109         }
110         void set_context_ready_b(DEVICE* device, int id, uint32_t mask)
111         {
112                 register_output_signal(&port[1].outputs_ready, device, id, mask);
113         }
114         void set_hand_shake(int ch, bool value)
115         {
116                 port[ch].hand_shake = value;
117         }
118 };
119
120 #endif
121