@@ -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
173184void 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
184195void 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
195206void 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
261283void RetroWaveOpl::io_prepare (void )
0 commit comments