PORT.C
上传用户:wesley
上传日期:2007-01-07
资源大小:266k
文件大小:4k
源码类别:

通讯/手机编程

开发平台:

C/C++

  1. /* Copyright (C) 1992 Peter Edward Cann, all rights reserved */
  2. #include<stdio.h>
  3. #include<bios.h>
  4. #include<dos.h>
  5. #include"port.h"
  6. int index, basereg;
  7. unsigned char diffintmask, irqnum;
  8. void (interrupt far *oldvect)();
  9. unsigned char buf[TBUFSIZ];
  10. void interrupt far inthndl(_es, _ds, _di, _si, _bp, _sp,
  11.   _bx, _dx, _cx, _ax, _ip, _cs, _flags)
  12. unsigned _es, _ds, _di, _si, _bp, _sp;
  13. unsigned _bx, _dx, _cx, _ax, _ip, _cs, _flags;
  14. {
  15. if(inp(basereg+STATREG)&0x01)
  16. {
  17. buf[index++]=inp(basereg)&0xff;
  18. index=index%TBUFSIZ;
  19. }
  20. outp(INTBASE1, INTACK);
  21. outp(INTBASE2, INTACK);
  22. }
  23. unsigned char lctl;
  24. unsigned int speed, comnum;
  25. char databits, parity, stopbits;
  26. unsigned char newintmask, oldintmask, lctl, dlmsb, dllsb;
  27. unsigned intnum;
  28. unsigned char oldlctl, olddllsb, olddlmsb, oldintctl, oldmctl;
  29. setport()
  30. {
  31. newintmask=0;
  32. switch(comnum)
  33. {
  34. case 0:
  35. irqnum=4;
  36. diffintmask=0xff&~0x10;
  37. basereg=0x3f8;
  38. break;
  39. case 1:
  40. irqnum=3;
  41. diffintmask=0xff&~0x08;
  42. basereg=0x2f8;
  43. break;
  44. case 2:
  45. irqnum=4;
  46. diffintmask=0xff&~0x10;
  47. basereg=0x3e8;
  48. break;
  49. case 3:
  50. irqnum=3;
  51. diffintmask=0xff&~0x08;
  52. basereg=0x2e8;
  53. break;
  54. case 4:
  55. irqnum=2;
  56. diffintmask=0xff&~0x02;
  57. basereg=0x3e8;
  58. break;
  59. case 5:
  60. irqnum=2;
  61. diffintmask=0xff&~0x02;
  62. basereg=0x2e8;
  63. break;
  64. case 6:
  65. irqnum=5;
  66. diffintmask=0xff&~0x20;
  67. basereg=0x3e8;
  68. break;
  69. case 7:
  70. irqnum=5;
  71. diffintmask=0xff&~0x20;
  72. basereg=0x2e8;
  73. break;
  74. default:
  75. printf("Bad port choice.n");
  76. exit(4);
  77. }
  78. intnum=irqnum+8;
  79. switch(speed)
  80. {
  81. case 300:
  82. dlmsb=0;
  83. dllsb=0xc0;
  84. break;
  85. case 1200:
  86. dlmsb=0;
  87. dllsb=0x60;
  88. break;
  89. case 2400:
  90. dlmsb=0;
  91. dllsb=0x30;
  92. break;
  93. case 9600:
  94. dlmsb=0;
  95. dllsb=0x0c;
  96. break;
  97. case 19200:
  98. dlmsb=0;
  99. dllsb=0x06;
  100. break;
  101. case 38400:
  102. dlmsb=0;
  103. dllsb=0x03;
  104. break;
  105. case 57600:
  106. dlmsb=0;
  107. dllsb=0x02;
  108. break;
  109. default:
  110. printf("Bad speed %d.n", speed);
  111. exit(5);
  112. }
  113. lctl=0;
  114. switch(parity)
  115. {
  116. case 'e':
  117. case 'E':
  118. lctl |= PARITYEN | PARITYEVEN;
  119. break;
  120. case 'o':
  121. case 'O':
  122. lctl|=PARITYEN;
  123. break;
  124. case 'n':
  125. case 'N':
  126. break;
  127. default:
  128. printf("Bad parity.n");
  129. exit(7);
  130. }
  131. switch(databits)
  132. {
  133. case '7':
  134. lctl|=DB7;
  135. break;
  136. case '8':
  137. lctl|=DB8;
  138. break;
  139. default:
  140. printf("Bad data bits.n");
  141. exit(8);
  142. }
  143. switch(stopbits)
  144. {
  145. case '1':
  146. break;
  147. case '2':
  148. lctl|=STOP2;
  149. break;
  150. default:
  151. printf("Bad stop bits.n");
  152. exit(9);
  153. }
  154. }
  155. readset()
  156. {
  157. oldlctl=inp(basereg+LCTLREG);
  158. outp(basereg+LCTLREG, DLAB);
  159. olddllsb=inp(basereg+DLLSBREG);
  160. olddlmsb=inp(basereg+DLMSBREG);
  161. outp(basereg+LCTLREG, oldlctl);
  162. oldvect=_dos_getvect(intnum);
  163. oldmctl=inp(basereg+MCTLREG);
  164. oldintmask=(intnum==10)?inp(INTMASK2):inp(INTMASK1);
  165. }
  166. setup()
  167. {
  168. outp(basereg+LCTLREG, DLAB);
  169. outp(basereg+DLLSBREG, dllsb);
  170. outp(basereg+DLMSBREG, dlmsb);
  171. outp(basereg+LCTLREG, lctl);
  172. _dos_setvect(intnum, inthndl);
  173. oldintctl=inp(basereg+INTCTLREG);
  174. outp(basereg+INTCTLREG, 0x01);
  175. inp(basereg); /* Clear interrupt */
  176. outp(basereg+MCTLREG, 0x0b);
  177. newintmask=diffintmask;
  178. newintmask&=oldintmask;
  179. if(intnum==10)
  180. outp(INTMASK2, newintmask);
  181. else
  182. outp(INTMASK1, newintmask);
  183. outp(INTBASE1, INTACK);
  184. outp(INTBASE2, INTACK);
  185. }
  186. cleanup(flags)
  187. int flags;
  188. {
  189. if(!(flags&INHINT))
  190. {
  191. if(intnum==10)
  192. outp(INTMASK2, oldintmask);
  193. else
  194. outp(INTMASK1, oldintmask);
  195. outp(basereg+INTCTLREG, oldintctl);
  196. _dos_setvect(intnum, oldvect);
  197. outp(basereg+MCTLREG, 0x03);
  198. }
  199. if(!(flags&INHCTL))
  200. {
  201. outp(basereg+LCTLREG, DLAB);
  202. outp(basereg+DLLSBREG, olddllsb);
  203. outp(basereg+DLMSBREG, olddlmsb);
  204. outp(basereg+LCTLREG, oldlctl);
  205. outp(basereg+MCTLREG, oldmctl);
  206. }
  207. }