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 / scsi_host.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2016.03.01-
6
7         [ SCSI base initiator ]
8 */
9
10 #ifndef _SCSI_HOST_H_
11 #define _SCSI_HOST_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16 //class EMU;
17 //class VM;
18 class FIFO;
19
20 #define SIG_SCSI_HOST_DMAE 1
21 class SCSI_HOST : public DEVICE
22 {
23 protected: // Make pcotected because TOWNS's DMAC may transfer 16bit around SCSI.
24         outputs_t outputs_irq;  // to adaptor
25         outputs_t outputs_drq;
26         
27         outputs_t outputs_bsy;
28         outputs_t outputs_cd;
29         outputs_t outputs_io;
30         outputs_t outputs_msg;
31         outputs_t outputs_req;
32         
33         outputs_t outputs_dat;  // to devices
34         outputs_t outputs_sel;
35         outputs_t outputs_atn;
36         outputs_t outputs_ack;
37         outputs_t outputs_rst;
38         FIFO* data_queue;
39         
40         uint32_t data_reg;
41         uint32_t bsy_status, cd_status, io_status, msg_status, req_status, ack_status;
42         bool access;
43         bool is_16bit;
44         bool is_dma;
45         
46         virtual void __FASTCALL set_irq(bool value);
47         virtual void __FASTCALL set_drq(bool value);
48         
49 public:
50         SCSI_HOST(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
51         {
52                 initialize_output_signals(&outputs_irq);
53                 initialize_output_signals(&outputs_drq);
54                 
55                 initialize_output_signals(&outputs_bsy);
56                 initialize_output_signals(&outputs_cd);
57                 initialize_output_signals(&outputs_io);
58                 initialize_output_signals(&outputs_msg);
59                 initialize_output_signals(&outputs_req);
60                 
61                 initialize_output_signals(&outputs_dat);
62                 initialize_output_signals(&outputs_sel);
63                 initialize_output_signals(&outputs_atn);
64                 initialize_output_signals(&outputs_ack);
65                 initialize_output_signals(&outputs_rst);
66
67                 data_queue = NULL;
68                 set_device_name(_T("SCSI HOST"));
69         }
70         ~SCSI_HOST() {}
71         
72         // common functions
73         virtual void reset();
74         virtual void initialize();
75         virtual void release();
76         virtual void event_callback(int id, int err);
77 /*
78 #ifdef SCSI_HOST_WIDE
79         virtual void __FASTCALL write_dma_io16(uint32_t addr, uint32_t data);
80         virtual uint32_t __FASTCALL read_dma_io16(uint32_t addr);
81 #else
82         virtual void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
83         virtual uint32_t __FASTCALL read_dma_io8(uint32_t addr);
84 #endif
85 */
86         virtual void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
87         virtual void __FASTCALL write_dma_io16(uint32_t addr, uint32_t data);
88         virtual uint32_t __FASTCALL read_dma_io8(uint32_t addr);
89         virtual uint32_t __FASTCALL read_dma_io16(uint32_t addr);
90         
91         virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
92         virtual uint32_t __FASTCALL read_signal(int id);
93         virtual bool process_state(FILEIO* state_fio, bool loading);
94         
95         // unique functions
96         void set_context_irq(DEVICE* device, int id, uint32_t mask)
97         {
98                 register_output_signal(&outputs_irq, device, id, mask);
99         }
100         void set_context_drq(DEVICE* device, int id, uint32_t mask)
101         {
102                 register_output_signal(&outputs_drq, device, id, mask);
103         }
104         void set_context_bsy(DEVICE* device, int id, uint32_t mask)
105         {
106                 register_output_signal(&outputs_bsy, device, id, mask);
107         }
108         void set_context_cd(DEVICE* device, int id, uint32_t mask)
109         {
110                 register_output_signal(&outputs_cd, device, id, mask);
111         }
112         void set_context_io(DEVICE* device, int id, uint32_t mask)
113         {
114                 register_output_signal(&outputs_io, device, id, mask);
115         }
116         void set_context_msg(DEVICE* device, int id, uint32_t mask)
117         {
118                 register_output_signal(&outputs_msg, device, id, mask);
119         }
120         void set_context_req(DEVICE* device, int id, uint32_t mask)
121         {
122                 register_output_signal(&outputs_req, device, id, mask);
123         }
124         void set_context_ack(DEVICE* device, int id, uint32_t mask)
125         {
126                 register_output_signal(&outputs_ack, device, id, mask);
127         }
128         void set_context_target(DEVICE* device)
129         {
130 #ifdef SCSI_HOST_WIDE
131                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xffff);
132 #else
133                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xff);
134 #endif
135                 register_output_signal(&outputs_sel, device, SIG_SCSI_SEL, 1);
136                 register_output_signal(&outputs_atn, device, SIG_SCSI_ATN, 1);
137                 register_output_signal(&outputs_ack, device, SIG_SCSI_ACK, 1);
138                 register_output_signal(&outputs_rst, device, SIG_SCSI_RST, 1);
139         }
140 };
141
142 #endif
143