home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C128CPM / PCXEM12.ARC / PCXEM.C next >
Encoding:
C/C++ Source or Header  |  1994-03-05  |  4.8 KB  |  208 lines

  1. /*
  2. PCX'EM 1.2
  3.  
  4. (C) 1994 Steve Goldsmith
  5. All Rights Reserved
  6.  
  7. Compiled with HI-TECH C 3.09 (CP/M-80).
  8.  
  9. To compile with HI-TECH C and SG C Tools 1.6 source on same disk use:
  10. C PCXEM.C -LC128
  11.  
  12. To view a PCX in 640 X 480 interlace:
  13.  
  14. PCXEM {U:D:}filespec {color}
  15. PCXEM PCXEM.PCX 4
  16. Views PCXEM.PCX on green background.
  17.  
  18. Use [CTRL] [RUN STOP] to toggle off disk status line before running.
  19. */
  20.  
  21. #include <stdio.h>
  22. #include <conio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <cpm.h>
  26. #include <hitech.h>
  27. #include <vdc.h>
  28. #include <pcx.h>
  29.  
  30. extern uchar  vdcScrHorz;
  31. extern ushort vdcDispMem;
  32. extern ushort vdcAttrMem;
  33. extern ushort vdcCharMem;
  34. extern ushort vdcCharMemSize;
  35. extern ushort vdcBitMapMemSize;
  36. extern ushort pcxXSize;
  37. extern ushort pcxYSize;
  38.  
  39. #define appBitMapMem 0x4000 /* bit map location */
  40. #define appAttrMem   0x0800 /* attr location */
  41.  
  42. uchar *appChSetBufPtr = NULL; /* char set buffer pointer */
  43. uchar appColor = vdcDarkBlue; /* pcx foreground color */
  44.  
  45. void disphelp(void);
  46. void set64kmode(void);
  47. void initbitmap64k(void);
  48. uchar savechrsets(void);
  49. void restorechrsets(void);
  50. void graphicsview(void);
  51.  
  52. /*
  53. Main program saves key VDC registers, maps the VDC, sets bit map size to 48K,
  54. sets 64K mode, parses and converts command line params, sets interlace bit map
  55. mode, decodes and views PCX file then restores normal CP/M mode text mode.
  56. All errors are reported in text mode.
  57. */
  58.  
  59. main(int argc, char *argv[])
  60. {
  61.   puts("\nPCX'EM 1.2 03/05/94 (C) 1994 Steve Goldsmith");
  62.   if (argc > 1)
  63.   {
  64.     savevdc();
  65.     mapvdc();
  66.     vdcBitMapMemSize = 49152;
  67.     set64kmode();
  68.     if (argc > 2)
  69.       sscanf(argv[2],"%d",&appColor);
  70.     bdos(45,0x0FE);
  71.     switch (initpcx(argv[1]))
  72.     {
  73.       case pcxErrNone:
  74.         if (pcxXSize < 641 && pcxYSize < 481)
  75.         {
  76.           if(savechrsets())
  77.           {
  78.             initbitmap64k();
  79.             decodefileintpcx(0,0);
  80.             donepcx();
  81.             graphicsview();
  82.             clrattrvdc(0);
  83.             clrattrvdc(32);
  84.             restorevdc();
  85.             putchar(0x1A); /* use cp/m to clear screen */
  86.           }
  87.         }
  88.         else
  89.         {
  90.           donepcx();
  91.           puts("\nImage cannot be larger than 640 X 480.");
  92.         }
  93.         break;
  94.       case pcxErrFile:
  95.         puts("\nUnable to open file.");
  96.         break;
  97.       case pcxErrHeader:
  98.         donepcx();
  99.         puts("\nCannot read header.");
  100.         break;
  101.       case pcxErrNotPCX:
  102.         donepcx();
  103.         puts("\nFile not .PCX format.");
  104.         break;
  105.       case pcxErrNot2Bit:
  106.         donepcx();
  107.         puts("\nFile not 2 color.");
  108.         break;
  109.     }
  110.     if(appChSetBufPtr != NULL)
  111.       free(appChSetBufPtr);
  112.   }
  113.   else
  114.     disphelp();
  115. }
  116.  
  117. /*
  118. Simple help.
  119. */
  120.  
  121. void disphelp(void)
  122. {
  123.   puts("\nPCXEM {U:D:}filespec {color}");
  124.   puts("{color} background must be VDC color 0 - 15.");
  125.   puts("\nPCXEM PCXEM.PCX 4 (view PCXEM.PCX on green background)");
  126.   puts("\n\x01B\x047\x032IMPORTANT:\x01B\x047\x030 Use [CTRL] [RUN STOP] to toggle off disk status line.");
  127. }
  128.  
  129. /*
  130. Set VDC to 64K mode if not in 64K mode.
  131. */
  132.  
  133. void set64kmode(void)
  134. {
  135.   if(!(is64kvdc()) && appChSetBufPtr == NULL)
  136.   {
  137.     if(savechrsets())
  138.     {
  139.       restorevdc();         /* make sure all registers are default value */
  140.       set64kvdc();          /* set 64k mode */
  141.       savevdc();            /* reflect change to reg 28 */
  142.       outvdc(vdcFgBgColor,vdcBlack);
  143.       attrsoffvdc();
  144.       restorechrsets();     /* restore char sets destroyed by setting 64k mode */
  145.       clrattrvdc(0);
  146.       clrscrvdc(32);
  147.       restorevdc();
  148.       mapvdc();
  149.       free(appChSetBufPtr); /* dispose buffer */
  150.       appChSetBufPtr = NULL;
  151.     }
  152.   }
  153. }
  154.  
  155. /*
  156. Set and clear bit map.
  157. */
  158.  
  159. void initbitmap64k(void)
  160. {
  161.   setcursorvdc(0,0,vdcCurNone);    /* turn cursor off */
  162.   attrsoffvdc();
  163.   setbitmapintvdc(appBitMapMem,appAttrMem,vdcBlack,vdcBlack);
  164.   mapvdc();                        /* set global vdc vars to reflect changes */
  165.   clrbitmapvdc(0);                 /* clear bit map */
  166.   outvdc(vdcFgBgColor,appColor << 4);
  167. }
  168.  
  169. /*
  170. Save char sets if not in 64K mode.
  171. */
  172.  
  173. uchar savechrsets(void)
  174. {
  175.   if(is64kvdc())
  176.     return(1);
  177.   else
  178.   {
  179.     appChSetBufPtr = memtobufvdc(vdcCharMem,vdcCharMemSize);
  180.     if (appChSetBufPtr != NULL)
  181.       return(1);
  182.     else
  183.       return(0);
  184.   }
  185. }
  186.  
  187. /*
  188. Restore char sets if buffer is not null.
  189. */
  190.  
  191. void restorechrsets(void)
  192. {
  193.   if(appChSetBufPtr != NULL)
  194.     buftomemvdc(appChSetBufPtr,vdcCharMem,vdcCharMemSize);
  195. }
  196.  
  197. /*
  198. Wait until key is pressed then clear bit map.
  199. */
  200.  
  201. void graphicsview(void) /* view graphics until key pressed */
  202. {
  203.   while (!(kbhit()));
  204.   getch();
  205.   outvdc(vdcFgBgColor,vdcBlack);   /* black screen */
  206.   clrbitmapvdc(0);
  207. }
  208.