/* Printscreen.c - prints TI-85 screen on text printer */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "packet.h"
#include "tiport.h"

/* Screen dimensions */
#define SCREENX 128
#define SCREENY 64

/* Printer controls */
#define PRT_RESET "\ec"
#define PRT_FINE  "\e[4W"
#define PRT_8LPI  "\e[0z"
#define PRT_MARGSET "\e[P\000;P\202s"

int main() {

  extern UBYTE *buffer;
  int x,y,i=0;
  FILE *prt=NULL;
  char line[150]="";

  initport();

  if (!(buffer=malloc(SCREENX*SCREENY*sizeof(UBYTE))))
    {
      printf("Out of memory!\n");
      abort();
    }
  
#ifdef DEBUG
  printf("Sending screendump request\n");
#endif  
  put_packet(0x6d, 00); /* Request screendump */


#ifdef DEBUG
printf("Waiting for ACK\n");
#endif
  if (get_packet() != PAK_ACKNOWLEDGE)
    {
      printf("Link error\n");
      abort();
    }
  
#ifdef DEBUG 
printf("Getting data \n");
#endif
  if (get_packet() != PAK_DATAPART)
    {
      printf("Link error\n");
      abort();
    }
  
#ifdef DEBUG
printf("ACK\n");
#endif

  put_packet(PAK_ACKNOWLEDGE,0);

  
#ifdef DEBUG
printf("Opening prt:\n");
#endif

  if (!(prt=fopen("prt:", "wb")))
    {
      printf("Could not open printer\n");
      abort();
    }

#ifdef DEBUG
printf("Reseting printer\n");
#endif
  
  /* Reset printer */
  fputs(PRT_RESET, prt);
  fputs(PRT_FINE, prt);
  fputs(PRT_8LPI, prt);

  for (y=0; y<SCREENY; y++)
    {
printf("Printing line %d\n", y+1);
      for(x=0; x<SCREENX/8; x++)
	{
	  int bit=0;
	  UBYTE mask;
	  for(bit=0,mask=0x80;bit<8;bit++, mask=mask>>1)
	    if ((buffer[i]&mask)==0)
	      strcat(line, " ");
	    else
	      strcat(line, "X");
	  i++;
	}
      fputs(line, prt);
      fputc('\n', prt);
      strcpy(line,"");
    }
  fputc(0x0c,prt);
  fclose(prt);
}
