OSDN Git Service

[VM] Add vm_template.h . This class, VM_TEMPLATE:: must be mother of VM:: .See fm7...
[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 HD6844: public DEVICE {
57 protected:
58         // HACKs
59         bool __USE_CHAINING;
60         bool __USE_MULTIPLE_CHAINING;
61         bool __FM77AV40;
62         bool __FM77AV40EX;
63         
64         DEVICE *src[4];
65         DEVICE *dest[4];
66
67         outputs_t interrupt_line; // 20180117 K.O
68         outputs_t busreq_line[2];
69
70         // Registers
71
72         uint32_t addr_reg[4];
73         uint16_t words_reg[4];
74         uint8_t channel_control[4];
75         
76         uint8_t priority_reg;
77         uint8_t interrupt_reg;
78         uint8_t datachain_reg;
79         uint8_t num_reg;
80         uint32_t addr_offset;
81         
82         bool transfering[4];
83         bool first_transfer[4];
84         bool cycle_steal[4];
85         bool halt_flag[4];
86    
87         uint32_t fixed_addr[4];
88         uint8_t data_reg[4];
89         int event_dmac[4];
90
91         void do_transfer(int ch);
92         void do_transfer_end(int ch);
93         void do_irq(void);
94  public:
95         HD6844(VM_TEMPLATE* parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
96         {
97                 int i;
98                 for(i = 0; i < 4; i++) {
99                         src[i] = dest[i] = NULL;
100                 }
101                 initialize_output_signals(&interrupt_line);
102                 for(i = 0; i < 2; i++) initialize_output_signals(&(busreq_line[i]));
103                 set_device_name(_T("HD6844 DMAC"));
104         }
105         ~HD6844(){}
106         void event_callback(int event_id, int err);
107         void write_data8(uint32_t id, uint32_t data);
108         uint32_t read_data8(uint32_t addr);
109         
110         uint32_t read_signal(int id); 
111         void write_signal(int id, uint32_t data, uint32_t mask);
112         void initialize(void);
113         void reset(void);
114         //void update_config(void);
115         void save_state(FILEIO *state_fio);
116         bool load_state(FILEIO *state_fio);
117         void decl_state(void);
118         
119         void set_context_int_line(DEVICE *p, int id, uint32_t mask) {
120                 register_output_signal(&interrupt_line, p, id, mask);
121         }
122         void set_context_busreq_line(DEVICE *p, int ch, int id, uint32_t mask) {
123                 register_output_signal(&(busreq_line[ch & 1]), p, id, mask);
124         }
125         void set_context_src(DEVICE *p, uint32_t ch) {
126                 src[ch & 3]  = p;
127         }
128         void set_context_dst(DEVICE *p, uint32_t ch) {
129                 dest[ch & 3]  = p;
130         }
131 };      
132
133
134 #endif // _VM_FM77AV_16beta_ALU_H_