Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e707b2bd9a |
@@ -18,7 +18,7 @@ If the emulator is run with no options, it prints a usage screen:
|
||||
E:\DEC> tu58em
|
||||
ERROR: no units were specified
|
||||
FATAL: illegal command line
|
||||
tu58 tape emulator v1.4o
|
||||
tu58 tape emulator v1.4p
|
||||
Usage: ./tu58em [-options] -[rwci] file1 ... -[rwci] file7
|
||||
Options: -V | --version output version string
|
||||
-v | --verbose enable verbose output to terminal
|
||||
@@ -29,7 +29,7 @@ FATAL: illegal command line
|
||||
-b | --background run in background mode, no console I/O except errors
|
||||
-t | --timing 1 add timing delays to spoof diagnostic into passing
|
||||
-T | --timing 2 add timing delays to mimic a real TU58
|
||||
-s | --speed BAUD set line speed 1200..3000000; default 9600
|
||||
-s | --speed BAUD set line speed to BAUD; default 9600
|
||||
-S | --stop BITS set stop bits 1..2; default 1
|
||||
-p | --port PORT set port to PORT [1..N or /dev/comN; default 1]
|
||||
-r | --read|rd FILENAME readonly drive
|
||||
@@ -52,9 +52,10 @@ Most of the switches should be pretty obvious:
|
||||
-b run in background mode, no console I/O except errors
|
||||
-t adds time delays to allow the emulator to pass the DEC ZTUUF0 TU-58 Performance Exerciser diagnostic
|
||||
-T adds time delays to make the emulator nearly as slow as a real TU-58 (just for fun)
|
||||
-s BAUD sets the baud rate; the following rates are supported. the default will be 9600 if not set.
|
||||
-s BAUD sets the baud rate; the following rates may be supported. the default will be 9600 if not set.
|
||||
3000000, 2500000, 2000000, 1500000, 1152000, 1000000, 921600, 576000, 500000,
|
||||
460800, 230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200
|
||||
exact list of baud rate support is system dependent (especially for rates above 230400)
|
||||
-p PORT sets the com port as a number (1,2,3,...) or if not numeric the full path (/dev/com1)
|
||||
-S STOP sets the number of stop bits (1 or 2), default is 1
|
||||
-r FILENAME set the next unit as a read only drive using file FILENAME
|
||||
|
||||
Binary file not shown.
Binary file not shown.
48
main.c
48
main.c
@@ -76,6 +76,8 @@
|
||||
// v1.4o - 09 Jan 2017 - donorth - Removed baud rate 256000, it is nonstandard for unix.
|
||||
// Changed serial setup to use cfsetispeed()/cfsetospeed().
|
||||
// Added capability for 1 or 2 stop bits; default is 1
|
||||
// v1.4p - 05 May 2017 - donorth - Updated serial baud rate table with #ifdef detection
|
||||
// Update clock_gettime() for MAC OSX support
|
||||
//
|
||||
|
||||
|
||||
@@ -86,7 +88,7 @@
|
||||
static char copyright[] = "(C) 2005-2017 Don North <ak6dn" "@" "mindspring.com>, " \
|
||||
"(C) 1984 Dan Ts'o <Rockefeller University>";
|
||||
|
||||
static char version[] = "tu58 tape emulator v1.4o";
|
||||
static char version[] = "tu58 tape emulator v1.4p";
|
||||
|
||||
static char port[32] = "1"; // default port number (COM1, /dev/ttyS0)
|
||||
static long speed = 9600; // default line speed
|
||||
@@ -156,7 +158,7 @@ void fatal (char *fmt, ...)
|
||||
// main program
|
||||
//
|
||||
int main (int argc,
|
||||
char **argv)
|
||||
char *argv[])
|
||||
{
|
||||
long i;
|
||||
long n = 0;
|
||||
@@ -166,32 +168,32 @@ int main (int argc,
|
||||
int opt_index = 0;
|
||||
char opt_short[] = "dvVmnxbTtp:s:r:w:c:i:z:S:";
|
||||
static struct option opt_long[] = {
|
||||
{ "debug", no_argument, 0, 'd' },
|
||||
{ "verbose", no_argument, 0, 'v' },
|
||||
{ "version", no_argument, 0, 'V' },
|
||||
{ "mrsp", no_argument, 0, 'm' },
|
||||
{ "nosync", no_argument, 0, 'n' },
|
||||
{ "vax", no_argument, 0, 'x' },
|
||||
{ "background", no_argument, 0, 'b' },
|
||||
{ "timing", required_argument, 0, -2 },
|
||||
{ "port", required_argument, 0, 'p' },
|
||||
{ "baud", required_argument, 0, 's' },
|
||||
{ "speed", required_argument, 0, 's' },
|
||||
{ "stop", required_argument, 0, 'S' },
|
||||
{ "rd", required_argument, 0, 'r' },
|
||||
{ "read", required_argument, 0, 'r' },
|
||||
{ "write", required_argument, 0, 'w' },
|
||||
{ "create", required_argument, 0, 'c' },
|
||||
{ "initrt11", required_argument, 0, 'i' },
|
||||
{ "initxxdp", required_argument, 0, 'z' },
|
||||
{ 0, no_argument, 0, 0 }
|
||||
{ "debug", no_argument, NULL, 'd' },
|
||||
{ "verbose", no_argument, NULL, 'v' },
|
||||
{ "version", no_argument, NULL, 'V' },
|
||||
{ "mrsp", no_argument, NULL, 'm' },
|
||||
{ "nosync", no_argument, NULL, 'n' },
|
||||
{ "vax", no_argument, NULL, 'x' },
|
||||
{ "background", no_argument, NULL, 'b' },
|
||||
{ "timing", required_argument, NULL, -2 },
|
||||
{ "port", required_argument, NULL, 'p' },
|
||||
{ "baud", required_argument, NULL, 's' },
|
||||
{ "speed", required_argument, NULL, 's' },
|
||||
{ "stop", required_argument, NULL, 'S' },
|
||||
{ "rd", required_argument, NULL, 'r' },
|
||||
{ "read", required_argument, NULL, 'r' },
|
||||
{ "write", required_argument, NULL, 'w' },
|
||||
{ "create", required_argument, NULL, 'c' },
|
||||
{ "initrt11", required_argument, NULL, 'i' },
|
||||
{ "initxxdp", required_argument, NULL, 'z' },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
// init file structures
|
||||
fileinit();
|
||||
|
||||
// process command line options
|
||||
while ((i = getopt_long(argc, argv, opt_short, opt_long, &opt_index)) != EOF) {
|
||||
while ((i = getopt_long(argc, argv, opt_short, opt_long, &opt_index)) != -1) {
|
||||
switch (i) {
|
||||
case -2 : timing = atoi(optarg); if (timing > 2) errors++; break;
|
||||
case 'p': strcpy(port, optarg); break;
|
||||
@@ -238,7 +240,7 @@ int main (int argc,
|
||||
" -b | --background run in background mode, no console I/O except errors\n" \
|
||||
" -t | --timing 1 add timing delays to spoof diagnostic into passing\n" \
|
||||
" -T | --timing 2 add timing delays to mimic a real TU58\n" \
|
||||
" -s | --speed BAUD set line speed 1200..3000000; default 9600\n" \
|
||||
" -s | --speed BAUD set line speed to BAUD; default 9600\n" \
|
||||
" -S | --stop BITS set stop bits 1..2; default 1\n" \
|
||||
" -p | --port PORT set port to PORT [1..N or /dev/comN; default 1]\n" \
|
||||
" -r | --read|rd FILENAME readonly drive\n" \
|
||||
|
||||
122
serial.c
122
serial.c
@@ -405,47 +405,89 @@ void devtxput (uint8_t c)
|
||||
static int32_t devbaud (int32_t rate)
|
||||
{
|
||||
#ifdef WINCOMM
|
||||
static int32_t baudlist[] = { 3000000, 3000000,
|
||||
2500000, 2500000,
|
||||
2000000, 2000000,
|
||||
1500000, 1500000,
|
||||
1152000, 1152000,
|
||||
1000000, 1000000,
|
||||
921600, 921600,
|
||||
576000, 576000,
|
||||
500000, 500000,
|
||||
460800, 460800,
|
||||
230400, 230400,
|
||||
115200, 115200,
|
||||
57600, 57600,
|
||||
38400, 38400,
|
||||
19200, 19200,
|
||||
9600, 9600,
|
||||
4800, 4800,
|
||||
2400, 2400,
|
||||
1200, 1200,
|
||||
-1, -1 };
|
||||
static int32_t baudlist[] = {
|
||||
3000000, 3000000,
|
||||
2500000, 2500000,
|
||||
2000000, 2000000,
|
||||
1500000, 1500000,
|
||||
1152000, 1152000,
|
||||
1000000, 1000000,
|
||||
921600, 921600,
|
||||
576000, 576000,
|
||||
500000, 500000,
|
||||
460800, 460800,
|
||||
230400, 230400,
|
||||
115200, 115200,
|
||||
57600, 57600,
|
||||
38400, 38400,
|
||||
19200, 19200,
|
||||
9600, 9600,
|
||||
4800, 4800,
|
||||
2400, 2400,
|
||||
1200, 1200,
|
||||
-1, -1
|
||||
};
|
||||
#else // !WINCOMM
|
||||
static int32_t baudlist[] = { 3000000, B3000000,
|
||||
2500000, B2500000,
|
||||
2000000, B2000000,
|
||||
1500000, B1500000,
|
||||
1152000, B1152000,
|
||||
1000000, B1000000,
|
||||
921600, B921600,
|
||||
576000, B576000,
|
||||
500000, B500000,
|
||||
460800, B460800,
|
||||
230400, B230400,
|
||||
115200, B115200,
|
||||
57600, B57600,
|
||||
38400, B38400,
|
||||
19200, B19200,
|
||||
9600, B9600,
|
||||
4800, B4800,
|
||||
2400, B2400,
|
||||
1200, B1200,
|
||||
-1, -1 };
|
||||
static int32_t baudlist[] = {
|
||||
#ifdef B3000000
|
||||
3000000, B3000000,
|
||||
#endif // B3000000
|
||||
#ifdef B2500000
|
||||
2500000, B2500000,
|
||||
#endif // B2500000
|
||||
#ifdef B2000000
|
||||
2000000, B2000000,
|
||||
#endif // B2000000
|
||||
#ifdef B1500000
|
||||
1500000, B1500000,
|
||||
#endif // B1500000
|
||||
#ifdef B1152000
|
||||
1152000, B1152000,
|
||||
#endif // B1152000
|
||||
#ifdef B1000000
|
||||
1000000, B1000000,
|
||||
#endif // B1000000
|
||||
#ifdef B921600
|
||||
921600, B921600,
|
||||
#endif // B921600
|
||||
#ifdef B576000
|
||||
576000, B576000,
|
||||
#endif // B576000
|
||||
#ifdef B500000
|
||||
500000, B500000,
|
||||
#endif // B500000
|
||||
#ifdef B460800
|
||||
460800, B460800,
|
||||
#endif // B460800
|
||||
#ifdef B230400
|
||||
230400, B230400,
|
||||
#endif // B230400
|
||||
#ifdef B115200
|
||||
115200, B115200,
|
||||
#endif // B115200
|
||||
#ifdef B57600
|
||||
57600, B57600,
|
||||
#endif // B57600
|
||||
#ifdef B38400
|
||||
38400, B38400,
|
||||
#endif // B38400
|
||||
#ifdef B19200
|
||||
19200, B19200,
|
||||
#endif // B19200
|
||||
#ifdef B9600
|
||||
9600, B9600,
|
||||
#endif // B9600
|
||||
#ifdef B4800
|
||||
4800, B4800,
|
||||
#endif // B4800
|
||||
#ifdef B2400
|
||||
2400, B2400,
|
||||
#endif // B2400
|
||||
#ifdef B1200
|
||||
1200, B1200,
|
||||
#endif // B1200
|
||||
-1, -1
|
||||
};
|
||||
#endif // !WINCOMM
|
||||
int32_t *p = baudlist;
|
||||
int32_t r;
|
||||
|
||||
@@ -52,11 +52,13 @@
|
||||
#include "tu58.h"
|
||||
|
||||
#ifdef MACOSX
|
||||
// clock_gettime() is not available under OSX
|
||||
// clock_gettime() is not available under MACOSX
|
||||
#define CLOCK_REALTIME 1
|
||||
#include <mach/mach_time.h>
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach.h>
|
||||
|
||||
void clock_gettime(int dummy, timespec_t *t) {
|
||||
void clock_gettime (int dummy, struct timespec *t) {
|
||||
uint64_t mt;
|
||||
mt = mach_absolute_time();
|
||||
t->tv_sec = mt / 1000000000;
|
||||
|
||||
Reference in New Issue
Block a user