I have the following function (C with assembly) that reads BIOS ticks:
static clock_t clock(void);
#pragma aux clock = \
"pushf" \
"push ds" \
"cli" \
"mov ax, 0x0040" \
"mov ds, ax" \
"mov bx, 0x006C" \
"mov ax, [bx]" \
"sti" \
"pop ds" \
"popf" \
parm [ ax ] \
modify [ ax bx ];
This works, but how much of it is necessary? Can someone help me code golf this a bit? I'm working with 8086 (tiny memory model), and I'm not sure if I need to pushf and popf or cli and sti before reading the value. I'd also appreciate if it's possible to reduce the number operations. I know nothing about far pointers and fudged this together (first time).
You just need to read a word from address
0000:046cto get the low 16 bits of the tick counter. An easy way to do this is to use a far volatile pointer:Other equivalent addresses like
0040:006ccan be used, too.You can then access the ticks counter as such:
Note that this will only give you the low 2 bytes. If you want all bytes, you'll have to disable interrupts to do an atomic read of the whole counter (or loop until convergence).
You can also use the predefined functions
clockor_bios_timeofdayas indicated in the manual for this purpose.