<¸Þ¸ð¸® ³»¿ëÀ» Àо¾î Űº¸µå »óÅ ¾Ë¾Æ³»±â - 4°¡Áö ¹æ¹ý>

Űº¸µå »óÅ´ ¸Þ¸ð¸®ÀÇ Æ¯Á¤ ¹øÁö¸¦ ÀÐÀ¸¸é ¾Ë ¼ö Àִµ¥,
±×·± ¹æ½ÄÀ¸·Î Űº¸µåÀÇ »óŸ¦ ¾Ë¾Æ³»´Â ¹æ¹ý 4°¡Áö¸¦
¼Ò°³ÇϰڽÀ´Ï´Ù.

#include <bios.h>  /* bioskey() ÇÔ¼ö */
#include <dos.h>   /* int86() ÇÔ¼ö, REGS °ø¿ëü */
 
void read_keydata1(unsigned char *a,unsigned char *b,unsigned char *c)
/* Æ÷ÀÎÅÍ¿Í Ä³½ºÆ® ¿¬»êÀÚ¸¦ ÀÌ¿ë */
{
   int temp;
 
   temp=*(unsigned int far *)0x00400017;  
   /* 0040:0017 ¹øÁö¿¡¼­ 2 Byte Àо±â */ 
   *a=temp & 0xff;         
   /* ÇÏÀ§ ¹ÙÀÌÆ® - »óÀ§ ¹ÙÀÌÆ®°ªÀÌ µé¾îÀÖÀ½ (¿ª¿öµå ¹æ½Ä) */ 
   *b=(temp>>8) & 0xff;    
   /* »óÀ§ ¹ÙÀÌÆ® - ÇÏÀ§ ¹ÙÀÌÆ®°ªÀÌ µé¾îÀÖÀ½ */
   *c=*(unsigned char far *)0x00400096;   
   /* 0040:0096 ¹øÁö¿¡¼­ 1 Byte Àо±â */
}
 
void read_keydata2(unsigned char *a,unsigned char *b,unsigned char *c)
/* peek() / peekb() ÇÔ¼ö ÀÌ¿ë */
{
   int temp;
 
   temp=peek(0x0040,0x0017);   
   /* 0040:0017 ¹øÁö¿¡¼­ 2 Byte Àо´Â ÇÔ¼ö */
   *a=temp & 0xff;            
   /* & ¿¬»êÀ¸·Î ÇÏÀ§¹ÙÀÌÆ®¸¸ ÃßÃâ */  
   *b=(temp>>8) & 0xff;      
   /* »óÀ§ ¹ÙÀÌÆ® ÃßÃâ */
   *c=peekb(0x0040, 0x0096);   
   /* 0040:0096 ¹øÁö¿¡¼­ 1 Byte Àо´Â ÇÔ¼ö */ 
}
 
void read_keydata3(unsigned char *a, unsigned char *b)
/* ÀÎÅÍ·´Æ® 0x16(ah:0x12) »ç¿ë */
{
   int temp;
   union REGS r;
 
   r.h.ah=0x12;
   temp=int86(0x16,&r,&r);
 
   *a=temp & 0xff;
   *b=(temp>>8) & 0xff;
}
 
unsigned char read_keydata4(void)
/* bioskey(2) ÀÌ¿ë */
{
   return ((unsigned char)bioskey(2));
}
 
void main()
{
   unsigned char *first,*second,*third;
 
   read_keydata1(first, second, third);
   printf("(1) pointer : %d\n",*first);
   printf("(2) pointer : %d\n",*second);
   printf("(3) pointer : %d\n\n",*third);
 
   read_keydata2(first, second, third);
   printf("(1) peekb : %d\n",*first);
   printf("(2) peekb : %d\n",*second);
   printf("(3) peekb : %d\n\n",*third);
 
   read_keydata3(first, second);
   printf("(1) int86 : %d\n",*first);
   printf("(2) int86 : %d\n\n",*second);
 
   printf("(1) bioskey(2) : %d\n",read_keydata4());
}

1) ÇÁ·Î±×·¥ ¼³¸í

