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;

}


 



Edytuj