[완료]VGA 프로그램 이해가 안됩니다~~~

bbangpower의 이미지

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;
}

semmal의 이미지

코드 자체가 말이 안됩니다.

아마도 나누기 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?

bbangpower의 이미지

알려주신 게시물은 이미 보았습니다 ^^
근데 위의 코드는 제대로 동작하는 코드라는 것이 문제네요.
오히려 4로 나누지 않았을 때 엉뚱한 컬러가 나옵니다.

후~

bbangpower의 이미지

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회 실시한답니다.

이상입니다 ㅎㅎ.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.