--- xmil/timing.c 2004/08/07 07:19:56 1.2 +++ xmil/timing.c 2004/08/14 12:16:17 1.3 @@ -1,14 +1,17 @@ #include "compiler.h" -#include "timing.h" +#include "pccore.h" +#include "diskdrv.h" #include "fdd_mtr.h" +#include "timing.h" -static const UINT8 tick3[3] = {16, 17, 17}; +#define MSSHIFT 16 typedef struct { UINT32 tick; + UINT32 msstep; UINT cnt; - UINT fraction; + UINT32 fraction; } TIMING; static TIMING timing; @@ -21,6 +24,12 @@ void timing_reset(void) { timing.fraction = 0; } +void timing_setrate(UINT32 clock) { + +// timing.msstep = (1 << MSSHIFT) / (clock / 4000); + timing.msstep = (4000 << MSSHIFT) / clock; +} + void timing_setcount(UINT value) { timing.cnt = value; @@ -30,33 +39,20 @@ UINT timing_getcount(void) { UINT32 ticknow; UINT32 span; - UINT32 steps; + UINT32 fraction; ticknow = GETTICK(); span = ticknow - timing.tick; -#if 1 - if (span < tick3[timing.fraction]) { - ticknow = GETTICK(); - span = ticknow - timing.tick; - } -#endif if (span) { - FDDMTR_CALLBACK(ticknow); - if (span >= 50) { - steps = span / 50; - span %= 50; - timing.tick += (steps * 50); - timing.cnt += steps * 3; - } - while(span >= tick3[timing.fraction]) { - span -= tick3[timing.fraction]; - timing.tick += tick3[timing.fraction]; - timing.cnt++; - timing.fraction++; - if (timing.fraction >= 3) { - timing.fraction = 0; - } + timing.tick = ticknow; + fddmtr_callback(ticknow); + + if (span >= 1000) { + span = 1000; } + fraction = timing.fraction + (span * timing.msstep); + timing.cnt += fraction >> MSSHIFT; + timing.fraction = fraction & ((1 << MSSHIFT) - 1); } return(timing.cnt); }