home *** CD-ROM | disk | FTP | other *** search
/ MACD 4 / MACD4.iso / Emulatory / SPConv / Src / SPCONV.H < prev   
Encoding:
C/C++ Source or Header  |  1978-03-06  |  13.1 KB  |  463 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, signed int * type);
  49. signed int DIRC_direct_convert(signed 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. void RSNX_read_snx(char * s);
  79. void WSNX_write_snx(char * s);
  80.  
  81. /* Conversion routines */
  82. void VGSN_vgaspec_to_sna(void);
  83. void RASN_raw_to_sna(void);
  84. void Z8SN_z80_to_sna(void);
  85. void PRSN_prg_to_sna(void);
  86. void ACSN_ach_to_sna(void);
  87. void KGSN_kgb_to_sna(void);
  88. void SXSN_snx_to_sna(void);
  89.  
  90. void SNVG_sna_to_vgaspec(void);
  91. void SNZ8_sna_to_z80(void);
  92. void SNPR_sna_to_prg(char * n);
  93. void SNAC_sna_to_ach(void);
  94. void SNKG_sna_to_kgb(void);
  95. void SNSX_sna_to_snx(void);
  96.  
  97. /* 16K page read function for Z80 format */
  98. signed int RDPG_z80_read_page(char * s, FILE * fd);
  99.  
  100. /* Compression/Decompression for Z80 */
  101. void Z80D_z80_decompress(FILE * fd, unsigned int start, unsigned int length);
  102. signed int  Z80C_z80_compress(void);
  103.  
  104. /* Compression/Decompression for SNX */
  105. void SNXD_snx_decompress(FILE * fd, unsigned int start, unsigned int length);
  106. signed int SNXC_snx_compress(void);
  107.  
  108. /* File header for file from RS232 Link - used for RAW conversion */
  109. union header_u {
  110.     signed char in[9];
  111.     struct {
  112.         signed char type;
  113.         unsigned int  length;
  114.         unsigned int  start;
  115.         signed char var;
  116.         signed char res1;
  117.         signed int  line;
  118.     } header;
  119. } h;
  120. #define hdr_size 9        /* sizeof(h)=9 */
  121.  
  122. /* The contents of the header for a RAW file */
  123. char expect[]={
  124.     0x03,        /* type CODE */
  125.     0x00,0xc0,    /* image size */
  126.     0x00,0x40,    /* image start */
  127.     0xff,        /* var */
  128.     0xff,        /* res1 */
  129.     0xff,0xff    /* line */
  130. };
  131.  
  132. /* Register storage structures for the various types */
  133.  
  134. struct snx_s {
  135.     char signature[4];
  136.     unsigned char headerlenhi,headerlenlo;
  137.     unsigned char i;
  138.     unsigned char lax;
  139.     unsigned char hax;
  140.     unsigned char eax;
  141.     unsigned char dax;
  142.     unsigned char cax;
  143.     unsigned char bax;
  144.     unsigned char fax;
  145.     unsigned char aax;
  146.     unsigned char l;
  147.     unsigned char h;
  148.     unsigned char e;
  149.     unsigned char d;
  150.     unsigned char c;
  151.     unsigned char b;
  152.     unsigned char iyl;
  153.     unsigned char iyh;
  154.     unsigned char ixl;
  155.     unsigned char ixh;
  156.     unsigned char iff2;
  157.     unsigned char r;
  158.     unsigned char f;
  159.     unsigned char a;
  160.     unsigned char spl;
  161.     unsigned char sph;
  162.     unsigned char im;
  163.     unsigned char border;
  164.     unsigned char emulator_switches[10];
  165. };
  166. #define snx_size 43        /* sizeof(struct snx_s)=43 */
  167.  
  168. struct sna_s {
  169.     unsigned char i;
  170.     unsigned char lax;
  171.     unsigned char hax;
  172.     unsigned char eax;
  173.     unsigned char dax;
  174.     unsigned char cax;
  175.     unsigned char bax;
  176.     unsigned char fax;
  177.     unsigned char aax;
  178.     unsigned char l;
  179.     unsigned char h;
  180.     unsigned char e;
  181.     unsigned char d;
  182.     unsigned char c;
  183.     unsigned char b;
  184.     unsigned char iyl;
  185.     unsigned char iyh;
  186.     unsigned char ixl;
  187.     unsigned char ixh;
  188.     unsigned char iff2;
  189.     unsigned char r;
  190.     unsigned char f;
  191.     unsigned char a;
  192.     unsigned char spl;
  193.     unsigned char sph;
  194.     unsigned char im;
  195.     unsigned char border;
  196. };
  197. #define sna_size 27        /* sizeof(struct sna_s)=27 */
  198.  
  199. struct vga_s {
  200. /*00*/    unsigned char S;
  201. /*01*/    unsigned char P;
  202. /*02*/    unsigned char len_l;
  203. /*03*/    unsigned char len_h;
  204. /*04*/    unsigned char start_l;
  205. /*05*/    unsigned char start_h;
  206. /*06*/    unsigned char c;
  207. /*07*/    unsigned char b;
  208. /*08*/    unsigned char e;
  209. /*09*/    unsigned char d;
  210. /*0A*/    unsigned char l;
  211. /*0B*/    unsigned char h;
  212. /*0C*/    unsigned char f;
  213. /*0D*/    unsigned char a;
  214. /*0E*/    unsigned char ixl;
  215. /*0F*/    unsigned char ixh;
  216. /*10*/    unsigned char iyl;
  217. /*11*/    unsigned char iyh;
  218. /*12*/    unsigned char cax;
  219. /*13*/    unsigned char bax;
  220. /*14*/    unsigned char eax;
  221. /*15*/    unsigned char dax;
  222. /*16*/    unsigned char lax;
  223. /*17*/    unsigned char hax;
  224. /*18*/    unsigned char fax;
  225. /*19*/    unsigned char aax;
  226. /*1A*/    unsigned char r;
  227. /*1B*/    unsigned char i;
  228. /*1C*/    unsigned char spl;
  229. /*1D*/    unsigned char sph;
  230. /*1E*/    unsigned char pcl;
  231. /*1F*/    unsigned char pch;
  232. /*20*/    unsigned char res2;
  233. /*21*/    unsigned char res3;
  234. /*22*/    unsigned char border;
  235. /*23*/    unsigned char res4;
  236. /*24*/    unsigned char im;
  237. /*25*/    unsigned char res5;
  238. };
  239. #define vga_size 38        /* sizeof(struct vga_s)=38 */
  240.  
  241. struct z80_s {
  242. /*00*/    unsigned char a;
  243. /*01*/    unsigned char f;
  244. /*02*/    unsigned char c;
  245. /*03*/    unsigned char b;
  246. /*04*/    unsigned char l;
  247. /*05*/    unsigned char h;
  248. /*06*/    unsigned char pcl;
  249. /*07*/    unsigned char pch;
  250. /*08*/    unsigned char spl;
  251. /*09*/    unsigned char sph;
  252. /*0A*/    unsigned char i;
  253. /*0B*/    unsigned char r;
  254. /*0C*/    unsigned char data;
  255. /*0D*/    unsigned char e;
  256. /*0E*/    unsigned char d;
  257. /*0F*/    unsigned char cax;
  258. /*10*/    unsigned char bax;
  259. /*11*/    unsigned char eax;
  260. /*12*/    unsigned char dax;
  261. /*13*/    unsigned char lax;
  262. /*14*/    unsigned char hax;
  263. /*15*/    unsigned char aax;
  264. /*16*/    unsigned char fax;
  265. /*17*/    unsigned char iyl;
  266. /*18*/    unsigned char iyh;
  267. /*19*/    unsigned char ixl;
  268. /*1A*/    unsigned char ixh;
  269. /*1B*/    unsigned char iff1;
  270. /*1C*/    unsigned char iff2;
  271. /*1D*/    unsigned char im;
  272. /* Extended 2.01 and 3.0 header, flagged with PC=0 */
  273. /*1E*/    unsigned char h2_len_l;
  274. /*1F*/    unsigned char h2_len_h;
  275. /*20*/  unsigned char n_pcl;
  276. /*21*/  unsigned char n_pch;
  277. /*22*/  unsigned char hardware;
  278. /*23*/  unsigned char samram;
  279. /*24*/  unsigned char if1_paged;
  280. /*25*/  unsigned char r_ldir_emu;
  281. /*26*/  unsigned char last_out;
  282. /*27*/  unsigned char sound_reg[16];
  283. /* Continues with extended 3.0 header, but this part is not used anyway */
  284. };
  285. #define z80_145_size 0x1e    /* length of z80 V1.45 header */
  286. #define z80_201_ext_size 23    /* length of extended z80 V2.01 header */
  287. #define z80_300_ext_size 54    /* length of extended z80 V3.0  header */
  288.  
  289. struct z80_page_s {
  290. /*00*/    unsigned char blklen_l;
  291. /*01*/    unsigned char blklen_h;
  292. /*02*/    unsigned char page_num;
  293. };
  294. #define z80_pg_size 3        /* sizeof(struct z80_page_s)=3 */
  295.  
  296. struct prg_s {
  297. /*00*/    signed char name[10];
  298. /*0A*/    signed char nullbyte;
  299. /*0B*/    unsigned char c_0x61;
  300. /*0C*/    unsigned char c_0x35;
  301. /*0D*/    unsigned char c_0x03;
  302. /*0E*/  unsigned char c_0x00[0xdc - 0x0e];
  303. /*DC*/    unsigned char iyl;
  304. /*DD*/    unsigned char iyh;
  305. /*DE*/    unsigned char ixl;
  306. /*DF*/    unsigned char ixh;
  307. /*E0*/    unsigned char eax;
  308. /*E1*/    unsigned char dax;
  309. /*E2*/    unsigned char cax;
  310. /*E3*/    unsigned char bax;
  311. /*E4*/    unsigned char lax;
  312. /*E5*/    unsigned char hax;
  313. /*E6*/    unsigned char fax;
  314. /*E7*/    unsigned char aax;
  315. /*E8*/    unsigned char e;
  316. /*E9*/    unsigned char d;
  317. /*EA*/    unsigned char c;
  318. /*EB*/    unsigned char b;
  319. /*EC*/    unsigned char l;
  320. /*ED*/    unsigned char h;
  321. /*EE*/    unsigned char iff2;
  322. /*EF*/    unsigned char i;
  323. /*F0*/    unsigned char spl;
  324. /*F1*/    unsigned char sph;
  325. /*F2*/    unsigned char filler[0x0e];
  326. };
  327. #define prg_size 256        /* sizeof(struct prg_s)=256 */
  328.  
  329. struct ach_s {
  330. /*00*/    unsigned char a;
  331. /*01*/    unsigned char fill1[3];
  332. /*04*/    unsigned char f;
  333. /*05*/    unsigned char fill2[3];
  334. /*08*/    unsigned char b;
  335. /*09*/    unsigned char fill3[3];
  336. /*0C*/    unsigned char c;
  337. /*0D*/  unsigned char fill4[3];
  338. /*10*/    unsigned char d;
  339. /*11*/    unsigned char fill5[3];
  340. /*14*/    unsigned char e;
  341. /*15*/    unsigned char fill6[3];
  342. /*18*/    unsigned char h;
  343. /*19*/    unsigned char fill7[3];
  344. /*1C*/    unsigned char l;
  345. /*1D*/    unsigned char fill8[3];
  346. /*20*/    unsigned char pcl;
  347. /*21*/    unsigned char pch;
  348. /*22*/    unsigned char fill9[2];
  349. /*24*/  unsigned char fill10[4];
  350. /*28*/  unsigned char spl;
  351. /*29*/  unsigned char sph;
  352. /*2A*/    unsigned char fill11[0x94 - 0x2A];
  353. /*94*/    unsigned char r;
  354. /*95*/    unsigned char fill12[0x9C - 0x95];
  355. /*9C*/    unsigned char border;
  356. /*9D*/    unsigned char fill13[0xa4 - 0x9D];
  357. /*A4*/  unsigned char im;
  358. /*A5*/    unsigned char fill14[0xbe - 0xa5];
  359. /*BE*/  unsigned char i;
  360. /*BF*/  unsigned char iff2;
  361. /*C0*/    unsigned char fill15[0xec - 0xc0];
  362. /*EC*/    unsigned char aax;
  363. /*ED*/    unsigned char fax;
  364. /*EE*/    unsigned char fill16[2];
  365. /*F0*/    unsigned char bax;
  366. /*F1*/    unsigned char cax;
  367. /*F2*/    unsigned char fill17[2];
  368. /*F4*/    unsigned char dax;
  369. /*F5*/    unsigned char eax;
  370. /*F6*/    unsigned char hax;
  371. /*F7*/    unsigned char lax;
  372. /*F8*/  unsigned char ixl;
  373. /*F9*/  unsigned char ixh;
  374. /*FA*/  unsigned char fill18[2];
  375. /*FC*/  unsigned char iyl;
  376. /*FD*/  unsigned char iyh;
  377. /*FE*/    unsigned char fill19[2];
  378. };
  379. #define ach_size 256        /* sizeof(struct ach_s)=256 */
  380.  
  381. struct kgb_s {
  382. /*00*/    unsigned char unused_1[0x84 - 0x00];
  383. /*84*/    unsigned char settings[0x8E - 0x84];
  384. /*8E*/    unsigned char interruptstatus;
  385. /*8F*/    unsigned char is0_1;
  386. /*90*/    unsigned char is3_1;
  387. /*91*/    unsigned char colourmode;
  388. /*92*/    unsigned char is0_2;
  389. /*93*/    unsigned char is0_3;
  390. /*94*/    unsigned char is0_4;
  391. /*95*/    unsigned char is0_5;
  392. /*96*/  unsigned char b;
  393. /*97*/  unsigned char c;
  394. /*98*/  unsigned char bax;
  395. /*99*/  unsigned char cax;
  396. /*9A*/  unsigned char d;
  397. /*9B*/  unsigned char e;
  398. /*9C*/  unsigned char dax;
  399. /*9D*/  unsigned char eax;
  400. /*9E*/  unsigned char h;
  401. /*9F*/  unsigned char l;
  402. /*A0*/  unsigned char hax;
  403. /*A1*/  unsigned char lax;
  404. /*A2*/  unsigned char ixh;
  405. /*A3*/  unsigned char ixl;
  406. /*A4*/  unsigned char iyh;
  407. /*A5*/  unsigned char iyl;
  408. /*A6*/  unsigned char i;
  409. /*A7*/  unsigned char r;
  410. /*A8*/  unsigned char is0_6;
  411. /*A9*/    unsigned char is0_7;
  412. /*AA*/  unsigned char is0_8;
  413. /*AB*/  unsigned char aax;
  414. /*AC*/  unsigned char is0_9;
  415. /*AD*/  unsigned char a;
  416. /*AE*/  unsigned char is0_10;
  417. /*AF*/  unsigned char fax;
  418. /*B0*/  unsigned char is0_11;
  419. /*B1*/  unsigned char f;
  420. /*B2*/  unsigned char is0_12;
  421. /*B3*/  unsigned char is0_13;
  422. /*B4*/  unsigned char pch;
  423. /*B5*/  unsigned char pcl;
  424. /*B2*/  unsigned char is0_14;
  425. /*B3*/  unsigned char is0_15;
  426. /*B8*/  unsigned char sph;
  427. /*B9*/  unsigned char spl;
  428. /*BA*/  unsigned char is0_16;
  429. /*BB*/  unsigned char soundmode;
  430. /*BC*/  unsigned char is0_17;
  431. /*BD*/  unsigned char haltmode;
  432. /*BE*/  unsigned char i_mode_h;
  433. /*BF*/  unsigned char i_mode_l;
  434. /*C0*/    unsigned char unused_2[0xCA - 0xC0];
  435. };
  436. #define kgb_size 202        /* sizeof(struct kgb_s)=202 */
  437.  
  438. /* Constants */
  439. #define IMSIZE 49152L
  440.  
  441. /* Constants for Z80 Compression/Decompression */
  442. #define NOTCOMPRESSED    0
  443. #define COMPRESSED    0x20
  444. #define NO        0
  445. #define YES        1
  446.  
  447. /* Constants for SNX Compression/Decompression */
  448. #define SNX_COMPRESSED        0xFF
  449. #define SNX_UNCOMPRESSED    0
  450.  
  451. /* Contstants for the implemented formats in this version */
  452. #define    RAW        1
  453. #define SNA        2
  454. #define    SP        3
  455. #define    Z80        4
  456. #define    PRG        5
  457. #define    ACH        6
  458. #define KGB        7
  459. #define SNX        8
  460. #define    UNKNOWN        9
  461.  
  462. #endif /* SPCONV_H */
  463.