OSDN Git Service

fa58dd9b91b84da5cae7a2a283bcc867f193dc19
[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 SCSI_HOST : public DEVICE
19 {
20 private:
21         outputs_t outputs_irq;  // to adaptor
22         outputs_t outputs_drq;
23         
24         outputs_t outputs_bsy;
25         outputs_t outputs_cd;
26         outputs_t outputs_io;
27         outputs_t outputs_msg;
28         outputs_t outputs_req;
29         
30         outputs_t outputs_dat;  // to devices
31         outputs_t outputs_sel;
32         outputs_t outputs_atn;
33         outputs_t outputs_ack;
34         outputs_t outputs_rst;
35         
36         uint32_t data_reg;
37         uint32_t bsy_status, cd_status, io_status, msg_status, req_status, ack_status;
38         bool access;
39         
40         void __FASTCALL set_irq(bool value);
41         void __FASTCALL set_drq(bool value);
42         
43 public:
44         SCSI_HOST(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
45         {
46                 initialize_output_signals(&outputs_irq);
47                 initialize_output_signals(&outputs_drq);
48                 
49                 initialize_output_signals(&outputs_bsy);
50                 initialize_output_signals(&outputs_cd);
51                 initialize_output_signals(&outputs_io);
52                 initialize_output_signals(&outputs_msg);
53                 initialize_output_signals(&outputs_req);
54                 
55                 initialize_output_signals(&outputs_dat);
56                 initialize_output_signals(&outputs_sel);
57                 initialize_output_signals(&outputs_atn);
58                 initialize_output_signals(&outputs_ack);
59                 initialize_output_signals(&outputs_rst);
60                 set_device_name(_T("SCSI HOST"));
61         }
62         ~SCSI_HOST() {}
63         
64         // common functions
65         void reset();
66 #ifdef SCSI_HOST_WIDE
67         void __FASTCALL write_dma_io16(uint32_t addr, uint32_t data);
68         uint32_t __FASTCALL read_dma_io16(uint32_t addr);
69 #else
70         void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
71         uint32_t __FASTCALL read_dma_io8(uint32_t addr);
72 #endif
73         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
74         uint32_t __FASTCALL read_signal(int id);
75         bool process_state(FILEIO* state_fio, bool loading);
76         
77         // unique functions
78         void set_context_irq(DEVICE* device, int id, uint32_t mask)
79         {
80                 register_output_signal(&outputs_irq, device, id, mask);
81         }
82         void set_context_drq(DEVICE* device, int id, uint32_t mask)
83         {
84                 register_output_signal(&outputs_drq, device, id, mask);
85         }
86         void set_context_bsy(DEVICE* device, int id, uint32_t mask)
87         {
88                 register_output_signal(&outputs_bsy, device, id, mask);
89         }
90         void set_context_cd(DEVICE* device, int id, uint32_t mask)
91         {
92                 register_output_signal(&outputs_cd, device, id, mask);
93         }
94         void set_context_io(DEVICE* device, int id, uint32_t mask)
95         {
96                 register_output_signal(&outputs_io, device, id, mask);
97         }
98         void set_context_msg(DEVICE* device, int id, uint32_t mask)
99         {
100                 register_output_signal(&outputs_msg, device, id, mask);
101         }
102         void set_context_req(DEVICE* device, int id, uint32_t mask)
103         {
104                 register_output_signal(&outputs_req, device, id, mask);
105         }
106         void set_context_ack(DEVICE* device, int id, uint32_t mask)
107         {
108                 register_output_signal(&outputs_ack, device, id, mask);
109         }
110         void set_context_target(DEVICE* device)
111         {
112 #ifdef SCSI_HOST_WIDE
113                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xffff);
114 #else
115                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xff);
116 #endif
117                 register_output_signal(&outputs_sel, device, SIG_SCSI_SEL, 1);
118                 register_output_signal(&outputs_atn, device, SIG_SCSI_ATN, 1);
119                 register_output_signal(&outputs_ack, device, SIG_SCSI_ACK, 1);
120                 register_output_signal(&outputs_rst, device, SIG_SCSI_RST, 1);
121         }
122 };
123
124 #endif
125