Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2015, 19:33   #1
i2save
 
Регистрация: 23.08.2012
Сообщений: 4
По умолчанию Программирования видеоадаптеров (текстовый и графический режим), клавиатуры и мыши с функций BIOS - Низкоуровневое программировани

Приветствую! Понадобилось срочная реализация небольшой задачи, а для реализации знаний нет и на разбор времени нету.

Задача:
При запуске программы появляется окно с текстом в рамке "программирования видеоадаптеров (текстовый и графический режим)", при нажатии клавиш "правый Alt+Q" осуществляется переход к окну для ввода цвета восьмиугольника и цвета фона (реализовать возможность выбора цвета из определенного диапазона), далее при нажатии той же комбинации клавиш осуществляется переход к экрану для рисования восьмиугольника.
Рисование осуществляется мышью (левой клавишей). Необходимо реализовать возможность выделять мышкой графический примитив, перемещать его с помощью комбинации кнопок "правый Ctrl+клавиши стрелки".

Язык программирования: С, Assembler. Для программирования видеоадаптера в текстовом и графическом режиме использовать функции BIOS через прерывание int 10h, для программирования мыши – функции BIOS через прерывание int 33h, для программирования клавиатуры – функции BIOS через прерывание int 16h.

Для программирования на языке Assembler предлагается использовать Turbo Assembler Version 3.0, а для программирования на языке Си – Turbo C++ 3.0.
i2save вне форума Ответить с цитированием
Старый 10.01.2015, 20:53   #2
i2save
 
Регистрация: 23.08.2012
Сообщений: 4
По умолчанию

Есть очень похожий пример: тут рисуется скругленный четырехугольник и используются другие клавиши: "Левый Alt+T" и "правый Ctrl+клавиши стрелки"
Код:
int isrctrl()
{
int r;
asm{
mov ah,2h
int 16h
and ax,4h
mov r,ax
}
return !!r;
}

void setvideomode(char mode)
{
asm{
mov ah,0
mov al,mode
int 10h
}
}

int shiftstatus(void)
{
int r;
asm{
mov ah,12h
int 16h
mov r,ax
}
return r;
}

void setpixel(int x,int y,int c)
{
asm{
mov ah,0ch
mov al,byte ptr c
mov bh,0
mov cx,x
mov dx,y
int 10h
}
}

void setcurpos(int x,int y)
{
asm{
mov ah,2
mov bh,0
mov dh,byte ptr y
mov dl,byte ptr x
int 10h
}
}

void putchar(char c,int col)
{
asm{
mov ah,0eh
mov al,c
mov bl,byte ptr col
int 10h
}
}

void textout(char *txt,int col)
{
for(;*txt;txt++)
  putchar(*txt,col);
}

waitkey(void)
{
int r;
asm{
mov ah,10h
int 16h
mov r,ax
}
return r;
}
void showmouse(void)
{
asm{
mov ax,1
int 33h
}
}
void hidemouse(void)
{
asm{
mov ax,2
int 33h
}
}
int ismousepressed()
{
int r;
asm{
mov ax,3
int 33h
and bx,1
mov r,bx
}
return r;
}


int getmousex()
{
int r;
asm{
mov ax,3
int 33h
mov r,cx
}
return r;
}

int getmousey()
{
int r;
asm{
mov ax,3
int 33h
mov r,dx
}
return r;
}


int state=0;
char about[]="              ЙННННННННННННННННННННННННННННННННННННННННННННННННН»\r\n"
	     "              є       программирования видеоадаптеров (текстовый и графический режим) є\r\n"
	     "              ИНННННННННННННННННННННННННННННННННННННННННННННННННј";
char ramka[]="              ЙННННННННННННННННННННННННННННННННННННННННННННННННН»\r\n"
	     "              є                                                 є\r\n"
	     "              ИНННННННННННННННННННННННННННННННННННННННННННННННННј";

int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void rect(int x1, int y1,int x2,int y2, int c)
{
int t,r;
 int x,y,d;
if(x1>x2)
  {
  t=x1;
  x1=x2;
  x2=t;
  }
if(y1>y2)
  {
  t=y1;
  y1=y2;
  y2=t;
  }
r=min(y2-y1,x2-x1)/2;
if(r>10)
  r=10;
  d=3-2*r;
  x=0;
  y=r;
  while(x <= y)
    {
  //right-lower
    setpixel(x+x2-r,y+y2-r,c);
    setpixel(y+x2-r,x+y2-r,c);

  //right-upper
    setpixel(x+x2-r,-y+y1+r,c);
    setpixel(y+x2-r,-x+y1+r,c);

  //left-upper
    setpixel(-x+x1+r,-y+y1+r,c);
    setpixel(-y+x1+r,-x+y1+r,c);
  //left-lower
    setpixel(-x+x1+r,y+y2-r,c);
    setpixel(-y+x1+r,x+y2-r,c);
     if(d<0)
	d=d+4*x+6;
     else
	{
	d=d+4*(x-y)+10;
	y--;
	}
      x++;
  }
  for(x=x1+r;x<=x2-r;x++)
  {
  setpixel(x,y1,c);
  setpixel(x,y2,c);
  }
  for(y=y1+r;y<=y2-r;y++)
  {
  setpixel(x1,y,c);
  setpixel(x2,y,c);
  }
}


