Pisząc ten emulator przypomniałem sobie, że pixele karty Hercules podobnie jak i kropki drukarki igłowej były prostokątne! Dlatego każda kropka rysowana jest tu dwa razy, jedna nad drugą, co dość dobrze przybliża oryginalny stosunek skali pionowej do poziomej.
/************************************************************************************************
****** DISPLAY_PAD.C **** Program do wyświetlania obrazków typu *.pad (*.prn na NX15) ***
*************************************************************************************************
****** created 18 sty 2006 by PAD ***** last modified: 18 sty 2006 by PAD ******
************************************************************************************************/
#include<stdio.h>
#include"cpgplot.h"
int main(int argc, char *argv[])
{
FILE *f;
int c,k,i,j,hi,lo,wide,error,line;
char t[800][800];
unsigned char byte;
float y;
if(argc<2){
puts("\n\nPodaj nazwę zbioru do wyświetlenia jako argument!\n");
return 1;
}
f=fopen( argv[1],"r");
if(f==NULL){
printf("\n\nNie mogę otworzyć zbioru %s !\n",argv[1]);
return 1;
}
line=0;
error=0;
while( (c=fgetc(f)) != EOF)
{
if(c==27)
{
k=fgetc(f);
if(k=='L')
{
lo=fgetc(f); hi=fgetc(f);
wide=hi*256+lo;
if(wide>799){
puts("Linia dłuższa niż 800.\n");
error=1;
break;
}
for(i=0;i<=wide;++i) t[i][line]=fgetc(f);
line++;
if(line>799){
puts("Więcej niż 800 linii.\n");
error=1;
break;
}
}
else if(k=='J') fgetc(f);
else puts("Nieznany kod po ESC\n");
}
else if(c==13) continue;
else printf("Odczytałem dziwny kod: %d\n",c);
}
fclose(f);
if(error) return 1;
printf("Odczytano %d linii danych graficznych, o długości %d każda.\n",line,wide);
/* preparing screen for main plot: */
k=cpgopen("?");
if(k!=1) {
puts("\ncpgopen error\n");
return 1;
}
cpgslw(6);
cpgsch(1.0);
cpgenv(0.0,wide,0.0,8.0*line,1,-2);
y=8.0*line;
for(i=0;i<line;i=i+2)
{
for(j=0;j<=wide;j++)
{
byte=t[j][i];
if(byte & 1) cpgpt1(j,y-14,-1);
if(byte & 2) cpgpt1(j,y-12,-1);
if(byte & 4) cpgpt1(j,y-10,-1);
if(byte & 8) cpgpt1(j,y- 8,-1);
if(byte & 16) cpgpt1(j,y- 6,-1);
if(byte & 32) cpgpt1(j,y- 4,-1);
if(byte & 64) cpgpt1(j,y- 2,-1);
if(byte &128) cpgpt1(j,y- 0,-1);
}
for(j=0;j<=wide;j++)
{
byte=t[j][i];
if(byte & 1) cpgpt1(j,y-15,-1);
if(byte & 2) cpgpt1(j,y-13,-1);
if(byte & 4) cpgpt1(j,y-11,-1);
if(byte & 8) cpgpt1(j,y- 9,-1);
if(byte & 16) cpgpt1(j,y- 7,-1);
if(byte & 32) cpgpt1(j,y- 5,-1);
if(byte & 64) cpgpt1(j,y- 3,-1);
if(byte &128) cpgpt1(j,y- 1,-1);
}
y = y-16;
}
cpgclos();
return 0;
}