1 #ifndef UAE_A2091_H
2 #define UAE_A2091_H
3 
4 #ifdef A2091
5 
6 #define WD_STATUS_QUEUE 2
7 
8 struct wd_chip_state {
9 
10 	volatile uae_u8 sasr, scmd, auxstatus;
11 	volatile int wd_used;
12 	volatile int wd_phase, wd_next_phase, wd_busy, wd_data_avail;
13 	volatile bool wd_selected;
14 	volatile int wd_dataoffset;
15 	volatile uae_u8 wd_data[32];
16 	uae_u8 wdregs[32];
17 	volatile uae_u8 scsidelay_status[WD_STATUS_QUEUE];
18 	volatile int queue_index;
19 	volatile int scsidelay_irq[WD_STATUS_QUEUE];
20 	struct scsi_data *scsi;
21 	int wd33c93_ver;// 0 or 1
22 };
23 
24 #define COMMODORE_8727 0
25 #define COMMODORE_DMAC 1
26 #define COMMODORE_SDMAC 2
27 #define GVP_DMAC_S2 3
28 #define GVP_DMAC_S1 4
29 
30 struct commodore_dmac
31 {
32 	uae_u32 dmac_istr, dmac_cntr;
33 	uae_u32 dmac_dawr;
34 	uae_u32 dmac_acr;
35 	uae_u32 dmac_wtc;
36 	int dmac_dma;
37 	int old_dmac;
38 
39 	uae_u8 xt_control;
40 	uae_u8 xt_status;
41 	uae_u16 xt_cyls, xt_heads, xt_sectors;
42 
43 	bool xt_irq;
44 	int xt_offset;
45 	int xt_datalen;
46 	uae_u8 xt_cmd[6];
47 	uae_u8 xt_statusbyte;
48 
49 	uae_u8 c8727_pcss;
50 	uae_u8 c8727_ctl;
51 	uae_u8 c8727_wrcbp;
52 	uae_u16 c8727_st506_cb;
53 };
54 struct gvp_dmac
55 {
56 	uae_u16 cntr;
57 	uae_u32 addr;
58 	uae_u16 len;
59 	uae_u16 bank;
60 	int dma_on;
61 	uae_u8 version;
62 	bool use_version;
63 	uae_u32 addr_mask;
64 	bool series2;
65 	int s1_subtype;
66 	int s1_ramoffset;
67 	int s1_rammask;
68 	uae_u8 *buffer;
69 	int bufoffset;
70 };
71 
72 struct wd_state {
73 	bool enabled;
74 	int configured;
75 	bool autoconfig;
76 	uae_u8 dmacmemory[100];
77 	uae_u8 *rom;
78 	int board_mask;
79 	uaecptr baseaddress;
80 	int rombankswitcher, rombank;
81 	int rom_size, rom_mask;
82 	addrbank *bank;
83 	struct romconfig *rc;
84 	struct wd_state **self_ptr;
85 
86 	smp_comm_pipe requests;
87 	volatile int scsi_thread_running;
88 
89 	// unit 8,9 = ST-506 (A2090)
90 	// unit 8 = XT (A2091)
91 	struct scsi_data *scsis[8 + 2];
92 
93 	bool cdtv;
94 
95 	int dmac_type;
96 	struct wd_chip_state wc;
97 	struct commodore_dmac cdmac;
98 	struct gvp_dmac gdmac;
99 };
100 extern wd_state *wd_cdtv;
101 
102 extern void init_wd_scsi (struct wd_state*);
103 extern void scsi_dmac_a2091_start_dma (struct wd_state*);
104 extern void scsi_dmac_a2091_stop_dma (struct wd_state*);
105 
106 extern addrbank *a2090_init (struct romconfig*);
107 
108 extern addrbank *a2091_init (struct romconfig*);
109 extern void a2091_free(void);
110 extern void a2091_reset (void);
111 
112 extern addrbank *gvp_init_s1(struct romconfig*);
113 extern addrbank *gvp_init_s2(struct romconfig*);
114 extern addrbank *gvp_init_accelerator(struct romconfig*);
115 extern void gvp_free(void);
116 extern void gvp_reset (void);
117 
118 extern void a3000scsi_init (void);
119 extern void a3000scsi_free (void);
120 extern void a3000scsi_reset (void);
121 extern void rethink_a2091 (void);
122 
123 extern void wdscsi_put (struct wd_chip_state*, wd_state*, uae_u8);
124 extern uae_u8 wdscsi_get (struct wd_chip_state*, struct wd_state*);
125 extern uae_u8 wdscsi_getauxstatus (struct wd_chip_state*);
126 extern void wdscsi_sasr (struct wd_chip_state*, uae_u8);
127 
128 extern void scsi_hsync (void);
129 
130 #define WDTYPE_A2091 0
131 #define WDTYPE_A2091_2 1
132 #define WDTYPE_A3000 2
133 #define WDTYPE_CDTV 3
134 #define WDTYPE_GVP 4
135 
136 #define WD33C93 _T("WD33C93")
137 
138 extern void a2090_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
139 extern void a2091_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
140 extern void gvp_s1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
141 extern void gvp_s2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
142 extern void gvp_s2_add_accelerator_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
143 extern void a3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
144 
145 extern int add_wd_scsi_hd (struct wd_state *wd, int ch, struct hd_hardfiledata *hfd, struct uaedev_config_info *ci, int scsi_level);
146 extern int add_wd_scsi_cd (struct wd_state *wd, int ch, int unitnum);
147 extern int add_wd_scsi_tape (struct wd_state *wd, int ch, const TCHAR *tape_directory, bool readonly);
148 
149 #endif /* A2091 */
150 
151 #endif /* UAE_A2091_H */
152