Секундомер в программе - Pascal

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
BSP
Сообщения: 23
Зарегистрирован: 01 дек 2007, 21:28

Привет всем.
У меня вопросик.
Я например хочу вставить в программу секундомер, но при этом, чтобы я мог работать в своей программе, т.е. нажимать на клавиши, ну кароче выполнять функции своей программы а в углу экрана при этом бежали цифорки каждую секунду :) )
как мне такое осуществить?
Draeden
Сообщения: 14
Зарегистрирован: 04 май 2008, 19:45
Контактная информация:

Ставишь хук на таймер и в нём выводишь время. По адресу 0000:0020 находится 4 байта - адрес обработчика INT8 в формате смещение:сегмент. Ты пишешь туда адрес своего far обработчика в котором не забываешь вызывать заменённый обработчик INT8 попутно печатая время.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Тока не надо INT 8 трогать, для таких целей специально есть прерывание INT 1C. Стандартный INT 8 обработчик помимо счетчиков выполняет другие немаловажные вещи.
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

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]
BSP
Сообщения: 23
Зарегистрирован: 01 дек 2007, 21:28

Спасибо большое BBB, а также
somewhere и Draeden за тренировку мозгов :)
Ответить