home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Netzwerk / parbench.lha / Extras / ParPC.lha / ParPC / PCFiles / pardev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-25  |  3.2 KB  |  169 lines

  1. /*
  2.  *  Additional C routines to the PC Parnet interface.
  3.  *  Routines ripped from NOS1229.
  4.  *
  5.  *  CHECK YOUR CABLE(S) & INTERFACE(S) BEFORE USING PARNET!
  6.  */
  7.  
  8. #define DEBUG 1
  9.  
  10. #ifdef DEBUG
  11. #include <stdio.h>
  12. #endif
  13. #include <dos.h>
  14. #include "pardev.h"
  15.  
  16. INTERRUPT (*oldvec)(void); /* original irq vector */
  17. int oldmask; /* original irq mask */
  18. int Isat=0; /* no need to change when you have an AT */
  19.  
  20. /* stupid inline definition of outportb in dos.h */
  21. #undef outportb
  22.  
  23. /* Set bit(s) in I/O port */
  24. void
  25. setbit(port,bits)
  26. unsigned port;
  27. char bits;
  28. {
  29.     outportb(port,(char)inportb(port)|bits);
  30. }
  31. /* Clear bit(s) in I/O port */
  32. void
  33. clrbit(port,bits)
  34. unsigned port;
  35. char bits;
  36. {
  37.     outportb(port,(char)(inportb(port) & ~bits));
  38. }
  39.  
  40. /* Disable given hardware interrupt */
  41. int
  42. maskoff(irq)
  43. unsigned irq;
  44. {
  45.     if(irq < 8){
  46.         setbit(0x21,(char)(1<<irq));
  47.     } else if(irq < 16){
  48.         irq -= 8;
  49.         setbit(0xa1,(char)(1<<irq));
  50.     } else {
  51.         return -1;
  52.     }
  53.     return 0;
  54. }
  55. /* Enable given hardware interrupt */
  56. int
  57. maskon(irq)
  58. unsigned irq;
  59.  {
  60.     if(irq < 8){
  61.         clrbit(0x21,(char)(1<<irq));
  62.     } else if(irq < 16){
  63.         irq -= 8;
  64.         clrbit(0xa1,(char)(1<<irq));
  65.     } else {
  66.         return -1;
  67.     }
  68.     return 0;
  69. }
  70.  
  71. /* get the interrupt mask */
  72. int
  73. getmask(irq)
  74. unsigned irq;
  75. {
  76.     if(irq < 8)
  77.         return (inportb(0x21) & (1 << irq)) ? 0 : 1;
  78.     else if(irq < 16){
  79.         irq -= 8;
  80.         return (inportb(0xa1) & (1 << irq)) ? 0 : 1;
  81.     } else
  82.         return -1;
  83. }
  84.  
  85. /* Install hardware interrupt handler.
  86.  * Takes IRQ numbers from 0-7 (0-15 on AT) and maps to actual 8086/286 vectors
  87.  * Note that bus line IRQ2 maps to IRQ9 on the AT
  88.  * For PARnet only IRQ7 will be used, unless your printercard supports
  89.  * different IRQ lines.
  90.  */
  91. int
  92. setirq(irq,handler)
  93. unsigned irq;
  94. INTERRUPT (*handler)();
  95. {
  96.     /* Set interrupt vector */
  97.     if(irq < 8){
  98.         setvect(8+irq,handler);
  99.     } else if(irq < 16){
  100.         Isat = 1;
  101.         setvect(0x70 + irq - 8,handler);
  102.     } else {
  103.         return -1;
  104.     }
  105.     return 0;
  106. }
  107.  
  108. /* Return pointer to hardware interrupt handler.
  109.  * Takes IRQ numbers from 0-7 (0-15 on AT) and maps to actual 8086/286 vectors
  110.  */
  111. INTERRUPT
  112. (*getirq(irq))()
  113. unsigned int irq;
  114. {
  115.     /* Set interrupt vector */
  116.     if(irq < 8){
  117.         return getvect(8+irq);
  118.     } else if(irq < 16){
  119.         return getvect(0x70 + irq - 8);
  120.     } else {
  121.         return NULLVIFP;
  122.     }
  123. }
  124.  
  125. /* Initialize parnet */
  126. void
  127. par_init(netaddr,portaddr)
  128. int16 netaddr,portaddr;
  129. {
  130.     disable();  /* disable all interrupts */
  131.  
  132.     /* Save original interrupt vector and mask state */
  133.     oldvec = getirq(7);
  134. #ifdef DEBUG
  135.     printf("oldvec: %04x:%04x, newvec: %04x:%04x\n",
  136.            FP_SEG(oldvec),FP_OFF(oldvec),FP_SEG(parvec),FP_OFF(parvec));
  137.     fflush(stdout);
  138. #endif
  139.     oldmask = getmask(7);
  140.  
  141.     /* Set interrupt vector to SIO handler (see parvec.asm) */
  142.     setirq(7,parvec);
  143.  
  144.     /* initialize hardware address and printer port */
  145. #ifdef DEBUG
  146.     printf("par_init: calling paraddress: %04x:%04x(%x,%x)\n",
  147.            FP_SEG(paraddress),FP_OFF(paraddress),netaddr,
  148.            portaddr);fflush(stdout);
  149. #endif
  150.     paraddress(netaddr,portaddr);   /* see parkern.asm */
  151.  
  152.     maskon(7);      /* IRQ7 enabled */
  153.     enable();       /* enable all interrupts */
  154. }
  155.  
  156. int
  157. par_stop(void)
  158. {
  159.     disable();
  160.     setirq(7,oldvec);
  161.     if (oldmask)
  162.         maskon(7);
  163.     else
  164.         maskoff(7);
  165.     enable();
  166.     return 0;
  167. }
  168.  
  169.