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

Вниз

Переопределение прерываний в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.011 c
1-89292
debugger
2003-10-13 13:05
2003.10.27
Компиляция с библиотеками


14-89501
han_malign
2003-10-09 14:03
2003.10.27
---|Ветка была без названия|---


14-89468
mudilo
2003-10-03 08:24
2003.10.27
Help Help BUGS


6-89440
qw
2003-08-30 13:35
2003.10.27
mail


1-89262
romeo
2003-10-14 15:31
2003.10.27
Object Inspector как в Delphi - своими руками.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский