-
Notifications
You must be signed in to change notification settings - Fork 1
/
Sym53C895.h
177 lines (147 loc) · 5.25 KB
/
Sym53C895.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* ES40 emulator.
* Copyright (C) 2007-2008 by the ES40 Emulator Project
*
* WWW : http://sourceforge.net/projects/es40
* E-mail : [email protected]
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Although this is not required, the author would appreciate being notified of,
* and receiving any modifications you may make to the source code that might serve
* the general public.
*/
/**
* \file
* Contains the definitions for the emulated Symbios SCSI controller.
*
* $Id: Sym53C895.h,v 1.12 2008/02/17 15:44:22 iamcamiel Exp $
*
* X-1.12 Camiel Vanderhoeven 17-FEB-2008
* Comments.
*
* X-1.11 Camiel Vanderhoeven 12-JAN-2008
* Use disk's SCSI engine.
*
* X-1.10 Camiel Vanderhoeven 06-JAN-2008
* Leave changing the blocksize to the disk itself.
*
* X-1.9 Camiel Vanderhoeven 02-JAN-2008
* Comments.
*
* X-1.8 Camiel Vanderhoeven 28-DEC-2007
* Keep the compiler happy.
*
* X-1.7 Camiel Vanderhoeven 20-DEC-2007
* Do reselection on read commands.
*
* X-1.6 Camiel Vanderhoeven 19-DEC-2007
* Allow for different blocksizes.
*
* X-1.5 Camiel Vanderhoeven 18-DEC-2007
* Selection timeout occurs after the phase is checked the first time.
*
* X-1.4 Camiel Vanderhoeven 17-DEC-2007
* Added general timer.
*
* X-1.3 Camiel Vanderhoeven 17-DEC-2007
* SaveState file format 2.1
*
* X-1.2 Camiel Vanderhoeven 16-DEC-2007
* Changed register structure.
*
* X-1.1 Camiel Vanderhoeven 14-DEC-2007
* Initial version in CVS
**/
#if !defined(INCLUDED_SYM53C895_H_)
#define INCLUDED_SYM53C895_H_
#include "DiskController.h"
#include "SCSIDevice.h"
/**
* \brief Symbios Sym53C895 SCSI disk controller.
*
* \bug PROCGONE bugcheck during OpenVMS boot, probably because proper option ROM is missing.
*
* Documentation consulted:
* - SCSI 2 (http://www.t10.org/ftp/t10/drafts/s2/s2-r10l.pdf)
* - SCSI 3 Multimedia Commands (MMC) (http://www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf)
* - SYM53C895 PCI-Ultra2 SCSI I/O Processor (http://www.datasheet4u.com/html/S/Y/M/SYM53C895_LSILogic.pdf.html)
* - Symbios SCSI SCRIPTS Processors Programming Guide (http://la.causeuse.org/hauke/macbsd/symbios_53cXXX_doc/lsilogic-53cXXX-scripts.pdf)
* .
**/
class CSym53C895 : public CDiskController, public CSCSIDevice
{
public:
virtual int SaveState(FILE * f);
virtual int RestoreState(FILE * f);
virtual int DoClock();
virtual void WriteMem_Bar(int func,int bar, u32 address, int dsize, u32 data);
virtual u32 ReadMem_Bar(int func,int bar, u32 address, int dsize);
virtual u32 config_read_custom(int func, u32 address, int dsize, u32 data);
virtual void config_write_custom(int func, u32 address, int dsize, u32 old_data, u32 new_data, u32 data);
virtual void register_disk(class CDisk * dsk, int bus, int dev);
CSym53C895(CConfigurator * cfg, class CSystem * c, int pcibus, int pcidev);
virtual ~CSym53C895();
private:
void write_b_scntl0(u8 value);
void write_b_scntl1(u8 value);
void write_b_scntl3(u8 value);
void write_b_istat(u8 value);
u8 read_b_ctest2();
void write_b_ctest3(u8 value);
void write_b_ctest4(u8 value);
void write_b_ctest5(u8 value);
void write_b_stest2(u8 value);
void write_b_stest3(u8 value);
u8 read_b_dstat();
u8 read_b_sist(int id);
void write_b_dcntl(u8 value);
u8 read_b_scratcha(int reg);
u8 read_b_scratchb(int reg);
void post_dsp_write();
int execute();
// void select_target(int target);
// void byte_to_target(u8 value);
// u8 byte_from_target();
// void end_xfer();
// int do_command();
// int do_message();
void eval_interrupts();
void set_interrupt(int reg, u8 interrupt);
void chip_reset();
/// The state structure contains all elements that need to be saved to the statefile.
struct SSym_state {
bool irq_asserted;
union USym_regs {
u8 reg8[128];
u16 reg16[64];
u32 reg32[64];
} regs;
struct SSym_alu{
bool carry;
} alu;
u8 ram[4096];
bool executing;
bool wait_reselect;
bool select_timeout;
int disconnected;
u32 wait_jump;
u8 dstat_stack;
u8 sist0_stack;
u8 sist1_stack;
long gen_timer;
//int phase;
} state;
};
#endif // !defined(INCLUDED_SYM_H)