1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-23 00:43:28 +00:00

Add hercules-2.15

Hercules is an open source software implementation of the mainframe
System/370 and ESA/390 architectures, in addition to the new 64-bit
z/Architecture.

Submitted by:	Miguel Mendez <flynn@energyhq.homeip.net>
PR:		ports/34488
This commit is contained in:
Kris Kennaway 2002-05-25 11:02:21 +00:00
parent 8955e6894c
commit 31f6bc7f92
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=59974
9 changed files with 683 additions and 0 deletions

View File

@ -22,6 +22,7 @@
SUBDIR += gngb
SUBDIR += gnuboy
SUBDIR += gsnes9x
SUBDIR += hercules
SUBDIR += hfs
SUBDIR += hfsutils
SUBDIR += ia64sim

View File

@ -0,0 +1,40 @@
# New ports collection makefile for: dice
# Date created: Thu Jan 31 12:07:01 CET 2002
# Whom: Miguel Mendez <flynn@energyhq.homeip.net>
#
# $FreeBSD$
#
PORTNAME= hercules
PORTVERSION= 2.15
CATEGORIES= emulators
MASTER_SITES= http://www.conmicro.cx/hercules/
MAINTAINER= flynn@energyhq.homeip.net
GNU_CONFIGURE= yes
post-patch:
@${PERL} -pi -e 's@lpthread@pthread@g' ${WRKSRC}/configure
do-install:
@for i in hercules dasdinit dasdisup dasdload dasdls dasdpdsu \
tapecopy tapemap tapesplt cckd2ckd cckdcdsk ckd2cckd \
cckdcomp cckdswap hetget hetinit hetmap hetupd dmap2hrc; \
do \
${INSTALL_PROGRAM} ${WRKSRC}/$$i ${PREFIX}/bin; \
done
.if !defined(NOPORTDOCS)
@${MKDIR} ${PREFIX}/share/doc/hercules
@${RM} -f ${WRKSRC}/html/Makefile*
@for i in ${WRKSRC}/hercules.cnf ${WRKSRC}/html/* ; \
do \
${INSTALL_DATA} $$i ${PREFIX}/share/doc/hercules; \
done
.endif
@${CAT} pkg-message
.include <bsd.port.mk>

View File

@ -0,0 +1 @@
MD5 (hercules-2.15.tar.gz) = 8eb98b2b5663607fda075fc57f019172

View File

@ -0,0 +1,363 @@
--- tapecopy.c.orig Thu Nov 29 13:53:46 2001
+++ tapecopy.c Thu Jan 31 13:26:01 2002
@@ -8,357 +8,18 @@
/* prints a summary of the tape files and blocksizes. */
/*-------------------------------------------------------------------*/
-#include "hercules.h"
-
-/*-------------------------------------------------------------------*/
-/* Structure definition for AWSTAPE block header */
-/*-------------------------------------------------------------------*/
-typedef struct _AWSTAPE_BLKHDR {
- HWORD curblkl; /* Length of this block */
- HWORD prvblkl; /* Length of previous block */
- BYTE flags1; /* Flags byte 1 */
- BYTE flags2; /* Flags byte 2 */
- } AWSTAPE_BLKHDR;
-
-/* Definitions for AWSTAPE_BLKHDR flags byte 1 */
-#define AWSTAPE_FLAG1_NEWREC 0x80 /* Start of new record */
-#define AWSTAPE_FLAG1_TAPEMARK 0x40 /* Tape mark */
-#define AWSTAPE_FLAG1_ENDREC 0x20 /* End of record */
-
-/*-------------------------------------------------------------------*/
-/* Static data areas */
-/*-------------------------------------------------------------------*/
-static BYTE vollbl[] = "\xE5\xD6\xD3"; /* EBCDIC characters "VOL" */
-static BYTE hdrlbl[] = "\xC8\xC4\xD9"; /* EBCDIC characters "HDR" */
-static BYTE eoflbl[] = "\xC5\xD6\xC6"; /* EBCDIC characters "EOF" */
-static BYTE eovlbl[] = "\xC5\xD6\xE5"; /* EBCDIC characters "EOV" */
-static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO;
-static struct mt_tape_info densinfo[] = {
- {0x01, "NRZI (800 bpi)"},
- {0x02, "PE (1600 bpi)"},
- {0x03, "GCR (6250 bpi)"},
- {0x05, "QIC-45/60 (GCR, 8000 bpi)"},
- {0x06, "PE (3200 bpi)"},
- {0x07, "IMFM (6400 bpi)"},
- {0x08, "GCR (8000 bpi)"},
- {0x09, "GCR /37871 bpi)"},
- {0x0A, "MFM (6667 bpi)"},
- {0x0B, "PE (1600 bpi)"},
- {0x0C, "GCR (12960 bpi)"},
- {0x0D, "GCR (25380 bpi)"},
- {0x0F, "QIC-120 (GCR 10000 bpi)"},
- {0x10, "QIC-150/250 (GCR 10000 bpi)"},
- {0x11, "QIC-320/525 (GCR 16000 bpi)"},
- {0x12, "QIC-1350 (RLL 51667 bpi)"},
- {0x13, "DDS (61000 bpi)"},
- {0x14, "EXB-8200 (RLL 43245 bpi)"},
- {0x15, "EXB-8500 (RLL 45434 bpi)"},
- {0x16, "MFM 10000 bpi"},
- {0x17, "MFM 42500 bpi"},
- {0x24, "DDS-2"},
- {0x8C, "EXB-8505 compressed"},
- {0x90, "EXB-8205 compressed"},
- {0, NULL}};
-static BYTE buf[65500];
-
-/*-------------------------------------------------------------------*/
-/* ASCII to EBCDIC translate tables */
-/*-------------------------------------------------------------------*/
-#include "codeconv.h"
-
-/*-------------------------------------------------------------------*/
-/* Subroutine to print tape status */
-/*-------------------------------------------------------------------*/
-static void print_status (BYTE *devname, long stat)
-{
- printf ("%s status: %8.8lX", devname, stat);
- if (GMT_EOF(stat)) printf (" EOF");
- if (GMT_BOT(stat)) printf (" BOT");
- if (GMT_EOT(stat)) printf (" EOT");
- if (GMT_SM(stat)) printf (" SETMARK");
- if (GMT_EOD(stat)) printf (" EOD");
- if (GMT_WR_PROT(stat)) printf (" WRPROT");
- if (GMT_ONLINE(stat)) printf (" ONLINE");
- if (GMT_D_6250(stat)) printf (" 6250");
- if (GMT_D_1600(stat)) printf (" 1600");
- if (GMT_D_800(stat)) printf (" 800");
- if (GMT_DR_OPEN(stat)) printf (" NOTAPE");
- printf ("\n");
-
-} /* end function print_status */
-
-/*-------------------------------------------------------------------*/
-/* Subroutine to obtain and print tape status */
-/* Return value: 0=normal, 1=end of tape, -1=error */
-/*-------------------------------------------------------------------*/
-static int obtain_status (BYTE *devname, int devfd)
-{
-int rc; /* Return code */
-struct mtget stblk; /* Area for MTIOCGET ioctl */
-
- rc = ioctl (devfd, MTIOCGET, (char*)&stblk);
- if (rc < 0)
- {
- printf ("tapecopy: Error reading status of %s: %s\n",
- devname, strerror(errno));
- return -1;
- }
-
- print_status (devname, stblk.mt_gstat);
-
- if (GMT_EOD(stblk.mt_gstat)) return 1;
- if (GMT_EOT(stblk.mt_gstat)) return 1;
-
- return 0;
-} /* end function print_status */
/*-------------------------------------------------------------------*/
/* TAPECOPY main entry point */
/*-------------------------------------------------------------------*/
int main (int argc, char *argv[])
{
-int rc; /* Return code */
-int i; /* Array subscript */
-int len; /* Block length */
-int prevlen; /* Previous block length */
-BYTE *devname; /* -> Tape device name */
-BYTE *filename; /* -> Output file name */
-int devfd; /* Tape file descriptor */
-int outfd = -1; /* Output file descriptor */
-int fileno; /* Tape file number */
-int blkcount; /* Block count */
-int minblksz; /* Minimum block size */
-int maxblksz; /* Maximum block size */
-struct mtop opblk; /* Area for MTIOCTOP ioctl */
-struct mtget stblk; /* Area for MTIOCGET ioctl */
-long density; /* Tape density code */
-BYTE labelrec[81]; /* Standard label (ASCIIZ) */
-AWSTAPE_BLKHDR awshdr; /* AWSTAPE block header */
-
- /* Display the program identification message */
- display_version (stderr, "Hercules tape copy program ");
-
- /* The first argument is the tape device name */
- if (argc > 1 && argv[1] != NULL && strlen(argv[1]) > 5
- && memcmp (argv[1], "/dev/", 5) == 0)
- {
- devname = argv[1];
- }
- else
- {
- printf ("Usage: tapecopy /dev/st0 [outfile]\n");
- exit (1);
- }
-
- /* The second argument is the output file name */
- if (argc > 2 && argv[2] != NULL)
- filename = argv[2];
- else
- filename = NULL;
-
- /* Open the tape device */
- devfd = open (devname, O_RDONLY|O_BINARY);
- if (devfd < 0)
- {
- printf ("tapecopy: Error opening %s: %s\n",
- devname, strerror(errno));
- exit (3);
- }
- /* Obtain the tape status */
- rc = ioctl (devfd, MTIOCGET, (char*)&stblk);
- if (rc < 0)
- {
- printf ("tapecopy: Error reading status of %s: %s\n",
- devname, strerror(errno));
- exit (7);
- }
- /* Display tape status information */
- for (i = 0; tapeinfo[i].t_type != 0
- && tapeinfo[i].t_type != stblk.mt_type; i++);
-
- if (tapeinfo[i].t_name != NULL)
- printf ("%s device type: %s\n", devname, tapeinfo[i].t_name);
- else
- printf ("%s device type: 0x%lX\n", devname, stblk.mt_type);
-
- density = (stblk.mt_dsreg & MT_ST_DENSITY_MASK)
- >> MT_ST_DENSITY_SHIFT;
-
- for (i = 0; densinfo[i].t_type != 0
- && densinfo[i].t_type != density; i++);
-
- if (densinfo[i].t_name != NULL)
- printf ("%s tape density: %s\n", devname, densinfo[i].t_name);
- else
- printf ("%s tape density code: 0x%lX\n", devname, density);
-
- if (stblk.mt_gstat != 0)
- {
- print_status (devname, stblk.mt_gstat);
- }
-
- /* Set the tape device to process variable length blocks */
- opblk.mt_op = MTSETBLK;
- opblk.mt_count = 0;
- rc = ioctl (devfd, MTIOCTOP, (char*)&opblk);
- if (rc < 0)
- {
- printf ("tapecopy: Error setting attributes for %s: %s\n",
- devname, strerror(errno));
- exit (5);
- }
-
- /* Rewind the tape to the beginning */
- opblk.mt_op = MTREW;
- opblk.mt_count = 1;
- rc = ioctl (devfd, MTIOCTOP, (char*)&opblk);
- if (rc < 0)
- {
- printf ("tapecopy: Error rewinding %s: %s\n",
- devname, strerror(errno));
- exit (6);
- }
-
- /* Open the output file */
- if (filename != NULL)
- {
- outfd = open (filename, O_WRONLY | O_CREAT | O_BINARY,
- S_IRUSR | S_IWUSR | S_IRGRP);
- if (outfd < 0)
- {
- printf ("tapecopy: Error opening %s: %s\n",
- filename, strerror(errno));
- exit (4);
- }
- }
-
- /* Copy blocks from tape to the output file */
- fileno = 1;
- blkcount = 0;
- minblksz = 0;
- maxblksz = 0;
- len = 0;
-
- while (1)
- {
- /* Save previous block length */
- prevlen = len;
-
- /* Read a block from the tape */
- len = read (devfd, buf, sizeof(buf));
- if (len < 0)
- {
- printf ("tapecopy: Error reading %s: %s\n",
- devname, strerror(errno));
- obtain_status (devname, devfd);
- exit (8);
- }
-
- /* Check for tape mark */
- if (len == 0)
- {
- /* Print summary of current file */
- printf ("File %u: Blocks=%u, block size min=%u, max=%u\n",
- fileno, blkcount, minblksz, maxblksz);
-
- /* Write tape mark to output file */
- if (outfd >= 0)
- {
- /* Build block header for tape mark */
- awshdr.curblkl[0] = 0;
- awshdr.curblkl[1] = 0;
- awshdr.prvblkl[0] = prevlen & 0xFF;
- awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF;
- awshdr.flags1 = AWSTAPE_FLAG1_TAPEMARK;
- awshdr.flags2 = 0;
-
- /* Write block header to output file */
- rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR));
- if (rc < sizeof(AWSTAPE_BLKHDR))
- {
- printf ("tapecopy: Error writing %s: %s\n",
- filename, strerror(errno));
- exit (9);
- } /* end if(rc) */
-
- } /* end if(outfd) */
-
- /* Reset counters for next file */
- fileno++;
- minblksz = 0;
- maxblksz = 0;
- blkcount = 0;
-
- /* Determine whether end of tape has been read */
- rc = obtain_status (devname, devfd);
- if (rc == 0) continue;
- if (rc > 0) printf ("End of tape\n");
- break;
-
- } /* end if(tapemark) */
-
- /* Count blocks and block sizes */
- blkcount++;
- if (len > maxblksz) maxblksz = len;
- if (minblksz == 0 || len < minblksz) minblksz = len;
-
- /* Print standard labels */
- if (len == 80 && blkcount < 4
- && (memcmp(buf, vollbl, 3) == 0
- || memcmp(buf, hdrlbl, 3) == 0
- || memcmp(buf, eoflbl, 3) == 0
- || memcmp(buf, eovlbl, 3) == 0))
- {
- for (i=0; i < 80; i++)
- labelrec[i] = ebcdic_to_ascii[buf[i]];
- labelrec[i] = '\0';
- printf ("%s\n", labelrec);
- }
- else
- {
- printf ("File %u: Block %u\r", fileno, blkcount);
- }
-
- /* Write block to output file */
- if (outfd >= 0)
- {
- /* Build the block header */
- awshdr.curblkl[0] = len & 0xFF;
- awshdr.curblkl[1] = (len >> 8) & 0xFF;
- awshdr.prvblkl[0] = prevlen & 0xFF;
- awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF;
- awshdr.flags1 = AWSTAPE_FLAG1_NEWREC
- | AWSTAPE_FLAG1_ENDREC;
- awshdr.flags2 = 0;
-
- /* Write block header to output file */
- rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR));
- if (rc < sizeof(AWSTAPE_BLKHDR))
- {
- printf ("tapecopy: Error writing %s: %s\n",
- filename, strerror(errno));
- exit (10);
- } /* end if(rc) */
-
- /* Write data block to output file */
- rc = write (outfd, buf, len);
- if (rc < len)
- {
- printf ("tapecopy: Error writing %s: %s\n",
- filename, strerror(errno));
- exit (11);
- } /* end if(rc) */
-
- } /* end if(outfd) */
-
- } /* end while */
-
- /* Close files and exit */
- close (devfd);
- if (filename != NULL) close (outfd);
+ /* Display the program identification message */
+
+ printf("Tape copy is broken, sorry\n");
return 0;
} /* end function main */

