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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
//==========================================================================
//
// Definitions from findpas.h (card searching)
//
// 01-28-93 KJB First.
// 03-19-93 JAP Implemented condition build FAR and NEAR pointers
//==========================================================================
typedef struct {
USHORT wBoardRev;
USHORT wChipRev;
union
{
struct /* Our PAS_16 gives */
{
unsigned long CDInterfaceType:2; /* 3 */
unsigned long EnhancedSCSI:1; /* 0 - not enhanced SCSI*/
unsigned long DAC16:1; /* 1 DAC16 */
unsigned long OPL_3:1; /* 1 OPL3 */
unsigned long Mixer_508:1; /* 1 Mixer 508 */
unsigned long DualDAC:1; /* 1 Dual DAC */
unsigned long MPU401:1; /* 0 NO mpu401 */
unsigned long Slot16:1; /* 1 - slot 16 */
unsigned long MCA:1; /* 0 - not MCA */
unsigned long CDPC:1; /* 0 - not CDPC */
unsigned long SoundBlaster:1; /* 1 - sound blaster */
unsigned long SCSI_IO_16:1; /* 1 - ? */
unsigned long reserved:2;
unsigned long Did_HW_Init:1; /* 0 - ? */
unsigned long unused:16;
} CapsBits;
ULONG dwCaps;
} Caps;
ULONG ProPort;
UCHAR ProDMA;
UCHAR ProIRQ;
USHORT SBPort;
UCHAR SBDMA;
UCHAR SBIRQ;
USHORT MPUPort;
UCHAR MPUIRQ;
UCHAR CDIRQ;
ULONG TranslateCode;
UCHAR ReservedB1;
UCHAR ReservedB2;
PUCHAR PROBase;
} FOUNDINFO, FARP PFOUNDINFO;
// these version numbers are found in 0B8Bh
#define PAS_VERSION_1 0x000 // original
#define PAS_PLUS 0x001 // Pro Audio Spectrum Plus with SCSI
#define PAS_SIXTEEN 0x001 // Pro Audio Spectrum 16 with SCSI
#define PAS_STUDIO 0x003
#define PAS_CDPC 0x007 // CDPC 05/06/92 mmq
#define BOARD_REV_MASK 07
#define CHIP_REV_B 0x002
#define CHIP_REV_D 0x004
#define NO_PAS_INSTALLED 0x000 // can't find board
// CD interface type definitions
#define NO_INTERFACE 0
#define MITSUMI_TYPE 1
#define SONY_TYPE 2
#define SCSI_TYPE 3
#define SCSI_TYPE 3
// sound definitions
#define SOUND_DEF_DMACHANNEL 1 // DMA channel no
#define SOUND_DEF_INT 7
#define SOUND_DEF_PORT 0x220
//==========================================================================
//
// Definitions from pasdef.h
//
//==========================================================================
//
// THESE DEFINITIONS FOR CAPABILITIES FILED
//
#define DEFAULT_BASE 0x388 // default base I/O address of Pro AudioSpectrum
//// THESE ARE BASE REGISTER ATES
//
// Used only during initialization
//
#define PCM_CONTROL 0x0f8a //
#define ENHANCED_SCSI_DETECT_REG 0x7f89 //
#define SYSTEM_CONFIG_1 0x8388 //
#define SYSTEM_CONFIG_2 0x8389 //
#define SYSTEM_CONFIG_3 0x838a //
#define SYSTEM_CONFIG_4 0x838b //
#define IO_PORT_CONFIG_1 0xf388 //
#define IO_PORT_CONFIG_2 0xf389 //
#define IO_PORT_CONFIG_3 0xf38a //
#define COMPATIBLE_REGISTER_ENABLE 0xf788 // SB and MPU emulation
#define EMULATION_ADDRESS_POINTER 0xf789 // D0-D3 is SB; D4-D7 is MPU
#define EMULATION_INTERRUPT_POINTER 0xfb8a // MPU and SB IRQ and SB DMA settings
#define CHIP_REV 0xff88 // MV101 chip revision number
#define MASTER_MODE_READ 0xff8b // aka Master Address Pointer
//
// Used for volume setting
//
#define MIXER_508_REG 0x078b // Mixer 508 1 port
#define SERIAL_MIXER 0x0b88 // for Pas 1 and Pas 8
#define FEATURE_ENABLE 0x0b88 // for Pas 16 boards only
#define INTERRUPT_ENABLE 0x0b89 //
#define FILTER_REGISTER 0x0b8a //
#define INTERRUPT_CTRL_REG 0x0b8b //
//
// Only one of each of these
//
#define PAS_2_WAKE_UP_REG 0x9a01 // aka Master Address Pointer
//
// Not used here
//
#define TIMEOUT_COUNTER 0x4388 //
#define TIMEOUT_STATUS 0x4389 //
#define WAIT_STATE 0xbf88 //
#define PRESCALE_DIVIDER 0xbf8A //
#define SLAVE_MODE_READ 0xef8b // bits D0-D1
#define READ_PAS(pGDI, port) \
READ_PORT_UCHAR((PUCHAR)((port) ^ (pGDI->TranslateCode)))
#define WRITE_PAS(pGDI, port, data) \
WRITE_PORT_UCHAR((PUCHAR)((port) ^ (pGDI->TranslateCode)), (UCHAR)(data))
// useful bit definitions
#define D0 (1<<0)
#define D1 (1<<1)
#define D2 (1<<2)
#define D3 (1<<3)
#define D4 (1<<4)
#define D5 (1<<5)
#define D6 (1<<6)
#define D7 (1<<7)
//// BIT FIELDS FOR COMPATIBLE_REGISTER_ENABLE
#define MPU_ENABLE_BIT D0
#define SB_ENABLE_BIT D1
#define SB_IRQ_ENABLE_BIT D2 // read only
//// BIT FIELDS FOR FEATURE_ENABLE (0xb88)
#define PCM_FEATURE_ENABLE D0
#define FM_FEATURE_ENABLE D1
#define MIXER_FEATURE_ENABLE D2
#define SB_FEATURE_ENABLE D4
/// BIT FIELDS FOR PCM CONTROL
#define PCM_STEREO D0+D3
#define PCM_DAC D4
#define PCM_MONO D5
#define PCM_ENGINE D6
#define PCM_DRQ D7
/// BIT FIELDS FOR SYSTEM CONFIG 3
#define C3_ENHANCED_TIMER D0
#define C3_SB_CLOCK_EMUL D1 // don't set! see Brian Colvin
#define C3_VCO_INVERT D2
#define C3_INVERT_BCLK D3
#define C3_SYNC_PULSE D4
#define C3_PSEUDO_PCM_STEREO D5
/// BIT FIELDS FOR INTERRUPT ENABLE
#define INT_LEFT_FM D0
#define INT_RIGHT_FM D1
#define INT_SB D1
#define INT_SAMPLE_RATE D2
#define INT_SAMPLE_BUFFER D3
#define INT_MIDI D4
/// BIT FIELDS FOR COMPATIBLE REGISTER ENABLE
#define COMPAT_MPU D0
#define COMPAT_SB D1
/// IRQ POINTER VALUES FOR EMULATION INTERRUPT POINTER
#define EMUL_IRQ_NONE 0
#define EMUL_IRQ_2 1
#define EMUL_IRQ_3 2
#define EMUL_IRQ_5 3
#define EMUL_IRQ_7 4
#define EMUL_IRQ_10 5
#define EMUL_IRQ_11 6
#define EMUL_IRQ_12 7
/// DMA POINTER VALUES FOR EMULATION DMA POINTER
#define EMUL_DMA_NONE 0
#define EMUL_DMA_1 1
#define EMUL_DMA_2 2
#define EMUL_DMA_3 3
/// BIT VALUES FOR FILTER REGISTER
#define FILTER_NOMUTE D5
#define MIXCROSSCAPS_NORMAL_STEREO 0 // Left->Left, Right->Right
#define MIXCROSSCAPS_RIGHT_TO_BOTH 1 // Right->Left, Right->Right
#define MIXCROSSCAPS_LEFT_TO_BOTH 2 // Left->Left, Left->Right
#define MIXCROSSCAPS_REVERSE_STEREO 4 // Left->Right, Right->Left
#define MIXCROSSCAPS_RIGHT_TO_LEFT 8 // Right->Left, Right->Right
#define MIXCROSSCAPS_LEFT_TO_RIGHT 0x10 // Left->Left, Left->Right
#define OUT_AMPLIFIER 0
#define OUT_PCM 1
#define _LEFT 1
#define _RIGHT 2
#define _BASS 0
#define _TREBLE 1
#define MV_508_ADDRESS D7
#define MV_508_INPUT D4
#define MV_508_SWAP D6
#define MV_508_BASS (D0+D1)
#define MV_508_TREBLE (D2)
#define MV_508_EQMODE (D2+D0)
#define MV_508_LOUDNESS D2
#define MV_508_ENHANCE (D1+D0)
/// DEFINES FOR SERIAL MIXER
#define NATIONAL_SELECTMUTE_REG 0x40
#define NATIONAL_LOUD_ENH_REG 0x41
#define NATIONAL_BASS_REG 0x42
#define NATIONAL_TREB_REG 0x43
#define NATIONAL_LEFT_VOL_REG 0x44
#define NATIONAL_RIGHT_VOL_REG 0x45
#define NATIONAL_MODESELECT_REG 0x46
#define NATIONAL_COMMAND D7
#define NATIONAL_LOUDNESS D0
#define NATIONAL_ENHANCE D1
#define SERIAL_MIX_LEVEL D0
#define SERIAL_MIX_CLOCK D1
#define SERIAL_MIX_STROBE D2
#define SERIAL_MIX_MASTER D4
#define SERIAL_MIX_REALSOUND D6
#define SERIAL_MIX_DUALFM D7
// FILTER_REGISTER
#define fFIdatabits 0x1f // 00011111B filter select and decode field bits
#define fFImutebits D5 // filter mute field bit
#define fFIpcmbits (D7+D6) // 11000000B filter sample rate field bits
#define bFImute D5 // filter mute bit
#define bFIsrate D6 // filter sample rate timer mask
#define bFIsbuff D7 // filter sample buffer counter mask
#define FILTERMAX 6 // six possible settings
#define FILTER_MUTE 0 // mute - goes to PC speaker
#define FILTER_LEVEL_1 1 // 20hz to 2.9khz
#define FILTER_LEVEL_2 2 // 20hz to 5.9khz
#define FILTER_LEVEL_3 3 // 20hz to 8.9khz
#define FILTER_LEVEL_4 4 // 20hz to 11.9khz
#define FILTER_LEVEL_5 5 // 20hz to 15.9khz
#define FILTER_LEVEL_6 6 // 20hz to 17.8khz
/// SLAVE_MODE_READ BITS
#define SLAVE_MODE_OPL3 D2
#define SLAVE_MODE_16 D3
#define PASX_IN(pFI, port) \
ScsiPortReadPortUchar(pFI->PROBase + ( (port) ^ pFI->TranslateCode) )
#define PASX_OUT(pFI, port, data) \
ScsiPortWritePortUchar(pFI->PROBase + ((port) ^ pFI->TranslateCode), (UCHAR)(data))
#define WRITE_PORT_UCHAR ScsiPortWritePortUchar
#define READ_PORT_UCHAR ScsiPortReadPortUchar
//
// Exported routines
//
int FindPasHardware(PFOUNDINFO pFoundInfo);
void InitProHardware(PFOUNDINFO pFI);
|