컬러비트 배경색 16 쓰기 |
BLINK 비트를 OFF 하면 컬러 텍스트 배경색으로 16색을 모두 사용할 수 있습니다.
#include위의 함수에 대한 상세 설명이다.#define ON 1 #define OFF 0 void set_blink(int i); int video_mode(void); void main() { set_blink(OFF); /* blink 비트를 off 시킨다. */ . . set_blink(ON); /* 프로그램 종료전에 다시 blink비트를 on시켜놓아야 한다. */ } void set_blink(int i) /* i에 ON을 쓰면 blink on이고 OFF를 쓰면 */ /* intensity on 즉 blink off 상태로 만들어 준다. */ { union REGS r; if (video_mode==7) { /* 흑백모드일 경우 */ outportb(0x3B8,0x0D+0x20*i); } else { /* 컬러 모드일 경우 */ r.h.ah=0x10; r.h.al=0x03; r.h.bl=i; int86(0x10,&r,&r); } } int video_mode() /* 비디오 모드를 알아내는 함수 */ { union REGS r; r.h.ah=0x0f; return(int86(0x10,&r,&r) & 0xff); /* 리턴값이 7이면 흑백모드 */ }
- set_blink()
컬러 텍스트 모드에서 사용하는 색깔은 16가지인데, 이 가운데 배경색으로
사용할 수 있는 색은 8가지밖에 안된다. 왜냐하면 배경색으로 쓰이는
상위 4비트에는 blink 비트가 있어서 글자의 깜박임을 지시해야 하기 때문에
결과적으로 3비트, 곧 8가지 색밖에 지정할 수 없게 된다.
하지만 blink 비트를 off로 만들어 주면 배경색도 16가지 색을 사용할 수 있게 된다.
주의할 점은 프로그램에서 blink 비트를 off 시켰으면 프로그램을 종료하기 전에 반드시
set_blink(ON) 으로 다시 blink 비트를 on 시켜주어야 한다. 가끔 이런식으로 만들어 준
프로그램을 빠져나오면 글자가 깜박거릴 때가 있는데, 이것은 blink 비트를 off 시킬 때
충돌을 일으키기 때문이다.
- video_mode()
int 10 (ah=0x0f) 리턴값
: AH == 텍스트 모드 컬럼수
AL == 비디오 모드의 번호
BH == 액티브 페이지(현재의 페이지 번호)
int86(0x10,&r,&r)에서 리턴값으로 AX의 값이 오는데 AX의 하위 바이트가 AL이므로 & 연산으로 하위
바이트만 끄집어낸다. 이 값이 7이면 흑백모드이고, 아니면 컬러로 인식한다.
AL의 값을 리턴하려면 다음과 같이 int86() 함수 호출후 r.h.al 의 값을 리턴해도 된다.
AX의 데이터형은 unsigned int 이고, AL의 데이터형은 unsigned char이다.
그러므로 나중에 발생할 에러를 방지하기위해 캐스트 연산자를 적절히 써주는게 좋다.
unsigned char video_mode() { union REGS r; r.h.ah=0x0f; int86(0x10,&r,&r); return(r.h.al); }
int86(0x10,&r,&r)에서 리턴값으로 AX의 값이 오는데 AX의 하위 바이트가 AL이므로 & 연산으로 하위
바이트만 끄집어낸다. 이 값이 7이면 흑백모드이고, 아니면 컬러로 인식한다.
AL의 값을 리턴하려면 다음과 같이 int86() 함수 호출후 r.h.al 의 값을 리턴해도 된다.
AX의 데이터형은 unsigned int 이고, AL의 데이터형은 unsigned char이다.
그러므로 나중에 발생할 에러를 방지하기위해 캐스트 연산자를 적절히 써주는게 좋다'기타 언어 > C# & MFC' 카테고리의 다른 글
Bitmap 파일 읽어서 SetDIBitsToDevice, StretchDIBits 이용해 표현하기 (1) | 2013.04.09 |
---|---|
MFC VC2010 링크에러 fatal error LNK1104 (0) | 2013.04.05 |
CEdit 박스에 Enter 키를 눌렀을때 줄바꿈 적용 (0) | 2011.03.14 |
MFC VC++ 탭 순서 변경하기 (2) | 2011.03.11 |
텍스트에 컬러문자 출력하기 (0) | 2010.08.31 |
비디오 메모리에 직접엑세스 하는 방법 (3) | 2010.08.31 |
메모리 내용을 읽어내어 키보드 상태 알아내기 - 4가지 방법 (0) | 2010.08.31 |
인터럽트와 레지스터 (1) | 2010.08.31 |