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

Вниз

Переопределение прерываний в Dos, Pascal, видео (int 10h)   Найти похожие ветки 

 
sniknik ©   (2003-10-08 02:27) [0]

Почему простейшее прерывание, просто вызов старого
{$F+}
procedure NewVideo; interrupt;
begin
inline($9C);
OldVideoVec;
end;
{$F-}

GetIntVec($10,@OldVideoVec);
SetIntVec($10,Addr(NewVideo));
портит видео режим? переопределяется int 10h служба видеосервисов.

вернее нет, почему как раз понятно, сбиваются значения в регистрах, на "безобидных" вызовах режим не переопределяющих в оригинале, при передачи по способу паскаля, а вот этот способ и желательно выяснить чтобы исправить "как було".
может кто помнит, или пороется в старых запасах да даст пример?
сам не помню, вот уже спрашивал (по другому поводу, уже решилось)
http://delphimaster.net/view/14-1065308191/
и программ как ни искал не нашол, и в net-е все примеры больше попадаются на клавитуру (а чего не сделать такой пример, он в хелпе есть ;о)).


 
Zacho ©   (2003-10-08 02:31) [1]

A зачем тебе это ?


 
wl ©   (2003-10-08 02:36) [2]

а что за команда - inline($9C); ?
как же тяжело ворочаются мозги в попытке вспомнить такие древности. дебаггером не пробовал пройтись по коду?


 
sniknik ©   (2003-10-08 02:38) [3]

да, задача на самом деле не в переопределении int 10h, надо получить значение одного флага, может его можно получить и другим способом.
флаг этот, тот что позволяет в текстовом режиме использовать 2 таблицы шрифтов, устанавливается через
mov ax, 1103h
mov bl, 04
int 10h
снимается bl=0
вот его и нужно получить, ничего лутше чем переопределить прерывание на "себя" не придумал/не знаю, но а может он гденибудь прописывается? и его можно просто прочитать?


 
sniknik ©   (2003-10-08 02:42) [4]

;о) Zacho © (08.10.03 02:31) [1]
не ответил? писал не видел еще.

wl © (08.10.03 02:36) [2]
> а что за команда - inline($9C); ?
честно? не помню, это толи pushf толи popf, сохранение регистров для прерывания, т.к. вызывается не как прерывание а как процедура (или чтото вроде этого).

просто всегда так делал раньше, и счас не исключение. без него виснет.


 
sniknik ©   (2003-10-08 02:45) [5]

wl © (08.10.03 02:36) [2]
> дебаггером не пробовал пройтись по коду?
а у паскаля есть дебагер? ;о)) уууу, а я совсем забыл. надо попробовать посмотреть на код. спасибо.


 
Zacho ©   (2003-10-08 02:46) [6]


> sniknik © (08.10.03 02:42) [4]
> ;о) Zacho © (08.10.03 02:31) [1]
> не ответил? писал не видел еще.

Не понял.

> wl © (08.10.03 02:36) [2]
> > а что за команда - inline($9C); ?
> честно? не помню, это толи pushf толи popf,

Ты придуриваешься, или правда не знаешь, что такое inline ? Подсказка: это не push и не pop :)


 
wl ©   (2003-10-08 02:54) [7]


> Zacho © (08.10.03 02:46) [6]

я не точно выразился (спрашивал asm-мнемонику команды 09Ch). Я просто не помню кодов всех ассемблерных команд, вот и стало интересно.


 
Zacho ©   (2003-10-08 03:03) [8]


> wl © (08.10.03 02:54) [7]
> Я просто не помню кодов всех ассемблерных команд, вот и
> стало интересно.

Ну и я не помню. Поэтому и спрашиваю "A зачем тебе это ?" И все-таки я подозреваю, что ты просто придуриваешься.


 
Думкин ©   (2003-10-08 05:23) [9]

Ты родился слишком поздно. Даже когда я рылся в прерываниях - это были раскопки динозавров.


 
Думкин ©   (2003-10-08 06:56) [10]

> Думкин © (08.10.03 05:23)

ЗЫ. В анкету глянул. Ты родился... а зачем тогда тебе сие?


 
LordOfSilence ©   (2003-10-08 08:20) [11]

Николай, погоди перехватывать прерывания.
Поищи старую добрую книгу Журдена (Джордейна в другой "интертрепации"), там это должно быть описано все. Если сейчас это является раритетом (я просто не знаю), свяжись со мной, встретимся, я тебе передам ее, почитаешь.


 
LordOfSilence ©   (2003-10-08 08:27) [12]

Кстати, вот раскопал свой старый код (а вдруг на мысль натолкнет :-)):

