Draeden писал(а):По адресу 0000:0020 находится 4 байта - адрес обработчика INT8 в формате смещение:сегмент. Ты пишешь туда адрес своего far обработчика ...
Зачем такими хакерскими способами заменять адрес обработчика прерываний, есть в Паскале есть ф-ии
GetIntVec
SetIntVec
Вот нашел у себя модуль (unit). "На галзок", как раз делает то, что нужно. Там подцеплен модуль TpCrt из библиотеки Turbo Professional. Но (опять-таки, на глазок), из него используется лишь ф-ия вывода времени на экран
FastText.
Установка exit-процедуры (ExitProc) используется для автоматического восстановления вектора прерывания по завершении работы программы.
Т.е. все, что вам нужно сделать - это подцепить данный модуть к своей программе (возможно, поменяв - из текста Вашей программы, использующей этот модуль - значения XPos и YPos). Все остальное (т.е. показ секундомера и отчет времени) модуль сделает сам.
(Может, в смысле алгоритма, сделано несколько своеобразно [дата последней модификации этого файла - 20.04.1995

], но должно работать. Да и принцип установки своих обработчиков прерывания должен быть понятен)
[syntax='Pascal']
unit BBBtimer;
Interface
const XPos : byte = 1;
YPos : byte = 1;
EnableDrawTime : boolean = false;
BoundSymb : char =':';
Implementation
uses Dos,
TpCrt;
{.$L Time}
var SaveExitProc : pointer;
Save1Ch : pointer;
const Counter : byte = 17;
{ ok : array[1..3] of char = 'ok$';}
{$F+}
var Seconds,Minutes,Houres,TikCounter,FiveSeconds : word;
SecondsSt,MinutesSt,HouresSt : string[2];
procedure UserTimer; interrupt; {external;}
begin
Dec(TikCounter);
if TikCounter=0 then
begin { Increment seconds }
Inc(Seconds);
Dec(FiveSeconds);
if FiveSeconds=0 then
begin
FiveSeconds:=5;
TikCounter:=19;
end
else TikCounter:=18;
if Seconds=60 then
begin
Seconds:=0;
Inc(Minutes);
if Minutes=60 then
begin
Minutes:=0;
Inc(Houres);
if Houres=24 then Houres:=0;
Str(Houres:2,HouresSt);
if HouresSt[1]=' ' then HouresSt[1]:='0';
end; { next hour }
Str(Minutes:2,MinutesSt);
if MinutesSt[1]=' ' then MinutesSt[1]:='0';
end; { next minute }
Str(Seconds:2,SecondsSt);
if SecondsSt[1]=' ' then SecondsSt[1]:='0';
if EnableDrawTime then
FastText(HouresSt+BoundSymb+MinutesSt+BoundSymb+SecondsSt,
YPos,XPos);
end; { next second }
inline($9C/ { PushF }
$FF/$1E/Save1Ch { Call dword ptr Save1Ch }
);
end; { UserTimer }
procedure OurExitProc;
begin
ExitProc:=SaveExitProc;
SetIntVec($1C,Save1Ch);
end; { OurExitProc }
{$F-}
begin
{ Determine DOS time }
GetTime(Houres,Minutes,Seconds,FiveSeconds);
FiveSeconds:=5;
TikCounter:=18;
Str(Houres:2,HouresSt);
if HouresSt[1]=' ' then HouresSt[1]:='0';
Str(Minutes:2,MinutesSt);
if MinutesSt[1]=' ' then MinutesSt[1]:='0';
Str(Seconds:2,SecondsSt);
if SecondsSt[1]=' ' then SecondsSt[1]:='0';
{ Insert ISR into usertimer chain }
GetIntVec($1C,Save1Ch);
SetIntVec($1C,Addr(UserTimer));
SaveExitProc:=ExitProc;
ExitProc:=@OurExitProc;
end.[/syntax]