Skip to content

Commit 21daa2f

Browse files
committed
::reset() now works
1 parent 3f1f671 commit 21daa2f

File tree

1 file changed

+44
-22
lines changed

1 file changed

+44
-22
lines changed

src/retrowave.cc

+44-22
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,21 @@ RetroWaveOpl::RetroWaveOpl(const char *filename)
122122
io_prepare();
123123
flush();
124124

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+
125136
for (uint8_t i=0x20; i<0x28; i++)
126137
{
127138
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
129140
io_prepare();
130141
flush();
131142

@@ -172,24 +183,24 @@ void RetroWaveOpl::cmd_prepare(uint8_t io_addr, uint8_t io_reg, const int len)
172183

173184
void RetroWaveOpl::queue_port0(uint8_t reg, uint8_t val)
174185
{
175-
cmd_prepare(RetroWave_Board_OPL3, 0x12, 6);
186+
cmd_prepare(RetroWave_Board_OPL3, 0x12, 6); // GPIOA register
176187
cmd_buffer[cmd_buffer_used++] = 0xe1;
177188
cmd_buffer[cmd_buffer_used++] = reg;
178189
cmd_buffer[cmd_buffer_used++] = 0xe3;
179190
cmd_buffer[cmd_buffer_used++] = val;
180191
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
182193
}
183194

184195
void RetroWaveOpl::queue_port1(uint8_t reg, uint8_t val)
185196
{
186-
cmd_prepare(RetroWave_Board_OPL3, 0x12, 6);
197+
cmd_prepare(RetroWave_Board_OPL3, 0x12, 6); // GPIOA register
187198
cmd_buffer[cmd_buffer_used++] = 0xe5;
188199
cmd_buffer[cmd_buffer_used++] = reg;
189200
cmd_buffer[cmd_buffer_used++] = 0xe7;
190201
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
193204
}
194205

195206
void RetroWaveOpl::reset(void)
@@ -200,62 +211,73 @@ void RetroWaveOpl::reset(void)
200211
flush();
201212
}
202213

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
204216
cmd_buffer[cmd_buffer_used++] = 0xfe;
217+
cmd_buffer[cmd_buffer_used++] = 0x00; // Retrowave express OPL3 seems to only like even data writes
205218
io_prepare();
206219
flush();
207220

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
209224
cmd_buffer[cmd_buffer_used++] = 0xff;
225+
cmd_buffer[cmd_buffer_used++] = 0x00; // Retrowave express OPL3 seems to only like even data writes
210226
io_prepare();
211227
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
212231
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++)
217238
{
218239
queue_port0 (i, 0);
219240
queue_port1 (i, 0);
220241
}
221-
for (int i=0xa0; i < 0xa8; i++)
242+
for (int i=0xa0; i <= 0xa8; i++)
222243
{
223244
queue_port0 (i, 0);
224245
queue_port1 (i, 0);
225246
}
226-
for (int i=0xb0; i < 0xb8; i++)
247+
for (int i=0xb0; i <= 0xb8; i++)
227248
{
228249
queue_port0 (i, 0);
229250
queue_port1 (i, 0);
230251
}
231-
for (int i=0xbd; i < 0xbd; i++)
252+
for (int i=0xbd; i <= 0xbd; i++)
232253
{
233254
queue_port0 (i, 0);
234255
queue_port1 (i, 0);
235256
}
236-
for (int i=0xc0; i < 0xc8; i++)
257+
for (int i=0xc0; i <= 0xc8; i++)
237258
{
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
240261
}
241-
for (int i=0xe0; i < 0xf5; i++)
262+
for (int i=0xe0; i <= 0xf5; i++)
242263
{
243264
queue_port0 (i, 0);
244265
queue_port1 (i, 0);
245266
}
246-
for (int i=0x08; i < 0x08; i++)
267+
for (int i=0x08; i <= 0x08; i++)
247268
{
248269
queue_port0 (i, 0);
249270
queue_port1 (i, 0);
250271
}
251-
for (int i=0x01; i < 0x01; i++)
272+
for (int i=0x01; i <= 0x01; i++)
252273
{
253274
queue_port0 (i, 0);
254275
queue_port1 (i, 0);
255276
}
256-
queue_port1 (5, 0);
277+
queue_port1 (5, 0); // OPL2 mode
257278
io_prepare();
258279
flush();
280+
#endif
259281
}
260282

261283
void RetroWaveOpl::io_prepare(void)

0 commit comments

Comments
 (0)