- ÇöÀç shift Ű¿Í Åä±Û۵éÀÌ ´­·¯Á® ÀÖ´Â »óÅÂÀÎÁö ¾Æ´ÑÁö¸¦
üũÇÏ´Â ¹æ¹ýÀº °£´ÜÇÏ´Ù.
ROM-BIOS µ¥ÀÌÅÍ ¿µ¿ªÀÇ 0040:0017 °ú 0040:0018 ÀÇ µÎ ¹ÙÀÌÆ®¿Í
0040:0096 ÀÇ ÇÑ ¹ÙÀÌÆ®¸¦ üũÇÏ¸é µÈ´Ù.
°¢ ۵éÀÇ »óŰ¡ ºñÆ®´ÜÀ§·Î ³ªÅ¸³ª Àֱ⠶§¹®¿¡, °¢ ºñÆ®°ªÀ»
üũÇϸé ÇöÀç ¾î¶² ۰¡ ´­·ÁÁ® ÀÖ´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
±×¿Ü 0040:0097 ÀÇ ÇÑ ¹ÙÀÌÆ®¸¦ üũÇϸé Űº¸µå LEDÀÇ »óŸ¦
¾Ë¾Æ³¾ ¼öµµ ÀÖ´Ù.
Űº¸µå¿¡ °ü·ÃµÈ Á¤º¸´Â ´ÙÀ½ÀÇ 4°³ÀÇ ÁÖ¼Ò¸¦ ÅëÇØ ´ëºÎºÐ ¾Ë¾Æ³¾
¼ö ÀÖ´Ù.

0040:0017 ¹øÁö´Â 86Űº¸µå¿Í È®ÀåµÈ Űº¸µå(101/102 Űº¸µå)
¸ðµÎ °ªÀÌ °°°í, 0040:0018 ¹øÁö´Â 86Űº¸µå¿Í È®ÀåµÈ Űº¸µå°¡
°ªÀÌ ´Ù¸£´Ù.
¾Æ·¡ÀÇ Ç¥´Â È®ÀåµÈ Űº¸µå ¿ëÀÌ´Ù.
0040:0096 ¹øÁö¸¦ Ã¼Å©ÇØº¸¸é È®ÀåŰº¸µå°¡ ¼³Ä¡µÇ¾ú´ÂÁö
¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

¸Þ¸ð¸® ÁÖ¼Ò 0040:0017 ÀÇ Á¤º¸

ºñÆ®

¼³¸í

7
6
5
4
3
2
1
0

Insert (1 : on, 0 : off)
Caps Lock (1 : on, 0 : off)
Num Lock (1 : on, 0 : off)
Scroll Lock (1 : on, 0 : off)
Alt ( 1 : press )
Ctrl ( 1 : press )
¿ÞÂÊ Shift ( 1 : press )
¿À¸¥ÂÊ Shift ( 1 : press )

¸Þ¸ð¸® ÁÖ¼Ò 0040:0018 ÀÇ Á¤º¸

ºñÆ®

¼³¸í

7
6
5
4
3
2
1
0

Sys Req ( 1 : press )
Caps Lock ( 1 : press )
Num Lock ( 1 : press )
Scroll Lock ( 1 : press )
¿À¸¥ÂÊ Alt ( 1 : press )
¿À¸¥ÂÊ Ctrl ( 1 : press )
¿ÞÂÊ Alt ( 1 : press )
¿ÞÂÊ Ctrl ( 1 : press )

¸Þ¸ð¸® ÁÖ¼Ò 0040 : 0096 ÀÇ Á¤º¸

ºñÆ®

¼³¸í

4
3
2

È®Àå Űº¸µå ( 1: ¼³Ä¡µÊ )
¿À¸¥ÂÊ Alt ( 1 : press )
¿À¸¥ÂÊ Ctrl ( 1 : press )

¸Þ¸ð¸® ÁÖ¼Ò 0040 : 0097 ÀÇ Á¤º¸

ºñÆ®

¼³¸í

2
1
0

