Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d029f1e38a | ||
|
|
951a63f1af | ||
|
|
5339ac0613 | ||
|
|
804ffb5855 | ||
|
|
be3f806a61 | ||
|
|
04ed9e43eb | ||
|
|
51657d20ba | ||
|
|
95b02ffc72 | ||
|
|
320032775a |
41
README.md
41
README.md
@@ -2,25 +2,31 @@
|
||||
|
||||
<B>tu58em</B> was originally based on the 1984 Dan Ts'o tu58 program, but has been almost completely rewritten to make it compile error free, improve the program flow, and add new functionality. It has been compiled within the CYGWIN environment, and will run either within a CYGWIN window or an MSDOS command window with the associated cygwin1.dll helper file. <B>tu58em</B> has been tested under Win2K, WinXPsp3, and Win7sp1. <B>tu58em</B> has compiled error free under Linux (Ubuntu 12.02LTS) but has not yet been rigorously tested in that environment.
|
||||
|
||||
Each emulated .dsk image file is exactly 256KB (512 blocks of 512 bytes) of data and is a byte-for-byte image of the data on a TU-58 cartridge tape. As currently configured <B>tu58em</B> will support up to 8 drives per controller as DD0: to DD7: (altho this is easily changed in the source).
|
||||
Each emulated .dsk image file is exactly 256KB (512 blocks of 512 bytes) of data and is a byte-for-byte image of the data on a TU-58 cartridge tape. As currently configured <B>tu58em</B> will support up to 8 drives per controller as DD0: to DD7: (altho this is easily changed in the source). <B>tu58em</B> will support disk image files as large as the TU58 protocol allows (ie, 32MB, or 64K 512B blocks); however most standard DEC operating system drivers restrict TU58 drives to 256KB each. The DEC driver must be patched to allow for larger than 256KB disk images.
|
||||
|
||||
<B>tu58em</B> has been tested using both native RS232 serial COM ports and serial ports emulated thru USB serial adapters.
|
||||
|
||||
Note: <B>tu58em</B> is compiled using the CYGWIN serial interface library routines (ie, termios.h) and is the preferred version that should be used. <B>tu58ew</B> bypasses the CYGWIN serial interface layer and makes direct Windows serial comm routine calls. This version was done early on because of deficiencies in the CYGWIN serial library. However, the required features are now present so in reality <B>tu58ew</B> should be considered deprecated.
|
||||
|
||||
The latest version (as of 1.4m) integrates Mark Blair's updates for VAX mode operation (for VAX-730 microcode boot support) and background mode.
|
||||
|
||||
A cygwin folder with a precompiled 32b cygwin executable (tu58em.exe) is included for those without cygwin environment access. Under Windows, just open a standard CMD.EXE window, change to the cygwin folder, and run the <B>tu58em.exe</B> executable as a command line program.
|
||||
|
||||
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.4k
|
||||
tu58 tape emulator v1.4m
|
||||
Usage: ./tu58em [-options] -[rwci] file1 ... -[rwci] file7
|
||||
Options: -V | --version output version string
|
||||
-v | --verbose enable verbose output to terminal
|
||||
-d | --debug enable debug output to terminal
|
||||
-m | --mrsp enable standard MRSP mode (byte-level handshake)
|
||||
-n | --nosync disable sending INIT at initial startup
|
||||
-x | --vax remove delays for aggressive timeout of VAX console
|
||||
-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..230400; default 9600]
|
||||
@@ -36,20 +42,22 @@ E:\DEC>
|
||||
Most of the switches should be pretty obvious:
|
||||
|
||||
```
|
||||
-V prints the program version and exits
|
||||
-v sets verbose mode, which outputs status as the emulator runs
|
||||
-d sets debug mode, which dumps out all packets sent/received
|
||||
-m enables MRSP mode (VERY MUCH UNTESTED) instead of the default original RSP mode
|
||||
-n disables the sending of INIT characters at startup
|
||||
-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 (115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 are supported)
|
||||
-p PORT sets the com port as a number (1,2,3,...) or if not numeric the full path (/dev/com1)
|
||||
-r FILENAME set the next unit as a read only drive using file FILENAME
|
||||
-w FILENAME set the next unit as a read/write drive using file FILENAME
|
||||
-c FILENAME set the next unit as a read/write drive using file FILENAME, zero the file before use
|
||||
-i FILENAME set the next unit as a read/write drive using file FILENAME, initialize RT-11 filesystem before use
|
||||
-z FILENAME set the next unit as a read/write drive using file FILENAME, initialize XXDP filesystem before use
|
||||
-V prints the program version and exits
|
||||
-v sets verbose mode, which outputs status as the emulator runs
|
||||
-d sets debug mode, which dumps out all packets sent/received
|
||||
-m enables MRSP mode (VERY MUCH UNTESTED) instead of the default original RSP mode
|
||||
-n disables the sending of INIT characters at startup
|
||||
-x remove delays for aggressive timeout of VAX console
|
||||
-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 (115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 are supported)
|
||||
-p PORT sets the com port as a number (1,2,3,...) or if not numeric the full path (/dev/com1)
|
||||
-r FILENAME set the next unit as a read only drive using file FILENAME
|
||||
-w FILENAME set the next unit as a read/write drive using file FILENAME
|
||||
-c FILENAME set the next unit as a read/write drive using file FILENAME, zero the file before use
|
||||
-i FILENAME set the next unit as a read/write drive using file FILENAME, initialize RT-11 filesystem before use
|
||||
-z FILENAME set the next unit as a read/write drive using file FILENAME, initialize XXDP filesystem before use
|
||||
```
|
||||
|
||||
A sample run of <B>tu58em</B>, using COM3 at 38.4Kb, a read/only tape on DD0: using file boot.dsk, and a read/write tape on DD1: initialized with an RT-11 filesystem as file rt11.dsk:
|
||||
@@ -80,3 +88,4 @@ info: write unit=1 sw=0x00 mod=0x00 blk=0x0006 cnt=0x0400
|
||||
info: TU58 emulation end
|
||||
E:\DEC>
|
||||
```
|
||||
|
||||
|
||||
2
common.h
2
common.h
@@ -101,6 +101,8 @@ extern uint8_t verbose;
|
||||
extern uint8_t nosync;
|
||||
extern uint8_t timing;
|
||||
extern uint8_t mrspen;
|
||||
extern uint8_t vax;
|
||||
extern uint8_t background;
|
||||
|
||||
|
||||
// the end
|
||||
|
||||
BIN
cygwin/cygwin1.dll
Normal file
BIN
cygwin/cygwin1.dll
Normal file
Binary file not shown.
BIN
cygwin/tu58em.exe
Normal file
BIN
cygwin/tu58em.exe
Normal file
Binary file not shown.
BIN
cygwin1.dll
BIN
cygwin1.dll
Binary file not shown.
26
main.c
26
main.c
@@ -41,6 +41,8 @@
|
||||
// Fix source for ubuntu linux 12.04 (time structs)
|
||||
// v1.4k - 11 Jun 2015 - donorth - Integrate Mark Blair's changes for MacOSX compilation
|
||||
// - No functionality changes on other platforms
|
||||
// v1.4m - 23 Feb 2016 - donorth - Added M. Blair's vax console timeout changes for '730
|
||||
// - Added M. Blair's background mode option (no status).
|
||||
//
|
||||
|
||||
|
||||
@@ -51,7 +53,7 @@
|
||||
static char copyright[] = "(C) 2005-2014 Don North <ak6dn" "@" "mindspring.com>, " \
|
||||
"(C) 1984 Dan Ts'o <Rockefeller University>";
|
||||
|
||||
static char version[] = "tu58 tape emulator v1.4k";
|
||||
static char version[] = "tu58 tape emulator v1.4m";
|
||||
|
||||
static char port[32] = "1"; // default port number (COM1, /dev/ttyS0)
|
||||
static long speed = 9600; // default line speed
|
||||
@@ -61,6 +63,8 @@ uint8_t timing = 0; // set nonzero to add timing delays
|
||||
uint8_t mrspen = 0; // set nonzero to enable MRSP mode
|
||||
uint8_t nosync = 0; // set nonzero to skip sending INIT at restart
|
||||
uint8_t debug = 0; // set nonzero for debug output
|
||||
uint8_t vax = 0; // set to remove delays for aggressive VAX console timeouts
|
||||
uint8_t background = 0; // set to run in background mode (no console I/O except errors)
|
||||
|
||||
|
||||
|
||||
@@ -70,11 +74,13 @@ uint8_t debug = 0; // set nonzero for debug output
|
||||
void info (char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
fprintf(stderr, "info: ");
|
||||
vfprintf(stderr, fmt, args);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(args);
|
||||
if (!background) {
|
||||
va_start(args, fmt);
|
||||
fprintf(stderr, "info: ");
|
||||
vfprintf(stderr, fmt, args);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(args);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -124,13 +130,15 @@ int main (int argc,
|
||||
|
||||
// switch options
|
||||
int opt_index = 0;
|
||||
char opt_short[] = "dvVmnTtp:s:r:w:c:i:z:";
|
||||
char opt_short[] = "dvVmnxbTtp:s:r:w:c:i:z:";
|
||||
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' },
|
||||
@@ -162,6 +170,8 @@ int main (int argc,
|
||||
case 'n': nosync = 1; break;
|
||||
case 'T': timing = 2; break;
|
||||
case 't': timing = 1; break;
|
||||
case 'x': vax = 1; break;
|
||||
case 'b': background = 1; break;
|
||||
case 'd': verbose = 1; debug = 1; break;
|
||||
case 'v': verbose = 1; break;
|
||||
case 'V': info("version is %s", version); break;
|
||||
@@ -188,6 +198,8 @@ int main (int argc,
|
||||
" -d | --debug enable debug output to terminal\n" \
|
||||
" -m | --mrsp enable standard MRSP mode (byte-level handshake)\n" \
|
||||
" -n | --nosync disable sending INIT at initial startup\n" \
|
||||
" -x | --vax remove delays for aggressive timeouts of VAX console\n" \
|
||||
" -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..230400; default 9600]\n" \
|
||||
|
||||
6
makefile
6
makefile
@@ -16,8 +16,10 @@ PROG = tu58em
|
||||
COMM = -UWINCOMM
|
||||
endif
|
||||
|
||||
BIN = ../../../../../tools/exe
|
||||
# put your binary installation directory here...
|
||||
BIN = /cygdrive/e/DEC/tools/exe
|
||||
|
||||
# compiler flags and libraries
|
||||
CC = gcc
|
||||
CFLAGS = -I. -O3 -Wall -c $(COMM)
|
||||
ifeq ($(comm),mac)
|
||||
@@ -55,7 +57,7 @@ purge : clean
|
||||
-rm -f $(PROG) $(PROG).exe
|
||||
|
||||
install : $(PROG)
|
||||
cp $< $(BIN)
|
||||
[ -d $(BIN) ] && cp $< $(BIN)
|
||||
|
||||
serial.o : serial.c common.h
|
||||
$(CC) $(CFLAGS) serial.c
|
||||
|
||||
10
serial.c
10
serial.c
@@ -575,6 +575,9 @@ void coninit (void)
|
||||
{
|
||||
struct termios cons;
|
||||
|
||||
// background mode, don't do anything
|
||||
if (background) return;
|
||||
|
||||
// get current console parameters
|
||||
if (tcgetattr(fileno(stdin), &consSave))
|
||||
fatal("stdin not a serial device");
|
||||
@@ -603,6 +606,10 @@ void coninit (void)
|
||||
//
|
||||
void conrestore (void)
|
||||
{
|
||||
// background mode, don't do anything
|
||||
if (background) return;
|
||||
|
||||
// restore console mode to saved
|
||||
tcsetattr(fileno(stdin), TCSANOW, &consSave);
|
||||
return;
|
||||
}
|
||||
@@ -617,6 +624,9 @@ int32_t conget (void)
|
||||
char buf[1];
|
||||
int32_t s;
|
||||
|
||||
// background mode, don't return anything
|
||||
if (background) return -1;
|
||||
|
||||
// try to read at most one char (may be none)
|
||||
s = read(fileno(stdin), buf, sizeof(buf));
|
||||
|
||||
|
||||
34
tu58drive.c
34
tu58drive.c
@@ -156,12 +156,15 @@ static void dumppacket (tu_packet *pkt, char *name)
|
||||
int32_t count = 0;
|
||||
uint8_t *ptr = (uint8_t *)pkt;
|
||||
|
||||
fprintf(stderr, "info: %s()\n", name);
|
||||
while (count++ < pkt->cmd.length+2) {
|
||||
if (count == 3 || ((count-4)%32 == 31)) fprintf(stderr, "\n");
|
||||
fprintf(stderr, " %02X", *ptr++);
|
||||
// formatted packet dump, but skip it in background mode
|
||||
if (!background) {
|
||||
fprintf(stderr, "info: %s()\n", name);
|
||||
while (count++ < pkt->cmd.length+2) {
|
||||
if (count == 3 || ((count-4)%32 == 31)) fprintf(stderr, "\n");
|
||||
fprintf(stderr, " %02X", *ptr++);
|
||||
}
|
||||
fprintf(stderr, "\n %02X %02X\n", ptr[0], ptr[1]);
|
||||
}
|
||||
fprintf(stderr, "\n %02X %02X\n", ptr[0], ptr[1]);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -536,7 +539,7 @@ static void command (int8_t flag)
|
||||
char *name= "none";
|
||||
uint8_t mode = 0;
|
||||
|
||||
// Avoid uninitialized variable warnings
|
||||
// avoid uninitialized variable warnings
|
||||
time_start.tv_sec = 0;
|
||||
time_start.tv_nsec = 0;
|
||||
time_end.tv_sec = 0;
|
||||
@@ -702,14 +705,17 @@ static void* run (void* none)
|
||||
|
||||
// loop while no characters are available
|
||||
while (devrxavail() == 0) {
|
||||
// send INITs if still required
|
||||
if (doinit) {
|
||||
if (debug) fprintf(stderr, ".");
|
||||
devtxput(TUF_INIT);
|
||||
devtxflush();
|
||||
delay_ms(75);
|
||||
// delays and printout only if not VAX
|
||||
if (!vax) {
|
||||
// send INITs if still required
|
||||
if (doinit) {
|
||||
if (debug) fprintf(stderr, ".");
|
||||
devtxput(TUF_INIT);
|
||||
devtxflush();
|
||||
delay_ms(75);
|
||||
}
|
||||
delay_ms(25);
|
||||
}
|
||||
delay_ms(25);
|
||||
}
|
||||
doinit = 0; // quit sending init flags
|
||||
|
||||
@@ -730,7 +736,7 @@ static void* run (void* none)
|
||||
if (debug) info("<INIT> seen");
|
||||
if (last == TUF_INIT) {
|
||||
// two in a row is special
|
||||
delay_ms(tudelay[timing].init);
|
||||
if (!vax) delay_ms(tudelay[timing].init); // no delay for VAX
|
||||
devtxput(TUF_CONT); // send 'continue'
|
||||
devtxflush(); // send immediate
|
||||
flag = -1; // undefined
|
||||
|
||||
BIN
tu58em.exe
BIN
tu58em.exe
Binary file not shown.
BIN
tu58ew.exe
BIN
tu58ew.exe
Binary file not shown.
Reference in New Issue
Block a user