1981 mainframe Zork built from MDL source code

Thank you for posting those files at the repository. I was looking through the DOC file. I never realized the original Zork had the OOPS feature!

1 Like

Lebling agreed to put his Zork logotype on a t-shirt.

3 Likes

White design for black tshirts would be nice.

1 Like

Good point. White on black is now available: zork | techsquare

2 Likes

Ordered. :wink:

1 Like

There appears to be something missing here. This builds an ITS emulator? How do you start ITS? How you get Zork running?

I remember from ITS, at the DDT, you do :zork or zork ctrl-K. But does this ITS come with zork pre installed? Or do you also need to suck down the other repo?

For the time being, I’m just interested in running zork, not my goal to recompile it or get a full ITS running unless i need to.

Maybe it’s available online somewhere? The mainframe version.

Even if you may not be interested in going for the full monty, others might want to try it: a way to do this is to built an emulated ITS environment within SIMH (which runs in Linux). Instructions are here, provided you know how to build SIMH. There are ready-install packages for SIMH in many distributions, such as Debian.

If you want to compile the emulator yourself, my recommendation is to go for Open-SIMH, which emulates dozens of old systems and environments, many of which have their own pages with software and repositories as well. ITS is just one of the many ones that can be emulated and run. No retrocomputing enthusiast should be without one!

This is my notes on how to compile ITS emulator under simh and commands inside ITS for starting/stopping/compiling zork + navigating in the OS. Hope it helps.

(Apologies if there’s some occasional swedish word in the notes that I missed to translate…)

Build ITS
=========

1. Install cygwin
	+autoconf
	+libusb 1.0-devel
	+gcc-g++
	+make
	+git
	+gcc-fortran (to compile dungeon)
	+libsdl2-devel

2. Star cygwin and navigate to home directory

3. git clone https://github.com/PDP-10/its.git

4. cd its

5a. make EMULATOR=simh
	needs to run 2 times
	1st time ends in error 2 after about 30 min
	2nd time installs and takes a fairly long time (2h)
	2nd time also end in error 2 (curses.h tools/supdup)

5b. make EMULATOR=klh10 (recommended?)

Build ITS for Ubuntu 20.04
==========================
1. Packets (sudo apt-get install [packet]):
	gcc
	libsdl2-dev
	libpcap-dev
	libvdeplug-dev
	libncurses-dev
	expect
	autoconf

2. sudo git clone https://github.com/PDP-10/its its

3. cd its

4a. sudo make EMULATOR=simh
	(takes long time... 2 h, at least)

4b. sudo make EMULATOR=klh10 (recommended?)
	(takes long time... 2 h, at least)

Start ITS
=========

1. In cygwin (/its): ./start

2. If you see the DSKDMP prompt, type its, press [Enter], and then [ESC] g

3. Eventually, you will see SYSTEM JOB USING THIS CONSOLE. You are now ready to log in, so type Control-Z.

4. When you see "Happy hacking!", log in with :login <user>

5. You're in!

Useful commands
===============

Start program	: :prog
	Ex	: :muddle

End/change program	: Mostly ^Z. This leaves the process running, terminate process with :kill

dired (:dired)	: Remove files with wildcard
	EX	: :dired 
		  @act ZILCH (choose "directory")
		  @d ZILCH *
		  @d * ZILCH

Create file in new directory and edit it with emacs
	:print ZILCH;..new. (udir)
	:emacs ZILCH;ZILCH
	Paste text
	^X^S (saves file)


		
DDT cheat sheet for Unix users
------------------------------

To get access to a terminal, first type ^Z (Control-Z). After that, you can log in.

The ◊ character represents typing ESC, or holding down the Meta key. On a text terminal, it will show up as $.

Unix command	DDT command			Colon command
login user		user◊u				:login user
logout			◊◊u					:logout
TERM=vt52							:tctyp vt52
TERM=vt100							:tctyp aaa
TERM=ansi							:crtsty ansi
clear			^L					:clear
ls				^F					:listf
ls -l			◊◊^F				:lf
ls dir			dir^F				:listf dir
ls /			^R m.f.d. (file)	:print m.f.d. (file)
ls *.foo		^R dir: second foo	:print dir: second foo
more file		^R file				:print file
mkdir dir		^R dir;..new. (udir):print dir;..new. (udir)
cd dir			dir◊^S				:cwd dir
/foo/bar							:foo;bar
cp f1 f2		◊^R f1,f2			:copy f1,f2
rm file			^O file				:delete file
ln f1 f2		◊^O f1,f2			:link f1,f2
mv f1 f2		◊◊^O f1,f2			:rename f1,f2
mv file dir							:move file,dir
emacs			emacs^K				:emacs
ps				◊◊v					:listj
kill pid		pid◊^X				:job pid then :kill
kill -9 pid							:lock then pid gun
sudo -u u cmd	u◊◊^S 				cmd	
top				peek^H				:peek
^U				^D	
^C				^G	
^Z				^Z	
^D				^C	
fg				◊P					:continue
bg				^P					:proceed
man 2 open							:call open
dmesg								:sysmsg
uptime								:time

