home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / docum / doc.all / term.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-01-11  |  11.8 KB  |  354 lines

  1. /***********************************************************************
  2. *       öá⌐½ TERM.C
  3. *
  4. *    ¥¼π½∩Γ«α ΓÑନ¡á½á
  5. *
  6. * é맮ó:
  7. *       term [Å«αΓ [欫α«ßΓ∞ [ùÑΓ¡«ßΓ∞ [潫ó« [æΓ«»]]]]]
  8. *       Å«αΓ            - ¡«¼Ñα »«αΓá. Å« π¼«½τá¡¿ε 1.
  9. *       æ¬«α«ßΓ∞        - ù¿ß½« «Γ 50 ñ« 115200. Å« π¼«½τá¡¿ε 2400
  10. *       ùÑΓ¡«ßΓ∞        - Äñ¿¡ ¿º ß¿¼ó«½«ó N, O, E, M ¿½¿ S úñÑ
  11. *                               N - ìÑΓ ¬«¡Γα«½∩ (NONE)
  12. *                               O - æπ¼¼á í¿Γ«ó ¡ÑτÑΓ¡á∩ (ODD)
  13. *                               E - æπ¼¼á í¿Γ«ó τÑΓ¡á∩ (EVEN)
  14. *                               M - ü¿Γ 7 óßÑúñá 1 (MARK)
  15. *                               S - ü¿Γ 7 óßÑúñá 0 (SPACE)
  16. *              Å« π¼«½τá¡¿ε ¬«¡Γα«½∞ »« τÑΓ¡«ßΓ¿ «ΓßπΓßΓóπÑΓ.
  17. *       æ½«ó«   - τ¿ß½« ¿¡Σ«α¼áµ¿«¡¡δσ í¿Γ ó íá⌐ΓÑ. Å« π¼«½τá¡¿ε 8.
  18. *       æΓ«»    - τ¿ß½« ßΓ«»«óδσ í¿Γ, 1 ¿½¿ 2. Å« π¼«½τá¡¿ε 1.
  19. *
  20. *       è«¼»¿½∩Γ«α Microsoft C 5.1
  21. */
  22.  
  23. #include <conio.h>      /* ñ½∩ αáí«Γδ ß ¬«¡ß«½∞ε            */
  24. #include <graph.h>      /* »α«Γ«Γ¿»δ úαáΣ¿τÑ߬¿σ Σπ¡¬µ¿⌐    */
  25. #include <stdlib.h>     /* æΓá¡ñáαΓ¡δÑ Σπ¡¬µ¿¿              */
  26. #include <dos.h>        /* Ä»αÑñѽѡ¿∩ FP_OFF ¿ FP_SEG      */
  27.  
  28. #define USAGE   "term [Å«αΓ [欫α«ßΓ∞ [ùÑΓ¡«ßΓ∞ [潫ó« [æΓ«»]]]]]"
  29.  
  30. /*  æ¼ÑΘÑ¡¿∩ αÑú¿ßΓα«ó «Γ¡«ß¿Γѽ∞¡« íáºδ            */
  31. #define LCR    3    /* ÉÑú¿ßΓα π»αáó½Ñ¡¿∩ ½¿¡¿Ñ⌐        */
  32. #define MCR    4    /* ÉÑú¿ßΓα π»αáó½Ñ¡¿∩ ¼«ñѼ«¼        */
  33. #define IER    1    /* ÉÑú¿ßΓα ¿ñÑ¡Γ¿Σ¿¬áµ¿¿ »αÑαδóá¡¿⌐ */
  34. #define LSR    5    /* ÉÑú¿ßΓα ßΓáΓπßá ½¿¡¿¿        */
  35.  
  36. /*  îá߬¿ ñ½∩ πßΓᡫ󬿠í¿Γ«ó ó αÑú¿ßΓαáσ                           */
  37. #define GPO2    8       /* æ¿ú¡á½ αáºαÑΦÑ¡¿∩ á»»áαáΓ¡δσ »αÑαδóá¡¿⌐  */
  38. #define R_INT   1       /* ÅαÑαδóá¡¿Ñ »« »α¿σ«ñπ íá⌐Γá              */
  39.  
  40. /* è«¡ßΓá¡Γδ «Γ¡«ß∩Θ¿Ñß∩ ¬ ¬«¡Γα«½Ñαπ »αÑαδóá¡¿⌐ 8259       */
  41. #define IMR     0x21    /* ÇñαÑß αÑú¿ßΓαá ¼áß«¬ »αÑαδóá¡¿⌐  */
  42. #define ICR     0x20    /* ÇñαÑß αÑú¿ßΓαá ¬«¼á¡ñ            */
  43. #define IRQ3    0xF7    /* îá߬á ñ½∩ αáºαÑΦÑ¡¿∩ »αÑαδóá¡¿∩ «Γ COM2  */
  44. #define IRQ4    0xEF    /* îá߬á ñ½∩ αáºαÑΦÑ¡¿∩ »αÑαδóá¡¿⌐ «Γ COM1  */
  45. #define EOI3    0x63    /* æ¿ú¡á½ «í «¬«¡τá¡¿¿ «íαáí«Γ¬¿ »αÑαδóá¡¿∩ «Γ COM2 */
  46. #define EOI4    0x64    /* æ¿ú¡á½ «í «¬«¡τá¡¿¿ «íαáí«Γ¬¿ »αÑαδóá¡¿∩ «Γ COM1 */
  47.  
  48. int eoi;     /* æ¿ú¡á½ «í «¬«¡τá¡¿¿ «íαáí«Γ¬¿ »αÑαδóá¡¿∩ */
  49.  
  50. /*  îá߬¿ ñ½∩ πßΓᡫ󬿠í¿Γ«ó ó αÑú¿ßΓαÑ π»αáó½Ñ¡¿∩ ¼«ñѼ«¼     */
  51. #define DTR     1       /* æ¿ú¡á½ ú«Γ«ó¡«ßΓ¿ ΓÑନ¡á½á          */
  52. #define RTS     2       /* æ¿ú¡á½ ºá»α«ßá ¡á »ÑαÑñáτπ           */
  53.  
  54. #define TRRDY    0x20    /* îá߬á ñ½∩ «»αÑñѽѡ¿∩ ú«Γ«ó¡«ßΓ¿ »«αΓá ¬ »ÑαÑñáτÑ
  55.                íá⌐Γá    */
  56.  
  57. /* â½«íá½∞¡δÑ »ÑαѼѡ¡δÑ    */
  58. int p_base;     /*  üẫóδ⌐ áñαÑß »«ß½Ññ«óáΓѽ∞¡«ú« »«αΓá   */
  59. void (interrupt far *oldvect)(); /* æΓáαδ⌐ óÑ¬Γ«α »αÑαδóá¡¿∩ 0xB/0xC */
  60.  
  61. #define BSIZE    4096            /* ÉẼÑα ¬«½∞µÑó«ú« íπΣÑαá      */
  62. unsigned char buf[BSIZE];    /* è«½∞µÑó«⌐ íπΣÑα              */
  63. unsigned char *inptr = buf;  /* ô¬áºáΓѽ∞ ¡á »Ñαó«Ñ ßó«í«ñ¡«Ñ ¼ÑßΓ«  */
  64. unsigned char *outptr = buf; /* ô¬áºáΓѽ∞ ¡á »Ñαóδ⌐ ßτ¿ΓδóáѼδ⌐ íá⌐Γ */
  65.  
  66. #define ESC    0x1B        /* ASCII ¬«ñ ß¿¼ó«½á Esc    */
  67.  
  68. /* Åα«Γ«Γ¿»δ Σπ¡¬µ¿⌐    */
  69. void interrupt far i_handler(void);
  70. int portbase(short);
  71. void setparm(long, char, int, int);
  72. void porton(short);
  73. void portoff(short);
  74. int portin(unsigned char *);
  75. int portout(unsigned char);
  76.  
  77. void main(int argc, char *argv[])
  78. {
  79. short port = 1;     /* ì«¼Ñα ¿ß»«½∞ºπѼ«ú« »«αΓá        */
  80. long speed = 2400;  /* æ¬«α«ßΓ∞ »ÑαÑñáτ¿            */
  81. char parity = 'N';  /* è«¡Γα«½∞ »« τÑΓ¡«ßΓ¿            */
  82. short word = 8;     /* ù¿ß½« ¿¡Σ«α¼áµ¿«¡¡δσ í¿Γ«ó        */
  83. short stop = 1;     /* ù¿ß½« ßΓ«»«óδσ í¿Γ«ó            */
  84. unsigned char ch;   /* Éáí«τá∩ »ÑαѼѡ¡á∩. Äñ¿¡«τ¡δ⌐ ß¿¼ó«½ */
  85.  
  86. /* Éáºí«α áαúπ¼Ñ¡Γ«ó ¬«¼á¡ñ¡«⌐ ßΓ᫬¿   */
  87. if (argc > 6) {
  88.     cprintf("\a%s\r\n",USAGE);
  89.     exit(1);
  90.     }
  91.  
  92. switch (argc) {
  93.     case 6:     /* ù¿ß½« ßΓ«»«óδσ í¿Γ«ó         */
  94.         stop = atoi(argv[5]);
  95.     case 5:     /* ù¿ß½« ¿¡Σ«α¼áµ¿«¡¡δσ í¿Γ«ó   */
  96.         word = atoi(argv[4]);
  97.     case 4:     /* è«¡Γα«½∞ »« τÑΓ¡«ßΓ¿         */
  98.         parity = (char)toupper(*argv[3]);
  99.     case 3:     /* æ¬«α«ßΓ∞ »ÑαÑñáτ¿            */
  100.         speed = atol(argv[2]);
  101.     case 2:     /* ì«¼Ñα ¿ß»«½∞ºπѼ«ú« »«αΓá    */
  102.         port = atoi(argv[1]);
  103.     }
  104.  
  105. /* Ç¡á½¿º »áαá¼ÑΓα«ó αáí«Γδ     */
  106. if ((port < 1) || (port > 4)) {
  107.     cprintf("\aìÑ»αáó¿½∞¡δ⌐ ¡«¼Ñα »«αΓá! '%d'\r\n%s",port,USAGE);
  108.     exit(1);
  109.     }
  110.  
  111. if ((speed < 50) || (speed > 115200)) {
  112.     cprintf("\aìÑ»αáó¿½∞¡« ºáñá¡á ß¬«α«ßΓ∞! '%ld'\r\n%s",speed,USAGE);
  113.     exit(1);
  114.     }
  115.  
  116. if ((word > 8) || (word < 5)) {
  117.     cprintf("\aìÑ»αáó¿½∞¡« ºáñá¡ αẼÑα ß½«óá! '%d'\r\n%s",word,USAGE);
  118.     exit(1);
  119.     }
  120.  
  121. if ((parity != 'N') && (parity != 'O') && (parity != 'M') &&
  122.         (parity != 'S') && (parity != 'E')) {
  123.     cprintf("\aìÑ»αáó¿½∞¡« ºáñá¡á τÑΓ¡«ßΓ∞! '%c'\r\n%s",parity,USAGE);
  124.     exit(1);
  125.     }
  126.  
  127. if ((stop > 2) || (stop < 1)) {
  128.     cprintf("\aìÑ»αáó¿½∞¡« ºáñá¡« τ¿ß½« ßΓ«»«óδσ í¿Γ«ó! '%d'\r\n%s",stop,USAGE);
  129.     exit(1);
  130.     }
  131.  
  132. /*  Ä»αÑñѽѡ¿Ñ íẫó«ú« áñαÑßá »«ß½Ññ«óáΓѽ∞¡«ú« »«αΓá */
  133. if (portbase(port) == -1) {
  134.     cprintf("\aÅ«αΓ COM%d «ΓßπΓßóπÑΓ ¡á éáΦÑ⌐ ¼áΦ¿¡Ñ!",port);
  135.     exit(1);
  136.     }
  137.  
  138. /* ôßΓá¡«ó¬á »áαá¼ÑΓα«ó «í¼Ñ¡á  */
  139. setparm(speed, parity, word, stop);
  140.  
  141. /* Å«ñú«Γ«ó¬á »«αΓá ¬ αáí«ΓÑ    */
  142. porton(port);
  143.  
  144. cprintf("\r\nÅ«αΓ %d  æ¬«α«ßΓ∞ %ld\r\nä½∩ óδσ«ñᠡ᪼¿ΓÑ Esc\r\n\n\n");
  145.  
  146. /*** Äß¡«ó¡«⌐ µ¿¬½  ***/
  147. while (1) {
  148.     if (portin(&ch) > -1)   /* àßΓ∞ ñá¡¡δÑ ó íπΣÑαÑ? */
  149.     putch(ch);        /*    ÄΓ«íαế¼ ¡á φ¬αá¡Ñ  */
  150.  
  151.     if (kbhit())            /* ü佫 ¡áªáΓ¿Ñ ¬½áó¿Φ?    */
  152.     if ((ch = (unsigned char)getch()) != ESC)   /* äá. è«¡Ñµ αáí«Γδ? */
  153.         portout(ch);         /* ìÑΓ. Å«ßδ½áѼ ó ½¿¡¿ε     */
  154.     else break;            /* äá. è«¡Ñµ        */
  155.     }
  156.  
  157. /* éÑα¡Ñ¼ »«αΓ ó «íδτ¡«Ñ ß«ßΓ«∩¡¿Ñ   */
  158. portoff(port);
  159. exit(0);
  160. }
  161.  
  162. /*************************************************************************
  163. *       öπ¡¬µ¿∩ portbase óδí¿αáÑΓ íẫóδ⌐ áñαÑß ºáñá¡¡«ú« »«αΓá ¿º
  164. *   Γáí½¿µδ ú½«íá½∞¡δσ »ÑαѼѡ¡δσ BIOS ¿ πßΓá¡áó½¿óáÑΓ ú½«íá½∞¡πε
  165. *   »ÑαѼѡ¡πε p_base.
  166. *
  167. *   é«ºóαáΘáÑΓ º¡áτÑ¡¿Ñ p_base ¿½¿ -1 »α¿ «ΓßπΓßΓó¿¿ »«αΓá ó ¼áΦ¿¡Ñ
  168. */
  169. int portbase(short pnum)
  170. {
  171. int far *biosdata;      /* ô¬áºáΓѽ∞ ó BIOS Data Area   */
  172.  
  173. FP_SEG(biosdata) = 0x40;    /* æÑú¼Ñ¡Γ 40H  */
  174. FP_OFF(biosdata) = 0;       /* æ¼ÑΘÑ¡¿Ñ 0   */
  175.  
  176. p_base = *(biosdata + pnum - 1);    /* üÑαѼ áñαÑß  */
  177.  
  178. if (!p_base)            /* 0 «º¡áτáÑΓ «ΓßπΓßΓó¿Ñ »«αΓá  */
  179.     return -1;      /* ß¿ú¡á½ «í «Φ¿í¬Ñ             */
  180.  
  181. return p_base;
  182. }
  183.  
  184. /*************************************************************************
  185. *       öπ¡¬µ¿∩ setparm πßΓá¡áó½¿óáÑΓ »áαá¼ÑΓαδ «í¼Ñ¡á: ß¬«α«ßΓ∞,
  186. *   ó¿ñ ¬«¡Γα«½∩ »« τÑΓ¡«ßΓ¿, τ¿ß½« í¿Γ«ó ñá¡¡δσ ¿ τ¿ß½« ßΓ«»«óδσ í¿Γ«ó.
  187. */
  188. void setparm(long baud, char parity, int word, int stop)
  189. {
  190. register unsigned divisor;   /* äѽ¿Γѽ∞ τáßΓ«Γδ ñ½∩ πßΓᡫ󬿠߬«α«ßΓ¿        */
  191. register unsigned char parm; /* üá⌐Γ »áαá¼ÑΓα«ó ñ½∩ αÑú¿ßΓαá π»αáó½Ñ¡¿∩ ½¿¡¿Ñ⌐ */
  192.  
  193. if (!p_base)    /* 0 «º¡áτáÑΓ Γ«, τΓ« íẫóδ⌐ áñαÑß */
  194.     return;     /* »«αΓá ¡Ñ πßΓá¡«ó½Ñ¡              */
  195.  
  196. parm = (unsigned char)inp(p_base + LCR);    /* ùΓÑ¡¿Ñ ΓѬπΘ¿σ »áαá¼ÑΓα«ó ½¿¡¿¿  */
  197.  
  198. /* ôßΓá¡«ó¬á ß¬«α«ßΓ¿ «í¼Ñ¡á            */
  199. /* äѽ¿Γѽ∞ = 1.8432 îâµ / (baud * 16)  */
  200. divisor = (unsigned)(115200L / baud);
  201.  
  202. outp(p_base + LCR, parm | 0x80);    /* Å«ñú«Γ«ó¬á »«αΓá ¬ πßΓá¡«ó¬Ñ
  203.                                         ß¬«α«ßΓ¿. ü¿Γ 7 ó 1         */
  204. outp(p_base + 1, divisor >> 8); /* æΓáαΦ¿⌐ íá⌐Γ ñѽ¿Γѽ∩    */
  205. outp(p_base, divisor & 0xFF);   /* î½áñΦ¿⌐ íá⌐Γ ñѽ¿Γѽ∩    */
  206.  
  207. /* Å«ñú«Γ«ó¬á íá⌐Γá »áαá¼ÑΓα«ó ñ½∩ αÑú¿ßΓαá π»αáó½Ñ¡¿∩ ½¿¡¿Ñ⌐   */
  208. /* ùÑΓ¡«ßΓ∞ */
  209. parm &= 7;          /* Å« π¼«½τá¡¿ε NONE    */
  210. switch (parity) {
  211.     case 'S':               /* SPACE    */
  212.     case 's':
  213.         parm |= (7 << 3);
  214.         break;
  215.     case 'M':               /* MARK     */
  216.     case 'm':
  217.         parm |= (5 << 3);
  218.         break;
  219.     case 'E':               /* EVEN     */
  220.     case 'e':
  221.         parm |= (3 << 3);
  222.         break;
  223.     case 'O':               /* ODD      */
  224.     case 'o':
  225.         parm |= (1 << 3);
  226.         break;
  227.     }
  228.  
  229. /* ôßΓá¡«ó¬á τ¿ß½á í¿Γ«ó ñá¡¡δσ ¿ τ¿ß½á ßΓ«»«óδσ í¿Γ«ó  */
  230. parm |= (((stop - 1) << 2) | (word - 5));
  231.  
  232. /* ôßΓá¡«ó¬á »áαá¼ÑΓα«ó ½¿¡¿¿ ¿ »ÑαѬ½ετÑ¡¿Ñ »«αΓá ó αáí«τ¿⌐ αѪ¿¼  */
  233. outp(p_base + LCR, parm);
  234. }
  235.  
  236. /*************************************************************************
  237. *       öπ¡¬µ¿∩ porton »ÑαÑó«ñ¿Γ »«αΓ ó αáí«τ¿⌐ αѪ¿¼.
  238. *   Å«ñ¼Ñ¡∩ÑΓ óÑ¬Γ«α »αÑαδóá¡¿∩, αáºαÑΦáÑΓ »αÑαδóá¡¿∩ «Γ »«αΓá ¿
  239. *   óδßΓáó½∩ÑΓ ß¿ú¡á½δ ú«Γ«ó¡«ßΓ¿ ΓÑନ¡á½á ¿ ºá»α«ßá ¡á »ÑαÑñáτπ.
  240. */
  241. void porton(short pnum)
  242. {
  243. register unsigned i_num;    /* ì«¼Ñα »αÑαδóá¡¿∩     */
  244. register int c;             /* Éáí«τá∩ »ÑαѼѡ¡á∩   */
  245.  
  246. if ((pnum == 2) || (pnum == 4)) /* Ä»αÑñѽѡ¿Ñ ¡«¼Ñαá »αÑαδóá¡¿∩    */
  247.     i_num = 0xB;
  248. else i_num = 0xC;
  249.  
  250. oldvect = _dos_getvect(i_num);  /* æ«σαá¡¿¼ ΓѬπΘ¿⌐ óÑ¬Γ«α »αÑαδóá¡¿∩    */
  251. _dos_setvect(i_num, i_handler); /* çá¼Ñ¡¿¼ «íαáí«Γτ¿¬ »αÑαδóá¡¿∩ ¡á ßó«⌐ */
  252.  
  253. /* ÉáºαÑΦ¿¼ »αÑαδóá¡¿∩ «Γ »«αΓá */
  254. c = inp(p_base + MCR) | GPO2 | DTR | RTS;   /* ÉáºαÑΦÑ¡¿Ñ »αÑαδóá¡¿∩ «Γ
  255.                            ßσѼ RS-232 ¿ πßΓá¡«ó¬á
  256.                            ß¿ú¡á½«ó DTR ¿ RTS    */
  257. outp(p_base + MCR, c);
  258.  
  259. outp(p_base + IER, R_INT);      /* ÅαÑαδóá¡¿∩ Γ«½∞¬« »« »α¿σ«ñπ íá⌐Γá   */
  260.  
  261. /* Åα«úαἿα«óá¡¿Ñ ¬«¡Γα«½½Ñαá 8259 */
  262. c = inp(IMR);
  263. if ((pnum == 2) || (pnum == 4))
  264.     {
  265.     c &= IRQ3;      /* ÉáºαÑΦÑ¡¿Ñ »αÑαδóá¡¿∩ «Γ COM2                    */
  266.     eoi = EOI3;     /* æ¿ú¡á½ «í «¬«¡τá¡¿¿ «íαáí«Γ¬¿ »αÑαδóá¡¿∩ «Γ COM2 */
  267.     }
  268. else {
  269.     c &= IRQ4;      /* ÉáºαÑΦÑ¡¿Ñ »αÑαδóá¡¿∩ «Γ COM1                    */
  270.     eoi = EOI4;     /* æ¿ú¡á½ «í «¬«¡τá¡¿¿ «íαáí«Γ¬¿ »αÑαδóá¡¿∩ «Γ COM1 */
  271.     }
  272. outp(IMR, c);
  273. }
  274.  
  275. /*************************************************************************
  276. *       öπ¡¬µ¿∩ portoff »ÑαÑó«ñ¿Γ »«αΓ ó ¿º αáí«τÑú« αѪ¿¼á ó «íδτ¡«Ñ
  277. *   ß«ßΓ«∩¡¿Ñ ñ½∩ MS-DOS («íαáΓ¡á∩ ¬ porton).
  278. *   çá»αÑΘáÑΓ »αÑαδóá¡¿∩ «Γ »«αΓá, ó«ßΓá¡áó½¿óáÑΓ «íαáí«Γτ¿¬ »αÑαδóá¡¿⌐
  279. *   ¿ ¼á߬¿απÑΓ ß¿ú¡á½δ MCR.
  280. */
  281. void portoff(short pnum)
  282. {
  283. register unsigned i_num;    /* ì«¼Ñα »αÑαδóá¡¿∩     */
  284. register int c;     /* Éáí«τá∩ »ÑαѼѡ¡á∩   */
  285.  
  286. /* çá»αÑΘáѼ »αÑαδóá¡¿∩ «Γ »«αΓá    */
  287. /* Åα«úαἿα«óá¡¿Ñ ¬«¡Γα«½½Ñαá 8259 */
  288. c = inp(IMR);
  289. if ((pnum == 2) || (pnum == 4))
  290.     c |= ~IRQ3;     /* çá»αÑΘÑ¡¿Ñ »αÑαδóá¡¿⌐ «Γ COM2 */
  291. else c |= ~IRQ4;    /* çá»αÑΘÑ¡¿Ñ »αÑαδóá¡¿⌐ «Γ COM1 */
  292. outp(IMR, c);
  293.  
  294. outp(p_base + IER, 0);      /* çá»αÑΘÑ¡¿Ñ óßÑσ Γ¿»«ó »αÑαδóá¡¿⌐ */
  295.  
  296. outp(p_base + MCR, 0);      /* îá߬¿απѼ óßÑ ß¿ú¡á½δ            */
  297.  
  298. if ((pnum == 2) || (pnum == 4)) /* Ä»αÑñѽѡ¿Ñ ¡«¼Ñαá »αÑαδóá¡¿∩    */
  299.     i_num = 0xB;
  300. else i_num = 0xC;
  301.  
  302. _dos_setvect(i_num, oldvect);   /* é«ßßΓá¡«ó¿¼ «íαáí«Γτ¿¬ »αÑαδóá¡¿∩ */
  303. }
  304.  
  305. /*************************************************************************
  306. *       öπ¡¬µ¿∩ i_handler ∩ó½∩ÑΓß∩ «íαáí«Γτ¿¬«¼ »αÑαδóá¡¿⌐ «Γ »«αΓá.
  307. *   öπ¡¬µ¿∩ »«½πτáÑΓ π»αáó½Ñ¡¿Ñ »α¿ ó«º¡¿¬¡«óÑ¡¿¿ »αÑαδóá¡¿∩. Ä¡á
  308. *   ºáí¿αáÑΓ íá⌐Γ ¿º »«αΓá ¿ ¬½áñÑΓ Ñú« ó íπΣÑα. üπΣÑα ¬«½∞µÑó«⌐ - Γ.Ñ.
  309. *   »α¿ ºá»«½¡Ñ¡¿¿ «¡ ¡áτ¿¡áÑΓ ºá»«½¡∩Γ∞ß∩ ß¡áτá½á.
  310. */
  311. void interrupt far i_handler(void)
  312. {
  313. *inptr = (unsigned char)inp(p_base);   /* æτ¿ΓáѼ íá⌐Γ */
  314.  
  315. if (++inptr >= &buf[BSIZE])     /* Åα«óÑα¬á óδσ«ñá ºá úαá¡¿µπ íπΣÑαá    */
  316.     inptr = buf;        /* àß½¿ ñá, Γ« ¡áτ¡Ñ¼ ß¡áτá½á        */
  317.  
  318. outp(ICR, eoi);
  319. }
  320.  
  321. /*************************************************************************
  322. * öπ¡¬µ¿∩ portin óδí¿αáÑΓ «ñ¿¡ íá⌐Γ ¿º ¬«½∞µÑó«ú« íπΣÑαá. àß½¿ íπΣÑα »πßΓ,
  323. * Γ« ó«ºóαáΘáÑΓß∩ -1
  324. */
  325. int portin(unsigned char *ch)
  326. {
  327. int rc = 0;   /* è«ñ ºáóÑαΦÑ¡¿∩ */
  328.  
  329. if (inptr != outptr) {        /* àßΓ∞ ó íπΣÑαÑ ñá¡¡δÑ?    */
  330.     *ch = *outptr & 0x7F;    /* äá. üÑαѼ ASCII ß¿¼ó«½   */
  331.     if (++outptr >= &buf[BSIZE])    /* Åα«óÑα¬á óδσ«ñá ºá úαá¡¿µπ íπΣÑαá */
  332.     outptr = buf;            /* àß½¿ ñá, Γ« ¡áτ¡Ñ¼ ß¡áτá½á     */
  333.     }
  334. else rc = -1;
  335.  
  336. return rc;
  337. }
  338.  
  339. /*************************************************************************
  340. * öπ¡¬µ¿∩ portout »«ßδ½áÑΓ íá⌐Γ ch ó ½¿¡¿ε. é«ºóαáΘáÑΓ 0 »α¿ ¡«α¼á½∞¡«¼
  341. * ºáóÑαΦÑ¡¿¿. Åα¿ «Φ¿í¬Ñ ó«ºóαáΘáÑΓß∩ -1
  342. */
  343. int portout(unsigned char ch)
  344. {
  345. register int tm = -32000;      /* æτÑΓτ¿¬ ñ½∩ «αúá¡¿ºáµ¿¿ Γá⌐¼áπΓá */
  346.  
  347. while ((inp(p_base + LSR) & TRRDY) == 0)  /* Å«¬á »«αΓ ¡Ñ ú«Γ«ó ¬ »ÑαÑñáτÑ */
  348.     if (tm++ > 0)
  349.     return -1;    /* ÄΦ¿í¬á. éδσ«ñ »« Γá⌐¼áπΓπ    */
  350.  
  351. outp(p_base, ch);    /* éδó«ñ ß¿¼ó«½á */
  352. return 0;
  353. }
  354.