#include <dos.h>
#include <stdio.h>
#include <conio.h>
/* определить текущий диск */
char get_current_drive( void )
{
_AH = 0x19;
geninterrupt(0x21);
return 'a' + (int)_AL;
}
int main( void )
{
printf( "Current drive: %s\n", get_current_drive() );
getch();
return 0;
}
Techhelp
1я и 2я надо используя прерывание int21 определить текущий диск; номер версии DOS , серийный номер произвоодителя.
3я замаскировать прерывание от флоппика
Fun 19h: Определение текущего диска. Возвращает в AL номер текущего накопителя (стандартная нумерация устройств).
Fun 30h: Определение номера версии DOS. Возвращает: старший разряд номера версии в AL, младший в AH.
P.S. Больше пока не вспомнил.
#include <dos.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
_AH=0x30;
geninterrupt(0x21);
printf((char*)_AL,".",(char*)_AH);
getch();
}
#include <dos.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
unsigned int a;
_AH=0x19;
a=_AL;
geninterrupt(0x21);
if(a==0)
{
printf("disk a:\n");
}
if(a==2)
{
printf("disk c:\n");
}
getch();
}
Кто розбирается подскажите правильно или нет , или може чего то ещё просто нехватает?
Вот так красивше будет (C-style)
Значит с определением диска правильно?А с определением версии DOS ?И что может означать "серийный номер произвоодителя" в таком контексте?И где можно было бы поискать инфу о маскировки прерывания , гугль к сожалению толком и непомог :(
Цитата: _nic
...А с определением версии DOS ?И что может означать "серийный номер произвоодителя" в таком контексте?
Видимо, имеется ввиду следующее:
Функция 30h прерывания 21h, дополнительно помещает в регистры BX и СХ номер серии (для версий DOS от [COLOR="Blue"]IBM [/COLOR]- это значение = 0, другие значения - другие фирмы). Какие значения у каких фирм - я без понятия, ищи...
Возможно, требуется подменить собственным резидентом INT13h, который, например, в случае обращения к флопу ничего делать не будет? Хотя, это уже прерывание BIOS.
Добавлено: а как ты искал, интересно? В гугле - вторая ссылка. По-моему, все понятно. И даже с примерами на C.
Цитата: Lerkin
Относительно маскирования прерывания от флоповода.
Возможно, требуется подменить собственным резидентом INT13h, который, например, в случае обращения к флопу ничего делать не будет? Хотя, это уже прерывание BIOS.
Добавлено: а как ты искал, интересно? В гугле - вторая ссылка. По-моему, все понятно. И даже с примерами на C.
Возможно, требуется подменить собственным резидентом INT13h, который, например, в случае обращения к флопу ничего делать не будет? Хотя, это уже прерывание BIOS.
Добавлено: а как ты искал, интересно? В гугле - вторая ссылка. По-моему, все понятно. И даже с примерами на C.
Попробовал сделать как там написанно
Код:
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
void main(void)
{
int a;
cout<<"prerivanie flopika budet zamaskirovano \n";
getch();
outp(0x21,0x40);
cout<<"prerivanie plopika zamaskirovano,vernut nazad 1 vijti 2 \n";
cin>>a;
if(a==1)
{
outp(0x21,0);
}
if(a==2)
{
exit(0);
}
}
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
void main(void)
{
int a;
cout<<"prerivanie flopika budet zamaskirovano \n";
getch();
outp(0x21,0x40);
cout<<"prerivanie plopika zamaskirovano,vernut nazad 1 vijti 2 \n";
cin>>a;
if(a==1)
{
outp(0x21,0);
}
if(a==2)
{
exit(0);
}
}
Компилятор выводит предупреждение "code has no effect".И программа как нестранно неработает тоесть флоппик работает, хотя может это над о под чистым досом запускать.
Код:
...
cin>>a;
if(a==1)
{
outp(0x21,0);
}
if(a==2)
{
exit(0);
}
...
cin>>a;
if(a==1)
{
outp(0x21,0);
}
if(a==2)
{
exit(0);
}
...
Допустим, ты запустил программу и ввел 1. Тогда выполняется первое условие и программа выходит. Ты из под Винды работаешь? Тогда прерывание, естественно, восстанавливается.
Второе условие - вообще не имеет смысла. Что через него программа выходит, что без него.
Лучше, наверное, так:
Код:
int main( void )
{
cout << "Прерывание маскировано...\n";
outp(0x21, 0x40);
getch();
cout << "Прерывание размаскировано.\n";
outp(0x21, 0x00);
return 0;
}
{
cout << "Прерывание маскировано...\n";
outp(0x21, 0x40);
getch();
cout << "Прерывание размаскировано.\n";
outp(0x21, 0x00);
return 0;
}
PS:там где надо вывести версию DOS то содержимое регистров ещё надо как то преобразовать так как если выводить просто их содержимое то получается чепуха вроде ♣ Ý
Цитата: _nic
Я понял но неработает строка outp(0x21,0x40)
Она работает, но работает в DOS, а не в консоли Windows.
Цитата: _nic
PS:там где надо вывести версию DOS то содержимое регистров ещё надо как то преобразовать так как если выводить просто их содержимое то получается чепуха вроде ♣ Ý
Ну, разумеется... Надо преобразовать содержимое регистров в строку. смотри функцию itoa(...);
Цитата: Lerkin
Ну, разумеется... Надо преобразовать содержимое регистров в строку. смотри функцию itoa(...);
А можно точнее ,какого типа в содержимое оказывается в регистрах ?
Цитата: _nic
А можно точнее ,какого типа в содержимое оказывается в регистрах ?
Целочисленного типа. Соответственно, его надо преобразовать к строке.
Код:
...
char major[10], minor[10];
itoa((int)_AL, major, 10);
itoa((int)_AH, minor, 10);
printf("%s.%s\n", major, minor);
...
char major[10], minor[10];
itoa((int)_AL, major, 10);
itoa((int)_AH, minor, 10);
printf("%s.%s\n", major, minor);
...
Из AL выводится 236,из AH - 255,из BX - 10, CX - 0.Это нормально?
Цитата: _nic
Из AL выводится 236,из AH - 255,из BX - 10, CX - 0.Это нормально?
Какая операционка?
Цитата: Lerkin
Какая операционка?
XP SP2 Pro
Короче, для "чистой" DOS этот пример работает. А как насчет Windows - фиг его знает.
Код:
#include <dos.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
char a[10],b[10],c[10],d[10];
_AH=0x30;
geninterrupt(0x21);
itoa((int)_AL,a,10);
itoa((int)_AH,b,10);
itoa((int)_BX,c,10);
itoa((int)_CX,d,10);
printf("%s.%s\n",a,b);
printf("kod vend ");
printf("%s.%s\n",c,d);
getch();
}
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
char a[10],b[10],c[10],d[10];
_AH=0x30;
geninterrupt(0x21);
itoa((int)_AL,a,10);
itoa((int)_AH,b,10);
itoa((int)_BX,c,10);
itoa((int)_CX,d,10);
printf("%s.%s\n",a,b);
printf("kod vend ");
printf("%s.%s\n",c,d);
getch();
}
Не считается. А чем компилил?
Цитата: Lerkin
А чем компилил?
Borland Turbo C++ 3.0
Цитата: _nic
Borland Turbo C++ 3.0
Найди какой-нить MS-DOS (3.30 - 6.22) и юзай на нем...