Caps Lock LED ( 1 : ÄÑÁü, 0 : ²¨Áü )
Num Lock LED ( 1 : ÄÑÁü, 0 : ²¨Áü )
Scroll Lock LED ( 1 : ÄÑÁü, 0 : ²¨Áü )

¨ç read_keydata1()

- ÀÌ ÇÔ¼ö´Â Æ÷ÀÎÅÍ¿Í Ä³½ºÆ® ¿¬»êÀÚ¸¦ ½á¼­ ¸Þ¸ð¸® ³»¿ëÀ» Á÷Á¢
Àо °ÍÀÌ´Ù.
(unsigned int far *)ÇüÀ» »ç¿ëÇØ¼­ µÚÀÇ 0x00400017ÀÌ ÁÖ¼Ò¶ó´Â
°ÍÀ» ¾Ë¸° ´ÙÀ½, °£Á¢ÁöÁ¤¿¬»êÀÚÀÎ *¸¦ »ç¿ëÇØ¼­ ±× ÁÖ¼ÒÀÇ ³»¿ëÀ»
Àо´Ù.
unsigned int¸¦ »ç¿ëÇßÀ¸¹Ç·Î ±× ÁÖ¼Ò¿¡¼­ºÎÅÍ 2¹ÙÀÌÆ®¸¦ Àо´Â
°ÍÀÌ´Ù.
unsigned charÀ» ¾²¸é 1¹ÙÀÌÆ®¸¸ Àо´Ù.

0040:0017¹øÁö¿¡¼­ 0040:0018¹øÁö±îÁö Àо 2¹ÙÀÌÆ®ÀÇ ³»¿ëÀ»
temp¶ó´Â Àӽú¯¼ö¿¡ ÀúÀåÇϴµ¥, ÀúÀåµÉ ¶§ ¿ª¿öµå ¹æ½Ä¿¡ µû¶ó
»óÀ§ ¹ÙÀÌÆ®¿Í ÇÏÀ§ ¹ÙÀÌÆ®°¡ ¹Ù²Ù¾î ÀúÀåµÈ´Ù.
±× ´ÙÀ½ *a ¿¡ tempÀÇ ÇÏÀ§¹ÙÀÌÆ®¸¦, *b¿¡ »óÀ§¹ÙÀÌÆ®¸¦ ÀúÀåÇß´Ù.
¿ª¿öµå ¹æ½Ä¿¡ µû¶ó *a ¿¡´Â 0040:0017ÀÇ ³»¿ëÀÌ, *b¿¡´Â
0040:0018ÀÇ ³»¿ëÀÌ µé¾îÀÖ´Ù.

*c¿¡´Â 0040:0096 ¹øÁö¿¡¼­ ÇÑ ¹ÙÀÌÆ®¸¸ Àо °ªÀÌ ÀúÀåµÈ´Ù.

¨è read_keydata2()

* int peek(unsigned segment, unsigned offset);
* char peekb(unsigned segment, unsigned offset);
- peek() ÇÔ¼ö´Â ¸Þ¸ð¸®¿¡¼­ segment:offset À¸·Î Á¤ÇØÁø ÁÖ¼ÒÀÇ
³»¿ëÀ» 2¹ÙÀÌÆ® Àо°í, peekb() ÇÔ¼ö´Â peek()ÇÔ¼ö¿Í ºñ½ÁÇÑ
¿ªÇÒÀ» ÇÏÁö¸¸, ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» 1¹ÙÀÌÆ®¸¸ Àо´Ù.

¨é read_keydata3()

- INT 16h´Â Űº¸µå¸¦ Á¦¾îÇÏ´Â ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÌ´Ù.
Çϵå¿þ¾î ÀÎÅÍ·´Æ® INT 09h ¿¡ ÀÇÇØ¼­ ŰÀÔ·ÂÀÌ ÀÌ·ç¾î Áø ÈÄ,
·Ò ¹ÙÀÌ¿À½º µ¥ÀÌÅÍ ¿µ¿ªÀÇ ¿øÇü Űº¸Æ® ¹öÆÛ¿¡ °ªÀÌ ÀúÀåµÇ¸é,
INT 16h¿¡ ÀÇÇØ¼­ ±× °ªÀ» ÀоîµéÀÏ ¼ö ÀÖ´Ù.

