OSDN Git Service

[VM][General] Merge Upstream 2017-12-15.
[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
17 class SCSI_HOST : public DEVICE
18 {
19 private:
20         outputs_t outputs_irq;  // to adaptor
21         outputs_t outputs_drq;
22         outputs_t outputs_bsy;
23         
24         outputs_t outputs_dat;  // to devices
25         outputs_t outputs_sel;
26         outputs_t outputs_atn;
27         outputs_t outputs_ack;
28         outputs_t outputs_rst;
29         
30         uint32_t data_reg;
31         uint32_t bsy_status, cd_status, io_status, msg_status, req_status;
32         bool access;
33         
34         void set_irq(bool value);
35         void set_drq(bool value);
36         
37 public:
38         SCSI_HOST(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
39         {
40                 initialize_output_signals(&outputs_irq);
41                 initialize_output_signals(&outputs_drq);
42                 initialize_output_signals(&outputs_bsy);
43                 
44                 initialize_output_signals(&outputs_dat);
45                 initialize_output_signals(&outputs_sel);
46                 initialize_output_signals(&outputs_atn);
47                 initialize_output_signals(&outputs_ack);
48                 initialize_output_signals(&outputs_rst);
49                 set_device_name(_T("SCSI HOST"));
50         }
51         ~SCSI_HOST() {}
52         
53         // common functions
54         void reset();
55 #ifdef SCSI_HOST_WIDE
56         void write_dma_io16(uint32_t addr, uint32_t data);
57         uint32_t read_dma_io16(uint32_t addr);
58 #else
59         void write_dma_io8(uint32_t addr, uint32_t data);
60         uint32_t read_dma_io8(uint32_t addr);
61 #endif
62         void write_signal(int id, uint32_t data, uint32_t mask);
63         uint32_t read_signal(int id);
64         void save_state(FILEIO* state_fio);
65         bool load_state(FILEIO* state_fio);
66         
67         // unique functions
68         void set_context_irq(DEVICE* device, int id, uint32_t mask)
69         {
70                 register_output_signal(&outputs_irq, device, id, mask);
71         }
72         void set_context_drq(DEVICE* device, int id, uint32_t mask)
73         {
74                 register_output_signal(&outputs_drq, device, id, mask);
75         }
76         void set_context_bsy(DEVICE* device, int id, uint32_t mask)
77         {
78                 register_output_signal(&outputs_bsy, device, id, mask);
79         }
80         void set_context_target(DEVICE* device)
81         {
82 #ifdef SCSI_HOST_WIDE
83                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xffff);
84 #else
85                 register_output_signal(&outputs_dat, device, SIG_SCSI_DAT, 0xff);
86 #endif
87                 register_output_signal(&outputs_sel, device, SIG_SCSI_SEL, 1);
88                 register_output_signal(&outputs_atn, device, SIG_SCSI_ATN, 1);
89                 register_output_signal(&outputs_ack, device, SIG_SCSI_ACK, 1);
90                 register_output_signal(&outputs_rst, device, SIG_SCSI_RST, 1);
91         }
92 };
93
94 #endif
95