А по СистПрогр. на Си тут помогают?
У меня при нажатии вылет вообще из среды :(
#include <stdio.h>
#include <dos.h>
#include <conio.h>
void (interrupt *old9)(void); /* Старый обработчик прерывания 9h */
void interrupt new9(void); /* Новый обработчик прерывания 9h */
/* void *readvect (int in); /* Чтение вектора */
/* void writevect (int in,void *h); /* Запись вектора */
unsigned char F8_code=119; /* scan-code "F8" */
unsigned char key8_code=56;/* scan-code "8" */
char f=0; /* Флаг */
union REGS rr;
struct SREGS sr;
/* Чтение вектора *
void *readvect(int in)
{
rr.h.ah=0x35;
rr.h.al=in;
intdosx(&rr,&rr,&sr);
return(MK_FP(sr.es,rr.x.bx));
}
/*-------------------------*/
/* Запись вектора *
void writevect(int in,void *h)
{
rr.h.ah=0x25;
rr.h.al=in;
sr.ds=FP_SEG(h);
rr.x.dx=FP_OFF(h);
intdosx(&rr,&rr,&sr);
}
/*------------------------------*/
/* Новый обработчик 9-го прерыванмя */
void interrupt new9()
{
unsigned char c,x,y;
unsigned char byte17;
unsigned char mask=0x01;
unsigned char mask17=0x04;
byte17=peekb(0x40,0x17);
if((inportb(0x60)==F8_code)&&(byte17&mask)&&
(byte17&mask17))
{
cputs("\7");
x=wherex();
y=wherey();
gotoxy(55,3);
textattr(0x1e);
if(f==0)
{
f=1;
cprintf("klavisha \"8\" block ");
}
else
{
f=0;
cprintf("klavisha \"8\" unblock ");
}
gotoxy(x,y);
textattr(0x07);
(*old9)();
}
if( (f==1) && (inportb(0x60)==key8_code) )
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
outportb(0x20,0x20);
}
else
(*old9)();
}
/*-----------------------------*/
void main(void)
{
char string[80]; /* Буфер для ввода текста */
clrscr();
textattr(0x0a);
cprintf(" Upravlenie klaviaturoy ");
old9=_dos_getvect(0x9);
_dos_setvect(0x9,new9);
textattr(0x0c);
cprintf("\n\n\r\"gorja4aja\" kombinacija: ");
cprintf("Right Shift, Right Ctrl, F8\n\r");
cprintf("Klavisha, kotoraja blokiruetsja: ");
textattr(0x0f);
cprintf("8");
cprintf("\r\nvvedite stroku simvolov>");
cscanf("%s",string);
_dos_setvect(0x9,old9);
}
В ней нет прерываний и outportb()!!! Если конечно ты не пишешь драйвер режима ядра. Но что-то я сомневаюсь.
Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим). Прерывания в v86 тоже эмулируются, но вот outportb вызывает ошибку защиты.
Это надо в real mode DOS запускать или vmware, dosbox (второе лучше).
Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим).
Сенк, знаю. См. последнее предложение предыдущего поста. Если имеется ввиду программа для винды - то считай что их нет. Если не драйвер и прочие вещи режима ядра.
Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим). Прерывания в v86 тоже эмулируются, но вот outportb вызывает ошибку защиты.
Это надо в real mode DOS запускать или vmware, dosbox (второе лучше).
А как это запускать в real mode DOS или vmware, dosbox? Я наверно мегачайник :) и запускаю из турбоС. Э-э-э, можно поподробнее про эти два способа запуска?
Сенк, знаю. См. последнее предложение предыдущего поста. Если имеется ввиду программа для винды - то считай что их нет. Если не драйвер и прочие вещи режима ядра.
pacific_7 А я не знаю для чего пишу: Dosa чи Винды :( Задание у меня такое. Дали вот образец только с другими клавишами. Сказано было в турбоС делать. Я вот свои клавиши подставила, поотлаживала. А дальше серых клеточек не хватает. Трудно на заочном учиться. Может ссылочку на умную литературу кинешь? Учебник Деревянко уже прочитала - фигня!!!
Ты кстати не с Кубани случайно?
pacific_7 А я не знаю для чего пишу: Dosa чи Винды :( Задание у меня такое.
Та-а-ак. А в какой операционной системе должна программа запускаться и работать? Если в Windows, то твоя прога и пример не будут работать в семействе NT - это собственно Windows NT, 2000, 2003, XP и все что будет позже. Только в 95, 98, Me.
Дали вот образец только с другими клавишами.
Задание наверное десятилетней давности. Бывает у нас такое в учебных заведениях :(
Сказано было в турбоС делать. Я вот свои клавиши подставила, поотлаживала. А дальше серых клеточек не хватает.
Очередной идиётизьм наших преподов: делать в турбо Це и ни как иначе. Ведь на деле - в общем-то пофигу в чем делать.
Значит так, если делать для ДОС, то я точно не помощьник, т.к. никогда ничего под него не писал и не собираюсь: "мертвая ОС" по выражению самих MS.
Если под винду, то нужен тебе Джеффри Рихтер, вот ссылка: http://forum.codenet.ru/showthread.php?s=&threadid=27618 - там много чего еще полезного выложено.
Конкретно, тебе надо использовать системные ловушки Windows создаваемые при помощи функции SetWindowsHookEx(...), только вот тогда придется еще и dll отдельную создавать. Об этом всем подробно написано у Рихтера. Только как начинающая - боюсь мало что поймешь. Но попробуй.
Ну и я гляну как реализовать - интересно стало, может че получится. Тогда выложу код.
Трудно на заочном учиться.
Наверное, не знаю - не пробовал еще :)
dosbox - эмулятор DOS, работает прямо из Windows в окне. В нем надо свой Turbo C запускать. Либо загружать компьютер с загрузочной дискеты, запускать свой любимый Turbo C и работать (а это real mode DOS).
pacific_7, ты что-то все усложняешь. Не порть бедной девушке жизнь :)
Ну, блин, мне кажется что щас уже имеет смысл писать под винды, а не под DOS. Это если действительно хочется научиться.
Ну а если только что бы задание выполнить - то тогда твой вариант оптимальный. Можно конечно предположить что девушка собралась писать ОС или драйвер :), тогда то же надо делать по твоему. Но что-то я сомневаюсь что здесь именно этот вариант.
Прочитай доку об использовании, при сmd=2 8-ой бит результата в 1, прога для определения нажатия не тригерных клавиш :
for(; ; )
{
printf("0x%04x\n", bioskey(0));
}
#include"math.h"
#include"conio.h"
double F1 (double x)
{double a,s1;
int k;
a=x; s1=a;
for (k=1;fabs (a)>1e-6*fabs(s1);k++)
{a*=-(x*x)/((2*k+1)*(2*k));
s1+=a;}
return s1;}
double F2 (double x)
{double a,s2;
int k;
a=x; s2=a;
for (k=1;fabs (a)>1e-6*fabs(s2);k++)
{a*=-(x*x)/((2*k-1)*(2*k));
s2+=a;}
return s2;}
double f(double x)
{double m,n;
m=F1(x);
n=F2(x);
return (n-m)*(n+m);
}
double Intgr (double a,double b)
{double x,In,I2n;
int n,i;
I2n=(f(a)+f(b))/2*(b-a);
n=1;
In=I2n+100;
while (fabs(In-I2n)>1e-6*fabs(I2n))
{n*=2;In=I2n;I2n=0;
for (i=0;i<n;i++)
{x=a+0.1*i;
I2n+=0.1*(f(x)+f(x+0.1))/2;
}
}
return I2n;
}
void main()
{double x,y,z;
clrscr();
for (x=0;x<1;x+=0.1)
{printf("\v x=%g",&x);
y=Intgr(0,1);
printf("\t int=%g",y);
z=abs(y-0.5*sin(2*x));
printf("\t z=%g",z);
}
}
о каком переполнении? напиши error message.