Mateusz Viste
2022-08-17 10:01:58 UTC
Hi,
I am playing a little with feeding the DAC of my SoundBlaster card with
raw samples that I am trying to time accurately.
The "obvious" way to do such thing is to use DMA transfers and
let the SoundBlaster chip control the sampling. That's not what I am
doing for the moment. I use the SoundBlaster DAC directly and write 8
bit samples to it in real time. Yes, it is not CPU-efficient, does not
allow to play things in background, etc. but please indulge me and
consider this a thought exercise.
So here's the question: Is there any kind of timer available on the PC
that would allow to generate some 8 kHz samples? I mean, besides the
obvious PIT of course. Some hidden VGA register maybe? A way to abuse a
timer in the SoundBlaster or Adlib hardware? Some creative
polling of a port or keyboard controller?
So far, the timers I know about are those:
- VGA VSYNC (tied to screen's refresh rate, ie. 50-60 Hz or so)
- calibrated busy loop (meh)
- PIT (18.2 Hz default, changing it doesn't work under Windows)
- BIOS "system clock" (sourced by the PIT, really)
- TSC (requires a Pentium+ CPU)
- APIC (modern CPUs only)
- CMOS RTC clock (ports 0x70 & 0x71, fixed at 1024 Hz)*
Anything else?
Mateusz
*a pretty nice article about abusing the RTC clock here:
https://web.archive.org/web/20150514074601/http://www.nondot.org/sabre/os/files/MiscHW/CMOSTimer.html
I am playing a little with feeding the DAC of my SoundBlaster card with
raw samples that I am trying to time accurately.
The "obvious" way to do such thing is to use DMA transfers and
let the SoundBlaster chip control the sampling. That's not what I am
doing for the moment. I use the SoundBlaster DAC directly and write 8
bit samples to it in real time. Yes, it is not CPU-efficient, does not
allow to play things in background, etc. but please indulge me and
consider this a thought exercise.
So here's the question: Is there any kind of timer available on the PC
that would allow to generate some 8 kHz samples? I mean, besides the
obvious PIT of course. Some hidden VGA register maybe? A way to abuse a
timer in the SoundBlaster or Adlib hardware? Some creative
polling of a port or keyboard controller?
So far, the timers I know about are those:
- VGA VSYNC (tied to screen's refresh rate, ie. 50-60 Hz or so)
- calibrated busy loop (meh)
- PIT (18.2 Hz default, changing it doesn't work under Windows)
- BIOS "system clock" (sourced by the PIT, really)
- TSC (requires a Pentium+ CPU)
- APIC (modern CPUs only)
- CMOS RTC clock (ports 0x70 & 0x71, fixed at 1024 Hz)*
Anything else?
Mateusz
*a pretty nice article about abusing the RTC clock here:
https://web.archive.org/web/20150514074601/http://www.nondot.org/sabre/os/files/MiscHW/CMOSTimer.html