// PIO.C - Parallel Input/Output
// Written by Stefan Pfeiffer, DL1ELY, 950513
// Last modification: 950715
// (C) 1995 by Stefan Pfeiffer, DL1ELY@DB0PKE.#NRW.DEU.EU

#include "pio.h"
#include "egavga.h"
#include <graphics.h>
#include <conio.h>
#include <dos.h>

extern unsigned xmax;
extern unsigned ymax;
extern unsigned char printer_type;

unsigned pio_port[3];

void pio_init()
{
  unsigned char i;

  for(i=0;i<3;i++)
  {
     pio_port[i] = peek(0x40,(i*2)+8);
     if(pio_port[i]) outp(pio_port[i],0);
  };
};

void pio_rotor(char port, unsigned int winkel, unsigned int ende)
{
   signed int wert;
   unsigned char bits;

   port--;
   for(bits=0;bits<8;bits++)
   {
      outp(pio_port[port],0);
      delay(0);
      outp(pio_port[port],2);
      delay(0);
      outp(pio_port[port],0);
      delay(0);
   };

   wert = winkel-ende;
   if(wert < 0) wert+=360;
   wert = ((float)wert/360.0)*256;

   for(bits=0;bits<8;bits++,wert<<=1)
   {
      if(wert&0x80)
      {
         outp(pio_port[port],1);
         delay(0);
         outp(pio_port[port],3);
         delay(0);
         outp(pio_port[port],1);
         delay(0);
      }
      else
      {
         outp(pio_port[port],0);
         delay(0);
         outp(pio_port[port],2);
         delay(0);
         outp(pio_port[port],0);
         delay(0);
      };
   };
};


void pio_out_start(char port)
{
   union REGS r;

   port--;
   r.h.ah = 0x01;
   r.h.dh = 0;
   r.h.dl = port;

   int86(0x17,&r,&r);
};

void pio_out(char port, char ch)
{
   union REGS r;

   port--;
   r.h.ah = 0;
   r.h.al = ch;
   r.h.dh = 0;
   r.h.dl = port;

   int86(0x17,&r,&r);
};

void pio_print_screen(char port)
{
   unsigned x, y;
   char value;
   unsigned char hlp[5];
   char *cp;

   if(graphics!= EGA && graphics != VGA) return;

   pio_out_start(port);

   if(!printer_type)
   {
      pio_out(port,27);
      pio_out(port,65);
      pio_out(port,8);
   }
   else
   {
      pio_out(port,27);
      pio_out(port,42);
      pio_out(port,114);
      pio_out(port,48);
      pio_out(port,65);

      pio_out(port,27);
      pio_out(port,42);
      pio_out(port,116);
      if(ymax>479)
      {
         pio_out(port,49);
         pio_out(port,48);
         pio_out(port,48);
      }
      else
      {
         pio_out(port,55);
         pio_out(port,53);
      };
      pio_out(port,82);

      sprintf(hlp,"%d",xmax);
      pio_out(port,27);
      pio_out(port,42);
      pio_out(port,114);

      cp = hlp;
      while(*cp)
      {
         pio_out(port,*cp);
         cp++;
      };
      pio_out(port,83);
   };

   outpw(0x03ce,0x0805);
   outpw(0x03ce,0x0002);
   outpw(0x03ce,0x0f07);

   for(x=0;x < (xmax+1)>>3;x++)
   {
      if(!printer_type)
      {
         pio_out(port,27);
         pio_out(port,'*');
         pio_out(port,ymax>479?4:0);
         pio_out(port,(ymax+1)%256);
         pio_out(port,(ymax+1)>>8);
      }
      else
      {
         pio_out(port,27);
         pio_out(port,42);
         pio_out(port,98);

         cp = hlp;
         while(*cp)
         {
            pio_out(port,*cp);
            cp++;
         };
         pio_out(port,87);
      };

      for(y=ymax+1;y;y--)
      {
         value = peekb(0xA000,(y-1)*((xmax+1)>>3)+x);
         value^=0xFFFF;
         pio_out(port,value);
      };
      pio_out(port,13);
      pio_out(port,10);
   };

   pio_out(port,0xFF);

};

