1
0
mirror of synced 2026-01-12 00:42:51 +00:00
2022-12-20 19:11:05 -08:00

159 lines
4.5 KiB
C

/* mt2tap - convert siggy format .mt file to simh .tap */
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define FLPSIZ 65536*2
int main (int argc, char *argv[])
{
int k, fc, wc, rc;
int pwc;
char pad = 0;
int bin,bout,errorflag = 0;
unsigned char bc[4] = { 0 };
unsigned char tapemark[4] = {0};
unsigned char buf[FLPSIZ];
char *progname = argv[0];
char *ppos, oname[256];
FILE *ifile, *ofile;
if (argc < 2) {
fprintf (stderr, "Usage: %s file \n", progname);
fprintf (stderr, "This will create a simh tap file named file.tap from a Keith Calkins CPV PO image file\n");
exit (0);
}
strcpy (oname, argv[1]);
if ((ppos = strrchr (oname, '.')))
strcpy (ppos, ".tap");
else
strcat (oname, ".tap");
ifile = fopen (argv[1], "rb");
if (ifile == NULL) {
printf ("Error opening file: %s\n", argv[1]);
exit (0);
}
ofile = fopen (oname, "wb");
if (ofile == NULL) {
printf ("Error opening file: %s\n", oname);
exit (0);
}
printf ("Processing file %s\n", argv[1]);
fc = 1; rc = 0;
bin = bout = 0;
// skip tape mark on input po tape
k = fread (bc, sizeof (bc), 1, ifile);
if (k != 1) {
printf("error reading bot mark\n");
exit (1);
}
bin += sizeof(bc);
for (;;) {
// leading record size, or tape mark
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
if (k != 1) {
printf("error reading next size\n");
exit (1);
}
wc = (bc[3]<<24) + (bc[2]<<16) + (bc[1]<<8) + bc[0];
if (wc <= 0) {
// just read trailing file size
// read next file size
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
if (k != 1) {
printf("error or EOT reading file size at tape mark \n");
// write tape mark on output
fwrite(tapemark,sizeof (char),4,ofile);
exit (1);
}
wc = (bc[3]<<24) + (bc[2]<<16) + (bc[1]<<8) + bc[0];
printf("file size %x %x\n",bin,wc);
// write tape mark on output
fwrite(tapemark,sizeof (char),4,ofile);
// read current record size
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
if (k != 1) {
printf("error reading current size at tape mark \n");
exit (1);
}
wc = (bc[3]<<24) + (bc[2]<<16) + (bc[1]<<8) + bc[0];
if (wc == 0) {
// zero length record, read trailing length (zero)
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
// read next file mark
//k = fread (bc, sizeof (bc), 1, ifile);
// read current record size
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
wc = (bc[3]<<24) + (bc[2]<<16) + (bc[1]<<8) + bc[0];
}
}
if (wc > 0x800)
printf("BIG %x\n",wc);
bout += wc;
fwrite(&wc,1,4,ofile); // write leading size
printf("WC %x %x\n",bin,wc);
pwc = wc;
if (wc) {
// copy the record
k = fread (buf, 1, wc, ifile);
bin += wc;
buf[wc] = 0; // pad just in case
fwrite (buf, sizeof (char), wc, ofile);
if (wc & 1)
fwrite (&pad,1,1,ofile); // force even size
// read trailing size
k = fread (bc, sizeof (bc), 1, ifile);
bin += sizeof(bc);
if (k != 1) {
printf("error reading trailing size\n");
exit (1);
}
wc = (bc[3]<<24) + (bc[2]<<16) + (bc[1]<<8) + bc[0];
if (wc != pwc)
printf("record size error %x %x\n",pwc,wc);
fwrite(&wc,1,4,ofile); // write trailing size
rc++;
}
else {
if (rc)
printf ("End of file %d, record count = %d\n", fc, rc);
else
printf ("End of tape\n");
fc++;
rc = 0;
exit (0);
}
}
fclose (ifile);
fclose (ofile);
return 0;
}