audio fixes for overdrive demo
authorkub <derkub@gmail.com>
Sun, 26 Jan 2020 19:12:18 +0000 (20:12 +0100)
committerkub <derkub@gmail.com>
Sun, 26 Jan 2020 19:12:18 +0000 (20:12 +0100)
cpu/cz80/cz80.c
cpu/cz80/cz80_op.c
pico/memory.c
pico/pico_int.h
pico/sound/ym2612_arm.S

index 6b9afcd..51abc40 100644 (file)
@@ -278,7 +278,8 @@ Cz80_Check_Interrupt:
                                CPU->ICount -= CPU->ExtraCycles;\r
                                CPU->ExtraCycles = 0;\r
                        }\r
-                       goto Cz80_Exec;\r
+                       if (!CPU->HaltState)\r
+                               goto Cz80_Exec;\r
                }\r
        }\r
        else CPU->ICount = 0;\r
index 5d623ca..317e958 100644 (file)
@@ -687,7 +687,6 @@ OP_CCF:
        OP(0x76):   // HALT\r
 OP_HALT:\r
                CPU->HaltState = 1;\r
-//             CPU->ICount = 0;\r
                goto Cz80_Check_Interrupt;\r
 \r
        OP(0xf3):   // DI\r
index 1d9b913..d61491c 100644 (file)
@@ -733,8 +733,10 @@ static void PicoWrite8_vdp(u32 a, u32 d)
 \r
 static void PicoWrite16_vdp(u32 a, u32 d)\r
 {\r
-  if ((a & 0x00f9) == 0x0010) // PSG Sound\r
+  if ((a & 0x00f9) == 0x0010) // PSG Sound\r
     psg_write_68k(d);\r
+    return;\r
+  }\r
   if ((a & 0x00e0) == 0x0000) {\r
     PicoVideoWrite(a, d);\r
     return;\r
@@ -898,10 +900,10 @@ void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new)
   int xcycles = z80_cycles << 8;\r
 \r
   /* check for overflows */\r
-  if ((mode_old & 4) && xcycles > Pico.t.timer_a_next_oflow)\r
+  if ((mode_old & 4) && xcycles >= Pico.t.timer_a_next_oflow)\r
     ym2612.OPN.ST.status |= 1;\r
 \r
-  if ((mode_old & 8) && xcycles > Pico.t.timer_b_next_oflow)\r
+  if ((mode_old & 8) && xcycles >= Pico.t.timer_b_next_oflow)\r
     ym2612.OPN.ST.status |= 2;\r
 \r
   /* update timer a */\r
index 58d3da8..70bfa71 100644 (file)
@@ -822,10 +822,10 @@ void ym2612_pack_state(void);
 void ym2612_unpack_state(void);\r
 \r
 #define TIMER_NO_OFLOW 0x70000000\r
-// tA =   72 * (1024 - NA) / M\r
-#define TIMER_A_TICK_ZCYCLES  17203\r
-// tB = 1152 * (256 - NA) / M\r
-#define TIMER_B_TICK_ZCYCLES 262800 // 275251 broken, see Dai Makaimura\r
+// tA =   72 * (1024 - NA) / M, with M = mclock/2 -> tick = 72 * 2/mclock\r
+#define TIMER_A_TICK_ZCYCLES  17203 // zcycles = Q8*tick*zclock = Q8*77*2*7/15\r
+// tB = 1152 * (256 - NA) / M,\r
+#define TIMER_B_TICK_ZCYCLES 275251 // zcycles = Q8*1152*2*7/15\r
 \r
 #define timers_cycle() \\r
   if (Pico.t.timer_a_next_oflow > 0 && Pico.t.timer_a_next_oflow < TIMER_NO_OFLOW) \\r
@@ -837,7 +837,8 @@ void ym2612_unpack_state(void);
 #define timers_reset() \\r
   Pico.t.timer_a_next_oflow = Pico.t.timer_b_next_oflow = TIMER_NO_OFLOW; \\r
   Pico.t.timer_a_step = TIMER_A_TICK_ZCYCLES * 1024; \\r
-  Pico.t.timer_b_step = TIMER_B_TICK_ZCYCLES * 256;\r
+  Pico.t.timer_b_step = TIMER_B_TICK_ZCYCLES * 256; \\r
+  ym2612.OPN.ST.status &= ~3;\r
 \r
 \r
 // videoport.c\r
index 4cb9285..e3ec370 100644 (file)
 .macro update_ssg_eg
     ldrh    r0, [r5,#0x30]                @ ssg+ssgn
     ldrb    r2, [r5,#0x17]                @ state
+    and     r3, r0, #0x08
+    cmp     r3, #0x08                     @ ssg enabled &&
     ldrh    r3, [r5,#0x1a]                @ volume
-    cmp     r0, #0x08                     @ ssg enabled &&
     cmpge   r2, #EG_REL+1                 @   state > EG_REL &&
     cmpge   r3, #0x200                    @   volume >= 0x200?
     blt     9f