View File

@ -0,0 +1,224 @@
--- tapedev.c.orig Tue Nov 20 23:39:47 2001
+++ tapedev.c Thu Jan 31 13:06:43 2002
@@ -131,6 +131,11 @@
#define TAPEDEVT_SCSITAPE 3 /* Physical SCSI tape */
#define TAPEDEVT_HET 4 /* HET format disk file */
+/* Can you say totally b0rken? */
+#define MT_ST_DENSITY_MASK 1
+#define MT_TAPE_INFO 2
+#define MTSETBLK 3
+#define MT_ST_DENSITY_SHIFT 4
/*-------------------------------------------------------------------*/
/* Structure definition for tape block headers */
/*-------------------------------------------------------------------*/
@@ -194,7 +199,10 @@
/*-------------------------------------------------------------------*/
/* Static data areas */
/*-------------------------------------------------------------------*/
-static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO;
+
+
+/* static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO;
+
static struct mt_tape_info densinfo[] = {
{0x01, "NRZI (800 bpi)"},
{0x02, "PE (1600 bpi)"},
@@ -221,7 +229,7 @@
{0x8C, "EXB-8505 compressed"},
{0x90, "EXB-8205 compressed"},
{0, NULL}};
-
+*/
static PARSER ptab[] =
{
{ "awstape", NULL },
@@ -1151,6 +1159,7 @@
if (dev->fd < 0) return 0;
/* Obtain tape status */
+/*
rc = ioctl (dev->fd, MTIOCGET, (char*)&stblk);
if (rc < 0)
{
@@ -1159,8 +1168,9 @@
return 0;
}
stat = stblk.mt_gstat;
-
+*/
/* Display tape status */
+/*
if (dev->ccwtrace || dev->ccwstep)
{
sprintf (buf, "%s status: %8.8X", dev->filename, stat);
@@ -1177,10 +1187,11 @@
if (GMT_DR_OPEN(stat)) strcat (buf, " NOTAPE");
logmsg ("HHC215I %s\n", buf);
}
-
+*/
/* If tape has been ejected, then close the file because
the driver will not recognize that a new tape volume
has been mounted until the file is re-opened */
+/*
if (GMT_DR_OPEN(stat))
{
close (dev->fd);
@@ -1190,8 +1201,10 @@
dev->prvblkpos = -1;
dev->blockid = 0;
}
-
+*/
/* Return tape status */
+
+ fprintf(stderr,"Sorry, tape support is broken.\n");
return stat;
} /* end function status_scsitape */
@@ -1249,6 +1262,7 @@
}
/* Intervention required if no tape is mounted */
+/*
if (GMT_DR_OPEN(stblk.mt_gstat))
{
dev->sense[0] = SENSE_IR;
@@ -1256,8 +1270,9 @@
*unitstat = CSW_CE | CSW_DE | CSW_UC;
return -1;
}
-
+*/
/* Display tape status information */
+/*
for (i = 0; tapeinfo[i].t_type != 0
&& tapeinfo[i].t_type != stblk.mt_type; i++);
@@ -1280,8 +1295,9 @@
else
logmsg ("HHC221I %s tape density code: 0x%lX\n",
dev->filename, density);
-
+*/
/* Set the tape device to process variable length blocks */
+ /*
opblk.mt_op = MTSETBLK;
opblk.mt_count = 0;
rc = ioctl (dev->fd, MTIOCTOP, (char*)&opblk);
@@ -1294,8 +1310,9 @@
*unitstat = CSW_CE | CSW_DE | CSW_UC;
return -1;
}
-
+*/
/* Rewind the tape to the beginning */
+/*
opblk.mt_op = MTREW;
opblk.mt_count = 1;
rc = ioctl (dev->fd, MTIOCTOP, (char*)&opblk);
@@ -1308,7 +1325,7 @@
*unitstat = CSW_CE | CSW_DE | CSW_UC;
return -1;
}
-
+*/
return 0;
} /* end function open_scsitape */
@@ -1436,13 +1453,14 @@
/* If I/O error and status indicates EOF, then a tapemark
was detected, so increment the file number and return 0 */
+/*
if (rc < 0 && fsrerrno == EIO && GMT_EOF(stat))
{
dev->curfilen++;
dev->blockid++;
return 0;
}
-
+*/
/* Handle MTFSR error condition */
if (rc < 0)
{
@@ -1481,6 +1499,7 @@
stat = status_scsitape (dev);
/* Unit check if already at start of tape */
+/*
if (GMT_BOT(stat))
{
dev->sense[0] = 0;
@@ -1488,7 +1507,7 @@
*unitstat = CSW_CE | CSW_DE | CSW_UC;
return -1;
}
-
+*/
/* Backspace block on SCSI tape */
opblk.mt_op = MTBSR;
opblk.mt_count = 1;
@@ -2703,12 +2722,15 @@
U32 stat; /* SCSI tape status bits */
/* Indicate intervention required if no file */
+/*
if (!strcmp (dev->filename, TAPE_UNLOADED))
dev->sense[0] |= SENSE_IR;
if (!(dev->fd < 0))
{
+ */
/* Set load point indicator if tape is at load point */
+/*
dev->sense[1] &= ~SENSE1_TAPE_LOADPT;
switch (dev->tapedevt)
{
@@ -2732,41 +2754,14 @@
if (dev->nxtblkpos == 0 && dev->curfilen == 1)
dev->sense[1] |= SENSE1_TAPE_LOADPT;
break;
- } /* end switch(dev->tapedevt) */
- } /* !(fd < 0) */
+ }
+ */
+ /* end switch(dev->tapedevt) */
+
/* Indicate Drive online to control unit */
- dev->sense[1] |= SENSE1_TAPE_TUA;
- /* Set file protect indicator if read-only file */
- if (dev->readonly)
- dev->sense[1] |= SENSE1_TAPE_FP;
- else
- dev->sense[1] &= ~SENSE1_TAPE_FP;
- /* Set Error Recovery Action Code */
- if (dev->sense[0] & SENSE_IR)
- dev->sense[3] = 0x43;
- else if (dev->sense[0] & SENSE_CR)
- dev->sense[3] = 0x27;
- else if (dev->sense[1] & SENSE1_TAPE_FP)
- dev->sense[3] = 0x30;
- else
- dev->sense[3] = 0x29;
-
- /* Set sense bytes for 3420 */
- if (dev->devtype != 0x3480)
- {
-// dev->sense[4] |= 0x20;
- dev->sense[5] |= 0xC0;
- dev->sense[6] |= 0x03;
- dev->sense[13] = 0x80;
- dev->sense[14] = 0x01;
- dev->sense[15] = 0x00;
- dev->sense[16] = 0x01;
- dev->sense[19] = 0xFF;
- dev->sense[20] = 0xFF;
- }
} /* end function build_sense */

