Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

Может кто еще помнит... Dos прерывания, время/система   Найти похожие ветки 

 
sniknik ©   (2003-10-05 02:56) [0]

При использовании в прерывании по времени (1Сh/08h) функций использующих системное (21h) прерывание (конкретно получение даты и времени) система виснет. :о(
Как бы это исправить или обойти? В смысле нужно время и дата, откуда неважно.
Почему так в принципе понятно int 21h сам время использует, видать гдето циклится, а может паскаль в этих функциях чегото не то делает (надо будет после самому через прерывание попробовать), еще чегото смутно припоминается про SwapVectors зачемто делалось и может связано? возможно нужно убрать это обратно.

Давно на паскале не писал. На всякий случай код

установка своего прерывания

{$M $800,0,0 }
uses dos, mems, send;

var
Tic: integer;
WorkEnable: boolean;
OldTimeIntVec: Procedure;

{$F+}
procedure NewTimer; interrupt;
begin
if WorkEnable then begin
WorkEnable:= false;
if Tic < 18 then Tic:= Tic + 1
else begin
SendBlock(ReadMem(Packet.Data)); {вот сдесь вешается}
Tic:= 0;
end;
WorkEnable:= true;
end;
inline($9C);
OldTimeIntVec;
end;
{$F-}

begin

FillSendBlock;
GetIntVec($1C { $08},@OldTimeIntVec);
SetIntVec($1C { $08},Addr(NewTimer));
WorkEnable:= true;

Keep(0);
end.


в процедуре SendBlock вызываются

GetDate(Packet.DateTime.Year,
Packet.DateTime.Month,
Packet.DateTime.Day,
Packet.DateTime.Hour);
и
GetTime(Packet.DateTime.Hour,
Packet.DateTime.Min,
Packet.DateTime.Sec,
Packet.DateTime.MSec);
если их убрать, все чудно. Но если хоть одна из них есть вешается на первой же посылке. Даже скорее не на посылке т.к. первая посылается и время присутствует а на выходе из нее если вызываются эти процедуры. (не делают ли они SwapVectors у себя внутри? и портят таким образом возврат?) Нда, вроде так, первым делом надо завтра попробовать их переписать через прерывание.

Но может еще чего попробовать? гденибудь в биосе время прочитать, без 21h?(где?, адрес,порт)


 
Германн ©   (2003-10-05 03:48) [1]

Помоему, кое-что из ДОСа еще помнится. А именно, прерывания 1С/08h - есть прерывания BIOS и уж никак они не могут использовать прерывание более высокого уровня, т.е. прерывание 21h - прерывание DOS.
Это раз.
Не хило бы подробнее привести коды SendBlock и тех функций, которые внутри нее.


 
sniknik ©   (2003-10-05 10:58) [2]

Германн © (05.10.03 03:48) [1]
> Не хило бы подробнее привести коды SendBlock и тех функций, которые внутри нее.
Ничего это не даст. Т.к. дело именно в них, без них работает а с ними нет. Даже если кроме них ничего нет.

т.е. просто

begin
GetDate(...);
GetTime(...);
end;

дает тот же эффект.

> ... и уж никак они не могут использовать прерывание более высокого уровня ...
про то и вопрос, как время внутри таймера по времени получить? хотя смутно припоминается что на asm-е я из таймера функции доса по записи в файл вызывал. (т.е. проблема скорее в самом паскале (то как он вектора меняет ... т.д.))

p.s. кода не жалко счас приведу, просто считаю его лишним не связанным с вопросом.

function SendBlock(var Data: array of byte; size: word): word;
begin
if size > MaxPackSize then begin
SendBlock:= $20;
exit;
end;

ECBs.FragmentCount:= 1;
ECBs.Frag1Descr.Size:= size + SizeOf(IPXPacket)-SizeOf(Data_Packet); {+30 byte header}
Move(Data, Packet1.IPX_Data, size);

GetDate(Packet.DateTime.Year,
Packet.DateTime.Month,
Packet.DateTime.Day,
Packet.DateTime.Hour);

GetTime(Packet.DateTime.Hour,
Packet.DateTime.Min,
Packet.DateTime.Sec,
Packet.DateTime.MSec);

Regs.es:= Seg(ECBs);
Regs.si:= Ofs(ECBs);
Regs.bx:= 3; { send }
CallApiIpx;
SendBlock:= 0;
end;


связаная (вызывается из SendBlock)

procedure CallApiIpx; assembler;
asm
push es
push di
push si
push dx
push cx
push bx
push ax

mov es, Regs.&es
mov di, Regs.&di
mov si, Regs.&si
mov dx, Regs.&dx
mov cx, Regs.&cx
mov bx, Regs.&bx
mov ax, Regs.&ax

call [dword ptr IpxEntry]

mov Regs.&ax, ax
mov Regs.&bx, bx
mov Regs.&cx, cx
mov Regs.&dx, dx
mov Regs.&si, si
mov Regs.&di, di
mov Regs.&es, es

pop ax
pop bx
pop cx
pop dx
pop si
pop di
pop es
end;


заранее, если возникнут вопросы по IPX-у то он работает, посылки есть (на случай если кто обратит внимание что не передается адрес Packet в структуру ECBs, это делается раньше а потому как ничего не меняется (структура жесткая) то переинициализации не требуется, и переменная MaxPackSize получена через int 7ah и уменьшена (на всякий случай) на 2 размера заголовка (60b) т.е. не изза этого, и тем более если IPX рушится то это приводит только к непосылке пакета а не к краху доса в консоли виндов или к перезагрузке доса в дос режиме).


 
REA ©   (2003-10-05 15:24) [3]

Я только помню что ДОС нереентерабелен и надо вызывать не из самого прерывания, а позже по таймеру пользовательскому (0С что-ли) например или перехватить какой-то спулер типа 1F, но мне уже память изменяет - давно я эти хакерские штучки уже забыл.


 
sniknik ©   (2003-10-05 16:26) [4]

REA © (05.10.03 15:24) [3]
> а позже по таймеру пользовательскому (0С что-ли)
Наверное 1С, пользовательский таймер это он. Но я и его пробовал результат тотже.

> перехватить какой-то спулер типа 1F
попробую поискать (что это такое и как связано). это не та вещь где пустое прерывание и обработка вставляется в него а из таймера единственное действие проверка на вызов и сам вызов?

уже пробовал переписать и заменить паскалевскую функцию своей
procedure GetDateTime; assembler;
asm
push es
push di
push si
push dx
push cx
push bx
push ax

mov ah, 2ah
int 21h

mov DatTim.&Year, cx
mov DatTim.&Month, dh
mov DatTim.&Day, dl

mov ah, 2ch
int 21h

mov DatTim.&Hour, ch
mov DatTim.&Min, cl
mov DatTim.&Sec, dh
mov DatTim.&MSec, dl

pop ax
pop bx
pop cx
pop dx
pop si
pop di
pop es
end;


результат практически тот же на всех вариантах (08/1C), с небольшим отличием, теперь вешается не сразу, а только по нажатию клавиши с помошью мыши можно какое то время работать но в итоге все одно вешается. забавно как то.

но на самом деле мне не обязательно вызывать прерывание, без него даже предпочтительнее, нужно только прочитать время, пробовал из CMOS-а, получается, но не могу (нет описания) правильно интерпретировать результаты т.е. железно сходятся только год 09h в виде второй половины 20 03 (видать старый формат, новый не нашол где и вообще есть? должен раз кризис 2000 пережили ;о)) но где?) и секунды по 00h (приблизительно похоже и меняются) а вот с остальными обломс, месяц (ну там где он должен быть в описании 08h) выдает 16 вместо десяти (может это конечно формат такой по 4 бита на цифру тогда получается т.е. 10h как раз и есть десятый, но вот уверенности полной нет ну и т.д.).

в общем может кто еще чего помнит?


 
sniknik ©   (2003-10-05 19:10) [5]

Hi, в общем то все решилось, через CMOS получилось, формат оказался таким как при первом предположении т.е. число записано в 2 разряда по 4 бита, такой своеобразный симбиоз десятичного и шестнадцатиричного формата максимум в байте получается 99, понятно почему. проверял много раз, даты, время менял все сходится.



Страницы: 1 вся ветка

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
6-74341
DW
2003-08-27 07:58
2003.10.23
Включение(выключение) шары...


14-74388
Карелин Артем
2003-10-02 17:36
2003.10.23
Про FreePascal


14-74454
sergeant
2003-10-03 18:25
2003.10.23
Помогите вспомнить


1-74201
Максим
2003-10-10 07:37
2003.10.23
MDI приложение


1-74185
:)
2003-10-10 12:22
2003.10.23
:)