OSDN Git Service

[VM][FM7] Fix FTBFS.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / hd6844.h
1 /*
2  * DMAC HD6844/MC6844 [hd6844.h]
3  *
4  * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
5  * License: GPLv2
6  * History:
7  *   Jun 18, 2015 : Initial
8  *
9  */
10
11 #ifndef _VM_HD6844_H_
12 #define _VM_HD6844_H_
13
14
15 #include "../device.h"
16
17 class EMU;
18 class VM;
19 enum {
20         HD6844_EVENT_START_TRANSFER = 0,
21         HD6844_EVENT_DO_TRANSFER = 4,
22         HD6844_EVENT_END_TRANSFER = 8,
23 };
24
25 enum {
26         HD6844_BUSREQ_CLIENT = 0,
27         HD6844_BUSREQ_HOST = 1
28 };
29
30 enum {
31         HD6844_TRANSFER_START = 1,
32         HD6844_DO_TRANSFER,
33         HD6844_ADDR_REG_0 = 4,
34         HD6844_ADDR_REG_1,
35         HD6844_ADDR_REG_2,
36         HD6844_ADDR_REG_3,
37         HD6844_WORDS_REG_0,
38         HD6844_WORDS_REG_1,
39         HD6844_WORDS_REG_2,
40         HD6844_WORDS_REG_3,
41         HD6844_SRC_FIXED_ADDR_CH0 = 16,
42         HD6844_SRC_FIXED_ADDR_CH1,
43         HD6844_SRC_FIXED_ADDR_CH2,
44         HD6844_SRC_FIXED_ADDR_CH3,
45         HD6844_SET_CONST_OFFSET,
46         HD6844_IS_TRANSFER_0 = 24,
47         HD6844_IS_TRANSFER_1,
48         HD6844_IS_TRANSFER_2,
49         HD6844_IS_TRANSFER_3,
50         HD6844_ACK_BUSREQ_CLIENT,
51         HD6844_ACK_BUSREQ_HOST,
52
53 };
54 class VM;
55 class EMU;
56 class csp_state_utils;
57 class HD6844: public DEVICE {
58 protected:
59         // HACKs
60         bool __USE_CHAINING;
61         bool __USE_MULTIPLE_CHAINING;
62         bool __FM77AV40;
63         bool __FM77AV40EX;
64         
65         DEVICE *src[4];
66         DEVICE *dest[4];
67
68         outputs_t interrupt_line; // 20180117 K.O
69         outputs_t busreq_line[2];
70
71         csp_state_utils *state_entry;
72         // Registers
73
74         uint32_t addr_reg[4];
75         uint16_t words_reg[4];
76         uint8_t channel_control[4];
77         
78         uint8_t priority_reg;
79         uint8_t interrupt_reg;
80         uint8_t datachain_reg;
81         uint8_t num_reg;
82         uint32_t addr_offset;
83         
84         bool transfering[4];
85         bool first_transfer[4];
86         bool cycle_steal[4];
87         bool halt_flag[4];
88    
89         uint32_t fixed_addr[4];
90         uint8_t data_reg[4];
91         int event_dmac[4];
92
93         void do_transfer(int ch);
94         void do_transfer_end(int ch);
95         void do_irq(void);
96  public:
97         HD6844(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
98         {
99                 int i;
100                 for(i = 0; i < 4; i++) {
101                         src[i] = dest[i] = NULL;
102                 }
103                 initialize_output_signals(&interrupt_line);
104                 for(i = 0; i < 2; i++) initialize_output_signals(&(busreq_line[i]));
105                 set_device_name(_T("HD6844 DMAC"));
106                 decl_state();
107         }
108         ~HD6844(){}
109         void event_callback(int event_id, int err);
110         void write_data8(uint32_t id, uint32_t data);
111         uint32_t read_data8(uint32_t addr);
112         
113         uint32_t read_signal(int id); 
114         void write_signal(int id, uint32_t data, uint32_t mask);
115         void initialize(void);
116         void reset(void);
117         //void update_config(void);
118         void save_state(FILEIO *state_fio);
119         bool load_state(FILEIO *state_fio);
120         void decl_state(void);
121         
122         void set_context_int_line(DEVICE *p, int id, uint32_t mask) {
123                 register_output_signal(&interrupt_line, p, id, mask);
124         }
125         void set_context_busreq_line(DEVICE *p, int ch, int id, uint32_t mask) {
126                 register_output_signal(&(busreq_line[ch & 1]), p, id, mask);
127         }
128         void set_context_src(DEVICE *p, uint32_t ch) {
129                 src[ch & 3]  = p;
130         }
131         void set_context_dst(DEVICE *p, uint32_t ch) {
132                 dest[ch & 3]  = p;
133         }
134 };      
135
136
137 #endif // _VM_FM77AV_16beta_ALU_H_