home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / spectrum / jpp / spconv / spconv.c < prev    next >
C/C++ Source or Header  |  1992-12-13  |  24KB  |  1,346 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. #include <alloc.h>
  6.  
  7. void read_image(char * s);
  8. void write_image(char * s);
  9. void read_jpp(char * s);
  10. void write_jpp(char * s);
  11. void read_vgaspec_header(char * s);
  12. void read_vgaspec(char * s);
  13. void write_vgaspec(char * s);
  14. void read_old_vgaspec(char * s);
  15. void write_old_vgaspec(char * s);
  16. void read_raw(char * s);
  17. void read_z80(char * s);
  18. void write_z80(char * s);
  19. void read_prg(char * s);
  20. void write_prg(char * s);
  21. void jpp_to_vgaspec();
  22. void vgaspec_to_jpp();
  23. void raw_to_jpp();
  24. void jpp_to_z80();
  25. void z80_to_jpp();
  26. void jpp_to_prg();
  27. void prg_to_jpp();
  28. void z80_uncompress();
  29. void z80_uncompress();
  30. int  z80_compress();
  31.  
  32. union header_u {
  33.     char in[9];
  34.     struct {
  35.         char type;
  36.         unsigned int  length;
  37.         unsigned int  start;
  38.         char var;
  39.         char res1;
  40.         int  line;
  41.     } header;
  42. } h;
  43.  
  44. char expect[]={
  45.     0x03,        /* type CODE */
  46.     0x00,0xc0,    /* image size */
  47.     0x00,0x40,    /* image start */
  48.     0xff,        /* var */
  49.     0xff,        /* res1 */
  50.     0xff,0xff    /* line */
  51. };    
  52.  
  53. struct jpp_s {
  54.     unsigned char i;
  55.     unsigned char lax;
  56.     unsigned char hax;
  57.     unsigned char eax;
  58.     unsigned char dax;
  59.     unsigned char cax;
  60.     unsigned char bax;
  61.     unsigned char fax;
  62.     unsigned char aax;
  63.     unsigned char l;
  64.     unsigned char h;
  65.     unsigned char e;
  66.     unsigned char d;
  67.     unsigned char c;
  68.     unsigned char b;
  69.     unsigned char iyl;
  70.     unsigned char iyh;
  71.     unsigned char ixl;
  72.     unsigned char ixh;
  73.     unsigned char iff2;
  74.     unsigned char r;
  75.     unsigned char f;
  76.     unsigned char a;
  77.     unsigned char spl;
  78.     unsigned char sph;
  79.     unsigned char im;
  80.     unsigned char border;
  81. } jpp;
  82.  
  83. struct vga_s {
  84. /*00*/    unsigned char S;
  85. /*01*/    unsigned char P;
  86. /*02*/    unsigned int len;
  87. /*04*/    unsigned int start;
  88. /*06*/    unsigned char c;
  89. /*07*/    unsigned char b;
  90. /*08*/    unsigned char e;
  91. /*09*/    unsigned char d;
  92. /*0A*/    unsigned char l;
  93. /*0B*/    unsigned char h;
  94. /*0C*/    unsigned char f;
  95. /*0D*/    unsigned char a;
  96. /*0E*/    unsigned char ixl;
  97. /*0F*/    unsigned char ixh;
  98. /*10*/    unsigned char iyl;
  99. /*11*/    unsigned char iyh;
  100. /*12*/    unsigned char cax;
  101. /*13*/    unsigned char bax;
  102. /*14*/    unsigned char eax;
  103. /*15*/    unsigned char dax;
  104. /*16*/    unsigned char lax;
  105. /*17*/    unsigned char hax;
  106. /*18*/    unsigned char fax;
  107. /*19*/    unsigned char aax;
  108. /*1A*/    unsigned char r;
  109. /*1B*/    unsigned char i;
  110. /*1C*/    unsigned char spl;
  111. /*1D*/    unsigned char sph;
  112. /*1E*/    unsigned char pcl;
  113. /*1F*/    unsigned char pch;
  114. /*20*/    unsigned char res2;
  115. /*21*/    unsigned char res3;
  116. /*22*/    unsigned char border;
  117. /*23*/    unsigned char res4;
  118. /*24*/    unsigned char im;
  119. /*25*/    unsigned char res5;
  120. } vga;
  121.  
  122. struct z80_s {
  123. /*00*/    unsigned char a;
  124. /*01*/    unsigned char f;
  125. /*02*/    unsigned char c;
  126. /*03*/    unsigned char b;
  127. /*04*/    unsigned char l;
  128. /*05*/    unsigned char h;
  129. /*06*/    unsigned char pcl;
  130. /*07*/    unsigned char pch;
  131. /*08*/    unsigned char spl;
  132. /*09*/    unsigned char sph;
  133. /*0A*/    unsigned char i;
  134. /*0B*/    unsigned char r;
  135. /*0C*/    unsigned char data;
  136. /*0D*/    unsigned char e;
  137. /*0E*/    unsigned char d;
  138. /*0F*/    unsigned char cax;
  139. /*10*/    unsigned char bax;
  140. /*11*/    unsigned char eax;
  141. /*12*/    unsigned char dax;
  142. /*13*/    unsigned char lax;
  143. /*14*/    unsigned char hax;
  144. /*15*/    unsigned char aax;
  145. /*16*/    unsigned char fax;
  146. /*17*/    unsigned char iyl;
  147. /*18*/    unsigned char iyh;
  148. /*19*/    unsigned char ixl;
  149. /*1A*/    unsigned char ixh;
  150. /*1B*/    unsigned char iff1;
  151. /*1C*/    unsigned char iff2;
  152. /*1D*/    unsigned char im;
  153. } z80;
  154.  
  155. struct prg_s {
  156. /*00*/    char name[10];
  157. /*0A*/    char nullbyte;
  158. /*0B*/    unsigned char contains_0x61;
  159. /*0C*/    unsigned char contains_0x35;
  160. /*0D*/    unsigned char contains_0x03;
  161. /*0E*/  unsigned char contains_0x00[0xdc-0x0e];
  162. /*DC*/    unsigned char iyl;
  163. /*DD*/    unsigned char iyh;
  164. /*DE*/    unsigned char ixl;
  165. /*DF*/    unsigned char ixh;
  166. /*E0*/    unsigned char eax;
  167. /*E1*/    unsigned char dax;
  168. /*E2*/    unsigned char cax;
  169. /*E3*/    unsigned char bax;
  170. /*E4*/    unsigned char lax;
  171. /*E5*/    unsigned char hax;
  172. /*E6*/    unsigned char fax;
  173. /*E7*/    unsigned char aax;
  174. /*E8*/    unsigned char e;
  175. /*E9*/    unsigned char d;
  176. /*EA*/    unsigned char c;
  177. /*EB*/    unsigned char b;
  178. /*EC*/    unsigned char l;
  179. /*ED*/    unsigned char h;
  180. /*EE*/    unsigned char iff2;
  181. /*EF*/    unsigned char i;
  182. /*F0*/    unsigned char spl;
  183. /*F1*/    unsigned char sph;
  184. /*F2*/    unsigned char filler[0x0e];
  185. } prg;
  186.  
  187. #define IMSIZE 49152
  188.  
  189. unsigned char image[IMSIZE];
  190.  
  191. unsigned int z80_size;
  192.  
  193. int    intype;
  194. int    outtype;
  195.  
  196. #define    RAW        1
  197. #define JPP        2
  198. #define    SPECTRUM    3
  199. #define    Z80        4
  200. #define    PRG        5
  201. #define    UNKNOWN        6
  202.  
  203. unsigned int addr;
  204. unsigned int sp;
  205. unsigned int pc;
  206. int fd;
  207.  
  208. main(argc,argv)
  209. int argc;
  210. char *argv[];
  211. {
  212.     int i;
  213.     char *p;
  214.     struct stat status;
  215.     char * fromstring;
  216.     char * tostring;
  217.     char * outfile;
  218.  
  219.     if(argc != 3)
  220.     {
  221.         fprintf(stderr,"SPCONV version 1.02 - %s\n\n",__DATE__);
  222.         fprintf(stderr,"Usage: spconv <source> <target>\n\n");
  223.         fprintf(stderr,"Source must be a valid .SNA, .SP, .Z80, .PRG or RAW file.\n");
  224.         fprintf(stderr,"Target must be a .SNA, .SP, .Z80 or .PRG file.\n\n");
  225.         fprintf(stderr,"If the second parameter contains only a suffix, the prefix\n");
  226.         fprintf(stderr,"of the input file will be used (i.e. 'spconv file.sna .z80')\n\n");
  227.         fprintf(stderr,"Output .SP files are in the new format, .Z80 files are compressed.\n\n");
  228.         fprintf(stderr,"If <source> and <target> are .SP files, convertion from old\n");
  229.         fprintf(stderr,"to new format or from new to old format will be performed.\n");
  230.         fprintf(stderr,"If <source> and <target> are of the same type an error message\n");
  231.         fprintf(stderr,"will be generated (unless they are both .SP files)\n");
  232.         fprintf(stderr,"\n\nPublic Domain, H. de Groot 1992\n\n");
  233.  
  234.         return 1;
  235.     }
  236.  
  237.     if((strchr(argv[1],'*')!=NULL) || (strrchr(argv[1],'?')!=NULL) ||
  238.        (strchr(argv[2],'*')!=NULL) || (strrchr(argv[2],'?')!=NULL))
  239.     {
  240.         fprintf(stderr,"This program can't handle wildcards, sorry!\n");
  241.         return 1;
  242.     }
  243.  
  244.     if(stat(argv[1],&status)<0)
  245.     {
  246.         perror(argv[1]);
  247.         return 1;
  248.     }
  249.  
  250.     /* 
  251.      * recognize input type on filename:
  252.      *
  253.      *    .SNA    ->    JPP file
  254.      *    .SP    ->    SPECTRUM file (was VGASPEC)
  255.      *    .Z80    ->    Z80 file
  256.      *    .PRG    ->    PRG file
  257.      *    other    ->    if exact 48+header -> raw file
  258.      *    otherwise     unknown
  259.      */
  260.  
  261.     intype=UNKNOWN;
  262.     p=strrchr(argv[1],'.');
  263.     if(p==NULL) p=argv[1]; /* not found, set at begin of string */
  264.     if((strcmp(p,".SNA")==0) || (strcmp(p,".sna")==0))
  265.     {
  266.         fromstring="from .SNA";
  267.         intype=JPP;
  268.     }
  269.     if((strcmp(p,".Z80")==0) || (strcmp(p,".z80")==0)) 
  270.     {
  271.         fromstring="from .Z80";
  272.         intype=Z80;
  273.     }
  274.     if((strcmp(p,".SP")==0) || (strcmp(p,".sp")==0)) 
  275.     {
  276.         fromstring="from .SP";
  277.         intype=SPECTRUM;
  278.     }
  279.     if((strcmp(p,".PRG")==0) || (strcmp(p,".prg")==0)) 
  280.     {
  281.         fromstring="from .PRG";
  282.         intype=PRG;
  283.     }
  284.  
  285.     if(intype==UNKNOWN)
  286.         if (status.st_size == (sizeof(h)+IMSIZE)) 
  287.         {
  288.             fromstring="from RAW";
  289.             intype=RAW;
  290.         }
  291.  
  292.     /* 
  293.      * recognize output type on filename:
  294.      *
  295.      *    .SNA    ->    JPP file
  296.      *    .SP    ->    SPECTRUM file (was VGASPEC)
  297.      *    .Z80    ->    Z80 file
  298.      *    .PRG    ->    PRG file
  299.      *    otherwise     unknown
  300.      */
  301.     outtype=UNKNOWN;
  302.  
  303.     p=strrchr(argv[2],'.');
  304.     if(p==NULL) p=argv[2]; /* not found, set at begin of string */
  305.     if((strcmp(p,".SNA")==0) || (strcmp(p,".sna")==0)) 
  306.     {
  307.         tostring="to .SNA";
  308.         outtype=JPP;
  309.     }
  310.     if((strcmp(p,".Z80")==0) || (strcmp(p,".z80")==0)) 
  311.     {
  312.         tostring="to .Z80";
  313.         outtype=Z80;
  314.     }
  315.     if((strcmp(p,".SP")==0) || (strcmp(p,".sp")==0)) 
  316.     {
  317.         tostring="to .SP";
  318.         outtype=SPECTRUM;
  319.     }
  320.     if((strcmp(p,".PRG")==0) || (strcmp(p,".prg")==0)) 
  321.     {
  322.         tostring="to .PRG";
  323.         outtype=PRG;
  324.     }
  325.  
  326.     if(intype==UNKNOWN)
  327.     {
  328.         fprintf(stderr,"Unknown input file format. Must be a valid .SNA, .SP, .Z80 or .PRG file,\r");
  329.         fprintf(stderr,"or a Raw file\n");
  330.         return 3;
  331.     }
  332.  
  333.     if(outtype==UNKNOWN)
  334.     {
  335.         fprintf(stderr,"Unknown output file format. Must be a .SNA, .SP or .Z80 or .PRG file\n");
  336.         return 4;
  337.     }
  338.  
  339.     /* 
  340.        if argv[2] only contains the suffix then use the prefix of
  341.        argv[1];
  342.      */
  343.     if(argv[2][0]=='.')
  344.     {
  345.         outfile=malloc(strlen(argv[1])+strlen(argv[2])+1);
  346.         strcpy(outfile,argv[1]); /* copy prefix    */
  347.  
  348.         p=strrchr(outfile,'.');
  349.         if(p!=NULL) *p='\0'; /* put end of st