There was also a pdp-11 version of spacewar written by a college friend
of mine. It was written to run on the 11/40 at WPI (which also had a
VT11 and VR17 display). Originally it was written to use the switches
for thrust, rotate and fire. Later, we built some boxes with two
three-position toggle switches and a mometary pushbutton, and they used
batteries and a resistor network to provide power to a set of ADCs on a
Lab Peripheral System (LPS) which was also on the machine.
Later, when both Frank and I were working at DEC, we got ahold of a few
DR11-C parallel I/O boards and built some new boxes which were
hard-wired to the boards and which simply turned on bits of the input
side, which the program was modified to read from.
A lot of hours were spent playing that game at WPI in the wee hours of
the night...
Al Kossow wrote:
Here is part of an oral history I recorded with Steve
Russel last
August which discusses how the Spacewar! program works internally.
Exerpt of an oral history of Steve Russell
August 2008
CHM Reference Number X4970.2008
(C) 2008 Computer History Museum
Russell: Anyway, the PDP-1 arrived, and Marvin Minsky wrote the tripos
demonstration, generally called the Minskytron, and there was
the famous weekend
where the mob of undergraduates transcribed the macro
assembler from TX-0 to the
PDP-1, because they didn't like FRAP. And then fairly quickly
thereafter, they
wrote DDT and connected up the macro symbols to DDT. So that
was all sort of in
place by the middle of the fall of 1961. And the combination
of the Minskytron and
having DDT with interactive debugging with symbols was very
tempting. I don't
remember the exact order of things, but I'm pretty sure I
started talking up a better
demonstration program than the Minskytron, and eventually,
Alan Kotok went up
to Maynard and collected the sine and cosine routines from
DECUS, presented
them to me, and said, "Okay, here are the sine and cosine
routines; now what's your
excuse?" And I discovered I had run out of excuses; I had to
actually think. And so
I started work and figured out the basic trick of Spacewar!
display which is that you
only need to calculate a unit vector pointing in the direction
of the spaceship. And
you can express everything else the spaceship does, and the
outline of the spaceship
in terms of that unit vector, suitably scaled. So it's
basically a lot of addition in the
usual program upkeep.
Kossow: Do you want to just give an overview, then, of how Spacewar!
actually
works?
Russell: It's one big loop, and the loop is on the displayable objects.
And I called
them displayable objects, although I didn't know about object
orientation or object-
oriented programming at the time.
Kossow: So you have the sun--
Russell: Colliding objects, not displayable objects. The colliding
object is a space
ship, there are two of those. And that has a lot of extra data
with it. It shares the
position and velocity tables with all of the torpedoes and
explosions that are running
around. So there's just one big loop through the colliding
objects, and it looks at all
the higher-numbered colliding objects to see if there's a
collision, using an octagon
because you don't need to calculate the square root of
anything, you can do that by
work on X difference, Y difference, and X+Y difference--
Kossow: So the bounding box for the collision detection is an octagon?
Russell: Yes. So it goes through, it sees if this object is colliding
with any higher-
numbered object. If it is, it replaces the calculation
routines. That's another thing
that every colliding object has, is a calculation routine. It
replaces the calculation
routine with the explosion calculation routine. And then
things take care of
themselves. Then, after it's decided whether it's an explosion
or not, it goes off to
the calculation routine. And the calculation routine updates
the position, since all
colliding objects have velocity; and if it's a spaceship, it
worries about reading the
controls and updating the other things about the spaceship in
deciding whether to
launch a torpedo or not. And if a torpedo needs to be
launched, it searches up the
colliding object table for an empty slot, indicated by having
no calculation routine.
It searches up the table for an empty slot, puts a torpedo
calculation routine there,
and the spaceship position plus the suitable increments, so it
won't run into its
torpedo, and of the velocity of the spaceship plus an
increment for the torpedo, and
it goes on. When that the main loop gets done, you go off and
do some star display
and display the sun, and calculate -- and part of the
spaceship calculation is to
calculate the effect of gravity on the spaceship. Originally,
there wasn't any gravity,
and I had an interpreter, which interpreted the outline
description, and Dan
Edwards, sometime in late 1961 or early 1962, looked at that
code and decided if he
could write a special purpose compiler which would compile
precisely the right
code, and proceeded to. And there's one compiled outline for
each spaceship; each
spaceship actually does half of the spaceship outline and then
you twiddle the
vectors and do the other half. That keeps the display running
just as fast as it can.
That gives time to calculate the effect of gravity on the two
spaceships, but not on
the torpedoes. So we decided that they were photon torpedoes
not affected by
gravity.
Kossow: So when the explosion routine starts, it continues calculating
motion, so
the explosion moves?
Russell: Yes. If you see two spaceships collide, if you watch closely,
you will see
that there are two explosions that continue off in the
direction that the two
spaceships were going. There is another number in the table
for all colliding
objects, which is the size. And this is, roughly speaking,
proportional to the amount
of computing it takes to compute that object. And at the end
of the loop, as you go
through the main loop, you accumulate the sizes also; and so
at the end of the loop,
there's fritter away time loop that attempts to keep the frame
rate approximately
constant. It doesn't do a wonderful job; it's visually
adequate, but God help you
when you try to take a movie of it.
Kossow: One of the complaints with all modern kids trying to play it
now is
that it's TOO SLOW.
Russell: Kids who are used to something like Asteroids seem to think
that. But
when we do the demos, we get a number of people who seem to be
still quite
addicted to it with the old, slow version. Now, that was
always a complaint; the
reason that all the parameters got accumulated in the first
page of the listing, which
says you can put that first page of the listing of the
console, and anyone who wanted
to try a different set of parameters could. But the ones that
were compiled in or
assembled in were the ones that I thought were good. Now it
turns out I'm not a
representative arcade game player, and so my version of the
parameters is slower
and gives more opportunity for marksmanship than the arcade
version.
Kossow: Right, that's the whole thing with gravity and doing the,
what's that called,
where you whip around the sun? Does it have a name, where you
whip around the
sun and you shoot?
Russell: The closest name is the "CBS maneuver" is what happens when
two lazy
experts fight each other, which is they both turn at right
angles to the sun, and fire
for 3.5 or 4 seconds, so they're now in stable orbits, and
they know it. And then they
turn at each other and start trying to place torpedoes where
they think the other one
is going to be. And so the trails turn into an eye around the
sun, and CBS used that
as a logo, so it got called the "CBS maneuver". You can-- one
of the spaceships can
go the other way around the sun, so that both ships meet on
the same side of the
sun. But that seems usually to have less chance of winning.
Not much less, but
somewhat less.
Kossow: It's better that you stay on opposite sides, then?
Russell: Yes.
Kossow: And then at some point, you added hyperspace?
Russell: Yes, and we realized that that was going-- I don't remember
whether we
actually had it. I may have had it for a little while with no
limit, but it became very
clear that someone who didn't understand could use hyperspace
to escape their
proper justice forever, and so we added the unreliability of
hyperfield generators
very quickly. One thing that Asteroids and the arcade
versions, the later arcade
versions of Spacewar! added, which actually was a big help,
especially with their
high acceleration rates, was "training mode" where space was
actually viscous. So
if you got your ship accelerated so that it was going across
the screen so fast you
couldn't understand what was going on, if you took your hands
off, the situation
would gradually become understandable. I don't think I would
have been persuaded
to do that in the original Spacewar! because it was
unrealistic. But it definitely
made it easier to learn.
Kossow: So are there any other favorite anecdotes about Spacewar!, or
just the
spread of Spacewar!?
Russell: Well, the "imitation is the sincerest form of flattery"-- many
people saw
Spacewar! as, some people ask for copies of the source, and of
course we gave them
out because we very briefly considered trying to sell
Spacewar!. We realized the
only possible customer was Digital Equipment, and we also, on
a little reflection,
that they were too cheap to do it. So we gave it out to anyone
who wanted it, and
some people got the listing and thought about it, and by
reading it-- a lot of people
simply saw the game and had a computer that wasn't the PDP-1
but did have a
display, and implemented Spacewar! their own way. I suspect
most of them figured
out the "basic trick", but I'm not sure.
Kossow: What "basic trick" were you thinking of?
Russell: That you could do everything based on the spaceship unit
vector. How are
you fixed for the source code for different implementations of
Spacewar!?
Kossow: We have a few. I don't know if we have the PDP-10 version. We
have the
12 version, and I think we have a PDP-7 version.
Russell: I think Bob Saunders wrote the PDP-7 version. I think one 6
version
simply ran on the PDP-1 simulator. I think there must have
been others, but I don't
know. Something for some history grad student to pursue. When
we were running a
demo for the Yelp event, there was one woman who had done
Spacewar! in turtle
graphics as a high school programming project, which she
wasn't too happy with.
She seemed to like the demo of the original Spacewar!.
Kossow: So turtle graphics running on a micro or something like that?
Russell: I didn't quiz her. I didn't have the opportunity to quiz her
further.
Kossow: So she thought this version was better?
Russell: No, she just thought it was nice to see the original.
Kossow: So she was in her mid-20s?
Russell: 20s or early 30s; probably 20s. The DEC field service story
where the
DEC production people got into the practice of loading
Spacewar! the last thing
before PDP-1 shipped, and field service would then unpack it,
make sure that
nothing horrible had happened, tryed turning on power, and
starting Spacewar!.
And if it worked, they would call the customer over and say,
"See, it works." If it
didn't work, then they'd worry about it. In the restoration
project, we had a little
reflection and we decided that probably if Spacewar! works,
just about everything
works, as far as machine instructions go. It doesn't guarantee
all the I/O gear works,
but it does multiply and divides, and just about every
instruction. So a lot of people
implemented Spacewar! just from knowing that it existed and
having seen it maybe
once.