( INT 16h )   
    * ÀÔ·Â : AH=02h (¸ðµç Űº¸µåÀÇ »óŸ¦ °¨Áö)
    * ÀÔ·Â : AH=12h 
            (0040:0096 ¹øÁö¿¡ È®Àå Űº¸µå°¡ ÀνºÅçµÇ¾ú´Ù´Â 
             Ç¥½Ã°¡ ÀÖÀ» ¶§¸¸ »ç¿ë °¡´É)
 
   ** Ãâ·Â : AH : 0040:0018 ¹øÁöÀÇ µ¥ÀÌÅͰªÀÌ ÀÔ·Â 
             AL : 0040:0017 ¹øÁöÀÇ µ¥ÀÌÅͰªÀÌ ÀÔ·Â
            (´Ü, ALÀÇ °ªÀº ÀԷ°ª AH=02h/12h »ó°ü¾øÀÌ °°°í, 
             AHÀÇ °ªÀº 86Űº¸µå¿Í È®ÀåŰº¸µå°¡ °ªÀÌ ´Ù¸£´Ù. )

¨ê read_keydata4()

- bioskey(0)

: ¹öÆÛ·ÎºÎÅÍ Å°ÀÔ·ÂÀ» ¹Þ¾Æ ½ºÄµÄڵ尪À» ¸®ÅÏÇϰí,
¹öÆÛ¸¦ Áö¿î´Ù.
¸¸¾à ¹öÆÛ¿¡¼­ Áö¿ï ³»¿ëÀÌ ¾ø´Ù¸é Űº¸µå¿¡¼­ ÀÔ·ÂÀÌ ÀÖÀ»
¶§±îÁö ±â´Ù·È´Ù°¡ Áö¿î´Ù.

- bioskey(1)

: ¹öÆÛ·ÎºÎÅÍ Å°ÀÔ·ÂÀ» ¹Þ¾Æ ½ºÄµÄڵ尪À» ¸®ÅÏÇϴµ¥,
¹öÆÛ´Â Áö¿ìÁö ¾Ê´Â´Ù.
¸¸¾à ¹öÆÛ°¡ ºñ¾îÀÖ´Ù¸é 0À» ¸®ÅÏÇÑ´Ù.

- bioskey(2)

: 0040:0017 ¹øÁöÀÇ ³»¿ë(BIOSÀÇ shift »óÅ flag)À» Àоî
±× °ªÀ» ¸®ÅÏÇÑ´Ù.
bioskey() ÇÔ¼ö´Â intÇü(2¹ÙÀÌÆ®)À» ¸®ÅÏÇϴµ¥, ±× Áß
ÇÏÀ§¹ÙÀÌÆ®°¡ ¿øÇÏ´Â ³»¿ëÀ̹ǷΠ&¿¬»êÀ» ÀÌ¿ëÇØ¼­
ÇÏÀ§¹ÙÀÌÆ®¸¸ ÃßÃâÇØ ³¾ ¼ö ÀÖµµ ÀÖ°í, »ê¼ú º¯È¯ ±ÔÄ¢À»
ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù. demotionÀÇ °æ¿ì »óÀ§ ºñÆ®°¡ Àß·Á³ª°¡¹Ç·Î
ij½ºÆ®¿¬»êÀÚ¸¦ ½á¼­ ÇÏÀ§¹ÙÀÌÆ®¸¸ ±¸ÇÏ´Â °ÍÀÌ´Ù.

2) ¿ª¿öµå ¹æ½Ä

Á¤¼ö 1998À» ¸Þ¸ð¸®¿¡ ÀúÀåÇÑ´Ù°í »ý°¢Çغ¸ÀÚ.

