From 9a34d7bd322255b71477dc76f242a2841ae23b2c Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Sat, 22 Mar 2003 08:52:20 +0000 Subject: [PATCH] Fixes to pit timer mode 0 Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@783 --- src/hardware/timer.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/hardware/timer.cpp b/src/hardware/timer.cpp index 75f6d3dd..4194f53c 100644 --- a/src/hardware/timer.cpp +++ b/src/hardware/timer.cpp @@ -49,38 +49,44 @@ static PIT_Block pit[3]; static void PIT0_Event(void) { PIC_ActivateIRQ(0); - PIC_AddEvent(PIT0_Event,pit[0].micro); + if (pit[0].mode!=0) PIC_AddEvent(PIT0_Event,pit[0].micro); } static void counter_latch(Bitu counter) { /* Fill the read_latch of the selected counter with current count */ PIT_Block * p=&pit[counter]; - + Bit64s micro=PIC_MicroCount()-p->start; + switch (p->mode) { case 0: /* Interrupt on Terminal Count */ /* Counter keeps on counting after passing terminal count */ - micro%=p->micro; - p->read_latch=(Bit16u)(p->cntr-(((float)micro/(float)p->micro)*(float)p->cntr)); + if (micro>p->micro) { + micro-=p->micro; + micro%=(Bit64u)(1000000/((float)PIT_TICK_RATE/(float)0x10000)); + p->read_latch=(Bit16u)(0x10000-(((double)micro/(double)p->micro)*(double)0x10000)); + } else { + p->read_latch=(Bit16u)(p->cntr-(((double)micro/(double)p->micro)*(double)p->cntr)); + } break; case 2: /* Rate Generator */ micro%=p->micro; - p->read_latch=(Bit16u)(p->cntr-(((float)micro/(float)p->micro)*(float)p->cntr)); + p->read_latch=(Bit16u)(p->cntr-(((double)micro/(double)p->micro)*(double)p->cntr)); break; case 3: /* Square Wave Rate Generator */ micro%=p->micro; micro*=2; if (micro>p->micro) micro-=p->micro; - p->read_latch=(Bit16u)(p->cntr-(((float)micro/(float)p->micro)*(float)p->cntr)); + p->read_latch=(Bit16u)(p->cntr-(((double)micro/(double)p->micro)*(double)p->cntr)); break; case 4: /* Software Triggered Strobe */ if (micro>p->micro) p->read_latch=p->write_latch; - else p->read_latch=(Bit16u)(p->cntr-(((float)micro/(float)p->micro)*(float)p->cntr)); + else p->read_latch=(Bit16u)(p->cntr-(((double)micro/(double)p->micro)*(double)p->cntr)); break; default: LOG(LOG_ERROR|LOG_PIT,"Illegal Mode %d for reading counter %d",p->mode,counter); micro%=p->micro; - p->read_latch=(Bit16u)(p->cntr-(((float)micro/(float)p->micro)*(float)p->cntr)); + p->read_latch=(Bit16u)(p->cntr-(((double)micro/(double)p->micro)*(double)p->cntr)); break; } }