Режим чтения 0a

  • Автор темы BattleMage
  • Дата начала
B

BattleMage

#1
Ещё раз добрый день. Подскажите пожалуйста,что я тут не так делаю. Понимаю, что в чужих кодах разбираться нелегко, но все же... Задача такая. Экран состоит из четырех прямогульников разных цветов. Пользователь вводит координату точки (x,y) и должен вывести цвет той точки, которую он выбрал. ФУнкцию getpixel() или как она там называется не предлагать...

код такой:
Код:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<graphics.h>

void main()
{
unsigned int x,y;
printf("Введите координаты:");
scanf("%d %d",&x,&y);
if ((x<0)||(x>640)||(y<0)||(y>480))
{
printf("Ошибка! Некорректные координаты!");
getch();
return;
}
else
{
clrscr();
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "d:\\BC\\BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Графическая ошибка: %s\nНажмите любую клавишу для выхода", grapherrormsg(errorcode));
getch();
return;
}

//1
setfillstyle(1,1);
bar(0,0,160,480);

//2
setfillstyle(1,2);
bar(160,0,320,480);

//3
setfillstyle(1,4);
bar(320,0,480,480);

//4
setfillstyle(1,14);
bar(480,0,640,480);

//MK_FP - это макроопределение, которое создаёт дальний указатель из адреса сегмента (seg) смещения (ofs)
unsigned char far *mem = (char*)MK_FP(0xa000,0);
unsigned int q;
unsigned short w[4];
unsigned short u;

asm mov ax, 0x12
//Десятое прерывание BIOS-а
asm int 0x10

//регистр графического режима
outp(0x3CE, 0x5);
outp(0x3CF, 3);

for(q=0;q<=(480*80);q++) *((unsigned char far*)mem+q)=255;
//настраиваем видеокарту на режим чтения 0а
outp(0x3CE, 0x5);
outp(0x3CF, 0x0);
for(u=0;u<=3;u++)
{
outp(0x3CE, 0x4);
outp(0x3CF, u);
w[u]=*((unsigned char far*)mem+y*80+x/8);
}
for(u=0;u<=3;u++) w[u]=w[u]>>7;
if(w[0]==0 && w[1]==0 && w[2]==0 && w[3]==0) printf("\nЧёрный");
if(w[0]==1 && w[1]==0 && w[2]==0 && w[3]==0) printf("\nСиний");
if(w[0]==0 && w[1]==1 && w[2]==0 && w[3]==0) printf("\nЗелёный");
if(w[0]==1 && w[1]==1 && w[2]==0 && w[3]==0) printf("\nЦиановый");
if(w[0]==0 && w[1]==0 && w[2]==1 && w[3]==0) printf("\nКрасный");
if(w[0]==1 && w[1]==0 && w[2]==1 && w[3]==0) printf("\nМалиновый");
if(w[0]==0 && w[1]==1 && w[2]==1 && w[3]==0) printf("\nКоричневый");
if(w[0]==1 && w[1]==1 && w[2]==1 && w[3]==0) printf("\nСветлый серый");
if(w[0]==0 && w[1]==0 && w[2]==0 && w[3]==1) printf("\nТёмный серый");
if(w[0]==1 && w[1]==0 && w[2]==0 && w[3]==1) printf("\nГолубой");
if(w[0]==0 && w[1]==1 && w[2]==0 && w[3]==1) printf("\nСветлый зелёный");
if(w[0]==1 && w[1]==1 && w[2]==0 && w[3]==1) printf("\nСветлый циановый");
if(w[0]==0 && w[1]==0 && w[2]==1 && w[3]==1) printf("\nСветлый красный");
if(w[0]==1 && w[1]==0 && w[2]==1 && w[3]==1) printf("\nСветлый малиновый");
if(w[0]==0 && w[1]==1 && w[2]==1 && w[3]==1) printf("\nЖёлтый");
if(w[0]==1 && w[1]==1 && w[2]==1 && w[3]==1) printf("\nБелый");
getch();
closegraph();
return;
}
}
Не обращайте внимания,что экран раскрашен всего в 4 цвета, а условий аж для 16-ти...
 
P

Pasha

#5
Для: BattleMage
У тебя не так много вариантов:
1. Научится работать в видео через VESA, вкурить http://www.vesa.org/public/VBE/vbe3.pdf (вроде оно).
2. Снять странное ограничение на getpixel.
 
B

BattleMage

#6
думаете я сам себе задание такое придумал. в универе дали такое. и по vesa лабу будет и много чего ещё... и функция getpixel() - хероватая....