shithub: choc

Download patch

ref: 3cf08f9fb0c92bb652f8ffd901d278c6aa5123be
parent: 24de817166ec71773d7da1da7723cb415333ee18
parent: c801dd12755410845bbcb5ed80fe06c8d75ebec9
author: Simon Howard <[email protected]>
date: Wed Jul 13 19:38:48 EDT 2016

Merge pull request #750 from nukeykt/nukedopl174

opl: Nuked OPL3 v1.7.4

--- a/opl/opl3.c
+++ b/opl/opl3.c
@@ -21,7 +21,7 @@
 //      OPLx decapsulated(Matthew Gambrell, Olli Niemitalo):
 //          OPL2 ROMs.
 //
-// version: 1.7.3
+// version: 1.7.4
 //
 
 #include <stdio.h>
@@ -126,7 +126,7 @@
     0x3d4, 0x3da, 0x3df, 0x3e4, 0x3ea, 0x3ef, 0x3f5, 0x3fa
 };
 
-// 
+//
 // freq mult table multiplied by 2
 //
 // 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 12, 12, 15, 15
@@ -1201,9 +1201,13 @@
 
     chip->timer++;
 
-    while (chip->writebuf_cur != chip->writebuf_last
-        && chip->writebuf[chip->writebuf_cur].time <= chip->writebuf_samplecnt)
+    while (chip->writebuf[chip->writebuf_cur].time <= chip->writebuf_samplecnt)
     {
+        if (!(chip->writebuf[chip->writebuf_cur].reg & 0x200))
+        {
+            break;
+        }
+        chip->writebuf[chip->writebuf_cur].reg &= 0x1ff;
         OPL3_WriteReg(chip, chip->writebuf[chip->writebuf_cur].reg,
                       chip->writebuf[chip->writebuf_cur].data);
         chip->writebuf_cur = (chip->writebuf_cur + 1) % OPL_WRITEBUF_SIZE;
@@ -1374,8 +1378,18 @@
 void OPL3_WriteRegBuffered(opl3_chip *chip, Bit16u reg, Bit8u v)
 {
     Bit64u time1, time2;
-    chip->writebuf[chip->writebuf_last % OPL_WRITEBUF_SIZE].reg = reg;
-    chip->writebuf[chip->writebuf_last % OPL_WRITEBUF_SIZE].data = v;
+
+    if (chip->writebuf[chip->writebuf_last].reg & 0x200)
+    {
+        OPL3_WriteReg(chip, chip->writebuf[chip->writebuf_last].reg & 0x1ff,
+                      chip->writebuf[chip->writebuf_last].data);
+
+        chip->writebuf_cur = (chip->writebuf_last + 1) % OPL_WRITEBUF_SIZE;
+        chip->writebuf_samplecnt = chip->writebuf[chip->writebuf_last].time;
+    }
+
+    chip->writebuf[chip->writebuf_last].reg = reg | 0x200;
+    chip->writebuf[chip->writebuf_last].data = v;
     time1 = chip->writebuf_lasttime + OPL_WRITEBUF_DELAY;
     time2 = chip->writebuf_samplecnt;
 
@@ -1384,7 +1398,7 @@
         time1 = time2;
     }
 
-    chip->writebuf[chip->writebuf_last % OPL_WRITEBUF_SIZE].time = time1;
+    chip->writebuf[chip->writebuf_last].time = time1;
     chip->writebuf_lasttime = time1;
     chip->writebuf_last = (chip->writebuf_last + 1) % OPL_WRITEBUF_SIZE;
 }
@@ -1392,7 +1406,7 @@
 void OPL3_GenerateStream(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples)
 {
     Bit32u i;
-	
+
     for(i = 0; i < numsamples; i++)
     {
         OPL3_GenerateResampled(chip, sndptr);
--- a/opl/opl3.h
+++ b/opl/opl3.h
@@ -21,7 +21,7 @@
 //      OPLx decapsulated(Matthew Gambrell, Olli Niemitalo):
 //          OPL2 ROMs.
 //
-// version: 1.7.3
+// version: 1.7.4
 //
 
 #ifndef OPL_OPL3_H
@@ -114,7 +114,7 @@
     Bit16s zeromod;
     Bit32s mixbuff[2];
     //OPL3L
-    Bit32s rateratio; 
+    Bit32s rateratio;
     Bit32s samplecnt;
     Bit16s oldsamples[2];
     Bit16s samples[2];