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