Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Вниз

Может кто еще помнит... 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.011 c
3-74014
Юлия
2003-10-03 21:55
2003.10.23
Поиск записей


14-74445
Карлсон
2003-10-03 15:12
2003.10.23
защита avi от копирования с носителя


1-74224
Andriy Tysh
2003-10-09 14:51
2003.10.23
TToolButton, tbsDropDown


1-74195
AngelSaint
2003-10-06 13:11
2003.10.23
Шрифты и кодировки


7-74515
Шустрый
2003-08-11 12:22
2003.10.23
Как получить текст из TEdit не моего приложения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский