/**
 **
 **  Ultima 5 Tools by Otmar Lendl (lendl@cosy.sbg.ac.at)
 **
 **	Use and redistribution of this program is free.
 **	Please send any modifications to me.
 **
 **		Share and Enjoy !
 **
 **/
#include <stdio.h>
#define BPROW  (256*16)    /* Bytes pro 16 Linien */

unsigned char gfx[256][4] = {
	{ 0, 0, 0, 0},{ 0, 0, 0, 0},{ 0, 0, 0, 0},{ 0, 4, 0, 0}, /* 00-  */
	{ 2, 3,12, 4},{ 0, 2, 0, 8},{ 2, 2, 8, 8},{ 4, 4, 2, 4},
	{ 2,10, 8, 8},{ 5,15, 5,15},{ 5,15, 5,15},{ 2, 6, 2, 0},
	{15,13,15,15},{15,15,15,15},{ 2, 6, 2, 0},{ 2, 6, 2, 0},
	{ 6,14, 6, 0},{ 7, 8, 8, 7},{12, 7, 7,12},{ 6,14, 6, 0}, /* 10-  */
	{ 3, 6, 6, 3},{15, 9, 9,15},{ 7,12,12, 7},{ 7,12,12, 7},
	{ 7,12,12, 7},{ 7, 8, 8, 7},{ 7, 8, 8, 7},{ 8,15,15, 8},
	{ 0, 0, 0, 0},{15, 6, 6,15},{ 2, 6, 2, 0},{ 0, 4, 0, 0},
	{ 0,15, 0, 0},{ 2, 2, 2, 2},{ 0,14, 2, 2},{ 0, 3, 2, 2}, /* 20-  */
	{ 2, 3, 0, 0},{ 2,14, 0, 0},{ 2,15, 2, 2},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{12, 2,15, 2},
	{ 0, 4, 0, 0},{ 0,11, 0, 0},{ 0, 2, 0,10},{ 0, 2,13, 0}, /* 30-  */
	{ 0, 4, 0, 0},{ 8, 4, 2, 0},{ 0, 2, 4, 8},{ 8, 4, 2, 8},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 0, 3, 3},{ 3, 3, 3, 3},
	{ 3, 3, 0, 0},{ 7,15,15, 7},{ 7, 4, 4, 7},{ 7,15,15, 7},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* 40-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 6, 6, 6, 6},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* 50-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0,15,15, 0},{ 6, 6, 6, 6},{ 0,14,14, 6},{ 0, 7, 7, 6}, /* 60-  */
	{ 6, 7, 7, 0},{ 6,14,14, 0},{ 0,15,15, 6},{ 6, 7, 7, 6},
	{ 6,15,15, 0},{ 6,14,14, 6},{ 2,11,11, 2},{ 6,15, 4, 6},
	{ 0, 3,15, 0},{ 6, 6, 2, 2},{ 0,12,15, 0},{ 2, 2, 6, 6},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* 70-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* 80-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* 90-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* A0-  */
	{ 0,11,11, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* B0-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* C0-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* D0-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* E0-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}, /* F0-  */
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},
	{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0},{ 0, 4, 0, 0}
};

unsigned char buff[10][10];

main()
{
 char filen[50]="mybrit.dat";
 int sy,x,y,startx,starty,endx,endy,i,j,count;
 long foffset;
 unsigned char n1,n2;
 unsigned char block[16][16][16];
 FILE *fh;

 fh = fopen(filen,"rb");
 if ( fh==NULL) exit(10);

 puts("\n Ultima V Landscape-Printer (c) Anduril 1990 !\n");
do
 {
 puts("  Enter start-koords ( x,y ): ");
 scanf("%d,%d",&startx,&starty);
 }
 while ( (startx < 0) || (startx > 15) || (starty < 0) || (starty > 15));

do
 {
 puts("  Enter end-koords ( x,y ): ");
 scanf("%d,%d",&endx,&endy);
 }
 while ( (endx < startx) || (endx > 15) || (endy < starty) || (endy > 15));

 printf("\nPrinting Landscape from (%d,%d) to (%d,%d).\n",startx,starty,endx,endy);

 initprinter();

 n1 = ((endx-startx+1)*16*4) & 255;
 n2 = ((endx-startx+1)*16*4) >> 8;

/* n1 = ((endx-startx+1)*16*4) & 255;	old n1,n2
 n2 = ((endx-startx+1)*16*4) >> 8;               */

 foffset = ((long)starty)*(long)BPROW;
 fseek(fh,foffset,SEEK_SET);	/* Positionieren */

 for(y=starty;y<=endy;y++)		/* Schleife ueber die y ! */
	{
	if (fread(block,1,BPROW,fh) != BPROW )
		{
		puts("\nFile error !!!! \n");
		exit(20);
		}
	for(sy=0;sy<16;sy+=4)
		{
		fprintf(stdprn,"\033*%c",39);  /* 180 dpi */
		fputc(n1,stdprn);
		fputc(n2,stdprn);
		count = 0;
		for(x=(startx<<4);x<((endx+1)<<4);x++)
			{
			i = block[x>>4][sy+1][x&15];
			buff[0][0] = gfx[i][0];
			buff[0][1] = gfx[i][1];
			buff[0][2] = gfx[i][2];
			buff[0][3] = gfx[i][3];
			i = block[x>>4][sy][x&15];
			buff[0][0] += gfx[i][0]<<4;
			buff[0][1] += gfx[i][1]<<4;
			buff[0][2] += gfx[i][2]<<4;
			buff[0][3] += gfx[i][3]<<4;

			i = block[x>>4][sy+3][x&15];
			buff[1][0] = gfx[i][0];
			buff[1][1] = gfx[i][1];
			buff[1][2] = gfx[i][2];
			buff[1][3] = gfx[i][3];
			i = block[x>>4][sy+2][x&15];
			buff[1][0] += gfx[i][0]<<4;
			buff[1][1] += gfx[i][1]<<4;
			buff[1][2] += gfx[i][2]<<4;
			buff[1][3] += gfx[i][3]<<4;

			for(j=0;j<4;j++)
			  fprintf(stdprn,"%c%c%c",buff[0][j],buff[1][j],0);
			count++;
/*			fwrite(buff,4,1,stdprn);   */
			}
		fputs("\n",stdprn);
		}
	}
 fputs("\033@",stdprn);
}

initprinter()
{
  fprintf(stdprn,"%c%c%c",27,'3',16);    /* passt noch nicht genau */
}