int kbhit()
{
int r;
asm{
mov ah,11h
int 16h
jz nokeys
mov r,1
jmp kbex
}
nokeys:
r=0;
kbex:
return r;
}


int main()
{
int k,i,j,c,x,y,x2,y2;
int figc,bg;
char buf[8];
setvideomode(0x12);
textout(about,14);
do
{
k=waitkey();
}
while(k!=0x1400);
setvideomode(0x12);
c=0;
x=22;
y=10;
setcurpos(0,y-2);
textout(ramka,15);
for(i=0;i<4;i++)
  {
  for(j=0;j<4;j++)
    {
    setcurpos(j*10+x+2,i*2+y-1);
    putchar(c<10?c+'0':c+'7',15);
    setcurpos(j*10+x,i*2+y);
    for(k=0;k<5;k++)
      putchar(0xdb,c);
    c++;
    }
  }
setcurpos(x,y+8);
textout("Figure color (0-F): ",15);
do
{
k=waitkey();
k&=0xff;
}
while(!((k>='0'&&k<='9')||(k>='A'&&k<='F')||(k>='a'&&k<='f')));
if(k>='a'&&k<='f')
  k-=0x20;
putchar(k,15);
if(k>'9')
  k-=7;
figc=k-'0';

setcurpos(x,y+9);
textout("Background color (0-F): ",15);
do
{
k=waitkey();
k&=0xff;
}
while(!((k>='0'&&k<='9')||(k>='A'&&k<='F')||(k>='a'&&k<='f')));
if(k>='a'&&k<='f')
  k-=0x20;
putchar(k,15);
if(k>'9')
  k-=7;
bg=k-'0';
do
{
k=waitkey();
}
while(k!=0x1400);
setvideomode(0x12);
asm{
mov ax,1007h
mov bl,byte ptr bg
int 10h
mov ax,1000h
mov bl,0
int 10h
}
showmouse();
x=y=x2=y2=0;
while(1)
{
  if(ismousepressed())
    {
    x2=x=getmousex();
    y2=y=getmousey();

    while(ismousepressed())
      {
      hidemouse();
      rect(x,y,x2,y2,0);
      x2=getmousex();
      y2=getmousey();
      rect(x,y,x2,y2,figc);
      showmouse();
      }
    }
  if(kbhit())
  {
  k=waitkey();
  if(k==0x1400)
    break;
  if(isrctrl())
    {
    switch(k)
      {
      case 0x8de0: //up
      if(min(y,y2))
	{
	rect(x,y,x2,y2,0);
	y2--;
	y--;
	rect(x,y,x2,y2,figc);

	}
      break;
      case 0x73e0: //left
      if(min(x,x2))
	{
	rect(x,y,x2,y2,0);
	x2--;
	x--;
	rect(x,y,x2,y2,figc);
	}
      break;
      case 0x91e0: //down
      if(max(y,y2)!=479)
	{
	rect(x,y,x2,y2,0);
	y2++;
	y++;
	rect(x,y,x2,y2,figc);

	}
      break;
      case 0x74e0: //right
      if(max(x,x2)!=639)
	{
	rect(x,y,x2,y2,0);
	x2++;
	x++;
	rect(x,y,x2,y2,figc);

	}
      break;
      }
    }
  }
}


setvideomode(3);
return 0;
}
i2save вне форума Ответить с цитированием
Старый 10.01.2015, 23:13   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Приветствую! Знания есть и время есть, а интереса нет.
f.hump вне форума Ответить с цитированием
Старый 11.01.2015, 10:18   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

о, дык это ж я делал.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический режим Pavlov_yu Visual C++ 5 28.11.2014 07:10
графический режим [alex120] Помощь студентам 1 29.05.2013 08:04
Графический режим Dead Romantic Помощь студентам 0 14.12.2010 22:17
Графический режим в FP fire_on Паскаль, Turbo Pascal, PascalABC.NET 1 17.01.2010 13:16
Графический режим galaid Паскаль, Turbo Pascal, PascalABC.NET 2 05.05.2009 17:51