[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]
{
KAI ROHRBACHER
As promised, here is some TP-code to check whether your machine
supports the extended timing services of the AT's-BIOS: if all works
fine, the Program should give two beeps, the 2nd exactly 5secs after
the 1st one -and then terminate.
(To all others reading this: this timing scheme normally works
_asynchrone_ to whatever you are doing in the "foreground" Program and
thus is great For timing events. What's more: the clock has a
resolution of some microseconds!)
}
Const
WaitTime = 5000;
Var
IsAT,
TimeFlag : Byte;
CycleTime : LongInt;
Function AT : Boolean;
{ in: - }
{out: True/False, if the machine is (at least) an AT}
begin
AT := MEM[$F000 : $FFFE] = $FC;
end;
Procedure SetWaitingTime(milliseconds : Word);
{ in: milliseconds = time to wait in ms}
{out: CycleTime := that same value in microseconds}
{ TimeFlag := $80}
{rem: won't work With PC's}
begin
TimeFlag := $80;
CycleTime := LongInt(milliseconds) * LongInt(1000);
if (milliseconds <> 0) and AT then
IsAT := 0 {yes, use timing mechanism}
else
IsAT := $80; {no, don't use that extended service}
end;
Procedure Wait;
begin
Asm
MOV AL, IsAT
or AL, AL
JNE @L11
MOV TimeFlag,AL
MOV DX, Word PTR CycleTime
MOV CX, Word PTR CycleTime+2
MOV BX, OFFSET TimeFlag
MOV AX, DS
MOV ES, AX
MOV AX, 8300h
INT 15h
@L11:
@L10:
MOV AL, TimeFlag {look at bit 7: 1/0 = time over/not over}
and AL, $80
JE @L10
end;
end;
begin
if not AT then
begin
WriteLN('Sorry, this Program requires the extended BIOS-' +
'services, available on AT''s only!');
Halt(1);
end;
WriteLN('The time between the two beeps should be exactly ', WaitTime,
' milliseconds!');
Write(#7);
SetWaitingTime(5000);
Wait;
Write(#7);
end.
[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]