-
Notifications
You must be signed in to change notification settings - Fork 1
/
Sym53C810.h
145 lines (115 loc) · 4.07 KB
/
Sym53C810.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
/* 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: Sym53C810.h,v 1.2 2008/02/17 15:44:22 iamcamiel Exp $
*
* X-1.2 Camiel Vanderhoeven 17-FEB-2008
* Comments.
*
* X-1.1 Camiel Vanderhoeven 16-FEB-2008
* Created as a spinoff from 53C895 controller, as we couldn't get
* that chip to work properly with the OpenVMS driver.
**/
#if !defined(INCLUDED_SYM53C810_H_)
#define INCLUDED_SYM53C810_H_
#include "DiskController.h"
#include "SCSIDevice.h"
/**
* \brief Symbios Sym53C810 SCSI disk controller.
*
* \bug Exception below ASTDEL during OpenVMS boot when booting from SCSI.
*
* 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)
* - SYM53C810A PCI-SCSI I/O Processor (http://ftp.netbsd.org/pub/NetBSD/arch/bebox/doc/810a.pdf)
* - Symbios SCSI SCRIPTS Processors Programming Guide (http://la.causeuse.org/hauke/macbsd/symbios_53cXXX_doc/lsilogic-53cXXX-scripts.pdf)
* .
**/
class CSym53C810 : 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);
CSym53C810(CConfigurator * cfg, class CSystem * c, int pcibus, int pcidev);
virtual ~CSym53C810();
private:
void write_b_scntl0(u8 value);
void write_b_scntl1(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);
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)