Форум: "Потрепаться";
Текущий архив: 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