OSDN Git Service

[VM][Qt][UI][EMU][WIP] Use EMU_TEMPLATE:: instead of EMU:: . Some VMs are not apply...
[csp-qt/common_source_project-fm7.git] / source / src / vm / z80dma.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME Z80DMA / Xmillenium
5         Author : Takeda.Toshiya
6         Date   : 2011.04.96-
7
8         [ Z80DMA ]
9 */
10
11 #ifndef _Z80DMA_H_
12 #define _Z80DMA_H_
13
14 //#include "vm.h"
15 //#include "../emu.h"
16 #include "device.h"
17
18 #define SIG_Z80DMA_READY        0
19
20 class DEBUGGER;
21
22 class Z80DMA : public DEVICE
23 {
24 private:
25         DEVICE *d_mem, *d_io;
26         DEBUGGER *d_debugger;
27         outputs_t outputs_wrote_mem;
28         typedef union {
29                 uint16_t m[7][8];
30                 uint16_t t[6*8+1+1];
31         } regs_t;
32         regs_t regs;
33         uint8_t status;
34         
35         uint16_t wr_tmp[4];
36         int wr_num, wr_ptr;
37         uint16_t rr_tmp[7];
38         int rr_num, rr_ptr;
39         
40         bool enabled;
41         uint32_t ready;
42         bool force_ready;
43         
44         uint16_t addr_a;
45         uint16_t addr_b;
46         int upcount;
47         int blocklen;
48         bool dma_stop;
49         bool bus_master;
50         
51         void __FASTCALL write_memory(uint32_t addr, uint32_t data, int* wait);
52         uint32_t __FASTCALL read_memory(uint32_t addr, int* wait);
53         void __FASTCALL write_ioport(uint32_t addr, uint32_t data, int* wait);
54         uint32_t __FASTCALL read_ioport(uint32_t addr, int* wait);
55         
56         // interrupt
57         bool req_intr;
58         bool in_service;
59         uint8_t vector;
60
61         bool _SINGLE_MODE_DMA;
62         bool _DMA_DEBUG;
63         bool _X1TURBO_FEATURE;
64         bool now_ready();
65         void request_bus();
66         void release_bus();
67         void __FASTCALL update_read_buffer();
68         void __FASTCALL request_intr(int level);
69         
70         // daisy chain
71         DEVICE *d_cpu, *d_child;
72         bool iei, oei;
73         uint32_t intr_bit;
74         void update_intr();
75         
76 public:
77         Z80DMA(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
78         {
79                 for(int i = 0; i < 6 * 8 + 1 + 1; i++) {
80                         regs.t[i] = 0;
81                 }
82                 _SINGLE_MODE_DMA = _DMA_DEBUG = false;
83                 d_cpu = d_child = NULL;
84                 d_debugger = NULL;
85                 initialize_output_signals(&outputs_wrote_mem);
86                 set_device_name(_T("Z80 DMA"));
87         }
88         ~Z80DMA() {}
89         
90         // common functions
91         void reset();
92         void initialize();
93         void __FASTCALL write_io8(uint32_t addr, uint32_t data);
94         uint32_t __FASTCALL read_io8(uint32_t addr);
95         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
96         void __FASTCALL do_dma();
97         // for debug
98         void __FASTCALL write_via_debugger_data8w(uint32_t addr, uint32_t data, int* wait);
99         uint32_t __FASTCALL read_via_debugger_data8w(uint32_t addr, int* wait);
100         void __FASTCALL write_via_debugger_io8w(uint32_t addr, uint32_t data, int* wait);
101         uint32_t __FASTCALL read_via_debugger_io8w(uint32_t addr, int* wait);
102         bool is_debugger_available()
103         {
104                 return true;
105         }
106         void *get_debugger()
107         {
108                 return d_debugger;
109         }
110         bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
111         bool process_state(FILEIO* state_fio, bool loading);
112         // interrupt common functions
113         void set_context_intr(DEVICE* device, uint32_t bit)
114         {
115                 d_cpu = device;
116                 intr_bit = bit;
117         }
118         void set_context_child(DEVICE* device)
119         {
120                 d_child = device;
121         }
122         DEVICE *get_context_child()
123         {
124                 return d_child;
125         }
126         void set_intr_iei(bool val);
127         uint32_t get_intr_ack();
128         void notify_intr_reti();
129         
130         // unique function
131         void set_context_memory(DEVICE* device)
132         {
133                 d_mem = device;
134         }
135         void set_context_io(DEVICE* device)
136         {
137                 d_io = device;
138         }
139         void set_context_debugger(DEBUGGER* device)
140         {
141                 d_debugger = device;
142         }
143         void set_context_wrote_mem(DEVICE* device, int id)
144         {
145                 register_output_signal(&outputs_wrote_mem, device, id, 1);
146         }
147 };
148
149 #endif
150