À§ÀÇ Á¤¼ö°¡ ¸Þ¸ð¸®¿¡ ÀúÀåµÉ ¶§¿¡´Â »óÀ§ ¹ÙÀÌÆ®, ÇÏÀ§ ¹ÙÀÌÆ®ÀÇ
¼øÀ¸·Î ÀúÀåµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ±× ¹Ý´ë·Î ÇÏÀ§ ¹ÙÀÌÆ®, »óÀ§ ¹ÙÀÌÆ®
¼øÀ¸·Î, Áï ¿ª¼øÀ¸·Î ÀúÀåµÈ´Ù.
À§ÀÇ ¿¹¿¡¼­ 1998Àº 0xCE, 0x07 °ú °°ÀÌ ¿ª¼øÀ¸·Î ÀúÀåµÈ´Ù.
ÀÌ·¯ÇÑ ÀúÀ广½ÄÀ» ¿ª¿öµå ¹æ½ÄÀ̶ó°í ÇÑ´Ù.
ºÎÈ£ÀÖ´Â(signed)Çü¿¡¼­ MSB´Â ºÎÈ£ºñÆ®·Î »ç¿ëµÈ´Ù.
MSB°¡ 1À̸é À½¼ö, 0ÀÌ¸é ¾ç¼ö¶ó°í ÆÇ´ÜÇÑ´Ù.

3) »ê¼ú º¯È¯ ±ÔÄ¢

- »ê¼úº¯È¯ ±ÔÄ¢ ¿ì¼±¼øÀ§ Ç¥¿¡¼­ È­»ìÇ¥ ¹æÇâÀÌ
promotionÀ̰í, ¹Ý´ë¹æÇâÀÌ demotion ÀÌ´Ù.

¨ç promotion
- ºÎȣȮÀå(sign extension)¿¡ ÀÇÇÑ´Ù.
Áï º¯È¯µÇ±â ÀüÀÇ µ¥ÀÌÅÍÇüÀÌ ºÎÈ£ÀÖ´Â(signed) ÇüÀ̰í,
±× °ªÀÌ À½¼ö(MSB°¡ 1)À̸é 2ÀÇ º¸¼öÇüŸ¦ °è¼Ó À¯ÁöÇϱâ
À§ÇÏ¿© È®ÀåµÇ´Â ºñÆ®¸¦ 1·Î ä¿î´Ù. ºÎÈ£ÀÖ´Â ÇüÀ̰í, 0ÀÌ»óÀÇ
¼öÄ¡À̸é(MSB°¡ 0)À̸é È®ÀåµÇ´Â ºñÆ®¸¦ 0À¸·Î ä¿î´Ù.
¹Ý´ë·Î ºÎÈ£¾ø´Â ÇüÀ̸é È®ÀåµÇ´Â ºñÆ®¸¦ ¾ðÁ¦³ª 0À¸·Î ä¿î´Ù.

- Á¤¼öÇüÀÌ ºÎµ¿ÇüÀ¸·Î º¯È¯µÉ °æ¿ì¿¡´Â Á¤¹Ðµµ¿¡ ±ØÈ÷ ¹Ì¹ÌÇÑ
¼Õ½ÇÀÌ ÀÖÀ» ¼ö ÀÖ´Ù.
- floatÇüÀÌ doubleÇüÀ¸·Î ¹Ù²î¸é È®ÀåµÇ´Â °¡¼öºÎ¸¦ 0À¸·Î ä¿î´Ù.
- enumÀÌ º¯È¯µÉ ¶§ enumÀÌ ºÎÈ£¾ø´Â ÇüÀ̸é unsignedÇüÀ¸·Î º¯È¯µÈ´Ù.

¨è demotion
- º¯È¯µÇ±â ÀüÀÇ »óÀ§ºñÆ®°¡ Àß·Á³ª°£´Ù.

4) ¼¼±×¸ÕÆ®(segment)¿Í ¿ÀÇÁ¼Â(offset)

