home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / emulate / progs / spconv / !Spconv_UnixSource_h_spconv < prev    next >
Encoding:
Text File  |  1994-04-02  |  11.7 KB  |  412 lines

  1. #ifndef SPCONV_H
  2. #define SPCONV_H
  3.  
  4. /*
  5.  * Exit-codes used by the program:
  6.  *
  7.  * EXIT_OK:          The program finished without problems:
  8.  *
  9.  * EXIT_USAGE:       The program was called incorrectly:
  10.  *                   - Wrong number of parameters
  11.  *                   - Wildcards on the command-line
  12.  *                   - Input and output are of the same type
  13.  *                     (not for .SP and .Z80)
  14.  *
  15.  * EXIT_READ_ERROR:  There was a problem while reading the input file:
  16.  *                   - Error while reading the input file
  17.  *                   - Error while fseeking the input file
  18.  *
  19.  * EXIT_WRITE_ERROR: There was a problem while creating the output file:
  20.  *                   - Error while writing the output file
  21.  *                   - Error with opening/reading the spectrum.rom needed
  22.  *                     for the output file.
  23.  *
  24.  * EXIT_FILE_ERROR:  There was a problem with the input or output file format:
  25.  *                   - Input file does not exist
  26.  *                   - Type of input or output file not known
  27.  *                   - Input file is:
  28.  *                     - A newer version of an existing type
  29.  *                     - Corrupt
  30.  *                     - Not in the expected format (RAW and new .SP types)
  31.  *                     - Not a 48K spectrum file (in .Z80 files)
  32.  *                   - Input file snapshot was taken while the interface-1 was
  33.  *                     paged in (in .Z80 files). The other file formats can not
  34.  *                     cope with this (including the version 1.45 .Z80 files).
  35.  *                   - Undocumented page number in .Z80 files (file corrupt)
  36.  *                   - Decompression of .Z80 file failed (file corrupt)
  37.  */
  38.  
  39. #define EXIT_OK           0 /* No error */
  40. #define EXIT_USAGE       1 /* Problem with the command-line call */
  41. #define EXIT_READ_ERROR       2 /* Error while reading the input file */
  42. #define EXIT_WRITE_ERROR   3 /* Error while writing the output file */
  43. #define EXIT_FILE_ERROR       4 /* Problem with the type of the input file */
  44.  
  45. /* Function Prototypes */
  46.  
  47. /* SPECIAL FUNCTIONS */
  48. const char * DTYP_determine_type(char * filename, int * type);
  49. int DIRC_direct_convert(int type, char * infile, char * outfile);
  50.  
  51. /* ERROR HANDLING FUNCTIONS */
  52. void USAG_usage(void);
  53. void RERR_read_error(char * s, FILE * fd);
  54. void WERR_write_error(char * s, FILE * fd);
  55.  
  56. /* I/O routines */
  57. void RGEN_read_generic(char * s, void * header, size_t h_size);
  58. void WGEN_write_generic(char * s, void * header, size_t h_size);
  59. void RERR_read_error(char * s, FILE * fd);
  60. void WERR_write_error(char * s, FILE * fd);
  61.  
  62. void RSNA_read_sna(char * s);
  63. void WSNA_write_sna(char * s);
  64. void RVGH_read_vgaspec_header(char * s);
  65. void RVGA_read_vgaspec(char * s);
  66. void WVGA_write_vgaspec(char * s);
  67. void ROVG_read_old_vgaspec(char * s);
  68. void WOVG_write_old_vgaspec(char * s);
  69. void RRAW_read_raw(char * s);
  70. void RZ80_read_z80(char * s);
  71. void WZ80_write_z80(char * s);
  72. void RPRG_read_prg(char * s);
  73. void WPRG_write_prg(char * s);
  74. void RACH_read_ach(char * s);
  75. void WACH_write_ach(char * s);
  76. void RKGB_read_kgb(char * s);
  77. void WKGB_write_kgb(char * s);
  78.  
  79. /* Conversion routines */
  80. void VGSN_vgaspec_to_sna(void);
  81. void RASN_raw_to_sna(void);
  82. void Z8SN_z80_to_sna(void);
  83. void PRSN_prg_to_sna(void);
  84. void ACSN_ach_to_sna(void);
  85. void KGSN_kgb_to_sna(void);
  86.  
  87. void SNVG_sna_to_vgaspec(void);
  88. void SNZ8_sna_to_z80(void);
  89. void SNPR_sna_to_prg(char * n);
  90. void SNAC_sna_to_ach(void);
  91. void SNKG_sna_to_kgb(void);
  92.  
  93. /* 16K page read function for Z80 format */
  94. int RDPG_z80_read_page(char * s, FILE * fd);
  95.  
  96. /* Compression/Decompression for Z80 */
  97. void Z80D_z80_decompress(FILE * fd, unsigned int start, unsigned int length);
  98. int  Z80C_z80_compress(void);
  99.  
  100. /* File header for file from RS232 Link - used for RAW conversion */
  101. union header_u {
  102.     char in[9];
  103.     struct {
  104.         char type;
  105.         unsigned int  length;
  106.         unsigned int  start;
  107.         char var;
  108.         char res1;
  109.         int  line;
  110.     } header;
  111. } h;
  112. #define hdr_size 9        /* sizeof(h)=9 */
  113.  
  114. /* The contents of the header for a RAW file */
  115. char expect[]={
  116.     0x03,        /* type CODE */
  117.     0x00,0xc0,    /* image size */
  118.     0x00,0x40,    /* image start */
  119.     0xff,        /* var */
  120.     0xff,        /* res1 */
  121.     0xff,0xff    /* line */
  122. };    
  123.  
  124. /* Register storage structures for the various types */
  125. struct sna_s {
  126.     unsigned char i;
  127.     unsigned char lax;
  128.     unsigned char hax;
  129.     unsigned char eax;
  130.     unsigned char dax;
  131.     unsigned char cax;
  132.     unsigned char bax;
  133.     unsigned char fax;
  134.     unsigned char aax;
  135.     unsigned char l;
  136.     unsigned char h;
  137.     unsigned char e;
  138.     unsigned char d;
  139.     unsigned char c;
  140.     unsigned char b;
  141.     unsigned char iyl;
  142.     unsigned char iyh;
  143.     unsigned char ixl;
  144.     unsigned char ixh;
  145.     unsigned char iff2;
  146.     unsigned char r;
  147.     unsigned char f;
  148.     unsigned char a;
  149.     unsigned char spl;
  150.     unsigned char sph;
  151.     unsigned char im;
  152.     unsigned char border;
  153. };
  154. #define sna_size 27        /* sizeof(struct sna_s)=27 */
  155.  
  156. struct vga_s {
  157. /*00*/    unsigned char S;
  158. /*01*/    unsigned char P;
  159. /*02*/    unsigned char len_l;
  160. /*03*/    unsigned char len_h;
  161. /*04*/    unsigned char start_l;
  162. /*05*/    unsigned char start_h;
  163. /*06*/    unsigned char c;
  164. /*07*/    unsigned char b;
  165. /*08*/    unsigned char e;
  166. /*09*/    unsigned char d;
  167. /*0A*/    unsigned char l;
  168. /*0B*/    unsigned char h;
  169. /*0C*/    unsigned char f;
  170. /*0D*/    unsigned char a;
  171. /*0E*/    unsigned char ixl;
  172. /*0F*/    unsigned char ixh;
  173. /*10*/    unsigned char iyl;
  174. /*11*/    unsigned char iyh;
  175. /*12*/    unsigned char cax;
  176. /*13*/    unsigned char bax;
  177. /*14*/    unsigned char eax;
  178. /*15*/    unsigned char dax;
  179. /*16*/    unsigned char lax;
  180. /*17*/    unsigned char hax;
  181. /*18*/    unsigned char fax;
  182. /*19*/    unsigned char aax;
  183. /*1A*/    unsigned char r;
  184. /*1B*/    unsigned char i;
  185. /*1C*/    unsigned char spl;
  186. /*1D*/    unsigned char sph;
  187. /*1E*/    unsigned char pcl;
  188. /*1F*/    unsigned char pch;
  189. /*20*/    unsigned char res2;
  190. /*21*/    unsigned char res3;
  191. /*22*/    unsigned char border;
  192. /*23*/    unsigned char res4;
  193. /*24*/    unsigned char im;
  194. /*25*/    unsigned char res5;
  195. };
  196. #define vga_size 38        /* sizeof(struct vga_s)=38 */
  197.  
  198. struct z80_s {
  199. /*00*/    unsigned char a;
  200. /*01*/    unsigned char f;
  201. /*02*/    unsigned char c;
  202. /*03*/    unsigned char b;
  203. /*04*/    unsigned char l;
  204. /*05*/    unsigned char h;
  205. /*06*/    unsigned char pcl;
  206. /*07*/    unsigned char pch;
  207. /*08*/    unsigned char spl;
  208. /*09*/    unsigned char sph;
  209. /*0A*/    unsigned char i;
  210. /*0B*/    unsigned char r;
  211. /*0C*/    unsigned char data;
  212. /*0D*/    unsigned char e;
  213. /*0E*/    unsigned char d;
  214. /*0F*/    unsigned char cax;
  215. /*10*/    unsigned char bax;
  216. /*11*/    unsigned char eax;
  217. /*12*/    unsigned char dax;
  218. /*13*/    unsigned char lax;
  219. /*14*/    unsigned char hax;
  220. /*15*/    unsigned char aax;
  221. /*16*/    unsigned char fax;
  222. /*17*/    unsigned char iyl;
  223. /*18*/    unsigned char iyh;
  224. /*19*/    unsigned char ixl;
  225. /*1A*/    unsigned char ixh;
  226. /*1B*/    unsigned char iff1;
  227. /*1C*/    unsigned char iff2;
  228. /*1D*/    unsigned char im;
  229. /* Extended 2.01 header, flagged with PC=0 */
  230. /*1E*/    unsigned char h2_len_l;
  231. /*1F*/    unsigned char h2_len_h;
  232. /*20*/  unsigned char n_pcl;
  233. /*21*/  unsigned char n_pch;
  234. /*22*/  unsigned char hardware;
  235. /*23*/  unsigned char samram;
  236. /*24*/  unsigned char if1_paged;
  237. /*25*/  unsigned char r_ldir_emu;
  238. /*26*/  unsigned char last_out;
  239. /*27*/  unsigned char sound_reg[16];
  240. };
  241. #define z80_145_size 0x1e    /* length of z80_145 header */
  242.  
  243. struct z80_page_s {
  244. /*00*/    unsigned char blklen_l;
  245. /*01*/    unsigned char blklen_h;
  246. /*02*/    unsigned char page_num;
  247. };
  248. #define z80_pg_size 3        /* sizeof(struct z80_page_s)=3 */
  249.  
  250. struct prg_s {
  251. /*00*/    char name[10];
  252. /*0A*/    char nullbyte;
  253. /*0B*/    unsigned char c_0x61;
  254. /*0C*/    unsigned char c_0x35;
  255. /*0D*/    unsigned char c_0x03;
  256. /*0E*/  unsigned char c_0x00[0xdc - 0x0e];
  257. /*DC*/    unsigned char iyl;
  258. /*DD*/    unsigned char iyh;
  259. /*DE*/    unsigned char ixl;
  260. /*DF*/    unsigned char ixh;
  261. /*E0*/    unsigned char eax;
  262. /*E1*/    unsigned char dax;
  263. /*E2*/    unsigned char cax;
  264. /*E3*/    unsigned char bax;
  265. /*E4*/    unsigned char lax;
  266. /*E5*/    unsigned char hax;
  267. /*E6*/    unsigned char fax;
  268. /*E7*/    unsigned char aax;
  269. /*E8*/    unsigned char e;
  270. /*E9*/    unsigned char d;
  271. /*EA*/    unsigned char c;
  272. /*EB*/    unsigned char b;
  273. /*EC*/    unsigned char l;
  274. /*ED*/    unsigned char h;
  275. /*EE*/    unsigned char iff2;
  276. /*EF*/    unsigned char i;
  277. /*F0*/    unsigned char spl;
  278. /*F1*/    unsigned char sph;
  279. /*F2*/    unsigned char filler[0x0e];
  280. };
  281. #define prg_size 256        /* sizeof(struct prg_s)=256 */
  282.  
  283. struct ach_s {
  284. /*00*/    unsigned char a;
  285. /*01*/    unsigned char fill1[3];
  286. /*04*/    unsigned char f;
  287. /*05*/    unsigned char fill2[3];
  288. /*08*/    unsigned char b;
  289. /*09*/    unsigned char fill3[3];
  290. /*0C*/    unsigned char c;
  291. /*0D*/  unsigned char fill4[3];
  292. /*10*/    unsigned char d;
  293. /*11*/    unsigned char fill5[3];
  294. /*14*/    unsigned char e;
  295. /*15*/    unsigned char fill6[3];
  296. /*18*/    unsigned char h;
  297. /*19*/    unsigned char fill7[3];
  298. /*1C*/    unsigned char l;
  299. /*1D*/    unsigned char fill8[3];
  300. /*20*/    unsigned char pcl;
  301. /*21*/    unsigned char pch;
  302. /*22*/    unsigned char fill9[2];
  303. /*24*/  unsigned char fill10[4];
  304. /*28*/  unsigned char spl;
  305. /*29*/  unsigned char sph;
  306. /*2A*/    unsigned char fill11[0x94 - 0x2A];
  307. /*94*/    unsigned char r;
  308. /*95*/    unsigned char fill12[0x9C - 0x95];
  309. /*9C*/    unsigned char border;
  310. /*9D*/    unsigned char fill13[0xa4 - 0x9D];
  311. /*A4*/  unsigned char im;
  312. /*A5*/    unsigned char fill14[0xbe - 0xa5];
  313. /*BE*/  unsigned char i;
  314. /*BF*/  unsigned char iff2;
  315. /*C0*/    unsigned char fill15[0xec - 0xc0];
  316. /*EC*/    unsigned char aax;
  317. /*ED*/    unsigned char fax;
  318. /*EE*/    unsigned char fill16[2];
  319. /*F0*/    unsigned char bax;
  320. /*F1*/    unsigned char cax;
  321. /*F2*/    unsigned char fill17[2];
  322. /*F4*/    unsigned char dax;
  323. /*F5*/    unsigned char eax;
  324. /*F6*/    unsigned char hax;
  325. /*F7*/    unsigned char lax;
  326. /*F8*/  unsigned char ixl;
  327. /*F9*/  unsigned char ixh;
  328. /*FA*/  unsigned char fill18[2];
  329. /*FC*/  unsigned char iyl;
  330. /*FD*/  unsigned char iyh;
  331. /*FE*/    unsigned char fill19[2];
  332. };
  333. #define ach_size 256        /* sizeof(struct ach_s)=256 */
  334.  
  335. struct kgb_s {
  336. /*00*/    unsigned char unused_1[0x84 - 0x00];
  337. /*84*/    unsigned char settings[0x8E - 0x84];
  338. /*8E*/    unsigned char interruptstatus;
  339. /*8F*/    unsigned char is0_1;
  340. /*90*/    unsigned char is3_1;
  341. /*91*/    unsigned char colourmode;
  342. /*92*/    unsigned char is0_2;
  343. /*93*/    unsigned char is0_3;
  344. /*94*/    unsigned char is0_4;
  345. /*95*/    unsigned char is0_5;
  346. /*96*/  unsigned char b;
  347. /*97*/  unsigned char c;
  348. /*98*/  unsigned char bax;
  349. /*99*/  unsigned char cax;
  350. /*9A*/  unsigned char d;
  351. /*9B*/  unsigned char e;
  352. /*9C*/  unsigned char dax;
  353. /*9D*/  unsigned char eax;
  354. /*9E*/  unsigned char h;
  355. /*9F*/  unsigned char l;
  356. /*A0*/  unsigned char hax;
  357. /*A1*/  unsigned char lax;
  358. /*A2*/  unsigned char ixh;
  359. /*A3*/  unsigned char ixl;
  360. /*A4*/  unsigned char iyh;
  361. /*A5*/  unsigned char iyl;
  362. /*A6*/  unsigned char i;
  363. /*A7*/  unsigned char r;
  364. /*A8*/  unsigned char is0_6;
  365. /*A9*/    unsigned char is0_7;
  366. /*AA*/  unsigned char is0_8;
  367. /*AB*/  unsigned char aax;
  368. /*AC*/  unsigned char is0_9;
  369. /*AD*/  unsigned char a;
  370. /*AE*/  unsigned char is0_10;
  371. /*AF*/  unsigned char fax;
  372. /*B0*/  unsigned char is0_11;
  373. /*B1*/  unsigned char f;
  374. /*B2*/  unsigned char is0_12;
  375. /*B3*/  unsigned char is0_13;
  376. /*B4*/  unsigned char pch;
  377. /*B5*/  unsigned char pcl;
  378. /*B2*/  unsigned char is0_14;
  379. /*B3*/  unsigned char is0_15;
  380. /*B8*/  unsigned char sph;
  381. /*B9*/  unsigned char spl;
  382. /*BA*/  unsigned char is0_16;
  383. /*BB*/  unsigned char soundmode;
  384. /*BC*/  unsigned char is0_17;
  385. /*BD*/  unsigned char haltmode;
  386. /*BE*/  unsigned char i_mode_h;
  387. /*BF*/  unsigned char i_mode_l;
  388. /*C0*/    unsigned char unused_2[0xCA - 0xC0];
  389. };
  390. #define kgb_size 202        /* sizeof(struct kgb_s)=202 */
  391.  
  392. /* Constants */
  393. #define IMSIZE 49152L
  394.  
  395. /* Constants for Z80 Compression/Decompression */
  396. #define NOTCOMPRESSED    0
  397. #define COMPRESSED    0x20
  398. #define NO        0
  399. #define YES        1
  400.  
  401. /* Contstants for the implemented formats in this version */
  402. #define    RAW        1
  403. #define SNA        2
  404. #define    SP        3
  405. #define    Z80        4
  406. #define    PRG        5
  407. #define    ACH        6
  408. #define KGB        7
  409. #define    UNKNOWN        8
  410.  
  411. #endif /* SPCONV_H */
  412.