View File

@ -0,0 +1 @@
The Hercules System/370, ESA/390, and z/Architecture Emulator

View File

@ -0,0 +1,12 @@
Hercules is an open source software implementation of the mainframe System/370
and ESA/390 architectures, in addition to the new 64-bit z/Architecture.
Hercules runs under Linux, Windows 98, Windows NT, and Windows 2000.
Hercules was created by Roger Bowler and is maintained by Jay Maynard. Jan
Jaeger designed and implemented many of the advanced features of Hercules,
including dynamic reconfiguration, integrated console, interpretive execution
and z/Architecture support.
WWW: http://www.conmicro.cx/hercules/
- Miguel Mendez <flynn@energyhq.homeip.net>

View File

@ -0,0 +1,10 @@
######################################################################
IMPORTANT
Tape operations and tapecopy are broken in this port (contain Linux
specific code that has not yet been adapted).
Be sure to have a look at the docs and edit the hercules.cnf file to
your needs (The sample is in ${PREFIX}/share/doc/hercules)
######################################################################

View File

@ -0,0 +1,31 @@
bin/cckd2ckd
bin/cckdcdsk
bin/cckdcomp
bin/cckdswap
bin/ckd2cckd
bin/dasdinit
bin/dasdisup
bin/dasdload
bin/dasdls
bin/dasdpdsu
bin/dmap2hrc
bin/hercules
bin/hetget
bin/hetinit
bin/hetmap
bin/hetupd
bin/tapecopy
bin/tapemap
bin/tapesplt
share/doc/hercules/cckddasd.html
share/doc/hercules/hercconf.html
share/doc/hercules/hercfaq.html
share/doc/hercules/hercinst.html
share/doc/hercules/herclic.html
share/doc/hercules/hercload.html
share/doc/hercules/hercnew.html
share/doc/hercules/herctcp.html
share/doc/hercules/hercules.cnf
share/doc/hercules/hercules.css
share/doc/hercules/index.html
@dirrm share/doc/hercules