Á¦¸ñ : Ç㸣¹Ì 2.0 - Hercules [3] ¾È³çÇϼ¼¿ä Ç㸣¹ÌÀÔ´Ï´Ù. ¿À´ÃÀº Àü°­Á¿¡¼­ ¿¹°íÇß´ø ´ë·Î ¹Ú½ºÄ¥Çϱâ¿Í °¡·Î¼±±ß±â,¼¼·Î¼±±ß±â,½ºÅ©·Ñ ¾÷ÀÇ ¼Ò½º¸¦ º¸±â·Î ÇÏ°ÚÀ¾´Ï´Ù. ¿ì¼± ¹Ú½ºÄ¥ÇϱâÀÔ´Ï´Ù. ±ºµ¥±ºµ¥ ÁÖ¼®À» ´Þ µµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. Âü°íÇϼ¼¿ä. void hercfill(int x1,int y1,int x2,int y2,int color) { // hgGetHFillXPattern ÇÔ¼ö´Â x pattern À» µ¹·ÁÁÜ unsigned x_width=x2-x1+1; // x width unsigned y_width=y2-y1+1; // y width unsigned char xpattern=hgGetHFillXPattern(color); unsigned char ypattern=hgGetHFillYPattern(color); _BX=ret_herc_offset(y1)+x1; // offset °è»ê asm push ds asm push es asm mov ax,0b000h // segment Setting asm mov ds,ax asm mov es,ax asm mov cx,y_width // ¹Ýº¹ Ƚ¼ö asm mov al,BYTE PTR xpattern // pattern load asm mov dl,BYTE PTR ypattern // ÀÏ´Ü y pattern À» Çѹø Rotate ÇÕ´Ï´Ù. asm ror dl,1 // first bit must be 0,so pass. boxlp1: asm push cx asm mov cx,x_width asm mov di,bx <- bx -> di asm cld boxlp2: asm REP stosb hercadd(); <- offset Áõ°¡ noad: asm rol al,1 <- x pattern rotate asm cmp al,0 <- xpattern ÀÌ 0 À̸é asm je nost ³Ñ¾î°£´Ù. ( ymask ÀÇ ºñÆ®°¡ 0 Àΰæ¿ì ) asm mov BYTE PTR xpattern,al nost: asm pop cx asm push cx ypat(xpattern); <- ypattern ó¸® asm pop cx boxn1: asm loop boxlp1 asm pop es asm pop ds } void hsidefill(int x,int y1,int y2,unsigned char color,unsigned char ma sk) { unsigned char xpattern=hgGetHFillXPattern(color); unsigned char ypattern=hgGetHFillYPattern(color); _BX=ret_herc_offset(y1)+x; _CX=y2-y1+1; asm mov ax,0b000h asm mov es,ax asm mov al,BYTE PTR xpattern // xpattern load asm mov ah,al asm mov dh,BYTE PTR mask asm and ah,dh // masking asm mov dl,BYTE PTR ypattern // ypattern load asm rol dl,1 sfill: asm not dh // ¾²±âÀÛ¾÷..! asm and es:[bx],dh // Àü °­Á¸¦ Âü°í asm not dh // Çϼ¼¿ä. asm or es:[bx],ah // asm rol al,1 // xpattern rotate asm cmp al,0 // al is 0 ? asm je nost asm mov BYTE PTR xpattern,al nost: hercadd(); asm push cx ypat(xpattern); asm pop cx asm mov ah,al asm and ah,dh asm loop sfill } void hgHBoxFill(int x1,int y1,int x2,int y2,int color) { int xs=x1/8+1; int xe=x2/8-1; unsigned char rmask=~get_mask(x2+1); if (!rmask) rmask=0xff; hercfill(xs,y1,xe,y2,color); hsidefill(xs-1,y1,y2,color,get_mask(x1)); hsidefill(xe+1,y1,y2,color,rmask); } ¼Ò½ºÁß¿¡¼­ ¼³¸íÀ» ¾ÆÁ÷ ¾ÈÇÑ ºÎºÐÀÌ Àִµ¥.. ypat() À̶õ ºÎºÐ °ú hercadd() ¶õ ºÎºÐ,±×¸®°í al ÀÌ 0 À϶§ÀÇ Ã³¸®°¡ Àִµ¥.. ÀÏ´Ü Çϳª¾¿ »ìÆ캾½Ã´Ù. void hercadd() { asm add bx,02000h asm cmp bx,08000h asm jb noadd asm sub bx,07fb0h noadd: return; } hercadd ´Â ´Ù¸¥°Ô ¾Æ´Ï°í bx °¡ ÁÖ¼Ò¸¦ °¡¸®Å³¶§ ÇÑÁÙ ³»¸° ¿É ¼ÂÀ¸·Î ¸¸µé¾î ÁÖ´Â ÇÔ¼öÀÔ´Ï´Ù. Çãŧ·¹½º¿¡¼­ ÇÑÁÙ ³»¸±¶§ »ç¿ë ÇÕ´Ï´Ù. ÁÖ¼Ò´Â º¸Åë si,di ¸¦ »ç¿ëÇÏÁö¸¸ movsb µî¿¡ ÀÇÇؼ­ ÀÚ µ¿À¸·Î º¯ÇϹǷΠbx,dx ¿¡ ±× °ªÀ» º¸Á¸ÇØ ³õ½À´Ï´Ù. µû¶ó¼­ hercsub(),hercadd_dx(),hercsub_dx() ¿Í °°Àº ÇÔ¼öµéµµ ÀÖÀ¾´Ï ´Ù. void ypat(int xpat) { asm rol dl,1 asm jc noad3 asm mov al,0 return; noad3: asm mov al,BYTE PTR xpat return; } ypat Àº xpat À» ÀÔ·ÂÀ» ¹Þ°í ÀÖÀ¾´Ï´Ù. dl ·¹Áö½ºÅÍ¿¡´Â ypattern ÀÇ °ªÀÌ µé¾îÀִµ¥ À̸¦ ¿ÞÂÊÀ¸·Î ·ÎÅ×ÀÌÆ®Çغ¸¾Æ¼­ Carry °¡ ¹ß»ýÇϸé..Áï ±× ºñÆ®°¡ 1 À̸é al (¾µ µ¥ÀÌÅÍ) ·¹Áö½º ÅÍ¿¡´Â xpat (X pattern) ÀÇ °ªÀ» ³Ö°í.. ¾Æ´Ï¸é 0 À» ³Ö¾î ÁÝ´Ï ´Ù. ¾Æ±î ·çƾ¿¡¼­ al ÀÌ 0 À̸é xpattern ÀÇ ÃʱâÈ­ ·çƾÀ» °Ç ³Ê¶Ù´Â °ÍÀ» º¸¾ÒÀ¾´Ï´Ù. al Àº Çϳª¾¿ rotate µÇ´Âµ¥ xpattern ÀÇ °ª¿¡ rotate µÇ´Â al ÀÇ °ªÀ» °è¼ÓÀûÀ¸·Î ´ëÄ¡ÇØ¾ß ypat ÀÌ ¿Ã¹Ù¸£°Ô µ¿ÀÛÇÒ °ÍÀÔ´Ï´Ù. À̶§ al ÀÌ 0 À̸é xpattern ÀÚü¸¦ 0 À¸·Î ´ëÄ¡ÇÏ°Ô µÇ¹Ç·Î ±× ´ÙÀ½ÀÇ Ã³¸®¸¦ °è¼ÓÇØ ³ª°¥ ¼ö°¡ ¾ø °Ô µË´Ï´Ù. µû¶ó¼­ al ÀÌ 0 Àΰæ¿ì´Â xpattern ¿¡ º¯ÇÑ al ÀÇ °ª À» ³Ö¾îÁÖ´Â °ÍÀ» ÇÏÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ±×´ÙÀ½Àº °¡·Î¼± ±ß±âÀÔ´Ï´Ù. void hbyteline(int x1,int x2,int y,char color) { unsigned char xpattern=hgGetHlinePattern(color); _DI=ret_herc_offset(y)+x1; _CX=x2-x1+1; asm mov ax,0b000h asm mov es,ax asm mov al,BYTE PTR xpattern; // x pattern load asm REP stosb // Àü¼Û } void hsideline(int x,int y,char color,unsigned char mask) { unsigned char xpattern=hgGetHlinePattern(color); _BX=ret_herc_offset(y)+x; asm mov ax,0b000h asm mov es,ax asm mov ah,BYTE PTR xpattern asm mov al,BYTE PTR mask asm and ah,al // masking asm not al // reverse bitmask asm and es:[bx],al // È­¸é°ú and asm or es:[bx],ah // ¾²±â. } hbyteline Àº ¸Å¿ì ´Ü¼øÇÑ Ã³¸®¸¦ ÇÕ´Ï´Ù. al ¿¡ xpattern À» ·Î µåÇÏ°í stosb ·Î x2-x1+1 ¸¸Å­À» Àü¼ÛÇÏ¸é µË´Ï´Ù. hsideline µµ Àü°­ÁÂÀÇ ³»¿ëÀ» ÀÌÇØÇß´Ù¸é ±×´ë·Î ±× ·çƾÀ» ¾´ °ÍÀ̶ó´Â °ÍÀ» ¾Ë°Ô µÉ °Ì´Ï´Ù. void hvertline(int x,int y1,int y2,char color,unsigned char mask) { unsigned char ypattern=hgGetVlinePattern(color); _BX=ret_herc_offset(y1)+x; _CX=y2-y1+1; asm mov ax,0b000h asm mov es,ax asm mov dl,BYTE PTR ypattern asm mov al,BYTE PTR mask bfill: asm cmp dl,0 // ypattern ÀÌ 0 ÀÎ °æ¿ì asm jnz bnext asm not al // reverse mask asm and es:[bx],al // È­¸é°ú and asm not al // reverse mask hercadd(); asm jmp bnext2 bnext: asm or es:[bx],al // ypattern ÀÌ 0 ÀÌ ¾Æ´Ï¸é hercadd(); // ±×³É È­¸é°ú and ÇÑ´Ù. asm push cx ypat(mask); // ypattern ó¸® asm pop cx bnext2: asm loop bfill } ypattern ÀÇ °æ¿ì °è»êµÇ¾î ³Ñ°ÜÁ®¿Â mask ¸¦ ¼¼·Î·Î Âß Ãâ·ÂÇÏ ±â¸¸ ÇÏ¸é µË´Ï´Ù. ¿¹¸¦ µé¸é 00001000 ó·³ ³Ñ°ÜÁ® ¿À¸é ÀÌ°ÍÀ» ¼¼·Î·Î È­¸é¿¡ OR ÇÏ¸é µÇ´Âµ¥.. ´ÜÁö Ưº°ÇÑ °ÍÀº hputche ÀÇ °æ¿ìó·³ °ËÀº»ö ¼±À» ±×¸±¼ö°¡ ¾ø´Ù´Â µ¥ ÀÖÀ¾´Ï´Ù. µû¶ó¼­ ypattern ÀÌ 0 ÀÎ °æ¿ì¸¦ Ưº°È÷ °ËÀº¼±À¸·Î Á¤ÀÇÇßÀ¾´Ï´Ù. ypattern ÀÌ 0 ÀÌ ¾Æ´Ï¸é ±×³É OR ÇÏ°í 0 À̸é mask ¸¦ reverse ÇÏ¿© (11110111 ÀÌ µÊ.À§ÀÇ °æ¿ì) ÀÌ°ÍÀ» È­¸é°ú OR Çϸé mask ¿¡¼­ 0 Àΰ÷Àº È­¸éÀÌ 0 À¸·Î µÇ°í(°Ë°Ô¾²¿©Áü) ³ª¸ÓÁö´Â È­¸é±× ´ë·Î ³²¾ÆÀÖ°Ô µË´Ï´Ù. µû¶ó¼­ °ËÀº ¼±À¸·Î ±×¸±¼ö°¡ ÀÖ´Â °ÍÀÌ ÁÒ. ±×·³ ¿Ï¼ºµÈ ÇÔ¼öÀÔ´Ï´Ù. void hgHhline(int x1,int x2,int y,char color) { int xs; int xe; x2++; xs=x1/8+1; xe=x2/8-1; hbyteline(xs,xe,y,color); hsideline(xs-1,y,color,get_mask(x1)); hsideline(xe+1,y,color,~get_mask(x2)); } void hgHvline(int x,int y1,int y2,char color) { hvertline(x>>3,y1,y2,color,get_vmask(x)); } ¸¶Áö¸·À¸·Î ½ºÅ©·Ñ¾÷À» º¸°ÚÀ¾´Ï´Ù. ½ºÅ©·ÑÀÇ ÀϹÝÀû Ç㸣¹Ì 1.0 ¿¡¼­ÀÇ °­Á³ª VGA ½ºÅ©·Ñ ºÎºÐÀ» º¸½Ã±â ¹Ù¶ø´Ï´Ù. ¿©±â¿¡¼­´Â Ưº°ÇÑ Á¡¸¸À» º¸°ÚÀ¾´Ï´Ù. void hercscrup(int x1,int y1,int x2,int y2,int lines) { unsigned x_width=x2-x1+1; _BX=ret_herc_offset(y1)+x1; // ¸ñÀû ÁÖ¼Ò °è»ê _CX=y2-y1-lines+1; // y ¹Ýº¹È½¼ö asm push ds asm push es asm push cx // ÀÏ´Ü cx ÀúÀå asm mov ax,0b000h // segment set asm mov es,ax asm mov ds,ax asm mov dx,bx // ÀÏ´Ü ¼Ò½º<-¸ñÀû asm mov cx,WORD PTR lines // ¿©±â´Â dx ¸¦ // ¾Æ·¡·Î uplp0: hercadd_dx(); // n line ³»·ÁÁÝ asm loop uplp0 // ´Ï´Ù. asm pop cx // ´Ù½Ã cx º¹±Í uplp2: asm push cx asm mov di,bx // di <- bx.. Destination asm mov si,dx // si <- dx.. Source _CX=x_width; // Àü¼Û·® asm cld uplp1: asm REP movsb // Àü¼Û! hercadd(); // bx ¸¦ ÇѶóÀÎ ³»¸² hercadd_dx(); // dx ¸¦ ÇѶóÀÎ ³»¸² asm pop cx asm loop uplp2 asm pop es asm pop ds } void hercsideup(int x,int y1,int y2,int lines,unsigned char mask) { unsigned char tmask=mask; _BX=ret_herc_offset(y1)+x; _CX=y2-y1-lines+1; asm push ds asm push es asm push cx // cx ÀúÀå asm mov ax,0b000h // segment set asm mov es,ax asm mov ds,ax asm mov dx,bx // ÀÏ´Ü dx<-bx asm mov cx,WORD PTR lines // dx ¸¦ lines uplp3: hercadd_dx(); // ¸¸Å­ ¾Æ·¡·Î asm loop uplp3 // ³»¸² asm pop cx // cx º¹±Í asm mov al,BYTE PTR tmask // al is bitmask uplp2: asm push cx asm mov di,bx // di <- bx,destination asm mov si,dx // si <- dx,source asm mov ah,ds:[si] // ¼Ò½º¿¡¼­ Àоî¿È asm and ah,al // masking asm not al // reverse bitmask asm and es:[di],al // È­¸é°ú and asm not al // reverse bitmask asm or es:[di],ah // ½ÇÁ¦·Î ¾¸(OR) hercadd(); // bx ³»¸®±â hercadd_dx(); // dx ³»¸®±â asm pop cx asm loop uplp2 asm pop es asm pop ds } void hgHScrUp(int x1,int y1,int x2,int y2,int lines,int bkcolor) { int xs=x1/8+1; int xe=x2/8-1; unsigned char rmask=~get_mask(x2+1); if (!rmask) rmask=0xff; hercscrup(xs,y1,xe,y2,lines); hercsideup(xs-1,y1,y2,lines,get_mask(x1)); hercsideup(xe+1,y1,y2,lines,rmask); hgHBoxFill(x1,y2-lines+1,x2,y2,bkcolor); } hercadd_dx() ÇÔ¼ö°¡ óÀ½ ³ª¿À´Âµ¥.. hercadd() ÇÔ¼öÀÇ ³»¿ë¿¡ ¼­ ·¹Áö½ºÅ͸¸ dx ·Î ¹Ù²Ù¸é µË´Ï´Ù. hercsideup ÇÔ¼ö¸¦ º¸¸é Àü°­Á¿¡¼­ ¼³¸íÇÑ ¹Ù¿Í °°ÀÌ mask ¸¦ reverse ÇÏ¿© È­¸é°ú and ½ÃÅ°´Â µîÀÇ ÀÛ¾÷À¸·Î ½ºÅ©·ÑÀ» ¼öÇàÇÏ °í ÀÖÀ¾´Ï´Ù. ÀÌÀÇ ¿ø¸®´Â Àü°­Á¸¦ Âü°íÇϵµ·Ï Çϼ¼¿ä. ±×·³.. ´ÙÀ½ °­Á´ Hercules ¿¡¼­ ¾²ÀÌ´Â Image ·çƾ¿¡ ´ëÇÑ °­Á¸¦ °£ ´ÜÇÏ°Ô Çغ¸µµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. Ç㸣¹Ì!