@@ -122,10 +122,21 @@ RetroWaveOpl::RetroWaveOpl(const char *filename)
122
122
io_prepare ();
123
123
flush ();
124
124
125
+ /* GPIOA.0 = /IC Initial clear (Reset)
126
+ * GPIOA.1 = A0 Low=Address, High=Data
127
+ * GPIOA.2 = A1 Low=Bank0, High=Bank1
128
+ * GPIOA.3 = /WR Write enable
129
+ * GPIOA.4 = /CS Chip Select
130
+ * GPIOA.5 =
131
+ * GPIOA.6 =
132
+ * GPIOA.7 =
133
+ * GPIOB[0:7] = D[0:7]
134
+ */
135
+
125
136
for (uint8_t i=0x20 ; i<0x28 ; i++)
126
137
{
127
138
cmd_prepare ((uint8_t )(i<<1 ), 0x0a , 1 ); // IOCON register
128
- cmd_buffer[cmd_buffer_used++] = 0x28 ; // Enable: HAEN, SEQOP
139
+ cmd_buffer[cmd_buffer_used++] = 0x28 ; // HAEN=1 SEQOP=1 BANK=0
129
140
io_prepare ();
130
141
flush ();
131
142
@@ -172,24 +183,24 @@ void RetroWaveOpl::cmd_prepare(uint8_t io_addr, uint8_t io_reg, const int len)
172
183
173
184
void RetroWaveOpl::queue_port0 (uint8_t reg, uint8_t val)
174
185
{
175
- cmd_prepare (RetroWave_Board_OPL3, 0x12 , 6 );
186
+ cmd_prepare (RetroWave_Board_OPL3, 0x12 , 6 ); // GPIOA register
176
187
cmd_buffer[cmd_buffer_used++] = 0xe1 ;
177
188
cmd_buffer[cmd_buffer_used++] = reg;
178
189
cmd_buffer[cmd_buffer_used++] = 0xe3 ;
179
190
cmd_buffer[cmd_buffer_used++] = val;
180
191
cmd_buffer[cmd_buffer_used++] = 0xfb ;
181
- cmd_buffer[cmd_buffer_used++] = val;
192
+ cmd_buffer[cmd_buffer_used++] = val; // Retrowave express OPL3 seems to only like even data writes
182
193
}
183
194
184
195
void RetroWaveOpl::queue_port1 (uint8_t reg, uint8_t val)
185
196
{
186
- cmd_prepare (RetroWave_Board_OPL3, 0x12 , 6 );
197
+ cmd_prepare (RetroWave_Board_OPL3, 0x12 , 6 ); // GPIOA register
187
198
cmd_buffer[cmd_buffer_used++] = 0xe5 ;
188
199
cmd_buffer[cmd_buffer_used++] = reg;
189
200
cmd_buffer[cmd_buffer_used++] = 0xe7 ;
190
201
cmd_buffer[cmd_buffer_used++] = val;
191
- cmd_buffer[cmd_buffer_used++] = 0xfb ;
192
- cmd_buffer[cmd_buffer_used++] = val;
202
+ cmd_buffer[cmd_buffer_used++] = 0xff ;
203
+ cmd_buffer[cmd_buffer_used++] = val; // Retrowave express OPL3 seems to only like even data writes
193
204
}
194
205
195
206
void RetroWaveOpl::reset (void )
@@ -200,62 +211,73 @@ void RetroWaveOpl::reset(void)
200
211
flush ();
201
212
}
202
213
203
- cmd_prepare (RetroWave_Board_OPL3, 0x12 , 1 );
214
+ #if 1 /* reset using /IC pin */
215
+ cmd_prepare (RetroWave_Board_OPL3, 0x12 , 1 ); // GPIOA register
204
216
cmd_buffer[cmd_buffer_used++] = 0xfe ;
217
+ cmd_buffer[cmd_buffer_used++] = 0x00 ; // Retrowave express OPL3 seems to only like even data writes
205
218
io_prepare ();
206
219
flush ();
207
220
208
- cmd_prepare (RetroWave_Board_OPL3, 0x12 , 1 );
221
+ usleep (1700 ); // chip needs about 1.6ms to safely reset
222
+
223
+ cmd_prepare (RetroWave_Board_OPL3, 0x12 , 1 ); // GPIOA register
209
224
cmd_buffer[cmd_buffer_used++] = 0xff ;
225
+ cmd_buffer[cmd_buffer_used++] = 0x00 ; // Retrowave express OPL3 seems to only like even data writes
210
226
io_prepare ();
211
227
flush ();
228
+ #else /* reset by defaulting all registers */
229
+ queue_port1 (5, 1); // Enable OPL3 mode
230
+ queue_port1 (4, 0); // Disable all 4-OP connections
212
231
213
- queue_port1 (5 , 1 );
214
- queue_port1 (4 , 0 );
215
-
216
- for (int i=0x20 ; i < 0x35 ; i++)
232
+ for (int i=0x20; i <= 0x35; i++)
233
+ {
234
+ queue_port0 (i, 0);
235
+ queue_port1 (i, 0);
236
+ }
237
+ for (int i=0x40; i <= 0x45; i++)
217
238
{
218
239
queue_port0 (i, 0);
219
240
queue_port1 (i, 0);
220
241
}
221
- for (int i=0xa0 ; i < 0xa8 ; i++)
242
+ for (int i=0xa0; i <= 0xa8; i++)
222
243
{
223
244
queue_port0 (i, 0);
224
245
queue_port1 (i, 0);
225
246
}
226
- for (int i=0xb0 ; i < 0xb8 ; i++)
247
+ for (int i=0xb0; i <= 0xb8; i++)
227
248
{
228
249
queue_port0 (i, 0);
229
250
queue_port1 (i, 0);
230
251
}
231
- for (int i=0xbd ; i < 0xbd ; i++)
252
+ for (int i=0xbd; i <= 0xbd; i++)
232
253
{
233
254
queue_port0 (i, 0);
234
255
queue_port1 (i, 0);
235
256
}
236
- for (int i=0xc0 ; i < 0xc8 ; i++)
257
+ for (int i=0xc0; i <= 0xc8; i++)
237
258
{
238
- queue_port0 (i, 0x30 );
239
- queue_port1 (i, 0x30 );
259
+ queue_port0 (i, 0x30); // Enable Left and Right
260
+ queue_port1 (i, 0x30); // Enable Left and Right
240
261
}
241
- for (int i=0xe0 ; i < 0xf5 ; i++)
262
+ for (int i=0xe0; i <= 0xf5; i++)
242
263
{
243
264
queue_port0 (i, 0);
244
265
queue_port1 (i, 0);
245
266
}
246
- for (int i=0x08 ; i < 0x08 ; i++)
267
+ for (int i=0x08; i <= 0x08; i++)
247
268
{
248
269
queue_port0 (i, 0);
249
270
queue_port1 (i, 0);
250
271
}
251
- for (int i=0x01 ; i < 0x01 ; i++)
272
+ for (int i=0x01; i <= 0x01; i++)
252
273
{
253
274
queue_port0 (i, 0);
254
275
queue_port1 (i, 0);
255
276
}
256
- queue_port1 (5 , 0 );
277
+ queue_port1 (5, 0); // OPL2 mode
257
278
io_prepare();
258
279
flush();
280
+ #endif
259
281
}
260
282
261
283
void RetroWaveOpl::io_prepare (void )
0 commit comments