{$M $800,0,0}
Uses Crt, Dos;
Var
KbdIntVec : procedure;
Procedure Bell( aFrequency, aCurrency : word );
Begin
Sound( aFrequency );
Delay( aCurrency );
NoSound;
End;
Procedure PUSHF; Inline($9C);
Procedure KeyBoardInterceptor; interrupt;
Begin
if Port[ $60 ] < $80
then Bell( 500, 1 )
else Bell( 1000, 1 );
PUSHF;
KbdIntVec;
End;
Begin
GetIntVec( 9, @KbdIntVec );
SetIntVec( 9, @KeyBoardInterceptor );
Keep( 0 );
End.


Эта фигня заставляла в свое время кликать динамик компа при каждом щелчке по клавишам.


 
LordOfSilence ©   (2003-10-08 08:44) [13]

Слушай, а может все дело в том, что ты принудительно включаешь far-вызовы? Хотя за базар не отвечу, не помню толком ни фига.

"честно? не помню, это толи pushf толи popf, сохранение регистров для прерывания"

На всякий случай небольшой набор инлайн-значений:
Procedure CBW; Inline($98);
Procedure CWD; Inline($99);
Procedure CLC; Inline($F8);
Procedure STC; Inline($F9);
Procedure CLD; Inline($FC);
Procedure STD; Inline($FD);
Procedure CMC; Inline($F5);
Procedure CLI; Inline($FA);
Procedure STI; Inline($FB);
Procedure NOP; Inline($90);
Procedure HLT; Inline($F4);
Procedure WAIT; Inline($9B);
Procedure LOCK; Inline($F0);
Procedure INTO; Inline($CE);
Procedure IRET; Inline($CF);
Procedure SAHF; Inline($9E);
Procedure LAHF; Inline($9F);
Procedure POPA; Inline($61);
Procedure POPF; Inline($9D);
Procedure PUSHF; Inline($9C);
Procedure PUSHA; Inline($60);


 
sniknik ©   (2003-10-08 09:03) [14]

LordOfSilence © (08.10.03 08:20) [11]
> Николай, погоди перехватывать прерывания.
> Поищи старую добрую книгу Журдена (Джордейна в другой "интертрепации"), там это должно быть описано все. Если > сейчас это является раритетом (я просто не знаю), свяжись со мной, встретимся, я тебе передам ее, почитаешь.

это наверняка раритет, и боюсь иначе чем у тебя мне ее нигде не достать. ;о( давай "связыватся", где и когда? (как тебе удобнее).

> LordOfSilence © (08.10.03 08:27) [12]
:(((( нуууу, я же говорил, все примеры почемуто по клавиатуре, у тебя не исключение, это немного измененниый из паскалевского хелпа по в разделе Keep(0) + Ctrl+F1

Думкин © (08.10.03 05:23) [9]
можете не верить но эти раскопки до сих пор актуальны, а в досе еще большая куча программ работает. (зайди в любой супермаркет, и загляни кассирше через плечо на монитор, 90% за то что увидиш его родной и неграфический :о)))


 
LordOfSilence ©   (2003-10-08 09:10) [15]

2 sniknik © (08.10.03 09:03) [14]
Мои контактные данные в анкете.
" почемуто по клавиатуре, у тебя не исключение,"
Ну извиняй:-) Ну не было у меня необходимости цепляться за видео,
помню, что вешался на клаву и системный таймер.

А вообще ты не торопи события. Сейчас народ в массе своей проснется, придет на работу и включит компы. Тут же у нас есть более старшие товарищи, они могут помнить все это хозяйство.


 
Anatoly Podgoretsky ©   (2003-10-08 10:00) [16]

предпочитал писать так

procedure NewVideo; interrupt;
asm
pushf
call [OldVideoVec]
end;


 
Vitaly ©   (2003-10-08 10:56) [17]

Никогда не перехватывал прерывания на Паскале,
но, мне кажется, что проблема в том,
что interrupt процедура сохраняет все регистры
перед вызовом и восстанавливает их после.
Поэтому перехваченная видеопроцедура не может
вернуть значения. ИМХО


 
sniknik ©   (2003-10-08 11:59) [18]

Anatoly Podgoretsky © (08.10.03 10:00) [16]
не проходит, пробовал, правде немного не так, с добавкой
procedure NewVideo; interrupt; assembler;
...

вот что там по этому коду происходит
PROGRAM.NEWVIDEO: asm
cs:0062 50 push ax
cs:0063 53 push bx
cs:0064 51 push cx
cs:0065 52 push dx
cs:0066 56 push si
cs:0067 57 push di
cs:0068 1E push ds
cs:0069 06 push es
cs:006A 55 push bp
cs:006B 89E5 mov bp,sp
cs:006D B8E95B mov ax,5BE9
cs:0070 8ED8 mov ds,ax
PROGRAM.37: pushf
cs:00729C pushf
PROGRAM.38: call [OldVideoVec]
cs:0073 FF1E5A00 call far [PROGRAM.OLDVIDEOVEC]
PROGRAM.39: end;
cs:0077 5D pop bp
cs:0078 07 pop es
cs:0079 1F pop ds
cs:007A 5F pop di
cs:007B 5E pop si
cs:007C 5A pop dx
cs:007D 59 pop cx
cs:007E 5B pop bx
cs:007F 58 pop ax

cs:0080 CF iret


а вот выделенное(востановление регистров) лишнее т.к. это же не асинхронное прерывание, его из программ сами вызывают. и возвращаемые регистры анализируют.

вообще я в ступоре, делаю ассемблерную вставку
procedure NewVideo; far; assembler; (чтобы не было этих "лишних" сохранений восстановлений)
asm
pushf
call OldVideoVec
end;
и сам вызываю прерывание
asm
mov ax,0300h
mov bx,0
int 10h
end;
все нормально, но регистр SP меняет значение (на 2 байта)
по выходу (keep), в нортоне режимы сбиваются.
решил поправить положение
procedure NewVideo; far; assembler;
asm
pushf
call OldVideoVec
retf 2
end;
(iret не могу, может флаги нужны)
так с этим, мой вызов(int 10h) тоже нормально, а по выходу просто виснет...:(


 
Vitaly ©   (2003-10-08 12:00) [19]

делай iret


 
Vitaly ©   (2003-10-08 12:05) [20]

вызов
int ...
это
pushf
far call ... - push cs push ip

возврат
iret -
retf - (pop ip pop cs)
popf

ecли ты делаешь retf 2,
то последний popf портит стек


 
sniknik ©   (2003-10-08 12:19) [21]

Vitaly © (08.10.03 12:00) [19]
делай iret
не могу
Vitaly © (08.10.03 12:05) [20]
> ecли ты делаешь retf 2,
> то последний popf портит стек
не я его так наоборот восстанавливаю (один из вариантов)

но это неважно, потому как

получилось!!!!!!

вот так работает
procedure NewVideo; far; assembler;
asm
push ds
push ax
mov ax, SEG @Data
mov ds, ax
pop ax
pushf
call [OldVideoVec]
pop ds
retf 2
end;
единственно слабое место если чегото через ds передается, если нет (счас посмотрю), то да и Х%^ с ним. ;о))))))))


 
Vitaly ©   (2003-10-08 12:26) [22]

