/**************************************************/
/***                                            ***/
/*** Test2.c  -- test interface to inpout32.dll ***/
/***  ( http://www.logix4u.net/inpout32.htm )   ***/
/***                                            ***/
/*** Copyright (C) 2005, Douglas Beattie Jr.    ***/
/***                                            ***/
/***    <beattidp@ieee.org>                     ***/
/***    http://www.hytherion.com/beattidp/      ***/
/***                                            ***/
/**************************************************/
/*	Last Update: 2006.05.14
 */

/*******************************************************/
/*                                                     */
/*  Builds with Borland's Command-line C Compiler      */
/*    (free for public download from Borland.com, at   */
/*  http://www.borland.com/bcppbuilder/freecompiler )  */
/*                                                     */
/*   Compile with:                                     */
/*                                                     */
/*   BCC32 -IC:\BORLAND\BCC55\INCLUDE  TEST2.C         */
/*                                                     */
/*                                                     */
/*  Be sure to change PPORT_BASE (Port Base address)   */
/*  accordingly if your LPT port is addressed          */
/*  elsewhere.                                         */
/*                                                     */
/*******************************************************/


#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <memory.h>
#include <stdlib.h>
#include <iostream>
#include<fstream>
using namespace std;
/* Definitions in the build of inpout32.dll are:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */

/* prototype (function typedef) for DLL function Inp32: */

     typedef short (_stdcall *inpfuncPtr)(short portaddr);
     typedef void (_stdcall *oupfuncPtr)(short portaddr, char datum);

#define PPORT_BASE 0x378


// Prototypes for Test functions
void test_read8(void);
void test_write(void);
void test_write_datum(short datum);

#define BYTES_PER_LINE 16
/*
typedef struct TGA_HEADER
{
   char  idlength;                // 0
   char  colourmaptype;           // 1
   char  datatypecode;            // 2
   char  pad[5];                  // 3
   short x_origin;                // 8
   short y_origin;                // 10
   short width;                   // 12
   short height;                  // 14
   char  bitsperpixel;            // 16
   char  imagedescriptor;         // 17
} TGA_HEADER;

TGA_HEADER header;

int LoadWidth()
{
	return header.width;
}

int LoadHeight()
{
	return header.height;
}

unsigned char *LoadTGA(char *name)
{
	FILE *f;
	unsigned char *data, *p;

	f = fopen(name, "rb");
	printf("here\n");
	if (!f)
		return 0;
	fread(&header, sizeof(TGA_HEADER), 1, f);
	printf("tga %d %d %d\n", header.width, header.height, header.bitsperpixel);
	printf("here2\n");

	p = data = (unsigned char *)malloc(header.width * header.height * header.bitsperpixel);
	if (!data)
		return 0;

	for (int y=header.height-1; y>=0; y--)
  {
    p = data + (y * (int)header.width * 4);

		for (int x=0; x<header.width; x++)
		{
			if (header.bitsperpixel == 32)
			{
				fread(p, 1, 1, f);
				p++;
				fread(p, 1, 1, f);
				p++;
				fread(p, 1, 1, f);
				p++;
				fread(p, 1, 1, f);
				p++;
			}
			else if (header.bitsperpixel == 24)
			{
				fread(p, 1, 1, f);
				p++;
				fread(p, 1, 1, f);
				p++;
				fread(p, 1, 1, f);
				p++;
				*p++ = 0xff;
			}
		}
  }
	printf("here3\n");

	return data;
}
*/

/* After successful initialization, these 2 variables
   will contain function pointers.
 */
     inpfuncPtr inp32fp;
     oupfuncPtr oup32fp;


/* Wrapper functions for the function pointers
    - call these functions to perform I/O.
 */
     short  Inp32 (short portaddr)
     {
          return (inp32fp)(portaddr);
     }

     void  Out32 (short portaddr, char datum)
     {
          (oup32fp)(portaddr,datum);
     }


int main(void)
{
     HINSTANCE hLib;


	//unsigned char *image;
	//unsigned int addr=0x300;
    unsigned int addr=0x0;

// load image
/*	image = LoadTGA(argv[1]);
	if (!image)
	{
		printf("couldn't load TGA %s\n", argv[1]);
		exit(1);
	}

	if (LoadWidth() % BYTES_PER_LINE != 0)
	{
		printf("TGA width not multiple of %d\n", BYTES_PER_LINE);
		exit(1);
	}


     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          cout<<"LoadLibrary Failed."<<endl;
          return -1;
     }

     /* get the address of the function */

     inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32fp == NULL) {
          cout<<"GetProcAddress for Inp32 Failed."<<endl;
          return -1;
     }


     oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32fp == NULL) {
          cout<<"GetProcAddress for Oup32 Failed"<<endl;
          return -1;
     }


/*******************************************************/
/** IF WE REACHED HERE, INITIALIZED SUCCESSFUL    ******/
/*******************************************************/


	char clr;
	int	bcount=0;
 int port;
  FILE * fp;
  fp = fopen("2edited.text","r");
  unsigned int data=0;
  unsigned int i=0;
  char c1,c2;
  int j=0;
  while(1){
           fscanf(fp,"%03x %c %02x %c %d",&port,&c1,&data,&c2,&i);
            // fscanf(fp,"%02x ",&data);
            unsigned short dat=data;          
           //if((char)data==EOF)break;
          //cout<<"port= "<<port<<" c1="<<c1<<" data="<<dat<<"c2="<<c2<<" i="<<i<<endl;
           Out32(PPORT_BASE,dat);
          
           }
  
    fclose(fp) ;    