Terminate ITS
=============
:lock
5down
Y
Ctrl-C
Ctrl+Alt Gr-\
exit

Start MUDDLE (56)
=================
:muddle

Start MUDDLE (54)
=================
:cwd mudsav
:mud54

Start Zork inside MUD54
=======================
<RESTORE "MADMAN; MUDADV SAVE">$

Configure console with scroll and working backspace
===================================================
:tctyp aaa scroll no more width 100

ITSTAR & DUMP
=============
#To import into ITS:
#	 1. ./start
#	 2. Ctrl-\ to get the "sim>" prompt
#	 3. attach tu0 madman/madman.tape
#	 4. continue
#	 5. its<CR>$G
#	 6. Ctrl-z
#	 7. :login <user>
#	 8. :dump
#	 9. load
#	10. madman;*<CR><CR>
#	11. quit
#	12. :logout
#	13. Ctrl-\
#	14. detach tu0
#	15. continue

230303
======

:LISTF LCF				Source code to Zork 616+100
:LISTF CFS				MADADV SAVE for Zork 616+100
:MDL					Start interpreter MUD56
:MUD55					Start interpreter MUD55
:MUDSAV;MUD54			Start interpreter MUD54
"MADMAN; MADADV SAVE"	Is game of 28th Januari 1978

Start Zork 616+100 (7/22/81) inside MUD55
=========================================
:mud55
<RESTORE "CFS; MADADV SAVE">$

Compiling MDL
=============
https://github.com/PDP-10/its/blob/master/doc/muddle.md

Compiling Zork
==============
Use predefined scripts.
	:listf lcf;
	:xxfile lcf;comp log_lcf;comp xxfile	(~ 20 min, logfile = lcf;comp log)
	:xxfile lcf;zork log_lcf;zork xxfile	(~  5 min, logfile = lcf;zork log)

LCF;COMP XXFILE
===============	
:pcomp
<SNAME "LCF">
<FILE-COMPILE "prim >">			(ESC p)
<FILE-COMPILE "defs >">			(ESC p)
<FILE-COMPILE "util >">			(ESC p)
<FILE-COMPILE "makstr >">		(ESC p)
<FILE-COMPILE "typhak >">		(ESC p)
<QUIT>
:assem "lcf;tell >" "lcf;tell nbin"
:pcomp
<FLOAD "lcf;comp preamb">
<FILE-COMPILE "rooms >">		(ESC p)
<FILE-COMPILE "parser >">		(ESC p)
<QUIT>
<FLOAD "lcf;comp preamb">
<FILE-COMPILE "act1 >">			(ESC p)
<FILE-COMPILE "act2 >">			(ESC p)
<QUIT>
<FLOAD "lcf;comp preamb">
<FILE-COMPILE "act3 >">			(ESC p)
<FILE-COMPILE "act4 >">			(ESC p)
<QUIT>
<FLOAD "lcf;comp preamb">
<FILE-COMPILE "melee >">		(ESC p)
<FILE-COMPILE "sr >">			(ESC p)
<QUIT>

LCF;COMP PREAMB
===============
<SNAME "LCF">
<FLOAD "prim nbin">
<FLOAD "defs nbin">
<FLOAD "util nbin">
<FLOAD "tell nbin">
<FLOAD "makstr nbin">
<FLOAD "typhak nbin">
<OVERFLOW <>>

LCF;ZORK XXFILE
===============
:mudsav;mud55
<BLOAT 150000 1 3 2000 30 9>
<SNAME "LCF">
<FLOAD "prim nbin">
<FLOAD "defs nbin">
<FLOAD "util nbin">
<FLOAD "makstr nbin">
<FLOAD "typhak nbin">
<FLOAD "rooms nbin">
<FLOAD "parser nbin">
<FLOAD "act1 nbin">
<FLOAD "act2 nbin">
<FLOAD "act3 nbin">
<FLOAD "act4 nbin">
<FLOAD "tell nbin">
<FLOAD "melee nbin">
<FLOAD "sr nbin">
<FLOAD "dung">
<RSUBR-LINK <>>
%%<HANDLER <GET ERROR!-INTERRUPTS INTERRUPT> ,ERRH>
<SETG MUD-HAND <OFF <3 <GET ,INCHAN INTERRUPT>>>>
%%<SETG ZORK-HAND <OFF <HANDLER <GET ,INCHAN INTERRUPT> ,CTRL-S>>>
<SETG END-GAME-EXISTS? T>
<GC-MON T>
<PSETG WINNERS '["EJS", "TAA"]>
<SAVE-IT "cfs;madadv save" <>>
<QUIT>