всё равно делай iret :)

почему не можешь?


 
Anatoly Podgoretsky ©   (2003-10-08 12:27) [23]

sniknik © (08.10.03 11:59) [18]
Это приблизительная схема, я уже давно не писал под ДОС драйвера
Прерывание сохраняет флаги и передает управление по вектору, IRET делает обратное.


 
Anatoly Podgoretsky ©   (2003-10-08 12:42) [24]

Посмотри еще здесь, может пригодится.

http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Asm/AsmBradly/index.html&file_id=As mBradly


 
sniknik ©   (2003-10-08 13:58) [25]

Anatoly Podgoretsky © (08.10.03 12:27) [23]
> Это приблизительная схема, я уже давно не писал под ДОС драйвера
аналогично, если бы не позабывал все то и вопроса бы не возникло.

Anatoly Podgoretsky © (08.10.03 12:42) [24]
> Посмотри еще здесь, может пригодится.
может быть, спасибо.

Vitaly © (08.10.03 12:26) [22]
> всё равно делай iret :)
> почему не можешь?

> Прерывание сохраняет флаги и передает управление по вектору, IRET делает обратное.
вот поэтому, после int -а возможно придется анализировать регистр флагов, не мне а той проге что его вызвала. а я ему старый подсовывать буду.


 
Vitaly ©   (2003-10-08 14:51) [26]

перегибаешь палку


 
Vitaly ©   (2003-10-08 14:54) [27]

int10 это не int21
он во флагах ничего не возвращает


 
sniknik ©   (2003-10-08 15:36) [28]

Vitaly © (08.10.03 14:54) [27]
> int10 это не int21
> он во флагах ничего не возвращает

а я?! а про меня забыл? сам буду. ;о))

просто сначала не ставил хотел проверить "а не возвращает ли?", а после решил что удобное средство для обнаружения своего же присутствия, а раз флаги никому не нужны то и самое безопасное.



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

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

Наверх




Память: 0.55 MB
Время: 0.028 c
3-89176
Lion
2003-10-06 15:11
2003.10.27
Два Detail в QuickReport


3-89152
Игоряныч
2003-09-19 08:03
2003.10.27
Splash при подключении к БД через ADO???


7-89607
Alexander
2003-08-13 09:52
2003.10.27
Как можно подключить сетевой диск на свой компьютер, если нет


1-89326
GreySerg
2003-10-16 15:20
2003.10.27
Как сделать , чтобы прога была только в tray при её загрузке ?


1-89278
DimChan
2003-10-14 13:40
2003.10.27
Try...Except