[완료]VGA 프로그램 이해가 안됩니다~~~
VGA 프로그래밍인데 이해가 도저히 안되서 여기에 회원가입하자 마자 올립니다~!
맨 아래 set_palette 함수 부분에서요~
io_out8(0x03c9, rgb[0] / 4) 이란 부분에서 왜 4로 나누는지 이해가 안됩니다.
어떤 분이 말씀하시길
"io_out8(int port, int data);
data 타입이 정수인데, 바이트 데이타를 그대로 넣어 버리면 al 에 원하는 값이 들어가지 않습니다.
4로 나누어서 넣으세요."
라고 하셨는데 왜 4죠? 상세한 설명 해주실분 없으신가요?
io_out8:
mov edx, [esp+4] ;port
mov al, [esp+8] ;data
out dx, al
ret
void init_palette(void)
{
//static char 선언은 함수 밖에서 사용할 수 없지만 db명령에 대응된다.
static unsigned char table_rgb[16 * 3] = {
0x00, 0x00, 0x00, //0:검은색
0xff, 0x00, 0xff, //1:밝은 적색
0x00, 0xff, 0x00, //2:밝은 녹색
0xff, 0xff, 0x00, //3:밝은 노란색
0x00, 0x00, 0xff, //4:밝은 청색
0xff, 0x00, 0xff, //5:밝은 보라색
0x00, 0xff, 0xff, //6:밝은 청색
0xff, 0xff, 0xff, //7:흰색
0xc6, 0xc6, 0xc6, //8:밝은 회색
0x84, 0x00, 0x00, //9:어두운 적색
0x00, 0x84, 0x84, //10:어두운 녹색
0x84, 0x84, 0x00, //11:어두운 노란색
0x00, 0x00, 0x84, //12:군청색
0x84, 0x00, 0x84, //13:어두운 보라색
0x00, 0x84, 0x84, //14:어두운 청색
0x84, 0x84, 0x84 //15:어두운 회색
};
set_palette(0, 15, table_rgb);
return;
}
void set_palette(int start, int end, unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags();
io_cli();
io_out8(0x03c8, start);
for(i = start; i <= end; i++)
{
io_out8(0x03c9, rgb[0] / 4);
io_out8(0x03c9, rgb[1] / 4);
io_out8(0x03c9, rgb[2] / 4);
rgb += 3;
}
io_store_eflags(eflags);
return;
}
코드 자체가 말이 안됩니다. 아마도 나누기 4를
코드 자체가 말이 안됩니다.
아마도 나누기 4를 하라는 이야기는 배열에서 1차원 배열을 2차원 배열로 처리하기 위한 인덱스 때문에 그런 것 같은데,
코드 자체가 전혀 동작하지 않을 엉터리라, 이건 그냥 짐작일 뿐입니다.
동작하는 코드라면 rgb[0]/4 라고 되어 있을리 없습니다.
책이라면 아주 심각한 오타고, 다른 소스 참고하시는 거라면 그냥 그 소스 버리고 직접 작성하세요.
굳이 모르는 상태로 나마 고쳐보자면
rgb[i*3],rgb[i*3+1],rgb[i*3+2] 로 만들거나
end가 16*3인 상태에서 i+=3 하면서
rgb[i], rgb[i+1], rgb[i+2]로 만드는 수 밖에 없네요.
------------
죄송합니다 제가 잘못봤네요. rgb 자체를 더하는군요. 흐흐
왜 그런지는 좀 더 살펴봐야 하겠네요.
------------
http://kldp.org/node/121783
에 유사한 글이 있네요. 맨 마지막에 irondog님 답변을 참고하시면 될 것 같습니다.
------------------------------
How many legs does a dog have?
답변은 감사합니다.
알려주신 게시물은 이미 보았습니다 ^^
근데 위의 코드는 제대로 동작하는 코드라는 것이 문제네요.
오히려 4로 나누지 않았을 때 엉뚱한 컬러가 나옵니다.
후~
해답을 찾았습니다.
VGA 프로그래밍 위주로 검색해보니 이런 글귀가 있네요.
Unfortunatly, the VGA only gives us 6 bits per color channel, so the best you can get is 18-bit color (but you can only pick 256 of those colors, of course).
생략...
The VGA understands color values in the order red, green, blue, (reverse of the BMP format) plus the program needs to change the palette data form 24-bit to 18-bit (divide each color by four, or right-shift by two).
256색은 지원하는데 R,G,B 컬러당 6bit를 받는다네요;;
그래서 4로 나누거나 오른쪽 쉬프트 2회 실시한답니다.
이상입니다 ㅎㅎ.
댓글 달기