IBM PC¿¡¼­´Â 1MBÀÇ ¸Þ¸ð¸®¸¦ °ü¸®Çϱâ À§ÇØ ¼¼±×¸ÕÅ×À̼Ç
(Segmentation)±â¹ýÀ» »ç¿ëÇÑ´Ù. ¼¼±×¸ÕÆ®´Â 1MBÀÇ ¸Þ¸ð¸®¸¦
64KB·Î ³ª´« Á¶°¢À¸·Î PC°¡ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ´ÜÀ§ÀÌ´Ù.
(64KB´Â 16ºñÆ®ÀÇ ¼¼±×¸ÕÆ® ·¹Áö½ºÅͰ¡ °¡¸®Å³ ¼ö ÀÖ´Â ¸Þ¸ð¸®ÀÇ
ÃÖ´ë Å©±âÀÌ´Ù.) ¶ÇÇÑ ¼¼±×¸ÕÆ® ½ÃÀÛÁÖ¼Ò¿¡¼­ÀÇ »ó´ëÀûÀÎ À§Ä¡·Î
¿ÀÇÁ¼ÂÀ» Àâ¾Æ ¿øÇÏ´Â ¹øÁö¸¦ Ç¥ÇöÇÑ´Ù.
ÀÌ·¸°Ô ¸Þ¸ð¸® °ü¸®¸¦ ¼¼±×¸ÕÆ®¿Í ¿ÀÇÁ¼ÂÀ¸·Î ³ª´« ÀÌÀ¯´Â
1MÀÇ ¸Þ¸ð¸® ÁÖ¼Ò°¡ 0000h ¡­FFFFFh ±îÁöÀ̸ç, 16ºñÆ® ·¹Áö½ºÅÍ
ÇÑ °³·Î´Â 0000h ¡­ FFFFh ±îÁö¹Û¿¡ Ç¥ÇöÇÒ ¼ö ¾ø±â ¶§¹®¿¡,
16ºñÆ® ·¹Áö½ºÅÍ 2°³¸¦ »ç¿ëÇØ¼­ ÁÖ¼Ò¸¦ ó¸®Çϱâ À§Çؼ­ÀÌ´Ù.
¸¸¾à 2°³ÀÇ 16ºñÆ® ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù¸é 32ºñÆ®À̹ǷÎ
0 ¡­ FFFFFFFFh ±îÁö¸¦ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.
¿©±â¼­ ÃÑ 20ºñÆ®¸¸ »ç¿ëÇÏ¸é µÇ¹Ç·Î 2°³ÀÇ ·¹Áö½ºÅ͸¦ ÁßøµÇ°Ô
ÇØ¼­ »ç¿ëÇÑ´Ù.

¼¼±×¸ÕÆ®¿Í ¿ÀÇÁ¼ÂÀ» ÀÌ¿ëÇÑ ÁÖ¼Ò°è»êÀº ´ÙÀ½°ú °°´Ù.

     segment * 0x10
  £«  offset 
  ------------------
    Àý´ë ÁÖ¼Ò

¼¼±×¸ÕÆ®ÀÇ ´ÜÀ§´Â ¿ÀÇÁ¼ÂÀÇ ´ÜÀ§º¸´Ù 10h¸¸Å­ Å©´Ù.
Áï, ¼¼±×¸ÕÆ®ÀÇ °ªÀ» ¿ÞÂÊÀ¸·Î 4ºñÆ® shift½ÃŲ °ÍÀÌ´Ù.
¿¹¸¦ µé¾î, A123F ¹øÁö¸¦ ³ªÅ¸³»´Âµ¥ ÀÖ¾î A000:123F ·Î
ÇØµµ µÇ°í, A123:000F ·Î Ç¥ÇöÀ» ÇØµµ µÈ´Ù.
ÀÌó·³ ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î ¿øÇÏ´Â ¹øÁö¸¦ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

º¸Åë ¼¼±×¸ÕÆ®¿Í ¿ÀÇÁ¼Â¿¡¼­´Â ¿øÇÏ´Â ¹øÁöÀÇ Ã¹¸Ó¸®¿¡ 1000À»
°öÇÑ °ÍÀ» ¼¼±×¸ÕÆ®·Î, µÚÀÇ 4ÀÚ¸®¸¦ ¿ÀÇÁ¼ÂÀ¸·Î ÇÑ´Ù.