Please Enable JavaScript!
Gon[ Enable JavaScript ]

컬러비트 배경색 16 쓰기

기타 언어/C# & MFC
반응형

컬러비트 배경색 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이다.

그러므로 나중에 발생할 에러를 방지하기위해 캐스트 연산자를 적절히 써주는게 좋다
반응형
Posted by 녹두장군1
,