/*
for (int y=0; y<600; y++)
		for (int x=0; x<800; x++)
		{
			unsigned char r, g, b, a;
		/*  b = *image++;
			g = *image++;
			r = *image++;
			a = *image++;*/
		
/*	if ((bcount % BYTES_PER_LINE) == 0)
				{
                 
                 Out32(PPORT_BASE,0xC1);
                 Out32(PPORT_BASE,0xc1);
                 Out32(PPORT_BASE,0xc0);
                 char addr1;
                 addr1 = addr>>20;
                 addr1 = addr1<<2;
                 addr1= addr1|0xc0;
                 Out32(PPORT_BASE,addr1);
                 addr1 |= 0x2;
                 
                 Out32(PPORT_BASE,addr1);
                 addr1 ^= 0x2;
                 Out32(PPORT_BASE,addr1);
                 
                 
                 char addr2;
                 addr2 = addr>>16;
                 addr2 = addr2 & 0xF;
                 addr2 = addr2<<2;
                 addr2= addr2|0xc0;
                 Out32(PPORT_BASE,addr2);
                 addr2 |= 0x2;
                 
                 Out32(PPORT_BASE,addr2);
                 addr2 ^= 0x2;
                 Out32 (PPORT_BASE,addr2);
                 
                  
                  
                 char addr3;
                 addr3 = addr>>12;
                 addr3 = addr3 & 0xF;
                 addr3 = addr3<<2;
                 addr3= addr3|0xc0;
                 Out32(PPORT_BASE,addr3);
                 addr3 |= 0x2;
                 
                 Out32(PPORT_BASE,addr3);
                 addr3 ^= 0x2;
                 Out32(PPORT_BASE,addr3);
 
                
                 char addr4;
                 addr4 = addr>>8;
                 addr4 = addr4 & 0xF;
                 
                 addr4 = addr4<<2;
                 addr4= addr4|0xc0;
                 Out32(PPORT_BASE,addr4);
                 addr4 |= 0x2;
                 
                 Out32(PPORT_BASE,addr4);
                 addr4 ^= 0x2;
                 Out32(PPORT_BASE,addr4);
                 

                 char addr5;
                 addr5 = addr>>4;
                 addr5 = addr5 & 0xF;
                 addr5 = addr5<<2;
                 addr5= addr5|0xc0;
                 Out32(PPORT_BASE,addr5);
                 addr5 |= 0x2;
                 
                 Out32(PPORT_BASE,addr5);
                 addr5 ^= 0x2;
                 Out32(PPORT_BASE,addr5);


                char addr6;
                
                 addr6 = addr & 0xF;
                 addr6 = addr6<<2;
                 addr6= addr6|0xc0;

                 Out32(PPORT_BASE,addr6);
                 addr6 |= 0x2;
                 
                 Out32(PPORT_BASE,addr6);
                 addr6 ^= 0x2;
                 Out32(PPORT_BASE,addr6);
                 
                }
             
			clr = 0xc8;
			Out32(PPORT_BASE, clr);
			clr |= 2;
			Out32(PPORT_BASE, clr);
			clr ^= 0x2;
			Out32(PPORT_BASE, clr);
			if ((bcount % BYTES_PER_LINE) == (BYTES_PER_LINE-1))
			{
				//cout<<addr<<endl;
				addr += BYTES_PER_LINE;
				printf("%04x\n",addr);
				short a=0xc1;
				Out32(PPORT_BASE,a);
                Out32(PPORT_BASE,a^0x1);
                Out32(PPORT_BASE,a^0x2);
                 

			}

			bcount++;
			
		}
     /* finished - unload library and exit */
     FreeLibrary(hLib);
    
     //fclose(fp);
     return 0;
}

/*
   TEST:  Read inputs of 8 registers from PORT_BASE address
 */
void test_read8(void) {

     short x;
     int i;

     /* Try to read 0x378..0x37F, LPT1:  */

     for (i=PPORT_BASE; (i<(PPORT_BASE+8)); i++) {

          x = Inp32(i);

          printf("Port read (%04X)= %04X\n",i,x);
     }

}

/*
   TEST:  Write constant 0x77 to PORT_BASE (Data register)
 */
void test_write(void) {
     short x;
     int i;

     /*****  Write the data register */

     i=PPORT_BASE;
     x=0x75;

     /*****  Write the data register */
     Out32(i,x);

     printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = Inp32(i);
     printf("Port read (%04X)= %04X\n",i,x);


     /*****  Set all bits high */
     x=0xFF;
     Out32(i,x);

     /*****  Now, set bi-directional and read again */
     Out32(PPORT_BASE+2,0x20);     // Activate bi-directional
     x = Inp32(i);
     printf("Set Input, read (%04X)= %04X\n",i,x);

     Out32(PPORT_BASE+2,0x00);     // Set Output-only again
     x = Inp32(i);
     printf("Reset Ouput, read (%04X)= %04X\n",i,x);


}

/*
   TEST:  Write data from parameter
 */
void test_write_datum(short datum) {
     short x;
     int i;

     i=PPORT_BASE;
     x = datum;

     /*****  Write the data register */
     Out32(i,x);

     printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = Inp32(i);
     printf("Port read (%04X)= %04X\n",i,x);
}


