| |
8253 Programmable Interval Timer (PIT)
Port 40h, 8253 Counter 0 divisor (mode 3)
Port 41h, 8253 Counter 1 RAM refresh counter (mode 2)
Port 42h, 8253 Counter 2 Cassette and Speaker functions
Port 43h, 8253 Mode control, data format:
Mode
Control |
Bit |
Dec |
Hex |
Description |
0 |
1 |
01h |
0
binary counter decrementing
1 BCD counter decrementing |
1 |
2 |
02h |
000
mode 0, countdown with optional inhibit (level output)
001 mode 1, countdown with optional restart (level output)
010 mode 2, generate one pulse out of N (used for DMA
refresh)
011 mode 3, generate square wave for channels 0 and 2
100 mode 4, countdown with optional inhibit (pulse output)
101 mode 5, countdown with optional restart (pulse output) |
2 |
4 |
04h |
3 |
8 |
08h |
4 |
16 |
10h |
00
latch present counter value
01 read/write of MSB
10 read/write of LSB
11 read/write LSB, followed by write of MSB |
5 |
32 |
20h |
6 |
64 |
40h |
00
select counter 0
01 select counter 1
10 select counter 2 |
7 |
128 |
80h |
Example code:
timer_countdn equ 7FFFh ; approx 36 interrupts per second
cli
mov al,00110110b ; bit 7,6 = (00) timer counter 0
; bit 5,4 = (11) write LSB then MSB
; bit 3-1 = (011) generate square wave
; bit 0 = (0) binary counter
out 43h,al ; prep PIT, counter 0, square wave&init count
mov cx,timer_countdn ; default is 0xFFFF (18.2 times per second)
; interrupts when counter decrements to 0
mov al,cl ; send LSB of timer count
out 40h,al
mov al,ch ; send MSB of timer count
out 40h,al
sti |