Á¦¸ñ : Ç㸣¹Ì 2.0 - Hercules [4] ¾È³çÇϼ¼¿ä Ç㸣¹ÌÀÔ´Ï´Ù. óÀ½ °­Á¸¦ ½ÃÀÛÇÒ¶§¿Í ºñ±³ Çؼ­ Ç㸣¹Ì 1.5 ´Â ¸¹Àº º¯È­°¡ ÀÖ¾úÀ¾´Ï´Ù. VGA ½ºÅ©·Ñ ·çƾÀÇ ¹ö±×°¡ ¼öÁ¤µÇ¾ú°í,±×·¡ÇÈ ·çƾÀÇ ÇÙ½ÉÀÎ Mask °è»ê ·çƾ¿¡µµ ¾à °£ÀÇ ¹ö±×°¡ ÀÖ´Â °ÍÀÌ È®ÀÎµÇ¾î ¼öÁ¤µÇ¾úÀ¾´Ï´Ù. ¶ÇÇϳª Å« º¯ È­¶ó¸é 'C' ¹öÀüÀÌ ¸¸µé¾î Á³´Ù´Â °ÍÀÔ´Ï´Ù. 'C++' ¹öÀüÀº Ŭ·¡ ½º°³³äÀ» µµÀÔÇؼ­ °´Ã¼ °ü¸®¿¡ ¶Ù¾î³ªÁö¸¸ ¸Þ¸ð¸® ¹®Á¦µî '¶óÀÌ ºê·¯¸®' ¿ëÀ¸·Î´Â ÀûÇÕÄ¡ ¾Ê´Ù°í ÆÇ´ÜÇÏ¿©¼­ ±×µ¿¾È ¸¸µé¾ú´ø ·ç ƾÀ» 'C' ¿ëÀ¸·Î ÄÁ¹öÆ®ÇÏ¿´°í,°´Ã¼ À©µµ¿ì °ü¸® ·çƾµµ 'C' ·Î ¸¸µé¾î ³Ö¾úÀ¾´Ï´Ù. ´ëºÎºÐÀÇ ·çƾÀº ±×´ë·Î »ç¿ëÇÏ¿´°í.. ³ªÁß ¿¡´Â .CPP ¿ÍÀÇ ¸µÅ©¸¦ À§ÇÑ º¸Á¶ ¶óÀ̺귯¸®ÀÎ 'Class ¸ðÀ½' À» ¼Ò°³Çϵµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. ÀÏ´ÜÀº Ç㸣¹Ì 1.5 ´Â '.C' ·Î¸¸ µÇ¾î ÀÖÀ¾´Ï´Ù. À©µµ¿ì·çƾ,Quick ·çƾµîµµ ¸ðµÎ C ·Î ÄÁ¹öÁ¯ÇßÀ¸´Ï °ð Á¤¸®°¡ ³¡³ª´Â´ë·Î ÀÚ·á½Ç¿¡ ¾÷Çϵµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. ¶ÇÇÑ Inline Assembly,Select Link ¿¡ ´ëÇÑ Æ¯°­À» °­ÁÂÀÇ ÀÌÇظ¦ À§ ÇØ ¿Ã·Á³õµµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. ±æ±â¸¸ ÇÑ °­Á¿©ÇàÀÇ ÈÞ°Ô¼Ò ¿ªÇÒÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ƯÈ÷ Inline Assembly ¿¡ ´ëÇÑ °ÍÀº ¿¹Àü ¿¡µµ Çѹø ¼³¸íÇÑ Àû ÀÖÁö¸¸ °­ÁÂÀÇ ÁÖ¿ä Ãâ·Â Ä¿³Î ºÎºÐÀ» ÀÌÇØ Çϱâ À§Çؼ­´Â ÇʼöÀûÀÔ´Ï´Ù. ÀÌ ºÎºÐ¿¡ ´ëÇØ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸í À» ¿øÇϽô ºÐÀÌ ¸¹¾Æ¼­ ÀÚ¼¼ÇÏ°í ½±°Ô °­Á¸¦ Çغ¸·Á°í ÇÕ´Ï ´Ù. ±×¸®°í Select Link.. ¿äÁîÀ½ ´ëºÎºÐÀÇ ÇÑ±Û ¶óÀ̺귯¸®´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ÀÇÇؼ­ ÀÚµ¿ ½ÇÇàÀ» ±¸ÇöÇÕ´Ï´Ù. ÀçÀ۳⿡ Á¦°¡ Á¦ Ç㸣¹Ì 1.0 ¿¡ ÀÌ·¯ÇÑ ¹æ¹ýÀ» ½è¾úÀ¾´Ï´Ù. ÀÌ ¹æ¹ýÀº ÀåÁ¡µµ ¸¹Áö¸¸ ´ÜÁ¡µµ ¸¹½À´Ï´Ù. Ç㸣¹Ì 1.5 ¿¡¼­´Â ´ÜÁ¡µéÀ» ±Øº¹ÇÏ°í ÀåÁ¡À» ÃëÇÏ´Â »õ·Î¿î ¹æ¹ýÀ» »ç¿ëÇÏ°í ÀÖÀ¾´Ï´Ù. ÀÌ°ÍÀÌ ¹Ù·Î Select Link ÀÔ´Ï´Ù. ÀÌ¿¡ ´ëÇؼ­´Â ´ÙÀ½ °­Á¿¡ ¼Ò°³Çϵµ·Ï ÇÏ °ÚÀ¾´Ï´Ù. ¶ÇÇÑ »õ·Î ±¸¼ºÇÑ 'C' À©µµ¿ì ·çƾµµ Á¶¸¸°£ °ø°³ÇÏ°Ú À¾´Ï´Ù. ÇÏÁö¸¸ 1.5 ´Â ¼Ò½º¿Í ÇÔ²² °ø°³µÇÁö´Â ¾Ê½À´Ï´Ù. ÀÚ¼¼ ÇÑ ¸Þ´º¾ó°ú ¶óÀ̺귯¸®,Çì´õÈ­ÀÏ,¼³¸íÈ­ÀÏ,Å×½ºÆ® ÇÁ·Î±×·¥ÀÌ ¹­¿©¼­ ¿Ã¶ó°¥ °ÍÀÔ´Ï´Ù. Âü°íÇϼ¼¿ä. ¿À´ÃÀº Hercules ¿¡¼­ÀÇ Dot ´ÜÀ§ Image Á¦¾î ·çƾÀ» »ì Æ캸¸é¼­ Hercules ¿¡ ´ëÇÑ °­Á¸¦ ¸¶Ä¥±î ÇÕ´Ï´Ù. Àá±ñ Àú¹ø °­ Á¿¡ ´ëÇؼ­ ¤°í ³Ñ¾î°¥ °ÍÀÌ ÀÖ´Ù¸é.. Scroll ¿¡ ´ëÇÑ °ÍÀÔ´Ï ´Ù. Scroll Up/Down ·çƾÀº Ç㸣¹Ì 1.5 ¿¡¼­ °¡·Î,¼¼·Î ¸ðµÎ µµ Æ®´ÜÀ§·Î °¡´ÉÇÏ°Ô ÇÏ°í ÀÖÀ¾´Ï´Ù. Hercules ÀÇ °æ¿ì Bit ¿¬»êÀ¸ ·Î ÇØ°áÇÒ ¼ö ÀÖÁö¸¸ VGA ÀÇ °æ¿ì °£´ÜÈ÷ ÇØ°áÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø½À´Ï´Ù. Á¦°¡ ¾ÆÁ÷ VGA ¾²±â¸ðµå 1 ¿¡ ´ëÇÑ Á¤º¸°¡ ÃæºÐÇÏÁö ¸øÇÑ °ü°è·Î Bitmask ¿Í VGA ¾²±â¸ðµå 1 ÀÇ °ü°è¸¦ ÆľÇÇÏÁö ¸ø ÇßÀ¾´Ï´Ù. µû¶ó¼­ Á¶±Ý Ư¼öÇÑ ¹æ¹ýÀ¸·Î °¡·Î µµÆ®´ÜÀ§ ½ºÅ©·ÑÀ» ±¸ÇöÇßÀ¾´Ï´Ù. ¼Óµµ»ó Á¶±Ý ¶³¾îÁö´Â ´ÜÁ¡ÀÌ Àִµ¥ ¼Óµµ°¡ ÇÊ¿ä ÇÒ ¶§¸¦ ´ëºñÇؼ­ Fast Scroll ·çƾ,Áï ¼¼·Î´Â µµÆ®´ÜÀ§ÀÌ°í °¡ ·Î´Â µµÆ®´ÜÀ§·Î ÁöÁ¤Çϸé ÀÚµ¿À¸·Î ¹ÙÀÌÆ®´ÜÀ§·Î Convert Çؼ­ ¹ÙÀÌÆ®´ÜÀ§·Î ½ºÅ©·ÑÇÏ°Ô µË´Ï´Ù. (Truncate) ÀÌµé ¼öÁ¤µÈ ºÎºÐ ¿¡ ´ëÇؼ­´Â ³ªÁß¿¡ ±âȸ°¡ ÀÖÀ»¶§ °ø°³ÇÏ°ÚÀ¾´Ï´Ù. Hercules ÀÇ À̹ÌÁö´Â Bit-map À̹ÌÁöÀÔ´Ï´Ù. Áï 8 bit ¸¦ ±âº»´ÜÀ§·Î ¸Þ¸ð¸®°¡ ÀÏ·Ä·Î ´Ã¾î¼­ Àִµ¥ ´ÜÁö ¹®Á¦¶ó¸é ÁÖ »ç¼±¿¡ µû¶ó 4 ºÐÁֵǹǷΠy ÁÂÇ¥¿¡ µû¶ó ¸Þ¸ð¸®°¡ 4 ºÎºÐÀ¸·Î ³ª´©¾î Áø´Ù´Â µ¥ ÀÖÀ¾´Ï´Ù.Çãŧ·¹½ºÀÇ ¸Þ¸ð¸® ±¸Á¶³ª À̹ÌÁö ·ç ƾÀÇ Á¦¾î ¿ø¸®µîÀº ÀÌ¹Ì ÀÚÁÖ ³ª¿Â °ÍÀ̹ǷΠÀÚ¼¼ÇÑ ¼³¸íÀº »ý ·«ÇÏ°ÚÀ¾´Ï´Ù. Àú¹ø,ÀúÀú¹ø °­ÁÂÀÇ ³»¿ëÀ» º¸¸é BoxFill ·çƾ µî ¿¡¼­ ¼³¸íÇß´ø ºÎºÐÀ» »ý°¢ÇØ º¾½Ã´Ù. ºñÆ® ¸¶½ºÅ©¸¦ ÀÌ¿ëÇؼ­ ¸Þ¸ð¸®¿Í Àû´çÇÑ ºñÆ®¿¬»êÀ» ÅëÇؼ­ µ¤¾î¾²±â¸¦ ±¸ÇöÇÏ´Â ¾Ë°í¸® ÁòÀÌ ³ª¿ÍÀÖÀ¾´Ï´Ù.¿©±â¼­ ´Ù½ÃÇѹø Á¤¸®ÇØ º¸°ÚÀ¾´Ï´Ù. 1. ¾µ µ¥ÀÌÅ͸¦ Àоî¿È 2. ºñÆ®¸¶½ºÅ© ¹ÝÀü 3. ¾µ ¸Þ¸ð¸®À§Ä¡¿¡ ¹ÝÀüµÈ ¸¶½ºÅ©¸¦ and 4. ºñÆ®¸¶½ºÅ© ¹ÝÀü 5. ºñÆ®¸¶½ºÅ©¿Í ¾µ µ¥ÀÌÅ͸¦ and 6. 5 ÀÇ °á°ú¸¦ ¸Þ¸ð¸® À§Ä¡¿¡ or ÀÌ»óÀ» °ÅÄ¡¸é ÇÑ ¹ÙÀÌÆ®¸¦ ¸Þ¸ð¸®¿¡ ºñÆ®¸¶½ºÅ©¿¡¼­ 1 ·Î Ç¥½Ã µÈ ºñÆ® ¸¸Å­¸¸ µ¤¾î¾µ ¼ö ÀÖ°Ô µË´Ï´Ù. À̹ÌÁö ·çƾÀº VGA ¿¡¼­ ¼³¸íÇÑ ¹Ù¿Í °°ÀÌ 1.0 °ú´Â ´Þ¸® 1.5 ¿¡¼­´Â Á¶±Ý ´Ù¸¥ ±¸Á¶¸¦ ÃëÇÕ´Ï´Ù. µµÆ®´ÜÀ§·Î Á¦¾î¸¦ °¡´ÉÇÏ°Ô ÇØ¾ß ÇϹǷΠ¹ÙÀÌÆ® ´ÜÀ§ ·Î ´ëÇ¥µÇ´Â °¡¿îµ¥ºÎºÐÀ» ¸ÕÀú ÀúÀåÇÏ°í,±×´ÙÀ½¿¡´Â ¿ÞÂÊ ºÎºÐ, ±×´ÙÀ½Àº ¿À¸¥ÂÊ ºÎºÐÀ» ¹öÆÛ¿¡ ´ã½À´Ï´Ù. Á¦ÀÏ Ã³À½ µÎ¹ÙÀÌÆ®´Â ¿ÞÂÊ ºÎºÐÀÇ Mask,¿À¸¥ÂÊ ºÎºÐÀÇ Mask ¸¦ unsigned char ÇüÀ¸·Î ´ã½À´Ï´Ù. ³ªÁß¿¡ hgPutImage ·çƾ¿¡¼­´Â ¸ÕÀú Mask ¸¦ ÀÐÀº ÈÄ °¡¿îµ¥ ºÎºÐÀ» ¸ÕÀú º¹±ÍÇÏ°í ¿ÞÂÊ ºÎºÐ,¿À¸¥ÂÊ ºÎºÐÀ» Â÷·Ê·Î º¹±ÍÇÏ°Ô µË´Ï´Ù.Çãŧ·¹½º´Â 8 dot °¡ 1 ¹ÙÀÌÆ®¿¡ ÇØ´çÇϹǷΠ½Ç Á¦·Î È®º¸ÇؾßÇÒ ¹öÆÛÀÇ Å©±â´Â ´ÙÀ½°ú °°ÀÌ °è»êµË´Ï´Ù. unsigned hgHImgSize(int x1,int y1,int x2,int y2) { unsigned size; int xs=x1/8+1; int xe=x2/8-1; size=(xe-xs+1)*(y2-y1+1); size+=((y2-y1+1)*2); /* for side */ size+=2; /* for two masks */ return size; } ½ÇÁ¦ ¼Ò½º¸¦ º¸½Ã¸é ¾Ë°ÚÁö¸¸ À̹ÌÁö ÀúÀåºÎºÐÀº ±×³É Àü¼ÛÇÏ°í ÀÖÀ¾´Ï´Ù. ±×·¯³ª À̹ÌÁö º¹±Í ºÎºÐÀº °¡¿îµ¥¸¦ º¹±ÍÇÏ´Â ºÎºÐ°ú ¾ç ¿·À» º¹±ÍÇÏ´Â ºÎºÐÀÌ Mask ¿¡ ÀÇÇؼ­ ±¸º°µË´Ï´Ù.°¡¿îµ¥ÀÇ °æ¿ì Mask °¡ 0xff ÀÔ´Ï´Ù. ¾ç¿·ÀÇ °æ¿ì Mask µµ ÇÔ¼öÀÇ ÀÔ·ÂÀ¸ ·Î ¹Þ¾Æ¼­ ó¸®ÇÏ°Ô µË´Ï´Ù. hercadd() µîÀÇ ÇÔ¼ö´Â Àú¹ø °­Á¿¡ ¼­ ¼³¸íµÈ ¹Ù ÀÖÀ¸´Ï Âü°íÇϼ¼¿ä. ½ÇÁ¦ À̹ÌÁö ÀúÀå°ú º¹±Í¸¦ ±¸ÇöÇÑ ·çƾÀÌ ´ÙÀ½¿¡ ÀÖÀ¾´Ï´Ù. Âü °íÇϼ¼¿ä. void hercgetimage(int x1,int y1,int x2,int y2,char *buff) { int y_width=y2-y1+1; int x_width=x2-x1+1; asm push ds _BX=ret_herc_offset(y1)+x1; _ES=FP_SEG(buff); _DI=FP_OFF(buff); asm mov ax,0b000h asm mov ds,ax _CX=y_width; get_loop1: asm push cx asm mov si,bx _CX=x_width; asm cld asm REP movsb /* ºí·°Àü¼Û */ hercadd(); asm pop cx asm loop get_loop1 asm pop ds } void hercputimage(int x1,int y1,int x2,int y2,char*buff, unsigned char mask) { int x_width=x2-x1+1; int y_width=y2-y1+1; unsigned char tmask=mask; asm push ds _BX=ret_herc_offset(y1)+x1; _DS=FP_SEG(buff); _SI=FP_OFF(buff); asm mov ax,0b000h asm mov es,ax _CX=y_width; asm mov ah,BYTE PTR tmask /* ¸¶½ºÅ© */ put_loop1: asm push cx asm mov cx,x_width; asm mov di,bx put_loop2: asm mov al,ds:[si] /* Àаí */ asm not ah /* µÚÁý°í */ asm and es:[di],ah /* and ÇÏ°í */ asm not ah /* µÚÁý°í */ asm and al,ah /* Masking */ asm or es:[di],al /* ¾²±â */ asm inc si /* ¿É¼ÂÁõ°¡ */ asm inc di /* ¿É¼ÂÁõ°¡ */ asm dec cx /* Ä«¿îÅÍ */ asm jnz put_loop2 hercadd(); asm pop cx asm loop put_loop1 asm pop ds } void hgHGetImage(int x1,int y1,int x2,int y2,char *buff) { int xs=x1/8+1; int xe=x2/8-1; unsigned offset; buff[0]=get_lmask(x1); /* left mask */ buff[1]=get_rmask(x2); /* right mask */ hercgetimage(xs,y1,xe,y2,&buff[2]); offset=(y2-y1+1)*(xe-xs+1)+2; hercgetimage(xs-1,y1,xs-1,y2,&buff[offset]); offset+=(y2-y1+1); hercgetimage(xe+1,y1,xe+1,y2,&buff[offset]); } void hgHPutImage(int x1,int y1,int x2,int y2,char *buff) { int xs=x1/8+1; int xe=x2/8-1; unsigned offset; unsigned char lmask,rmask; lmask=buff[0]; rmask=buff[1]; hercputimage(xs,y1,xe,y2,&buff[2],0xff); offset=(y2-y1+1)*(xe-xs+1)+2; hercputimage(xs-1,y1,xs-1,y2,&buff[offset],lmask); offset+=(y2-y1+1); hercputimage(xe+1,y1,xe+1,y2,&buff[offset],rmask); } À§¿¡¼­ º¸¸é get_lmask,get_rmask ¶ó´Â ³¸¼± ÇÔ¼ö°¡ ³ª¿ÍÀÖÀ¾´Ï ´Ù. ¿¹Àü¿¡ VGA ½ºÅ©·ÑÀ» ¼³¸íÇÒ¶§ get_mask ¶ó´Â ÇÔ¼öÀ» ¾´ÀûÀÌ ÀÖÀ¾´Ï´Ù. ÀÌ ÇÔ¼ö·Î´Â ¿À¸¥ÂÊÀÇ Mask ¸¦ ¿Ã¹Ù·Î °è»êÇÒ ¼ö ¾ø±â ¶§¹®¿¡ Left mask ¿Í Right Mask ¸¦ °¡Á®¿À´Â ·çƾÀ» ÀÛ¼ºÇßÀ¾´Ï ´Ù. unsigned char get_lmask(int x) { unsigned char mask=0xff; int r=x%8; mask>>=r; return mask; } unsigned char get_rmask(int x) { unsigned char mask=0xff; int r=x%8+1; mask>>=r; return ~mask; } °£´ÜÇÏÁÒ ? ÇÏÁö¸¸ Hercules ¿Í VGA °øÈ÷ Bitmask ¸¦ °áÁ¤Çϴµ¥ Å« °øÇåÀ» ÇÏ°í ÀÖ´Â ÇÔ¼öÀÔ´Ï´Ù.Á¦ÀÏ Ã³À½ÀÇ °è»êÀº ¸ðµÎ ÀÌ ÇÔ ¼ö·Î ºÎÅÍ ½ÃÀ۵˴ϴÙ. Àú¹ø °­ÁÂÀÇ ³»¿ë°ú ´Þ¶óÁø ºÎºÐÀÌ´Ï ÁÖ ÀÇÇؼ­ º¸¼¼¿ä.. ±×·³.. ´ÙÀ½ °­Á´ Ư°­ #1.Inline Assembly Ư°­ #2.Select Link ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°ÚÀ¾´Ï´Ù. ±×·³.Ç㸣¹Ì!