Error 2, SIMH, first run
========================
In file included from t10backup.c:28:
t10backup.c: In function ‘downcase’:
t10backup.c:361:17: warning: array subscript has type ‘char’ [-Wchar-subscripts]
  361 |     if (isupper(*s)) *s = tolower(*s);
      |                 ^~
t10backup.c: In function ‘buildfilenames’:
t10backup.c:372:32: warning: ‘%s’ directive writing up to 99 bytes into a region of size between 0 and 99 [-Wformat-overflow=]
  372 |     sprintf (filespec [0], "%s:%s", filedev, filedir);
      |                                ^~            ~~~~~~~
t10backup.c:372:5: note: ‘sprintf’ output between 2 and 200 bytes into a destination of size 100
  372 |     sprintf (filespec [0], "%s:%s", filedev, filedir);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t10backup.c:376:30: warning: ‘%s’ directive writing up to 99 bytes into a region of size between 0 and 99 [-Wformat-overflow=]
  376 |   sprintf (filespec [6], "%s.%s", filename, fileext);
      |                              ^~             ~~~~~~~
t10backup.c:376:3: note: ‘sprintf’ output between 2 and 200 bytes into a destination of size 100
  376 |   sprintf (filespec [6], "%s.%s", filename, fileext);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t10backup.c:388:32: warning: ‘%s’ directive writing up to 99 bytes into a region of size 98 [-Wformat-overflow=]
  388 |     sprintf (endof (cname), "..%s", filespec [6]);
      |                                ^~   ~~~~~~~~~~~~
t10backup.c:388:5: note: ‘sprintf’ output between 3 and 102 bytes into a destination of size 100
  388 |     sprintf (endof (cname), "..%s", filespec [6]);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t10backup.c:385:37: warning: ‘sprintf’ may write a terminating nul past the end of the destination [-Wformat-overflow=]
  385 |         sprintf (endof (cname), ".%s", filespec [i]);
      |                                     ^
t10backup.c:385:9: note: ‘sprintf’ output between 2 and 101 bytes into a destination of size 100
  385 |         sprintf (endof (cname), ".%s", filespec [i]);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc -g  t10backup.o tapeio.o   -o t10backup
cc -g -Wall   -c -o read20.o read20.c
read20.c: In function ‘expmatch’:
read20.c:558:30: warning: implicit declaration of function ‘re_exec’; did you mean ‘regexec’? [-Wimplicit-function-declaration]
  558 |                 if ((match = re_exec(topsname)) == -1)
      |                              ^~~~~~~
      |                              regexec
In file included from read20.c:22:
read20.c: In function ‘main’:
read20.c:868:43: warning: array subscript has type ‘char’ [-Wchar-subscripts]
  868 |                           argc && isdigit(**argv);
      |                                           ^~~~~~
cc -g  read20.o tapeio.o   -o read20
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: read20.o: in function `expmatch':
/home/heasm/its/tools/tapeutils/read20.c:558:(.text+0xc29): undefined reference to `re_exec'
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: read20.o: in function `main':
/home/heasm/its/tools/tapeutils/read20.c:854:(.text+0x1abe): undefined reference to `re_comp'
collect2: error: ld returned 1 exit status
make[1]: *** [<builtin>: read20] Error 1
make[1]: Leaving directory '/home/heasm/its/tools/tapeutils'
make: *** [Makefile:349: tools/tapeutils/tapewrite] Error 2

Error #2
========
make[1]: Entering directory '/home/heasm/its/tools/supdup'
cc -g -Wall   -c -o supdup.o supdup.c
supdup.c: In function ‘get_host’:
supdup.c:440:16: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  440 |       hostname = host->h_name;
      |                ^
cc -g -Wall   -c -o charmap.o charmap.c
cc -g -o supdup supdup.o charmap.o -lncurses -lresolv
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: supdup.o: in function `dns_addrs_of_name':
/home/heasm/its/tools/supdup/supdup.c:290:(.text+0x2b6): undefined reference to `__ns_initparse'
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /home/heasm/its/tools/supdup/supdup.c:295:(.text+0x36b): undefined reference to `__ns_msg_getflag'
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /home/heasm/its/tools/supdup/supdup.c:297:(.text+0x3f2): undefined reference to `__ns_msg_getflag'
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /home/heasm/its/tools/supdup/supdup.c:306:(.text+0x486): undefined reference to `__ns_parserr'
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /home/heasm/its/tools/supdup/supdup.c:314:(.text+0x521): undefined reference to `__ns_get16'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:24: supdup] Error 1
make[1]: Leaving directory '/home/heasm/its/tools/supdup'
make: *** [Makefile:374: tools/supdup/supdup] Error 2

Yes it builds the ITS emulator. See previous post on how to start Zork.

No, Zork is pre-installed.

There was an emulator running online before, see 1978 Zork running on PDP-10 emulator

At the moment it seems to be down or unavailable. @larsbrinkhoff?