£Ë£Ï£Î ----- Kanji ON Linux console ----- ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï KON ¤ÎÆâÉô¹½Â¤¤ò¥É¥¥å¥á¥ó¥È²½¤·¤¿¤â¤Î¤Ç¤¹¡£¤Þ¤À̤´°À®¤Ç¤¹¤¬¡¢ ¥Ð¥°¼è¤ê¤ä²þ¤¤ÎºÝ¤Î»²¹Í¤Ë¤·¤Æ²¼¤µ¤¤¡£ £±¡¥Ê¸»ú½ÐÎϤÎή¤ì KON ¤Ç¤Ï²¾Áۥƥ¥¹¥È VRAM ¤òÄ̤·¤Æ²èÌ̽ÐÎϤò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£PTY ¤«¤é¤Î½ÐÎÏ¤Ï BUFSIZ ñ°Ì¤Ç¥Õ¥é¥°¥á¥ó¥È²½¤µ¤ì¤Æ VT ¥¨¥ß¥å¥ì¡¼¥¿¤Ë°ú¤ÅϤµ¤ì¤Þ¤¹¡£VT ¥¨¥ß¥å ¥ì¡¼¥¿¤Ï£±Ê¸»ú¤º¤Ä²òÀϤ·¤Æ²¾Áۥƥ¥¹¥È¤Ë½ÐÎϤ·¤Þ¤¹¡££±¤Ä¤Î¥Õ¥é¥°¥á¥ó¥È¤¬½èÍý¤µ ¤ì¤¿»þÅÀ¤Ç¥³¥ó¥½¡¼¥ë¤¬¥¢¥¯¥Æ¥£¥Ö¤Ê¤é¤Ð²¾Áۥƥ¥¹¥È¤ÎÆâÍƤò¤½¤Î¤Þ¤Þ VGA ²èÌ̤˽ñ ¤¹þ¤ß¤Þ¤¹¡£ £±.£±¡¥µ¿»÷üËö £±.£²¡¥VT ¥¨¥ß¥å¥ì¡¼¥¿ ¡ü¹½Â¤ÂÎ con VT ¥¨¥ß¥å¥ì¡¼¥¿¤Ë±÷¤±¤ë¥Æ¥¥¹¥È¾õÂÖ¾ðÊó¤Ï con ¹½Â¤ÂΤ˵²±¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ VT ¥¨¥ß¥å¥ì¡¼¥¿¤Ç¤Ï¥Æ¥¥¹¥ÈºÂɸ·Ï¤Ïº¸Ã¼¤ò¸¶ÅÀ[0, 0]¤È¤·¤Æ·×»»¤·¤Æ¤¤¤Þ¤¹¡£ struct _con_info { char x, ¸½ºß¤Î X ºÂɸ y, ¸½ºß¤Î Y ºÂɸ xmax, X ºÂɸºÇÂçÃÍ ymin, Y ºÂɸºÇ¾®ÃÍ ymax, Y ºÂɸºÇÂçÃÍ tab; TAB ¸Ä¿ô u_char fcol, ¥Õ¥©¥¢¥°¥é¥ó¥É¥«¥é¡¼ bcol, ¥Ð¥Ã¥¯¥°¥é¥ó¥É¥«¥é¡¼ attr, ʸ»ú°À¥Õ¥é¥° sfonth, Ⱦ³Ñ¥Õ¥©¥ó¥È¤Î¹â¤µ wfonth, Á´³Ñ¥Õ¥©¥ó¥È¤Î¹â¤µ knj1; ´Á»ú¥³¡¼¥ÉÂ裱¥Ð¥¤¥È enum { ESC_NEUTRAL, ESC ³° ESC_START, '\x1B' ¼õ¿® ESC_BRA, '[' ¼õ¿® ESC_SI, '$' ¼õ¿® ESC_SO, '(' ¼õ¿® ESC_QUESTION, '?' ¼õ¿® } esc; ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤Î¾õÂÖÊÑ¿ô bool knj, JIS ´Á»ú¥â¡¼¥É¥Õ¥é¥° soft, ¥½¥Õ¥È¥¦¥§¥¢¥¹¥¯¥í¡¼¥ë¥Õ¥é¥° ins, ÁÞÆþ¥â¡¼¥É¥Õ¥é¥° active, ¥¢¥¯¥Æ¥£¥Ö¥³¥ó¥½¡¼¥ë¥Õ¥é¥° saved, ¾Æ¤ÉÕ¤±Ëɻ߾õÂÖ wrap; wrap ¾õÂ֥ե饰 }; ¡üÊÑ¿ô scrollLine con.y ¤¬¥ê¡¼¥¸¥ç¥ó(con.ymin¡Ácon.ymax ¤ÎÈÏ°Ï)³°¤Ë¤Ê¤ì¤Ð¥¹¥¯¥í¡¼¥ë¤¹¤ëɬÍפ¬ ͤê¤Þ¤¹¡£¤·¤«¤·¡¢uum ¤Ê¤É¤Î FEP ¤Ç¤Ï¥·¥¹¥Æ¥à¥é¥¤¥ó¤Ëʸ»ú½ÐÎϤ¹¤ëºÝ¤Ëɬ¤º¥ê¡¼ ¥¸¥ç¥ó³°¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤³¤Ç¡¢\Ey:xH ¤Ë¤è¤ë¥«¡¼¥½¥ë°ÜÆ°¤ËÂФ·¤Æ¤Ï¥¹¥¯¥í¡¼¥ë¤·¤Ê¤¤ ¤è¤¦¤Ë¤·¤Þ¤·¤¿¡£¤³¤ì°Ê³°¤ÎÊýË¡¤Ç con.y ¤¬¥ê¡¼¥¸¥ç¥ó³°¤Ë½Ð¤¿¾ì¹ç¤Ï¡¢ÊÑ¿ô scrollLine ¤ËŬÅö¤Ê¥¹¥¯¥í¡¼¥ë¹Ô¿ô¤¬²Ã»»¤µ¤ì¤Þ¤¹¡£con.ymin ¤è¤ê¾®¤µ¤¤¾ì¹ç¤ÏÉé ¿ô¡¢con.ymax ¤è¤êÂ礤¤¾ì¹ç¤ÏÀµ¿ô¤¬¤½¤ì¤¾¤ì²Ã»»¤µ¤ì¤Þ¤¹¡£À©¸æ¥³¡¼¥É(ɽ¼¨ÉÔ²Äǽ ʸ»ú)¤¬ÆþÎϤµ¤ì¤¿»þÅÀ¤ÇÊÑ¿ô scrollLine ¤ò¼ÂºÝ¤Î¥¹¥¯¥í¡¼¥ë¤ËÈ¿±Ç¤·¤Þ¤¹¡£ £±.£³¡¥²¾Áۥƥ¥¹¥È ²¾Áۥƥ¥¹¥È¤Ï£³¤Ä¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¤Ê¤ê¤Þ¤¹¡£ ¡ü¥Æ¥¥¹¥È¥Ð¥Ã¥Õ¥¡ ¥Æ¥¥¹¥È¤Î¥¥ã¥é¥¯¥¿¥³¡¼¥É¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£È¾³Ñʸ»ú¤Ï¤½¤Î ASCII ¥³¡¼¥É¤¬¤½¤Î¤Þ ¤Þ³ÊǼ¤µ¤ì¤Þ¤¹¡£´Á»ú¤Î¾ì¹ç¤Ï EUC/SJIS ¤È¤â¤Ë JIS ¥³¡¼¥É¤ËÊÑ´¹¤µ¤ì¤Æ³ÊǼ¤µ¤ì¤Þ¤¹¡£ ¤Þ¤¿¡¢BIG5 ¤Ç¤Ï Mule ³ÈÄ¥¤Î "ESC$(0" ¤¬Íè¤ì¤Ð BIG5 ¤Î 16bit ¥³¡¼¥É¤ËÊÑ´¹¤µ¤ì¤Æ ³ÊǼ¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢EUC ¤Î¾ì¹ç¤Ï¤É¤Î¸À¸ì¤Ç¤â´Á»úƱÍÍ¤Ë 8bit ¤¬Í¤ì¤Æ³ÊǼ¤µ¤ì ¤Þ¤¹¤Î¤Ç¡¢BIG5 ¤Ç EUC ¤Ë¤¹¤ë¤È¾ðÊó¤¬Íî¤Á¤Þ¤¹¡£ ¡ü¿§¡¦Â°À¥Ð¥Ã¥Õ¥¡ ¿§¤È°À¤Î¾ðÊ󤬳ÊǼ¤µ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢Á´³Ñʸ»ú¤Î¾ì¹ç¤Ï¼ã¤¤¥¢¥É¥ì¥¹¤Ë¤·¤«³ÊǼ ¤µ¤ì¤Þ¤»¤ó¡£³Æ¥Ó¥Ã¥È¤Î°ÕÌ£¤Ï°Ê²¼¤ÎÍͤʤâ¤Î¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ MSB LSB |b7|b6|b5|b4|b3|b2|b1|b0| b2¡Áb0: ¥Õ¥©¥¢¥°¥é¥ó¥É¿§ b3: ̤»ÈÍÑ b6¡Áb4: ¥Ð¥Ã¥¯¥°¥é¥ó¥É¿§ b7: ²¼Àþ°À ¡ü¥Õ¥é¥°¥Ð¥Ã¥Õ¥¡ ¥Õ¥é¥°¥Ð¥Ã¥Õ¥¡¤Ï³ºÅö¥Æ¥¥¹¥È¤ÎÊѹ¹¾ðÊó¤È¸À¸ì¾ðÊó¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£MSB¤ÏÊѹ¹¾ð Êó¤Ç¡¢¥Æ¥¥¹¥È¤Ø¤Î½ñ¤¹þ¤ß¤¬µ¯¤³¤ë¤È 0 ¤Ë¤Ê¤ê¡¢¤½¤ì¤¬¼Â²èÌ̤ØÈ¿±Ç¤µ¤ì¤ë¤È 1 ¤È ¤Ê¤ê¤Þ¤¹¡£¼¡¤Î 2bit ¤Ï Double Byte ¥³¡¼¥É¤ò°ÕÌ£¤·¤Æ¤ª¤ê¡¢Âè 1 ¥Ð¥¤¥È¤Ê¤é¤Ð b5 ¤¬¡¢Âè 2 ¥Ð¥¤¥È¤Ê¤é b6 ¤¬ 1 ¤È¤Ê¤ê¤Þ¤¹¡£Âè 1 ¥Ð¥¤¥È¤Î b3-b0 ¤Ë¤Ï¸À¸ì¾ðÊó¤¬Æþ¤ê ¤Þ¤¹¡£º£¸å¡¢Âбþ¸À¸ì¤¬Áý¤¨¤ì¤Ð b4 ¤¢¤ë¤¤¤Ï Âè 2 ¥Ð¥¤¥È¤Î¶õ¤¥Ó¥Ã¥È¤ò¸À¸ì¾ðÊó¤Ë ³ä¤êÅö¤Æ¤ëͽÄê¤Ç¤¢¤ë¡£¸À¸ì¾ðÊó¤Ï¡¢ enum { DF_GB2312, DF_JISX0208, DF_KSC5601, DF_JISX0212, DF_BIG5_0, DF_BIG5_1 }; ¤ÈÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£ MSB LSB | b7| b6| b5|b4||b3|b2|b1|b0| |CLEAN_S|LATCH_2|LATCH_1| ||<--------->| |0=latch| byte2| byte1| || LANG| 80x30 ¤Î ɸ½à VGA ²èÌ̤ǥƥ¥¹¥ÈºÂɸ[5, 3](º¸¶ù¤Ï[0, 0])¤Ë¡Ö1¤¢¡×¤òÇò¿§ÇØ·Ê¿§ ̵¤·¤Çɽ¼¨¤¹¤ë¤È¡¢ ÁêÂÐ¥¢¥É¥ì¥¹: 80 x 3 + 5 = 245 ¡Ö1¡×¤Î ASCII ¥³¡¼¥É: 0x31 ¡Ö¤¢¡×¤Î JIS ¥³¡¼¥É: 0x2422 Çò¿§ÇØ·Ê¿§¤Ê¤·: 00000111(B) = 0x07 textBuff[245] = 0x31 attrBuff[245] = 0x07 flagBuff[245] = 0x00 textBuff[246] = 0xA2 textBuff[247] = 0x24 attrBuff[246] = 0x07 attrBuff[247] = 0x07 flagBuff[246] = 0x22 flagBuff[247] = 0x40 ¤È¤Ê¤ê¤Þ¤¹¡£ £²¡¥VGA ²¾Áۥƥ¥¹¥È¤òºÎÍѤ¹¤ë¤³¤È¤Ë¤è¤ê VGA ÁàºîÉôʬ¤ò¾®¤µ¤¯¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤·¤¿¡£ EGA ¤Ê¤É¤Ø¤Î°Ü¿¢¤â³Ú¤Ë¤Ê¤Ã¤¿¤È»×¤¤¤Þ¤¹¡£ £².£±¡¥¥ì¥¸¥¹¥¿ £².£²¡¥´ðËÜÁàºî ¡ü¹½Â¤ÂÎ dInfo ɽ¼¨Ç½ÎϤò¼¨¤¹¾ðÊó¤òÊݸ¤·¤Æ¤¤¤Þ¤¹¡£³ÆÃÍ¤Ï kon.cfg ¤«¤éÆɤ߹þ¤Þ¤ì¤¿¤â¤Î¡¢ ¤¢¤ë¤¤¤Ï¤½¤ì¤é¤Ë¤è¤ê»»½Ð¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£ struct dispInfo { int gsize; ¥°¥é¥Õ¥£¥Ã¥¯¥á¥â¥ê¥µ¥¤¥º = glineByte * gydim short gxdim, ¥°¥é¥Õ¥£¥Ã¥¯ X ¥É¥Ã¥È¿ô glineChar ¤ÎÀ°¿ôÇܤˤʤë¤è¤¦¤ËÀµµ¬²½¤µ¤ì¤¿ÃÍ gydim, ¥°¥é¥Õ¥£¥Ã¥¯ Y ¥é¥¤¥ó¿ô txmax, ¥Æ¥¥¹¥È X ºÇÂçÃÍ(con.xmax ¤Î½é´üÃÍ) tymax, ¥Æ¥¥¹¥È Y ºÇÂçÃÍ(con.ymax ¤Î½é´üÃÍ) glineChar, ¥Æ¥¥¹¥È£±¹Ôʬ¤Î¥°¥é¥Õ¥£¥Ã¥¯¥é¥¤¥ó¿ô = gydim / (tymax + 1) glineByte, ¥°¥é¥Õ¥£¥Ã¥¯£±¹Ôʬ¤Î¥Ð¥¤¥È¿ô = gxdim / 8 tlineByte; ¥Æ¥¥¹¥È£±¹Ôʬ¤Î¥°¥é¥Õ¥£¥Ã¥¯¥Ð¥¤¥È¿ô = glineChar * glineByte }; ¡ü¹½Â¤ÂÎ cInfo ¥«¡¼¥½¥ë¤Ë´Ø¤¹¤ë¾ðÊó¤Ç¤¹¡£ÅÀÌDzó¿ô¤Ï¶ö¿ô¤Ê¤éɽ¼¨Ãæ¤ò°ÕÌ£¤·¤Æ¤ª¤ê¡¢¥¹¥¯¥ê¡¼¥ó ¥»¥¤¥Ð¡¼¤Î¥«¥¦¥ó¥¿¡¼¤Ë¤â»È¤ï¤ì¤Æ¤¤¤Þ¤¹¡£addr ¤Ï VgaSetCursorAddress ¤Ë¤è¤Ã¤Æ ·×»»¤µ¤ì¤Þ¤¹¡£kanji ¤Ï¥«¡¼¥½¥ë°ÌÃÖ¤¬Á´³Ñ¤Ê¤éÈó£°ÃͤȤʤê¤Þ¤¹¡£É½¼¨¥¹¥¤¥Ã¥Á¤Ï ESC ¥·¡¼¥±¥ó¥¹¤Ë¤è¤Ã¤ÆÁàºî¤µ¤ì¤Þ¤¹¡£ struct cursorInfo { short kanji; ´Á»ú¤Î¾å¤Ë¤¢¤ì¤Ð TRUE u_int addr; VRAM ¥¢¥É¥ì¥¹ bool sw; FALSE ¤Ê¤éɽ¼¨¶Ø»ß int interval; ÅÀÌÇ´Ö³Ö int count; ÅÀÌÇÍÑ¥«¥¦¥ó¥È bool shown; ɽ¼¨Ãæ¥Õ¥é¥° }; £².£³¡¥WideText KON ¤Ç¤Ï VGA ¤ò¹â²òÁüÅ٥⡼¥É¤Ë°Ü¹Ô¤¹¤ë¤¿¤á¤Ë VGA ¤Î CRT À©¸æ¥ì¥¸¥¹¥¿¤È MISC ¥ì¥¸¥¹¥¿¤ò kon.cfg ¥Õ¥¡¥¤¥ë¤Ç»ØÄê¤Ç¤¤ëÍͤˤ·¤Æ¤¤¤Þ¤¹¡£VGA ËÜÍè¤Îµ¬³Ê¤«¤é¤¹¤ì¤Ð 800x600 ¤Þ¤Ç¤Î²òÁüÅ٤Ǥ¢¤ì¤Ð CRT À©¸æ¥ì¥¸¥¹¥¿¤È MISC ¥ì¥¸¥¹¥¿¤Î¤ß¤Ë¤è¤Ã¤Æ VGA ¤Î²òÁüÅÙ¤òÊѹ¹¤Ç¤¤ë¤è¤¦¤Ë»×¤¨¤ë¤Î¤Ç¤¹¤¬¡¢SVGA ¥«¡¼¥É¤¬»ý¤ÄÊ£¿ô¤Î¥â¡¼¥É¤ÎËؤó¤É ¤Ï¾¤Î¥ì¥¸¥¹¥¿¤Ë°Í¸¤·¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£ ¡ü¹½Â¤ÂÎ regText, regGraph VGA ¤Î¥ì¥¸¥¹¥¿¾ðÊó¤Ç¤¹¡£regGraph ¤Î¾ì¹ç¤Ï CRT À©¸æ¥ì¥¸¥¹¥¿¡¢misc ¥ì¥¸¥¹¥¿¤Ï kon.cfg ¤«¤éÆɤ߹þ¤Þ¤ì¤Þ¤¹¡£CRT À©¸æ¥ì¥¸¥¹¥¿¤Ï¹¹¤Ë·×»»¤¬»Ü¤µ¤ì¤Þ¤¹¡£dInfo.gydim ¤Ï kon.cfg ¤«¤éÆɤ߹þ¤Þ¤ì¤ë»þ¤Ëɽ¼¨Í¸ú¤ÊÃͤËÊÑ´¹¤µ¤ì¤Þ¤¹¡£¤³¤ÎÃͤò´ð¤Ë VGA ¦ ¤Îɽ¼¨¥é¥¤¥ó¿ô¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£É½¼¨¥é¥¤¥ó¿ô¤Ï CRT À©¸æ¥ì¥¸¥¹¥¿¤Ë¤¢¤ê¡¢ 0x12 ¤ÎÁ´¥Ó¥Ã¥È : ²¼°Ì16¥Ó¥Ã¥È 0x07 ¤ÎÂ裲¥Ó¥Ã¥È: Â裹¥Ó¥Ã¥È 0x07 ¤ÎÂ裷¥Ó¥Ã¥È: Âè10¥Ó¥Ã¥È ¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ regGraph.crt[0x12] = (dInfo.gydim - 1) & 0xFF; regGraph.crt[7] &= 0xBD; regGraph.crt[7] |= ((dInfo.gydim - 1) & 0x100) >> 7; regGraph.crt[7] |= ((dInfo.gydim - 1) & 0x200) >> 3; ¤È¤¤¤¦Áàºî¤ò»Ü¤·¤Æ¤¤¤Þ¤¹¡£ struct vgaRegs { u_char crt[VGACRT_CNT], CRT À©¸æ¥ì¥¸¥¹¥¿ att[VGAATTR_CNT], °À¥ì¥¸¥¹¥¿ gra[VGAGRP_CNT], ¥°¥é¥Õ¥£¥Ã¥¯¥¹À©¸æ¥ì¥¸¥¹¥¿ seq[VGASEQ_CNT], ¥·¡¼¥±¥ó¥µ mis; misc ¥ì¥¸¥¹¥¿ }; ¡üÊÑ¿ô LineComp8, LineComp9 ¥é¥¤¥óÈæ³Ó¥ì¥¸¥¹¥¿¤Ï 0x18 ¤Ë¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤ÎÂ裹¥Ó¥Ã¥È¤ÈÂè10¥Ó¥Ã¥È¤Ï¤½¤ì¤¾¤ì 0x07 ¤ª¤è¤Ó 0x09 ¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ó¥Ã¥È°Ê³°¤ÎÃͤȥ쥸¥¹¥¿ÈÖ¹æ¤ò¤Þ¤È¤á¤¿Êª¤¬ LineComp8 ¤È LineComp9 ¤Ç¤¹¡£ £³¡¥¥½¥±¥Ã¥È¤Ë¤è¤ëÄÌ¿® ÍÍ¡¹¤Ê³ÈÄ¥À¤ò¹Í¤¨¤Æ¥½¥±¥Ã¥È¤òÍÑ°Õ¤·¤¿¤Î¤Ç¤¹¤¬¡¢¤Þ¤À¥Õ¥©¥ó¥È¥í¡¼¥É¤Ë¤·¤«»È¤ï ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤È¤â¤Ê¥×¥í¥È¥³¥ë¤òºîÀ®¡¦¼ÂÁõ¤¹¤ëÃ챤â»þ´Ö¤â¤Ê¤¤¤Î¤ÇÄÌ¿®Êý¼°¤¬ ¤¤¤¤²Ã¸º¤Ê¤â¤Î¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ £³.£±¡¥¥½¥±¥Ã¥È̾ KON ¤Î¥½¥±¥Ã¥È¤Ï /tmp ¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¤½¤Î̾Á°¤Ï .kon ¤Î¸å¤Ë¿ôʸ»ú£±Ê¸»ú¤ò¤È ¤â¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¿ô»ú¤Ï KON ¤¬ÍøÍѤ·¤Æ¤¤¤ëµ¿»÷üËö̾¤ÎËöÈø¤Î¿ôʸ»ú¤ÈÅù¤·¤¯¤Ê ¤ê¤Þ¤¹¡£¤Þ¤¿¡¢GON ¥é¥¤¥Ö¥é¥ê¤Î SocketClientOpen ´Ø¿ô¤òÍøÍѤ¹¤ì¤Ð¼«Æ°Åª¤ËŬÅö¤Ê ¥½¥±¥Ã¥È̾¤ò»È¤¦¤Î¤Ç¡¢Ì¾Á°¤ò°Õ¼±¤¹¤ë¤³¤È̵¤¯¥½¥±¥Ã¥È¤ò¥ª¡¼¥×¥ó¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ ¤¹¡£ £³.£²¡¥´ðËÜŪ¤ÊÄÌ¿®Êý¼° ÄÌ¿®¤Ï messageHeader ¹½Â¤ÂΤòÍѤ¤¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£ struct messageHeader { u_char cno, ¥¯¥é¥¤¥¢¥ó¥ÈÈÖ¹æ(̤»ÈÍÑ) cmd; µ¡Ç½¥³¡¼¥É }; ¥¯¥é¥¤¥¢¥ó¥È¤¬µ¡Ç½¥³¡¼¥É¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤ÆÄÌ¿®¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£µ¡Ç½¥³¡¼¥É ¤ÏȾ³Ñʸ»ú£±Ê¸»ú¤Ç¤¹¡£ S: Ⱦ³Ñʸ»ú¥Õ¥©¥ó¥È¥í¡¼¥É W: Á´³Ñʸ»ú¥Õ¥©¥ó¥È¥í¡¼¥É µ¡Ç½¥³¡¼¥É¤òǧ¼±¤·¤¿ KON ¤Ï ACK ¤òµ¡Ç½¥³¡¼¥É¤È¤·¤¤¤ÆÁ÷¤êÊÖ¤·¤Þ¤¹¡£Ç§¼±¤Ç¤ ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï NAK ¤òÊÖ¤·¤Þ¤¹¡£°Ê¸å¡¢¥Ç¡¼¥¿¤ò¼õ¿®¤¹¤ë¤´¤È¤Ë KON ¤Ï ACK ¤¢¤ë¤¤ ¤Ï NAK ¤òÁ÷¿®¤·¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¦¤Ï NAK ¤ò¼õ¤±¼è¤ì¤Ðľ¤Á¤ËÁ÷¿®¤òÃæ»ß¤Ê¤±¤ì ¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ £³.£³¡¥¥Õ¥©¥ó¥È¥í¡¼¥É¤ÎÊý¼° ¥Õ¥©¥ó¥È¥í¡¼¥À¤¬ KON ¤Ë¥Õ¥©¥ó¥È¥Ç¡¼¥¿¤òÁ÷¿®¤¹¤ëºÝ¤Î¼ê½ç¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ ¥Õ¥©¥ó¥È¥í¡¼¥À (fld.*) <-- /usr/tmp/.kon? --> KON Function: S|W --------------------> S = Ⱦ³Ñ¥Õ¥©¥ó¥È W = ´Á»ú¥Õ¥©¥ó¥È <-------------------- ¹ÎÄê±þÅú (ACK) fontInfo ¹½Â¤ÂÎ --------------------> <-------------------- ¹ÎÄê±þÅú (ACK) ¥Õ¥©¥ó¥È¥Ç¡¼¥¿¤ò BUFSIZ ¤Ç¥Õ¥é¥°¥á¥ó¥È²½¤·¤Æ°Ê²¼¤ò·«¤êÊÖ¤¹: ¥Ç¡¼¥¿¥°¥é¥à --------------------> <-------------------- ¹ÎÄê±þÅú (ACK) £´¡¥¥Þ¥¦¥¹¥É¥é¥¤¥Ð ¥Þ¥¦¥¹¥É¥é¥¤¥Ð¤Ï selection-1.4 ¤ò»²¹Í¤Ë½ñ¤¤Þ¤·¤¿¡£¤·¤¿¤¬¤Ã¤Æ£µµ¡¼ïÂбþ¤È¤Ê¤Ã ¤Æ¤¤¤Þ¤¹¤¬¡¢¤³¤Á¤é¤Ç¥Æ¥¹¥È¤·¤Æ¤¤¤ë¤Î¤Ï MircoSoft ¤È Mouse Systems ¤Î¤ß¤Ç¤¹¡£ ¡ü¹½Â¤ÂÎ mInfo ¥Þ¥¦¥¹¤Ë´Ø¤¹¤ë¾ðÊó¤ò´ÉÍý¤·¤Æ¤¤¤Þ¤¹¡£ºÂɸ¾ðÊó¤ÏÁ´¤Æ¥Æ¥¥¹¥ÈºÂɸ·Ï¤Çɽ¸½¤µ¤ì¤Æ ¤¤¤Þ¤¹¡£¥«¡¼¥½¥ëɽ¼¨¼÷Ì¿¤Ï¥«¡¼¥½¥ë¤¬ÅÀÌǤ¹¤ë¤´¤È¤Ë¥Ç¥¯¥ê¥á¥ó¥È¤µ¤ì¡¢£°¤Ë¤Ê¤Ã¤¿ »þÅÀ¤Ç¥Þ¥¦¥¹¥«¡¼¥½¥ë¤¬É½¼¨¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥Þ¥¦¥¹¤Î¾õÂÖ¤¬ÊѲ½¤·¤¿»þ¤Ï¾ï¤Ë¤³¤Î Ãͤò MOUSE_LIFETIME(¥Ç¥Õ¥©¥ë¥È 22) ¤Ç½é´ü²½¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ struct mouseInfo { char x, y, ¥Þ¥¦¥¹¥«¡¼¥½¥ë°ÌÃÖ dx, dy, ¥Þ¥¦¥¹¥«¡¼¥½¥ë°ÜÆ°ÃÍ sx, sy, º¸¥Ü¥¿¥ó¥¯¥ê¥Ã¥¯°ÌÃÖ sw, ¥«¡¼¥½¥ëɽ¼¨¼÷Ì¿ stat; ¥Ü¥¿¥ó¾õÂÖ }; ¡üÊÑ¿ô dx, dy ´Ø¿ô MouseAnalyzePacket ¤Ç»È¤ï¤ì¤Æ¤¤¤ë static ÊÑ¿ô dx, dy ¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥¹ ºÂɸ·Ï¤Î¥Þ¥¦¥¹°ÜÆ°ÃͤǤ¹¡£¥Þ¥¦¥¹¤ò¤æ¤Ã¤¯¤ê¤ÈÆ°¤«¤·¤¿¾ì¹ç¤Ç¤â¤Á¤ã¤ó¤ÈÈ¿±Ç¤µ¤ì¤ë Íͤˤ¹¤ë¤¿¤á¤ËÍÑ°Õ¤·¤Þ¤·¤¿¡£ ¡üÊÑ¿ô oldstat ´Ø¿ô MouseAnalyzePacket ¤Ç»È¤ï¤ì¤Æ¤¤¤ë static ÊÑ¿ô oldstat ¤Ï mInfo.stat ¤Î Á°²ó¤Î¾õÂ֤Ǥ¹¡£ ¡ü¥Õ¥¡¥¤¥ë /tmp/.kontmp ¥Þ¥¦¥¹¤Ç¥«¥Ã¥È¤·¤¿¥Ð¥Ã¥Õ¥¡¤ò³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ £µ¡¥Â¿¸À¸ì¤Ë´Ø¤¹¤ë°·¤¤ ¥Õ¥©¥ó¥È¤Ï lib/coding.c ¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤¬ÍøÍѤǤ¤Þ¤¹¡£¿·¤¿¤Ê¥Õ¥©¥ó¥È ¤ÎÅÐÏ¿¤Ï Single Byte ¤Î¾ì¹ç¤Ï coding.c:fSRegs, coding.c:fldSRegs ¤Ë¡¢ Double Byte ¤Î¾ì¹ç¤Ï coding.c:fDRegs, coding.c:fldDRegs, ¤½¤·¤Æ vt.h ¤Î DF_?????? ¤Ëµ½Ò¤·¤Æ²¼¤µ¤¤¡£¤½¤ì¤¾¤ì¤Î¾ðÊó¤Ï 1 ÂÐ 1 ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ ½ç½ø¤ò¼é¤Ã¤Æ²¼¤µ¤¤¡£ £¶¡¥GON ¥é¥¤¥Ö¥é¥ê KON ¤È¤ÎÄÌ¿®¤òÍưפ˹Ԥ¦¤¿¤á¤ËÍÑ°Õ¤·¤¿¥é¥¤¥Ö¥é¥ê¤Ç¤¹¡£ £¶.£±¡¥¥á¥â¥êÁàºî´Ø¿ô ¢£void PortOutw(u_short value, u_short port) I/O ¥Ý¡¼¥È¤Ø£²¥Ð¥¤¥Èñ°Ì¤Î½ÐÎϤò¹Ô¤¤¤Þ¤¹¡£ ¢£void PortOutb(char value, u_short port) I/O ¥Ý¡¼¥È¤Ø£±¥Ð¥¤¥Èñ°Ì¤Î½ÐÎϤò¹Ô¤¤¤Þ¤¹¡£ ¢£u_char PortInb(unsigned short port) I/O ¥Ý¡¼¥È¤«¤é£±¥Ð¥¤¥Èñ°Ì¤ÎÆþÎϤò¹Ô¤¤¤Þ¤¹¡£ ¢£void bzero2(void *buff, int n) stosb ¤ò»È¤Ã¤¿¹â®¤Ê¥¼¥íËä¤á´Ø¿ô¤Ç¤¹¡£·ë²Ì¤Ï bzero ¤ÈƱ¤¸¤Ç¤¹¡£ ¢£void wzero(void *buff, int n) stosw ¤ò»È¤Ã¤¿¹â®¤Ê¥¼¥íËä¤á´Ø¿ô¤Ç¤¹¡£n ¥Ð¥¤¥È¤ò¥¼¥íËä¤á¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ ²¼¤µ¤¤¡£ ¢£void lzero(void *buff, int n) stosl ¤ò»È¤Ã¤¿¹â®¤Ê¥¼¥íËä¤á´Ø¿ô¤Ç¤¹¡£n ¥Ð¥¤¥È¤ò¥¼¥íËä¤á¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ ²¼¤µ¤¤¡£ ¢£void bmove(void *dst, void *src, int n) movsb ¤ò»È¤Ã¤¿¹â®¤Ê¥Ð¥Ã¥Õ¥¡Å¾Á÷´Ø¿ô¤Ç¤¹¡£ ¢£void brmove(void *dst, void *src, int n) movsb ¤ò»È¤Ã¤¿¹â®¤ÊµÕÊý¸þ¥Ð¥Ã¥Õ¥¡Å¾Á÷´Ø¿ô¤Ç¤¹¡£src, dst ¤«¤éµÕÊý¸þ¤Ë n ¥Ð¥¤¥È¤ÎžÁ÷¤ò¹Ô¤¤¤Þ¤¹¡£ ¢£void wmove(void *dst, void *src, int n) movsw ¤ò»È¤Ã¤¿¹â®¤Ê¥Ð¥Ã¥Õ¥¡Å¾Á÷´Ø¿ô¤Ç¤¹¡£n ¥Ð¥¤¥ÈžÁ÷¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼ ¤µ¤¤¡£ ¢£void lmove(void *dst, void *src, int n) movsl ¤ò»È¤Ã¤¿¹â®¤Ê¥Ð¥Ã¥Õ¥¡Å¾Á÷´Ø¿ô¤Ç¤¹¡£n ¥Ð¥¤¥ÈžÁ÷¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼ ¤µ¤¤¡£ £¶.£²¡¥¥½¥±¥Ã¥ÈÁàºî´Ø¿ô ¢£void SocketKill(int fd) ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥×¥ê¥¿¤Ç»ØÄꤵ¤ì¤¿¥½¥±¥Ã¥È¤ò¥¯¥í¡¼¥º¤·¡¢KON ¤Î¥½¥±¥Ã¥È¤ò ºï½ü¤¹¤ë¡£ ¢£int SocketRecCommand(int fd, struct messageHeader *mh) ¥½¥±¥Ã¥È¤«¤é¡¢messageHeader ¹½Â¤ÂΤòÆɤ߹þ¤à ¢£int SocketSendCommand(int fd, char *cmd) ¥¯¥é¥¤¥¢¥ó¥È¤«¤é¡¢KON ¤Ëµ¡Ç½¥³¡¼¥É¤òÁ÷¤ê¤Þ¤¹¡£ ¢£int SocketClientOpen() KON ¤Î¥½¥±¥Ã¥È¤ò¥ª¡¼¥×¥ó¤·¤Þ¤¹¡£ ¢£int SocketSendData(u_char *buff, int size, int fd) ¥Ç¡¼¥¿¥Ð¥Ã¥Õ¥¡¤ò BUFSIZ ¤Ç¥Õ¥é¥°¥á¥ó¥È²½¤·¤Ê¤¬¤é¥½¥±¥Ã¥È¤ØÁ÷¤ê½Ð¤·¤Þ¤¹¡£ ¢£char socketName[MAX_SOCKET_NAME+1] ´Ø¿ô SocketClientOpen ¤ÇºîÀ®¤µ¤ì¤¿¥½¥±¥Ã¥È̾¤¬µ²±¤µ¤ì¤ë¥Ð¥Ã¥Õ¥¡¤Ç¤¹¡£ £¶.£³¡¥¤½¤Î¾ ¢£FILE *CapSearchLabel(char *label) kon.cfg ¤«¤é»ØÄꤵ¤ì¤¿¥é¥Ù¥ë¤ò¸¡º÷¤¹¤ë´Ø¿ô¡£¥é¥Ù¥ë¤ÎÊÌ̾¤âÄ´¤Ù¤ë¡£°ìÃפ¹¤ë ¥é¥Ù¥ë¤ò¸«¤Ä¤±¤¿¾ì¹ç¤Ï FILE ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤òÊÖ¤¹¡£