changeset 2461:a25e8f304343

Fix handling of zero timer value
author Michael Pavone <pavone@retrodev.com>
date Fri, 23 Feb 2024 20:22:00 -0800
parents a4f8fa24764b
children 3b1b7b272311
files ymz263b.c
diffstat 1 files changed, 15 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ymz263b.c	Fri Feb 23 01:16:38 2024 -0800
+++ b/ymz263b.c	Fri Feb 23 20:22:00 2024 -0800
@@ -113,33 +113,29 @@
 	for (; ymz->cycle < target_cycle; ymz->cycle += ymz->clock_inc)
 	{
 		if (timer_ctrl & BIT_ST0) {
-			if (ymz->timers[0]) {
-				ymz->timers[0]--;
-			} else {
+			ymz->timers[0]--;
+			if (!ymz->timers[0]) {
 				ymz->timers[0] = ymz->base_regs[YMZ_TIMER0_HIGH] << 8 | ymz->base_regs[YMZ_TIMER0_LOW];
 				ymz->status |= STATUS_T0;
 			}
 		}
 		if (timer_ctrl & BIT_STBC) {
-			if (ymz->timers[3]) {
-				ymz->timers[3]--;
-			} else {
+			ymz->timers[3]--;
+			if (!ymz->timers[3]) {
 				ymz->timers[3] = ymz->base_regs[YMZ_TIMER1] << 8 & 0xF00;
 				ymz->timers[3] |= ymz->base_regs[YMZ_TIMER_BASE];
 				
 				if (timer_ctrl & BIT_ST1) {
-					if (ymz->timers[1]) {
-						ymz->timers[1]--;
-					} else {
+					ymz->timers[1]--;
+					if (!ymz->timers[1]) {
 						ymz->timers[1] = ymz->base_regs[YMZ_TIMER1] >> 4;
 						ymz->status |= STATUS_T1;
 					}
 				}
 				
 				if (timer_ctrl & BIT_ST2) {
-					if (ymz->timers[2]) {
-						ymz->timers[2]--;
-					} else {
+					ymz->timers[2]--;
+					if (!ymz->timers[2]) {
 						ymz->timers[2] = ymz->base_regs[YMZ_TIMER2_HIGH] << 8 | ymz->base_regs[YMZ_TIMER2_LOW];
 						ymz->status |= STATUS_T2;
 					}
@@ -194,23 +190,26 @@
 		enabled_ints &= 1;
 	}
 	if (enabled_ints & BIT_ST0) {
-		uint32_t t0 = ymz->cycle + (ymz->timers[0] + 1) * ymz->clock_inc;
+		uint32_t t0 = ymz->cycle + (ymz->timers[0] ? ymz->timers[0] : 0x10000) * ymz->clock_inc;
 		if (t0 < ret) {
 			ret = t0;
 		} 
 	}
 	if (enabled_ints & (BIT_ST1|BIT_ST2)) {
-		uint32_t base = ymz->cycle + (ymz->timers[3] + 1) * ymz->clock_inc;
+		uint32_t base = ymz->cycle + (ymz->timers[3] ? ymz->timers[3] : 0x1000) * ymz->clock_inc;
 		if (base < ret) {
 			uint32_t load = (ymz->base_regs[YMZ_TIMER1] << 8 & 0xF00) | ymz->base_regs[YMZ_TIMER_BASE];
+			if (!load) {
+				load = 0x1000;
+			}
 			if (enabled_ints & BIT_ST1) {
-				uint32_t t1 = ymz->timers[1] * (load + 1) * ymz->clock_inc;
+				uint32_t t1 = (ymz->timers[1] ? ymz->timers[1] - 1 : 0xF) * load * ymz->clock_inc;
 				if (t1 < ret) {
 					ret = t1;
 				}
 			}
 			if (enabled_ints & BIT_ST2) {
-				uint32_t t2 = ymz->timers[2] * (load + 1) * ymz->clock_inc;
+				uint32_t t2 = (ymz->timers[2] ? ymz->timers[2] - 1 : 0xFFFF) * load * ymz->clock_inc;
 				if (t2 < ret) {
 					ret = t2;
 				}