0% found this document useful (0 votes)
290 views274 pages

Compute!s Second Book of Commodore 64 Games

Uploaded by

Jonah Hex
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
290 views274 pages

Compute!s Second Book of Commodore 64 Games

Uploaded by

Jonah Hex
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 274

‘nl

————

FRIENDS
- >
-

OF ACPL

wi
o7ne

794.82
C739
i lt —
(794.82 C739 aad
Compute!'s second book o
commodore €4 games

Be 4 794.92 cra9 7068957


COMPUTE!’ «
SECOND EOOK
— ComMMOnORE OF
64 Games

TRIALSA REFERENCE/REFE
RRAY, CENTER
DEC. 17 1986 Ae.
(Mc FRIENDS
OF ACPL
COMPUTE!'s SECOND BOOK O I ,
| COMMODORE |

‘GAMES

COMPUTE! Publications,Inc.
Greensboro, North Carolina
Commodore 64 is a trademark of Commodore Electronics, Ltd.
Allen County Public f
Ft. Wayne, Indiana

The following articles were originally published in COMPUTE! magazine, copyright


1984, COMPUTE! Publications, Inc.: “Quatrainment” (February), ‘‘Worm of Bemer”’
(April), “Olympiad” (June).

The following articles were originally published in COMPUTE!’s Gazette magazine,


copyright 1984, COMPUTE! Publications, Inc.: “Astro-PANIC!” (February), “Haunted
Mansion” (February), “CUT-OFF!” (March), “Sea Route to India’’ (March), ‘Props’
(May), ““SuperSprite” (May), ‘The Frantic Fisherman” (June), “Beekeeper” (July),
“Campaign Manager” (August).

Copyright 1984, COMPUTE! Publications, Inc. All rights reserved.

Reproduction or translation of any part of this work beyond that permitted by Sec-
tions 107 and 108 of the United States Copyright Act without the written permission
of the copyright owner is unlawful. J

Printed in the United States of America

ISBN 0-942386-64-7

10987654321

COMPUTE! Publications, Inc., Post Office Box 5406, Greensboro, NC 27403, (919)
275-9809, is one of the ABC Publishing Companies and is not associated with any
manufacturer of personal computers. Commodore 64 is a registered trademark of
Commodore Electronics Limited.

ii
7068957

Contents
IS iloted ages cha cS te gee Nee dt ci, Vv
Chapter 1. Ideas, Concepts, and Applications ........... 1
Thinking It Through: How to Plan a Videogame
IR CD toe) i a. ake 3
Chapter 2. Text Adventure Games ................... 23
Puzzles, Palaces, and Pilgrims: Writing Text Adventures
for the Commodore 64
Ce a, SG RIE ete ee ee as ihe 25
Time Capsule
atid Flare tse od sorvicny 3 Os See sane dh hes. 44

Chapter:3. Strategy Games. ..s056es siin


icq cel se 61
eile et
Sea Route to India: A Historical Simulation for the 64
MJ, WARCET ad thicd ble wot F AOL ak ake nig «63
Quatrainment
Sean Puckett (64 Version by Gregg Peele) ............. 76
Campaign Manager
TOE STRANIER gO asi Lat ies «See Sok NS ee 82

Chapter 4. Creairireemteres 925 2 ss So ee ce vy oe ee 121


The Frantic Fisherman
David Lacey (64 Version by Kevin Martin) ........... 123
Beekeeper
Daniel Gray (64 Translation by Kevin Martin) ........ 133
Props
Philip 1) NeIGO% . 6.o:0 id pene 5 sn poo as Oe tne Mae 139
Worm of Bemer
Stephen D. Fultz (64 Translation by Kevin Martin) .... 159

Chapter 5. Arcade Games 00s eeeeeue


.......-- ..- ee, 169
Brunhilde Loves Bruno
Philip I. Nelson 1.6... eee cece e eee teen eens 171
SuperSprite
Nick Sullivan (ik 0:8 nie mgm a ee ae eae dee ee 190
mpiad
fo Woram and Mike Buhidar, Jr. ..........eeeees 197
Burn Rubber
Jonathan Cook .......+.+ e+Wen
dose onmee 204
mewes o>er
Haunted Mansion |
Calvin Overhulser (64 Translation by Kevin Martin) ... 211

Chapter 6. Machine Language Games ............... 221


CUT-OFF!
Tom R: Halfhill 20. .05 as ssud seeds lee eee 223
Astro-PANIC!
Charles Brannott ossusee'ves ovat) une ee ee 232
Nessie
Tom R. Halfhill (64 Version by Charles Brannon) ...... 240

Fea eleay GUE CER TERROR CURE RR I 255


A. A Beginner’s Guide to Typing In Programs ....... 257
B:.How.to ype In Programs” <4. . 1456006 esas Sen 259
C. The Automatic Proofreader
Charles Branton’ 0%; ee TUALS ane 261
D. Using the Machine Language Editor: MLX
Charles Branton, «1. « »«Wu 0 2v4.0 + ams ok 265
INEXoi, we s\s's Minsd 'e)s wn’ 9s diagp a ROR 273
Foreword
Games are an important part of almost every home computer
user's library. You may have bought your Commodore 64 to
keep track of your finances or to learn how to program. But if
you're like most people, you soon found out that computer
games were challenging, educational, and simply fun to play.
With its dazzling graphics, versatile sound chip, and large
memory, the 64 is the quintessential game machine.
COMPUTE!’s Second Book of Commodore 64 Games gives
you 16 games that make good use of those game-playing
capabilities. Several of these games have never been published
before; others are some of the best from recent issues of COM-
PUTE! magazine and COMPUTE!’s Gazette magazine. Each is
ready to type in and play.
There are simulations that put you in the fifteenth cen-
tury, rounding the Cape of Good Hope in search of trade
routes to India. Or let you run for the presidency. A text
adventure game, where you use words instead of a joystick,
gives you a dangerous prison, far in the future, to explore. Ac-
tion games put you in the cockpit of a Formula I racer, in a
superhero’s suit, or in a fishing boat besieged by sharks and
thunderclouds. There are even fast-action machine language
games with hyperactive aliens, the Loch Ness monster, or
speeding trails of light.
But just like COMPUTE!’s best-selling First Book of Com-
modore 64 Games, this collection isn’t merely for entertainment.
There are articles that detail how to write an adventure game
of your own and how to plan a videogame’s design. And be-
cause each program is listed for you to see, you'll be able to
examine the programmer’s techniques and perhaps pick up
methods to use in your own games. In fact, many of the arti-
cles include extensive explanations of how the games were
written.
Typing these games into your computer, even the ma- ;
chine language games, is easy when you use ; The Automatic
Proofreader’ and the “Machine Language Editor: MLX.” Both
are included in this book, along with instructions on how to
use them. They'll virtually assure that you type in the games
correctly the first time.
If you enjoy computer games, you'll find COMPL
Second Book of Commodore 64 Games filled with outstandir
examples of the best from COMPUTE! Publications.
games will provide you with hours of entertainment.
What more could a game player want?
l
Ideas,
Concepis,
and —
Applications
Thinking It
Through.
How To Plan A Videogame
Orson Scott Card

Designing and writing a videogame isn’t just programming. Before


you begin typing those POKEs, PEEKs, GOTOs, and GOSUBs, you
should have an idea of what your game will do, how it does it, and why.
You don’t create a videogame by just sitting down at the com-
puter and starting to write BASIC or machine language com-
mands. A videogame is a complex program, and if you don’t
think it through in advance, you’re begging for hours and hours
of needless revision and debugging—with a good chance that
you'll end up with a second-rate game.
But if you have a well-thought-out plan before you start
writing the first line of code, programming can be smooth and
pleasant.
The plan I’m talking about isn’t a matter of flowcharts and
diagrams and dull calculations. That’s the engineering approach
to game creation. It works for building bridges or CPUs, but
good games aren't engineered—they’re created.
The process of planning a game may seem much like day-
dreaming. You visualize the figures, the scenes, the objects on
the screen. You think of the way they move, the way they’re
controlled. What happens when they bump into each other.
How they change each other. It’s as though you leaned back in
your softest chair and spent a few hours telling yourself stories.
Or, to put it another way, you're play-testing a game that
hasn’t been programmed yet.
Every gamewright creates games out of his or her own
imagination; so no two games will ever be exactly alike, unless
one game designer is deliberately trying to copy another's
work, But the basic demands of designing are very similar from
game to game.
So let’s spend the next few pages planning a game to-
gether. At each stage, I'll remind you of how a particular arcade
game handled the problem, and then decide how the game
] Ideas, Concepts, and Applications

we're creating together will do it. At the same time, you'll un-
doubtedly think of things I didn’t think of, and by the time
you're through reading this chapter, you may well have a com-
plete game design of your own ready for you to sit down and
start programming. I hope so!

Getting the Idea


A videogame idea can begin almost anywhere. You might be
playing a conventional game and suddenly realize, “This could
be better on the computer.” So you begin to think of ways to
simulate baseball or a board game or charades on the computer.
It doesn’t even have to be a game. How would you duplicate
the work of a traffic cop and turn it into a game? Or a presiden-
tial election? (See the game “Campaign Manager” elsewhere in
this book for the answer to that question.) Games that are
based on conventional games or real-world activities are called
simulations.
You might notice a setting that is particularly dramatic: the
naked girders and beams of a skyscraper under construction;
the dramatic arroyos and mesas of the Arizona desert; the vast
distances and three-dimensional movements of outer space. It
doesn’t even have to be a setting that actually exists. The de-
signer of Joust may well have gotten his flying islands from see-
ing Roger Dean’s fantastic illustrations for the covers of Yes
albums. Once you have a dramatic milieu, or setting, you de-
velop the game from there: What could happen in this world
I’ve imagined?
You might start with a movement, or play mechanic, you
want to create. There are many different play mechanics al-
ready in use. For instance, the Pong-type games use paddle
controllers to move the player's figure instantly from one point
on a line to another. Many games use direct joystick move-
ment—move the joystick in a direction and the figure moves
that way on the screen. Others are much more complex, how-
ever. In Joust, a left-right joystick determines the horizontal
direction and speed, but because the figure is a knight mounted
on a flying ostrich, vertical movement is done by repeatedly
pressing a button that causes the ostrich’s wings to flap and the
bird to rise. No one had ever used this play mechanic before
and the game may well have begun with that idea. Similarly,
Mario Bros. introduced the ‘bump from beneath” play me-
chanic, in which the figure attacks enemies by getting one level

4
Ideas, Concepts, and Applications ]

beneath them, jumping up, and bumping into the floor the en-
emy is walking on. This is only a small variation from the Don-
key Kong play mechanic—yet it makes a huge difference in the
feel and play of the game.
There isn’t anything wrong in adapting ideas from other
games, as long as you make enough changes that the game be-
comes your own. It’s only natural for you to look at what an-
other designer did with a game and think, “Why wasn’t this .
done, too?” Donkey Kong, for instance, obviously owes a debt to
Space Panic, a ladder game, by way of Jump Man, which in-
troduced the press-the-button-to-jump play mechanic. But the
Donkey Kong designers got rid of the holes and added moving
obstacles—barrels and flames. The designer of Lode Runner (by
Doug Smith, for Brgderbund) also started with Space Panic—
you'll recognize the “stonework” floors and ladders—but he
went in quite a different direction from Donkey Kong. Hole dig-
ging was kept, but other features were added, and each new
screen became a new geometric puzzle. Both Lode Runner and
Donkey Kong stand on the shoulders of the earlier game, Space
Panic. But both are so different that they qualify as genuinely
new and creative games.
Wherever your game idea comes from, though, you will
eventually need to take all these things into account. You'll
have to come up with a play mechanic and a milieu and adapt
any real-world features that might be part of your game. And
since you have known and loved (and probably hated!) quite a
few videogames, you'll be borrowing or avoiding features from
other gamewrights’ work, whether you mean to or not.

The Story of the Game


Most fast-action games have a story, and since I’m a story
writer by profession, it’s hardly a surprise that this is where I
start my game designs. Some stories are pretty rudimentary, like
Space Invaders or Asteroids: The bad guys are coming, so either
shoot or get shot. Others are more complex, like the story line of
Donkey Kong: Ape catches girl, Mario climbs up and performs
insanely heroic acts until he reaches girl, ape falls down, and
girl kisses Mario. It’s the variety of obstacles, milieus, and ac-
tions Mario must perform that give the story line its complexity.
Let’s begin creating a game together—starting with a story.
You're a knight in a castle in the middle of a river, near the
enemy has sailed
place where the river flows into the sea. An
5
| Ideas, Concepts, and Applications

his fleet up the river and has anchored it around the castle, lay-
ing siege to your fortress. His primitive cannons are pounding
away at the castle walls, gradually wearing them down. Even if
you manage to survive the artillery barrage, you can’t get any
food supplies or ammunition into or out of the castle.
In the daytime, you can fight back by firing your four can-
nons at the enemy fleet. However, you have only a limited sup-
ply of ammunition. Every shot must count.
At night, you can put out a small boat and attach mines to
the sides of enemy ships, just under the waterline. When the
mines explode in the morning, any ships you've successfully
mined sink. During the night you can also use your small boat
to run the blockade, getting more ammunition from your
confederates on shore.
When your castle is worn completely away, or when your
little boat is sunk, you lose; when all the enemy ships are sunk
or so damaged that they sail away, you win.
Not much of a story. No characterization and the plot is
pretty repetitive. But that’s deceptive. The player supplies the
characterization. The main character is the player, of course.
And the player supplies the plot complications. In early plays of
the game, the guy in the little boat is going to be pretty clumsy
and slow, and the cannoneer in the castle is not going to be
much of a shot. But after a while, the boatman will be rowing
circles around the anchored siege ships, and the cannoneer will
score hits with every projectile.

How to Control a Cannon


Now that we have an idea, we need to expand on it, to think of
how it might actually play as a game. We started with an
idea—let’s go on to the play mechanic.
What does the player control? There are really two parts to
the game. In the daytime, the player controls the castle can-
nons. We'll make it a four-cornered castle, with a cannon in
each corner. He can aim and fire only one cannon at a time.
The cannon he’s firing will be white; the other three cannons
will be black.
How should he select which cannon he’ll fire? We could
have the player press the 1 key to fire cannon 1, the 2 key to
fire cannon 2, and so on. But that forces the player to take his
eyes off the screen and choose one of four different keys. Too
complicated.

6
Ideas, Concepts, and Applications ]

We could designate one key as the cannon select key. Just


press it, and the next cannon would be selected, proceeding
clockwise around the castle. That simplifies things—just one
key to select. But remember, there also has to be a way for the
player to aim the cannon and a way to fire it. That's at least two
more controls.
The simplest choice of all, at least for the player, is to have
the program automatically go from one cannon to the next. Fire
cannon 1, and cannon 2 is automatically selected; fire cannon 2,
and cannon 3 is then ready to fire. If cannon 3 is out of ammu-
nition, the program can sense that and skip over it. It’s simple,
because the player doesn’t have to do anything. He only has to
notice the color change to know which cannon he’s controlling.
Of course, it means that even if he wants to fire cannon 2
five times in a row, he can’t; he has to fire each of the others
first. But that just adds a little challenge to the game. You can
explain this by adding another element to the story: ‘The can-
nons have to cool down once they’re fired before you can re-
load them.”
There’s an even simpler solution, though. We can put a
central tower in the middle of the castle (the castle’s keep) and
put a single cannon on top of it. Then there’s no selection at
all. Just the one cannon, which you aim and fire until your gun-
powder runs out.

Simplicity
Four different ways to program the same basic idea. Which one
is best? I don’t know. I think the first two are too complicated
for a fast-action game, but you might not think so, and they
have the advantage of giving the player more freedom of
choice. I think the last one, the single-cannon solution, is
acceptable (and much easier to program), but having four can-
nons appeals to me more. If you left it just to my own pref-
erence, I’d choose the four cannons.
Does this choice seem familiar? It might. The arcade game
Missile Command had three missile bases, each with its own
supply of missiles. But when it was translated to the home ma-
chine, it was simplified: one base instead of three. We faced a
similar choice here. Time after time you will have to make such
choices between simplicity and complexity. —
You want a general rule? If you're a novice programmer, go
for simplicity—it’s easier to program.
] Ideas, Concepts, and Applications

You want another general rule? If you’re an expert pro-


grammer, go for simplicity. It’s also easier to play.
But I like the four cannons, automatically selected, better
than the single cannon in the middle of the fort. So I'll break
my own general rule and go for slightly more complex
programming—but never for needless complexity in playing.
Maybe that’s the best rule of all: Make it as tough as you want
on yourself, but keep the play mechanic easy on the player.

Aiming the Cannon


All this, though, and we haven’t even decided how to aim the
cannon!
We could have the player type in the coordinates on the
screen where the cannon is aiming. But that’s very complex and
way, way too slow. We could use the joystick to choose one of
eight directions. But what if the target isn’t in one of those eight
directions?
I go for the rotating cannon. Press down the Cursor Left-
Right key, and the cannon rotates clockwise. Let the key up,
and the cannon stops rotating. Wherever it’s pointing when you
stop is where it aims. It will take only a little trial and error for
the player to learn to aim pretty exactly. (However, rotating
cannons will mean we have to have as many different cannon
shapes in memory as there are possible directions to aim! Every
decision has a cost.)
Press another key and it fires. Done. Two keys, one to
aim, one to fire.
But wait a minute. In the real world (this is partly a
simulation, remember) cannoneers also have to determine
range. They control range by deciding the elevation of the gun
and changing the amount of gunpowder in the charge. You
could control that by... .
Forget it. This is a game, not an artillery textbook. If you're
a cannoneering purist, you might want to go through the agony
of programming all the math. But you'd better find another
purist to play it, because the game will be complex and slow.
As far as I’m concerned, I'll let an imaginary cannoneer figure
the elevation and charge. As long as the player selects the cor-
rect horizontal aim, the cannonball will automatically go just
the right distance. Another victory for the simple approach.
Ideas, Concepts, and Applications ]

The Computer Control Movements


There are other play mechanics to worry about. First, the
movement of the enemy ships. Do they just stay in the same
place, or do they move? Do they always appear in the same
places every time you play, or are their places randomly
chosen?
There are many different options, but my choice would be
this: The program will define 20 or so areas, each of which
might hold a ship. By defining these areas, we can be sure none
of the ships will overlap. However, we'll start with only five
enemy ships. The program will randomly decide which areas
will be a slightly different arrangement of the enemy ships
from the time before. That will help keep the game interesting
and challenging.
If we were programming in machine language, it would be
a simple matter to assign each ship its individual course around
the castle and then let it move in a regular pattern. At machine
language speeds, you could keep a dozen ships moving without
slowing down the game. In BASIC, however, each ship move-
ment would slow down the game. And since I just decided this
will be an all-BASIC game, we can’t have the ships move.
At least, not constantly. Anything that happens constantly
adds to the amount of time that passes after the program has
checked for the player’s instructions and before it checks again.
The less often the program checks for the player’s instructions,
the slower and less responsive the game will feel. Too much of
that, and it isn’t a fast-action game anymore!
But we can have occasional movement of the ships; the
story provides a perfect excuse. The current of the river always
pushes the ships downstream, but as the tide flows upriver, the
current moves in the opposite direction. The tide flows twice
each day, once in the daytime and once in the night. When the
tide flows, the ships swing around so that they are on the up-
river side of their anchors. When the tide ebbs and the river’s
current takes over, the ships swing around to the downriver
side of their anchors.
That means that half the day all the ships will face one
way, and half the day they'll face the other. It’s a simple
change, but it adds to the completeness of the milieu;itsup-
ports the story, and it helps the realism of the simulation.
] Ideas, Concepts, and Applications

Controlling the Boat


In a two-phase game like this, it’s good if the two phases can
be controlled in a similar way. For instance, we can let the same
key that rotates the cannon for aiming also rotate the boat.
Press the Cursor Left-Right key and the boat rotates counter-
clockwise. Press the key we used to fire the cannon, and the
boat leaves behind a mine.
We’ve got directions and mine-laying taken care of, but
what about movement through the water. We need a third con-
trol, to give the boat speed. We could steal a page from Joust
and let the oars move each time we press a certain key—the
space bar, for instance. Each time we press the bar the boat
gives a surge in the direction we’re pointing the boat. If the
boat is going against the current, the surge is weaker; if with
the current, the surge is much stronger. And if we don’t row at
all, the boat will drift in the direction of the current. If the boat
leaves the screen, it’s gone!
That’s one solution. If I were working in machine lan-
guage, it’s the one I’d probably use. There is a simpler choice,
however. You could use a joystick throughout the game. Dur-
ing the cannon phase, pushing the joystick in any direction
makes the cannon rotate, and pressing the fire button makes it
fire. In the boat phase, however, the boat moves exactly in the
direction the joystick points and keeps moving in that direc-
tion as long as the joystick is pushed. The fire button attaches
mines. This has the virtue of being simpler. Also, since the
boat can move only in either four or eight directions, depend-
ing on whether you allow diagonals, you need to have onl
one boat shape for each direction. Programming and play will
be much easier. It was important to have the cannon be able
to aim in many different directions because it couldn’t move, it
could only aim. Since the boat can move around, having only
four directions of movement isn’t a serious limitation. And we
can keep the tidal drift in both versions.

The Planning Outline


I’ve gone into a lot of detail up to this point in order to show
you what the thought process can be like—how many options
you can think of and reject and the reasons for some decisions.
From now on, so that this article doesn’t become the whole
book, we’ll move much more quickly through an outline of the

10
Ideas, Concepts, and Applications ]

decisions that need to be made. You can use this outline for al-
most any arcade game plan.
Play mechanic. What does the player control in the game,
and how? (This is what we've already discussed; we ended up
with a cannon and a boat in the different phases of the game,
both controlled with a joystick.)
Simulation. In what ways does the game correspond to
real-world activities? To what degree can you duplicate reality
without making the game too complex to play? (This was when
I decided to let the cannon aim, but not determine range, and
when I decided to use the joystick to move the boat in only
four possible directions.)
Milieu. What is the setting? What do we see on the screen
besides the moving figures? This is more than just decoration. If
you have an airplane game, clouds drifting across the screen
add to the illusion of reality. It makes the player feel more like
he’s really flying. (In our game, let’s make the flow of the river
left to right. That means that the banks of the river will be
across the top and bottom of the screen. By using character
graphics, we can PRINT each shore in a single string! The castle
will be right in the middle, but because the TV screen is wider
than it is tall, the castle will be rectangular, too. It will be a top
view, as a bird sees it.)
Missiles. This is a generic term. The player's figure is the
screen object whose movement the player controls. Once a mis-
sile is launched, however, the player has little or no control
over it. The missile can be the ball in a football or baseball
simulation, the bullet in a shoot-out, or even the player-figure’s
fist if it can be “launched” against an enemy. (The only missile
we use is the ball fired by the cannon, which goes straight in
the direction it’s fired until it either hits an enemy ship or goes
off the screen.)
Collisions. What happens when the player-figure bumps
into something on the screen? The figure can respond to the
object it bumped into as if it were:
1. Transparent. The figure just keeps going as if the object
weren't there.
2. A wall. The figure can’t move any further toward the object,
but if it collides at an angle, it can slide along it.
3. A tar baby. Once the figure touches the object, it’s stuck
there.

11
| Ideas, Concepts, and Applications

4. A bomb. Touching the object is deadly.


5. A billiard cushion. Touching the object makes you bounce
off at an angle.
6. A balloon. When you touch the object, it disappears, but
you're just fine.
NOTE: The same responses are possible for missiles.
During the boat phase, the shore and the castle are walls—
the boat can slide along them. However, the enemy ships are
tar babies—when you touch one you stick until you attach a
mine and release yourself. The ships are then marked, and at
the end of the nighttime phase, all the mines explode at once.
During the cannon phase, only the cannonball treats the
ships as balloons—they explode when the ball hits them but
everything else is transparent. Since I don’t want the game to
be that easy, the castle and the shore are also balloons if the
cannonball is fired so that it collides with them. You yourself,
by clumsy aiming, can destroy the castle and the shoreline.
This means that when you go to the shore to replenish your
supplies, it might not be there anymore. And if you’re really
clumsy, you can help the enemy finish off your own castle.
But what about the enemy’s cannonballs? To save
programming headaches, let’s eliminate them. Instead, from
time to time a randomly selected, character-sized piece of the
castle will explode and disappear, leaving bare rock behind. It
can be assumed that an enemy cannonball hit that spot.
Reward and punishment. Games are like life. You obey
the rules because when you do, “good” things happen, and
when you don’t, “bad” things happen. The most common re-
ward is the score—it gets higher each time you do the “good”
things, like blasting the enemy out of the water. There are other
rewards, however. Story awards, for example. In Donkey Kong,
Mario gets the girl. There are also puzzle awards. Just solving
the problem on one level, so that you can finish it, is very
rewarding. The best games have scores, story rewards, and puz-
zle rewards.
(In our game, if you don’t ever get the enemy ships, they’ll
wipe out your castle. If you do get them, you get points and
eventually complete the screen by forcing the enemy ships to
go home or by sinking them all. The scoring is fairly complex.
Every time one of your castle blocks is destroyed, you lose
points; if one of your cannons is blown up, you lose the cannon
and a lot more points. However, you get some points just for
12
Ideas, Concepts, and Applications ]

staying alive, and for the number of cannonballs you have left
at the end of a game “‘day.”)
Communication. The player needs to be told a lot of infor-
mation during the game. Did my missile hit its target? Did the
enemy score a hit against me? What in the world am I sup-
posed to do? Which object do I control? The single most useful
tool you have in communicating with the player is sound. Dif-
ferent sounds mean different things—and you don’t have to be
watching a particular spot on the screen to get the message.
However, explosions and movement also communicate. You'll
also use displays of numbers on the screen to tell the player his
score—numbers or little pictures (icons) to show how many
“lives” the player has left. You'll want introductory and closing
screens to give more involved messages or tell part of the story
in words.
(In our game, a popping sound says that the cannon has
been fired or the mine has been attached; a low “boing” says
that a piece of the castle has been blown up; a swishing sound
says that the tide is about to change; an explosion says that a
ship has been hit; a much louder, long one, followed by a glug-
glug sound, says that a ship has sunk; and sad and happy mu-
sic signify defeat and victory. Explosions are shown by making
a character flash white several times. The score is constantly
displayed on screen.)
Win-lose conditions. The game has to end sometime, even
if you’re ending only a current level. You have to decide what
conditions end the game, and then check from time to time to
see if those conditions have been met. The simplest way to do
this is to have a variable—xXxX, for instance—that usually has a
value of 0. Then, in any subroutine that has the power to end
the game (usually a collision subroutine or a timer subroutine),
XX is set to 1 for defeat and 2 for victory. A line in the main
loop reads ON XX GOTO 900,920. That jump will occur only
when it’s time for the game to end. But because it occurs only
from the main loop, it’s much easier to end the FOR-NEXT
loops you might be in at the time.
(In our game, you can lose when all four of your cannons
or your entire castle is destroyed, or when you've used up all
your ammunition and mines without destroying the entire en-
emy fleet. You can win by scoring a certain number of cannon-
bali hits against the enemy and/or by sinking a certain number

13
] Ideas, Concepts, and Applications

of ships and/or by staying alive until the enemy runs out of


ammunition.)
Levels. Computer games almost always go on forever.
When you meet the win conditions, the game starts over, but
it’s harder. This allows a novice to get the hang of the game
without getting instantly destroyed, while more experienced
players still find higher levels more challenging.
(In the early levels of our game, the enemy will have less
ammunition; the player cannot blow up parts of his own castle;
there are fewer enemy ships so that the enemy fires less often
and the player can blow up all the ships more easily; and the
enemy cannot hit the player’s cannons. These features are
changed with each level, until at expert levels the player
doesn’t have enough ammunition to survive without picking up
some from the shore and bringing it back; there are as many
enemy ships as can fit on the screen without overlapping; the
player can damage himself; the cannons can be blown up; the
current in the river is stronger, making it harder to control the
boat; and the enemy ships can withstand more hits from
cannonballs before they have to go home to repair the damage.)
Animation. If you're particularly ambitious, there are a lot
of extras you can add to enhance realism. These things don’t
actually affect the play of the game, but they do make it more
fun to play. Simple animation of figures on the screen is easy
enough, using either sprites or custom characters, and it can be
done with almost no reduction of playing speed. However, you
can also add much more complex animated sequences when
play action is stopped. These are like small movies that help
support the story—like the opening sequence of Donkey Kong in
which the gorilla carries the kicking girl up the ladders—or
make the milieu complete and believable—like the riderless os-
trich in Joust that must make its way offscreen after the knight
is defeated before they can reappear together on a platform.
The game would play just as well without these extra se-
quences, but some of the fun would be gone.

Translate the Plan into a Program


This is where the fun turns into work. You've jotted down your
ideas, you've play-tested the game in your imagination, you're
satisfied that it’s wonderful, and you can’t wait to play.
- Now you've got to stop and do your homework. Not fun at
all.

14
Ideas, Concepts, and Applications ]
TREATS ieTAC SRT a ne

Setting Up Video Memory


How large should the castle be? The screen is 40 characters
wide and 25 characters high. Subtract a row at the top and the
bottom for the shoreline, and a column at the right that we
won't use, because PRINTing characters in the rightmost po-
sition on a line can mess up the lines below. To leave room for
maneuvering, the castle will be only 5 characters high and 9
characters wide. Each corner tower will be a 2 X 2 square,
and each cannon will be a sprite. The cannons can point in 16
possible directions, animated by changing the shape-table vec-
tors at the end of the screen memory. The player-controlled
boat will also be a sprite, with 4 possible positions. The en-
emy ships will be complex custom characters—each ship will
be made up of 2 characters put together. They will be
PRINTed on the screen as strings. They will usually face either
left or right, and all the ships will change direction together,
which greatly simplifies animation of the direction changes.
To make all of this work, you need to map video memory
and design your character sets and sprite shape tables before
you even begin to program. Lots of tedious calculation, chang-
ing dots into bits and bits into decimal numbers, loading dif-
ferent shape table vectors into arrays that correspond to direc-
tional numbers.
And that’s the easy part.
Setting Up the Main Loop
You need to design the program so that the main loop does as
little as possible. The less the main loop does, the more often
it repeats, and the faster the game plays. .
This game is a little more complex because it has two
main loops, one for the daylight phase and one for the night-
time phase. A timer decides how long each phase lasts. Both |
main loops must check, from time to time, to see if the time is
up and the tide should change or the phase should end. —
What needs to be in the main loop? Always, the routine
that gets instructions from the player. In the daylight phase,
we check first to see if a cannon was fired. If yes, then jump to
the subroutine that carries the cannonball to its target, where
there either is or isn’t an explosion. In machine language, we
could let the player start aiming or firing the next cannon
while the cannonball kept moving, but in BASIC it’s better to
make the player wait for the cannonball to hit before letting
15
] Ideas, Concepts, and Applications

him fire again. BASIC would lose too much speed trying to do
it all at once.
If the player didn’t say to fire, then we check to see if he
wants to aim. If so, we jump to the subroutine that moves the
cannon.
When that’s over, we check to see if it’s time for an en-
emy ship to fire again. If it is, we jump to the other main loop.
Otherwise, we go back and start over. Simple enough—the
main loop will be fast and tight.
The main loop for the nighttime phase is not so tight. The
fire button only places a mine (there’s no missile to keep track
of), but movement is more complex. The cannon can never
run into anything, but the boat can run into enemy ships, the
shore, or the castle. The main loop must check to see if the
player wants to move. If so, we jump to the movement sub-
routine. The subroutine checks to see if the boat has bumped
into anything, and if so, what. It might jump to one of the
routines that handle collisions, and the movement is changed
accordingly. Also, there is the pull of the current that can
gradually move the boat whether the player wants it to move
or not. This can’t be executed every time through the loop, or
the player will never be able to row against the current. Fi-
nally, we check for the end of the phase and close the loop.

Planning for All the Subroutines


Programming goes much more smoothly if you’ve decided
before you start what subroutines you'll need and where they
will be. It helps you keep track of what’s going on if you put
related subroutines near each other. For instance, in a BASIC
program you might want to have all the sound subroutines be-
gin in the 900s, and all the collision subroutines in the 800s.
I usually start every subroutine or group of subroutines at
an even 100 line number. Let’s chart all the routines that we'll
need in this game program.
0-99 Initialization. These lines jump to the setup routines
and set certain parameters. They're executed only once.
100-199 Daytime phase main loop. These lines check for
the player’s instructions, jump to the aim or fire routines if
necessary, then check the timer for the end of the phase.
200-299 Fire routine. These lines are executed only if the
player has pressed the fire button during the daytime phase
main loop. First the routine checks to see which cannon has

16
Ideas, Concepts, and Applications ]

been fired and what direction it is firing. Then it moves the


cannonball in that line, checking each new character it crosses
to see if it has collided with anything. If it collides with a ship,
it jumps to the ship explosion routine. If it collides with the
shore, it jumps to the shore explosion routine. If it collides
with the castle, it jumps to the castle explosion routine. If it
reaches the edge of the screen without collisions, the cannon-
ball disappears and we return from the subroutine. In any
event, whenever the cannon fires, we also execute the de-
crease ammunition routine.
300-399 Ship explosion routine. Accessed only from the
fire routine, these lines subtract something from the ship’s
“strength” value, which starts out higher in the harder levels.
If the ship’s strength is 0 or less, we jump to the sinking ship
routine. If the ship’s strength count is above 0, we execute the
explosion sound and flash the colors of the ship, cancel the
missile’s movement, jump to the score change routine, and re-
turn to the daytime phase main loop.
400-499 Shore explosion routine. Accessed only from the
fire routine, at the easier levels these lines do nothing but end
the missile’s movement and return to the daytime phase main
loop. At higher levels, the shoreline character is flashed while
the explosion sound is executed, then the shoreline character is
removed.
500-599 Sinking ship routine. Accessed from either the
ship explosion routine or the tidal change routine, this animated
sequence causes the ship to sink, decrements the count of ships
by one, executes the glub-glub sound, jumps to the score
change routine, and then returns to the current main loop.
600-699 Aim routine. Until the joystick is no longer being
moved or the fire button is pressed, the current cannon is ro-
tated. This is done by flipping from one cannon sprite shape
to another. The same variable that indexes the sprite shapes
also indexes the direction variable, which is used in the fire
routine. If the joystick is released, we return to the daytime
phase main loop; if the fire button is pressed, we jump to the
fire routine, then return to the main loop.
700-799 Score change routine. This routine can be
accessed from many points, but the score change variable _
must already be set. The value of the score change variable is
added to the current score (a negative value will, of course,
subtract from the score) and the new score is displayed on the ©
screen.
17
] Ideas, Concepts, and Applications

800-899 Tidal change routine. This routine stops all


other action while the ships swing around from their old po-
sitions to their new positions. The current flow variable is set
to either left or right (—1 or 1). Then we check to see if the
changing tide has caused a collision between a ship and the
player’s boat. If yes, we jump to the sunk boat routine. If it is
also time to change from one phase to another (which will
happen every second tidal change), we set the phase change
variable, which causes one main loop to jump to the starting
point of the other. If the tidal change is the beginning of a
new daylight phase, check all the enemy ships. If their mine
set variable is on, then execute the sinking ship routine for
that ship.
900-999 Enemy shots routine. These lines select a ran-
dom location on the perimeter of the castle. If the chosen
character is bare ground—that is, if the chosen castle section
has already been exploded—there is a chance that the next
castle section inward will be selected. If that castle section has
also been selected, then there is a chance that the next castle
section will be selected, and so on. Anytime the random
choice decides not to select the next castle section, we jump to
the castle explosion routine. If the chosen castle section is also
an ammunition storage location, we jump to the decrease
ammunition routine. At higher levels, if the chosen castle sec-
tion is also directly under a cannon, we jump to the blow up
cannon routine. The odds of the next castle section being cho-
sen change, making the selection more likely at higher levels,
which will have the effect of wiping out the castle faster.
1000-1099 Decrease ammunition routine. This decreases
the supply of cannonballs during the daylight phase and the
supply of mines during the nighttime phase. If the amount of
ammunition reaches 0, then the player can’t fire (or attach
mines) until the supply is replenished by a visit to the shore.
1100-1199 Castle explosion routine. This causes the se-
lected castle section to flash and disappear, leaving bare earth
behind. (Actually, it’s tempting to have water characters re-
place exploded castle sections, so that the castle appears to be
eaten away by the river as well. Something to think about.)
The oops sound executes.
1200-1299 Blow up cannon routine. These lines cause a
cannon to flash, crumble, and vanish. That cannon is removed
The explosion sound and the oops sound are executed. If it
18
Ideas, Concepts, and Applications ]

was the last cannon, the lose-the-game variable may be set—


we can decide later.
1300-1399 Nighttime phase main loop. These lines check
for player instructions. If the player calls for boat movement
(joystick is pushed), jump to the boat movement routine. If the
player doesn’t call for any movement, check the timer to see if
a tidal change is in order; if so, jump to the tidal change rou-
tine. If not, go back to the beginning of the loop.
1400-1499 Boat movement routine. In this routine try to
move the boat in whatever direction the player has requested.
If there is a collision with anything but a water character,
jump to the boat collision handler. If the movement takes the
boat off the edge of the playing area, jump to the lost boat
routine. Otherwise, execute the movement and return to the
nighttime phase main loop. Remember that if the movement is
either diagonally or directly with the current, it is tripled, and
that if it is diagonally or directly against the current, it is
halved. Therefore the normal movement increment should be
two scan lines or color clocks.
1500-1599 Boat collision handler. Test to see what you've
collided with. If it’s a ship, jump to the ship bump routine. If
it’s the castle, jump to the castle dock routine. If it’s the shore,
jump to the shore dock routine.
1600-1699 Ship bump routine. The only movement that
can take the boat away from contact with the ship is the exact
opposite of the joystick movement that caused the collision.
The only other way to release the boat is to attach a mine.
These lines cause a low humming noise and constantly check
to see if the player wants to attach a mine or back out of the
way. If the player backs away, execute the backing movement
and return to the nighttime main loop. If the player attaches a
mine, check to see if there are any mines. If so, turn on the
mine set variable for that ship: MS (shipnumber)=1. If there
are no mines left, ignore the request. Once a mine is set, the
player is free to move away and the humming stops. _
1700-1799 Shore dock routine. If the boat has no mines,
its mine supply is renewed. If it has any mines at all, the boat
is loaded with cannonballs—the boat-loaded variable is set to
1. The swishing sound is executed and the boat is pushed
away from shore automatically. We return to the nighttime
main loop.

19
] Ideas, Concepts, and Applications

1800-1899 Castle dock routine. If the boat-loaded vari-


able is set, the ammunition variable is increased and the blip
sound is executed. The number of cannonballs added depends
on the level. Whether the boat was loaded or not, the boat is
pushed away from the castle and the swishing sound is
executed.
1900-1999 Sunk boat routine. The boat sinks under the
water and disappears; either we jump to the daytime phase or
we set the player-loses variable—we can decide that later.
2000-2099 Sound routines. These include the glub-glub,
explosion, oops, blip, and swishing sounds.
2100-2199 Player loses routine. The player has lost a
“life.”” Check to see how many lives remain and either go to
the closing routine or next life routine.
2200-2299 Player wins routine. The player has completed
the level (sunk all enemy ships or inflicted intolerable damage
on the fleet). Add 1 to the number of lives left, do a score
change, raise the level by 1, and do the next life routine. (If we
want, we can also make the enemy ships sail away.)
2300-2399 Closing routine. PRINT the final score and any
final messages. Update the high score and PRINT it; ask the
player if he wants to play again. If so, reset variables to 0 (ex-
cept high score) and start the program near the beginning. If
not, restore video memory to its normal configuration and
END.
2400-2499 Next life routine. These lines duplicate many
of the functions of lines 0-99, except that some initialization
routines don’t need to be repeated—like defining the character
set and setting up video memory. At the end of this routine we
jump to the beginning of the daytime loop.
2500-2599 Video memory. Executed only at the beginning
of play, this routine sets up the character sets, sprite shapes,
and screen memory.
2600-2699 Screen setup. The original castle is set up as
one or two strings to be PRINTed all at once. Likewise, the
two shores are set up in strings.
2700-2799 Fleet setup. The enemy ships are assigned their
locations—how many there are depends on the level. If we
want to, we can animate their arrival.
2800-2899 Player setup. The player’s cannons and boat
are put on the screen.

20
Ideas, Concepts, and Applications ]

2900-2999 Initialize variables. The lines from 2900 to


2929 set the values of variables that are only set at the begin-
ning of play. The lines from 2930 to 2959 set the values of
variables that are reset when the game is restarted. The lines
from 2960 to 2999 set the values of variables that are reset at
the beginning of a life.
3000-? DATA statements. These lines contain the charac-
ter shapes and sprite shapes used in the setup routines.
This outline of subroutines is still pretty rough—a lot of
refinements would be needed during the actual programming.
However, by laying out this kind of plan in advance, you
would know where to find the major routines and have a good
reminder of what routines you need to write. Some of these
routines would use only a few of the 100 possible line num-
bers. Others might be much more tightly packed within their
hundred-line range. Still, you'll always know that routines
start on even-hundred line numbers, which makes a search
much easier. Want to see all the lines in the sunk boat routine?
Check your plan, find that the routine starts at line 1900, and
you simply type LIST 1900-1999. This subroutine outline may
not sound like much, but it does give you a great deal of con-
trol over the programming process.

Naming the Variables


Many of your routines will need to use the same variable to
get information. The timer variable may be used by many dif-
ferent routines; the directional vector that is used in the can-
non aiming routine will also be used in the cannon firing
routine to decide what direction the projectile should travel.
The best way to keep track of the variables is to name them
and write them down so that you can refer to them again and
again as you program. You also need to decide which variables
are arrays, so that you can use other variables as indices into a
table—I’ve sometimes had one integer array variable indexing
another, which was used as the index in a string array—all of
them indexed by a loop control variable and a directional
variable.
If this sounds hopelessly complex, don’t worry. Reading
about it is complex. Sitting down and doing it is much easier.
Of course, doing it so that the program actually works—
that’s hard, which is why so much of a programmer's time is
spent figuring out why it doesn’t work and fixing the bugs.
21
| Ideas, Concepts, and Applications

Getting Back to the Real World


In the real world, you'll never plan everything in your game in
advance. You may think you've got it planned, but once your
mind is working, it doesn’t stop. You'll have more ideas in the
middle of programming, or you'll run into a programming hur-
dle you don’t know how to get over. You'll start to improvise,
and the plan will begin to bear less and less resemblance to
what you end up with.
Don’t worry, though. It’ll be much better than the plan.
Yet without the plan, many of the eventual improvements
would not have been possible.
The point of planning ahead is not to build a dam to
block your creativity from flowing. Instead, you dig a channel
into which your creativity flows, like a stream. When that river
gets too strong, it jumps the bank or creates bayous along the
edges. But the channel helps it flow strong and deep. When
you have a clear idea of where you’re going, you have a much
better chance of getting there quickly.
In fact, so much creation goes on after the initial planning
is done that I’d be willing to bet that every person who reads
this chapter could set out to program a game that followed my
plan perfectly—and no two games would look or play alike. In
fact, I’d expect that many games would look and play so dif-
ferently that an uninformed observer would never suspect that
they began from the same plan.
Your own games may be much simpler than this one, or
much more complex. The most important thing is to design a
game that you would love to play—if your heart isn’t in it,
your game won't be any fun. You can’t fool the players.
And when you're through planning and programming
your game, you'll know the secret: Game designing is the best
videogame of all. No matter how brilliant your game is, no
one will ever have as much excitement and frustration and
satisfaction and fun playing it as you had in creating it.

22
2
Text
Adventure
Games
Puzzles, Palaces,
and Pilgrims
Writing Text Adventures for the
Commodore 64
Gary McGath

Programming text adventure games, those popular interactive games


where you communicate to the computer through words, is an art in
itself. It’s not quite the same as creating an arcade-style videogame.
Here, Gary McGath, who has written a book on just this subject, ex-
plains some of the basics of writing text adventures.
A text adventure is an interactive computer game in which the
player assumes the role of a character in a story. As the player,
you control the character’s actions by typing in commands,
and the computer responds with a text description of what
your character experiences.
The world of most text adventures is composed of a num-
ber of rooms, or locations. Your character moves from place to
place, or from room to room, where objects or other characters
may or may not be found. Sometimes these objects and
characters aid you, other times they’re dangerous. By using the
appropriate commands, you can pick up, examine, and even
use these objects and characters.
While professionally written adventure programs often
comprehend complicated sentences as commands, many
adventures get by with simple two-word commands. The
vocabulary of even the best of them is quite limited, and they
have to indicate to you whether they “understand” any
particular command.
The following dialogue is typical of a text adventure.
(Your commands are printed in boldface and the computer's
responses in normal text.)
You are in a small room lined with shelves. There are doors to
the north and west.
There is a gem on the shelf.

25
2 Text Adventure Games

Take gem

Your hand is stopped by an invisible shield around the gem.

Examine shield

I don’t know the word shield.

North

You are in a north-south hallway.

Writing a text adventure offers you a chance to exercise


your imagination and set up logical puzzles for your friends. It
requires no special screen formatting or sound effects, and the
program is doing nothing between moves; these facts make
text adventure programs easy to debug. And once you've writ-
ten your first adventure, you can do more of them just by
changing the rooms and puzzles in your old program.

Mapmaking
While the first steps in designing a text adventure are to create
the story line (what will happen) and the milieu (where things
will happen), we'll assume you've already done that. (To get
an idea of how to create the story line and milieu, read
“Thinking It Through: How to Plan a Videogame” elsewhere
in this book.) We’ll be concerned mainly with the actual
programming techniques you'll use, as well as some of the
more practical design processes in this article.
Once you’ve decided on what your world is, and what
will happen in it, you need to design a map of the rooms.
(Remember that they don’t have to actually be rooms; we're
using that as a generic term. They can be places on a road,
paths in a forest, or even corners of a field.) Draw a map with
a box for each room and connecting lines labeled with the
directions that lead from one room to another (north or south,
for instance). Give each room a number and a short descrip-
tion. The room in which the character starts should be room 1.
Figure 1 shows the map of an example text adventure game.

26
Text Adventure Games 2

Figure 1. The Adventure’s Map


20 17 21
Queen's E W E King’s
Bedroom Bedroom

24
D Tower

22 23
Guest E South W Guest
Room 2 Hallway Room 1

8
Armory EW End of E W Art
North Gallery
Corridor

9 4 10
Royal E W North Council
Treasury Corridor Chamber

U |N

2 3 il
Courtyard [E Wj} Castle EW} Entry EW! Chapel
Gate Hall

s s
N
12 6 13
Kitchen E WwW South EW Dining
Corridor Room

4 s
N
16 15
Dungeon E W Dungeon Servants’
Entrance Quarters
X
2 Text Adventure Games ~~

Objects, Verbs, and Consequences \


In this planning stage, you also need to make several other de-
cisions. Choose the objects that will be in the adventure and
where each will be initially located. Some objects might not be
in any room at all until the player does something to make
them appear. You should also assign numbers to the objects.
Your program also needs a list of the verbs that will be
accepted as commands. Certain verbs (or words that function
as verbs) are almost mandatory, such as NORTH, SOUTH,
EAST, WEST, TAKE, DROP, EXAMINE, LOOK, INVENTORY,
and QUIT. Other verbs that might be helpful include ENTER,
CLIMB, SHAKE, MOVE, TURN, FIGHT, OPEN, EAT, DRINK,
CLOSE, and READ. Abbreviations, such as I for INVENTORY
and N for NORTH, are easier for the player to remember and
use. Allowing the use of equivalent alternatives, like GET and
TAKE, which should mean the same thing, can reduce player
frustration. Remember, the difficulties in an adventure should
come from the logical puzzles, not from figuring out how to
talk to the program.
What consequences do specific actions have? Will opening
a box reveal a gem, or will it set off an explosion? Will press-
ing a switch start a machine? Will magic words transport the
character into a new room? Consequences could include
appearances and disappearances, changes in the character’s
abilities, alteration of the paths between rooms, and trans-
portation from one location to another.
Some actions may have special consequences only under
restricted circumstances. A special tool may be needed, such as
a crowbar to open a crate. If this tool isn’t in the character’s
inventory, the action won't have the desired effect and might
even backfire.
Things may happen independently of the player’s actions
as well. A troll might be wandering around the adventure’s
world. Or the character’s lamp might go out after a certain
number of moves.
When you've considered all these things and made your
choices, you know what you want the adventure to do. Only
now should you worry about the details of the program. As
you discover what's easy to program and what isn’t, you
might change your mind about what features to include. But
just as when you program any game, you should start with an

28
Text Adventure Games 2

overall plan. It will save you countless hours of wasted time


later on.

Assigning Variables
Now you're ready to actually begin programming your text
adventure game. We'll go through the process step by step,
outlining and illustrating exactly how to do it.
The first step is to to assign variables to the important
parameters of the adventure. It’s easier to remember what
these variables mean than it is recall a number; using these
varables also makes it simple to alter the program if you later
decide to change the parameters. One of the first statements of
the program, even before the DIM statements, should look
something like:
18 NR=21:NV=14 :NO=16:NI=19 :ND=6
NR is the number of rooms, NV the number of verbs, NO the
number of objects, NI the number of items, and ND the num-
ber of different directions the character can move in. (Note:
An object is any word that can be used as the second word of
a command, whether it corresponds to a physical object or
not. An item is an object that is located in a room; it usually
designates a physical object.)

Adventure Arrays
Next you need to translate the layout of your adventure into a
set of data structures. Let’s look at each of the required struc-
tures and the purpose it serves.
Access array. This is the translation of your map into
terms the computer can understand. It’s defined by the
statement:
DIM AC(NR,ND)
To use the access array (AC), the directions in which the
character moves must be translated into numbers. Let’s as-
sume the following translation:
North =] South = 2
East =3 West = 4
U =5 Down = 6
The value of AC(NR,ND) specifies which room is reached by
going in direction ND from room NR. If this value is 0, it
means the character can’t go that way from that room.

29
2 Text Adventure Games

Room description array. This array is defined by:


DIM RD§$(NR)
Each of its entries is a string that gives the description of the
room— for example, ‘You are standing on a wide bridge.”
Room flag array. Flags are indicators of whether a con-
dition is true or false. A flag takes only 1 bit, so you can have
up to 16 different flags in the room flag array. The array is de-
fined by:
DIM RF(NR)
The different flags are defined as powers of two: 1 might in-
dicate that the room is too cold, 2 that magic works, and 4
that water is present. The value of RF(R) for room R consists
of the logical OR of all the flag values that are true for that
room. If a room is cold and allows magic but doesn’t have any
water, then its entry in the array would be a 3 (1 OR 2).
Verb array. This is an array of the possible first words of
commands, defined by:
DIM VBS$(NV)
You should decide how many letters in a word are going to be
significant and chop the verbs in this array down to that size.
For instance, if two letters are significant, then TAKE must be
stored as TA. It’s a good idea to limit the number of signifi-
cant letters, so that two-fingered typists have less work to do.
Many simple adventure games designate only two letters as
significant.
Object array. This is an array of the possible second
words of commands, (objects) defined by:
DIM OB$(NO)
Once again, all words in this array should contain only as
many letters as are significant. °
Verb token array. This serves to translate verbs into num-
bers. It is dimensioned by:
DIM VT(NV)
The entries in this array correspond to entries in the verb ar-
ray. The values stored consist of numbers from one to the
number of distinguishable verbs in the game. This number is
normally smaller than NV, since similar verbs such as GET
and TAKE, or NORTH and N, are not distinguishable. If
VB$(2)=""N” and VB$(3)=“"NORTH”, then VT(2) and VT(3)

30
Text Adventure Games 2

will have the same value. This lets the program be indifferent
to the word that was actually typed.
Object token array. This array translates the second word
of a command into a number. It is defined by:
DIM OT(NO)
Its elements correspond to the object array. However, the ele-
ments can be a little trickier than the verb token array’s ele-
ments. Remember that not all objects are items. It’s convenient
to have the object tokens fall into two series. Items, which are
objects that have a particular location, can be numbered from
1 to NI. Other objects, including directions and magic words,
can be numbered starting with 101. This makes it easy to add
new items without disrupting your numbering system.
Item description array. This contains a text description
for each item. Its definition is:
DIM IDS$(NI)
The text description of an item could be the same as the word
in the object array for it, but often is a little more. For in-
stance, the object array might have the word LAMP for an ob-
ject described in the item description array as “Old oil lamp.”
Item location array. This locates each item and is
defined by:
DIM IL(NI)
There are three possibilities for where an item is located. It
could be in a room, in the character’s inventory, or nowhere at
all. The third case indicates an item that’s been destroyed or
one that’s not yet available. A positive number in the item
location array indicates which room the item is in. A zero says
that the character is carrying the item. A negative one specifies
that the item isn’t to be found.
Item flag array. This, is similar to the room flag array in
concept, except that it specifies conditions that are true or false
of items rather than rooms. It is defined by:
DIM FI(ND
(It would make sense to call the array IF, but that’s a reserved
word in BASIC.) Specific bits in the elements of the array are
used to indicate such properties as whether the item can be
carried or not.

31
2 Text Adventure Games

More Variables
Finally you'll need to set a few more variables, such as:
VB Verb token obtained from the last command entered.
OB Object token obtained from the last command. It can
be 0 if only one word was typed.
RM Room the character occupies.
NC Number of items the character is carrying.
MI Maximum number of items the character may carry.
NI may never exceed MI.
MC Move counter. This indicates how many moves have
occurred since the adventure started. It can serve as a timer for
various events.
DF Description request flag. This variable is set to 0 after
the current room is described to the player. If a description is
required before the next move (because the character went into
a new room or decided to LOOK around again), it’s set to 1 to
get the description displayed. Leaving it at 0 saves having the
same description repeated every move.
Specific situations will undoubtedly call for a few more
variables, but the arrays and variables listed here will provide
the major part of what a simple adventure needs.

The Main Loop


An adventure program consists of two parts: the initialization
and the main loop. The initialization section includes
dimensioning arrays and setting up data. We’ve already looked
at some of the initialization section of our example adventure.
It uses READ and DATA statements to set up all the initial
values. Once the initialization is done, however, the main loop
takes over. It runs until the game is completed. The overall
flow of the main loop would be something similar to that
shown in Figure 2.
The major portions of the main loop, as shown in Figure
2, are the room description, the automatic routines, the com-
mand INPUT and parsing, and the action routines. Let’s con-
sider how to program each of these in turn.

Room Description
Whenever the character moves into a new room, the
surroundings change. If the player asks to LOOK at the room
again, the room description routine provides this information.

32
Text Adventure Games 2

Figure 2. The Main Loop

Room
Description

Automatic
Routines

Command
INPUT and
Parsing

Action
Routines

There are two things to be described: the room itself and


whatever items it contains.
This routine isn’t long and could look like this:
400 IF DF=0 THEN 690
418 PRINT RDS$(RM)
420 F=0
438 FOR I=1 TO NI
449 IF IL(1I)<>RM THEN 499
450 IF F=@ THEN PRINT "YOU SEE: ":F=1
46@ PRINT IDS$(I)
498 NEXT I

The description request flag in line 400 determines whether


this section of the program is executed or skipped over.
Remember that 0 indicates the latter. If it is 0, then, this entire

33
2 Text Adventure Games

routine is bypassed. If it is executed, describing the room con-


sists simply of printing the appropriate element of the room
descripion array. That’s line 410. Then in line 430, a FOR-
NEXT loop executes, which goes through each item in the
item location array. For each item that’s located in the current
room (F=0), it prints the corresponding element of the item
description array (done in line 450 and 460). This way the
player will see what each room contains.

Automatic Routines
The next section of the main loop takes care of events that
aren’t directly caused by the player’s commands. We can call
these routines automatic, for they happen independently of
what's typed in. An adventure can be written without any
automatic routines, but having even a few things outside the
player’s control gives a much greater sense of realism and
excitement.
Automatic routines can be controlled by the move
counter, random numbers, or a combination of the two. The
commands the player gives can have an effect as well. A pas-
sage may close four turns after the character enters a room, or
a wraith may start stalking the character only after he’s
touched a crypt. Extra variables can be used to indicate the
move on which something will happen. In the following
example routine, MM is a variable indicating the move in
which a wall collapses, opening a new passage between rooms
8 and 9.
788 MC=MC+1
71@ IF MC<>MM THEN 882
720 AC(8,3) = 9: AC(9,4) = 8
738 IF RM=8 THEN PRINT "THE EASTERN";
748 IF RM=9 THEN PRINT "THE WESTERN";
75@ IF RM=8 OR RM=9 THEN PRINT " WALL COLLAPSES, O
PENING A NEW PASSAGE."

MC is the move counter, our timer, so to speak. Each time


through the main loop, it’s incremented by 1 in line 700.
Assuming we earlier set MM to the desired turn number (say
8), then this automatic routine would not be executed until
MC equals MM—in other words, on turn 8. Line 710 insures
this. Line 720 actually creates the opening between the rooms
The message then displays, specifying which wall has crum-
bled. If the character is in room 8, for instance, the eastern

34
Text Adventure Games 2
ns ane acre at eee

wall has fallen, and the character can now move in that
direction.
The position of automatic routines in the program is im-
portant. Usually they should come after the room description,
so that the player finds out where his or her character is
before being told what happens. Some automatic routines,
however, are better placed after the player has completed the
move. This conveys the feeling that what happened immedi-
ately followed the move. For instance, if a flock of bats carries
the character out of a room every time he tries to enter, the
player may not even see the room until it’s discovered how to
get the bats out.

Command INPUT and Parsing


At this point the program stops talking to the player; instead,
it’s the player’s turn to communicate with the program. To do
this, the program must accept a command and parse it. To
parse a command simply means to break it up into its compo-
nents and identify their relationships—an easy job when it
consists of just two words.
Here’s the first section of an INPUT and parsing routine:
1689 INPUT C$
1018 L=LEN(C$):IF L=@ THEN 1880
1828 C1$="":C2$="":C2=0:X=0
1638 FOR I=1 TO L
1948 AS=MIDS$(C$,I,1)
1958 IF AS<>" " THEN 1888
1968 IF C2$<>"" THEN 12900
1878 X=1:GOTO 1999
1988 IF X=@ THEN Cl1$=C1$+A$:GOTO 1090
1885 C2$=C2$+A$
18998 NEXT I

The program receives a command through the INPUT


statement. As the player enters words, a string is created. Then
the program separates the two words by looking for one or
more spaces between them. (It’s best that it be tolerant of
more than one space between words, as well as spaces after
the command. INPUT automatically strips leading spaces, so
they don’t pose a problem.) The above program section re-
ceives the player’s INPUT (line 1000) and creates two strings,
C1$ and C2$ (lines 1080 and 1085). Spaces between words are
also checked for in line 1050.

35
2 Text Adventure Games

The following lines continue the routine:


1200 C1S=LEFT$(C1$,6): C2$=LEFT$(C2$,6)
1218 FOR I=1 TO NV
1226 IF VB$(I)=Cl1$ THEN VB=VT(I):GOTO 1258
1238 NEXT I
1249 PRINT "I DON'T KNOW THE VERB ";Cl1$:GOTO 1688
1250 IF C2$="" THEN OB=@:GOTO 14008
1255 FOR I=1 TO NO
1269 IF OBS$(1I)=C2$ THEN OB=OT(I):GOTO 1498
1278 NEXT I
128@ PRINT "I DON'T KNOW THE OBJECT ";C2$:GOTO 188
V4)

The two strings, C1$ and C2$, are the first and second
words of the command. The next step is to translate these
strings into the verb token and the object token. This means
looking them up in the verb array and object array and getting
the corresponding elements of the verb token array and object
token array. Lines 1220 and 1240 in the section of the routine
above do this for the verb and object respectively. Note the
checks and messages displayed if the verb and/or object do
not exist in the appropriate array.
The two strings must be truncated to the number of
significant characters in order to match the strings in the ar-
rays. Line 1200 assumes truncation to 6 characters.
In the case of a one-word command, C2$ will be the
empty string, so the object token will be set to 0 (line 1250).

Action Routines
Once the program has the command in the form of the verb
token and the object token, it’s ready to determine what those
commands will do. We can call the parts of the program that
do this the action routines. This section will be the largest por-
tion of the program; however, since it consists of a lot of small
pieces, it isn’t very difficult to write.
Before figuring out what a specific verb does, the program
should do some general checking to determine whether the
object is reasonable. If the object is an item, it has to be either
in the room or in the character's inventory. If it’s somewhere
else, the character can’t do anything with it. If the object isn’t
an item, then only a few verbs will work with it, so the pro-
gram should make sure that the verb is an appropriate one.
NORTH, for example, GO
EAT, or OPEN. Only
isn’tmakes ane the characte rcan TA TAKE,
something

36
Text Adventure Games 2

The following routine assumes that the direction object to-


kens (NORTH, UP, etc.) are numbers 101 to 106, that GO is
verb 10, that SHAZAM is object 107, and that SAY is verb 12.
(In a language that was more generous with names than
BASIC, we could assign a variable name to each verb. Trying
to think of a two-letter name for each verb that would mean
anything, though, is a hopeless exercise. So at this point we
resign ourselves to using numbers.)
1498 IF OB<188 THEN 1690
1495 REM IT'S NOT AN ITEM
1419 IF OB<=186 AND VB<>18 THEN 8009
1426 IF OB=187 AND VB<>12 THEN 8000
1438 GOTO 28808
1599 REM IT IS AN ITEM
1688 IF IL(OB)<>RM AND IL(OB)<>9 THEN PRINT "IT IS
N'T HERE. ":GOTO 1980
8800 PRINT "THAT'S SILLY!":GOTO 1980

Line 1400 of the routine checks to see if it’s an item (with an


object token less than 100). If it is, the program jumps to line
1600, where it’s determined whether the item is in the room
or in the character’s inventory. If neither, then the message IT
ISN’T HERE displays. The program chides the player with
THAT'S SILLY! if a direction (NORTH, UP, etc.) is requested
and GO isn’t used with it. The player will also see the mes-
sage if something like SAY (VB=12) SHAZAM (OB=107) is
typed in.
Notice that if the command is rejected, the program goes
back to the command INPUT (through the GOTO 1000 state-
ments in lines 1600 and 8000), rather than letting anything
happen automatically.
If these checks turn up no problems, the program falls
through to the action routine for the specific verb. The tool
used is the GOTO statement found in line 1430 above. It
sends the program to line 2000, shown below:
2608 ON VB GOTO 3000,3100,3200,3300,3400,3500, 36008
3780
2018 ON VB-8 GOTO 3800,3900,4808,4100,4200,4300,44
0B, 45008

Several of these statements will usually be necessary because


of the 64’s 80-character line limitation. Remember that an ON
statement will simply fall through to the next statement if the

a7
2 Text Adventure Games
READER ARSEFATT AES DEP TED SS

falls
variable is out of range. Thus, if the variable is 9, it
through line 2000 to line 2010, where it would access the first
line listed, 3800 (9—8=1). Using this technique, we can call
up to 16 different verb routines in the above example.
Each of the line numbers in lines 2000 and 2010 is the
start of the action routine for a particular verb.
Certain verbs will be standard in most adventures, so they
can be discussed in some detail here. Others will have effects
that are peculiar to the situation. They’re the ones that make
your adventure unique. Once you've seen how the standard
verbs work, though, you shouldn’t have much trouble adding
your own special ones.
Directional verbs and GO. There are two ways a player
might specify moving in a direction. Either a simple direction
(for instance, EAST or just E), or GO and a direction (GO
EAST) could be entered. It isn’t much trouble to include both.
A common area of the program can be used to handle all
directional movement, using a direction variable that the spe-
cific commands set before accessing the actual movement.
For a one-word command, the direction acts as the verb.
In this case, it just sets the direction variable and goes to the
common routine. The line below illustrates the one-word com-
mand NORTH.
3188 D=1:GOTO 3629
You'll recall that earlier we decided to use 1 as the directional
number for NORTH. All that’s done in the above line is to set
D (the directional variable) to 1 and then GOTO a line that
checks to see if that direction leads anywhere. (More on that
in a bit.)
_ However, the GO command has to translate its object into
a direction before going to the common routine. It’s easy to do
this if the direction objects are numbered appropriately, so that
subtracting a number from the object token gives the
right in-
dex into the access array. Take a look at the follow
ing lines:
3708 IF OB<=108 OR OB>106 THEN ggag
3718 D=OB-198:GOTO 3629
Notice that if the object (OB) is not a direction
(checked for in
line 3700), then the program jumps to line 8000,
where the
message THAT'S SILLY! is printed. The direction
variable D is
set in line 3710. If OB equals 101, for instance, signifying
that

38
Text Adventure Games 2

the direction is NORTH, then D equals one. The program then


moves to line 3620.
The common routine uses the access array to determine
where the move will take the character. The next segment is
this common routine used by both one- and two-word
commands.
3628 IF AC(RM,D)=8 THEN PRINT "YOU CAN'T GO THAT W
AY.":GOTO 480
3638 RM=AC(RM,D):DF=1:GOTO 409

A value of 0, as mentioned before, means that a given direc-


tion doesn’t lead anywhere. If the command does take the char-
acter somewhere, the description request flag is also set, so
that the player can see the new room. Both of the lines above
take the program back to the routine that describes the room.
TAKE. This command transfers, or attempts to transfer,
an item from the current room to the character’s inventory.
The program has to determine whether the item can be picked
up and whether it can be carried. The character might already
be carrying as much as allowable. Taking an item might also
have side effects, like making another item visible or setting
off a trap. The program doesn’t have to check whether the ob-
ject is in the room, since that has already been determined.
However, it does have to check whether the character is al-
ready carrying the item. Take a look at the lines below to see
how that can be programmed:
4200 IF (FI(OB) AND CF)=@ THEN PRINT "YOU CAN'T PI
CK THAT UP.":GOTO 400
4218 IF IL(OB)=@ THEN PRINT "YOU ALREADY HAVE ITI"
:GOTO 488
4220 IF IC=5 THEN PRINT "YOU'RE CARRYING TOO MUCH
{SPACE }ALREADY.":GOTO 490
4230 IL(OB)=@:IC=IC+l:PRINT “TAKEN."
4248 REM SIDE EFFECTS GO HERE
4298 GOTO 480

This assumes that flag CF (in line 4200) in the item flag array
indicates whether or not an item can be taken. If your charac-
ter already has the item, then line 4210 prints a message to
that effect. Note that a limit of 5 items is set in line 4220. If IC
(the variable keeping track of the numbers of items carried)
equals 5, the character can’t take anything else. Line 4230 ac-
tually TAKEs the item by placing it in the character’s

39
2 Text Adventure Games

inventory (IL(OB)=0), increments the number of items held,


and prints a message that the TAKE was successful.
DROP. The reverse of TAKE, it’s even simpler, since an
item that is being carried can normally be dropped.
4300 IF OB=0 THEN PRINT "DROP WHAT?":GOTO 1086
4318 IF IL(OB)<>@ THEN PRINT “YOU DON'T HAVE IT!":
GOTO 480
4328 IL(OB)=RM:PRINT "DROPPED."
4338 IC=IC-1
4398 GOTO 482

The only question is if the item is in the character’s inventory,


which is checked in line 4310. The object is transferred to the
room (line 4320) and the inventory count is decremented (line
4330). Again, side effects are possible.
INVENTORY. All this command does is list the items the
character is carrying. This involves going through all the items
and listing the ones that have a location of 0.
4408 PRINT "YOU ARE CARRYING:"
4419 FOR I=1 TO NI
4420 IF IL(I)=@ THEN PRINT ID$(I)
44390 NEXT I
4449 IF IC=®0 THEN PRINT "NOTHING."
4458 GOTO 4980

Line 4420 PRINTs the items the character is carrying. If IC


(the number of items carried) is 0, a message indicating that
the character holds nothing is displayed.
LOOK. This is one of the simplest commands; it just sets
the description request flag with a line such as:
4500 DF=1:GOTO 408

QUIT. Even simpler, except that it’s nice to make sure the
player really means it:
4600 PRINT "DO YOU REALLY WANT TO QUIT";
4618 INPUT YS
4620 IF LEFTS$(YS$,1)<>"Y" THEN 19008
4638 END

More Unusual Commands


Other verbs vary from one adventure game to another.
EXAMINE can give you additional information about items.
FEEL, SMELL, and TOUCH might serve a similar purpose.

40
Text Adventure Games 2

The process of examination might also cause other, previously


hidden, items to appear. OPEN could be another way to re-
veal a hidden item. Words like CUT and BURN might have in-
teresting effects on items, but unless an appropriate tool is in
the character's inventory, these commands would simply re-
turn a message like “You can’t do that.”
Having a few commands that do nothing but return a
standard response is useful, just because it adds to the number
of commands that get an interesting answer without adding
much to the programming effort. For instance, the verb
BREAK with any object might get the response ‘Vandalism
won't help your situation.” This will also leave the player
wondering whether there’s some object that could be broken
for a useful result.
Commands like CLIMB or ENTER might work on certain
objects to provide a way of getting from one room to another,
in addition to the directional commands. (Don’t use GO for
this, please. In spite of what some adventure game pro-
grammers think, you don’t go a door.)
Other commands might also surprise the player by
transporting the character from one place to another. For in-
stance, taking an item might cause a trap door to open, drop-
ping the character into the room below. Magic words can serve
this purpose. A magic word may be restricted in its use to a
certain room, so it provides passage only from that room to
another.

What Goes into It?


The mechanics of writing an adventure program are only part
of the job, just as grammar and spelling are only part of what
goes into writing. The other part is what you actually have to
say. Creating the content of an adventure can’t be reduced to a
cookbook approach. Still, some general guidelines are
possible.
Quests and hunts. There are two basic types of adven-
ture: the quest and the treasure hunt. In a quest adventure,
you're given a particular goal to achieve, such as solving a
mystery or obtaining a single treasure. In a treasure hunt,
you're trying to find as many treasures as possible to get a
igh score.
gach: quest adventure is an all-or-nothing proposition. The
program can give you a score to indicate how close you've

41
2 Text Adventure Games
oe

come to success, but you probably won't be satisfied until you


solve it. The treasure hunt offers more satisfaction to the
beginning adventurer, since if even a few treasures are found,
there’s a sense of accomplishment. If a quest is like climbing a
mountain, a treasure hunt can be compared to hiking across a
series of low hills. Each one has its own kind of satisfaction.
Make the pieces fit. In either case, all the pieces should
fit together. This is more obvious for a quest—each step is
part of a developing story. Even in a treasure hunt, though,
everything should be set against a common background and
story line. If it’s set in a world of Greek mythology, Wotan and
Brunhilde shouldn’t appear without good reason. If you’ve
chosen a science-fiction setting, it shouldn’t have magical ele-
ments that don’t fit. Humorous events can certainly liven up
an adventure, but they shouldn’t be jarringly out of place.
The puzzles should be interrelated. Otherwise, what you
end up with is a series of small puzzles rather than one com-
plete adventure. Solving one puzzle should provide a tool
that’s needed for solving the next one. The various items re-
quired should be scattered around so that the character has to
go back and forth among the rooms, rather than having every-
thing too neatly at hand.
Don’t cheat. The puzzles should always be logical. The
solution should make sense, at least once the player has stum-
bled upon it. A puzzle that reduces the player to trying actions
at random has failed. If the way to summon a genie in your
adventure is to kiss a coconut, be sure to provide some clue
that will suggest that action! If you don’t, you'll have a hard
time getting people to play your second adventure.
Traps should not be sprung unexpectedly. It should be
possible for the player to get a hint of danger ahead before
walking into it, perhaps by requiring the player to examine
things carefully. This doesn’t mean that everything should be
so easy that a player can solve it the first time. It means that
at the end of the puzzle or game, the player sees the program
was “playing fair.’” One adventure game I’ve played, for
example, requires the character to crawl through a passage to
survive, yet there was no indication that the passage was dan-
gerous. This forces the player to rely on knowledge gained in
a “previous life,” something not as realistic as many players
would like. ee

42
Strategy
Games
2

wg
wr

a.2 J

a
oat
Sea Route to
India:
A Historical Simulation for the 64
M. J. Winter

Here’s your chance to make history on the “Sea Route to India.”


Following in the wake of Portuguese explorers, you can find gold and
adventure. That is, ifyou don’t starve, get sunk by pirates, or capsize
in a terrible storm.

Simulations are more than just games. Although often played


like a game, they try to recreate a slice of the real world. Using
actual historical information, the simulation designer forces the
player to make decisions. If the simulation is well-researched
and well-written, those decisions should be very similar to the
ones the actual participants had to make.
These kinds of games are usually very popular, for they
can be played again and again, with no two games seeming
the same. Simulations are also somewhat educational, es-
pecially if they’re based on a period in history. Not only are
they fun to play, but you end up learning something at the
same time.
One of the earliest games for PET computers was a
simulation called Westward Ho. You became a turn-of-the-
century pioneer, trying to cross the country in a covered
wagon. Decisions had to be made about purchasing food, sup-
plies, and ammunition. Various experiences—hunting, Indian
attacks, settlements—occurred on each leg of the journey. By
playing the game several times, you learned where to spend
money, how to hunt, and whether to trust strangers. Luck,
however, was a factor in success, just as it was in reality. PET
users of all ages played the game over and over until their
characters finally reached the West Coast.
But Westward Ho was only an abbreviated version of
Oregon Trail, another simulation. That game’s designers took
great pains to produce an accurate imitation of reality; they
used prices from contemporary catalogs and calculated fre-
quencies and likely locations of Indian attacks by studying

63
3 Strategy Games

that was
historical accounts. The result was a historical game
both interesting and informative.

Sail the Bounding Main |


“Sea Route to India” uses a simila r techni que, drawi ng on the
voyages made by Portuguese explorers in the fifteen th century.
You'll have to make some of the same decisio ns as these
explorers, even keeping track of your ship’s supplies and your
crew’s morale.
Type the program in and save it. You should use “The
Automatic Proofreader,” found in Appendix C, to enter Sea
Route to India. It will almost insure that you type it in cor-
rectly the first time. Once you've entered the program, load
and run it.
You'll see the map of Europe, Africa, and part of Asia ap-
pear on the screen. Press B to begin the game. If this is your
first time playing Sea Route to India, press the Y key to read
the short instructions. If you look at the program listing, you'll
see that the subroutine beginning at line 15000 introduces the
game and sets up the rules. You'll probably want to skip the
directions if you've played the simultion before. Hit any other
key to go directly to the start of the game.
Your goal is to sail from Lisbon around Africa to India.
During the voyage, you encounter the same dangers faced by
the real explorers: hunger, thirst, pirates, natives, weather, mu-
tiny, and attack by Arab traders. If you make the right de-
cisions, keep your crew fed and happy, and have a good bit of
luck besides, you might just make it. The risks are great, but
the rewards can be even greater,
The voyage is charted in weeks on a map displayed on
the screen. Lines 500-800 contain the loop for each week. The
miles you sail depend on the weather. Sometimes the winds
are favorable, other times fierce storms batter your ship. You
can even be becalmed for weeks on end. Each week, your
store of water, food, and supplies decreases by one unit. And
if your journey lasts more than 30 weeks, the crew’s morale
also drops by one.
Each week something happens. Line 560 sends the pro-
gram to the appropriate event. In the early parts of the voy-
age, you may sight whales, meet other ships, or sail into
terrible storms. After you navigate around the Cape of Good

64
MERLE Strategy Games 3
LEN ET RLU AA CI PA

Hope and pick up your Indian pilot at Malindi, you can be at-
tacked at any time by Arab pirates.

Ship’s Log
At the end of each week, the program assesses your situation.
If you sailed far enough to visit the Canary or Cape Verde
Islands, then your water, food, supplies, and crew morale are
restored. The ship’s log is updated, and the game map shows
your progress. Lines 91-93 define the variable DT$ (dots);
three characters are needed for each dot. On the map, one dot
represents 200 miles. Then, if there are no fatal shortages
(such as no water or food or crew morale at zero), the voyage
continues.
Your ship’s record is also updated at the end of each
week. Weeks Out and Miles Sailed are increased, while the
other catagories of Food, Water, Supplies, Gold, and Crew Morale
can be raised or lowered, depending on what happened that
week. Whenever your food or supplies fall below one, or your
crew’s morale below two, the game ends. You can find the
checks for these situations in lines 11010-11035.
Occasionally, you'll come across another ship on the high
seas. It’s your choice whether you want to approach or flee. If
it’s a friendly ship, its captain may challenge you to a race.
Program line 3060 places the ships at the right side of the
screen; a string of DELETEs is printed several times to move
the ships to the left. If you win the race, your crew is happier;
not only can you win the wager, but their morale can increase.
However, they become disgruntled by a loss, and their morale
will fall.
Running short of food? Explorers often hunted whales
while at sea, and you can do the same. Lines 1000-1250 con-
tain the whale hunting routine. The whales are PRINTed
within a long string (F$) of shifted spaces. The string is cy-
clically rearranged and the leftmost 40 characters PRINTed
each time. The program checks the keyboard, then moves the
whales until you press H, which drops the harpoon. The pro-
gram then alternately moves the whales and lowers the
harpoon.
To check whether the harpoon hits a whale, the screen is
opened for INPUT in line 1100. The entire row of the screen
to the right of the harpoon is considered INPUT. If the first
character is not a shifted space, a whale has been hit.

65
3 Strategy Games

Landfall
The subroutine beginning at line 4000 describes the sighting
of a river mouth. Landing offers you a chance to get food and
water and to cheer up the crew. Shore leave was important
even then! Sometimes, depending on the random result of line
4060, natives appear. As many early explorers discovered, they
are unpredictable. Sometimes they’re friendly and trade gold
for goods (which raises your crew’s morale); other times they
attack.
If they do attack, type RUN and press RETURN quickly.
The clock is set to 0 in line 4320 to time how long it took you
to enter RUN. After you press RETURN, the program looks at
the clock. If more than 200 jiffies have passed (line 4340), the
natives attack and kill you. If you were fast, your landing
party escapes, although the food and water it gathered is lost.
The same timing technique is used when the Arab pirates’
dhows attack. The Arabs are fiercely determined to protect
their trading routes. Vasco da Gama himself was nearly
trapped by them more than once.
India at Last
If you make the right decisions, avoid starving to death, keep
your crew happy, and outrun Arab pirates, you may find your
way to India. If so, you'll be congratulated. To play the
simulation again, respond to the prompt on the screen. You
can review the instructions if you want, or go directly to an-
other game.
It took the Portuguese more than one voyage to reach the
riches of the subcontinent; if you made it the first time, you're
either a very good explorer or very lucky. Whatever the result,
you'll be sure to have fun and learn at the same time.
Asea Route to Indiar :
For mistake-proof
program entry,-be sure to read “The Automatic Proofreader,” Appendix C
76 DIM M%(7),M$(6):X=RND(-TI) :rem 45
(pt FG=1.6:KB=151:HP=38: PRINT" {CLR}": IFPEEK(1924)=3
2THENKB=197 : HP=29 srem 54
ay M$ (@)=""sM$(1)="STOPPED AT CANARY ISLANDS":M$(5
)="SIGHTED CALICUT" :rem 281
73 DH$="{2 SPACES}KLI{DOWN}{3 LEFT}£*3{RVS}
{3 SPACES}&*3{DowN}{4 LEFT}{4 SPACES} {DOWN}
{4 LEFT}{4 SPACES}{DOWN}{5 LEFT}{RVS}£
{3 SPACES} {OFF}£{DOwN}{3 LEFT}£L3{DOWN}
{4 LEFT}&*3({RVST{6 SPACES} {OFF}£" zrem 122
66
Strategy Games 3

74 M$(2)="CAPE VERDE ISLANDS":M$(3)="ROUNDED CAPE


{SPACE}OF GOOD HOPE" :rem 65
76 M$(4)="PICKED UP INDIAN PILOT" z:rem 116
77 YS$="_ -{DOWN} {LEFT} {RVS}+{DOW
{LEFT} {OFF}-
N}
{DOWN}{2 LEFT}&*3{RVS} {OFF}£":HSS$="{RED} —
{DOWN} {LEFT} {RVS}Z{OFF} {DOWN} {LEFT}-{DOWN}_
{2 LEFT}£*3{RvS} ToFF}<£" :rem 188
78 MS$="{ RIGHT}"+CHR$ (28)+" {DOWN} ":MSS=MSS+MS$:MS$
=MS$+MS$ :rem 12
89 WH$(1)="NO WIND AT ALL":WHS$(2)="VERY CALM": WHS (
3)="FAIR WINDS" z:rem 120
82 WHS (4)="GOOD WINDS":WH$(5)="GOOD WINDS" :WH$(6)=
"STRONG WINDS" srem 250
84 M% (1)=50:M%(2)=100:M%(3)=150:M%(4)=200:M%(5)=25
S:M%(6)=399:M%(7)=50 :rem 225
98 GOSUB16994 s:rem 224
91 DTS$="{2 LEFT}. {DOWN} {LEFT}.{2 LEFT}.{2 LEFT}.
{DOWN} {LEFT}. {DOWN} {LEFT}. {DOWN} {LEFT}. {DOWN}
{LEFT}.{2 LEFT}. {DOWN} {LEFT}. {DOWN} {LEFT}.
{DOWN} {LEFT}. {DOWN} {OFF}. {RVS} {OFF}. {DOWN} {OFF}
- {RVS} {OFF}. {RVS} {OFF}. {DOWN} {LEFT}. {DOWN}
{LEFT}. {DOWN} {LEFT}. {DOWN} {LEFT}. {DOWN}{LEFT}."
srem 139
92 DTS=DT$+" {DOWN} {LEFT}. {DOWN} {LEFT}. {DOWN} {OFF}.
{DOWN} {OFF}. {RVS}{OFF}.{RVS}{OFF}.{RVS} {OFF}.
{UP} {LEFT}. {UP} {OFF}. {UP} {OFF}. {UP} {LEFT}. {UP}
{OFF}. {UP}{LEFT}.{UP}{LEFT}.{UP}{LEFT}. {UP}
{OFF}. {UP} {OFF}. {RVS}{OFF}.{RVS}{OFF}.{RVS}
{OFF}." srem 54
93 DTS=DT$+"{RVS} {OFF}. {UP} {OFF}. {UP}{LEFT}."
srem 15
194 DEF FNR(X)=INT(RND(1)*X+1) :rem 176
195 F$="{2 SHIFT-SPACE}<.k2 @jV{13 SHIFT-SPACE}(.
k2 I3N{34 SHIFT-SPACE}" :rem 17
196 FS$=FS+"{28 SHIFT-SPACE}" :rem 151
107 FS=FS$+"<.k2 +]3V{4@ SHIFT-SPACE}(,k2 +]N
{15 SHIFT-SPACE}" :rem 114
168 FS$=F$+"{28 SHIFT-SPACE}" :rem 153
119 D$="{HOME}{32 DOWN}" :rem 174
120 ss="{3 SPACES}KM3{2 SPACES}&M3J{DOWN}{5 LEFT}
K3 +3 £2 +3{DOWN}{6 LEFT}K3 £3 £2 £3{DOWN}
{6 LEFT}£3 +3 £2 +3{DOWN}{4 LEFT}KG] Mj
{DOWN}{6 LEFT}K*4{RVS} 222 {OFF}£" :rem 135
122 ss$="{3 SPACES}KM3{2 SPACES}&M3{DOWN}{5 LEFT}
K3 +3 £2 +3{DOWN}{6 LEFT}£3 £3 £2 £3{DOWN}
{6 LEFT}&3 +3 £2 +3{DOWN}{4 LEFT}£G km]
{powN}{6 LEFT}&*3{RVS}{5 SPACES}{OFF}£ :rem 44

67
3 Strategy Games
EH SCONE A REO AL TTA

125 GOSUB15990 :rem 14


138 GOTO580 :rem 98
588 : FORWK=1T052: Z=FRE(@) :FORI=1TO1
ML=8:GOSUB190@@
@:GETAS : NEXT :rem 140
518 GOSUB140@@ : POKE53281, 3: REMWEATHER, MILES
:rem 170
528 GOSUB19989:REM LOG zrem 8
538 GOSUB1100@:REM SITUATION :rem 232
550 X=FNR(GG)
: IFGG=6THENX=2*FNR(4)-1 :rem 167
555 IFML<120@ANDX=4THENX=1 :rem 87
568 ONXGOSUB1OGO, 2000, 1000, 4000,508009, 69090, 6008
:rem 113
798 FD=FD-1:SP=SP-1:WT=WT-1:
IFWK> 30THENCH=CH-1
:rem 129
899 NEXTWK :rem 121
10808 REM CATCH WHALE ROUTINE :rem 159
1002 DZ=17+INT(8*RND(1) ) :rem 53
1905 PRINT"{CLR}WHALES SIGHTED" :rem 246
1006 PRINT" {DOWN}TRY YOUR LUCK? Y OR N" :rem 173
1007 AS$=""s:GETAS: IFAS="N"THEN 1155 :rem 37
1988 IFAS$<>"Y"THEN1@O7 :rem 293
1010 PRINT"{CLR} {DOWN}{11 SPACES }W{ DOWN} {LEFT} £+]*
-{DOWN}{3 LEFT}£+3 v" & :rem 227
1028 PRINT"{8 SPACES}£*3{RVS}{3SPACES} {OFF}£"
:rem 192
1930 PRINT" £53JK{SHIFT-SPACE } JKJKJIKJKKJIKIKJKJKJKIJK
JK{BLK}" :rem 36
1048 PRINT" {HOME}PRESS H{OFF} " :rem 16
1058 GOSUB12900 :rem 9
1055 IFPEEK(KB) <>HPTHEN1@5@ :rem 180
1958 DC=08:PRINTLEFTS(D$,3)TAB(13)" {DOWN} {LEFT}-
{DOWN} {LEFT}V{ DOWN} {LEFT}"; :rem 56
1968 DC=DC+1:GOSUB120@:PRINTLEFTS (D$,3+DC)TAB(13)"
{DOWN} {LEFT} -{DOWN} {LEFT}V {DOWN} {LEFT}"; :GOT
01976 :rem 78
1978 IFDC<>DZ-6THEN1@690 trem 79
1108 BS$="*":OPEN3, 3: INPUT#3,B$:CLOSE3: IFLEFT$(BS$,1
) <>" {SHIFT-SPACE}"THEN115@ :rem 230
1118 PRINTLEFT$(D$,3+DC)TAB(13)" {DOWN} {LEFT}-
{DOWN} {LEFT}V{LEFT}{UP} {DOWN} {LEFT}-{ DOWN}
{LEFT}V {2 UP}MISSED";:GOTO1155 :rem 230
1158 PRINT"{7 UP}GOOD SHOT":FD=FD+2 :rem 222
1155 PRINTLEFT$(D$,23) "{4 UP}PRESS {RED}RETURN
{BLK}" :rem 147
1157 AS$="":G IFA$ <>CHRS$(1
ETAS 3)THEN115
: 7 :rem 142
1159 RETURN srem 176
1200 PRINTLEFTS$ (D$,DZ)LEFTS(F$,39) :rem 196
1218 FS=MID$(F$,2)+LEFTS(FS,1) z:rem 20
1245 REM{4 SPACES}A$="":GE IFAS <>"L"THEN
TAS: 1245
:rem 72
68
Strategy Games 3

1258 RETURN :rem 168


2800 REMFOREIGN SHIPS :rem 55
2018 PRINT" {CLR}{RED}"TAB(25)SS :rem 73
2828 PRINT" {BLK}SHIP SIGHTED" :rem 97
2038 PRINT"{RVS}A{OFF}PPROACH OR {RVS}F{OFF}LEE"
:rem 233
2048 AS="":
IFAS <>"A"AND
GET AS <>"F"THE
AS: N204@
srem 137
2858 IFAS="A"ANDRND(1)>.2THEN390 :rem 72
2860 ES=.5:IFAS="F"THENES=.8:GOTO2190 :rem 149
2878 PRINT" {DOWN}IT'S A PIRATE SHIP!":PRINT" {DOWN}
YOU TURN AND FLEE" s:rem 119
2188 REMFLEE ROUTINE :rem 233
2116 IFRND(1)>ESTHENPRINT"{2 DOWN}ALAS.":PRINT"
{DOWN}THEY CATCH AND SINK YOU":GOTO17999
srem 41
2199 GOTO3149 :rem 214
3090 FL=@:REM RACE srem 251
3081 PRINT"“{CLR}ITS CAPTAIN CHALLENGES YOU TO A RA
CE{DOWN}":IFRND(1)>.5THEN3803 :rem 192
3882 PRINT"3 PIECES OF HIS GOLD FOR 3{2 SPACES}BAR
RELS OF{2 SPACES}YOUR SUPPLIES.":GOTO3905
:rem 8
3083 FL=1:PRINT"3 BARRELS OF HIS SUPPLIES AGAINST"
:rem 4
3884 PRINT"3 PIECES OF YOUR GOLD." :rem 188
3885 PRINT" {DOWN}DO YOU ACCEPT? {RVS}Y{OFF} OR
{RVSIN{OFF}?" :rem 248
3006 AS="":GETAS: 1FAS="Y"THEN3@17 :rem 48
3087 MSS="{RIGHT}"+CHRS (20)+"{DOWN}":MSS=MSS+MSS$ :M
SS=MSS$+MS$ s:rem 193
3008 IFAS="N"THENRETURN :rem 157
3209 GOTO3896 :rem 296
3018 YSS="{BLK} -{DOWN} {LEFT} {RVS}+{DOWN} {LEFT}
{OFF}-{DOWN]{2 LEFT}K*4{RVS} TOFF}£":HS$="
{RED} -{DOWN} {LEFT} {RVS}Z{OFF} {DOWN} {LEFT}—-
{DOWN}T2 LEFT}£*3{RVS} {OFF}£" :rem 82
3017 MSS="{RIGHT}"+CHR$ (20)+"{DOWN}":MSS=MS$+MS$ :M
S$=MSS$+MS$ :rem 104
3858 PRINT" {CLR} {BLK}"; :rem 247
3960 PRINTTAB(36)YS$:PRINT"{2 DOWN}"TAB(36)HS$
srem 52
FORT=1TO1000:NEXT sem nid
3078
3075 YX=INT(RND(1)*10)+25:HX=INT(RN D(1)*9)+25 :IFHX
=YXTHENYX=YX+1 grem. L/L
3080 : [FYX<HXTHE
MX=YX:W$ ="YO NMX=HX:WS$
UR" ="HIS"
srem 4
3898 FORJ=1TOMX srem 179
3992 IFYX<JTHEN3@95 :rem 148

69
3 Strategy Games
FRE AERSINR ELE

3893 PRINT" {HOME}"MS$ :rem ~ioh


3095 IFHX<JTHEN3100 :rem
3096 PRINT" {HOME}{6 DOWN}"MS$ :rem ot
3198 NEXTJ ~ ‘rem
3119 PRI NT"
{BLK} {HOME}{15 DOWN}"WS$" SHIP WINS
:rem 198
3128 IFMX=YXTHENGP=GP-(FL=0)*3:SP=SP+3*FL: CH=CH+2
:rem 29
3138 IFMX=HXTHENG :SP=SP+3-FL*
3 P=GP * (FL=0): CH=CH-2
:rem 15
3149 PRINTLEFTS$(D$,23) "PRESS {RED}RETURN{BLK}"
s:rem 75
3145 IFAS GET
AS="": AS:
<>CHRS$ (13) THEN3145 :rem 148
3158 RETURN :rem 169
4008 REMRIVER :rem 48
4810 IFRND(1)>.7THEN RETURN :rem 188
4928 PRINT"{CLR}YOU SPY A RIVER.":PRINT" {DOWN}WILL
YOU GO ASHORE FOR FOOD AND WATER?" :rem 193
4925 PRINT" {DOWN} {RVS}Y{OFF} OR {RVS}N{OFF}"
:rem 61
4938 AS="";:GETAS: IFAS<>"Y"ANDAS <>"N"THEN483@
z:rem 171
4949 IFAS="N"THEN CH=CH-2: RETURN :rem 134
4958 PRINT"{2 DOWN}YOU LAND AND REPLENISH."
s:rem 131
4860 IFRND(1)>.5THEN4809 :rem 91
4870 PRINTLEFT$(D$,23) "PRESS {RED}RETURN{BLK}"
:rem 78
4975 AS$="":GETAS: IFAS$<>CHRS$ (13) THEN4075 :rem 146
4886 PRINT"{CLR}NATIVES APPEAR{3 SPACES}O
{3 SPACES}O{DOWN}{6 LEFT}J{RVS}{RED} {BLK}
{OFF}K K£ZA{RVS}{GRN} {OFF} {BLK} &X3 {DOWN}
{6 LEFT}v{3 SPACES}v" :rem 188
4982 PRINT" {DOWN} {RVS}A{OFF}PPROACH OR {RVS}F{OFF}
LEE?" :rem 66
4883 AS="":GETAS: IFAS<>"A"ANDAS <>"F"THEN4983
srem 155
4085 IFAS="F"THEN4890 :rem 135
40998 IFRND(1)>.5THEN430¢ :rem 89
419 PRINT"{3 DOWN}THE NATIVES TRADE GOLD FOR YOUR
TRINKETS" z:rem 4
4118 GP=GP+10:CH=CH+1 :GoTO489g zrem 229
“4300 PRINT" {CLR}{2 SPACES}oO{3 SPACES}O{DOWN}
{6 LEFT}J(RVS}{YEL} {BLK} [OFF}KTtKZ9{RVS}
{RED}
{OFF} {BLK} £X3{ Down} {6 LEFT}V = Vv"; :rem 138
~4302 PRINT"{2 UP}{5 SPACES}o{3 SPACES
JO {DOWN}
{6 LEFT}J{RVS}{GRN} {BLK} {OFF} KTKZI{RVS}K1]
{BLK} {OFF} EX3{DOWN}{6 LEFT}v —y" :rem 197

70
Strategy Games 3

4385 PRINT"{3 DOWN}MORE NATIVES APPEAR!":PRINT"


{DOWN}RUN FOR THE SHIP!" zrem 37
4318 PRINT" {DOWN}TYPE {BLU}RUN{BLK} AND PRESS RETU
RN" :rem 208
4328 TIS="099099" :rem 43
4330 INPUTAS:IFAS<>"RUN"THEN433@ :rem 153
4349 IFTI<200THEN4590 :rem 189
4358 PRINT" {DOWN}TOO SLOW. YOU'RE DEAD.":GOTO1799@
s:rem 117
4588 PRINT" {DOWN}WHEW! YOU SAVED YOUR SKIN BUT LOS
havour® srem 119
4585 PRINT"FOOD AND WATER" :CH=CH-1 :rem 8
4519 GOTO48194 srem 288
4899 FD=190:WT=19:CH=CH+1 srem 96
4819 PRINTLEFTS$(D$,23) "PRESS {RED}RETURN{BLK}"
srem 89
4828 AS$="":GETAS: IFA$<>CHRS$ (13)THEN4829 z:rem 142
4849 RETURN srem 176
5888 REMSTORRM :rem 144
5019 IFRND(1)>.5THENRETURN :rem 107
5815 POKE53281,12 srem 148
5828 PRINT" {CLR}TERRIBLE STORM" :rem 25
5025 IFRND(1)>.9THEN PRINT" {DOWN}SHIPWRECK AND PER
ISH" :GOTO1700@ srem 48
5838 PRINT"{DOWN}YOU RIDE IT OUT, BUT LOSE SUPPLIE
S":PRINT" {DOWN}OVERBOARD." :rem 13
5848 SP=SP-4 srem 173
50950 PRINTLEFTS(DS$,23) “PRESS {RED}RETURN{BLK}"
srem 77
5068 AS="":GE (13) THEN5860
IFAS <>CHRSTAS: :rem 136
5079 POKE53281,3:RETURN :rem 119
6988 REM ARAB DHOWS s:rem 69
6019 PRINT" {CLR}HOSTILE WATERS" :rem 25
6820 PRINT" {DOWN}ARAB TRADERS WILL TRY TO KEEP YOU
OUT" :rem 201
6838 PRINTLEFTS(D$,23) "PRESS {RED}RETURN{BLK}" -
:rem
6949 AS="":GETAS: IFA$<>CHR$ (13) THEN6048 z:rem 134
6045 IFRND(1)>.5THENRETURN :rem 116
6858 PRINT" {CLR} {DOWN}";TAB(PRINT" {HOME}
8)DH$:
{DOWN }"TAB(20)DH$ :rem 244
6969 PRINT" {HOME}{9 DOWN}ARAB DHOWS APPEAR"
srem 157
6879 PRINT" {DOWN}TYPE {BLU}FLEE{BLK} AND PRESS RET
URN" srem 252
6072 TI$="0000B0" srem 49
6974 INPUTAS$:IFA$<>"FLEE"THEN6974 :rem 206
6076 IFTI<200TH
EN6B90 s:rem 203
6080 PRINT" {DOWN}THEY SINK YOU.":GOTO17000:rem 181
71
3 Strategy Games

6898 PRINT" {DOWN}YOUR PILOT ESCAPES THEM.":rem 232


6190 PRINTLEFTS(D$,23) “PRESS { RED} RETURN {BLK}
s:rem 74
6119 IFAS <>CHRS (13) THEN6119
AS$="":GETAS: :rem 130
6120 RETURN :rem 169
10088 REM LOG BOOK :rem 226
10882 GOSUB16900: Q=INT (ML/ 2909 ) :rem 200
18003 IFQ>1THENPRINTLEFTS(DS$,5);"{9 RIGHT}";LEFTS (
prs, 370) :rem 93
19005 PRINT" {HOME}{BLK}{2 SPACES}SHIP'S RECORD"
:rem 215
10086 WKS=RIGHTS("{2 SPACES}"+STRS$(WK),4) :rem 204
19807 ML$=RIGHTS("{2 SPACES}"+STR$(ML),4) :rem 187
19888 FDS=RIGHTS("{2 SPACES}"+STRS(FD),4) :rem 158
19009 SPS=RIGHTS("{2 SPACES}"+STRS(SP),4) :rem 209
19019 GPS=RIGHTS("{2 SPACES}"+STRS$(GP),4) :rem 177
10611 CHS=RIGHTS("{2 SPACES}"+STRS$(CH),4) :rem 154
10612 WTS=RIGHTS("{2 SPACES}"+STRS(WT),4) :rem 219
10026 PRINTLEFTS (DS$,14)TAB(2@)"WEEKS OUT{4 SPACES}
"WKS :rem 95
18030 PRINTTAB(20)"MILES SAILED ";MLS :rem 115
10040 PRINTTAB(20)"FOOD{9 SPACES}";FD$ :rem 97
18042 PRINTTAB(20)"WATER{8 SPACES}";WTS :rem 223
10045 PRINTTAB(20)"SUPPLIES{5 SPACES}";SPS$:rem 284
106508 PRINTTAB(20)"GOLD{9 SPACES}";GP$ :rem 109
18960 PRINTTAB(28)"CREW MORALE{2 SPACES}";CHS
srem 45
199870 PRINT" {DOWN }"TAB(14)MS$(G) :rem 112
10073 IFG=1ORG=2THENPRINTTAB(14)"TOOK ON FOOD & WA
THR”: :rem 9
10074 IFG=4THENPRINTTAB(14)"AT MALINDI" :rem 99
10075 IFG=5THENPRINTTAB(10)"{DOWN}{RVS}YOU MADE IT
!";:PRINT" {RVS}CONGRATULATIONS! {HOME}";
s:rem 7
10077 IFG=5THEN PRINT"HISTORY WAS WRONG. {UP}":GOTO
17040 :rem 31
10880 PRINTLEFTS$(D$,24)"PRESS Cc" z:rem 52
18092 AS="":GETAS : IFAS<>"C"THEN1@890 zrem 183
10095 RETURN srem 223
11000 REM EVAL SITUATION :rem 190
11010 IFFD<1THENPRINT"{CLR}OUT OF FOOD":PRINT"
{DOWN}YOU DIE OF STARVATION.":GOTO1780@
:rem 229
11015 IF WI<1THENPRINT"{CLR}OUT OF WATER":PRINT"
{DOWN}YOU DIE OF THIRST.":GOTO17000 :rem 57
110208 IFSP<1THENPRINT"{CLR}OUT OF SUPPLIES":PRINT"
{DOWN}YOU DIE":GOTO17990 :rem 126
11838 IFCH<2THENPRINT" {CLR}CREW MUTINIES.":PRINT"
{DOWN}THEY FORCE YOU TO TURN BACK." :rem 282

72
ELE
Strategy Games 3
SE REPIL
E IE BIE CLES

IFCH<2THEN17202 :rem 169


RETURN :rem 211
POKE53281,7: REM WEATHER :rem 184
WH=FNR (7) :G=0:GG=5 : CM=M% (WH) * FG :rem 137
PRINT" {CLR}{6 DOWN}WEATHER" :rem 212
IFWH=7THEN14149 :rem 193
PRINTWHS (WH) : LFWH< 3THENCH=CH-1 :rem 239
IFML<808ANDML+CM>89@THENG=1 :WT=10:FD=FD+3:SP
=SP+6: IFFD<19THENFD=19 :rem 170
IFML<15@Q8ANDML+CM> 158@THENG=2 :WT=10:FD=FD+3:
SP=SP+6: IFFD<10THENFD=19 :rem 9
IFML<580Q8ANDML+CM> 500@THENG=3 :rem 57
IFML<6688ANDML+CM > 6609THENG=4 :rem 73
IFML>6690THENGG=6 zrem 91
ML=ML+CM: Q=INT(ML/2+.5) : IFML>9989THENG=5
z:rem 2
GOTO14155 z:rem 55
PRINT" {DOWN}STEADY RAIN":PRINT"{DOWN}YOU REF
ILL WATER TANKS" :WT=10 :rem 46
PRINTLEFTS(DS,23) "PRESS {RED}RETURN{BLK}"
:rem 131
AS="":GETAS: IFA$<>CHR$(13)THEN14157 :rem 246
RETURN srem 215
PRINT"{2 UP}{4 RIGHT}DO YOU WANT TO READ THE
INSTRUCTIONS?" :rem 187
PRINT"PRESS {RVS}Y{OFF} FOR YES, {RVS}JANY OT
HER KEY{OFF} FOR NO." :rem 255
WT=19:GP=290 s:rem 177
GET AS:IF AS="" GOTO 15993 :rem 31
IF A$<>"Y" GOTO 15130 :rem 56
PRINT" {CLR}MANUEL THE FIRST, KING OF PORTUGA
) :rem 198
PRINT" {DOWN}BELIEVES THERE MUST BE A SEA-ROU
TE TO " :rem 238
PRINT" {DOWN} INDIA. HE HAS OFFERED A PRIZE FO
R" :rem 137
PRINT" {DOWN}FINDING IT. VASCO DA GAMA IS GOI
NG TO" srem 117
PRINT" {DOWN}TRY. HIS SHIPS WILL BE READY SOO
N. BUT" :rem 6
PRINT" {DOWN}YOU HAVE A SHIP THAT CAN LEAVE T
ODAY." z:rem 143
PRINT"{2 DOWN}YOU DECIDE TO TRY YOUR LUCK."
:rem 213
PRINTLEFT$(D$,23) "PRESS {RED} RETURN{BLK}"
:rem 125
AS=""":GETAS$: IFA$<>CHR$(13)THEN15@23 :rem 232
WT=10:GP=20 :rem 182
PRINT" {CLR}OTHERS HAVE TRIED. SOME DIED IN S
TORMS, " srem 241

73
3 Strategy Games
BEB I A LE LIASEE

15031 PRINT" {DOWN}SOME OF THIRST OR STARVATION. SO


ME WERE" :rem 196
15032 PRINT" {DOWN}MURDERED BY PIRATES, OTHERS BY N
ALLVES :rem 2904
15033 PRINT" {DOWN}UNHAPPY CREWS MUTINIED. ARAB TRA
DERS" :rem 63
15034 PRINT"{DOWN}HAVE KILLED TO PROTECT THEIR ROU
TRS." :rem 8
15035 PRINT"{DOWN}ALL THESE COULD HAPPEN TO YOU."
z:rem 51
15036 PRINT"{2 DOWN}{RVS}WORDS OF ADVICE{OFF}: NOT
ALL STRANGE SHIPS" :rem 5
15037 PRINT"{DOWN}HOLD PIRATES. NATIVES CAN BE FRI
ENDLY." srem 77
15038 PRINT"{DOWN}FRESH FOOD, GOOD WEATHER, AND AN
Ls :rem 118
15039 PRINT" {DOWN} INCREASE IN GOLD KEEPS YOUR CREW
HAPPY." srem 147
15050 PRINTLEFTS(D$,23) "PRESS {RED}RETURN{BLK}"
:rem 126
15868 AS="": IFAS GET AS:
<>CHR$(13)THEN 15969 :rem 234
15138 PRINT" {CLR} {DOWN}"TAB(30){2 SPACES}SS$
:rem 196
15148 PRINT"{3 DOWN}PRESS {RVS}L{OFF} TO SET SAIL
{SPACE}FROM LISBON" :rem 47
15150 AS="": GET
IFAS <>"L"THAS:
EN15150 z:rem 196
15155 FORI =1
PRINT" T0
{HOME}" 30
MS$:PRI :
NT"{UP} "MSS
{12 SPACES} :NEXT :rem 96
15168 SP=50:CH=10:FD=19 :rem 7
15188 PRINTLEFT$(D$,23) “PRESS {RED}RETURN{BLK}"
:rem 139
15185 AS="":GETAS:IFA$<>CHRS$(13)THEN15185 :rem 25@
15200 RETURN :rem 216
16000 POKE53281,3:PRINT"{CLR}":IFML=4THEN PRINT"
{CLR}{BLK} SEA ROUTE TO INDIA": POKE53280, 3
:rem 82
16004 PRINT" {BLK} RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRR{YEL}" :rem 132
16985 REM PRINT" {YEL}" :rem 79
168190 PRINTTAB(8)"{RVS}{1@8 SPACES}{OFF}{7 SPACES}
{RVS}{7 SPACES}" :rem 223
16012 PRINTTAB(8)"{RVS}{2 SPACES} {OFF}£{3 SPACES}
k2 33 {RVS}{19 SPACES}" re :rem 244
16014 PRINTTAB(8)"k2 UJ{3 SPACES}&kC3{2 SPACES}
{RVS}{23 SPACES}" :rem 107
16016 PRINTTAB(4)"£B3}{3 SPACES}{RVS}£{3 SPACES}
{OFF}{4 SPACES}{RVS}{19 SPACES]" :rem 73
16818 PRINTTAB(7)"{RVS}£{8 SPACES} {OFF}k*3I{RVS}
{12 SPACES}{OFF}£" z:rem 169
74 ‘
ERROR Se
Strategy Games 3

16620 PRINTTAB(6)"{RVS}£{9 SPACES}{OFF} k*3{RVS}


{2 SPACES}k*}{OFF}{2 SPACES}k*}{RVS}
{4 SPACES} {OFF}£" :rem 3
16622 PRINTTAB(3)"KBJ{[2 SPACES}{RVS}{10 SPACES}*]j
{OFF} £*3{RVS}{2 SPACES}K*J{OFF}{2 SPACES}
{RVS}{3 SPACES} {OFF}£" :rem 24
16624 PRINTTAB(6)"{RVS}{1l SPACES}K*J{OFF} £*]
{RVS} {OFF}£{2 SPACES}{RVS}{2 SPACES} {OFF}
£* srem 49
16026 PRINTTAB(6)"{RVS}{12 SPACES}K*3{OFF} £
{3 SPACES}K*¥{RVS} " trem 75
16828 PRINTTAB(6)"kK*3{RVS}{12 SPACES} {OFF}£
{5 SPACES}k*3" ~srem 59
16838 PRINTTAB(19)"k*3{RVS}{7 SPACES} {OFF}£"
trem 128
16032 PRINTTAB(11)"{RVS}{6 SPACES}{OFF}£" :rem 164
16934 PRINTTAB(11)"{RVS}{6 SPACES}{OFF}" :rem 253
16836 PRINTTAB(11)"{RVS}{6 SPACES}{OFF}" :rem 255
16838 PRINTTAB(11)"{RVS}{6 SPACES} {OFF}" :rem 1
16839 PRINTTAB(11)"{RVS}{5 SPACES}{OFF}£" :rem 171
16948 PRINTTAB(11)"{RVS}{5 SPACES}{OFF} {RVS}KH}"
srem 192
16842 PRINTTAB(11)"{RVS}{4 SPACES}{OFF}£ {RVS} "
srem 183
16044 PRINTTAB(11)"{RVS}{3 SPACES} {OFF}£
{2 SPACES}{RVS} " ~ grem 185
16046 PRINTTAB(11)"k*4{RVS} {OFF}£" :rem 136
16848 IFML>@THENPRINT" {BLK}"; : RETURN z:rem 126
16050 PRINTTAB(20)"{DOWN}{BLK}PRESS B{OFF} TO BEGI
N"“; srem 156
16060 AS="":GETAS: IFAS<>"B"THEN16062 :rem 188
16878 RETURN :rem 222
17000 PRINTLEFTS(D$,23) "PRESS {RED}RETURN{BLK}"
srem 123
17019 AS="":GETAS$: IFA$<>CHR$(13)THEN17019 :rem 228
17@2¥ PRINT"{CLR}{2 DOWNJON MAY 20, 1498":PRINT"
{DOWN}VASCO DA GAMA REACHED CALICUT ON THE"
z:rem 10
17025 PRINT" {DOWN}WEST COAST OF INDIA, AFTER
{2 SPACES}" eran 54
17030 PRINT"{DOWN}A VOYAGE OF 11 MONTHS AND 9508 78M
ILES.{4 DOWN}" :rem
17040 PRINT"{DOWN}PLAY AGAIN? {RVS}Y{OFF} OR {RVS}
N{OFF}" :rem 67
17050 AS="":GETAS$: IFA$="Y"THENRUN :rem 142
IFA$<>"N"THEN17050 srem 42
17060 :rem 214
17870 END

75
Quatrainment
Sean Puckett
64 Version by Gregg Peele

Fast thinking and logic are required for ’’Quatrainment,” as you


race the clock and plan your moves to match a master pattern.
Joystick required.
‘Quatrainment” pits you against the clock as you try to match
a pattern generated by the computer. But this is more than a
simple matching game. Depending on where you position the
cursor, different groups of squares are turned off or on, creat-
ing patterns that seem even further from your goal. There is a
way to duplicate the master pattern, but it takes planning and
clear thinking. Not only do you have to reproduce the pattern,
but you're trying to do it in the fewest moves and the shortest
time possible.
Using ‘The Automatic Proofreader” found in Appendix C,
type in Quatrainment. The Proofreader makes it easy to enter
an error-free copy of the program the first time. After you’ve
saved the program to tape or disk, load and run it.
The game board is drawn on the left of the screen, and
the master pattern is displayed at the right. A timer and move
counter appear at the top of the screen. You'll see a cursor in
one of the squares of the game board. To change the game
board pattern, use the joystick plugged into port 2. Move the
cursor onto the square you want, then press the joystick fire
button. Part of the pattern toggles from on to off, or from off
to on, depending on whether you are in the middle, in a cor-
ner, or at an edge of the board. On squares are shown with
X's, off squares as blank. The different ways the pattern can
change are:

Figure 1. Patterns
Corners Centers
Strategy Games “S

(Centers are defined as the four squares in the middle of the


game board.) Squares that are darkened in Figure 1 will toggle
on if previously off, or off if previously on. For example, if you
see this on the screen:
Figure 2. Game Board—Before

and place the cursor in the lower right corner of the board,
when you press the fire button, the pattern will change to:

Figure 3. Game Board—After

The two squares in the far right column that were on are now
off. Three other squares (two on the bottom row, the third up
and to the left of the bottom right corner) are now toggled on.
You continue to turn squares on and off in this manner, trying
to duplicate the master pattern on the right. Don’t despair if
you seem to be creating jumbled patterns; there is a way to re-
create the master pattern.
When the game board and the master pattern match, your
weighted score is displayed, based on the elapsed time and the
number of moves made. Strive for the lowest score.
77
3 Strategy Games
LOT
EES AAA TORY

Quatrainment
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
19 PRINT" {CLR}":POKE214,POKE211,13 1@:PRINT: :A$="QU
ATRAINMENT ": POKE646,@ :rem 196
28 FORTI1=1TOLEN(AS) :PRINTMIDS(AS$,T1,1);:FORT=1TO29
@ sNEXT :NEXT: FORT=1TO509 : NEXT :rem 214
3@ RN=16:REMFOR RANDOM INITIAL GRID CHANGE LINE 38
TO RN=RND(@)*15+1 :rem 159
49 PRINT" {CLR}";TAB(26);"TIME: "™ :rem 123
45 PRINT"{DOWN}{14 LEFT }MOVES:";MO :rem 124
50 PRINT"{3 DOWN}{14 LEFT}EDGES KDJ£Bq" :rem 210
53 PRINT"{3 DOWN}{14 LEFT}CORNERS {RVS} {OFF}£EV3
{DOWN}{2 LEFT}kKV]j" :rem 137
54 PRINT"{2 DOWN}{14 LEFT}CENTERS {UP}£D3{DOWN}
{LEFT} {RVS}KFI{OFF} EVI" :rem 14
198 GOTO149 :rem 95
11@ FORL=1T04:FORB=1T04:D(L,B)=PEEK(C(L,B))-9:NEXT
B:NEXTL: RETURN :rem 608
115 FORT=1T0500 :NEXT :rem 241
12@ FORL=1T04: FORB=1T04:IFB(L,B)<>D(L,B)THENRETURN
:rem 161
138 NEXT :NEXT:SC=VAL(TIS)/16+M0/5:PRINT"{CLR}
{6 DOWN}"TAB(1@)"YOU HAVE MATCHED IT! {DOWN}"
:rem 198
135 PRINTTAB(15);"SCORE:";INT(SC);"{DOWN}":rem 134
136 PRINTTAB(11);"PLAY AGAIN Y OR N?" :rem 77
137 IFPEEK(197)<>39ANDPEEK(197)<>25THEN137:rem 188
138 IF PEEK(197)=25THENRUN :rem 10
139 END :rem 116
146 CO=54272 :POKE53281,12:POKE53280,@0 :rem 42
1590 FORJ=O@TO2@STEP5 :rem 170
166 FORT=1924TO1804STEP4@
: POKET+J,16@ :rem 219
178 POKET+54272+J,1:NEXT:NEXT :rem 14
186 FORJ=@TO2@STEP5 :rem 173
1990 FORT=19024T019024+29
: POKET+J* 49, 168: POKET+5427 2+
J* 48,1 :rem 159
200 NEXT:NEXT :rem 74
218 POKE 1569,79:POKE1569+CO,7:POKE1577,8@:POKEL57
7+CO,7 :rem 191
228 POKE1889, 76 :POKE1889+54272,7:POKE1897,122:POKE
1897+CO,7 :rem 112
230 FORT=1609TO1849STEP4@ :POKET,116:POKE T+CO,7:PO
KET+8 , 106: POKET+8+CO, 7 :NEXT :rem 240
248 FORT=1 :POKET,11
570 9 T01
:POKET+320,111:P
576 OKE T
+CO, 7: POKET+320+CO,7:NEXT :rem 4
258 FORJ=O : FORT=1611
0TO T01611+24
4ST 8STEP4@
EP2 : POKET
+J ,66 : POKET+CO+J , 7: NEXT :NEXT :rem 208
260 FORT=1658T01650+6 : POKET, 64 : POKET+CO, 7: POKET+88
,64:POKET+89+CO , 7 :rem 58
Strategy Games 3

278 POKET+160, 64: POKET+1690+CO, 7 :NEXT :rem 14


289 FORU=1T04: FORT=1T04:C(T,U )=1528+2*T+80*U sNEXTT
: NEXTU :rem 13
296 DATA119@6,1111,1116,1121 :rem 83
388 FORT=1T04:READ E:A(T,1)=E:A(T,2)=E+200:A(T,3)=
E+4090:A(T,4)=E+609 :NEXT :rem 102
316 GOSUB57@ :X=1:Y=1:GOSUB58@ :rem @
3245 TIS="0980908" :rem 251
328 JO=15-( PEEK(5632@)AND15):IF JO<>lANDJO<>2ANDJO
<> 4ANDJO< >8THEND=5 : GOT03 48 :rem 74
336 D=LOG (JO) /LOG(2)+1 :rem 211
348 ONDGOSUB398,418,458,430,470 :rem 164
358 IF (PEEK(5632@)AND16) THEN375 :rem 246
360 GOSUB919 :MO=MO+1 :rem 1998
378 IF (PEEK (56328) AND16 )=0THEN37@ :rem 96
375 PRINT" {HOME}";TAB(32);RIGHTS(TIS,5);"{DOWN}
{5 LEFT}";MO :rem 19
388 GOTO32@8 :rem 105
398 IFY-1<=8THEN48@ :rem 86
496 Y=Y-1:GOSUB 588:RETURN :rem 74
416 IFY+1=5THEN48@ :rem 22
426 Y=Y+1 :GOSUB59@ : RETURN z:rem 74
430 IFX+1=5THEN48@ srem 23
446 X=X+1 : GOSUB5@@ : RETURN z:rem 74
458 IFX-1 <=8 THEN489 :rem 82
460 X=X-1 :GOSUB59@: RETURN :rem 78
470 GOSUB58@ : RETURN :rem 202
480 RETURN srem 124
496 GOTO328 s:rem 107
58 P1=PEEK(A(X,Y)):P2=PEEK(A(X,Y)+1):P3=PEEK(A(X,
Y)+4@) :P4=PEEK(A(X,Y)+41) :rem 8@
516 POKEA(X,Y),213:POKEA(X,Y)+1,201:POKEA(X,Y)+4@,
292 :POKEA(X,Y)+41,2@3 :rem 57
520 POKEA(X,Y)+CO,2:POKEA(X,Y)+1+CO,2:POKEA(X,Y)+4
G+CO,2:POKEA(X,Y)+41+CO,2 :rem 164
530 POKEA(X,Y),Pl:POKEA(X,Y)+1,P2:POKEA(X,Y)+40,P3
: POKEA(X,Y)+41,P4 :rem 243
535 P1=0: P2=0:P3=0: P4=0: GOSUB110:GOSUB120 :rem 162
540 RETURN srem 121
576 WE=INT(RND(@)*8)+1:FORJ=1TOWE*RN:READ Q:NEXT
:rem 214
580 FORY=1T04 : FORX=1T04 : READQ: IFQ=OTHEN608:rem 211
598 GOSUB614 :rem 181
600 NEXTX :NEXTY : GOSUB64@ :GOSUB680:RETURN :rem 197
619 POKEA(X,Y),77:POKEA(X,Y)+1,78:POKEA(X,Y)+40,78
: POKEA(X,Y)+41,77 :rem 162
620 POKEA (X,Y)+CO,2:POKEA(X,Y)+1+CO,2:POKEA(X,Y)+4
@+CO,2:POKEA(X,Y)+41+CO,2 :rem 165
630 RETURN :rem 121

79
3 Strategy Games
CU Se SeDV

FORX=1T04: FORY=1T04:B(X,Y)=PEEK(A(X,Y))
:rem 169
IFB(X,Y)=32THENB(X,Y)=B(X, Y)-9:GOTO679: rem 254
B(X,Y)=B(X,Y) :rem 185
NEXTY :NEXTX : RETURN :rem 32
FORY=1T04 : FORX=1T04 : READP s:rem 135
IFPTHENPOKEC (X,Y) ,86:POKEC(X,Y)+CO,1 :rem 219
NEXTX :NEXTY : RETURN z:rem 26
DATALS 1,/1717°1,0,0,1; 178), 8,190 Lyisi;i trem S2
DATAD,2,0,0, O,1,1,8, O,1,1,89, 9,0,0,8 zrem 75
DATAO,1,1,9, 1,0,0,1, 1,0,9,1, 6,1,1,9 srem 89
DATA1;1,1,ly7 Lylelye1 454 78574 i sen oe
DATAL,@,8,1, 0,1,1,98, 0,1,1,0, 1,0,0,1 srem 82
DATAL,1,1,1, 0,0,0,8, G,08,0,0, 1,1,1,1 srem 83
DATAG,8,8,1, 0©,0,8,1, 8,8,8,1, 9,8,8,1 :rem 88
DATA1,©0,0,1, 0,0,0,0, 8,0,0,8, 1,0,8,1 :rem 85
DATAD,8,02,0, 6,8,9,0, 8,8,8,80, 8,0,8,8 :rem 77
DATAZ ,&,0,0, 1,9,8,1, 1,9,8,1, 8,8,8,8 z:rem 82
REM REVERSE :rem 152
POKEA(C,D),109-PEEK(A(C,D) ) :POKEA(C,D)+1,119-(
PEEK(A(C,D)+1) ) :rem 24
820 POKEA(C,D)+40,110-PEEK(A(C,D) +40) :POKEA(C,D)+4
1,109-PEEK(A(C,D)+41) :rem 78
836 POKEA(C,D)+CO,2:POKEA(C,D)+1+CO,2 :rem 79
846 POKEA(C,D)+49+CO,2:POKEA(C,D)+41+CO,2:P1=0:P2=
@:P3=0 :P4=0 :rem 185
860 RETURN :rem 126
878 REM SET DATA POINTER :rem 178
918 REM{2 SPACES}WHICH ONES{2 SPACES}TO CHANGE
:rem 111
920 IFX+Y<>2THEN95@ :rem 127
938 FORC=2T0O3 :D=1:GOSUB819:NEXT: FORD=1TO3 :C=1:GOSU
B818:NEXT :rem 35
948 D=2:C=2:GOSUB810:RETURN :rem 169
958 IF X+Y<>8THENI8G :rem 139
968 FORC=3TO2STEP-1 :D=4:GOSUB810:NEXT:FOR D=4TO2ST
EP-1:C=4:GOSUB81@ :NEXT :rem 98
978 C=3:D=3:GOSUB810 :RETURN :rem 174
980 IF X+Y<>5THEN1®O2G :rem 173
998 IF X<>4THEN 1820 z:rem 41
1000 FORC=3TO D=1 :GOSUB8194
2STE :NEXT:
P-1:
FORD=1T03:C
=4:GOSUB810 :NEXT :rem 229
1918 C=3:D=2:GOSUB81@:RETURN :rem 207
1020 IFX+Y<>5THEN1@62 :rem 211
1038 IFX<>1THEN1O69 :rem 76
1948 FORC=2TO3 :D=4:GOSUB
:NEXT: FORD=4TO2ST
8198 EP-1:C
=1:GOSUB81@ :NEXT :rem 235
1958 C=2:D=3:GOSUB819 :RETURN :rem 211
1868 REM CHECK EDGES :rem 113

80
Strategy Games 3

1478 IF (X>1ANDX<4) AND ( Y=1ORY=4) THENC=X~-1 : D=Y:GOSUB


8180: C=X+1 :GOSUB818 :GOSUB1189 srem 105
1886 IF (Y> 1LANDY<4) AND ( X=1ORX=4 ) THEND=Y-1 :C=X:GOSUB
819 :D=Y+1 :GOSUB818 :GOSUB110@ :rem 188
1896 GOTO116@ :rem 203
1188 IFY=1 THEND=Y+1 : C=X :GOSUB810 s:rem 226
1119 IFY=4 THEND=Y-1 :C=X:GOSUB81@4 :rem 232
1126 IFX=4THENC=X-1 : D=Y : GOSUB810 srem 232
1130 I FX=1THENC=X+1 :D=Y:GOSUB810 :rem 228
1148 RETURN :rem 166
1158 REM CHECK CENTERS srem 29
1169 IF (X=1)OR(Y=1)OR(X=4)OR(Y=4)THEN 1200
:rem 144
1178 D=Y+1 :C=X :GOSUB8194: C=X-1:D=Y:GOSUB819 :rem 59
1189 D=Y-1 :C=X:GOSUB819 :C=X+1:D=Y:GOSUB8198 :rem 69
1190 C=X :D=Y :GOSUB819 s:rem 10
1200 RETURN srem 163
12190 PRINT"YOU WIN " srem 128

81
Campaign
Manager
Todd Heimarck

Make campaign appearances, conduct polls, wage media blitzes, and


take stands on issues in this national election simulation. The right
strategy and tactics can lead you to the White House.
The Democratic delegates are gathered in Moscone Center,
wearing straw hats, carrying balloons and signs. The floor
fights are done. The time has come to nominate.
“Maryland?”
‘Mister Chairman—the great state of Maryland, The Free
State, home of the World Champion Baltimore Orioles, casts
all of its ten votes for the senator from Arizona.”
The chairman bangs his gavel. The cheers and jeers
subside.

Power Broker
The convention is deadlocked. You control a large block of un-
decided delegates. It’s all up to you.
The vice president from Rhode Island has good charisma
and intelligence, but you know his health is not the best. The
reverend from Arkansas may look good on television, but he’s
too conservative. And though the senator from Arizona is
experienced, he’s not very bright. Perhaps the New Jersey doc-
tor? No, you decide that the senator from Ohio is best; your
party will also get the home region advantage in the populous
Heartland.
Now it’s the Republicans’ turn. Of the five choices, the
woman from South Carolina is the best all-around candidate.
She has high charisma and fundraising appeal, which trans-
lates into effective television ads.
It’s time to hit the campaign trail.

Nine Weeks of Campaigning


The Democratic candidate starts with nine million dollars and
59 health points. He rests two days (to build up some health),

82
Strategy Games 3
ASSERTS
HAC RT STO

followed by two days of fundraising. Campaign stops in IIli-


nois and Texas sway the voters slightly to the Democratic side.
The Republican campaigns in her home state of South
Carolina. She then moves on to North Carolina, Virginia, and
Florida, followed by a couple of days of recuperation.
As the campaign progresses, the Democrat concentrates
on personal appearances in the industrial Northeast, plus for-
ays into the larger states of Texas, California, Florida, and
others. The Republican candidate does less actual campaign-
ing, preferring to spend more time on fundraising to pay for
expensive television ads.
In the crucial eighth week, both candidates rest and
fundraise in preparation for last-minute campaigning. The
Democrat does a media blitz in the Pacific, Southern, and At-
lantic states. The Republican hits the Heartland, Arklatex, and
the urban Northeast.

Election Night
Initial returns from New England show that the Republicans
swept the region, but the larger states of New York and Penn-
sylvania went Democratic. The Republicans won most states
from Ohio to the Great Plains, but the Democrats picked up
the Southern Atlantic states, except for Florida. Texas went
with the G.O.P., while the rest of the region went Democratic.
The Rocky Mountain states were solidly Republican. But the
Democrats won the Pacific States.
The final results show the Republicans winning six of
nine regions, capturing the presidency with 315 electoral votes
to the Democrats’ 223. Three of the four biggest states voted
Democratic, but Ohio and Illinois, with 47 electoral votes be-
tween them, made the difference. The TV ads in the last week
edged those two key states into the Republican camp.

It’s Long—and Well Worth It


“Campaign Manager” is a two-player national-election simula-
tion written completely in machine language (ML). Make the
right decisions and your candidate will be elected. Make mis-
takes and you'll have to wait another four years.
This game is long. No doubt about it. It has to be to in-
clude the multiple options and to make it as realistic and true-
to-life as it is. It’s fast because it’s an ML program. Consisting
of a long stream of numbers, ML programs used to be difficult
83
3 Strategy Games
PNAC aR REECE

to type in. We’ve solved that problem with MLX, the “Ma-
chine Language Editor.” By using MLX, you can almost guar-
antee an error-free program the first time you type in Campaign
Manager. Make sure you read Appendix D, ‘Using the Machine
Language Editor: MLX” and have a copy of the MLX program
saved on tape or disk before you begin entering Campaign
Manager. It will still take time, but MLX will help immensely.
Before loading MLX, you have to protect part of BASIC
memory by typing the following line in direct mode (with no
line numbers):
POKE 642,40:SYS 58260
You'll see the usual cold start message, but there will be less
than the normal 39K of free memory. You can now load MLX
and begin typing in Campaign Manager.
MLX will ask for two addresses. They are:
Starting address: 2049
Ending address: 9518
The program uses about 10K, although it was crunched down
to about 7K. Since it’s such a long program, you'll probably
enter it in parts. If you do, make sure you follow the MLX
instructions for loading and saving. Type in the POKE
642,40:SYS 58260 before loading MLX at the start of each session.
MLX also has a numeric keypad option, which should save
you some time.
When you are finished typing in Campaign Manager, save
it to tape or disk, perhaps even making a couple of backup
copies as well. Turn your 64 off, then on again, load the pro-
gram as if it were a BASIC program, (LOAD" filename’’,8 for
disk or LOAD“filename” for tape) and type RUN. The first few
bytes look like a BASIC program that says SYS 2061. You
don’t have to remember the SYS; it’s built into the program.
Managing the Campaign
You have nine weeks to campaign. Each week you have to
plan your moves and enter them on the itinerary. You have
two defensive moves, resting and fundraising. And you have
two ways to gain votes, campaigning (personal appearances)
and advertising on television.
At the beginning of each turn, you'll see a medium-
resolution map of the U.S. that indicates which way each state
is leaning. The MAP option allows you to move a cursor
84
Strategy Games 3

around the country, to identify which states are which. (See


explantion below for joystick and keyboard movement instruc-
tions.) If the Republicans are ahead in that state, it’s colored
red. Democratic states are cyan, or light blue. If you’re using a
black-and-white TV for your display, the Republican states
show in a darker shade.
Since you have only 63 days (9 weeks of 7 days), you
have enough time to campaign in each state at least once. In
terms of electoral votes, however, California with 47 votes is
16 times more important than some of the smaller 3-vote
states like South Dakota or Vermont. Generally, it makes more
sense to campaign heavily in the ten biggest states, which
some people call megastates:

State Electoral Votes


California 47
New York 36
Texas 29
Pennsylvania 25
Illinois 24
Ohio 23
Florida 21
Michigan 20
New Jersey 16
North Carolina 13

Winning the election requires 270 electoral votes out of a


possible 538. The ten megastates account for 254 votes, just 16
shy of a majority.
At the beginning of the campaign, each state has a large
pool of undecided voters. As the game progresses, these voters
make up their minds and the pool diminishes.
Each state also has a built-in bias towards one party,
based on past elections for president, senator, governor, and
so on. The District of Columbia, for example, is staunchly
Democratic. A Democratic candidate will automatically get
seven campaign points there, compared to a Republican’s two.
Wisconsin leans toward the Republicans, but just barely;
Republicans get five campaign points to four for the
Democrats.

85
rategy Games
3 Set CNS

Since the Republicans have won three of the last four


elections, including the landslide victory in 1972, you might
expect them to begin the game with a huge advantage. But if
you look at nonpresidential elections, you'll find a lot of states
that elect Democratic governors, senators, and representatives
and then vote for a Republican president. And a lot of those
basically Democratic states were split by third-party cam-
paigns, such as Wallace in ‘68 or Anderson in ‘80.
To even things up, and make the game more playable, the
Democrats begin with an electoral vote advantage of 282 to
256, although 4 of the megastates (Pennsylvania, Ohio, Flor-
ida, and North Carolina) are just barely leaning to the Demo-
cratic side. The Republicans have the advantage of beginning
with 29 of the 51 states. (Since the District of Columbia has 3
electoral votes, it counts as a state in the game.) Most of the
states west of the Mississippi are Republican, while the Demo-
crats have most of the industrial Northeast and the South.
In addition to the natural political leanings, each state has
its own stands on five general issues: unemployment/inflation,
poverty/crime, agriculture, education, and defense. A very
urban state might be conservative on crime, but not care much
about agriculture, for example. Each candidate also has certain
stands on these issues. When you campaign or advertise in a
state, you can get up to 3 extra campaign points for each issue,
if your stand agrees with the voters’.
Finally, the candidate you choose has a campaign-
effectiveness rating, based on charisma and intelligence. The
campaign-effectiveness factor adds campaign points each time
you campaign.

Choosing a Candidate
At the beginning of Campaign Manager, you choose which
party will go first, and decide if one candidate will be the
incumbent. You might want to flip a coin, the winner choosing
either a party or whether to play first or second. In testing, we
found that the second player has the slight advantage of mak-
ing the last move. Being incumbent gives you some extra
campaigning strength and is not recommended if you want an
even game.
Note that all choices are made with a joystick. (It’s easier
to play if each player has a joystick; although one can be

86
Strategy Games 3
Me SOR EC RTL RA NO A eae E

shared. It doesn’t matter which port it’s plugged into.) Move


the pointer with your joystick and press the firebutton twice to
make your choice. If you don’t have a joystick, you can use
the keyboard instead; I, J, K, and L are up, left, down, and
right respectively. Press M in place of the fire button.
Players then pick the candidate who will represent their
party. Five randomly chosen candidates are available. To the
right of the candidate’s stats is the YES/NO counter. Before
making your choice, say NO to each possibility, until you’ve
seen all five. After selecting a candidate, enter the candidate’s
name from the keyboard.
The heart of the game is the actual campaign, but in some
ways the convention is just as important. Nominate a terrible
candidate and you'll spend most of your campaign trying to
catch up.

Healthy, Wealthy, and Wise


A candidate’s personality greatly affects the outcome of the
election. In the lower left-hand corner you should see a list of
five attributes, each associated with a number from one
(worst) to eight (best). With a couple of exceptions, the ideal
candidate is the one with straight eights.
First is charisma (CHAR), which is personal magnetism,
panache, the ability to influence and excite people. This is the
most important personality trait, because it is part of both
campaign effectiveness and advertising effectiveness.
Stamina (STAM) affects your health. A candidate with low
stamina will have to rest frequently, to regain health and
strength.
Intelligence (INTL) adds points to campaign effectiveness
and last-minute campaigning.
Experience (EXPR) helps you with fundraising. If your can-
didate has lots of experience, he or she has more contacts and
connections for raising money. Since experience comes with
age, it does count against your health. BI
Appeal (APPL) also contributes to fundraising attempts.
But if you have maximum appeal (eight) you may be tainted
by your affiliations with special-interest groups, and there’s a
backlash when you advertise. It’s best to have an appeal of six
or seven.

87
3 Strategy Games

The candidate’s attributes are generated by adding three


random numbers, so it’s more likely to get a middle number
(four or five) than one of the extremes. .
The personality traits translate into these five campaign
factors:
Campaign Effectiveness (CHAR*2 + INTL)
Strength/Health (STAM*4+9 — EXPR)
Fundraising Appeal (EXPR*3 + APPL)
TV Ads (APPL OR 8 + CHAR)
Last-Minute Campaigning (INTL + STAM)
The significance of each factor is explained below in the
section ‘Getting Votes.”

Here I Stand
Next to the personality factors are the candidate’s stands on
various issues. You see five issues, each with a sliding scale of
one (at the far left, representing liberal) to six (conservative). A
Republican who wants to get tough on crime, for example, will
have a rank of six. A Democrat who wants to solve the un-
employment problem will have a rating of one in that category.
Candidates will range from two to five on the issues of
agriculture and education. On the other three issues, the
Democrats will have stands from one to four; the Republicans
will go from three to six.
You will generally get more votes with middle-of-the-
road-beliefs. Look for a candidate with twos or threes if you’re
the Democrat. Fours and fives are best for the Republican. The
exceptions are agriculture and education, where you do best
with a three or a four.
Common sense tells you which issues are important in
most states. Agriculture is a major issue in the farming states.
Your stand on defense makes a difference in states with a lot
of military-related industry.
The candidate’s personality is generally more crucial than
the stands on issues. If you have a lot of charisma, intelli-
gence, and appeal, it doesn’t matter that you may be radical
on one or two issues.
If you have five very bad candidates, hit RUN/ STOP-
RESTORE, type RUN, and try again. It’s not much fun to run a
campaign you're destined to lose.

88
EMAAR EET A: NCR Strategy Games 3
2A aa

Beginning the Campaign


After the nominees have been chosen, the first week begins.
You may notice that some states have changed colors. That's
because each nominee gets the equivalent of campaigning
once in each state. If one is much more charismatic, or hap-
pens to hit the right issues, a state may jump over to his or
her side. In addition, each candidate gets a home state and
home region advantage.
You should develop a strategy. If your appeal and cha-
risma are strong, you might want to concentrate on television
ads. If your candidate has a strong anti-crime stance, visit the
more urban states. At the very least, you should plan to visit
each of the megastates.
You begin in your home state; it’s traditional to campaign
there once. And the first week usually means some fund-
raising and resting, as purely defensive moves.

The Doctor, Treasurer, Pollster, and Pilot


Under the week’s itinerary should be two numbers. At the
beginning of each week, your treasurer tells you how much
money you have, up to about $25 million. Your personal
physician figures out how healthy you are. At most you'll
have 255 health points.
If you fall below four million dollars any time during the
week, television advertising will be useless. If you have less
than one million, you won't be able to pay the pollster (you
won't even see the bar graph to the left of the U.S. map).
When your bank account falls to zero, the campaign is para-
lyzed until you sponsor a fundraiser. You can’t even afford to
pay your doctor or staff.
It takes time away from campaigning, but you have to
raise money once in a while. Each fundraising point (EXPR*3
+ APPL) is worth $200,000.
Campaigning is exhausting, and even though it takes
time, once in a while you have to rest. When you decide to
catch some Z’s, the itinerary will be filled with (you guessed
it) Z’s. Each day of rest gains double your strength factor, plus
campaign effectiveness, plus the number of states you are win-
ning. A high campaign effectiveness gives you optimism; you
rest better. If you're losing, you worry about it and toss and
turn. Resting two days in a row gets you 16 extra health
points.

89
3 Strategy Games

There are two reasons to keep your health up. First, when
you campaign in a state, you get an extra campaign point for
every 32 health points you possess. Second, if your health falls
below eight you look haggard and stutter; campaigning does
you no good.
The treasurer counts dollars, the doctor counts your
health, and your pollster counts votes.
The pollster does three things. First, you get a bar chart
which shows how many electoral votes would go to the
Democrats and Republicans if the election were to be held to-
day. You can see it to the left of the map. The gray bar marked
U represents undecided states too close to call. Second, you
have a map of the U.S. to show you, at a glance, which way
each state is leaning. Republican states are red, Democratic
states are blue. These first two services are part of the stan-
dard pollster’s contract, and cost you nothing. Of course, if
your money drops lower than one million, you have to stop
paying the pollster; all you get is the map.
The third service is the most important—regional polls.
To get a poll of all states in a region, move the cursor to POLL
(below MAP on the main menu) and press the fire button
twice. You'll see a bar chart showing which way each state in
the region is leaning, from one (half a character wide) to four
(two characters). The poll reflects the political situation at the
beginning of the week; whatever campaigning you have
planned for the week is not included. A state with a thin bar
is just barely inclined toward one side or the other and can
usually be taken with a single campaign stop.
Don’t use polls in the first couple of weeks—most states
start out fairly even and you will not learn much. But polling
can be vital towards the end of the game. If New York is
firmly committed to you, forget about further efforts in that
state. And if you find a whole region weakly supporting your
Opponent, you can hit it with TV ads and score a few dozen
electoral votes.
Regional polls cost $100,000 and are not available if you
begin the week with less than a million dollars.
_ The final character in your entourage is the jet pilot. Your
jet can carry you on short hops within a region for almost
nothing. But if you travel to a new region, you shell out
$100,000 for fuel and maintenance. As long as you're in a re-
gion, you might as well stay there a few days, to avoid spend-
90
Strategy Games 3

ing a lot on travel expenses. Again, you don’t actually move to


a new region until you have campaigned in one of the states.
You can use the travel option to conduct regional polls; you'll
pay $100,000 for the poll and another $100,000 if you decide
to campaign in a region. Don’t campaign and you won’t be
charged for travel.

Guests and Fish


Benjamin Franklin once said that after three days, guests and
fish begin to smell. The same principle applies to campaigning.
Campaign once and you gain some votes. Stay for a sec-
ond day and the voters of a state are flattered; you gain a
couple of bonus votes. But stick around for a third or fourth
day and you've overstayed your welcome.

Getting Votes
Each state begins with 255 undecided voter points. Your main
goal is to use campaigning and television advertising to move
a few points from undecided to firmly committed to you. And
you have to maintain your health and money.
The effects of a personal appearance can vary. You get up
to 3 points for each issue (if the state agrees with your stance),
1 point for every 32 health points, and up to 24 for your cam-
paign effectiveness (CHAR*2 + INTL), plus a 2-point bonus if
it’s the second day you've been in the state.
If your money is down to 0, you get no campaign points
at all. If your health is below 8, you get only a single vote.
Each campaign stop decreases your health and money.
And it’s possible to run out in the middle of the week, making
each succeeding visit ineffective until you rest or raise money.
Let’s say you go to Connecticut and impress 23 of the 255
undecideds. The pool of available voters is reduced by that
number. Half of 23 (11 points, in this case, due to rounding
off the decimal) is charged against your health. Half again (5
times $100,000, or $500,000) is subtracted from your money.
In addition, each state has some people who don’t agree with
you, so a quarter of your total (five points) goes to your oppo-
nent as a sort of backlash. If you had previously been in a dif-
ferent region, travel expenses of $100,000 are subtracted.
Television advertising is a little different. It affects every
state in the region and quickly swings voters to your side. To
advertise, first travel to the region and, before doing any ads,

91
3 Strategy Games
OEE
Be EE

make at least one campaign stop to establish your presence


there. After campaigning once, you can advertise as many
times as you like. 3
Unlike resting and campaignin g, the effects of advertising
are not cumulative from day to day. If you advertise two days
in a row, you don’t get bonus points. Advertising does grow in
strength from week to week, however, and will be more effec-
tive towards the end of the campaign.
Because you flood the region with ads, it’s possible to
bring a whole section of the country to your side. But it is
expensive. In each state, advertising credits you with half your
campaign effectiveness, half your TV ads’ effectiveness rating,
points for issues, plus two times the week number (in week
seven, for example, you get fourteen extra campaign points).
The cost is the usual one fourth of campaign points
gained, plus double the TV ads’ effectiveness. The large re-
gions can cost a lot. Going on TV in the Atlantic States (nine)
or in the Rocky Mountain States (eight) can easily deplete
your treasury.
On the day you plan to advertise, you must have at least
four million dollars. If you don’t, you waste the day and
gather no new votes. So, if you begin the week with five mil-
lion dollars and campaign in six states, it’s likely that by Sat-
urday there'll be less than four million remaining. Your ad
campaign will be useless.
There’s one more item you can choose: RECONSIDER. If
you make a mistake, this option will cancel all your choices
and you can start the week anew. Your itinerary is not perma-
nent until you fill out the seventh day and press the fire but-
ton (if you pull on the joystick instead, it’s the same as
reconsidering).
Here’s a summary of the commands on the main menu:
¢ CAMPAIGN—allows you to make a personal appearance in
one of the states in the region you’re in. Gains votes, costs
health and money.
e TV ADS—floods the region with advertising. Reduces health
and costs a lot of money, but can quickly deliver a big chunk
of votes. Doesn't work if you have less than four million
dollars.
e FUNDRAIS—raises money for your campaign. Takes a day,
gains No votes, costs nothing.

92
TERS
ee Strategy Games 3
San ee er re eR

@ REST—builds up your health points. Gains no new votes,


costs nothing.
e MAP—moves the cursor around the map, prints the state
name, electoral votes, and region number. For information
only, costs nothing.
e@ POLL—provides a bar graph showing which way the states
in the region are leaning. Costs $100,000 immediately. Not
available if money falls below a million.
@ RECONSIDER—erases the week’s itinerary if you make a
mistake.
e TRAVEL—takes you to a new region of the country. Costs
$100,000, which isn’t charged to you until you actually cam-
paign there.

The Home Stretch


The ninth week is usually the most hectic. If you sponsored
some fundraisers in week eight, you'll want to spend a lot on
television advertising in the regions you have a chance in.
Polls can tell you which states are most vulnerable.
After both candidates have finished their last week of
campaigning, a couple of things happen. The last region to be
visited by a candidate gives a few extra votes to him or her.
And the last-week routine goes into action as all the un-
decided voters make up their minds. The candidates get their
last-minute campaigning points (INTL + STAM) added to
each state in the country. The undecided voters are split be-
tween the candidates, and ties are resolved based on the built-
in bias to one party or the other.
The map is drawn for the final time. The final bar chart
appears to the left. This should indicate at a glance which can-
didate won. Beginning with Region 1 (New England), the
electoral votes are displayed, with region totals underneath.
The winner is the candidate with the most electoral votes.
There is a slight chance that there will be a tie, in which case
ou’d have to flip a coin.
After the votes are counted, you can play what-if? A close
game generally brings comments like, “I should have cam-
paigned a little more in Texas or California or New York (or
whatever state you thought you had won).”’

Game Etiquette .
There are a few traditional rules of Campaign Manager
etiquette:
93
f
/
j

| 3 Strategy Games
;
; _

wy,
;

| ;

First, since the joystick routine reads both joysticks, try to


avoid interfering with your opponent's choices. Put down your
joystick when it’s not your turn. ah
Second, when you have filled out your itinerary and the
prompt PRESS FIREBUTTON TO CONTINUE comes up, don't
press the firebutton. Let your opponent study what moves you
made. Then he or she can press the firebutton. :
Third, since polls cost money, they should be kept private.
When the other player is doing a poll, look away from the
screen.
On to the White House
Campaign Manager is a true simulation. It accurately repre- .
sents different candidates’ strengths and weaknesses, cam-
paign strategies and tactics, and allows for that bane of all
politicians, a bit of luck. You'll find the game entertaining, but
highly educational as well. We all can’t run for the presidency.
But with Campaign Manager, you can at least see how you
would have done, given the chance.
: f\ §

7\, Campaign Managex\\


For easy entry of this machine language program, be sure to read “Using the Machine Lan-
guage Editor: MLX,” Appendix D. Also make sure to enter POKE 642,40:SYS 58260 in direct
mode before loading MLX in preparing to type in this program.
2049 :911,008,018,008,158,850,238
2055 :848,054,049,000,0008,000,158
2061 :032,110,012,032,241,812,196
2067 :632,122,017,032,108,031,1985
2073 :869,250, 204,204, 204,204,136
2079 :220,192,0008,000,000,005,192
2085, 3229, 255,167, 255,255;255¢173
2091 :255,178,030,128,000,000,122
2097 :219,995,258,031, 255,255,130
2103 :255,255,143,045,000,004, 245
2199 :245,037,255,255,031, 255,115
2115 :255,255,241,197,250,076,061
2121 :255,248,095,995,255,255,252
2127 :255,255,143,191,175,245,963
2133. 4255,115),837,245 255,255, 223
2139 :255,252,204,254, 258,247,817
2145 :935,076,032,015,247,255, 245
2251 2255,255, 255, 250, 254,162,254
2157 :250,047,018,000,995,821,828
2163 :255,255,227,255,092,252,171
2169 :204,860,284,000,000,127,204

94
Strategy Games 3

2175 £175, 255,255,255, 250, 255,036


2181 :204, 060,207,176, 000,001,013
2187 42,255, 255,191, 255,239,040
2193 :175,250, 247, 224, 000,000,017
2199 :009,901,051,127, 255,255,072
2211 ara’ Leo128/a90" 119"9953
:879,160,128,808,119,
2217 047, 225,035,127,000,000,091
2225 [17 aoo!00,900" 136" 690.22
2235 :800,211,058,00, 112,000, 05¢
:0 2, 900,200, 020,001, 250.

zs sees eae ne eaataaeanatia


2247 :000,916,000,160,900, rhs
; 022,00, 000,2
2265 :032,227,008,032.0 et
2271 “Waa }eta iodo sada thie beak
2277 ida ar Sake Wi ian eee
2283 :165,801,041,251,13 ree ee
2289 Dio vida tris Orie tae Seta
2295 \ vidisOocytes Hele tas eae
2301 fila ics foarp ae big ees egee
2307 iG tale Gide His Boe tes
2313 ise tice Was teas ae cade tae
2319 igo ives “ii Maas tine cee ees
2325 :001,173,014,220,0 oe pesas
2331 tide its Heid Alte sone Bio
2337 :041,240,009,014,141,024, 246
2343 :208,096,169,057,133, 252,186
2349 :133,254,169,880,133,251,041
2355 :169,208,133,253,032,068,146
2361 :009,169,024,133,251,169,044
2367 :216,133, 253,198, 254,168,253
2373 :039,177,251,145, 253,136,046
2379 :016,249,096,169, 255,141,233
2385 :003,056,169, 240,141,902, 180
2391 :056,169,015,141,001,956,013
2397 :162, 000,142,000, 056,134,075
2403 :251,138,032,117,009,138,016
2409 :032,114,009, 232, 224,016, 220
5415 :208,243,096,234,074,074,016
3421 :041, 003,168,185, 000,056,058
2427 :160,003,145,251,136,016, 066
3433 1:251,230, 251,230, 251,230,036
3439 :251,230,251,096,169,054, 162
3445 :133,252, 169,000,133, 251,055
3451 :168,170, 224,188, 208,001, 082
3457 :096,189, 025,008,072, 074, 105
3463 :056,106,074,0874,145, 251,097
95
3 Strategy Games aaa

2469 :832,181,009,104,941,015,035
2475 :0809,032,145,251,032,181,953
2481 :809,232,208,224,201,032,859
2487 :208,9004,0909,192,145,251,224
2493 :200,192,025,248,801,096,175
2499 :169,008,145,251,168,024,184
2585 :169,026,181,251,133,251,108
2511 :144,002,230,252,096,812,175
2517 :001,003,002,014,160,004,141
2523 :185,212,809,153,8 32,
208,250
2529 :136,016,247,173,9017,208,254
2535 :009,064,141,917,208,096,254
2541 :832,247,009,832,110,018,165
2547 :032,185,010,096,169,147,114
2553 :032,210,255,160, 003,032,173
2559 :087,010,169,144,932,219,139
2565 9255,169,171,038 -220,255 ,073
2571 :169,163,032,101,019,169,143
2577 :167,832,210,255,162,815,090
2583 :160,003,032,082,019,169,223
2589 :170,0 32,
218, 255,169, 154,251
2595 :932,219,255,169,169,0932,125
2601 :101,019,169,144,032,210,195
2607 :255,169,165,032,2 19,
255,169
2613 :202,208,223,160,003,032,113
2619 :882,010,169,174,8032,210,224
2625 :255,169,172,032,161,019,836
2631 :169,173,032,210,255,169,9055
2637 :146,032,21¥0,255,896,169,217
2643 :013,032,2198,255,169,832,826
2649 :032,210,255,136,2 08,
258,156
2655 :169,818,032,218,255,896,1987
2661 :160,025,032,2190,255,136,151
2667 :208,250,096,169,804,133,199
2673 2:254,169,044,133,253,169, 141
2679 :8954,133,252,169,000,133,892
2685 :251,169,800,168,162,815,122
2691 :177,251,288,8087,832,1608,198
2697 :010,202,208,246,096,145,08290
2703 :253,200,208,240,041,063,124
2709 :170,189,192,055,8041,192,220
2715 :017,247,145,247,8996,024,163
2721 :169,026,101,251,133,251,0868
2727 :144,002,230,252,169,040, 236
2733 :024,101,253,133,253,144,057
2739 :002,230,254,168,000,096,153
2745 :169,015,133,249,169,216,112
2751 :133,254,169,944,133,253,153
2757 :133,247,169,004,133,248,1907

96
Strategy Games 3

2763 :169,034,133,252,169,173,1989
2769 :133,251,169,824,177,251,181
2775 :201,089,248,043,133,002,966
2781 :041,963,178,189,192,855,163
2787 :841,015,145,253,169,192,818
2793 :836,892,248,025,848 098,088
,
2799 :189,128,034,832,147,8198, 0983
2885 :208,015,888,907,169,192,148
2811 :032,155,018,288,806,189 083
,
2817 :121,034,832,147,8010,234,067
2823 :136,016,283,169,025,0249868 ,
2829 :101,251,133,251,144,002,127
2835 :230,252,198,249, 208,001,133
2841 :096,169,048,024,1801,247,190
2847 :133,247,144,002,238,248,011
2853 :169,048,8024,191,253,133,245
2859 :253,144,165,238,254 208,017
,
2865 :161,173,018,208,8972,181,914
2871 :162,074,974,974,168,194,199
2877 :229,162,974,141,932,298,139
2883 :140,036,298,096,831,967,133
2889 :865,077,080,965,973,9071,248
2895 :878,032,977,965,978,065,218
2991 :871,8969,082,013,000,162,226
2997 :918,169,9098,924,032,248,061
2913 :255,162,908,189,871,9011,917
2919 :248,006,032,219,255,232,054
2925 :208,245,160,005,169,801,129
2931 :141,134,9002,169,818,032,099
2937 :210,255,162,049,173,134,9071
2943 :8@02,973,903,141,134,9002,226
2949 :169,163,932,210,255,202,140
2955 :208,258,136,208,235,169,065
2961 :146,876,218,255,169,146,123
2967 :133,254,169,0800,133,253,969
2973 :162,900,232,236,137,036,192
2979 :248,047,189,137,936,133,177
2985 :249,041,007,133,247,165243 ,
2991 :249,074,974,074,074,041,249
2997 :007,133,248,160,902,032,251
3003 :230,011,165,247,169,001233
,
3009 :832,230,011,169, 255,160,926
3015 :005,145,253,169,8005,024,032
3021 2101, 253,133,253,076,159,156

3827 :@11,169,9098,178,168,185,146
3033 :068,034,157,080,120,232,060
3039 :232,200,192,052,208,243,070
3045 :096,145,253, 200,200,145, 244
3051 :253,096,169,145,133,248,255

97
3 Strategy Games

3057 :169,000, 133,247,230, 247,243


3063 :133,254,170,162,900,189,131
3069 :189.036,133, 249,074,074, 240
3075 :074,074,133,250,189, 240,195
3081 :036,133, 251,074,974, 133,198
3087 :252,074,074,133,253,168,193
3093 :004,162,004,181,249,072,181
3099 :041,003,024,105,001,145,090
3105 :247.104,074,074,041, 003,064
3111 :024,105,003, 010,010,010, 201
3117 :@10,017, 247,145,247, 136,879
3123 :202,016, 226, 230, 247,160,188
3129 :022,169,815,049, 247,170,197
3135 :232,138,810,019,010,010, 217
3141 :133,602,138,005,002,145, 238
3147 :247,136, 208,235, 230, 247,098
3153 :230,247,230, 247, 230,247,232
3159 :230,254, 166, 254,224,051, 242
3165 :208,157, 896,169, 255,141,995
3171 :@15,212,169,128,141,918,014
3177 :212,141,024, 212,096, 162,184
3183 :064,169, 000,157, 000,143, 132
3189 :157, 064,143, 202, 208, 247, 114
:169,128,141.138
3201 pan igat axa eevee mae
3207 011,032, 258,026,032, 108, 082
: 128,923, 032,139,
3219 :009,932,030,028.932. pr
3325 JURGG2> 03 aE Gee Le
3231 baa: a7 a 19 weakens Gee bas
3237 fa3218 1255932 won’ DLL ees
3243 :032,030,020,032.95 ta ase
3249 tas5 26 asi Ata ad man ae
3255 :248,245,032.217.9 aan as
3261 :696,012, 162 Ha een wa
3267 :832,163,028,141, ae ae
3273 :141,035,037, 162, von en
3279 :009,032,163,028,1 egy
3285 :168,000, 201,200, peep tee
3291 :@41,001, 240,90 ADS, idee
3297 :136,142,015, ee nage a i
aes ee 832,046,017, 268. qe ve
:276,157,812,096, 169,
3315 :141,836,037,169, reas
3321 :247,169,143,13 yer erer

3p ee a 2 ae a
eg Bei, 133,082, Bid fas peer ae
:003,17
5 :001, 037,250,024, 105,001,179*

98
FPS Strategy Games 3
RR SR EOE ATT

3351 :101,251,181,252,145 247,096


,
3357 :136,208,228,168,006,173,172
3363 :627,212,041,0803,170,192,168
3369 :008,240,010,192,209 240, ,
228
3375 :086,173,021,143, 248,002,120
3381 :232,232,232,138,145 247,255
,
3387 :208,192 208,,811
226,173,045
,
3393 :027,212,041,96 240, 249,129
3,
3399 :201,052,176,245,145 247,113
,
3495 :200,173,015,143,145 247,232
,
3411 :208,009,173,027,212,041,241
3417 :887,010,010,145, 247,032,828
3423 :220,014 208,157,126
602,,198 ,
3429 :160,000,140,845,617,169,120
3435 :128,133,247,169,143,133,036
3441 :248,173,845,017, 201,005,034
3447 :176,236,170,248,006,032,211
3453 :220,014, 262,208,250, 238, 233
3459 :045,017,160,005,177 247,914
,
3465 :153,015,143,136, 208,248,816
3471 :169,806,162,800,177,247,127
3477 :157,927 232,224,198
20,,143 ,
3483 :085,208,245,177,247,141,154
3489 :812,143,141,018,143 200,042
,
3495 :177,247,141,013,143,032,152
3581 :228,014,032,238,814 208,139
,
3507 :003,876,106,813,032,046,199
3513 :017,240,169,162,008,134,139
3519 :248,160,006,824,932 248,133
,
3525 :255,173,821,143, 285,035,005
3531 :037,240,802,162,812,134,022
3537 :247,189,158,028, 248,006,045
3543 :632,218,255,23 208, 245,117
2,
3549 :169,063,032,218,255,166,092
3555 :247,168,810,169,044,157246 ,
3561 :158,020,232,13 208, 249,212
6,
3567 :032,228,255,240, 251,201,166
3573 :013,240,039, 201,032, 240, 242
3579 :008,201,965,144, 239,201,085
3585 :091,176,235,230,248,166,123
3591 :248,224,011,240,019,164,145
3597 :247,153,158,020,041,963,183
3603 :157,005,004, 230,247,169, 063
3609 :047,157,006,00 208, 208,143
4,
3615 :032,0838,015,032,046,017,211
3621 :240,149,173,015,143,041030 ,
3627 :002,024,109,016,143,810,091
3633 :109,018,143,141,022,143,113
3639 :173,017,143,810,018,105,081
99
3 Strategy Games

3645 :009,056, 237,019,143,141,154


3651 :023,143,173,027,212,041,174
3657 031,010, 109,023, 143,105,238
3663 :032,141,008,143,173,015,079
3669 :143,041, 004,109, 019,143,032
3675 :010,109,019,143,109,020,245
3681 :143,141,024,143,010,109,155
3687 :018,143,105,048, 141,009,055
3693 :143,173,020,143,009 ,
008,293
3699 :109,016,143,141,025,143180 ,
3705 :173,015,143 ,041,0 07,024 ,012
3711 :109,018,143,109,017,143,154
3717 :141, 926,143, 162,000, 173,018
3723 :012,143,232,221,127,036,142
3729 :176,250,142,032,143,142086 ,
3735 :011,143,142,633,143,032,143
3741 :132,027,173,821,143 ,8
205,09
3747 :035,037,240,003,076,241,027
3753 :012,173,015,143,041,003,044
3759 :141,129,143,932, 243,027,122
3765 :169,000,141,129,143,174,169
3771 :033,143,189,127,036,168,115
3777 :202,189,127,036,170 ,
202,095
3783 :032,2 47,027 ,032,1 32,827 ,184
3789 :173,021,143,205,035,037,951
3795 :208,213,032,259,626,032204 ,
3801 :108,0 27,096 ,169,0 16,024 ,145
3807 :101,247,133,247,096,032,055
3813 :237, 009,932, 205,021,032,253
3819 :038,015,096,169,015,133,189
3825 :253,169,022,133,254,169,217
3831 :029,133,167,162,240,169,114
3837 :016,032,184,020,173,021.187
3843 :143,240,013,162,018,189.2498
3849 :117,020,041,063,157,156.051
3855 :006 ,2
208, 02
245,17 ,102
3,021.
3861 :143,205,035,037,240,003.172
3867 :238,125,006,162,020 160.22,6
3873 :021,032,163,028,096.174.935
3879 :021,143,189,040,037,032.245
3885 :210,255,169,017,133,253.958
3891 :169,625,133,254,169,900.033
3897 :133,167,162,081,160.016 998
3983 :032,184,820,169,031,032.g19
3909 :210,255,169, 828,133,253 985
3915 :169,025,133,254,169.909 966
3921 :133,167,162,171,160,016.122
3927 :032, 184,020, 162,019,232, 224
:160,015,024,032,240,255.951

100
ARTE SRRStrategy Games 3
eee eee

3939 :162,049,138,032,210,255,177
3945 :232,224, 208, 247,056,
055,103
3951 :832,248,255 624,
,224208,070
,
3957 :230,173,812,143,010 170,887
,
3963 :189,220,033,841,063,141042 ,
3969 :171,006, 232,189, 220,033,212
3975 :041,063,141,172, 806,162, 208
3981 :018,160, 002,024,032, 240,185
3987 :255,174,621,143,189,040201 ,
3993 :037,032,218, 255,174,013, 106
3999 :143,048,014, 168,004,189, 205
4005 :049,016,032,21¥, 255,232,191
4011 :136,208,246,240,013,162,152
4017 :000,189, 228,016,240, 296,988
4023 :032,219,255 208, 245, ,
,232 085
4929 :169,158,133,247,169 020,061
,
4935 :133,248,168,000,173,821,162
4041 :143,285,035,037, 240,202,895
4047 :160,012,177, 247,248, 006,025
4953 :032,210, 255,200, 208,246,084
4059 :173,621,143,240,032,162222 ,
4965 :010,189,117,620,041,963,153
4971 :157,248,006,202, 208,245,017
4077 :169,620,133,253,169,822235 ,
4083 :133,254,169,909,133,167,084
4089 :162,218,160,016, 032,184, 245
4995 :620,162,004,160,168,189182 ,
4101 :616,143,009,048,153,839,157
4187 :007,152,056,233,048,168,155
4113 :202,016,248,162,004,160,033
4119 :160,152,024,125,027,143,142
4125 :168,185,046,007,009 064, 252
,
4131 :153,046,007,152,056 233,179
,
4137 :@40,041, 248,168, 202,016,244
4143 :232,096,083,069,078,032,125
4149 :071,079,086, 032,082,069, 216
4155 :080,032,082,069, 086,032,184
4161 :032,877,083,032,968 082,183
,
4167 :062,032,086,061, 080,032,168
4173 :071,069,0878,032,027,044,142
4179 :000,027, 000, 255,044
044,197 ,
4185 :068,869,077,079,067,082,019
4191 :065,984,073,067,032,067,227
4197 :065,878,868,973,068 065,006
,
4203 :084,069,032,044,044,044,168
4209 :044,044,044,000,255,156,144
4215 :047,032,067,072,065 082,228
,
4221 :032,088,900,255,047,032067 ,
4227 :083,984,965,077,032,088,048
101
3 Strategy Games

4233 :000,255,047, 032,073,078, 110


4239 :084,076, 032,088,000, 255,1665
4245 :047,032,069, 088, 080,082,03
4251 :032,088, 000,255, 047,032,0970
4257 :865,080, 080,076, 032,088,97
4263 :000,000,000,000,255,031,197
4269 :085,078,069,077, 080,000,050
4275 :255,080,079,086,084, 089, 084
4281 :000,255,065,071,082,073,219
4287 :067, 000,255,069, 968,085,223
4293 067,078,000, 255,068,070, 223
4299 :069,078,083,009,000,080,177
4305 :000,255,031,073,078,070204 ,
4311 :076,078, 000,2 55,06 7, 082,0 05
4317 :@73,077,069,000, 000,000,184
4323 :000,157,080,082, 069,083,186
4329 :073,068,069,078, 084,032,125
4335 :@00,255,151,080,076,065,098
4341 :089,069,082,032,091,649,145
4347 :000,255,068,069,077,079,031
4353 :067,082,065,084,073,067,183
4359 :008,255,067,079,0 78,68
086,0
4365 :069,078,084,073,079,078,218
4371 :000,010,166, 000,005,032, 232
4377 :@00,255,030,032,047,032,165
4383 :078,079,000,255,032,047,010
4389 :032,089,069,083, 000,000,054
4395 :800,008,000,173,085,004225 ,
4401 :072,169,008,133,162,133206 ,
4487 :198,1 69, 032 ,19 7,1 62,
208,253
4413 :252,162,023,189,098,017,034
4419 :041,063,157, 004,004, 202,826
4425 :016,245,032,826,031,173,084
4431 :107,031,240,248,162,023,122
4437 :104,157, 004,004, 202,016,860
4443 :258,173,107,031,041,616,197
4449 :096,058,070,073, 082,069,03,3
4455 :066,085,084,084,879,078067
4461 :032,084,079,032, 067,979, 226
4467 :078,084,073,078,085,069,070
4473 :058,173,035,037, 205,821,138
4479 :143,208,011,238,036,037,032
4485 :173,036,037,201,010, 208, 030
4491 :001,096,032,237,009, 032,034
4497 :205,021,032,038,015,169, 113
4503 :007,141,000,143,032,244, 206
4509 :820,162,005,168,612,032, 036
4515 :163,028,178, 208,003,076, 643
4521 :003,018,262,208,003,076,167
102
Rao at eC Strategy Games 3
RRC “a area oaenaeeeaS

4527 :147,818,202,208,003,876,861
4533 :197,018,292,208,003,876,117
4539 :239,8018,282,208,086,832,124
4545 :043,029,076,155,8202,283 017,
4551 :298,088,032,022,019 208,184
,
4557 :205,076,003,818, 202,208,149
4563 :014,8032,046,017, 248,197,245
4569 :173,911,143,141,032,143,9892
4575 :876,141,9817,202,249,903,134
4581 :076,155,017,076,290,819,004
4587 :162,8000,169,128,024,189,859
4593 :032,143,168,169,9098,133,118
4599 :253,169,014,133, 254,169,215
4605 :030,133,167,976,184,920,095
4611 :032,235,017,174,832,143,124
4617 :189,127,036,202,956 253,194
,
4623 :127,036,072,1905,083,168,014
4629 :162,0903,032,163,028,201,998
4635 :8900,208,007,032,043,829,890
4641 :104,076,006,018,133,002,116
4647 :194,197,8002,176,003,876,085
4693 2:155,017,198,0 1/5, 032,214
02,
4659 :143,202,189,127,036,024,904
4665 :101,002,174,000,143,157,122
4671 :960,143,133,251,134,252288 ,
46077 :032,258,019,169,030,932,089
4683 :2190,255,165,251',919, 170,112
4689 :189,220,033,032,210,255,252
4695 :189,221,933,93 219, 255,903
2,
4701 :169,932 219, 255,189,
,903 2, 212
4707 :900,120,072,170,169,000,118
4713 :032,205,139,104,201,010,078
4719 :176,005,169,032,032 210,223
,
4725 :255,169,032,03 210, 255,046
2,
4731 :169,152,0327210, 255,173,090
4737 :932,143,009,048,032,210,091
4743 :255,206,000,143, 208,003,182
4749 :8976,007,020,076,0006,918,088
4755 :174,000,143,169,240,157,906
4761 :000,143,134,252,032,250,196
4767 :919,169,129,032,2198,255,205
4773 :162,900,189,112,021,240,121
4779 :006,032,210,255,232,208,090
4785 :245,173,032,143,909,0848,059
4791 :032,210,255,206,000,143,905
4797 :208,083,076,907,020,076,9067
4803 :155,817,174,000,143,169,085
4809 :255,157,000,143,134,252,118
4815 :832,250,019,169,154,032,095

103
tegy Games
32

4821 :210,255,162,900,189,125,130
4827 :021,240,006,032,218,255,215
4833 :232,208, 245,206, 800,143,235
4839 :208,003,076,007,020,076,189
4845 :155,017,174,000,143,169,127
4851 :000,157,000,143,134,252,161
4857 :032,258,019,169,155,032,138
4863 :210,255,169,098,162,005,122
4869 :032,210, 255,202, 208, 250, 138
4875 :206,000,143,208,003,076,135
4881 :007,820,076,155,017,173, 209
4887 :009,143,201,010,176,001,051
4893 :096,206,009,143,032,153,156
4899 :633,174,032,143,189,127,221
4905 :036,133,248, 202,189,127, 208
4911 :636,133,247,169,150,133,147
4917 :249,169,004,133,258,169, 803
4923 :047,133,251,133,252,166,917
4929 :247,228,248,208,003,876,051
4935 :846,917,165,249,024,105,165
4941 :040,133,249,144, 962,230,107
4947 :250,189,000,144, 133,253,828
4953 :133,254,162,004, 006,254,134
4959 :202,208,251,006, 254,176,168
4965 :828,169,037,133, 251,006,213
4971 :254,176,0620,169,832,133,123
4977 :251,006,254,176,812,169,213
4983 :037,133,252,006, 254,176, 209
4989 :004,169,032,133,252,160,1987
4995 :000,169,032,145,249 ,8
200,15
5001 :165,251,145,249, 200,165,032
5007 :252,145,249,169,447,133,114
5013 :251,133, 252
006, 253,17 ,
6,196
5819 :©28,169,042,133,252,006,817
5025 :253,176,020,169,032,133,176
5031 :252,006,253,176,812,169,811
5937 :042,133,251,0806, 253,176,019
5043 :004,169,032,133,251,168.169
5849 :007,165,251 ,145
249, ,8
200,17
5055 :165,252,145, 249, 230, 247,199
5861 :076,858,019,032, 103,023,252
5867 :174,032,143,232, 232, 232,224
5873 :160,031,024,032, 240,255,183
5879 :169,058,032,218, 255,162,877
5685 :003,160,013,032,163,028, 108
5091 :201,009, 208, 006,832,043, 205
5097 :829,876,208,819,201,010, 900
5183 :208,003,076,155,817,141,971
5109 :@32,143,076,155,017,169, 969

104
sR Strategy Games 3
TES Naan ETE

5115 :822,856,229,252,178,168,116
5121 :632,024 248,,032
255,996,,168
5127 :832,046 208,,017
003,076,,133
5133 :217,017,032,104,025,932,184
5139 :258,026,032,108,8 032,238
27,
5145 :132,827,876,122,0 169,056
17,
5151 :800,133,253,169,019,133, 217
5157 :254,169,038,133,167,162,184
5163 :049,160,020,076,1 020,040
84,
5169 :255,918,144, 168,213,211, 826
5175 :197,160,202,287,217,189, 283
5181 :168,000,255,160, 211,212,035
5187 :201,195, 203,168, 267,218,219
5193 :168,980 201,,255
202, 203,070
,
5199 :264,146, 205,818,168, 203,247
5205 :197,217,211,000,255,018,215
5211 :155,880,876, 091,849,032, 062
5217 :080,065,082,084,089,146,131
5223 :000,255,031,068,069,077,091
5229 :079,867,982,065,084,073,047
5235 :067,800,255, 882,069, 088,156
5241 :885,866,876,073,067,065,041
5247 :678,900,255,018,1 032,153
55,
5253 :073,878,067,985,077,066,867
5259 :069,078, 084,146,000, 255,003
5265 :G031,032,932,032,078,079,173
5271 :78,969,032,032,032,000,138
5277 :255,832,880,076, 065,089, 242
5283 :069,882,032,049,032,000,171
5289 :255,032,980,076,0 089,254
65,
5295 :669,882,032,058,032,000,184
5301 :000,000,000,134,251,132,186
5307 :252,208,011,200,152,024,810
5313 :101,251,133,251,144,002,051
5319 :230, 252,166,253, 228,254,046
5325 208,001, 253,164,133
230, 096,
5331 :167,824,032,248,255,160,065
5337 :000,162,255,177,251,016,954
5343 :016,200,177,251, 240,217,044
5349 :032,210,255, 202,016, 250,170
5355 :240,2 241,170, 223
200, 208, 09,
5361 :200,208,237,169,000,133,164
5367 :253,169,014,133, 254,169,215
5373 :146,032,210,255,169,144,185
5379 :032,218,255,169,0830,133,064
5385 :167,162,072,160,021,032,111
5391 :184,020,174,021,143,189, 234
5397 :037,037,041,063,141,071,155
5403 :004,173,0836,0837, 009,048,078

105
3 Strategy Games
ee

5409 :141,078,004,173,032,143,092
5415 :810,8010,010,024,1809,032,234
5421 :143,170,173,032,143,909263 ,
5427 :048,141,150,004,160,000,042
5433 :189,037,036,041,063,248,151
5439 :007,153,152,004, 232,200,043
5445 :208,242,096,009,058,0900,178
5451 :255,032,032,032,087,069,870
5457 :869,075,032,032,032,000,865
5463 :909,058,000,009,032,000,195
5469 :809,032,008,255,031,032,196
5475 :032,8967,965,077,080,065,229
5481 :073,971,8078,008, 255,032,182
5487 :032,984,086,8032,065,968, 222
5493 :083,8032,032,157,000,255,164
5499 :8032,032,070,085,078,068, 232
5585 :0982,865,073,083,008,255,175
5511 :032,032,082,069,083,084,005
5517 :832,032,032,032,000,255,912
5523 :018,155,032,077,065,080,062
5529 :032,032,932,032,032,932,989
5535 :800,255,032,080,079,076,169
5541 :8@76,032,632,032,032,032,145
5547 :000,255,146,150,082,9069,1905
5553 :067,079,078,083,073,668,113
5559 :869,082,000,255,084,082,243
5565 :965,086,069,076,032,032,037
5571 :032,032,154,000,0069,832,198
5577 :800,800,900,800,169,814,128
92983 1133 169,. 25
925,13 3 9
3 7254,15
2989 23169,028 ,13
{167 (169,030 ),3141
5595 :032,210,255,162,034,168,848
5601 :023,032,184,820,169,043,184
5607 :141,076,006,169,046,141,042
5613 :149,007,173,036,8037,208,079
5619 :011,169,020,162,808,032,133
5625 :210,255,202,208,2508,0996,1908
5631 :174,008,143,169,808,832,813
5637 :205,189,162,023,160,030886 ,
5643 :824,032,240,255,169,838,249
5649 :032,210,255,174,009,143,072
5655 :224,100,176,022,169,032,234
5061 :032,210,255,224,010,176,168
5667 :013,032,210,255,832,218,819
5673 :255,138,009,048,032,210,221
5679 :255,896,169,000,032,205,836
5685 :189,173,184,007,141,185,164
5691 :007,162,006,173,027,212,134
5697 :041,015,201,010,176,247,243

106
Strategy Games 3

5793 :0899,848,157,185,007, 202,167


5789 :208,239,169,060,141,184,954
5715 :0987,141,188,987,032,122,868
5721 :022,169,052,133,248,169,114
5727 :908,133,247,168,162,002,039
5733 :149,252,2802,016,251,032,235
5739 :166,022,169,032,162,002,148
5745 :149,249,202,016,251,032,244
9751 :211,022,0996,169,017 133,255
9757 :252,169,9098, 133,251,166 ,072
5763 :251,228,252,208,001,096,143
5769 :160,080,0824,032,248,255,0808
5775 :162,008,189,948,037,032,091
5781 :219,255,169,937,032,219,938
5787 :255,232,224,803, 208,240,937
5793 :230,251,8076,130,922,166,012
9799 2247, 232,232; 134; 247) 209;179
5895 :196,248,208,001,096,189,087
5811 :908,120,874,133,002,185,181
5817 :806,144,162,002,041,238,004
5823 :248,80806, 202,041,014, 248,166
5829 :081,202,181,252,924,191,199
5835 :902,176,216,149,252,8076,85¢
5841 :166,022,169,9004,133,248,183
5847 :169,088,133,247,169,082,158
5853 :169,8015,133,002,185,037,250
5859 :837,041,063,145,247,136,128
5865 :816,246,169,948,024,101,061
5871 :247,133,247,169,000,101,112
5877 :248,133,248,160,002,162,174
5883 :002,169,016,024,117,252,063
5889 :149,252,176,913,181, 249, 253
5895 :145,247,202,136,016, 239,224
5901 :198,9082,016,218,096,072,103
5907 :169,037,149,249,104,074,033
5913 :074,074,041,001,009,036,004
5919 :876,007,923,011,035,000,183
5925 :255,042,032,083,000,255,192
5931 :842,032,8077,000,255,042,235
5937 :032,084,000,255,042,032,238
5943 :087,000,255,042,9032,084,043
5949 :000,255,042,032,070,000,204
5955 :255,042,032,083,0090,011,234
5961 :044,000,255,092,032,048,032
5967 :048,060,048,048,048,060,135
5973 :048,048,048,900,255,154,126
5979 :832,9072,069,865,076,084, 233
5985 :8072,0932,000,000,000,000,201
5991 :169,928,032,210,255,169,198

107
3 Strategy Games
TITRE
Fee Ga

5997 :800,133,253,169,915,133,044
6003 :254,169,030,133,167,162,906
6909 :000,160,128,032,184 ,3
020,13
6915 :896,169,128,133,248,169,046
6021 :000,133,247,169,000,133,047
6027 :258,133,249,169,000,133,049
6933 :253,133,254,168,162,001,092
6839 :032,241,023,162,000,160,001
6045 :004,189,037,036,145,247,047
6051 :200,232,224,008, 208,245,000
6057 :162,008,172,954,925,136,214
6063 :230,253,165,253,201,019,007
6069 :208,003,076,225,023,169,117
6075 :255,145,247, 208,169,028, 207
6081 :145,247,200,169,042,145,117
6087 :247,200,165,253,0809,048,097
6993 :145,247,200,169,031,145,118
6099 :247,200,232,189,037,836,128
6195 :145,247,208,247,200,076,060
6111 :175,023,032,002,024,169,136
6117 :808,162,004,145,247,28008,219
6123 :202,208,250,076,017,024, 244
6129 :162,001,160,000,189,054,039
6135 :825,145,247,200,232,236,0852
6141 :854,025,208,244,096,162,918
6147 :081,189,089,025,145 ,7
247,18
6153 :200,23 2, 236,08 9,025, 288,231
6159 :244,096,169,001,133,253,143
6165 :133,254, 208,009,238, 253,084
6171 :165,253, 201,018, 208,001,897
6177 :896,230,248,169,009,824,041
6183 :101,249,133,249,169,880,172
6189 :161,250,133,250,032,241,928
6195 :823,166,249,160,004,165,859
6201 :253,073,048,145, 247,208,255
6207 :200,189,037,836,2408,0086,083
6213 :145,247,232, 200,208,245, 866
6219 :166, 253,189,127,036,133,211
6225 :250,172,054,025,136,165,115
6231 :254,0190,170,169,848,133,183
6237 :251,133,252,169,255,145,818
6243 :247,200,169,028,145,247,1ll11
6249 :200,169,042,145,247,200,084
6255 :169,154, 145
247, 200,16 ,
5,167
6261 :254,201,010,144,007,238,195
6267 :252,233,018,076,118,024, 068
6273 :101,251,133,251,165,252,902
6279 :145,247,200,165,251,145,808
6285 :247,200,169,032,145,247,157

108
Strategy Games 3

6291 :208,169,151,14 247, 200,


5, 235
6297 :189,228,033,14 247, 200,163
5,
6383 :232,189, 220,033,145, 247,201
6309 :200,202,169,0832,145 247,136
,
6315 :200,169,048,133, 251,133,981
6321 :252,189,800,120,201,910,181
6327 :144,007,230, 252,233,810, 035
6333 :076,181,024,101,251,133,187
6339 :251,165,252,14 247, 200,175
5,
6345 :165,251 247,,145
200,169,9
,98
6351 :032,145,247, 200,169,080, 232
6357 :145,247, 208,230, 254,165,174
6363 :254,197,258,240, 003,076,215
6369 :986,024, 032,002,024, 165,046
6375 :258,133,254,166, 253,202, 209
6381 :189,127,036,133,0 232,188
02,
6387 :189,127,036,856,229,0802,114
6393 :133,062 908,,169
229,002,0
,24
6399 :133,002,048,038,169,0809,142
6405 :145,247,200,169,835,145,178
6411 :247,200,169,000,1 247,251
45,
6417 :208,198,002,048,019,169,141
6423 :009,145,247,208,169,832,057
6429 :145,247, 208,169, 900,145,167
6435 :247,200,198,002,0 237,167
16,
6441 :169,908,162,004,1 247,000
45,
6447 :200, 202,208, 258,876,825, 240
6453 :024,935,009,035, 000,255,155
6459 :032,032,032,032, 032,032,251
6465 :032,0832,032,032, 000,009, 202
6471 :044,000,255,018,154,037,967
6477 :144, 285,193, 208,168,160,123
6483 :168,160,169,168,1 000,101
46,
6489 :014,255,828,042,077,069, 062
6495 :078,085,032,032,032,032,130
6501 :032,000,000,173,011,143, 204
6507 :141,032,143,169, 008,141,229
6513 :000,143, 206,008,143, 208,045
6519 :001,096,174,080,143,189, 210
6525 :000,143,208,009,032,177,182
6531 :026,932,208,026,076,115,102
6537 :@25,016,023,186,1 003,
76,230
6543 :876,166,827,173,824,143, 240
6549 :010,109,009,143,144,002,054
6555 :169,255,141,889,143,076,180
6561 :115,025,172,009,1 248,097
43,
6567 :203,087 800, 232,221,0
2,16 2,33
6573 :127,836,176,258, 236,011,241
6579 2143, 240,009, 142,032,143,120
109
3 Strategy Games

6585 :142,011,143,206,009,143,9071
SSM :104,032,207,025,032, 233,056
6597 :025,032,093,026,032,148,9833
6603 :026,076,115,025,133,802,068
6609 133,251,198, 251,165, 251,178
6615 :010,019,024,101, 251,133,232
6621 :251,133,253,169,146,133,026
6627 :252,169,145,133, 254,996,252
6633 :173,008,143,041,248, 208,938
6639 :085,169,001,133,255,896,138
6645 :169,003,024,109,921,143, 202
6651 :168,177, 251,133, 255,173,128
6657 :918,143,016, 993, 230,255,146
6663 :096,197,082, 208,009,169,176
6669 :002,032,087,826,169, 255,872
6675 :133,002,165,002,141,819, 216
6681 :143,173,008,143,160,005,145
6687 :074,136, 208, 252,032,887,052
6693 :926,173,922,143,032,087, 988
6699 :026,1608,0986,136,208,081,868
6705 :096,185,826,143, 209, 253,193
G/it :288,007,169,0803,032,987,849
6717 :026, 208, 238,170, 202,138,919
6f23 289,253, 208,007,169,0801,146
6729 :032,087,026, 208, 224, 232,114
6735 232,138, 209,253, 208,217,056
6741 :248,240,024,101, 255,133,054
6747 :255,896,168,005,177,251,@11
6753 2056,229,255,176, 004, 198, 247
6759 :255,208,243,145, 251,165,890
6765 :255,170,172,021,143, 200, 046
6771 :024,113,251,144,002,169, 859
6777 $255,145, 251, 1522.093;803,232
6783 :168,138,074,874,113,251,177
6789 2144,002,169,255,145,251,075
6795 096,070,255, 208,081,896, 097
6801 :173,808,143,856,229, 255, 241
6807 :176,902,169,008,141,008,135
6813 2143,070,255,288,001,996,162
6819 2173,009,143,856,229,255,804
6825 :176,002,169,008,141,009,154
6831 :143,8696,168,008,162,015, 239
6837 2173,021,143,248,062,162,154
6843 2240,134,251,162,052, 202, 204
6849 :208,003,132,002,096,189,055
6855 :000,144,837,251,248, 243,090
6861 ?200,208, 240,165, 002,824, 620
6867 2109,823,143,018,1809,922,115
6873 7143,109,008,143,144, 003,255
6879 2024,169,255,141,608,143,195
110
Strategy Games 3

6885 :173,018,143, 208,810,169,174


6891 :016,189,008,143,176,903,178
6897 :141,808,143,169,000,141,075
6983 :010,143,096,169,146,133,176
6989 : 252,169, 908,133, 251,169, 203
6915 :008,170,248,087,168,005,073
6921 :238, 251,136, 208, 251, 232,937
6927 :224,852,208,001,096,162, 244
6933 :001,177,251, 280,856, 241,179
6939 :251, 288, 9086,832,088,027,127
6945 :076,807,027,176,010, 234,951
6951 :073,255,824,105,001,169,145
6957 : 128,288, 002,160,008,133,172
6963 :253,132,254,641, 224, 249,171
6969 : 002, 208,028,870, 254,165, 088
6975 :253,841,016, 248,002, 208,055
6981 :918,078, 254,165, 253,041,894
6987 : 008,208, 002,870,254,165,014
6993 :254,157,9008,144,076, 907,207
6999 :027,173,908,144,041, 249, 200
7885 : 249,004, 169,801,208, 002,205
7011 :169,016,141,000,144,157,214
7017 :060,144,096,162,052, 202,249
7823 :240,018,189,808,144,041,231
7829 :015,240, 904,169,867, 208,052
7835 :062,169,138,157,192,055, 868
7841 :208,235,096,173,021,143, 237
7047 :072,162,063,189,0864,143, 960
7053 :157,128,143,189, 008,143,133
7859 :157,964,143,189,128,143, 283
7865 :157,000,143, 202, 208,235,074
7071 :104,073,081,141,821,143,130
7877 :096,173,909,143, 201,048,059
7883 :144,067,174,032,143,189,152
7089 :127, 836,133,250, 202,189,090
7895 :127,036,133,249,198,249,151
7101 :173,036,037,818,824, 189,066
7107 :025,143,133,255, 238,249, 206
a3 :165, 249,197,250, 240,014,836
7119 :032,023, 028,078, 255,032,135
7i2o :093,026,032,140,826,076,094
rehe2 :189,027,173,089,143,856, 848
tae :237,025,143,144,905, 237, 248
7143 :025,143,176, 902,169,201, 235
7142 :141,009,143,076,115,825, 234
Fie :162,000, 168,052,134, 249, 232
7161 2132, 250, 230,249,165, 249, 244
7167 2197, 258, 240, 019,174,129, 248
Was 2143, 134, 255, 032,823,028, 198

111
3 Strategy Games
EY

7179 :032,044,926,070,255,032,214
7185 :093,026,076,251,027,8096,074
7191 :032,207,025,032,038,026,127
7197 :096,162,000,169,900,157,101
7203 :080,063,202,208,250,169,159
7209 :000,170,168,185,018,031,093
7215 :157,000,063,185,9018,931,245
7221 :157,964,063,232,232,232,9009
7227 :200,192,007,208, 236,185,063
7233 :010,031,157,800,963,157,227
7239 :081,963,157,002,063,185,030
7245 :@18,031,157,964,063,169,9867
7251 :252,141, 248,007,169, 253,129
7257 :141,249,867,162,007,169,9056
7263 £01 2,1
,039, 57
206),202 ,010,217
7269 :250,169,001,141,929 ,
298,131
7275 :169,001,141,016, 208,169,043
7281 :804,141,000,208,169,058,173
7287 :141,001,208,169,054,141,965
7293 :902,208,169,656,141,003,192
7299 :208,169,000,160,004,153,057
7305 :002,031,136,016,250,169,229
7311 :834,141,007,031,169,173,186
7317 :141,906,931,169,054,141,179
7323 :009,031,169,000,141,008,061
1329 43951,69 pO,6,10 9
233) 225¢eto
7335 :169,004,141,0 00, 208,152,873
1341, $032,250, 930,133; 252,150,290
#347 2032,250,030,133, 251,141,248
7353 :001,208,169,012,141,939,243
7359 :208,173,016,208,009,001,038
7365 :141,016,208,173,021,208,196
7371 :009,001,141,021, 208,032,103
7377 3026,031,173,187,931 ,
240,949
7383 :248,041,019,240,244,170,153
7389 :041,016,208,039,138,041,192
7395 :001,240,017,173,001 ,
208,099
7401 :197,251,240,227,198 ,
253,063
7407 :056,233,008,141,0801,208,118
7413 :208,217,173,001,208,197,225
7419 :252,248, 210,230, 253,024,182
7425 :105,008,141,001,248 ,
208,160
7431 :200,1 69,090 0,141, 939,
208,252
7143/7. 2:032,926,031,173,197,931,157
7443 :240,248,041,016, 208,007,011
7449 :169,012,141 ,939
208, ,
298,34
7455 :176,173,021,208,041 ,
254,136
7461 2:141,021, 288,165, 253,096,153
7467 :162,007,189,002,031,149,071

112
Strategy Games 3

7473 :247,202,016,248,169,001,164
7479 :141,048, 208,173,021, 208,078
7485 :069, 002,141,021, 208,032,218
7491 :026,031,173,107,031,240,163
7497 :248,106,176,020,106,176,137
7503 :867,106,176,118,106,176,052
7589 :@05,106,176,005,144 231,24
,
7515 :076,240,029,876, 231,038, 005
7521 :165,2 240, 221,173
48, ,003,123
7527 :208,056,233,004,141 003, 236
,
7533 :208,198,248,165, 248,196, 002
7539 :176,003,876, 036,039, 165,089
7545 :253,233,826,133, 253,176,171
7551 :002,198,254,165, 251,856,829
7557 :233,025,133,251,144,003,154
7563 :876,836,030,198, 252,076,039
7569 :036,830 201,929,,086
248,,165
7575 :240,169 208,824, ,200
003,,173
7581 :105,004,141, 003,208,230, 080
7587 :248,165,248, 106,176,123, 205
7593 :165,253,185,026,133 253, ,
08d
7599 :144,602, 238,254,165, 251,197
7605 :024,105,925,133, 251,144,995
7611 2104, 230, 252,076,036,030,147
7617 :165,247, 298,083,976, 966,190
7623 :629,173, 002,208,056, 233,132
7629 :064,141, 002,208,198, 247,237
7635 :165,247,106,144,076,165099 ,
7641 :253,233,001,133, 253,176,242
7647 :@02,198, 254,165, 251,056,125
7653 :233,001,133,251,176,957,056
7659 :198,252,076,036,030,165,224
7665 :247,261,049, 208,003,876, 001
7671 :066,829,173,002, 208,824, 237
7677 :105,004, 141,002, 208, 230,175
7683 :247,165, 247,106,144, 003,147
7689 :076,836, 030,165, 253,105,162
7695 :001,133,253,144,002 230,010
,
7701 :254,165,251, 024,185, 081,053
7707 :133,251,144, 005,230, 252,018
7713 :076,836,930,169,001,133,222
7719 :249,165,248,074,144,004,155
7725 :006,249, 006,249,165, 247,199
7731 :106,176,002,006,249,160238 ,
7737 :808,177,251,133,002,165,017
7743 :249,0 253, 208,038
49, ,169,005
7749 :192,036,002,048,013,165,013
7755 :002,041,063,170,189,120,148
7761 :034,133,002,076,1086,030, 206

113
3 Strategy Games
TO
eo FT SETS

7767 :088,007,169,000,133,002,222
7773 :076,1806,030,165,002,041,001
7779 :063,178,189,121,034,133,041
7785 :@02,162,015,160,016,024,228
7791 :032,248,255,169,149,032, 220
7797 :210,255,169,832,162,007,184
7803 :832,210,255, 202,016, 250,064
7809 :169,157,162,007,032,210,098
7815 :255,202,016, 250,165,002,901
7821 :208,003,076,066,029,041,052
7827 :963,010,170,189, 220,033,964
7833 :032,219,255,189,221,053,069
71839 2032, 210, 255,169 ,@32, 032,121
7845 :210,255,189,000,120,170,9085
7851 :201,019,176,005,169,032, 252
1857 2932,2 10,
255, 169,090,0 32, 107
7863 :205,189,169,029,0 32,
218,249
7869 :255,169,144,032, 210,255, 230
7875 :169,018 210,,032
255,169,9,24
7881 :160,032,210,255,165,002,081
7887 :041,063,162,000, 232,221,158
7893 2127,036,1/6, 250,138,105,021
7899 3176,932,210, 255,169,146, 183
71905. 2032, 210, 255, 076,066,829 ,125
7911 £173,021, 208,041,253,141,044
7917 :021,208,162,007,181,247,939
7923 :157,902,031, 202,016; 248,131
7929 :996,234,010,018,019,024,121
7935 :185,058,096,009,000,008,2508
7941 :900,0008,000,000,0990,192,197
7947 :192,224,248,224,1 92,
200,083
79ISS S299) 295,19 LAs pL oop3,
Oo eee
7959 129,153,255, 169,600,141, 202
7965 :107,031,173,000,220,041,089
7971 :831,073,031,208,0845,173,084
7977 :861,220,041,831,073,031,182
7983 :208,036,032,228,2 55,
208, 246
7989 :001,996,056,233,073,144,144
1995 ($2,232, 22, 170
233,085; L716 ,973
8001 :216,138,041,002 ,249,004 ,194
8007 :138,873,001,178,169,008,119
8013 :141,107,831,056,042,202,144
S019 2:208,25 187 2,14 1
7831 ,173;227
8825 :000,220,045,001,220,841,194
8031 :916,240,246,169,006,101,195
8037 :162,197,162,208, 252,096,154
8043 :800,032,250,026,032,177,112
8049 :626,165,8062,201,826,144,165
8055 :903,032,132,827,832,122, 211

114
Strategy Games 3

8061 ?033,932,132,027,032,122,247
8867 2033,169,001,032,207,825,086
8073 2160,095,177,251,974,074,110
8079 2170,168,0802,138,024,113,238
8085 2251,144,002,165,255,145, 087
8091 2251,1 208, 243,160,
36, 002,131
8897 :209,251,208,019,1 903,243
60,
8163 2177,251,208,056, 241,251,863
8169 2169,128,042,168, 280,177,833
8115 2251,233,001,145,251,165, 201
8121 2251,024,105,005,133,251,186
8127 :201,255, 288,198,832, 258,055
8133 :026,032,177,026,162,051,159
8139 :189,000,144,841,017,248,066
8145 70@93,038,000,144, 292,288,028
8151 >243,032,108,827,032,237,126
8157 :8@89,8032,087,022,032,098,237
8163 >911,032,205,021,162,915,161
8169 7134,002,160,029,024,832,102
8175 7249,255,169,152,032,219,017
8181 :255,169,032,162,9811,032,138
38187 :219,2 262, 208, 55,
250,239,870
8193 :962,1060,902,224,024,208,115
8199 :227,173,100,007,141,148,027
82085 :907,141,180,007,141,220,197
8211 :007,169,032,162,011,157,045
8217 :220,007,202,208,250,169,957
8223 :020,141,226,007,169,080,082
8229 :162,003,149,003,202,016,000
8235 :251,169,009,133,174,169,180
8241 :000,141,9032,143, 238,032,123
8247 :143,173,032,143,201,010,245
8253 :208,003,076,048,032,032, 204
8259 :153,933,169,000,133,178,221
8265 :133,179,162,004,1 251,168
34,
8271 :160,031,132,252,169,190, 245
8277 :133,247,133, 249,169,004, 252
8283 :133,248,133,250,166,167,164
8289 :168,9083,169,8032,145, 247,085
8295 :136,016,251,165, 247,024,174
8361 :105,040,133,247,144,002,012
8307 : 230 202,
,24 208, 233,174,
8,130
8313 :032,143,189,127,0 133,013
36,
8319 2254, 202,189,127,036,133,044
8325 :253,166,251,164, 252,024, 219
8331 :032,240, 255,166, 253,189, 258
8337 :000,144,041,015, 208,003,044
8343 :076,111,933,189,0968,034,150
8349 :170,024,101,178,133,178,173

115
3 Strategy Games
(oy Ee

8355 :138,281,010,176,005,169,094
8361 :032,032,210,255,169,154, 253
8367 :032,210,255,169,800,032,105
8373 :205,189,166,251,168,937,165
8379 :824,032,240,255,160,003,133
8385 :169,032 255,136,,
218,,032 803
8391 :208,250,230,251, 230,253,885
8397 :198,167,208,181,165,174,918
8403 :208,003,0976,105,033,173,841
8469 :032,143,024,195,014,170,193
8415 :160,031,024,032, 240,255,197
8421 :169,154,032,210,255,165,190
8427 :178,170,201,810,176,005, 297
8433 :169,032,032,210,255,169,984
8439 :908,032,205,189,169,156, 239
8445 :032,218,255,169,032,872,255
8451 :032,210,255,173,032,143,080
8457 :0869,048,032,210,255,184,155
8463 :032,218,255,8032,210,255, 241
8469 :165,179,170,201,010,176,154
8475 :005,169,032,032,210,255,218
8481 3169, 028, 032,'210,255,169, 128
8487 :000,032,205,189,162,024,139
8493 :168,030,024,032, 240,255,018
8499 :169,152,032,210,255,165,8198
8505 :178,024,101,003,133,003,243
8511 :169,000,101,004,133,004,218
8517 32165,179,191,005,133,0095, 145
8523 :169,000,101,006,133,006, 234
8529 :166,003,165,004,032,205,144
8535 :189,162,024,160,836,024,172
8541 :032,240,255,166,005,165,188
8547 :906,032,205,189,198,174,135
8553 :8032,046,017,076,053,832,185
8559 :189,968,034,024,101,179,194
8565 2133,179,076,20),032,473, 143
8571 :8026,143,141,129,143,032, 225
8577 :243,027,169,800,141,129,8708
8583 :143,174,032,143,189,127,175
8589 :036,168, 202,189,127,036,131
8595 :170,202,032,247,027,096,153
8601 :169,156,032,210,255,032, 239
8607 :235,017,162,003,160,038, 254
8613 :024,032,240,255,932,193,173
8619 :033,174,032,143,189,127,191
8625 :036,202,056, 253,127,036,119
8631 :133,167,1805,063,179,160,153
8637 :030,032,240,255,162,000,149
8643 :189,207,033,2808,0901,096,161

116
Strategy Games 3

8649 2032,2108,255,2 208, 244,192


32,
8655 2154,068,069,077,032,032,127
8061 2032,932,028,882,3869,088,024
8667 :990,032,032,877,069,078,251
8073 2072,086,084,877,865,082,179
8679 2073,067,084,078,989,078,188
8685 2974,080,065,079,872,073,168
8691 2078,973,0976,0977,873,087,195
8697 :973,077,078,8073,065,977,18@
8703 :979,078,068,983,068,078,197
8769 :969,875,883,068,069,077,190
8715 :868,968,867,886,965,087,196
8721 :086,978,067,983,067,971,213
8727 :365,079,076,075,089,084, 226
8733 :978,065,976,077,983,965, 217
8739 :882,076,865,079,075,084, 240
8745 :988,077,084,073,068,887, 886
8751 :989,067,079,078,077,2865, 246
8757 :090,8985,084,9078,086,987,051
8763 :065,079,082,067,065,065, 226
8769 :975,072,073,000, 904,004,037
8775 :903,813,004,008,836,016,151
8781 :025,023,012,624,929,9011,192
8787 :018,008,011,9003,903,005,123
8793 :0907,003,010,003,012,006,130
8799 :913,008,012,021,0909,011,169
8805 :909,007,006,019,0903,829,170
8811 7:904,904,003,008,005,907,138
38817 :005,904,0109,007,047,003,189
8823 :904,000,001,003,003,004,134
8829 :005,008,009,908,010,026,191
8835 :031,011,014,016,9014,912,229
8341 :037,012,019,016,017,020, 002
8847 :925,009,032,025,8025,029,032
8853 :927,030,8026,031,029,032,068
8859 :017,034,038,8035,040,040,193
8865 :841,042,038,037,046,049,158
8871 :840,048,044,000,000,000,035
8877 2239, 239,047,111, 231,231,247
8883 2231, 231,23 210, 222
210; 210;1,
8889 :207,207,207,000,000,000,038
8895 :800,900,900,000,000,193,128
8981 :193,239,047,047,111,103,169
8997 :039,039,039,039,018,018,139
8913 :018,015,979,079,077,205,179
8919 :295,0900,000,000,000,000,1064
8925 :193,193, 240,948, 9048,112,031
8931 :103,039,839,039,039,019,249
8937 :819,819,015,015,979,014,138

1a7
3 Strategy Games

8943 :206,205,000,000,000,199,081
8949 :997,066,193, 240,048, 048,079
8955 :040,040,103,041,041,041,945
8961 :819,019,019,016,916,078,168
8967 :140,205,013,205,261,199202 ,
8973 :807,007,004,196, 241,049,905
8979 :118,046,046,045,041,041,992
8985 :041,020,020,020,084,616,226
8991 :080,012,0876,011,010,073,0837
8997 :809,009,071,0708,197,241,122
9983 :0949,110,0946,046,845,045,128
9909 :042,042,042,149,149,149,119
9815 :817,145,812,076,011,138,198
9921 :074,137,088,151,2080,000,199
9927 :800,049,849,1190,046,045,119
9833 :045,042,042,042,021,021,030
9839 :821,085,017,145,076,075242 ,
9945 :031,095,098,825,087,214,115
9851 :888,000,241,849,110,172,151
9857 :944,044,043,043,171,101,031
9863 :037,037,0981,099,017,096,214
9969 :996,096,089,091,091,091,151
9875 :0800,000,000,000, 241,849,149
9681 :113,044,044,043,043,043,195
9987 :638,037,037,165,035,035218 ,
9093 :698,161,160,993,156,027,96U
9899 :219,000,000,009,000,241,087
91805 :049,113,044,044, 043,043,225
9111 :1897,038,038,038,102,835,253
9117 :163,034,033,097,029,092,093
9123 :156,000,900,080,008,000,863
9129 :009,900,000,236,236,235,188
9135 :230,038,038,038,838,838,983
9141 :836,100,034,933,033,029,190
9147 :829,008,000,080,0800,0800,216
9153 :242,050,242,000,243,0800,282
9159 :900,008,230,230,038,038223 ,
9165 :230,036,228,226, 225,222,892
9171 :222,030,000,000,000,8009, 287
9177 :000,242,0508,050,000,000,847
9183 :243,000,08900,000,0900,230,184
9189 :230,000,000,000,000,0280, 203
9195 :0800,000,222,222,800,800,167
9201 :000,000,242,242,242,242,185
9207 :008,000,243,000,000,000234 ,
9213 :000,23 0,000,0 800,000 9,000,2 27
9219 :8000,000,000,222,0938,222,221
9225 :000,000,242,0008,000,900,251
9231 :242,000,000,0080,000,008,801

118
SRR Strategy Games 3
I 2 SOR VTP NALHa

9237 000,008, B00, 000,


080, BBG, B21
9243 :800,008, 000,000,000, 222,249
9249 :222,808,0 255, 932,082,11
00, 2
9255 :869,071,073,979, 978,983, 236
9261 :080,878, 069,087, 032,069,124
9267 :878,071,0 008, 085,082,1
76,87
9273 :066,965,078,932, 078,069,189
9279 :008,072,069,965, 982,084,179
9285 :876,8 068, 000,071,0
78, 32,138
9291 :089,976,965,073,878, 983,018
9297 :000, 065,084,876, 865,978,193
9303 :084,073,967,9080,083,979,217
9399 :885,084,8 969, 982,878,05
72, 1
9315 :080,0865,082,875,0876,065, 206
9321 :884,869,088, 000,077,879, 246
9327 :885,078,084, 065,073,878, 062
9333 :80S,080,965, 967,873,979, 216
9339 :073,067,932801, 087,47
,0080,
9345 :019,815,022,931,035,039825 ,
9351 :047,052,0 243, 224
220, 243,52,
9357 :047,063, 220,878, 228,077,986
9363 :077,228,227,206,092,062,815
9369 :243,092,227,242, 227,243,147
9375 :899,063,047, 228,963,869, 216
9381 :100,198, 069,870, 198,077, 803
9387 :077,4870,070, 212,078, 212,122
9393 :243,243,1 243,907
212, 228,97,
9399 :197,235,2 228, 242,047,09
42, 4
9405 :833,959,933, 246,104,126, 022
9411 :202,189,836, 097,089,189, 229
9417 :220,052,118,122,081,838064 ,
9423 :003,171,1 204, 239
238, 254,86,
9429 :171,802, 080,878,070, 235,073
9435 :000,145,069,001, 981,134,957
9441 :087,203,097,096,119, 223,026
9447 :066, 234,178,24 245, 234,146
6,
9453 :158,124,254,111, 247,057,164
9459 :067,159,211,066,927,095,100
9465 :029,104,164,179, 905,865,027
9471 :052,233,044,056,984,136,812
9477 :017, 218,066, 238,063,169, 248
9483 :175,077,154,057,061,092,115
9439 :140,062,047,120, 216,037,127
9495 :059,005,145, 213,145, 243,865
9501 :187,242,011, 230,131,193, 255
9507 :800,200,068,082,085,159,173
9513 :028,152,000,000,013,013,247

119
A ren hu. Wey eas
ce he eo are hs 2%

‘ eG Pat
a - ' Raby vos

an, sia Saetn & teat


Be eee ae
case oa
,

i
i

Creature |
Features
The Frantic
Fisherman
David Lacey
64 Version by Kevin Martin

Idly floating in your boat, waiting for the fish to bite, is a fine
way to relax. In this game, however, an angler’s dream becomes a
nightmare when sharks get the notion that you're the bait and the
thunderclouds threaten you with gargantuan raindrops. It's good
you remembered to bring your shark swatter and an umbrella.
The fish are biting, and you’ve managed to catch a few.
But suddenly you notice the sky is clouding over, and to make
things worse, ravenous sharks begin to circle your boat.
The object of ‘The Frantic Fisherman” is to survive. You
score points by bopping the sharks with your bat and blocking
raindrops with your umbrella. You start with three fishermen.
Each time a shark or raindrop hits the boat, you lose the boat
and one fisherman. However, a new fisherman is awarded for
every 2,000 points.
Three keys are used to control movement. To move back
and forth, use the less than (<) and greater than (>) keys. The
space bar serves two functions. When the sharks approach, it
controls the club. If a raindrop is falling, it controls the um-
brella. You can use the shark swatter as many times as you
like. The umbrella, though, can be opened only three times for
each raindrop.

Controlling the Frenzy


If you think the game is too fast or slow, you can make the
fisherman more or less frantic. Since the bulk of the 64 ver-
sion is written in machine language, the speed controls are
built-in. The four function keys give you four speeds, from
very slow (f1) to frustratingly frantic (f7). The first speed (f1) is
rather easy and is recommended only as practice. You can also
pause the action by pressing the SHIFT/LOCK key. Pressing it
again restarts the game. To end the game, press the back ar-
row (+) key.

123
4. Creature Features

Machine Language Speed


Frantic Fisherman combines the best of machine language
(ML) and BASIC to create a game that’s fast-moving, yet fairly
easy to type in. You don’t need to know anything about ML to
enter or play this game. However, some of the program’s
structure may be of interest.
The program POKEs in the sprite and machine language
data before it does anything else by GOSUBing to line 8000.
Here the DATA statements are read by a BASIC loader. First
the sprite pattern information is POKEd into memory. The
data are in lines 1000-1064. If you made a mistake in typing
in the data, an error message will display. If the numbers were
correct, then the program POKEs in the machine language
data, found in lines 49152-50346. The ML portion of Frantic
Fisherman is placed in an area of memory starting at location
49152, where it is safe from BASIC. There’s another check of
these numbers to make sure you typed them in correctly. If
there’s an error, you'll see a message on the screen. LIST the
program and carefully check it against the listing published
here. After you’ve found the mistake, save the program to tape
or disk (preferably using a new filename), then load and run it
to see if it works.
The machine language section of the program controls the
movement of the sharks and raindrops (which are sprites),
reads the keyboard to switch the fisherman from one end of
the boat to the other, displays the umbrella and bat when nec-
essary, and keeps track of the score. It also allows you to
choose the speed of the game by pressing the function keys. If
all this were in BASIC, the game would play much slower.
Only through machine language can you get a truly arcade-
style game like The Frantic Fisherman.

Error-Free Entry
To make it easy to type in The Frantic Fisherman, be sure to
read Appendix C and use the “Automatic Proofreader’’ pro-
gram you'll find listed there. It will especially help as you en-
ter the mass of numbers for the sprite and ML portions of the
program.
_ After saving a copy of the game to tape or disk, load it
into your 64. It takes a few moments for all the sprite and ma-
chine language data to be POKEd into the computer’s mem-
ory. You'll see the title screen, and after pressing any key, the
game begins. Watch out for the sharks!
124
Creature Feature iS

nr

The Frantic Fisherman¢-


Ly
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
4 POKE56,68:CLR :rem 123
5 GOSUB 888d :rem 125
18 POKE 53288,8:POKE 53281,@ :rem 182
28 PRINT {CLR} {N}£59 { DOWN} {BLU} KAJ****e4 eee EG
{3 SPACES}K53PRESS ANY KEY TO BEGIN" :rem 56
38 PRINT " {BLU}-{9 SPACES}-" :rem 13
48 PRINT "{SHIFT-SPACE}-{2 SPACES} KA}****** Ex]
{5 SPACES}£53HIGH SCORE: ";HS :rem 227
5@ PRINT "{SHIFT-SPACE}{BLU}-{2 SPACES} KZ9}******
KS3{5 SPACES}K53YOUR SCORE:";SC :rem 27
68 PRINT "{SHIFT-SPACE}{BLU}-{9 SPACES}-" :rem 176
78 PRINT "{SHIFT-SPACE}-{2 SPACES }KA}**¥** keke kx
KRI***RR ERT HHHREERIX ERG RAREST" — $rem54
88 PRINT “{SHIFT-SPACE}-{2 SPACES}-{6 SPACES
}-
{5 SPACES}-{5 SPACES}-{5 SPACES}- -{4 SPACES}-"
:rem 193
98 PRINT "{SHIFT-SPACE}-{2 SPACES}-— KA}**** kw]
{2 SPACES }kuj3{2 SPACES } - KAQ*ESY KQU*ESy kAQ*
kKWd - KAQ**EX9" :rem 176
180 PRINT "{SHIFT-SPACE}-{2 SPACES}- -{4 SPACES } -
{SPACE}£A]*ES} - - - - - - - = F2q**€s3"
srem 87
118 PRINT " -{2 SPACES}- -{4 SPACES}- - - - - - -
{SPACE}- - - -{4 SPACES}-" :rem 86
128 PRINT "KAYKEJ**£EQ*KEI***ESIEZI*EXI EZI*KEQ*
EX EZI*EXZ EZI*EXY KZI*EEI****EX]" zrem 73
130 PRINT "-{9 SPACES}- £53USE SPACE TO RAISE UMBR
Sita?" += :rem 123
148 PRINT "{BLU}-{2 SPACES}£A}******—x}{6 SPACES}
k530R FEND OFF SHARK" :rem 249
150 PRINT "{BLU}-{2 SPACES}£Z9******kS3I{3 SPACES}
K53USE < AND > TO MOVE FROM" :rem 158
160 PRINT "{BLU}-{9 SPACES}-{9 SPACES}£5]LEFT TO R
IGHT" O :rem 37
170 PRINT "{BLU}-{2 SPACES}KAI*RJ****+*ESJ FAI*
BRI**** —ERI**E*ERI****ERI**SFERIFA*EST": :rem 35

180 PRINT "-{2 SPACES}- — KAJ**kw} - - - KAJ**Ewd


{4 SPACES}-{4 SPACESJ- ko} -{3 SPACES}-";_
:rem 198
190 PRINT "-{2 SPACES}- — £Z4**kW KZI*EXI - EZI*
KSJ- KAY**EW] -- -KAJ*ESI-KAJ*ESI-"; zrem 140
280 PRINT "-[2 SPACES]- £Q3**ES} — AI* ESI - RAJ*
Say = ['2- SPACES] <" == -— ~=- -="; :rem 146
218 PRINT “-{2 SPACES}= KQU**EX}- - - - £29**Ew]
{SPACE }=(2') SPACES }piey SS s5 sls :rem 20

125
4 Creature Features
ay UO

220 PRINT "EZI**kEI*EEI****EEI*EXI EZI*EEI****FEI*


EZIEXT
Ex}{2 SPACES] £Z¥*£2 EY*EEIEXI EZIREIRXY :rem
: 235
230 GETAS:IFAS=""THEN230 :rem 77
248 POKE53281,14:POKE5328@,6 :rem 38
245 {19 SPACES
PRINT" {CLR}"CHRS(142)"{BLK}SCORE: } FI
SHERMEN: " :rem 77
258 PRINT"{2 DOWN}{WHT}{13 SPACES}£D]3{RVS}
{4 SPACES} {OFF}KF}" :rem 154
260 PRINT"{12 SPACES}KCJ{RVS}{9 SPACES}{OFF}£3 19
KFI{5 SPACES}£DJ{RVS}{2 SPACE }EF3"
{OFFS}
:rem 117
270 PRINT"{4 SPACES}£D3{RVS}{4 SPACES} {OFF }EFJ
{3 SPACES}£CJ{RVS}{13 SPACES} {OFF }EV]
{2 SPACES}KD3J{RVS}{7 SPACES}{OFF}KFI" :rem 158
280 PRINT"{2 SPACES}£DI{RVS}{7 SPACES} {OFF} EF]
{5 SPACES}KC¥{RVS}{8 SPACES} {OFF}£V3{3 SPACES}
Kc {RVS}{7 SPACES} {OFF }kV}" :rem 178
298 PRINT" KCIJ{RVS}{12 SPACES}{OFF}£V}3{4 SPACES}
KCI{RVS}{4 SPACES} {OFF}KVI{7 SPACES} KCI{RVS}
{3 SPACES} {OFF} KV" :rem 198
300 PRINT"{5 SPACES}KCH{RVS}{7 SPACES} {OFF} £V3"
Y :rem 130
318 PRINT"{7 SPACES}KCI{RVS}K3 LI{OFF}" z:rem 171
311 PRINT"{5 DOWN}{22 SPACES} {RVS}£{OFF}£w3"
‘ 1° :rem 187
312 PRINT"{21 SPACES}{RVS}£ {OFF} Ew3" :rem 163
313 PRINT"{28 SPACES}{RVS}£{2 SPACES} {OFF} £W3"
: :rem 104
314 PRINT"{19 SPACES}{RVS}£{3 SPACES} {OFF} £W3"
f :rem 105
315 PRINT"{18 SPACES}{RVS}£{4 SPACES} {OFF} €wi"
" :rem 186
316 PRINT"{17 SPACES}{RVS}£{5 SPACES} {OFF} £wi"
. :rem 107
317 PRINT"{16 SPACES}{RVS}£{6 SPACES} {OFF} £W3"
:rem 188
318 PRINT" {16 SPACES }KZ3k6 EQKW}" :rem 243
319 PRINT {14 SPACES}£23k*I{RVS}{10 SPACES} {OFF}£
; :rem 47
328 PRINT"{RVS}{BLU}{39 SPACES} {OFF}{BLK}";
s:rem 244
338 POKE2623,160:POKE2023+54272,6 :rem 16
348 SYS49152 :rem 155
358 re enw tt DOWN}{12 RIGHT}PRESS RETU
:rem 138
360 GETAS : IFA$<>CHRS$(13)THEN36@ srem 4
378 S1=PEE
:S2=PEEK(K(8
830) :S3=PEEK(
29) 831):rem 144
Creature Features Li

388 SC=INT(S1/16)*19+(S1AND15)+INT(S2/16)*1999+(S2
AND15 )*18@ :rem 234
398 SC=SC+INT(S3/16)*108080+(S3AND15)*19000:rem 41
498 IF SC>HS THEN HS=SC :rem 47
418 GOTO19 :rem 47
1888 DATA192,0,0,224,9,8,112,G :rem 199
1901 DATAS,56,8,0,28,9,9,14 :rem 58
1902 DATAG,8,7,8,8,3,128,2 :rem 6
1983 DATA1,128,9,9,8,9,9,@ :rem 254
1904 DATAG,8,9,0,8,9,08,@2 :rem 147
1885 DATAG,2,08,0,9,0,9,9 :rem 148
18996 DATAG,0,9,9,0,08,9,0 :rem 149
1887 DATAG,2,0,0,8,9,9,0 :rem 158
1868 DATA1,128,0,3,128,98,7,9 :rem 126
1889 DATAG,14,8,9,28,9,9,56 :rem 66
1818 DATAG,G8,112,9,8,224,98,9 :rem 92
1011 DATA192,9,9,9,0,9,9,@ :rem 253
1012 DATAG,2,9,08,08,8,9,@2 :rem 146
1013 DATAG,8,9,9,9,0,9,0 :rem 147
1014 DATAG,9,2,08,08,08,8,@2 :rem 148
1915 DATAG,9,9,0,9,8,9,53 :rem 205
1816 DATA7,@,@,63,224,8,255,248 :rem 24
1017 DATAG,2,0,0,2,9,8,2 :rem 157
1018 DATAG,8,2,0,8,2,08,@ :rem 156
1919 DATA2,@,0,18,9,0,12,9 :rem 7
1920 DATAG,G,9,9,8,0,0,0 :rem 145
1021 DATAG,8,9,9,8,08,0,0 :rem 146
1022 DATAG,8,9,0,9,08,08,0 :rem 147
1023 DATAG,9,0,0,8,8,8,@ :rem 148
1024 DATA16,0,9,56,9,0,124,@ :rem 118
1025 DATAG, 254,8,9,158,08,8, 206 :rem 215
1026 DATAG,G8,124,8,0,0,0,08 :rem 254
1927 DATAG,#,9,8,02,08,0,0 :rem 152
1028 DATAG,9,9,9,8,9,08,2 :rem 153
1929 DATAG,9,9,9,09,9,9,@8 :rem 154
10938 DATAG,8,8,2,8,9,9,0 :rem 146
1031 DATAG,0,9,2,08,0,8,0 :rem 147
1032 DATAG,9,0,0,0,0,9,9 :rem 148
1033 DATAG,8,8,08,0,9,9,2 :rem 149
1034 DATA4,9,9,12,9,9,28,9 :rem 7
1035 DATAG,60,1,7,255,195,14,127 :rem 79
1936 DATA255,31,255,255,127,255,255,56 :rem 141
1937 DATA127, 255,3,255,195,8,9,1 :rem 78
1038 DATAD,9,9,9,9,9,9,9 zrem 154
1039 DATAD,9,8,0,0,9,9,183 :rem 7
1940 DATAG,G,0,0,8,9,0,0 z:rem 147
1841 DATAG,G,2,0,9,9,9,0 zrem 148
1042 DATA32,9,0,48,0,0,56,0 zrem 65
1043 254
DATA128,60,@,195,255,224,255, :rem 81

127
4 Creature Features
ee
nee ener ce Mie

DATA112,255,255,248,255,255,254,255 rem 248


1044
1945 DATA254, 28,195, 255,192,128,9,9 :rem 239
1046 DATAG,8,9,0,9,9,9,@ :rem 153
1047 DATAG,2,0,8,0,9,9,183 :rem 6
1048 DATAG,%,0,0,09,0,9,0 :rem 155
1049 DATAG,@,255,0,8,255,8,3 :rem 119
10528 DATA255,192,0,85,0,9,89,@8 :rem 234
1051 DATAG,85,64,0,90,0,9,85 :rem 139
1052 DATAG,@,255,0,3,255,192,3 :rem 224
1053 DATA245,80,3,255,192,3,255,192 :rem 2408
1054 DATA3,255,192,9,0,0,9,0 :rem 115
1955 DATAD,0,8,09,0,9,08,0 :rem 153
1056 DATAG,2,9,0,0,9,9,0 :rem 154
1057 DATAG,9,255,98,8,255,9,3 :rem 118
1058 DATA255,192,0,85,0,9,101,2 :rem 19
1059 DATA1,85,9,9,165,0,9,85 :rem 132
1960" DATAG,0,255,0,3,255,
292,>5 :rem 225
1061 DATA95,192,3,255,192,3,255,192 srem 246
1062 DATA3,255,192,0,0,0,9,@ :rem 114
1963 DATAZ,8,0,9,09,8,8,@ :rem 152
1064 DATA 256 :rem 130
8820 PRINT" {N}{CLR}{12 DOWN}{RIGHT}LOADING SPRITES
AND MACHINE LANGUAGE" a trem 87
8010 PRINT"{1@ RIGHT}{4 DOWN}PLEASE BE PATIENT..."
* :rem 96
99G@G@ I=248*64 srem 129
9818 READ A:IF A=256 THEN 9108 :rem 4
9820 POKE I,A:I=I+1:CK=CK+A:GOTO 9818 :rem 81
9108 IF CK<>19128 THEN PRINT"ERROR IN DATA (LINES
{SPACE}1090-1064)":STOP _ :rem 38
10028 1=49152:CK=0 :rem 177
10818 READ A:IF A=256 THEN 18190 :rem 84
19620 POKE I,A:I=I+1:CK=CK+A:GOTO 1808190 :rem 161
19100 IF CK<>139243 THEN PRINT"ERROR IN DATA (LINE
S 49152-50346)":STOP :rem 250
18208 RETURN :rem 211
49152 DATA 169,3,141,64,3,169 :rem 161
- 49158 DATA 7,141,21,2808,169,217 :rem 5
49164 DATA 141,1,208,169,1,141 :rem 198
49178 DATA 28,208,169,10,141,37 :rem @
49176 DATA 208,169,7,141, 38,288 :rem 13
49182 DATA 169,9,141,39,208,32 :rem 207
49188 DATA 60,193,169,25,141,60 :rem 10
49194 DATA 3,169,250,141,258,7 :rem 207
49208 DATA 169,209,141,5,208,169 s:rem 53
49206 DATA 2,141,41,208,169,44 :rem 282
49212 DATA 32,238,193,32,156,195 :rem 55
49218 DATA 169,9,141,61,3,141 :rem 148
49224 DATA 62,3,141,63,3,32 srem 45

128
Creature Features 4.

49230 DATA 174,195,32,141,196,169 :rem 110


49236 DATA 32 ¢L4Y p 71G9F16956 :rem 100
49242 DATA PAY ST2 FS), UTS oor :rem 97
49248 DATA Pa SG) s Sy oer ee LoS s:rem 112
49254 DATA 32,238,193); 2061; 6763 :rem 213
49260 DATA 208 (245 MAP 4s2 12h 32 :rem 244
49266 DATA ESO PLO? As 6a, se 20) :rem 254
49272 DATA @,208,226,169,8,133 :rem 2901
49278 DATA 198,169,9,141,21,208 :rem 9
49284 DATA LoS (6 (/T416S4 72125 169 :rem 288
49299 DATA @,162,909,157,8,2808 :rem 94
49296 DATA 232,224,17,208, 248,96 :rem 66
49362 DATA 173,309,2808,141,69,3 :rem 200
49388 DATA I73 65, 372016485240 :rem 145
49314 DATA S87 vl ss (6655S 201,08 :rem 183
49329 DATA 249,46,173,69,3,41 s:rem 154
49326 DATA 6,201,6,208,11,169 :rem 153
49332 DATA dd TP is a i Cet clove She KS) :rem 2
49338 DATA 194,76, 46 ,(L9O3)17352 :rem 224
49344 DATA 208, 281,225,208,3,76 :rem 254
49358 DATA 37,193 296,22, 208),178 :rem 1
49356 DATA 2,208,201,255,208,5 :rem 283
49362 DATA 169,9,141,16,208,96 :rem 212
49368 DATA 173), 22087201715), 142 z:rem 46
49374 DATA 3,116.3 7 AO By 3, 1Oo: :rem 178
49380 DATA 3,41,6,291,6,288 :rem 47
49386 DATA LI, 169 (L175, 32), 61,15 :rem 7
49392 DATA 32,179, 194, 76,46,193 z:rem 25
49398 DATA 238; 2,208, 9671/3738 :rem 173
49494 DATA 208, 201, 227,144,3,76 s:rem 252
49418 DATA 37,193, 1 -17OR OO) 3 :rem 161
49416 DATA 6,201,6,208,11,169 srem 153
49422 DATA 89,32, 31 29S, 827202 :rem 196
49428 DATA 194, 76,46,193,173,69 :rem 29
49434 DATA 3,41, 3',291,,3,,240 :rem 37
49449 DATA 4,238,3,208, 96,32 :rem 199
49446 DATA 151,,194)/206,,64,73),132 :rem 298
49452 DATA 156,195,162, 38,32,186 :rem 49
49458 DATA 195), 202:, 208% 250, W65,, 162 :rem 157
49464 DATA 201,192,144, 38,169,98 :rem 4
49470 DATA 141,2,208,169,229,141 :rem 51
49476 DATA 3,208,169,253,141,249 :rem 64
49482 DATA 7,169,0,141,48,208 :rem 156
49488 DATA 141,16,2908,141,65,3 :rem 210
49494 DATA 141,,66, 3/6079), Lau :rem 159
49500 DATA 27, 208,173,380, 208,96 :rem 2
49506 DATA 201,128,144,44,169, 89 :rem 53
49512 DATA 141,2,208,169,229,141 srem 48
49518 DATA 3,208,169,252,141,249 :rem 60

129
4. Creature Features
PRAT es ADEE OT

49524 DATA 7,169,8,141, 48,288 :rem 153


49538 DATA 169,2,141,16,298,169 :rem 4
49536 DATA @,141,65,3,169,1 :rem 54
49542 DATA 141,66,3,169,9,141 :rem 153
49548 DATA 27,208,173,38, 208,96 :rem 14
49554 DATA 201,64,144,44,169,139 :rem 608
49568 DATA 141,2,208,169,198,141 :rem 39
49566 DATA 3,208,169,251,141,249 :rem 62
49572 DATA 7,169,6,141,48, 288 :rem 162
49578 DATA 169,8,141,16,208,169 :rem 14
49584 DATA 1,141,65,3,169,9 :rem 57
49598 DATA 141,66,3,169,2,141 :rem 158
49596 DATA 27,208,173,38,288,96 :rem 17
49692 DATA 169,218,141,2,208,169 :rem 56
49608 DATA 190,141,3,208,169,251 :rem 45
49614 DATA 141,249,7,169,6,141 :rem 214
49620 DATA 40,208,169,8,141,16 :rem 198
49626 DATA 208,169,1,141,65,3 :rem 160
49632 DATA 169,1,141,66,3,169 :rem 164
49638 DATA 2,141,27,208,173,30 :rem 205
49644 DATA 288,96,201,44,2988,17 :rem 7
49658 DATA 169,132,141,0,208,169 :rem 52
49656 DATA 255,141,248,7,32,227 :rem 11
49662 DATA 194,32,112,195,96,281 :rem 57
49668 DATA 46, 208,17,169,212,141 :rem 62
49674 DATA @,208,169,254,141,248 :rem 61
49688 DATA 7,32,227,194,32,112 :rem 207
49686 DATA 195,96,281,32,208,113 :rem 60
49692 DATA 173,68,3,281,0,208 :rem 157
49698 DATA 115,173,78,3,201,9 :rem 153
497804 DATA 208,108,173,65,3,281 :rem 253
49718 DATA 9,240,38,169,2,141 :rem 148
49716 DATA 41,288,169, 2809,141,5 :rem 6
49722 DATA 208,169,258,141,2598,7 :rem 51
49728 DATA 173,0,288, 201,132,288 srem 44
49734 DATA 8,169,138,141,4,2988 :rem 217
49748 DATA 76,132,194,169,218,141 :rem 112
49746 DATA 4,208,76,132,194,169 :rem 19
49752 DATA 9,141,41,208,173,8 :rem 145
49758 DATA 288,201,132,288,18,169 :rem 1089
49764 DATA 127,141,4,288,169,238 srem 55
49776 DATA 141,5,208,169,249,141 s:rem 59
49776 DATA 258,7,76,132,194,169 :rem 22
49782 DATA 232,141,4,208,169, 232 srem 52
49788 DATA 141,5,208,169, 248,141 :rem 67
49794 DATA 258,7,32,1,195,169 :rem 178
49800 DATA 200,141,68,3,96,2@1 :rem 198
49806 DATA 95,208,5,169,8,141 :rem 164
49812 DATA 64,3,96,32,141,196 :rem 165

130
Creature Features 4.

49818 DATA 169,33,141,4,212,162 :rem 2


49824 DATA 255,142,1,212,142,37 s:rem 251
49838 DATA 288, 32,186,195, 202,288 :rem 97
49836 DATA 244,169,18,141,37, 298 s:rem 57
49842 DATA 96,32,141,196,169,129 s:rem 71
49848 DATA 141,4, 212,162, 255,142 :rem 52
49854 DATA 1,212,142,48, 208,32 :rem 196
49868 DATA 186,195, 282, 208, 244, 96 s:rem 119
49866 DATA 32,141,196,169,129,141 :rem 116
49872 DATA 4,212,162,8,142,1 :rem 94
49878 DATA 212,142,408, 208, 32,106
49884 DATA 195, 232,224,508, 208, 242
49899 DATA 96,169,33,141,4,212
49896 DATA 162,15,142,1,212,32
49982 DATA 186 ,195,32,186,195, 202
49988 DATA 224,5,208,242,169,0
49914 DATA 141,4,212,32,186,195
49926 DATA 96,169, 33,141,4, 212
49926 DATA 162,5,142,1,212,32
49932 DATA 186,195,32,186,195, 232
49938 DATA 224,28,208,242,169,0
49944 DATA 141,4,212,32,186,195
49958 DATA 96,248,24,189,61,3
49956 DATA 141,61,3,169,9,1089
49962 DATA 62,3,141,62,3,169
49968 DATA @,109,63,3,141,63
49974 DATA 3,216,32,174,195,56
49988 DATA 173,62,3,237,71,3
49986 DATA 141,69,3,173,63,3
49992 DATA 237, 72,3, 135 60,8
49998 DATA 144,25,169,32, 248,24
58804 DATA 189,71,3,141,71,3
58019 DATA 169,0,189,72,3,141 :rem 136
58816 DATA 72,3,216,238,64,3 :rem 97
58622 DATA 32,156,195,96,168,2 :rem 197
59828 DATA 200,208, 253,96,169,9 srem 250
50834 DATA 141,41,208,173,8,288
5904 DATA 201,132, 208, 16,169, 248
58046 DATA 141,250,7,169,127,141
58652 DATA 4,208,169,222,141,5
58058 DATA 208,96,169,249,141, 258
58864 DATA 7,169,232,141,4, 208
58078 DATA 169,222,141,5,288,96
58076 DATA 162,8,168,35,24,32
58682 DATA 240,255,173,64,3,24
58888 DATA 105,48, 32,210, 255,96
58094 DATA 162,8,169,6,32,240
581989 DATA 255,173,63,3,41,240
58106 DATA 74,74,74,74,24,105 srem 154

131
4 Creature Features

58112 DATA 48,32,210,255,173,63


58118 DATA 3,41,15,24,195,48
58124 DATA 32,218,255,173,62,3
58130 DATA 41,240,74,74,74,74
58136 DATA 24,195,48,32,218,255
58142 DATA 173,62, 3)41;,15, 24
58148 DATA 105,48,32,218,255,173
58154 DATA 61,3,41,240,74,74
58160 DATA 74,74,24,105,48, 32
58166 DATA 210,255,173,61,3,41
58172 DATA 15,24,105,48,32,219
58178 DATA 255,96,32,16,196,72
58184 DATA 32, 71,196, 32,125,196
58196 DATA 104,96,32,228,255,261
58196 DATA G,208,3,76,780,196
58262 DATA 201,133,288,7,169,25
58208 DATA 141,60,3,169,133,2081
58214 DATA 134,208,7,169,18,141
58228 DATA 60,3,169,134,281,135
56226 DATA 208,7,169,13,141,60
58232 DATA 3,169,135, 281,136,288
58238 DATA 7,169,9,141,69,3
58244 DATA 169,136,96,173,68,3
58258 DATA 248,5,286,68,3,2408
58256 DATA 21,173,78,3,201,0
56262 DATA 240,3,206,78,3,162
58268 DATA 98, 262, 208, 253,169,8
58274 DATA 141,4,212,96,173,4
582808 DATA 2808,201,8,248,5,169
58286 DATA 0,141,4,208,32,112
58292 DATA 195,169, 255,141,78,3
56298 DATA 76,81,196,173,141,2
58304 DATA 41,1,201,1,208,6
58318 DATA 32,16,196,76,125,196
58316 DATA 96,162,0,169,8,157
58322 DATA Q,212,232,224,25,208
58328 DATA 248,169,15,141,24,212
50334 DATA 169,16,141,5,212,169
58340 DATA 248,141,6,212,169,1988
58346 DATA 141,80,212,96,256

132
Beekeeper
Daniel Gray
64 Translation by Kevin Martin

You find yourself in the middle of a clover field doing battle with
some rather nasty giant bees. Try maneuvering to the hive while
avoiding the deadly stings and pinches of the bee and crab guard-
ians. Beekeeper” also contains some innovative programming
techniques.

Giant bees, grotesque mutations, are taking over the world.


Their enormous beehives are engulfing cities and their clover
fields are spreading over the countryside, invading precious
croplands. As Beekeeper, you must dodge worker bees and
monster crabs in a desperate mission to locate and destroy
the hive.
After the program is entered and run, you'll see a title
screen. Next, instructions tell you the point values of the game
targets and ask you to enter one of three difficulty levels.
Each level determines the speed and direction of the
worker bees and crabs as they chase you around the clover
field. In level 1, the bees and crabs are confined to vertical and
horizontal movement, but in levels 2 and 3 they also move
diagonally. At level 3, you must be very quick in order to
avoid sting and claw.

The Bees Hunt You Down


Once you've selected a difficulty level, the screen clears and
you find yourself in a clover field beside a giant beehive filled
with drones. Your first ship appears just above the beehive,
near the center of the screen. Pushing the joystick to the right
rotates your ship clockwise; pushing the joystick to the left ro-
tates the ship counterclockwise. Depressing the joystick button
fires the ship’s laser.

Use the Laser to Score


If you don’t control the ship, it will run into the clover or the
hive. If you are stung or pinched, your ship is destroyed. Take
care, for you have only 8 ships available in each game. Defend
yourself with your laser—each worker bee or crab you disable
is worth 200 points.

133
4 Creature Features
eT ee

Piercing a block of the hive gives you 50 points, while


eliminating a drone within the hive awards you with 100
points. You can also fire at clover to get it out of your way.
Clover is worth 50 points each. The best way to aim at the
hive is by looping around the clover field until you are mov-
ing directly toward the target. Continue straight ahead while
firing at the hive.
Once all 66 drones in the hive have been exterminated,
the screen clears and another field is created, along with more
ships. The game is over when all your ships have been
» destroyed.
if
\

Keyboard Control
f you don’t have a joystick, or would rather use the keyboard
to control your ship, you can make some simple changes to
the program.
50 S=PEEK(293)
60 REM NOT NEEDED
70 IF S<>21THEN1390
130 IF S<>38THENIFS<>41THEN209
148 CC=1:I1FS=41THENCC=-1
600 PRINT" {CLR}"SPC(10)"{RED}{DOWN}USE KEYBOARD TO
PLAY"

The keyboard version plays exactly like the joystick version,


except that three keys replace the joystick controls. The P key
rotates the ship clockwise, the O key rotates it counter-
clockwise, and the F key is the fire button.
These keys are detected by PEEKing memory location
203. Each time a key is pressed, a unique number representing
that key is stored in location 203 (and in location 197). For
example, when F is pressed, a 21 is stored in that address.
When O is pressed, location 203 contains 38, and a 41 is
placed in this location when you press the P key.
Since this process requires fewer variables than the joy-
stick routine, not as much RAM memory is used. However,
the ship is slightly harder to control with the keyboard.
If you want to change the keys that control your ship’s
movement and laser fire, you'll need to know the number that
represents your new key in location 203. To find the number
type in this one-line program: ;
10 PRINT PEEK(
203) :GOTO1G

134
Creature Features 4.

This simple program is an infinite loop that displays the con-


tents of location 203 onto the screen. When you run it, you'll
see the number 64 scroll continuously up the screen; location
203 contains a 64 when no key is being pressed. To see the
number representing any key, just hold down the key and note
the number that scrolls up the screen. To substitute this new
key for the fire button, replace the 21 in line 70 above with
the new value. You can replace the other two keys (for clock-
wise and counterclockwise movement of the ship) in the same
way.

More Manipulations
Other versions of ‘’Beekeeper’’ can be created by manipulating
the initial values of the variables. Here’s a list of the most use-
ful variables, found in lines 700-710:
Variable Description
Pl Starting position of ship on screen
SH Starting direction of ships
SQ Starting number of ships provided in each level
AQ Starting number of drone bees in hive for each
level
SA Highest point on the screen that the ship can
reach
SE Lowest point on the screen that the ship can
reach
The IF-THEN statement in line 110 can be changed to give
your ship’s laser a greater range. For example, you can have
the laser reach across the screen by changing this statement to:
IF 1<39 THEN 90
The DATA in lines 840-885 control the shape of Bee-
keeper’s custom characters. By changing the DATA in these
lines, you can create your own character set, completely alter-
ing the game.

Beekeeper
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
1 POKE56,48:POKE55,90:CLR :rem 173
5 POKE53289,2:POKE53281,0 :rem 140
18 DIMSP(8) :rem 103
20 PRINT" {CLR}" zrem 198
38 V=1:SC=0:CM=54272 :rem 111
:rem 27
48 GOSUB5@@ : GOSUB889 : GOSUB69B

135
POKECM+24, 15 :POKECM+5,17:POKECM+6, 241 : POKECM, 8:
17: POKECM+13, 241 :rem 12
POKECM+12,
POKECM+7 ,@ :rem 227
GOSUB70@ :rem 128
S=PEEK (56320) :SW=(SAND4) /4:F=(SAND16)/16
:rem 203
SR=(SAND8)/8 :rem 94
IFF=1THEN130 :rem 189
I=] :A=SH-32:J=P1: POKECM+8 , 200 : POKECM+11,129
:rem 174
J=J+SP(A) :IFJ<SAORJ> 2023THEN1 26 :rem 47
I FPEEK(J) <>32THENPOKEBN, 32: GOSUB318 :GOTO129
:rem 146
POKEBN , 32: POKEJ , 42: POKEBBN+CM, 3: BN=J : I=I+1:IFI
<8THENID :rem 80
POKEBN, 32: POKECM+11,128 :rem 48
IFSW=1THENIFSR=1THEN299 :rem 205
CC=1 : IFSW=O0THENCC=-1 z:rem 185
NJ=P1
POKECM+1,5@:POKECM+4,33:I1FP1=P2THE :GOSUB3
10 :rem 186
IFSH=49 THENI FCC=1THENCC=-7 :rem 186
IFSH=33 THENIFCC=-1 THENCC=7 :rem 199
SH=SH+CC: POKEP1 , SH: POKECM+4, 32 :rem 87
=P1+ SP(A )
A=SH-32:MN=P1:P1 : IFP1<S AORP1> SETHEN P1
=MN :rem 67
: POKEMN,ENJ=
IFPEEK(P1)<>32TH P1
32 :GOSUB3 90@
:rem 17
POKEMN , 32: POKEP1, SH: [FW=1 THEN25@ :rem 244
P2=INT(RND(1)*21)+1783 :MC=INT(RND(1)*6)+1:SX=4
1:SY=32:BC=3:W=1 z:rem 35
IFMC=2THENSX=44 :SY=43 :BC=5 :rem 94
A=SGN( P2-P1) :M@=P2: P2=P2-A*H: I FABS(P2-P1)>25TH
ENP2=P2-A* 40 :rem 128
IFP2<SAORP2>SETHENP2=M@ :rem 221
IFA=0 THENJ=P2 :GOSUB318 :GOTO5@ :rem 52
POKECM+P2 ,MC: POKEM®, SY: POKECM+M@, BC:
POKEP2, SX:
GOTO5@ :rem 188
A=PEEK(J) : IFA=430RA<41THENP1=M N9
:GOTO48
:rem 153
FORI=1TO5 : POKEJ , 42 : POKEJ+CM, 2: POKECM+7 ,5@:POKE
CM+11,129 :rem 85
POKECM+1 , 68 : POKECM+4, 33: POKEJ, 32:NEXT :rem 233
POKEJ+CM, 3 :N=SQ: I FJ=P2THENW=@ :SC=SC+15@
:rem 186
IFP1=P20RA=41 THENSQ=SQ-1: Pl=1764:SH=39 :rem 67
IFJ>1983THENSC=SC+5@ :AQ=AQ-1 :rem 156
SC=SC+5@: IFSC>HITHENHI=SC :rem 82
PRINT" {HOME } {YEL}SCORE: "SC; TAB (32) "SHIPS: "SQ:P
OKEP1+CM, 3: POKEP1, SH: POKECM+11,128 :rem 219

136
Creature Features 4.

IFSQ=NTHEN419 :rem 29
FORI=1TO3 : FORS=19TO8 : POKECM+1
8STEP, S: POKECM+4
2
,33:FORA=1T010 :NEXT:NEXT :rem 31
POKECM+4, 32: FORJ=1T0100 :NEXT :NEXT :rem 66
IFAQ=9THENV=V+1:PRINT"{CLR}{RED}{11 DOWN}
{8 RIGHT }SWARM"V:FORI=1T0400@ :NEXT:GOTO45
:rem 104
IFSQ<>@THEN48@ :rem 62
PRINT" {HOME}{RED}{8 DOWN}"SPC(14)"* GAME OVER
{SPACE}*" :rem 169
PRINTSPC(11)"{4 DOWN}TRY AGAIN? [Y OR N]"
s:rem 232
GETAS :IFAS=""THEN449 :rem 83
IFAS="Y"THENRESTORE: GOTO29 :rem 143
IFAS<>"N"THEN44@ :rem 97
PRINT"{CLR}":END :rem 16
RETURN srem 124
PRINT"{RED}{8 DOWN}{14 RIGHT}* {CYN}BEEKEEPER
{RED}*" :rem 55
PRINT"{GRN}{8 DOWN}{14 RIGHT}HI SCORE={ YEL}"HI
:rem 28
FORI=1TO3909 :NEXT: RETURN s:rem 46
PRINT" {CLR}"SPC(9)"{RED}{DOWN}USE JOYSTICK IN
{SPACE}PORT 2" :rem 70
PRINTSPC(10)"{RED}{2 DOWN}CRAB"TAB(20)","SPC(5
)"290" :rem 158
PRINTSPC(10)"€53 {DOWN }WORKER"TAB (20)")"SPC(5)"
288" :rem 188
PRINTSPC(10)"{BLU}
{DOWN } DRONE "TAB (20)")"SPC(5)
"199" srem 229
PRINTSPC(1@)"{YEL} {DOWN }HIVE"TAB(28)"@"SPC(6)"
50" :rem 7
PRINTSPC(1@)"{GRN}
{DOWN }CLOVER"TAB (28)"+"SPC(6
)"50" :rem 10
PRINTSPC(1@)"{BLU}{2 DOWN}DIFFICULTY LEVELS...
" :rem 143
PRINTSPC(14)"{RED}{DOWN}[1] BEGINNER" :rem 102
PRINTSPC(14)"{DOWN}[2] ADVANCED":PRINTSPC(14)"
{DOWN}[3] MASTER" :rem 171
PRINTSPC(11)"{BLU} { DOWN} KEY IN YOUR LEVEL:"
:rem 181
GETAS : IFAS=""THEN650 :rem 89
H=VAL (A$) : I FH< 1ORH> 3THEN659 :rem 92
RETURN :rem 125
P1=1764 :SH=39 :SQ=8:SA=1064 :SE=1823 :rem 171
CT=55 296 : CE=56 295 : AQ=66 : BN=SA s:rem 145
PRINT" {CLR}":FORI=CTTOCE: POKEI,3:NEXT :rem 249
FORT=1T050:A=INT(RND(1)*758)+SA:POKECM+A,5:POK
EA, 43 :NEXT :rem 163

137
4. Creature Features

740 FORI=1824T01903
: POKEI+CM, 7 : POKEI,9:NEXT
:rem 158
75 : POKEI+CM, INT(RND(1)*6)+1:POKEI
FORI=19904T02023
,41:NEXT :rem 244
760 PRINT" {HOME} {YEL}SCORE: "SC; TAB(32)"SHIPS: "SQ:P
OKEP1+CM, 3:POKEP1,SH:RETURN :rem 171
BBB FORI=1T08 : READSP(I) :NEXT: IFPEEK( 251 )=123THENPO
KE53272,29:RETURN :rem 217
885 PRINT"{7 UP}{9 RIGHT}REDEFINING CHARACTERS"
:rem 37
807 POKE251,123 :rem 42
810 DATA 1,41,40,39,-1,-41,-48,-39 :rem 183
815 POKE56334, PEEK( 56334) AND254:POKE1 , PEEK(1)AND25
ah :rem 191
816 FORI=@T0511:POKEI+12288,
PEEK( 1+53248) :NEXT
:rem 237
820 FORI=12552T012623 : READA: POKEIL ,A:NEXT: FORI=1264
@TO12647 : READA: POKEI ,A:NEXT :rem 8@
830 FORI=12288T012295:POKEI, 255 :NEXT: FORI=12632TOl
2639:READA: POKEIL,A:NEXT :rem 34
835 POKE1, PEEK(1)OR4: POKE56334, PEEK(56334)ORL
:rem 143
836, POKE53272, (PEEK(53272) AND249)+12 :rem 192
846 DATA®,96,112,1206,207,120,112,96,8,92,60,108,
24
4,126,6,1 :rem 123
858 DATA16,254,254,108,56,16,16,16,16,58,69,54,47,
126,96,128 :rem 219
860 DATAG,6,14,38,243,38,14,6,128,96,126,47,54,68,
58,16 :rem 194
870 DATA16,16,16,56,198,254,254,16,1,6,126, 244,188
,68,92,8 :rem 95
888 DATA195,231,231,126,60,219,189,36,66,182,129,1
89,126,219,189,36 :rem 62
885 DATA24,24,102,102,24,24,68,8 trem 71
8908 RETURN :rem 129

138
Props
Philip I. Nelson

“Props” is a fast-paced game for the 64, complete with eight


sprites, programmed characters, and all three SID voices for sound
effects. Animated in machine language, there are six levels of play
from which to choose.
Included is a detailed program discussion that offers a variety
of excellent programming tips and techniques. Joystick required.
You are a lonely pigeon, lost in a dangerous sky filled with
whirling propellers. You want to return to your coop and your
mate, if only for a brief rest before flying away again. But to
make matters even worse, every time you leave, and at other
uncertain intervals, your mate moves to a new coop.
While in flight, you must avoid getting pulled into the
propellers. If that happens, you lose points. Unless you escape
quickly, the props may pull you back again and again. The
props may start in an orderly formation, but every collision
bumps one out of line. The worse you play, the more confus-
ing things get.
After you’ve read Appendix C and saved a copy of “The
Automatic Proofreader,” you can begin typing in ‘’Props.”
Since it’s such a long program, and since there’s a consid-
erable amount of machine language data numbers to enter, the
Proofreader will be especially helpful in insuring an error-free
copy the first time. There are also short routines within Props
to double check that the machine language data have been
typed in correctly. If you’ve entered the wrong numbers, an
error message will display on the screen when you try to run
the program. Once you’ve found the bug, save the program
again to tape or disk, preferably under a new filename.
To play, plug your joystick into port 2. The six skill lev-
els range from leisurely to maniacal. Whenever you reach
home and your mate, the score is displayed briefly. If you
press the fire button during the score display, the game pauses
to let you catch your breath. During the pause, you can
change to a different skill level by pressing number keys 1
through 6. To quit, just pause and press the 0 key. If you score

139
4. Creature Features
ere ree carrer

well at any given level, the game pauses by itself and lets you
pick a new skill level.
The Animation Subroutines
Two main machine language (ML) routines are responsible for
virtually all the animation. The first one reads the joystick,
moves the bird shape accordingly, and flaps the wings of both
pigeons. The second rotates the eight propeller sprites and
moves them up or down. Two additional small routines help
program a new character set and fill color memory with white
values for the new-ROM 64s.
Let’s first look at the bird-moving routine (Birdmove),
which you could adapt for just about any graphics game. This
routine begins at line 49400 and continues to line 49650. Since
it’s an ML routine, it’s in the form of numbers, not in BASIC’s
syntax. Unless you know machine language, it may seem
impossible to decipher it. However, we can describe what it
does, and how it executes. For those of you who know ML
programming, it shouldn’t be difficult to modify the routine
for your own use.
Birdmove animates the bird-shaped character. The routine
keeps track of a variable, BIRDLOC, that represents the bird’s
current screen location. To move the bird around in screen
memory (locations 1024-2023), a blank space is first put into
the variable BIRDLOC to erase the character. Next, a check is
done to see whether any movement has been requested
through the joystick. If so, BIRDLOC changes to represent the
new screen location. If not, BIRDLOC stays the same. In either
case, a new shape appears in the updated BIRDLOC screen
location.

Setting the Bird’s Boundaries


To move the bird left or right, Birdmove subtracts or adds one
to BIRDLOC. To move the bird up or down on the 40-column
screen, 40 is subtracted or added. Before moving the pigeon
around in memory, you need safeguards to prevent the bird
figure from flying above screen memory into the BASIC pro-
gram space, or below it into the sensitive zero page of mem-
ory, either of which could cause the computer to crash.
Birdmove uses two techniques to confine the bird. The
first compares BIRDLOC to absolute upper and lower limits. If
you try to move lower or higher than the bounds of screen

140
Creature Features 4.

memory (1024 and 2023 respectively), Birdmove terminates


without changing the BIRDLOC variable.

Collision Detection
The second safeguard is a collison check for horizontal move-
ment. When you move left, for instance, Birdmove holds the
updated BIRDLOC position in temporary storage. Before it
moves a bird figure into the new location, the routine checks
that spot to see which of the three possible characters is there.
If the location contains a space, the bird can move left. If
the position holds the coop character, the old BIRDLOC is re-
stored and the Birdmove routine is exited without changing
position. If neither character is found, then the space must
contain the mate character, so the routine sets a flag to show
that the bird has reached home and ends with the wing-flap-
ping display.
To modify Birdmove for your own games, just add more
comparisons to check for as many possibilities as you need.
For example, your game might check the desired location and
then branch to appropriate routines to score if you've hit a
treasure, faint if you've hit a troll, rejoice if you’ve bumped
into a friend, and so on.
The Joystick Flags
The joystick reader at the beginning of Birdmove is from the
Commodore 64 Programmer's Reference Guide. It stores flag val-
ues in a memory location which you can then PEEK to deter-
mine movement. In Props, the joystick flag values are in the
cassette buffer, but you could put them in any safe memory
area. The right/left flag is stored in location 832, and the
up/down flag in 833. The value in 832 will be 255 for left, 1
for right, and 0 for no movement. For the up direction, 255 is
stored in location 833; 1 for down and 0 for no movement are
placed in the same address. Note that leftover flag values will
remain in the computer’s X and Y registers, so if your ML pro-
gram goes from this routine to one that uses indirect address-
ing, you should clear the X and Y registers to 0 to keep things
straight. baeneets
Programmed characters are used to make the birds’ wings
flap. In lines 62000-63000 of Props, the character set from the
ROM chip is first copied into RAM memory beginning at loca-
tion 14336. Then new shapes for characters 90-96 are created

141
4 Creature Features

by POKEing new values into the RAM character set. Character


90 is programmed to serve as our coop character; the other six
characters consist of the various bird shapes.
Each time the Birdmove routine is called, it flips to the
next character in this wing-flapping series to create the illusion
of movement. To see all the programmed characters, first run
the program and then press the RUN/STOP key while the
instructions are displayed. Hold down the SHIFT key and
press CLR/HOME to blank the screen. Now type in this line
in direct mode (without line numbers). Use abbreviations for
PRINT (?) and POKE (P-SHIFTed O), or part of it will be cut
off.
PRINT" {CLR}"TAB(255) :K=90:FORJ=1924TO1276STEP42: PO
KE54272+J,1:POKEJ,K:K=K+1 :NEXTJ

Press RETURN and you'll see the coop character and six bird
shapes in the upper left of the screen.

Flapping from BASIC


Let’s make the bird character flap its wings from BASIC in im-
mediate mode. Type the following line and press RETURN:
FORK=1T0180000 : FORJ=91T096 : POKE1@24, J: FORL=1TO30:N
EXTL,J,K
The bird should be flapping at the top left corner. Press the
RUN/STOP key when you've seen enough. You can do the
same thing with the ML routine. To set things up, enter this
line and hit RETURN:
POKE 251,8:POKE252,4:POKE834,91

This puts information in memory locations that the ML rou-


tine uses to position the bird and start the wing-flapping
character series. Now type in the next line and press
RETURN:
FORJ=1TO
: SYS49688 1099
: FORK=1T030 00
:NEXTK,J

Using the Routine’s Modules


As before, press STOP when you've seen enough. The entire
Birdmove routine starts at location 49408 in memory, with its
flap portion toward the end of the routine (49608). At certain
points during Props (the reunion or a pause), the birds flap
their wings without moving.This is done by starting with the

142
Creature Features 4.

flapping section at location 49608 and skipping the movement


parts entirely. To place the mate somewhere, without any
moving or flapping, the routine jumps even further, to 49615.
By structuring an ML program in distinct modules like this,
you're able to get maximum use out of what you've written.
Let’s call the whole Birdmove routine to let the bird fly
free. First, type this line and press RETURN:
POKE8 34, 91: POKE835,@: POKE836, 4: POKE837, 230: POKE838
,6©: POKE251,255: POKE252,5

You just positioned the bird and set limits to keep it on the
screen. Now enter this as one line. Again, use abbreviations
for PRINT and POKE to get this all on two screen lines.
PRINT" {CLR}":FORJ=1824TO20@8STEP41 : POKEJ , 98: POKEJ+
54272,1:NEXT: FORJ=1TO199009 :SYS49498 : NEXT

Using the joystick, you can move one of the bird characters
you see on the screen. The bird will wrap around the screen
when its way is clear, but stop when it hits a coop character.
The up-and-down movement routine contains no collision
check, however, so moving in those directions erases any
character you encounter.

Vary the Difficulty with Delay Loops


Running at full ML speed, Birdmove is fun to play with, but
too fast to be practical. Props uses a variable delay loop (con-
nected to skill level) to slow things down to a manageable
speed.
is Spritemove, which runs from lines 49000 to 49350, is the
second ML routine in Props. It handles the sprite animation,
moving the eight propellers up or down at the correct speed
and twirling them in unison.
Look at lines 2-6 of the program and you'll see something
odd. The game works by cycling through these lines, calling
the Birdmove routine over and over with the statement SYS
49408 in line 2. But Spritemove is called only once (SYS
49152) in line 1, while things are being set up. Yet the sprites
move continuously as long as you're playing. How can
Spritemove work all the time without calling it repeatedly?
Easy—the computer just does it along with its other
housekeeping.

143
4. Creature Features
ee ae a ee a]

Harnessing the Hardware Interrupt


In addition to executing your programs, your 64’s processor
chip has continual housekeeping to do, like updating timers
and scanning the keyboard. But it can do only one thing at a
time. So occasionally the computer stops doing your work and
takes time out for its own tasks. You never notice these inter-
rupts, because they happen about 60 times every second.
Like Birdmove, the 64’s hardware interrupt routine is just
another ML program, starting at location 59953 ($EA31 in
hex) in memory. By changing one pointer (vector), the com-
puter performs our ML routine first, then goes on to do its
housekeeping as usual—but it does that 60 times a second!
Memory locations 788-789 ($0314-$0315) are specially
reserved to hold the address where this interrupt routine be-
gins. When you turn on your 64, it automatically sticks the
normal (default) address in these locations. The first part of
Spritemove just changes this vector to point the computer to
the beginning of our ML program.
At the end of the ML routine, the computer is sent to its
normal interrupt program at $EA31, rather than returning to
the program as in a conventional ML subroutine.

Watch It in Isolation
Such an interrupt-driven ML routine will seem to run indepen-
dently of BASIC. To watch Spritemove in isolation, first run
Props and press the RUN/STOP key when the props move.
You'll see the blinking cursor and READY signal, which shows
the computer has quit executing the BASIC program. You're
back in BASIC’s immediate mode, but Spritemove is still
working along with the interrupts, so the graphics and sound
keep going.
You can do anything you’d normally do from BASIC,
even call other ML subroutines as in the examples above, but
there’s a limit to how far you can take this technique. Grafting
a lengthy ML routine onto interrupts will make those “‘time-
ae so long that they slow the BASIC operations down to a
crawl.
To stop Spritemove, first clear the screen of character
graphics by holding down SHIFT and pressing CLR/HOME.
Now type SYS49152 and press RETURN. The props and
sound should freeze.
To restart the props, move the cursor up to the same line

144
Creature Features 4.

and press RETURN again. The interrupt vector now points to


Spritemove, and things are moving. Spritemove is designed to
alternately change and restore the interrupt vector every time
the routine is called, letting you turn it on or off at will.

The Sprites Are Still There


Note that stopping Spritemove doesn’t erase the sprites. If you
want them to disappear at certain points in Props, you have to
disable their display with the statement POKE SP+ 21,0.
When that’s done, the sprites are all still moving (in the sense
that Spritemove keeps changing their location registers and
shape pointers), but none of this is visible since the computer
isn’t showing it on the screen.
Compared to the interrupt routine, the rest of Spritemove
is simple. The BASIC setup section of Props sets the eight
sprites to fixed horizontal locations, giving each a path to
move up or down in. Each prop always flies in the same direc-
tion—one space up or down on the sprite grid for every
execution of Spritemove at skill level 1.
Each sprite has a register (memory location) containing its
vertical location. To move the props, Spritemove increments or
decrements every vertical location register one or more times,
depending on the skill level.
This is simpler in ML than in BASIC. Assume that sprite 1
starts out at vertical location 100. If larger values are placed in
its vertical location register, it moves down the screen.

Safe Increments Are Assured


In BASIC you'd have to insert a safeguard in the program to
make sure a value larger than 255 couldn’t be POKEd into the
register, since that would crash the program with an ILLEGAL
QUANTITY error.
But ML lacks the error-checking mechanics of BASIC and
simply won’t let you put a number bigger than 255 into any
memory cell. Trying to increment a register from 255 to 256
will just flip its value back to 0. Increment that register again,
and it'll contain the value of 1.
The same thing works in reverse—decrementing a register
that contains 0 gives 255. This characteristic of ML, which
might seem a limitation, is used to advantage in Spritemove,
which just keeps incrementing and decrementing the vertical
sprite registers blindly. You know ML won't let the program

145
Creature Features

exceed the safe 0-255 range, which conveniently enough the


sprites also use for vertical location.
Animating the Propellers
You define a sprite’s shape by pointing it to a block of shape
information that you’ve placed in memory beforehand. To ro-
tate the props, these related shapes are simply flipped
through, much as the birds are made to flap their wings.
Spritemove points all eight sprites to successive sets of shape
data, which were stored when the program sets up. Since the
props are bilaterally symmetrical, memory is saved by flipping
through a series of only four shapes. Yet the effect is of an
eight-position rotation.
Just as the computer looks in a special place to find the
address of its interrupt routine, Spritemove checks and
changes a special location for the current shape pointer, loca-
tion 828 ($033C).
Other memory locations in the cassette buffer are used to
store things for the ML routines. As you've seen, locations 832
and 833 hold values received from the joystick. Location 842
holds the home flag—the Birdmove routine stores a value of 1
here if the bird reaches home, a 0 otherwise.

Passing ML Values to BASIC


This is an example of how to use variables in machine lan-
guage and pass information back and forth from ML to BASIC
sections of your program. In BASIC, of course, you might use
a variable, such as HOME, and say that HOME=1 when
home is reached, making sure that HOME=0 at all other
times. But ML doesn’t recognize names—just numbers inside
memory locations. In Spritemove, then, a memory location
(842) is chosen to represent the condition of the home flag. All
that needs to be done is to store a 1 in that location as a signal
when home is reached.
Line 3 of the BASIC program uses the PEEK function to
check that same memory location (HM=842) for a nonzero
value, branching to the BASIC HOME subroutine starting at
line 20 if that condition is satisfied. Once that subroutine is
executed, the flag is set back to 0 in line 24, so that the pigeon
can get lost again.

146
Creature Features 4.

Synchronizing Sound and Action


Props also creates its filtered and ring-modulated sound effects
by passing values from ML to BASIC. When the bird flies
around the screen, a soft. musical tone is heard; it changes con-
stantly in relation to screen position. The sound is begun in
line 2 by turning on voice 1 (POKEW1,17). In line 6, the pitch
of voice 2 is changed by PEEKing into location 251, which,
you'll recall, is used by Birdmove to store the bird’s screen
location. In this simple way, the bird’s sound effect is linked
to its action.
Voice 2 is always on during the game, set to the noise
waveform to make a swooshing sound. The effect of fading in
and out is created, not with the volume control (which affects
all three voices equally), but with a filter, which can be set to
affect any or all of the voices at a given moment. In line 1003,
location 54296 is POKEd with a value of 47. Besides volume,
this register lets you select the type of filter you want. Starting
with a value of 15 (for maximum volume in all voices), 32 was
then added to turn on bit 5 of that register to activate the
bandpass filter. 15+32=47, the value POKEd into this ad-
dress. This filter cuts out all but a narrow band of frequencies
in the tone of the filtered voice.
Next, the voice to be filtered is selected. Also done in line
1003, 66 is POKEd into location 54295, which filters voice 2
and sets a moderate amount of resonance. (If you’ve never
played with filter resonance, substitute 66 with 226 in line
1003; you'll hear the more pronounced effect of maximum
resonance.)

A Swoosh Is Filtered Noise


Now the filter’s ready to use. Picking the noise waveform for
voice 2 gives a more or less random collection of all the
audible frequencies to work with. Setting the cutoff frequency
low will pass through a narrow band of low frequency tones
for a roaring or rumbling sound, and suppress all other fre-
quencies. A high cutoff value produces a narrow band of hiss-
ing, high-frequency tones. To make a swooshing sound, all
you need to do is change the cutoff frequency at high speed,
from low to high values.
To tie this sound to the graphics action, Spritemove is al-
lowed to change the cutoff frequency at ML speed. At the very
end of Spritemove is a small subroutine that stores a value

147
4 Creature Features
[th by ae a

into the filter cutoff frequency register. This value is the same
one used to control the number of spaces the sprites move
each 1/60 second. At higher skill levels, larger numbers are
added to the cutoff frequency register, to sweep the filter from
low to high more rapidly.
As with sprite positioning, incrementing this register is
simple and doesn’t have the danger of causing ILLEGAL
QUANTITY errors. The result is a repeated low-to-high sweep
in the range of 0 to 255.

Filtering Voice Three


The echoing synthesizer tones heard while pausing, or when
the bird’s mate changes coops, are produced by applying simi-
lar bandpass filtering to voice 3. The technique is the same—
the filter cutoff frequency is swept upwards, over and over.
But instead of the noise waveform, the triangle waveform is
used, ring-modulated by the pitch frequencies of voice 2 (line
Bi).
The pitch of voice 3 is linked to the bird’s screen position
by using the value found in location 251. And the pitch fre-
quency of voice 2 is also swept down over and over, in the
familiar 255 to 0 range, by the Spritemove routine.
Unlike the noise waveform, which contains tones at al-
most every audible frequency, the triangular waveform is rich
in certain harmonic frequencies and totally lacking in others.
So at certain frequencies the bandpass filter cuts out almost
everything, creating silence. Adding ring modulation sup-
presses the flutelike tone you'd otherwise get from a triangle
wave and adds new harmonics for an even stranger effect.

A Two-Voice Sound Effect


One final, important difference between this and the swoosh-
ing sound is in the ADSR (Attack/Decay /Sustain/Release) en-
velope. For the props’ sound, voice 2’s sustain value is set to
the maximum of 240 (line 1082). The ADSR envelope is trig-
gered only once, in line 11050.
With maximum sustain, the tone will never actually fade
out—it only seems to reach silence when the filter is set to its
lowest cutoff. In contrast, voice 3’s ADSR envelope is used ev-
ery time the synthesizer sound plays, causing the slow,
ghostly fade-out.
But you can do fancy sound filtering without mastering

148
machine language. Take a look at lines 11050-11058, which
govern the animation and sound of wings flapping during the
instruction display. Here the filter frequency is controlled from
an entirely different source.

A Special Number Generator


Location 54299 (VM + 3) is a register that can be made to pro-
duce four different number sequences that are handy for
controlling sound. It can generate a sweep of value from 0 to
255. Or it can sweep the range up and down. It can generate
random numbers and can also flip back and forth from 0 to
255 at varying rates.
You choose which number sequence you want by select-
ing one of the four waveforms for voice 3. You control the rate
at which the numbers change within the sequence by setting
the frequency of voice 3.
For a convincing wing-flapping sound, the filter should
sweep up and then back down again. Selecting the up-and-
down number sequence by setting voice 3 to a value of 16 in
line 11050 does this. To time it to the beating of the birds’
wings, the various frequency values for voice 3 (H3 and L3)
are manipulated until they’re right. Note that you don’t want
to hear voice 3—you're using its pitch values only to control
the output of voice 2. So W3 is POKEd to 16, which selects
the triangle waveform without turning on the gate bit (which
would make the voice audible).
Once you have Props running, you can learn a lot about
the 64’s SID chip just by changing the values used in this and
other sound sections.

A Props AX_
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
1 GOSUB1999 : GOSUB82 :GOSUB5@ :SYS49152 :rem 241
2 POKEW1,17:SYS49408 :C=PEEK(CX) : IFCTHEND=PEEK(SP+A
(C) ) :GOSUB1® srem 122
3 IFPEEK(HM)THENGOSUB29 :rem 222
4 FORJ=RTO20-DL:NEXT: BZ=BZ+R: IFBZ=MXTHENBZ=. :GOSUB
50 :rem 247
5 IFSK>NTHENGOSUB7 :rem 212
6 POKEH1, (PEEK( 251) /5+9) s:POKEW1,16:GOTO2 s:rem 90
7 KL=KL+R: IFKL> NTHENKL=. : POKEFAST, INT( RND(R) *M) : PO
KE845,(.) :rem 238
8 IFRND(R) > PTHENPOKEFAST , V: POKE845, (.) srem 159

149
4 Creature Features
oe Ree

9 RETURN :rem 25
1@ POKEBD, 2:FORJ=RTO4@ : POKESP+A(C),D: POKEW1,129:SY
S496@8:POKEW1L,128:NEXT :rem 31
11 SC=SC-SK:IFSC<RTHENSC=. :rem 179
12 POKEBD,.:POKECX,.:RETURN :rem 234
13 REM LINES 7-9 = 'VARY SPEED' RTN :rem 146
14 REM LINES 10-12 = 'HIT PROP' RTN :rem 92
20 REM*** '‘HOME' :rem 59
21 SC=SC+SK+3:IFSC>199THENGOSUB79:GOSUB88 :rem 107
22 POKESP+21,8:PRINTSCS"K63SCORE: "SC :rem 282
23 FORJ=100TO1STEP-2:SY POKEW1, S496 08:
21:POKEH 1,J:P
OKEW1,20 :NEXT :rem 231
24 PRINTSC$"{13 SPACES}":POKEHM,@:POKECX,@:rem 171
5@ REM*** 'NEW COOP' :rem 48
51 POKESP+21 ,@:
21:POKEH 3, POK EW3
PEEK(251 ,CS
):PRINTS
“{YEL}NEW COOP":PR INT"
{HOME }£63"; :rem 58
52 FORJ=1T024:PRINT"{RIGHT}Z{36 RIGHT}Z":NEXT
™ a :rem 120
53 PRINT"{RIGHT}Z{36 RIGHT }Z{HOME}":POKEW1,16:POKE
W3,28 Sa 7 :rem 54
54 IFHF=0THENHF=1:GOTO58 :rem 254
55 HF=0:J=1062:FS=40* (INT(RND(1)*25) ) :rem 17
56 HI=INT((FS+J)/256) :LO=(FS+J)-(HI* 256) : POKE843,L
O:POKE844,HI :rem 124
57 SYS49615:POKEJ+FS+L1,1@:PRINTSCS"{18 SPACES}":P
OKESP+21, 255:GOSUB10@: RETURN :rem 172
58 J=1025:FS=40* ( INT(RND(1)*25)) :rem 222
59 HI=INT( (FS+J)/256) :LO=(FS+J) -(HI*256) : POKE843,L
O:POKE844,HI :rem 127
68 SYS49615:POKEJ+FS+L1,10:PRINTSCS$"{1@ SPACES}":P
OKESP+21,255 :GOSUB19@:RETURN :rem 166
70 REM** NEXT LEVEL :rem 86
71 PRINTCHRS (142) :FORJ=1TO50@ :NEXT: PRINTCHRS(14):P
-OKESP+21,@:POKEW2, 21 :rem 93
72 POKEW1,2@8:POKEFV,3 :FORK=5TO115STEP2:POKEW3, 21:
POKEBD,K: POKE646,K :rem @
73 POKEH1,K*1.4:PRINTSC$"NEXT LEVEL?":POKEH3,K/4:S
YS49608 : POKEW3, 20:NEXT :rem 253
74 POKEW1, 20: POKEFV, 66 :FORJ=1T03580:NEXT: POKEH3,1@
@:POKEBD,@: POKEW2,129: RETURN :rem 2082
88 REM*** PICK SKILL LEVEL :rem 232
81 POKESP+21,@:POKEFNA(@),32:KZ=@ :rem 193
82 PRINTSCS$"{YEL}{3 LEFT}PICK SKILL LEVEL":rem 136
83 PRINTSC$"K83{2 DOWN}{RIGHT}(1 - 6)" :rem 181
84 GOSUB29@ :rem 126
85 IFKZ<>1THENSYS49688 :GOTO84 :rem 100
86 PRINTSC$"{3 LEFT}{16 SPACES}" :rem 288
87 PRINTSCS$"{2 DOWN}{1l1 SPACES}" :rem 28
88 SC=0:RETURN :rem 141
Creature Features 4.

REM*** PAUSE ROUTINE :rem 151


IFFNB(.)THENRETURN :rem 133
POKEBD,13:PRINTSCS"{RVS}{YEL} PAUSING {OFF}"SC
$"K83{2 DOWN}SCORE: "SC :rem 253
PRINTSCS$"{4 DOWN}FIRE=PLAY"SCS$"{6 DOWN}ZERO=QU
TBS :rem 32
FORJ=1T0159@ :NEXT: POKEBD,@ :rem 97
SYS49608:S=S+1:IFINT(S/43)=S/43THENPOKEW3, 20:P
OKEH3 , PEEK(SP+1) : POKEW3, 21 :rem 170
IFFNB(.)=.THEN11@ s:rem 167
GOSUB20G srem 172
IFSK>5 THENGOSUB7 :rem 31
GOTO195 srem 105
PRINTSCS"{12 SPACES}"SCS"{2 DOWN}{1@ SPACES}"S
cs"{4 DOWN}{9 SPACES}" :rem 127
PRINTSCS"{6 DOWN}{9 SPACES }" :rem 132
POKEW3, 20: POKEBD, 2: POKEBD, 5: POKESP+31,@: POKEBD
, 7:POKEBD, 3:POKEBD,@:RETURN :rem 116
REM*** SKILL srem 115
G=PEEK(197) srem 46
IFG=35THEN30@ :rem 210
IFG=56 THENSK=1 : DL=1 : POKEFAST, 1 : POKEROT, 4: POKE8
29,8:POKE845,8:KZ=1:RETURN srem 110
IFG=59 THENSK=2:DL=5
: POKEFAST, 2: POKEROT, 3: POKE8
29,0:POKE845,8@:KZ=1 : RETURN :rem 119
IFG=8THENSK=3
: DL=1@ : POKEFAST, 3: POKEROT, 2: POKE8
29,@:POKE845,9:KZ=1: RETURN srem 111
IFG=11THENSK=4:DL=15 : POKEFAST, 4: POKEROT, 1:POKE
829,8:POKE845,8:KZ=1 : RETURN :rem 160
IFG=16THENSK=5 : DL=19 : POKEFAST, 5 : POKEROT ,@:POKE
829,8:POKE845,9:KZ=1: RETURN :rem 171
IFG=19THENSK=6 : DL=19 : POKEFAST , 6 : POKEROT, @ : POKE
829,8:POKE845,%:KZ=1: RETURN :rem 177
RETURN s:rem 115
REM*** QUIT s:rem 56
POKE49221,2:POKE49228,0:POKE829,@:POKE845,9:PO
KE646,7 :rem 43
FORJ=SP+1TOSP+15STEP2 :POKEJ,123:NEXT: POKE214,2
4:PRINT:FORJ=1T0O24 :rem 112
PRINT: FORK=1T020 :NEXTK,J : POKEW3, 20 :rem 189
POKEW3,21:PRINTSCS"BYE BYE . . .":FORJ=1T02400
: NEXT: POKESP+21,8 :rem 159
FORJ=L1 TOVM+3 : POKEJ , 9: NEXT :SYS64738 :rem 244
REM*** INITIALIZE :rem 21
REM**ML RTNS: SPRITEMOVE=49152: BI RDMOVE=49488
: FLAPWING=49608 : PUTMATE=49615 :rem 182
POKE5 3272, 21: POKE53281,9:BD=53280: POKEBD, 9
srem 150

151
4 Creature Features

1883 FORJ=5427 , @ :NEXT 542


: POKEJ 2T0 96
: POKE54296 , 47:P
OKE54295,66 :rem 127
1884 GOSUB1989@ : GOSUB1 2000 : FAST=49221 : ROT=49228 : R=
1 :N=5 :M=7:P=(.98) :V=28 :MX=209 :rem 138
1896 REM*** SET UP SPRITES :rem 228
1888 POKES 3275, 255:SP=53248
:CX=SP+31 : POKECX, @
:rem 138
1812 FORJ=2040T02947 : POKEJ , 221 :NEXT :rem 85
1014 B=89 :FORJ=SP+1TOSP+15STEP2 : POKEJ , B: B=B+20 :NEX
Je s:rem 187
1816 POKES P+23 ,@:POKESP+29,24 :rem 186
1818 POKESP, 40: POKESP+2, 78: POKESP+4, 108: POKESP+6, 1
30 :POKESP+8,188:POKESP+19, 245 :rem 24
1028 POKESP+12, 20: POKESP+14, 48: POKESP+16,192
:rem 75
1822 POKESP+39, 7: POKESP+4@, 3: POKESP+41, 4: POKESP+42
Sake :rem 180
1824 POKESP+43, 7:POKESP+44,
3: POKESP+45,13:POKESP+4
6,4 :rem 189
1625 REM ML VARBLS, ETC IN CASET BUFR :rem 77
1826 POKE828,221:REM START SPRITE PNTRS s:rem 117
1628 POKE829,1:REM SPRITE ROTATE COUNTR :rem 153
1830 POKE830,48:POKE831,98:REM LINE VAL :rem 168
1832 POKE832,8:REM R/L JYSTK FLAG :rem 136
1834 POKE833,0:REM U/D JYSTK FLAG :rem 134
1836 POKE834,91:REM BIRD CHAR VAL :rem 110
1038 POKE835,1:POKE836,4:REM UP LIMIT :rem 164
1840 POKE837, 230: POKE838,6:REM DN LIMIT :rem 244
1042 POKE841,1:REM SPRITE MOVE COUNTR s:rem 247
1844 HM=842:POKEHM,®:REM 'HOME' FLAG :rem 66
1846 POKE843,95:POKE844,5:REM MATE'S FIRST LOCATIO
N :rem 61
1048 POKE251,144:POKE252,4:REM FIRST BIRD LOCATION
- ZERO PAGE :rem 1981
1849 POKE845,90:REM FILTER CUT COUNTR :rem 165
1858 DIMA(129) :A(1)=1:A(2)=3:A(4)=5:A(8)=7:A(16)=9
2A(32)=11:A(64)=13:A(128)=15 :rem 235
1052 HF=0 :BZ=0 :rem 6
1054 DEFFNA (X)=(( PEEK( 252) *256)+PEEK(251)) :rem 5
1856 DEFFNB(X)=(PEEK(5632@)AND16) :rem 88
1058 SC$="{HOME}{15 RIGHT}{18 DOwN}" :rem 121
1960 REM*** SOUND VRBLS :rem 59
1064 L1=54272 :H1=L1+1:W1l=L1+4 :W2=L1+11 srem 55
1968 L3=L1+14:H3=L1+15:W3=L1+18 :rem 17@
1872 FH=L1+22 :FV=L1+23 :VM=L1+24 :rem 231
1974 REM*** SETUP SOUNDS :rem 155
1876 POKEL1+5,64:POKEL1+12,15:POKEL1+19,12:rem 128
1878 POKEL1+7, 255: POKEL1+8, 255 :rem 183
1882 POKEL1+6,9:POKEL1+13,
248 :POKEL1+28,12:rem 199
1084 POKEFH, 90 :rem 31

152
Creature Features 4

1190 GOSUB1140@ :rem 52


3888 REM*** DRAW COOPS :rem 215
3884 FORJ=1984TO1 :924STE
POKEJ+L1,1@:POKEJ,9@:P
P-49
OKEJ+L1+1,10:POKEJ+1,9@ :rem 90
3886 POKEJ+L1+38,10:POKEJ+38, 90 : POKEJ+L1+39,10:POK
EJ+39,98:NEXT :rem 194
3888 FORJ=1924TO1984STEP4@ : POKEJ+L1,13:POKEJ+L1+1,
13: POKEJ+L1+38,13 :rem 264
3818 POKEJ+L1+39,13:NEXT: RETURN z:rem 159
19888 REM*** TITLE s:rem 213
198681 PRINT" {CLR} £K69"CHRS$ (142); :rem 19
19062 PRINT"{18 RIGHT}{RVS}£ kK*3" :rem 184
19883 PRINT"{17 RIGHT}{RVS}£{3 SPACES}K*}" :rem 76
18904 PRINT"{17 RIGHT}{RVS}{2 SPACES}P{2 SPACES}"
F srem 21
19685 PRINT"{17 RIGHT}{RVS}{2 SPACES}R{2 SPACES}"
s:rem 24
199066 PRINT"{17 RIGHT}{RVS}{2 SPACES}0{2 SPACES}"
srem 22
18007 PRINT"{17 RIGHT}{RVS}{2 SPACES}P{2 SPACES}"
srem 24
19698 PRINT"{17 RIGHT}£*3{RVS} S {OFF}£" zrem 54
18089 PRINT"{18 RIGHT}{RVS}{3 SPACES} {OFF}"
srem 121
18919 PRINT"{18 RIGHT}K*4I{RVS} {OFF}£" :rem 249
19611 PRINT"{19 RIGHT}{RVS} {OFF}" ~_ :rem 143
18012 PRINT"{17 RIGHT}{RVS}£{3 SPACES}£*}" s:rem 76
18613 PRINT"{6 RIGHT}{RVS}£18 SPACES}£*}{RIGHT} U
CI {RIGHT}£{8 SPACES ]}K* " :rem 49
10014 PRINT"{6 RIGHT}{RVS}{2 SPACES}PROPS
{5 SPACES}- -{5 SPACES}PROPS{2 SPACES}"
:rem 105
18815 PRINT"{6 RIGHT}£*}#{RVS}{8 SPACES} {OFF }£
{RIGHT}{RVS} JCK {RIGHT} {OFF}£*9{RVS}
{8 SPACES}{OFF]J£" srem 4
18816 PRINT"{17 RIGHT} &*3{RVS}{3 SPACES}
{OFF }£"
:rem 226
18617 PRINT"{19 RIGHT}{RVS} {OFF}" :rem 149
18018 PRINT"{18 RIGHT}{RVS}£ k*]" :rem elt
18819 PRINT"{18 RIGHT}{RVS}[3 SPACES}{OFF}"
s:rem 122
18629 PRINT"{17 RIGHT}{RVS}£ P k*}" :rem 155
19821 PRINT" {17 RIGHT}{RVS}{2 SPACES}R{2 SPACES}"
:rem 22
18622 PRINT"{17 RIGHT}{RVS}{2 SPACES}O{2 SPACES}"
:rem 20
189823 PRINT" {17 RIGHT} {RVS}{2 SPACES}P{2 SPACES}"
srem 22

153
4 Creature Features

19824 PRINT"{17 RIGHT} {RVS}{2 SPACES}S{2 SPACES}"


:rem 26
10025 PRINT"{17 RIGHT}£*3{RVS}{3 {OFF }£”
SPACES}
:rem 226
10026 PRINT"{18 RIGHT}£*3{RVS} {OFF}£{HOME}{CYNJR
EADING{2 DOWN}{3 LEFT}DATA..." :rem 73
10027 QS="{28 RIGHT}":POKE214,19:PRINT :rem 121
19028 PRINTOS"JOYSTICK":PRINTQS"{2 DOWN}{2 RIGHT }I
NWePORT 2” :rem 155
18999 RETURN :rem 236
11908 REM*** INSTRUCTIONS :rem 9
11002 PRINT" {CLR}":POKE53272,31 :rem 84
11004 RS="{4 RIGHT}" :rem 97
11086 PRINT"K69{4 RIGHT }ZZZZZZZZZ2ZZZZZZZZZZZZZZ2Z22
5 Diwan :rem 136
11007 PRINT"{4 RIGHT}ZZ{25 RIGHT}ZZ" :rem 123
11908 PRINTRS"ZZ{YEL} YOU ARE A PIGEON {WHT}X{YEL}
LOST £6322" :rem 245
11919 PRINTRS$"ZZ{YEL} IN A DANGEROUS SKY FULL £69Z
zZ" if :rem 131
11812 PRINTRS"ZZ{YEL} OF WHIRLING PROPELLORS. £6]3Z
7," we :rem 20
11913 PRINT"{4 RIGHT}ZZ{25 RIGHT}ZZ" :rem 120
11914 PRINTRS"ZZ{CYN} BACK AT THE COOP, YOUR
{2 SPACES}€69z22" :rem 17
11016 PRINTR$"ZZ{CYN} MATE WAITS FAITHFULLY-- £33X
k6qz" :rem 245
11017 PRINT"{4 RIGHT}ZZ{25 RIGHT}ZZ" :rem 124
11918 PRINTR$"ZZKk3} WATCH OUT FOR THE PROPS k69ZZ"
:rem 164
11820 PRINTR$"ZZk3} WHILE YOU FLY FOR HOME. £6322"
:rem 113
11921 PRINT"{4 RIGHT}22{25 RIGHT}ZZ" :rem 119
11922 PRINTRS"ZZ{YEL} HIT FIRE BUTTON DURING
{2 SPACES}£692z" :rem 149
11924 PRINTR$"ZZ{YEL} SCORE DISPLAY TO PAUSE, £63Z
za" :rem 189
11926 PRINTRS"ZZ{YEL} OR CHANGE SKILL LEVEL.
{2 SPACES}£64zz" :rem 76
11827 PRINT"{4 RIGHT}ZZ{25 RIGHT}ZzZ" :rem 125
11628 PRINTR$"ZZ{CYN}
HIT ZERO KEY DURING ANY 63Z
aad z" . :rem 162
ae oe ee PAUSE TO{2 SPACES}QUIT PLAYI
11032 PRINT"{4 RIGHT}2z{25 RIGHT}Zz" cane haa
11838 PRINTR$"ZZ{YEL} PRESS FIRE BUTTON NOW
{3 SPACES }£69zz" :rem 182
11848 PRINTR$"ZZ{YEL} TO CHOOSE SKILL{2 SPACES } LEV
EL. £6922" :rem 181

154
Creature Features 4.

11842 PRINT"{4 RIGHT}ZZ{25 RIGHT}22Z" :rem 122


11044 PRINT"{4 RIGHT }ZZZZ22ZZZ2ZZ2ZZ022Z 2222222222222
f :rem 241
11058 POKEW3,16:POKEH3,1:POKEL3,9@:POKEW2,129
:rem 187
11052 SYS49608: POKEFH, PEEK(VM+3 )/2: IFFNB(@)THEN119
52 :rem 7
11854 PRINT" { HOME }"CHRS$(142) :FORJ=1T0O20@:NEXT:PRIN
TCHR$ (14) :rem 205
110656 PRINT" {CLR}": POKEW3, 20:SYS49920:REM WHITE CO
L MEMORY :rem 121
11858 POKE843, 254: POKE844, 3: POKE251,22@0:POKEFH,2:R
ETURN srem 44
12800 REM** SPRITE SHAPE DATA :rem 141
12081 IFPEEK(14@81)=8AND 15965 )=195THENRET
PEEK( URN
srem 161
12287 CK=@ : FORJ=14980
: READQ:
T0O14 POKEJ ,Q
CK=CK+Q:142
:NEXT srem 162
12288 DATA 8,8,0,9,24,0,0,56,9,0,56,0,0,56,8,%, 24,
0,0,16,0,8,16,09,9,8,0 :rem 58
12289 DATA 0,24,9,8,60,0,0,24,0,0,0,9,8,8,08,8,8,@,
G,24,0,0,28,0,0,28,8,8,28 :rem 246
12298 DATA @,8,24,0,9,16,9 :rem 221
12351 FORJ=14144 : READQ :T0142
CK=CK+Q: POKEJ,Q:NEXT
06
:rem 103
12392 DATA 8,8,0,16,9,0,28,0,0,14,0,0,15,0,8,7,128
php ¢1 28 O06 l¢192,0.0.125 :rem 215
123533 DATA @,0,24,0,0,68,0,0,24,0,0,2,0,8,3,128,9,
1,192,8,1,224,0,8,248,0,0 :rem 238
12354 DATA 112,8,9,56,0,0,8,0,0,@ z:rem 44
12415 FORJ=14288 :READQ :CK=CK+Q:PO
T0142 KEJ,Q:NEXT
70
:rem 106
12416 DATA 80,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,8,0,0
12,0,0,0,0 srem 232
12417 DATA @, @,124,24, 62,255,189,255,124,24, 62,
0,0, 0,8,08,08,09,09,09,0,8,0 :rem 37
12418 DATA G,0,8,8,0,0,0,0,9,0,0,0,9,8,0 :rem 82
12479 FORJ=14272 :READQ :CK=CK+Q:
T0143 POKEJ,Q:NEXT
34
srem 118
12486 DATA 0,9,0,0,0,8,0,0,56,0,0,112,90,9,248,0,1,
294 0:1, 19270,9,12870,2 :rem 152
12481 DATA 0,0,24,0,9,60,0,0,24,0,9,64,0,1,192,0,3
#128 ,0,;7,128 28,15 :rem 145
12482 DATA 0,0,14,0,0,28,9,9,16,0,8,0,0,0 :rem 157
12589 IFCK<>5@53THENPRINT"{3 DOWN}ERROR IN DATA LI
NES 120@0-12482":END s:rem 119
49800 REM*** POKE PROPMOVE RTN :rem 250
49151 CK=@ : FORJ=49152T049319: READQ : CK=CK+Q : POKEJ ,Q
: NEXT srem 175

155
4 Creature Features

49152 DATA 120, 173, 21, 3, 201, 234 :rem 235


49158 DATA 208, 13, 169, 33, 141, 20 :rem 253
49164 DATA 3, 169, 192, 141, 21, 3 :rem 153
49178 DATA 76, 31, 192, 169, 49, 141 :rem 11
49176 DATA 20, 3, 169, 234, 141, 21 :rem 208
49182 DATA 3, 88, 96, 169, 9, 141 :rem 118
49188 DATA 73, 3, 238, 1, 208, 206 :rem 161
49194 DATA 3, 208, 238, 5, 208, 206 :rem 2190
49208 DATA 7, 208, 238, 9, 208, 286 :rem 206
49206 DATA 11, 208, 238, 13, 298, 286 :rem 42
49212 DATA 15, 208, 238, 73, 3, 173 :rem 205
49218 DATA 73, 3, 201, 2, 208, 222 :rem 144
49224 DATA 173, 61, 3, 201, 5, 248 :rem 142
49238 DATA 6, 238, 61, 3, 76, 49 :rem 63
49236 DATA 234, 173, 68, 3, 201, 224 :rem 246
49242 DATA 208, 5, 169, 228, 141, 68 s:rem 2598
49248 DATA 3, 141, 248, 7, 141, 249 :rem 212
49254 DATA 7, 141, 258, 7, 141, 251 :rem 199
49268 DATA 7, 141, 252, 7, 141, 253 :rem 298
49266 DATA 7, 141, 254, 7, 141, 255 :rem 219
49272 DATA 7, 238, 68, 3, 169, @ :rem 59
49278 DATA 141, 61, 3, 173, 69, 192 :rem 218
49284 DATA 18, 10, 18, 18, 18, 141 :rem 124
49290 DATA: fo, 3, 24; ‘1/3, 77, 3S :rem 66
49296 DATA 199, 78, 3, 141, 77, 3 :rem 119
49302 DATA 141, 22, 212, 206, 8, 212 :rem 236
49308 DATA 76, 49, 234 :rem 237
49358 IFCK<>17626THENPRINT"{3 DOWN}ERROR IN DATA L
INES 49990-49308":END :rem 206
49400 REM*** POKE BIRDMOVE RTN :rem 222
49497 CK=0:FORJ=49488T049643 : READQ: CK=CK+Q: POKEJ ,Q
:NEXT :rem 192
49498 DATA 1698, 8, 169, 32, 145, 251 :rem 253
49414 DATA 165, 251, 133, 253, 165, °252 :rem 158
49429 DATA 133, 254, 173, 8, 226, 162 :rem 35
49426 DATA @, 74, 176, 1, 136, 74 :rem 110
49432 DATA ‘176 "lL, ‘208, "74, °176;)' 1 :rem 151
49438 DATA 262, 74, 176, 1, 232, 74 :rem 2190
49444 DATA 142, 64, 3, 148, 65, 3 :rem 102
49459 DATA 173, 64, 3, 281, 1, 249 :rem 142
49456 DATA 18, 281, 255, 248, 3, 76 :rem 288
49462 DATA 116, 193, 165, 253, 208, 2 :rem 54
49468 DATA 198, 254, 198, 253, 76, 73 :rem 85
49474 DATA 193, 238, 253, 208, 2, 230 :rem 47
49488 DATA 254, 160, 8, 177, 253, 2@1 :rem 45
49486 DATA 32, 208, 3, 76, 91, 193 :rem 171
49492 DATA 281, 98, 208, 14, 76, 188 :rem 3
49498 "DATA*L93, 16572253; 133) \25xe 165 :rem 166
49504 DATA 254, 133, 252, 76, 116, 193 srem 105

156
Creature Features 4

49518 DATA 1697 IPATANS (74743) 96 :rem 189


49516 DATA*165 P2250 (4133 792537 6165 | e252 :rem 153
49522 DATA. T3235)k BU GRRISPSSS see) :rem 25
49528 DATA 1, 248, 39, 201, 255, 240 :rem 250
49534 DATA 3, 76, 288, 193, 162, @ :rem 151
495408 DATA 165, 253, 208, 2, 198, 254 :rem 59
49546 DATA 198, 253, 232, 224, 48, 2088 :rem 187
49552 DATA 243, 24, 165, 253, 205, 67 :rem 56
49558 DATA 3, 165, 254, 237, 68, 3 :rem 172
49564 DATA 1°76," 34, 2407032755144 ).4238 :rem 6
49578 DATA 162, 8, 238, 253, 208, 2 :rem 195
49576 DATA 238, 254, 232, 224, 498, 208 :rem 98
49582 DATA 245, 24, 165, 253, 205, 69 :rem 63
49588 DATA 3, 165, 254, 237, 78, 3 :rem 168
49594 DATA 144, 4, 248, 2, 176, 8 :rem 112
49689 DATA 165, 253, 133, 251, 165, 254 :rem 149
496986 DATA 133, 252, 160, 8, 173, 66 :rem 253
49612 DATA 23 Case eels 47S, ek :rem 155
49618 DATA 1335 °253¥ .173 746 [E37 973s :rem 5
49624 DATA 2545)" 1737 66043 7014551253 :rem 8
49630 DATA 201, 96, 248, 4, 238, 66 :rem 289
49636 DATA 3, 96, 169, 91, 141, 66 :rem 176
49642 DATA 3, 96 srem 241
49658 IFCK<>3316@THENPRINT"{3 DOWN}ERROR IN DATA L
INES 49499-49642"
:END :rem 205
49662 REM*** POKE COPYCHAR RTN :rem 233
49663 CK=@ : FORJ=49664T049794
: READQ : CK=CK+Q: POKEJ ,Q
:NEXT srem 198
49664 DATA 169,9,133,4,169,208,133,5 zrem 252
49672 DATA 169,0,133,6,169,56,133,7 :rem 208
49689 DATA 162,0,1609,0,177,4,145,6 s:rem 148
49688 DATA 200,192,255,208,247,230,5,238 :rem 193
49696 DATA 7,232,224,16,208,236,160,0,96 :rem 196
49780 IFCK<>4894THENPRINT"{3 DOWN}ERROR IN DATA LI
NES 49662-49696":END :rem 184
49918 REM*** POKE WHITEMEM RTN srem 244
49919 CK=@ : FORJ=499 20T049939 : READQ : CK=CK+Q: POKEJ,Q
:NEXT :rem 207
49920 DATAEIG 2° eLOo, 1, 15/75 2 :rem 101
49926 DATA*?216, 157,30) 217, 757770 :rem 209
49932 DATAW.219 7) 157a Byo2te, ues? 208 s:rem 54
49938 DATA 241, 96 :rem 93
4995@ IFCK<>26@7THENPRINT"{3 DOWN}JERROR IN DATA LI
NES 49918-49938":END srem 184
62900 REM* COPY CHAR SET TO 14336 srem 239
62982 POKE56334, PEEK( 56334) AND254:POKE1, PEEK(1)AND
251 srem 27
629084 SYS49664 :rem 8
62886 POKE1, PEEK( 1) OR4:POKE56334, PEEK(56334)OR1
:rem 237

ap
4 Creature Features

62488 REM** POKE NEW CHARACTER DATA ** :rem 72


62580 CK=9 : FORJ=15064T0O159071
:READQ : CK=CK+Q: POKEJ ,Q
:NEXT :rem 1690
62501 DATA @,195,1802,60,24,9,0,0 :rem 10
62582 FORJ=15072T0159879: READQ: CK=CK+Q: POKEJ ,Q: NEXT
:rem 116
62503 DATA @,9,195,126,24,0,9,@ :rem 2206
62504 FORJ=159888T0159887
:READQ :CK=CK+Q: POKEJ ,Q:NEXT
s:rem 116
62505 DATA 8,8@,66,255,153,9,0,@8 :rem 225
62506 FORJ=158088T0159095
:READQ :CK=CK+Q: POKEJ ,Q:NEXT
:rem 125
62587 DATA 6,9,8,998,255,129,8,90 s:rem 227
62588 FORJ=159896T015103 :READQ :CK=CK+Q: POKEJ ,Q:NEXT
:rem 116
625089 DATA 8,8,0,24,126,195,8,0 :rem 226
62518 FORJ=15194T015111:READQ:CK=CK+Q: POKEJ,Q:NEXT
:rem 98
oZolL DATA 8,9,0,24,60,102,195,129 :rem 119
62512 FORJ=15056T0159863: READQ:CK=CK+Q: POKEJ,Q:NEXT
:rem 112
62513 DATA 255, 60, 24, 24, 24, 24, 60,255:rem 235
62688 IFCK<>3255THENPRINT"{3 DOWN}ERROR IN DATA LI
NES 620980-62513":END :rem 132
63080 RETURN :rem 217

158
Worm of Bemer
Stephen D. Fultz
64 Translation by Kevin Martin

Nerm the Worm is lost in Bemer Castle and needs your help to get
home. You must guide him through 11 rooms and help him find magic
mushrooms to eat along the way. The journey is a navigator’s night-
mare, because you never know where the next mushroom will grow,
and if Nerm hits a wall or gets trapped by his tail, he loses one of his
lives. Optional keyboard controls.
“Worm of Bemer” is a fast-paced arcade game in which Nerm
the Worm travels through rooms eating magic mushrooms.
Nerm is lost in Bemer Castle and wants to return home.
You’re Nerm’s guide, making sure he finds mushrooms so he
can keep up his strength for the journey. A joystick plugged
into port 2 gives Nerm directions. (An option to use the key-
board is provided below.) After eating five mushrooms in a
room, Nerm can exit to the next room. But the trip’s not over.
You must guide Nerm through ten more rooms before he
finds home. The game starts with four lives for Nerm, but if
he touches anything besides a mushroom, he loses one of
those lives. :
At the top of the screen you'll see the current score, what
room Nerm is in, how many mushrooms he must eat to open
the exits, and how many lives he has left (including his cur-
rent life). You get 100 points, plus bonus points, for every
mushroom Nerm eats. Nerm also gets a bonus life after
completing the first two rooms and another for every third
room thereafter.

Getting Nerm Home


Here are a couple of hints to help you get Nerm home. First of
all, try to leave room between the walls and Nerm’s tail, for if
you block off the exits with his tail, you'll have trouble getting
to the next room. Sometimes it will seem as if you've sur-
rounded the mushroom with Nerm’s tail; all you have to do is
move Nerm to another section of the screen and wait for the
tail to shorten enough so that you can get to the mushroom.

159
4. Creature Features
(SoS SE

Nerm Can Use the Keyboard, Too


If you don’t have a joystick or just want to use the keyboard
instead, there are some changes to the program that allow you
to use four keys to control Nerm’s moves. By PEEKing loca-
tion 197, you can read the keyboard. It’s relatively simple, and
you can even modify the changes to select your own keyboard
pattern.
To switch from joystick to keyboard control, change these
lines:
198 S=PEEK(197):FORD=1TOSP:NEXT
110 IFS=53 TH
: DY=0: HENDX=~=1
IFOD=2TDX
DI=1: EN -1 : DY=0:
DI=2
120 IFS=45 THE
: DY=0: DI=2: NDX =-1
[FOD=1THENDX=1 :DY=6:
DI=1
138 IFS=46 THE
: DX=: DI=4: NDY =-1
IFOD=3THENDI=3 :DY=1:
DX=0
149 IFS=55 TH
: DX=0: DI=3: EN DY
IFOD=4T =1
HENDI=4 :DY=-1:
DX=0
7736 PRINT" {WHT}{2 DOWN}{RIGHT}PRESS SPACE BAR TO
{SPACE}PLAY AGAIN, Q=QUIT"
7786 S=PEEK(197):IFS=6@0THEN5@11
10025 PRINT"K1}{3 DOWN}{1@ RIGHT}USE KEYBOARD CONT
ROLS"
19830 PRINT"k69{6 DOWN}{1@8 RIGHT}HIT SPACE BAR TO
{SPACE}START"
10045 S=PEEK (19
: IFS=69T 7)RN
HENRETU
Once you've altered the program, you move Nerm up by
pressing the @ key, down with the / key, to the right with the
= key, and to the left with the : key.
If you want to change the keys that control Nerm’s direc-
tions, decide which keys you'd like, then type in the following
one-line program. Run it and press the keys you’d like to use.
19 PRINT PEEK(197):GOTO 19

The number on the screen is the value stored in location 197.


Place the value for your up key in place of the 46 in line 130
above. The down key’s value should replace the 55 in line 140.
Insert the right key value in line 110 (replacing the 53), and
the left key value instead of the 45 in line 120. That's it.

Adding More Features


This game uses some of the special features of the Com-
modore 64, including custom characters, sound, and scrolling
160

Creature Featurés 4. 3

screens. For instance, characters were redesigned for the walls,


the mushroom, and the body of Nerm. The original character
set was copied to a location in RAM not used by BASIC, and
the new characters were added.
Since Worm of Bemer is written entirely in BASIC, it’s rel-
atively easy to modify. You can learn a lot about programming
and games by changing the actions and settings of published
programs such as Worm of Bemer. Some features you might
add include a routine to save the high score to disk, adding
more players, or having Nerm go to a different room depend-
ing on which exit he takes. Simpler enhancements would be
changing the number of mushrooms that Nerm must eat to
open the exits or changing his speed.

pieces of Bemer wt \
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.

1 POKE52,48:POKE56,48:CLR s:rem 230


2 POKE53270, PEEK(532798)AND15 :rem 62
5 POKE53280,8:POKE53281,9@ :rem 138
18 GOTO 588G s:rem 95
188 S=PEEK(5632@)AND15:FORD=1TOSP:NEXT :rem 98
1190 IFS=7ORS=60ORS=5THENDX=1 : DY=@ : DI=1 : IFOD=2 THENDX
=-]1:DY=8:DI=2 :rem 18
120 IFS=11ORS=190RS=9THENDX=-1 : DY=@ : DI=2 : IFOD=1 THE
NDX=1 : DY=9 :DI=1 :rem 188
130 IFS=14THENDY=-1 : DX=0: DI=4: IFOD=3THENDI=3: DY=1:
DxX=2 :rem 122
140 IFS=13THENDY=1
: DX=@: DI=3 : LFOD=4THENDI=4 : DY=-1:
DX=2 :rem 123
145 PO=1924+XA+YA*
49 :OD=DI : POKEPO, 42: POKEPO+SO, Ll
:rem 3
15@ XA=XA+DX: YA=YA+DY : L=LEN(XAS ) :KAS=XAS+CHRS$
(XA):
YAS=YAS+CHRS (YA) srem @
155 Z=PEEK(1024+XA+YA*4@) :IFZ<>32THEN200 :rem 73
161 POKESO+1,40:POKESO+4,17 :rem 83
162 PO=1924+XA+YA* 49: POKEPO, 42: POKEPO+SO, 18: POKESO
+4,16:I1FL<WOTHEN1@O :rem 3
199 PO=1024+ASC(XAS)+40*ASC
(YAS) :LL=LEN(XAS$)-1:XA$
=RIGHTS (XAS,LL) :rem 238
191 POKEPO, 32:POKEPO+SO,9 srem 43
195 YAS=RIGHTS (YAS$,LL) :GOTO10@ s:rem 19
2860 POKESO+1, 20:POKESO+4, 17: POKESO+4,16 :rem 72
201 PO=1024+XA+40* YA: POKEPO, 42: POKEPO+SO, 10:GOSUB6
600 :I1FZ<>BUTHEN26@ :rem 202
218 ILFWO> 248THENWO=249
WO=WO+15+3*LO: s:rem 187

161
4. Creature Features

229 XX=INT(RND(1)*36+2) :X= INT (RND(1)*18+3) :IFPEEK(


1824+XX+40*X) <>32THEN220 :rem 9
221 SC=SC+180+LO*7:POKESO+4, 55: POKESO+4,17:rem 223
225 Hi= HI-1:GOSUB6690@ :IFHI>@THE N229 :rem 112
226 PO=10244+20+40*2: POKEPO, 168: POKEPO+SO,9: : PO=18024
+20+21*40:POKEPO, 1690 :rem 2
227 POKEPO+SO, @: PO=1024+40*12: POKEPO, 160: POKEPO+SO
,@:POKESO+1,100:POKESO+4,17 :rem 169
228 PO=1024+ 40*1
POKEPO, 2+39
160: POKEPO+SO :
,9:GOTO19
4) srem 242
220 4% : 4+X
PO=102 X+X
POKEPO, BUG: * 13
POKEPO+S0,
:rem 163
230 GOTO186@4 :rem 95
260 IFZ<>169@ANDLI>1THENGOSUB75989 : GOTO299 srem 242
265 IFZ<>1l69THEN7500 :rem 146
270 POKESO+1 , 98: POKESO+4,17 :rem 89
271 GOSUB7980:PRINT" {HOME}{24 DOWN}" :rem 151
2i> FORDE=1T024: PRINT: POKESO+1, DEL: POKESO+4,17:NEX
T:POKESO+4,16 :rem 40
286 LO=LO+1 :WO=5 : IFLO=12THEN1 2906 :rem 177
281 Li=L1+1:IFL1>15THENL1=11 :rem 99
285 IFLO>EXTHENGOSUB9109 :rem 29
287 PRINT" {CLR}":GOSUB 419808 :rem 132
298 GOSUB6698@0 :rem 231
386 ONLO GOT05820,4800,580,558,680,
700,808, 450,558,
1900,118{A},1200 :rem 129
398 GOTO5@15 :rem 169
400 REM SECOND SCREEN :rem 244
410 FORI=19024+5+198* 40T01924+35+10* 40: POKEI,35:POKE
I+SO,9:NEXT :rem 253
426 GOTO5829 :rem 156
458 REM SCREEN :rem 61
468 FORI=19024+5+10* 49T01024+35+198* 40: POKEI, 35:POKE
I+SO,9:NEXT :rem 2
465 FORI=1924+18+5* 40T01024+18+20* 49STEP4@: POKEL, 3
5:POKEI+SO,9:NEXT :rem 177
470 GOTO5820 :rem 155
588 REM THE FOURTH SCREEN :rem 242
518 FORI=1024+5+5* 46T01024+35+5*498: POKEIL, 35:POKEI+
SO,9:NEXT :rem 166
526 FORI=1924+5+18*40T01024+35+18* 48: POKEI, 35:POKE
I+SO,9:NEXT srem 15
530 GOTO5820 :rem 152
558 REM FRAME 5 :rem 38
560 FORI=1024+7+6*40T01024+33+6* 40 : POKEL, 35: POKEI+
SO,9:NEXT :rem 173
575 FORI=19024+18+7* 40T019024+18+20*40STEP49: :POKEI,3
5:POKEI+SO,9:NEXT :rem 181
586 GOTO5826 :rem 157

162
Creature Features 4

688 REM FRAME 6 :rem 27


619 FORI=1924+1+19* 40T01024+18+10*40: POKEI, 35:POKE
I+SO,9:NEXT :rem 252
615 FORI=1024+22+10* 49T019024+38+19* 48: POKEI, 35:POK
EI+SO,9:NEXT srem 54
628 GOTO582G :rem 152
786 REM FRAME 7 :rem 29
710 FORJ=6TO14: FORI=1024+64+J* 49TO19024+12+J3* 49: POKE
I,35:POKEI+SO,9:NEXT :rem 180
MS FORI=1924+29+J* 49T0190244+32+J* 49: POKEI , 35:POKEIL
+SO,9:NEXT:NEXT :rem 122
726 GOTO 5820 :rem 153
88S REM FRAME 8 s:rem 31
811 FORI=1924+1+8* 49T01024+18+8* 48: POKEI, 35: POKEI+
SO,9:NEXT s:rem 173
812 FORI=1924+1+15*49T01024+18+15*49:POK POKE
35:EI,
I+SO,9:NEXT srem 10
813 FORI=1924+15+12* 49T0O1024+38+12*40:POKEI, 35:POK
EI+SO,9:NEXT s:rem 60
898 GOTO5829 s:rem 161
1989 FORJ=4TO19 : FORI=1924+1+39* 49T019024+37+J*40:POK
EI, 35:POKEI+SO, 9:NEXT:NEXT srem 91
1965 FORJ=4T019 : FORI=19024+1+J3* 490TO1024+22+J* 48 :POK
EI, 32:POKEI+S0O,9:NEXT:NEXT srem 87
1919 GOTO5920 :rem 194
1190 40 :POK
FORJ=4T0O19: FORI=19024+1+J7*490T01024+37+J 3*
EL,35:POKEI+SO,9:NEXT:NEXT :rem 92
1105 FORJ=4T0O19: FORI=19024+1+J* 490TO1024+30+J3* 40: POK
EL, 32:POKEI+SO,9:NEXT:NEXT :rem 87
1110 GOTO499 :rem 144
1200 REM YOU WIN srem 146
1205 FORZZ=1T0O3 :rem 167
1210 PRINT" {CLR}{8 DOWN}{14 RIGHT}NERM'S HOME"
:rem 27
1212 PRINT"{5 DOWN}{15 RIGHT}THANK YOU" :rem 18
1215 FORG=1TO5 s:rem 61
122 FORI=1TO1G s:rem 193
1229 POKESO+1,1+6:POKESO+4,17 :rem 207
1248 NEXT : NEXT :rem 127
1245 FORI:=1T0 POKESO+1,1:POKESO+4,17
O209 :NEXT
:rem 242
1258 NEXT : GOTO7790 :rem 72
4190 FORI=562167T056295 :POKEI,L1:POKEI-SO, 36:NEXT:R
ETURN s:rem 232
5880 REM UP THE GAME :rem 73
5885 GOSUB1999@ : GOSUB11199 : BUG=33 s:rem 163
5@11 SP=35 :LI1=4:SC=0 : LO=1 : GOSUB55909@ :HI=5 : WO=5: EX=2
:L1=11 srem 126
5612 POKE5 3270, PEEK(53278)OR16 :rem 163

163
4. Creature Features

5815 PRINT" {CLR}":GOSUB6580 :rem 180


5828 XAS=""sYAS=""sXBS=""s:YBS="":XA=20 : YA=19:DX=9
:rem 161
5821 IFLO=3 THENYA=18 :rem 209
5625 DY=-1:T=@0: IFHI<@THENHI=0 :rem 242
5838 DI=4: IFHI>5THENHI=5 :rem 197
5858 FORI=19024+40* 2T01024+39+40* 2:POKEI, 35:POKEI+1
9*48,35:POKEI+SO,9 :rem 1984
5851 POKEI+S0+19*490,9:NEXT :rem 17
5855 FORI=19024+40* 2TO19024+40* 20STEP4@ : POKEI, 35: POK
EI+39,35:POKEI+SO,9 :rem 26
5856 POKEI+S0+39,9:NEXT: IFHI>@THEN5960 :rem 76
5857 I=1024+20+40* 2:POKEIL, 160:POKEI+SO,9:I1=1924+20
+21*40:POKEI, 160:POKEI+S0O,9@ :rem 192
5858 POKE1924+12* 40,168: POKE1@24+12*48+S0,80:rem 28
5859 POKE19024+12*49+39, 160: POKE1924+12*40+S0+39,0:
GOSUB419@ :GOTO15@ :rem 211
5860 XX=RND(1)*36+2:X=RND(1)*18+3: IFPEEK(1824+XX+X
*49) <>32THEN5060 :rem 255
5865 POKE1@24+XX+X* 48, BU: POKE1@24+XX+X*48+S0, 13
:rem 238
5876 GOSUB41093 srem 17
5885 GOTO15G :rem 161
5586 PRINT" {CLR}" :rem 46
5518 PRINT"{11 DOWN}{15 RIGHT}GET READY" :rem 95
55408 FORX=1T014: POKESO+1,NN(X): POKESO+4, 17:FORD=1T
0120 :NEXT:NEXT :rem 84
5545 POKESO+4,16 :rem 150
5558 RETURN :rem 175
65008 REM REDEFINING SCREEN :rem 74
6518 POKESO+4,16 :rem 143
6575 GOSUB 6604 :rem 35
6580 RETURN :rem 179
6600 REM PRINT SCORE :rem 185
6605 PRINT" {YEL} {HOME}SCORE ";SC :rem 160
6606 PRINT" {HOME}{3@ RIGHT}ROOM ";LO :rem 47
6610 PRINT"MUSHROOMS ";HI;"{17 SPACES}LIVES ";LI
:rem 9
6628 RETURN :rem 174
7800 REM CLEAN UP THE CENTIPEDE :rem 33
7882 SP=SP-5 :rem 174
7804 GOSUB 668@:HI=5 :rem 84
7865 L=LEN(XAS ) :rem 66
7010 FORI=1TOL-1 :rem 179
7820 POKESO+1,1:POKESO+4, 17:FORQQ=1TO18:NEXT
:rem 23
71908 PO=1024+ASC(XAS$)+4@*ASC (YAS) :LL=LEN(XAS)-1:XA
$=RIGHTS (XAS$,LL) :rem 37
TABS YAS$=RIGHTS$(YAS$,LL)
: POKEPO, 32: POKEPO+SO, 1
:rem 17
164
Creature Features 4.

7280 NEXT:POKESO+4,16 :rem 5


7218 RETURN :rem 170
7588 REM OOPS :rem 241
7510 PRINT"{CLR}{PUR}" :rem 205
7515 SP=SP-5 srem 183
7528 PRINT"{12 DOWN}{18 RIGHT}00PS" :rem 182
752¥Y LI=LI-] :rem 148
7525 FORDE=1T020:NEXT :rem 47
7530 FORDE=1T0O1@: POKESO+1,DE* 28: POKESO+4, 17: FORQQ=
1T019 :NEXT:NEXT: POKESO+4,16 :rem 123
7558 FORDE=1T029 :NEXT zrem 45
7568 IFLI<1THEN7799 :rem 96
7599 PRINT"{CLR}":RETURN :rem 92
7788 REM THE GAMES OVER :rem 608
7705 POKESO+4,16 srem 152
7718 PRINT"{CLR}":POKE53270, PEEK(53270)AND15
srem 121
7715 IF SC>HSTHENHS=SC:GOSUB9008:PRINT"{CLR}K89"
srem 43
7718 PRINT"{6 DOWN}{18 RIGHT }NERM" :rem 74
7728 PRINT"{YEL}{4 DOWN}YOUR SCORE ";SC :rem 31
7738 PRINT"k63{4 DOWN}HIGH SCORE ";HS :rem 241
7735 GOSUB 78808 :rem 37
7736 PRINT"{WHT}{2 DOWN}PRESS THE TRIGGER TO PLAY
{SPACE}AGAIN, Q=QUIT" :rem 135
7748 FORX=1T0O15:POKESO+1,PN(X) :POKESO+4,17:FORD=1T
0108 :NEXT:NEXT :rem 89
7745 POKESO+4,16 srem 154
7788 S=PEEK(56320)AND16: IFS=@THEN5@11 :rem 149
7783 IFPEEK(197)=62THENPOKE198,8:SYS2048 :rem 135
7785 GOTO77892 :rem 234
7809 REM RANK THE GAMER srem 44
7810 PRINT"{CYN}{2 DOWN}{7 SPACES}YOUR NEW RANK IS
Ns :rem 158
7820 IFLO=1THENPRINT"ZERO" :rem 169
7830 IFLO=2THENPRINT "ROOKIE" :rem 52
7848 IFLO=3THENPRINT "NOVICE" :rem 49
7850 IFLO=4THENPRINT"AVERAGE" :rem 106
7860 IFLO=5THENPRINT "MASTER" :rem 61
7878 IFLO=6THENPRINT"GRAND MASTER" :rem 171
7880 IFLO=7THENPRINT "WIZARD" :rem 78
7898 IFLO=8THENPRINT"GRAND WIZARD" :rem 180
7998 IFLO=9THENPRINT"SUPER STAR" :rem 57
7910 IFLO>9THENPRINT"HALL OF FAME" zrem 65
7920 RETURN :rem 178
9888 REM NEW HIGH SCORE :rem 51
9902 PRINT"{CLR}" :rem 47
9983 PRINT"{CYN}{8 DOWN}{16 RIGHT}NEW HIGH"
:rem 158

165
4 Creature Features

9884 PRINT"{4 DOWN}{17 RIGHT }SCORE" :rem 75


9885 FORY=1T0O3 :rem 82
9810 FORN=1TO5 :rem 69
9828 FORD=1T05 +1,
28: POKESO+4
: POKESO D*
,17 :NEXT
:rem 22
9838 POKESO+1 , N* 30: POKESO+4,17 :rem 254
9858 NEXT :rem 13
9868 NEXT :rem 14
9965 FORD=1TO3@ :NEXT :rem 236
9878 RETURN :rem 176
9108 REM EXTRA LIFE :rem 82
9119 PRINT" {CLR}" :rem 47
9115 PRINT"{CYN}{12 DOWN}{15 RIGHT}BONUS LIFE"
:rem 102
9120 FORJ=188TO282 :rem @
91408 POKESO+1,J:POKESO+4,17 :rem 111
9158 NEXT :rem 14
9160 POKESO+4,16 :rem 147
9178 EX=EX+3 :rem 166
9188 LI=LI+1 :rem 149
9198 RETURN :rem 179
19000 DIM PN(15),NN(18):P{CLR}RINT"
£83" :rem 219
18885 S0=54272: POKESO+24, 15:POKES 17: O+5,
POKESO+6, 2
41:POKESO,19@ :rem 253
18010 PRINT"{6 DOWN}{15 RIGHT}WELCOME TO" :rem 139
108020 PRINT"{CYN}{4 DOWN}{14 RIGHT}WORM OF BEMER"
:rem 1390
10825 PRINT"k139{3 DOWN}{13 RIGHT}USE JOYSTICK #2"
:rem 168
18830 PRINT"k69{6 DOWN}{1l RIGHT}HIT TRIGGER TO ST
ART" :rem 45
18045 S=PEEK(56320)AND16:IFS=8THENRETURN :rem 219
10869 GOTO1@@45 :rem 42
111488 PRI NT"
{CLR} {CYN}{12 DOWN}{9 RIGHT}REDEFINING
{2 SPACES }CHARACTERS" :rem 132
11109 POKE56334, PEEK (56334)AND254:P OKE1,
PEEK(1)A ND
AoW :rem 29
11118 FORI=12288T012288+64PEEK( *8:PO KEL,
1+4896@) :N
EXTI :rem 146
11126 POKE1, PEEK(1)OR4:POKE PEEK( 56334) ,
56334 ORI
:rem 228
11180 FORI=9TO39 : READA: POKE12288+1+32*8,A:NEXT
:rem 248
ELS5 FORI=@TO7 : READA: POKE12288+1+42*8,A:NEXT
:rem 281
11190 POKE5 3272, (PEEK(53272)AND24@)+12 :rem 27
11200 FORI=1T0O18:READNN(I):NEXT :rem 163
11210 FORI=1T015:READPN(I) :NEXT :rem 163
11242 DATA 0,8,8,0,0,8,0,8 :rem 198

166
Creature Features 4

11258 DATA @,28,85,85,255,49,40,90 z:rem 71


11260 DATA 85,85,85,85,85,85,85,85 :rem 176
Le2er DATA 170,199,198,198,198,198,170,170 :rem 19
11262 DATA 29929595255, 255, 2557255, 200,299 Prem tz
11263 DATA eee. OD seb Dy. 2D pepe ne s:rem 223
11278 RETURN s:rem 219
12900 DATA 33,44,9,44,509,0,50,56,67,56,67,56,44,@,
33,44,9,44 :rem 114
12108 DATA 44,0,8,33,31,33,37,37,33,9,9,9,42,42,44
srem 198

167
a> &e@

de Gohgr
Sagal
cre) Soars
ae 4 a47)
Brunhilde Loves
Bruno
Philip I. Nelson

In this game of love vs. evil, Brunhilde must traverse dangerous ter-
ritory filled with goblins to free her friend Bruno from prison. But
Bruno is entranced and must first be caught before the lovers can es-
cape. There’s also a detailed explanation of the game program and
many valuable techniques you can use in your own creations. Joystick
required.

“Brunhilde Loves Bruno” shows how some of the Commodore


64’s more advanced graphics features can be used in a game.
You'll find custom characters and all eight sprites here, as well
as three-voice sound effects and music. And there’s a handy
machine language subroutine in the game that you can use in
any program to quickly copy the 64’s character set from ROM
(Read Only Memory) into RAM (Random Access Memory).
The game is almost all in BASIC, so it’s not difficult to
type in. Make sure you read Appendix C and use ‘The Auto-
matic Proofreader’ as you type in Brunhilde Loves Bruno. You
can be assured that the program will work correctly the first
time.
Plug a joystick in port 2. Load and run the game and then
select the skill level you'd like to play on. Level 1 is the easi-
est, level 4 the hardest. Your character, Brunhilde, will soon
appear on the left side of the screen, near the bottom. You
have five chances to sneak her through goblin territory to Val-
halla Prison, where her friend, Bruno, has been trapped. Un-
fortunately, poor Bruno’s in a trance, and can’t recognize
Brunhilde, so you have to catch him before the pair can travel
back home, where a red heart beats faithfully. If your
Brunhilde runs out of time (maximum of 200 seconds) or
bumps into a goblin, Bruno goes back to prison and she has to
start all over again. If the goblins prevail, they dance and sing
a victory song. However, if you bring Bruno safely home, the
goblins are discombobulated and Brunhilde sings her Valkyrie
song of triumph.

171
bay Arcade Games

Setting Things Up
Brunhilde Loves Bruno takes a lot of setting up, so the pro-
gram lets you read instructions while the computer goes
through its preliminaries. In lines 1390-1650, variables are
initialized, sound registers are prepared, and the goblins get
ready to move. Then instructions are displayed (by a GOSUB
1660), Brunhilde’s theme song plays, and the custom charac-
ters are programmed (through a GOSUB 1910).
Five custom characters are used. Three create Brunhilde
and Bruno, the fourth draws a miniature heart, and the fifth
makes up the playfield border. In line 1910, locations 56334
and 1 are POKEd to turn off the keyboard, and to make the
computer “look” at its permanent character set located in
ROM. Once that’s done, the SYS 49152 in line 1920 calls the
machine language subroutine, which does the work of copying
the standard character set from ROM into RAM where
changes can be made. This copying takes nearly 30 seconds, if
done in BASIC, so time is saved by using this machine lan-
guage subroutine. (An assembly language listing appears at
the end of this article, as Program 2, if you’re interested in us-
ing the routine elsewhere.) Once the character set has been
moved, location 53272 is POKEd to fool the computer into
getting its character information from the new set in RAM.
Five characters, with screen POKE codes from 90 to 94, are
then changed by POKEing new DATA values into the correct
RAM locations—and magically, the valiant Brunhilde appears
in the instruction display.
Before the program leaves the instruction display, it pre-
pares the color memory background for the playfield, so that
the characters look yellow in the prison area, are green at
home, and change colors in goblin territory (lines 2020-2040).
Using a PRINT’’{CLR}” at this point to erase the instructions
would erase these colors, too, so when the player is finished
reading, the entire screen is POKEd with a value of 32 (for
blank spaces). The player picks a skill level, the playfield is
drawn, and Brunhilde’s off and running.

Bump and Run


Once play begins, the program simply cycles through line 120
over and over, calling subroutines to move Brunhilde (GOSUB
540), Bruno (GOSUB 610), and one goblin sprite (ON FNK(0)
GOSUB 140, 190, and so on), each time through the loop. The
172
Arcade Games 5
Deu Re eer ate ee erro mane ane cre perpen

user-defined function FNK randomly picks which goblin sprite


to move. If you’d rather move them in left-to-right order, sub-
stitute CF for FNK(0) in line 125.
Collision detection appears in the routines that move
Brunhilde and the goblins. Register 53265 (V+31) can be used
to check whether a visible (nonzero) portion of any sprite has
bumped into the visible part of a character.
To check sprite 1 only, you could use the statement IF
PEEK(V +31)AND1=1 THEN (desired action). By changing the
value 1 to 2, 4, 8, and so on, you could check all eight sprites
in order whenever you wanted. In this game, you can get by
with the simpler statement IF PEEK(V=31)<>0 THEN (action).
The only characters allowed into goblin territory are Brunhilde
and Bruno, and you want to shift into the return home routine
(GOSUB 740) whenever the lovers touch any of the eight
sprites. Checking for any nonzero value in this collision reg-
ister saves time.
Once a collision is detected, the character is immediately
erased by POKEing its screen memory location with 32 (blank)
to avoid an unwanted second collision. Then the collision reg-
ister is cleared with POKE V+31,0 (lines 890 and 900).
Bruno’s movement routine (GOSUB 610) simply sends
him wandering through the prison. As long as Brunhilde
hasn’t caught him by moving precisely into his path, Bruno’s
horizontal (X) and vertical (Y) movement is limited, so he can’t
escape even if he accidentally hits the prison door. Line 630
checks whether Bruno’s screen memory location (BU) is identi-
cal with Brunhilde’s (BR). When that happens, the flag CT is
set, and from that point onward, Bruno’s location will copy
Brunhilde’s, to make him follow her.

Goblin Animation
At the start, two different sets of sprite shape DATA were
stored in locations beginning at 832 and 896. By changing a
sprite’s pointer value, you can make it call its shape infor-
mation from either location, and thus switch at will from one
pattern to the other. In the movement routines for sprites 2
through 7, the pointer is switched to 14 when entering the
routine, and back to 13 when exiting, so the goblin sprites take
a different shape while they’re moving. Sprites 1 and 8 look
more frantic because they’re switching shape pointers every
time one cycle of the innermost movement loop is executed.
173
5 Arcade Games
ISLA STN TA aTEE EA OT

To make the sprites dance, all eight shape pointers are


simply switched back and forth in lines 990-1020. By playing
with these pointers, a different effect is achieved in the “dis-
combobulation” routine that is used when you bring Bruno
safely home. Lines 1280-1310 make the sprites appear to dis-
integrate; the program runs through K loop values from 6 to
14, flipping all the sprite pointers through nine successive
memory locations. Only two of those values point sprites to an
area of memory containing meaningful shape data, however—
when pointed at other areas, the sprites are defined by gar-
bage data contained there, which makes them appear to dis-
solve and rematerialize. For serious animation, of course, you
can use this pointer-flipping technique to move sprites
through a succession of different shapes, to make birds fly,
horses run, and so on.
Besides changing shape, sprites can also be expanded
vertically, horizontally, or in both directions at once. Brunhilde
Loves Bruno uses the sprite expansion registers in two
places—when Brunhilde bumps up against a goblin (GOSUB
740) and when the goblins do their victory song and dance
(GOSUB 970). When a goblin touches Brunhilde, a sequence
executes that successively POKEs location 53271 (V+23) with
values of 1, 2, 4, 8, and so on. This expands each sprite verti-
cally in order, making them seem to kick irritably (lines 800-
850). When the game’s lost, all goblins are expanded both
vertically and horizontally, by POKEing a value of 255 into
registers 53271 and 53277 (line 1030); this makes the shapes
double-sized. To shrink them back to normal size, of course,
both expansion registers are just POKEd with 0.
Brunhilde and Bruno—Alive at Last
Just as you can animate sprites by flipping back and forth be-
tween two alternate sets of shape information, so you can ani-
mate characters by switching between two alternate custom
characters. Brunhilde does a little flip-flop every time her rou-
tine is executed, since the figure’s screen memory location is
first POKEd with 93, then with 92. Custom character 92 is the
upright Brunhilde, and character 93 is the same shape, upside
down. A third shape (character 91—an upright Brunhilde
shape, minus legs) is used for Bruno’s scrunched-down shape;
he seems to hop up when character 91 (the same as
Brunhilde) is POKEd into the proper screen location. To make

174
Arcade Games 5
RUNES 3 cs NR MENS Sa a ee

the heart appear to beat, the program switches from the stan-
dard heart character (83) to a custom-designed miniature heart
character (90).
Given the Commodore 64’s generous memory, these tech-
niques can be used to create some mind-boggling graphic ef-
fects. Characters are smaller than sprites, so you must use
simpler, bulky shapes, but in theory there’s nothing to prevent
you from programming dozens or even hundreds of charac-
ters. Likewise, the number of different sprite shapes you can
use is limited only by the amount of available RAM. Remem-
ber, however, that only eight sprite shapes can appear on the
screen at the same time.
Moving Arrays
Three arrays are used in this game to simplify character move-
ment, color effects, and scorekeeping. The M array stores
movement values for Brunhilde. In her routine, a value pulled
from the joystick (JK) is used to pick a certain value from the
movement array and add it to Brunhilde’s present location in
screen memory: BR=BR+M(kK). Adding 40 moves her down
one space, adding 1 moves her right one space, subtracting 40
moves her up, and subtracting 1 moves her left. The CH$ ar-
ray stores strings that are PRINTed to the screen to show how
many chances Brunhilde has left. The Z array stores values for
colors that contrast well against the black background. When
goblin territory is POKEd with colors, the statement Z(FNV(0))
lets the computer pick values randomly from this array. Like-
wise, each time a goblin’s movement routine is entered, this
same statement is used to switch the figure’s color.

Ride of the Valkyrie


There’s lots of sound in this game, using all three of the 64’s
voices and waveforms. The simplest, Brunhilde’s beeping as
she moves, is created by turning voice 1 (W1) on, and
POKEing a value into its high frequency register. By tying the
frequency value to her screen memory location (line 550), her
beeps change pitch, sounding higher as she moves toward the
top of the screen, and lower as she heads for the bottom of the
playing field. G}
Each sprite has its own unique sound, made by mixing
sound statements into each movement routine. To keep from
slowing the movement down, these are one-voice effects. But

175
5 Arcade Games

by varying the waveforms, or adding ring modulation (such as


with sprite eight), you can still get a variety of sounds.
To play Brunhilde’s theme song at the beginning or the
goblins’ tune at the end, note values are READ from the
appropriate DATA statements and POKEd into the correct fre-
quency registers. This program has a lot of DATA state-
ments—for sprites, music, machine language, and pro-
grammed characters. Whenever you tell your computer to
READ DATA, it starts at the lowest BASIC line number and
moves on up, reading every item in order. Trying to READ
after the DATA pointer hits the end of DATA gives you an
OUT OF DATA error. That’s no problem if you’re just
POKEing sprite DATA into memory—once you've used that
DATA, there’s no need to look at it again. But what if you
want to play the same song more than once and your music
DATA is stuck halfway down in your BASIC program, be-
tween sprite and machine language DATA?
One solution is to use a RESTORE statement to put your
DATA pointer back at line 0, and then use a dummy loop to
READ the correct number of DATA items (and do nothing
with them), leaving the pointer at the right spot. In line 2650,
the dummy loop READs through the 32 note values for the
goblins’ song, 63 items for each of the two sprite shapes, and
8 items for each of the programmed character shapes. In line
3020 all of the sprite, music, and character DATA are READ to
move the pointer to line 2970, where the machine language
DATA begin. You're really just using the DATA statements like
a series of look-up tables located in the BASIC program itself.
To find a certain piece of information, all you need do is send
the pointer to the right place to pull the information from the
correct table.

Prisoners of Love
Three different techniques are used to confine the various ani-
mated figures to the proper areas. It’s always important to
control such movement, to keep action on the screen, and to
prevent characters from running past screen memory into the
area where the BASIC program is stored. Brunhilde’s move-
ment is limited by the playfield boundaries themselves. Before
moving her screen memory location, her routine PEEKs ahead
to see whether the new location is already occupied by charac-
ter 94 (remember, that’s the custom character for the playfield
176
Arcade Games Le)
GEA, Seer Rene aE re ee ee

walls). If so, the subroutine RETURNs without moving her fig-


ure. Trying to move her left from her home area actually
makes her bump up against the prison wall on the far right of
the screen.
Bruno’s routine also PEEKs ahead to check for character
94, which makes him bounce off obstacles inside his prison.
But he’s also limited by minimum and maximum X and Y val-
ues, which are defined in relation to his starting spot (upper
left) in the prison. If he moves too far in any of the four pos-
sible directions, his X or Y value will be reversed in sign, mak-
ing him rebound. Once Brunhilde captures him, he copies her
location and RETURNs from his movement subroutine before
getting into the X and Y scheme. This lets him crash out of
jail.
Sprites, on the other hand, move independently of screen
memory, on a totally separate display that’s bigger than the
visible screen. The visible sprite grid is about 180 X 266, com-
pared to the 40 X 20 screen memory grid, so moving a sprite
one space creates a barely perceptible movement. In this game
the goblins have to be kept onscreen, moved in proportion to
the characters, and prevented from bumping into playfield
walls, which would set off the collision register.
To simplify things, each goblin sprite is confined to its
own vertical pathway. This is done in lines 1630-1640 where
each sprite’s horizontal register is POKEd with a fixed value.
Statements to check whether each sprite has moved too far up
or down (vertical positions 75 and 220 on the sprite grid
respectively) are included. Whenever those limits are crossed,
the goblin wraps around to the opposite side. Finally, within
these limitations, each goblin can be moved by changing the
value of the variable assigned to its vertical position (S1 for
sprite 1, S2 for sprite 2, and so on).
The amount of distance each sprite moves is determined
by two things. First, the user-defined function FNG is em-
ployed to pick how many five-space leaps the sprite makes for
every pass of its routine. Second, the maximum number of
leaps FNG can choose is limited by PK, the variable represent-
ing skill level. At skill level 1, the maximum number of spaces
a sprite can cover is 50, while at skill level 4, the maximum is
125. That’s almost enough to wrap all the way around goblin
territory to sneak up on Brunhilde from behind.

177
Es, Arcade Games
LTT
SRT IE SS SAP EY

Cautions
When using sprite-to-character collision detection, you must
take care with all PRINTs and POKEs, so as not to leave un-
wanted character data in screen memory where it would trig-
ger an unwanted collision. And you must pay careful attention
to the status of your collision register. Once a collision has
been flagged, the value is stored in that register until you
check it with another PEEK or clear it by POKEing the register
with 0.
One final word of caution: As in any other BASIC pro-
gram that uses a machine language subroutine, be sure to save
the program before you run it, in case you made a typing er-
ror. Otherwise, your 64 could lock up, forcing you to turn it
off, then on again, to regain control. That will erase any pro-
gram in memory, including an unsaved version of Brunhilde
Loves Bruno.

Program Lines
Here’s a short summary of what the various sections and
routines in Brunhilde Loves Bruno do:
Line Function
100-110 Protect BASIC program space and call prepara-
tory GOSUBs
120-125 Call subroutines for all game figures
140-170 Movement and sound for sprite 1
190-220 Movement and sound for sprite 2
240-270 Movement and sound for sprite 3
290-320 Movement and sound for sprite 4
340-370 Movement and sound for sprite 5
390-420 Movement and sound for sprite 6
440-470 Movement and sound for sprite 7
490-520 Movement and sound for sprite 8
540-590 Movement for Brunhilde character
610-720 Movement for Bruno character
740-950 Return home routine
970-1190 Lost game routine
1210-1370 Won game routine
1390-1650 Initialize variables; set up sound and sprite
register
1670-1890 Display instructions for player
1910-2260 Program characters, select skill level, color
playfield
2280-2380 Draw playfield
2420-2430 Sprite victory song DATA
178
Arcade Games

Line Function
2470-2520 Sprite shape DATA
2550 Small heart character DATA
2570 Small Bruno character DATA.
2590 Brunhilde character DATA
2610 Upside-down Brunhilde character DATA
2630 Playfield wall character DATA
2650-2710 Valkyrie song routine
2730-2760 Valkyrie song DATA
2780-2830 Ascending sound routine
2850-2890 Mighty Mouse song routine |
2910-2920 Mighty Mouse song DATA
2930-2950 Descending sound routine
2970-3040 POKE machine language subroutine into mem-
ory beginning at location 49152
NYProgram 1. Brunhilde Loves Bruno‘
. For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
186 PRINT" {CLR}":POKE52, 100:POKE56,199:CLR:GOSUB29
62: GOSUB138@: GOSUB1660 :rem 198
119 GOSUB264@ :GOSUB1919 :GOSUB2279 :rem 232
128 GOSUB54@ : GOSUB61@ : GOSUB5 48 : GOSUB619 :rem 161
i25 ONFNK (@)GOSUB140,198,
248,298, 348,390,440,498:G
OTO 129 :rem 23
130 REM***** MOVE SPRITE ONE *******kkkKE srem 59
146 POKEW1, 17: POKEV+39,Z(FNV(@) ) :rem 120
158 FORJ=1TOFNG(@)
: POKE2948,14:S1=S1-5:IFS1<75THEN
S$1=220 s:rem 78
160 POKE204@,13:IFPEEK(V+31) <>@THENPOKEBR, 32 :CH=CH
-1:GOSUB749 : RETURN :rem 199
170 POKEV+1,S1:POKEH1,S1/6:NEXT: CF=2:RETURN
s:rem 229
188 REM**** MOVE SPRITE TWO *¥**##*eRKKKK s:rem 37
199 POKE2@41,14:POKEW1, 33 s:rem 164
288 POKEV+42,Z(FNV(@) ) : FORJ=1TOFNG(@) :S2=S2+5:IFS2
>228THENS2=75 :rem 30
210 IFPEEK(V+31) <>@THENPOKEBR, 32 : CH=CH~1 : GOSUB74@:
RETURN :rem 4
220 POKEV+3,S2:POKEH1,S2/17+FNB(@): :NEXT:CF=3: POKE
2041,13:RETURN - :rem 148
230 REM**** MOVE SPRITE THREE ********%*% srem 75
248 POKE2042,14:POKEW1,129 srem 215
258 POKEV+41,Z(FNV(@) ) s:FORJ=1TOFNG(@) :S3=S3-5:IFS3
<75THENS 3=229 :rem 40
268 IF PEEK (V+31) <>@THENPOKEBR, 32 : CH=CH-1 : GOSUB74@:
RETURN :rem 9
276 POKEV+5, : POKE2042,13:
$3: POKEH1 ,S3/12:NEXT:CF=4
RETURN s:rem 222

179
5 Arcade Games
Ee TS LE ELT AT

288 REM**** MOVE SPRITE FOUR *******#*** :rem 62


298 POKE2043,14:POKEW1,17 :rem 169
388 POKEV+42,Z(FNV(@)) : FORJ=1TOFNG(@) :S4=S4+5:IFS4
>220THENS4=75 :rem 41
316 IFPEEK(V+31) <>@THENPOKEBR, 32 : CH=CH-1 : GOSUB74@:
RETURN :rem 5
328 : POKE2043,13:R
POKEV+7,S4:POKEH1,S4/5:NEXT:CF=5
ETURN :rem 178
330 REM**** MOVE SPRITE FIVE *****##2#%2%% z:rem 40
340 POKE2044,14:POKEW1, 33 :rem 164
350 POKEV+43,Z(FNV(@)) :FORJ=1TOFNG(@):S5=S5-5:I1FS5
<75THENS5=220 :rem 51
360 IF PEEK(V+31) <>@THENPOKEBR, 32 : CH=CH~-1 : GOSUB746:
RETURN :rem 10
378 POKEV+9,S5:POKEH1,S5/18:NEXT:CF=6:
POKE2044,13:
RETURN :rem 233
380 REM**** MOVE SPRITE{2 SPACES}SIX *********xe
:rem 247
398 POKE2@45,14:POKEW1,129 s:rem 224
490 POKEV+44,Z(FNV(@) ):FORJ=1TOFNG(@) :S6=S6+5:IFS6
>220THENS6=75 :rem 52
410 IFPEEK(V+31)<>@THENPOKEBR, 32:CH=CH-1 :GOSUB746:
RETURN :rem 6
420 POKEV+11,S6:POKEH1,S6/10:NEXT:CF=7 : POKE2045,13
: RETURN :rem 18
430 REM**** MOVE SPRITE SEVEN ******#e%% :rem 86
440 POKE2046,14:POKEV+45,Z(FNV(@)) :rem 185
458 FORJ=1TOFNG(@) :POKEW1,17:S7=S7-5:1FS7<75THENS7
=220 :rem 46
460 IFPEEK(V+31) <>@THENPOKEBR, 32:CH=CH-1 :GOSUB74@:
RETURN :rem 11
470 POKEV+13,S7:POKEH1,S7/5:POKEW1,129:NEXT:CF=8:P
OKE2946,13:RETURN :rem 170
480 REM**** MOVE SPRITE EIGHT *****eekex :rem 75
498 POKEW1, 21:POKEV+46,2Z(FNV(@)
) : POKEH3, FNB(@)+5
:rem 64
508 FORJ=1TOFNG(@) : POKE2@47,14:S8=S8+5 : IFS8>220THE
NS8=75 :rem 112
518 POKE2947,13: IFPEEK(V+31)<>@THENPOKEBR, 32: CH=CH
-1:GOSUB74@ : RETURN :rem 205
520 POKEV+15,S8: POKEH1,S8/18:NEXT:CF=1 : POKE2@47,13
: RETURN :rem 23
538 REM******* MOVE BRUNHILDE ***** ee e#x :rem 26
548 POKE1964, 90 :POKEBR, 93: JK=PEEK (56328) :JK=15-(JK
AND15) : POKEW1,17 :rem 134
55@ POKEH1, INT(120- ) :I1FPZ<SK
(BR/ ANDBU=114
2@) 4ANDBR
=1144THEN1 280 :rem 254
5698 IFPEEK(BR+M(JK) )=94THEN59@ :rem 9

180
Arcade Games 5

IFPEEK(V+31)<>@THE
32: CH=CH-1
NPOKEB :GOSUB74@:
R,
GOTO59@ s:rem 4
POKEBR, 32: BR=BR+M(JK) :rem 238
POKEBR, 92: POKEW1,16:POKE19064,83:RETURN :rem 97
REM* ****** MOVE BRUNO KaKKKKKkKKKKKEK :rem iP we

POKEBU,91:PRINT"{HOME}{2 RIGHT}"PZ:PZ=PZ+A
srem 44
IFPZ=SKTHENPOKEBR, 32 : CH=CH-1 : GOSUB74@:GOTO12@
s:rem 121
BN=@ : IFCT=ATHENPOKEBU, 32: BU=BR: POKEBU, 92: RETUR
N s:rem 76
IF PEEK (BU )=PEEK (BR) THENBU=BR: POKEBU, 91:POKEBU,
81:POKEBU, 91:CT=A: RETURN s:rem 61
BN=BN+A: POKEBU, 32: BU=1177+X+40*Y s:rem 183
POKEBU , 92: IFBN=2THENRETURN :rem 207
X=X+DX : IFX=8ORX=5 THENDX=-DX :rem 26
I FY <=8 THENY=A: DY=-DY s:rem 18
IFY=> 20THENY=19 : DY=—DY s:rem 112
Y=Y+DY : IFDX=8 THENDX=A :rem 113
BP=1177+X+49*Y : IFPEEK(BP )=32THEN640 :rem 7
IFPEEK (BP )=94THENDX=+DX : DY=-DY:GOTO66@:rem 149
RETURN s:rem 121
REM***** BUMPED A SPRITE ******#*e#*eke srem 243
POKEBU , 32: CT=@: Y=1 :X=1 : BR=1864: BU=1177 : JK=@
srem 41]
POKEW1, 16: POKEW1, 21: POKEH1, 2*FNB(0)+5:PZ=0
srem 216
POKEW2, 21: POKEH2,FNB(@)+5:POKEL2,198 :rem 86
POKEW3,17 srem 235
FORG=1TO3 : POKEH3, 14: POKE53280,Z(FNV(@)):rem 51
K=1:POKEW1,21 srem 217
FORJ=1TO8 : POKEH1 , 4*J+20*G : POKEH3 , 49-(4*J) : POKE
2039+7,14 s:rem 157
POKEV+23,K :rem 37
K=K* 2 :rem 201
FORI=1T039 :NEXT :rem 184
POKEV+23 ,@ srem 13
POKE2039+J,13:NEXTJ :rem 98
FORJ=1T05 : PRINT" {HOME }""CHR$ (142) :FORK=1T020:NE
XT srem 116
PRINT" {HOME }"CHR$ (14) :FORK=1T020 sNEXTK:NEXTJ
srem 160
POKEW1, 16: POKEW2, 16:NEXTG :rem 47
POKE5 3280 ,@:POKEV+29,@:POKEW3,16:POKEH3,@:POKE
W2,16:POKEV+31,0 srem 212
POKEH1 , 1: POKEH2,1:POKEV+31,@ :rem 136
FORJ=1T01200 :NEXT Sen! 4
PRINT" £63{HOME}{7 SPACES}{8 RIGHT }CHANCES:
{ RIGHT} {YEL}"; CH$ (CH) : POKEBU, 92 :rem 71

181
5 Arcade Games
QO NOT TRY OeEE

938 FORJ=1TO500 :NEXT :rem 236


948 IFCH<=@THENGOSUB97 9@
: RETURN :rem 281
958 RETURN :rem 126
960 REM****{2 SPACES}LOSING MESSAGE KKKEKKKKEEE
:rem 202
978 POKE53280,5:PRINT"{HOME}{YEL}{5 RIGHT}{RVS}
{7 SPACES}TOO SLOW 11{6 SPACES}
{OFF} {WHT}":PZ=
4] :rem 242
988 POKEV+23,8:POKEV+29,92 :rem 195
999 FORJ=1T016: POKEW1,17:READQ1
: READQ2: IFQ1=@THENR
ESTORE : GOTO1939 :rem 195
1888 POKEH1,Q1:POKEH2,Q2 :rem 169
1910 FORB=@TO7 :POKE2940+B, 14:NEXTB :rem 26
1926 FORB=0TO7 : POKE2040+B, 13:NEXTB: POKEW1, 16:NEXTJ
:rem 97
1930 PRINT" {HOME}£33{5 RIGHT}{RVS} BRUNO IS OUR PR
ISONER | {OFF} {WHT}": POKEV+23, 255: POKEV+29, 25
5 :rem 87
1948 POKE53280,3:POKEH3,8:POKEL3,198 :rem 74
1958 FORJ=1TO16:READQ1 : READQ2 : IFQ1=6THENRESTORE: GO
TO1998 :rem 194
1868 POKEW1,17:POKEW2,17:POKEW3,21:POKEH1,Q1:POKEL
1,Q2:POKEH2,Q1/2:POKEL2,Q2/2 :rem 40
18978 FORB=0TO7 : POKEH3,B*J+6 : POKE2046+B, 14:NEXTB:FO
RB=7TOO@STEP-1 :rem 139
1988 POKEH3,B*J+3 :POKE2940+B, 13 :NEXTB:NEXTJ : POKEH1
,@:POKEH2,@:POKEH3,@ :rem 26
1998 POKEW1,@:POKEW2,@:POKEW3,@:POKE53289,8:POKE53
265,8:FORJ=1TO1598 :NEXT :rem 198
1190 POKE53265,27:PRINT" {HOME} {WHT}{RVS}{RIGHT} PR
ESS 'Y' TO PLAY AGAIN, 'N' TO QUIT " :rem 248
1118 POKEW1,17:POKEW2,17:POKEW3,17:K=FNB(@) :POKEH1
,K+8 : POKEH2 , K+13 : POKEH3, K+3 :rem 146
1128 GETAS :FORK=@0TO7 : POKE2040+K, 14:NEXT :rem 187
1138 IFAS=""THEN 1135 :rem 51
1132 GOTO 1140 :rem 198
1135 FORK=0TO7 : POKE2040+K, 13 :NEXT: POKEW1, 16: POKEW3
,16:POKEW2,16:GOTO11194 :rem 182
1149 IFA$<>"N"ANDAS<>"Y"THENFORK=6TO7 : POKE2049+K, 1
3 :NEXT:GOTO1119 :rem 161
1158 IFAS="N"THEN 1155 :rem 133
1152 GOTO 1168 :rem 202
1155 PRINT" {CLR}":FORJ=53248T053264:POKEJ,@:NEXT:P
OKEW1, 16 : POKEW3, 16: POKEW2,16:END :rem 173
1160 IFA$="Y"THENPOKEV+23,@:POKEV+29,@:CH=5 : POKEW1
,16:POKEW2,16:POKEW3,16 :rem 173
1178 FORJ=1024T01063: POKEJ,32:NEXT :rem 49
1188 BR=1864 :BU=1177 :BP=1177:CT=@ :PZ=@ : POKE1144, 32
: GOSUB218@ : RETURN :rem 23

182
Arcade Games

1198 GOTO11198 srem 199


1288 REM**** WINNING ROUTINE ****#keeee :rem 51
1218 POKE1964,83:POKE1144,92 :rem 31
1228 POKEW1, 17: POKEW2, 17: POKEW3, 17: POKEH1, 34: POKEL
1,75:POKEH2,43:POKEL2,52 :rem @
1230 POKEH3 , 51: POKEL3, 97: FORJ=1T0O12@:NEXTJ:POKEHI1,
68 :POKEL1,149:POKEH2, 86 :rem 1
12408 POKEL2,195:FORJ=1T0O75@:NEXT :rem 199
1258 POKEW1 , 16 :POKEW2,16:POKEW3,16 :rem 29
1260 FORJ=1TO 17: POKEW2, 17:
: POKEW1, 15ST EP3 POKEW3,12
9 srem 166
1278 POKE532898,2Z(FNV(@) ) :rem 61
1289 FORK=6TO14:POKEW2, 21 :rem 249
12908 POKEH1 , K* J : POKEH2, (K*J)/3:POKEH3,55-(K*J)/4:P
OKEW2,17 srem 128
13988 FORI=2039T02847 : POKEI ,K:NEXTI :rem 99
1318 POKEW3,17:NEXTK :rem 214
1320 POKEW1,16:POKEW2,16:POKEW3,16:NEXTJ :srem 222
13390 PRINT" {HOME}{YEL}{7 RIGHT}{RVS} LOVE TRIUMPHS
1 {OFF} " :rem 139
1348 FORJ=2939T02047 : POKEJ ,13:NEXT srem 48
1358 GOSUB264@ srem 21
1360 GOSUB199@8 :GOTO129 :rem 26
1370 REM s:rem 175
1380 REM*** INITIALIZATION *##**¥X*kRRKKEE srem 78
1390 $1=220:S2=75:S3=220:S4=75:S5=220:S6=75:S7=229
:S8=75 s:rem 135
1400 X=1 : Y=1 : DX=1: DY=1 : BU=1177:BP=1177:CT=0:PZ=0:S
K=2@1 :A=1:CH=5:CF=1:BR=1864 srem 58
1410 V=53248 :W1=54276 :W2=54283 :W3=54299:H1=54273:L
1=54272 :H2=54289 :L2=54279 s:rem 82
1428 H3=54287 :L3=54286 : FORJ=54272T054299: POKEJ ,9:N
EXT : :rem 198
1430 POKE54296,15:POKE54277,15:POKE54291,15:POKE54
284,15 :rem 153
1440 CH$(@)=" ": DEFFNK(X)=INT(RND(1)*8)+1 :rem 168
1458 CH$(1)="E—-3 ":CH$(2)="K2 -9 ":CH$(3)="E3 -] "
:CH$(4)="K4 -} ":CH$(5)="E5 -Jj" :rem 26
1469 DIMM(11):M(@)=@:M(1)=-40:M(2)=40:M(3)=0:M(4)=
-1:M(5)=-41 :rem 151
1470 M(6)=39:M(7)=0:M(8)=1:M(9)=-39:M(19)=41l:rem 5
1480 POKEV+31,9 srem 61
1498 DIMZ(9):Z(1)=10:Z(2)=8:2(3)=7:2(4)=13:2(5)=3:
Z(6)=4:2(7)=1:2(8)=12 :rem 111
1589 DEFFNB (X)=INT(RND(1)*14)+1:DEFFNV(X)=INT(RND(
1)*8)+1 :rem 23
1510 DEFFNG(X)=INT(RND(1)*PK) : POKE53281,8:POKE5328
0,2 :rem 77
1520 REM*** SPRTS ON * SIZE REGSTRS *** srem 112

183
Ls) Arcade Games

1530 POKEV+21,255:POKEV+23,9:POKEV+29,@ :rem @


1548 REM*** SET SPRITE POINTERS KRERKKE :rem 137
FORJ=1T0 8 :POKE29 039+J,1 3:NEXTJ :rem 68
1550
1568 REM*** SKIP MUSIC DATA KKKKKKKKKKE :rem 206
1570 FORJ=1T0O32:READQ:NEXT :rem 148
1588 REM*** POKE SPRITE DATA HHEKKKKKKE s:rem 244
1590 FORJ =0
:READQ: TO
POKE832 62XTJ
+J,Q:NE :rem 218
1688 FORJ=@ POKE896+J 62
: READQ: 0TO ,Q:NEXTJ :rem 220
1619 REM :rem 172
1620 REM*** SPRITE HORIZ LOCATIONS **** :rem 226
1630 POKEV,45:POKEV+2,75:P POKEV+6,135:P
185 : OKEV+4,
OKEV+8, 165: POKEV+19,195 :rem 93
1648 POKEV+12,225:POKEV+14, 255 :rem 186
165@ RETURN :rem 172
1668 REM***** INSTRUCTIONS **#****eKeKKK :rem 48
1678 PRINT" {CLR}€£19*-3{3 RIGHT}SS{RIGHT}SS
{5 RIGHT}{RVS}{YEL}{1l1 SPACES} {OFF}£13]
{4 RIGHT}SS{RIGHT}SS{3 RIGHT}k-}" :rem 179
1680 PRINT"€139{3 RIGHT}S{2 RIGHT}S{2 RIGHT}S
{4 RIGHT}{RVS}{YEL} BRUNHILDE {OFF}£1}_
{3 RIGHT}S{2 RIGHT}S{2 RIGHT}S" :rem 125
1698 PRINT"K19k-3{2 RIGHT}S{5 RIGHT}S{4 RIGHT}
{RVS}{YEL}{3 SPACES}LOVES{3 SPACES}{OFF}£13
{3 RIGHT}S{5 RIGHT}S{2 RIGHT}K-}" :rem 211
170@ PRINT"K13{4 RIGHT}S{3 RIGHT}S{5 RIGHT}{RVS}
{YEL}{3 SPACES}BRUNO{3 SPACES} {OFF}£13
{4 RIGHT}S{3 RIGHT}S" :rem 214
1718 PRINT"K13k-3{4 RIGHT}S{RIGHT}S{6 RIGHT}{RVS}
{YEL}{11 SPACES}{OFF}K1}{5 RIGHT}S{RIGHT}S
{4 RIGHT}£-}" :rem 67
1720 PRINT"£1}9{6 RIGHT}S{24 RIGHT}S" :rem 40
1730 PRINT"£13k-3{36 RIGHT}£-3" —_ :rem 233
1740 PRINT"{CYN}{2 RIGHT}BRUNO'S STUCK IN
{2 SPACES}VALHALLA PRISON," :rem 227
1750 PRINT"K-}{RIGHT}GUARDED BY EVIL GOBLINS. ONLY
THE{2 RIGHT}f-3" :rem 211
1768 PRINT"{2 RIGHT}VALIANT BRUNHILDE CAN RESCUE H
PEM: :rem 42
1778 PRINT"€-3{36 RIGHT }€-}3" :rem 188
1786 PRINT"f€649{2 RIGHT}SHE HAS 5 CHANCES TO GET HI
M k13HOMES" s:rem 56
1790 PRINT"£€69K-3{RIGHT}EACH CHANCE LASTS 208 TICK
S.{2 SPACES}IF A{RIGHT}£-3" :rem 117
1800 PRINT"{2 RIGHT}GOBLIN TOUCHES HER, IT'LL BOOT
HER" :rem 36
1818 PRINT"€-}{RIGHT}BACK HOME. IF TIME RUNS OUT,
{ SPACE }BRUNO{ RIGHT} £-3" :rem 165
1820 PRINT"{2 RIGHT}STAYS IN HIS PRISON FOR ETERNI
TY 11 :rem 93

184
Arcade Games 5
PIU ie nt sepa on ere Ce ee etre sce eT eras

1838 PRINT"€-}{36 RIGHT}€-3" :rem 105


1848 PRINT"{2 RIGHT}{YEL}BRUNO'S BEEN ENCHANTED
{2 SPACES}AND CAN'T" :rem 58
1858 PRINT"€-}{RIGHT}RECOGNIZE BRUNHILDE, SO SHE'S
GOT{2 RIGHT}£€-}" :rem 3
1868 PRINT"{2 RIGHT}TO CHASE HIM DOWN-- CAN YOU HE
LP?" srem 136
1878 PRINT"£-3{36 RIGHT}-}" :rem 199
1888 PRINT"{RIGHT}k-}{ RIGHT} £-}{ RIGHT }£-}{ RIGHT}
k-}{RIGHT}{RVS}{CYN} JOYSTICK IN PORT 2{OFF}
{YEL}{2 RIGHT}-}{ RIGHT }€-}{RIGHT}£-}{ RIGHT}
k-3" :rem 3
1898 PRINT"{DOWN}{WHT}STAND BY WHILE THE GOBLINS G
ET NASTY--" srem 255
1988 RETURN:REM COPY CHAR ROM INTO RAM :rem 41
1918 POKE56334, PEEK(56334)AND254:POKE1,
PEEK(1)AND2
51 :rem 236
1928 SYS49152 :rem 208
1938 POKE1,PEEK(1)0OR4:POKE56334, PEEK(56334)OR1
s:rem 188
1948 POKE53272,
( PEEK(53272)AND249)+14 :rem 239
1958 RESTORE: FORJ=1TO(32+63+63) :READQ:NEXT: rem 109
1968 REM*** POKE NEW CHAR DATA ******** erem Zin
1979 FORJ=15856T015695 :READQ: POKEJ ,Q:NEXT: RESTORE
srem 149
1988 POKEW1,16:POKEW2,16:POKEW3,16:POKE54278,64:PO
KE54285,64:POKE54292,64 :rem 60
1998 POKEW1,17:POKEH1,43:POKEL1,52:POKEW3, 33: POKEH
3,6:POKEL3,198 :rem 132
2800 POKEW2, 33:POKEH2,8:POKEL2,147 :rem 2
2010 REM***** POKE COLORS *#*#*#
kk eKK KKK :rem 156
2020 FORJ=1196TO1IGESTEP4G: FORK=JTOJ+3@: POKEK+L1 , Z
(FNV(@)):NEXTK,J :rem 83
2030 FORJ=1144TO1994STEP4@: POKEJ+L1,13:NEXT
s:rem 114
2048 FORJ=1177T0O1937STEP4@ : FORK=JTOJ+5 : POKEK+L1,7:
NEXTK,J:POKEW1,32:POKEW2, 32 :rem 89
2050 REM***** PROMPT PLAYER ****kkekeKK :rem 250
2068 POKEW3,32:PRINT"{HOME}{23 DOWN}{YEL}";
s:rem 144
2070 PRINT"K-} K-} k-} {RVS}PRESS SPACE BAR TO CON
TINUE{OFF} £-} £-} £-3" :rem 60
2888 POKEW1,16:POKEW1,17:POKEH1,19@:POKEL1, 205
:rem 177
2098 GETAS :I=Z (FNV(@) ) :FORJ=1944 T01983:POK EJ+L1,1:
NEXT: IFAS="_ "THEN2140 :rem 198
2108 POKEW1,16:POKEW1,17:POKEH1,12:POKEL1, 216
:rem 174

185
5 Arcade Games
ee ne

2118 IFAS<>" "THENI=Z (FNV(@) ) :FORJ=1983TO1944STEP-—


1:POKEJ+L1,1I:NEXT:GOTO29080 :rem 83

2128 IFAS=" "THEN2140 :rem 48


2138 GOTO2689 :rem 201
2140 POKEW1, 16: POKEW3, 16: FORJ=1944T0O1983 : POKEJ, 32:
NEXT: POKE1944+L1,13 :rem 185
2156 FORJ=1946T01976 : POKEJ+L1,Z(FNV(@) ) sNEXT: FORJ=
1978T01982:POKEJ+L1,7:NEXT :rem 201
2160 FORJ=1924T0O2023:POKEJ,32:NEXT :rem 37
2170 REM**** SKILL LEVEL *****#####keES :rem 153
2180 PRINT"{HOME}£69{RVS}{2 SPACES}PICK SKILL LEVE
L: 1 (EASY) TO 4 (HARD)":POKEV+31,9 :rem 87
2190 GETAS:IFAS<>"1"ANDAS<>"2"ANDAS<>"3"ANDAS<>"4"
THEN2199 :rem 164
2200 IFAS="1"THENPK=19 :rem 219
2210 IFAS="2"THENPK=15 :rem 217
2220 IFAS="3"THENPK=206 :rem 215
2230 IFAS="4"THENPK=25 :rem 222
2240 FORK=19024T0O1963 :POKEK,32:NEXT :rem 41
2258 PRINT"{HOME}{5 SPACES}{1@ RIGHT}CHANCES:
{RIGHT} {YEL}";CHS(CH);"K63{2 RIGHT}LEVEL:
{YEL}";(PK-5)/5 :rem 14
2260 RETURN :rem 170
2270 REM****** DRAW VALHALLA *******#*#x* :rem 194
2280 FORJ=1194T01143 :POKEL1+J,3:POKEJ,94:NEXT
:rem 235
2299 FORJ=1984T028623
: POKEL1+J , 3: POKEJ, 94:NEXT: POKE
1964+L1,10:POKE1964,83 :rem 46
2300 FORJ=1145TO1825STEP4@
: POKEL1+J,3:POKEJ,94:NEX
Bh :rem 144
2310 FORJ=19@5TO1945STEP4@
: POKEL1+J,3:POKEJ,94:NEX
TT :rem 152
2326 FORJ=1143TO2923STEP4@
: POKEL1+J,3:POKEJ, 94:NEX
Ai :rem 135
2330 FORJ=1176TO1216STEP49 : POKEL1+J,3:POKEJ,94:NEX
T: POKE1222+L1,3:POKE1222,94 :rem 145
2340 FORJ=1296TO1976STEP4@: POKEL1+J, 3: POKEJ ,94:NEX
T: POKE1497+L1,3:POKE1497,94 :rem 198
2350 POKE1977+L1,3:POKE1977,94:POKE1817+L1,3:POKE1
817,94 :rem 198
2360 FORJ=1659T01669: POKEJ+L1,3:POKEJ,94:NEXT: POKE
1782+L1,3:POKE1782,94 :rem 19
2378 FORJ=1338T01339:POKEJ+L1,3:POKEJ?,94:NEXT
: zrem 251
2380 RETURN :rem 173
23908 REMEX KKK KE KKKKKKKK KKK KK KKK KKK KKEEK :rem 288

2400 REM***** MUSIC DATA **# kkk eR KR HK Ke


99 s:rem
QALD REM % RRR I IOIdk tok rem 193
2426 DATA51,97,51,97,51,97,51,97,43,35,43,35,43,35
pole l2~ol Vig okp aes bee :rem 283
186
Arcade Games 5
SismROIOT URema) ERIE tee Oc arse ee eS

2438 DATA51,97,43,35,43,35,43,35,8,@ :rem 18


2448 REM ¥ ¥ & KKK KK KKK KKK KKK KKKKKKKKKKEK :rem 196

2458 REM***** SPRITE DATA{7 SPACES}*******:rem 152


2460 REM¥X¥ KKK KKK KKK KKKEKKKKKEKKKKKKKKEK :rem 198

2478 DATA36,252,18,168,212,20,112,252,89,124,196,1
26,48,252,56,96,112,96,126 :rem 233
2489 DATA253,192,31,255,128,3,254,0,1,252,0,8, 252,
126,90,249,248,0,255,152,31 :rem 178
2498 DATA255,48,31,222,48,24,08,51, 28,8,126,12,8,12
4,198,8,8,126,8,8,62,08,9 :rem 59
2508 DATA72,63,36,49,43,21,154,63,14,126, 35,62, 28,
635 12) 6¢28;6733223412632 :rem 87
2518 DATA255,248,9,127,192,0,127,128,15,63,128, 31,
223,0,25,255,252,28, 255,254 :rem 253
2528 DATA12 204,90,
,12 28,126,0
3,2 ,56,62,0
06,8,112,9,9
,227,8,8,254,0,8,252 :rem 99
2538 REM**{2 SPACES}CHARACTER DATA ****#*k*kkk*
srem 161
2548 REM** {17 SPACES } FE RR RRR KKK KERR KEK KER EEK E MINIA

TURE HEART ****** kkk KX :rem 227


2558 DATA @,9,40,124,124,56,16,92 :rem 14
2568 REM** {17 SPACES } FRR RK KE KKKEKKEKKKKEKKKEKE BRUNO

CROUCHING *****#*kkeKKK :rem 235


2578 DATA 8,8,0,0,60,126,217,255 :rem 17
2580 REM** {17 SPACES } FRR RRR KK KKK KKK KEK KRKKK BRUNH

ILDE{7 SPACES
} ****# kkk KKK :rem 98
2598 DATA 69,126,217,255,69,126,102,231 srem 123
2600 REM**{17 SPACES} **¥*#kKKKKKKKKKKKKKAKKEKE RVS B
RUNHILDE{3 SPACES }*****#*##eex%* z:rem 86
2618 DATA 231,192,126,60,255,217,126,68 :rem 116
2628 REM**{16 SPACES} **RKRKKKKKKKKKKKEKK
KEKE DRTS
ON WALL{4 SPACES } *¥*#**## kek KKK ER :rem 31
2638 DATA 255,255,195,195,195,195, 255,255 :rem 5
2640 REM**** VALKYRIE THEME *******k*kk* :rem @
2658 RESTORE: FORJ=1TO(32+63+63+8+8+8+8+8 ) : READQ:NE
XT: POKE54277,63 :rem 97
2668 POKE54274, 97:POKE54275,5:POKEWI1 , 32: POKEW2, 32:
POKEW3 , 32 :rem 249
2678 READQ1 : READQ2 : READQ3 :rem 32
2680 IFQ3=OTHEN277@ :rem 79
2698 POKEW1,65:POKEH1,Q1:POKEL1,Q2 :rem 68
2700 FORJ=1TOQ3 :NEXTJ {Fem a2
2718 POKEW1,64:GOT0O2674 :rem 89
2720 REM*** VALKYRIE SONG DATA ******** :rem 53
2738 DATA 19,205,187,18,205,93,14,197,139,14,107,2
4,14,107,24,17,37 (288 :rem 154
2740 DATA 14,1987, 288,17,37,139,17,37,24,17,37,24,2
1,154,280,17,37,2808 :rem 76
2750 DATA 21,154,139,21,154, 24,21,154, 24, 25,177, 28
0, 2,216,282 srem 230

187
5 Arcade Games
Fe

2760 DATA 17,37,139,17,37,24,17,37,24,21,154,8


:rem 217
2770 REM**** ASCENDING TONE KHEKKKKEKEKE :rem 236
2780 POKE54277,15:POKEW1,17:POKEW2,21:POKEW3,17
:rem 40
2798 POKEL1,108:POKEL2,108:POKEL3,108 :rem 156
2800 FORJ=8TO31STEP.4 :rem 21
2818 POKEH1,J-3:POKEH2,J:POKEH3,J*2 s:rem 88
2828 REM :rem 176
2830 NEXT:POKEW1,16: POKEW2,16:POKEW3,16 z:rem 155
2840 REM*** MIGHTY MOUSE THEME ******** :rem 78
2858 READQ1 : READQ2 : READQ3 : READQ4: READQ5 :rem 215
2868 IFQI=@THEN29
30 :rem 75
2870 POKEW1, 17:POKEW2,17:POKEW3,
21: POKEH1,Q1: POKEL
1,Q2:POKEH2,Q3 :POKEL2,04 :rem 116
2888 POKEH3,Q1/4:POKEL3,Q2/4 :rem 135
2890 FORJ=1TOQ5:NEXT: POKEW1,16:POKEW2,16:POKEW3,16
: GOTO 2856 :rem 229
2990 REM**** MIGHTY M. SONG DATA ****** :rem 241
2918 DATA 102,194,12,216, 280,86,1905,19,285,93,68,1
49,8,147,280 :rem 247
2920 DATA 51,97,12,216,93,68,149,8,147,93,86,195,1
Q,205,93,0,0,09,8,0 :rem 13
2930 POKEW1, 21:POKEW2,33:POKEW3,129:POKEH1,1@2:POK
EL1,194:POKEH2,6:POKEL2,108 z:rem 149
2949 FORJ=25TO2STEP—.@3: POKEH3,J:NEXT :rem 70
295@ RESTORE: RETURN :rem 14
2960 REM***** POKE ML ROUTINE *******%*% :rem 239
2978 DATA 169,9,133,4,169,208,133,5 :rem 193
2989 DATA 169)07133),6,169:,56;133,7 :rem 151
2996 DATA 162,9,160,8,177,4,145,6 :rem 85
3008 DATA 200,192,255, 208, 247, 230,5,230 z:rem 113
3019 DATA 7,232,224,16,208,236,96 :rem &7
392@ RESTORE: FORJ=1T9O( 32+63+63+8+8+84+8+8+63+35):RE
ADQ:NEXT :rem 121
3038 FORJ=49152T049190:READQ:POKEJ,Q:NEXT :rem 51
3048 RESTORE: RETURN rem 5

Program 2. Assembly Listing—Copy Character Set


From ROM To RAM (14336)
COBO AY 0 LDA #$088
COB2 85 04 STA $084
COO4 AQ DO LDA #$D@
COB6 85 65 STA $@5
COB8 AY 86 LDA #$06
COBA 85 86 STA $86
COSC AY 38 LDA #$38

188
Arcade Games 5 |

COBE $07
C818 #$00
CG12 #$20
CG14 ($84),Y
C816 ($86),
C818
C819 #SFF
C81B $C@14
C@1D $85
CO1F $07
C821
C822 #518
CO24 $CO12
C826

189
SuperSprite
Nick Sullivan

Guide “‘SuperSprite,” a falling superhero, safely through four


kryptonite barriers. Uses the function keys as cursor controls.
“SuperSprite” makes use of two fascinating aspects of the
Commodore 64’s sprite graphics. First, the size of a sprite is
doubled at the flip of a bit in either or both of its two dimen-
sions. Second, it enables the computer to detect, by PEEKing a
single register, collisions between sprites and other graphic
data.
The SuperSprite character resembles a super-powered be-
ing with arms outstretched in flight. SuperSprite is not a
steady flyer. And he expands and lengthens suddenly. These
characteristics are unfortunate, as his flight path is blocked by
barriers of kryptonite, impassible except for narrow gaps. The
gaps are movable—luckily, for SuperSprite does not wear a
helmet—but moving them requires a deft hand at the controls.
And that’s where you come in.
You're the keeper of the Spritely Gates, and you get 20
turns to manipulate the barriers so that SuperSprite can make
his way to the bottom. If you make it, you increase your score
and begin a new turn at the top of the screen.
You'll use the four function keys, each of which controls a
gap in one of the four barriers. The f1 key controls the top
barrier, the £3 key moves the second barrier, and so on. These
keys work as cursors to align the gaps with SuperSprite’s path
so that he can fly through. If SuperSprite hits a barrier, you
lose a turn, and he starts over at the top of the screen.
Unshifted, a function key moves its gap to the right; a
SHIFTed function key moves the gap to the left. Holding the
keys down causes them to repeat.
The soothing SuperSprite soundtrack is created by feeding
a slightly altered version of SuperSprite’s Y-position data to
the frequency registers in the SID (Sound Interface Device)
chip. The swooshing sound gets deeper as SuperSprite de-
scends through the barriers.

190
is. x

Arcade Gam 5

Special Scoring Technique


Scoring is based on several factors linked through the ex-
pressions on lines 210, 590, and 600. The program displays
and saves the best score yet achieved on your computer. The
record is stored in a location whose contents are displayed in
line 10 between the REM keyword and the colon. When you
type in the program, the character in this position is the letter
A. After you have finished entering the program, but before
you save it, you should type:
POKE PEEK(44)*256 + PEEK(43) + 5,1
This will properly initialize the high-score record for you.
If you break the record, a special message will remind you
at the end of the session to save the program so you can pre-
serve your high score. It’s good practice to perform a VERIFY
to make sure that the SAVE was successful.

‘ supersprite/ 1)
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
18 REMA: srem 192
180 REM SEED RANDOM NUMBER GENERATOR, DISABLE CHAR
ACTER SET SHIFTS :rem 49
119 U=RND(-TI) :POKE657,128 :rem 245
120 REM SAVE OLD ENVIRONMENT, BUILD NEW ONE, BUILD
SPRITE, PRINT INSTRUCTIONS :rem 35
130 SP=13 :V=53248 srem 171
140 POKE2941,PEEK(V+24) : POKEV+24, 22 :rem 244
150 POKE2042,PEEK(V+32) :POKEV+32,7 :rem 199
168 POKE2043, PEEK(V+33) : POKEV+33,7 :rem 203
178 POKE2044,PEEK( 646) :POKE646,9 :rem 56
188 POKE2@45, PEEK(65@) : POKE650,128 :rem 155
190 PRINT" {CLR}":GOSUB4992@ :rem 124
288 GOSUB6000:PRINT"{CLR}":POKEV+24,20 :rem 84
218 DEFFNSC(U)=INT(U+U*GL/19) :rem 205
228 FORI=1T016:TS$=TS$+"{ RIGHT }":NEXTI :rem 241
230 BS="{3 DOWN}"+CHRS(13)+"{RVS}":FORI=9TO39:BS=B
$+" "s:NEXTI :rem 1987
240 V=53248 :C=55296 :S=1024 :SD=54272 :rem 151
250 HS=PEEK(43)+PEEK(44)*256+5 :rem 124
268 T1=135 :T2=255 :T3=230 :T4=133 :rem 181
278 : TI=32
T5=5:T6=9:T7=.992:T8=42 z:rem 116
280 BS=PEEK(HS) :CH=65508 :AR=780 :rem 48
290 REM INITIALIZE CURSORS, PRINT GAME SCREEN
srem 53
3@@ E(1)=1269:E(2)=1475:E(3)=1682:E(4)=1888
:rem 164
318 POKEV+21,8:GOSUB2089 :rem 127
191
Arcade Games
SERRE EE I SE EE

32@ REM MAKE SPACE FOR SCORE ON SCREEN, SET SOUND


{SPACE}CHIP, CLEAR KEYBOARD BUFFER z:rem 38
330 FORI=1680TO1100:POKEL,32:NEXT :rem 237
340 POKESD+4,16:POKESD+11,16:POKESD+18,16 :rem 150
358 POKESD+6 , 240 :POKESD+13 , 248 : POKESD+20,24@
:rem 33
368 POKESD+24,15 :rem 130
370 GETAS :IFAS<>""THEN37@ :rem 148
3809 : :rem 213
398 REM BEGIN 20-TURN GAME LOOP,SET PART SCORE TO
{ SPACE } ZERO :rem 191
480 FORGL=1T020 :PS=0 :rem 203
410 REM POSITION SPRITE, UNEXPAND IT, ZERO THE COL
LISION DETECT REGISTER :rem 8
428 POKEV, 23:POKEV+1,49 :rem 96
430 POKEV+23,0:POKEV+31,@ :rem 178
448 REM PRINT SCORE INFO, TURN ON SOUND :rem 76
45@ PRINT" {HOME} {DOWN} "TS"TURN:
"GL"{2 SPACES }SCORE
Paks! :rem 1
460 PRINT"{DOWN}"TS"{5 RIGHT}BEST YET: "PEEK(HS)-1l
:rem 146
470 POKESD+4,17:POKESD+11,17:POKESD+18,17 :rem 157
488 REM TURN ON SPRITE, TAKE 1 TURN, GOTO 570 IF G
AME ABORTED (FQ SET) :rem 135
490 POKEV+21,1:GOSUB1000 :I FFQ=1THEN55@ :rem 31
508 REM SCROLL SPRITE OFF SCREEN IF NO COLLISION,
{SPACE }OTHERWISE SCREECH TO A HALT :rem 138
510 IFPEEK(V+1)>T3THENFORI=PEEK(V+1)T025@:POKEV+1,
I :NEXTI :GOTO55@ :rem 111
520 POKESD+4, 129:POKESD+11,33:POKESD+18,33:rem 201
538 FOR I=72TO20STEP-2:POKESD+1,1I:POKESD+8,I-3:POK
ESD+15, 1I-2:NEXTI :rem 62
549 REM TURN OFF SOUND. JUMP TO EXIT IF FQ SET
:rem 131
550 POKESD+4,16:POKESD+11,16:POKESD+18,16 :rem 153
56@ POKESD+1,9:POKESD+8,@:POKESD+15,@ :rem 197
578 IFFQ=l1THENFQ=0:GL=29 :NEXT : POKEV+21 ,8:GOTO67@
:rem 1
580 REM CALCULATE PART SCORE FROM SPRITE Y POSITIO
N, MODIFY, ADD TO TOTAL SCORE :rem 39
598 PS=FNSC(INT((PEEK(V+1)-71)/4®@)) :rem 214
698 TS=TS+INT((PSf1.4+PS) /2) :rem 156
618 POKEV+21,@8:POKEV+16,@ :rem 179
628 NEXTGL :rem 106
638 REM UPDATE HIGH SCORE RECORD, ZERO SOUND CHIP,
GO TO EXIT (3080) :rem 103
648 IFPEEK(HS)<TS+1THENPOKEHS,TS+1 :rem 161
658 FORI=0T024:POKE SD+I,@:NEXTI :rem 211
660 FORI=1TO509 :NEXTI z:rem 52

192
RTS AS RRL TN RTI Arcade Games 5
PTT SA ER

678 GOSUB3008 :CLR:GOTO210 :rem 1


680 : s:rem 216
978 REM SUBROUTINE--ONE TURN OF THE GAME :rem 169
988 : :rem 219
998 REM DECIDE WHICH SPRITE POSITION REGISTER TO A
LTER (W) AND BY HOW MUCH (U) :rem 58
1808 U2=RND(1) :W=V+INT(U2*2) :U=GL/7+2 :rem 123
1818 REM Y-EXPAND SPRITE IF EXPRESSION TRUE
:rem 162
1926 IFU2>T7ANDPEEK( V+1)<T1THENPOKEV+23,1 :rem 255
1838 REM SET MSB OF SPRITE X-POSITION IF NECESSARY
srem 24
1848 IFPEEK (W) +U> T2THENPOKEV+16,1 : POKEV, PEEK(V)+U-
T2:GOTO1G7B srem 45
1058 REM UPDATE SPRITE POSITION.{2 SPACES}EXIT IF
{SPACE }COLLISION DETECTED OR 4TH GAP CROSSED
s:rem 2590
1860 POKEW, PEEK(W)+U srem 198
1878 IF(PEEK(V+31)AND1) ORPEEK(V+1) >T3THE ?7NRETURN
s:rem 164
1888 REM CHANGE FREQUENCIES ACCORDING TO SPRITE Y
{SPACE}POSITION AND RANDOM NUMBER U2 :rem 67
1899 U=232-PEEK(V+1) : POKESD+1,U*2/3: POKESD+8 , U+3*U
2: POKESD+15 ,U+3 :rem 78
1190 REM POLL KEYBOARD. EXIT ON *; PAUSE ON ' '; G
OTO1@@G IF NOT A FUNCTION KEY :rem 70
1118 SYSCH:U=PEEK(AR) : IFU=T8THENTS=@: FQ=1 : RETURN
{17 SPACES}:REM EXIT :rem 253
1128 IFU=T9THENGOSUB8080:REM TAKE 5 :rem 97
1130 IFU<T4THEN190@:REM INPUT<Fl :rem 190
1148 REM MOVE LINE RIGHT IF KEY NOT SHIFTED (1120)
, LEFT IF SHIFTED (1140) :rem 16
1158 U=U-132: IFU<T5THEN1180:REM INPUT F1-F4:rem 25
1160 IFU<T6THEN1200:REM INPUT F5-F8 :rem 56
1178 GOTO199G:REM INPUT>F8 :rem 45
1180 E(U)=E(U)+(E(U)=1190+200*U-(U>2))
:POKEE(U), 22
3:POKEE(U)-1,160 :rem 78
1198 POKE E(U)+4+(U>2),32:POKEE(U)+5+(U>2),95:E(U)
=E(U)+1:GOTO1989O :rem 139
1208 :POKEE(U)+
U=U-4:E(U)=E(U)-(E(U)=1964+200*(U))
3+(U>2),95 :rem 227
1218 POKEE(U)+4+(U>2),16@:POKEE(U)-1,32:POKEE(U)-2
,223:E(U)=E(U)-1:GOTO1992 :rem 217
1978 REM SUBROUTINE--PRINT GAME SCREEN :rem 134
1986 3: srem 12
1998 REM LINE COLOURS SET IN LINE 2008. LAST COLOU
R IS FOR PRINTED MESSAGES :rem 154
2000 PRINT"{CLR}{2 DOWN}{PUR}"BS"{GRN}"BS"£7]3"BS"
k33"BS" {HOME} {BLK}" :rem 125

193
5 Arcade Games

2818 FORI=1T04: POKEE(I)-1,223: POKEE(1)+3-(1<3),95:


FORJ=E(1)TOE(1I)+2-(1<3) :rem 179
2826 POKEJ , 32:NEXTJ,1:RETURN{7 SPACES} :rem 32
2038 : :rem 255
2988 REM SUBROUTINE--EXIT OR RE-ENTRY :rem 82
2998 : :rem 14
3880 PRINT"{CLR }
{DOWN} "TS"{2 RIGHT}YOUR SCORE: "TS
:rem 218
3816 PRINT" {DOWN} ""TS"{4 RIGHT}BEST YET:";PEEK(HS)-
1 :rem 218
3828 PRINT"{3 DOWN}{RIGHT}PLAY AGAIN (Y/N)?
:rem 192
3836 GETAS : LFAS=""THEN303@ :rem 175
3048 IFAS="Y"THENRETURN :rem 164
3856 IFAS="N"THEN397@0 :rem 132
3068 GOTO 3830 :rem 200
3878 IF NOT(BS<PEEK( HS)
) THEN310@ :rem 112
3888 PRINT:PRINT" CONGRATULATIONS, YOU BROKE THE R
ECORD. :rem 40
3896 PRINT:PRINT" BE SURE TO SAVE THE PROGRAM.
:rem 1
31988 PRINT:PRINT" SEE YOU AROUND. :rem ll
3118 PRINT"{4 DOWN}" :rem 218
3128 REM RESTORE PREVIOUS ENVIRONMENT :rem 160
3138 POKEV+24, PEEK( 2041 ) : POKEV+32, PEEK ( 2042) : POKEV
+33, PEEK( 2043) :rem 186
3148 POKE646 , PEEK ( 2044) : POKE65@, PEEK( 2045 ) : POKE657
70 :rem 219
3158 END :rem 160
3168 : :rem 4
3988 REM SUBROUTINE--BUILD SPRITE AT PAGE 13 (LOCA
TIONS 832-895 IN TAPE BUFFER) :rem 103
3998 : :rem 15
4030 FOR I=@T0O41:READU: POKE(64*SP)+1I,U:NEXT
:rem 115
4919 FORI=42T063 : POKE(64*SP)+1,%8:NEXT z:rem 222
4820 POKE2040 , SP: POKEV+23,1:POKEV+29,1:POKEV+39,@:
RETURN :rem 180
4930 RETURN :rem 167
4840 DATA 248,0,0,62,0,9,7,128,0,1,224 :rem 43
4350 DATA 8,0,120,0,9,62,8,8,15,112 :rem 132
AG6B DATA 9,7,248,0,7,248,0,6,1208,@ :rem 163
4870 DATA 6,12,8,6,6,8,3,6,0,1,128 :rem 1063
4880 : :rem 6
4986 REM DATA FOR INSTRUCTIONS PAGE :rem 148
4998 : :rem 16
5808 DATA"YOUR OBJECTIVE IS TO MANEUVER THE
:rem 238
5018 DATA"HORIZONTAL LINES SO THAT SUPERSPRITE
~ srem 192
194
EI
Arcade Games 5
DYBRO WNT 2 SERED
T LE METAR CT Le ICT AS eA

DATA"MAY FLY SAFELY THROUGH THE GAPS.:rem 244


DATA"THE FOUR LINES ARE CONTROLLED BY THE
:rem 182
DATA"FOUR FUNCTION KEYS ON YOUR RIGHT.
:rem 123
DATA" :rem 6
DATA"PRESSING ONE OF THESE KEYS WILL CAUSE
:rem 199
DATA"THE CORRESPONDING LINE TO SLIDE RIGHT.
:rem 174
DATA"THE SAME KEY SHIFTED WILL CAUSE ITS
srem 25
DATA"LINE TO SLIDE LEFT.{2 SPACES}PRESS THE S
PACE ~ rem 249
DATA"BAR TO PAUSE, '*' TO ABORT. :rem 229
DATA" s:rem 3
DATA"A GAME CONSISTS OF 28 TURNS. POINTS ARE
< :rem 75
DATA"“AWARDED FOR EVERY GAP SAFELY TRAVERSED.
:rem 233
DATA"THE PAYOFFS INCREASE WITH THE NUMBER OF
ve :rem 68
DATA"GAPS TRAVERSED ON A TURN, AND WITH THE
srem 37
DATA"NUMBER OF TURNS TAKEN.{2 SPACES}SUPERSPR
ITE'S trem 131
DATA"FLIGHT SPEED AND NATURAL WAYWARDNESS
s:rem 122
DATA"ALSO INCREASE AS THE GAME PROGRESSES."
srem 111
DATA" srem 11
DATA"THE MAXIMUM SCORE IS 253. GOOD LUCK.
i ry :rem 104
DATA" :rem 4
DATA"{4 SPACES }PRESS{ SHI FT-SPACE }S PACE
{ SHIFT-SPACE }BARTSHIFT-SPACE }TO START
{ SHIFT-SPACE }GAME. :rem 204
: srem 4
REM SUBROUTINE--PRINT INSTRUCTIONS :rem 102
: :rem 17
POKEV, 23 : POKEV+1,49 : POKEV+21,1 s:rem 58
GOSUB708@ : GOSUB7900 :rem 143
FORW=1T023 : READUS : PRINTUS :GOSUB700@ :NEXTW
srem 220
POKEV+21,@:POKEV, 23: POKEV+1, 49: POKEV+23,8:POK
EV+29,@ :rem 152
GETAS : IFA$<>CHR$(32)THEN 6848 :rem 183
RETURN srem 171
: :rem 6

195
Arcade Games

6988 REM SUBROUTINE--FLY SPRITE DOWN 1 PRINT LINE


{SPACE}(AHEAD OF INSTRUCTIONS) :rem 243
6999 : :rem 18
788@ FORI=1TO8 : POKEV, PEEK(V) +1 :rem 83
7818 POKEV+1, PEEK(V+1)+1:NEXT :rem 210
7820 POKEV, PEEK(V)+1: RETURN :rem 188
7830 : :rem 4
7988 REM SUBROUTINE--ANSWER THE PHONE :rem 81
7998 : :rem 19
8000 POKE SD+24,90 :rem 123
8818 SYSCH: IFPEEK(AR) <>32THEN8@19 :rem 252
8820 POKE SD+24,15 :rem 179
8038 RETURN :rem 171

196
Olympiad
Kevin Woram and Mike Buhidar, Ji. =e

In this mythical struggle between a magician and a king, you decide


the fate of the realm with your joystick. For two players and two
joysticks.

Long ago, Admar, a magician of great power, served the king


of Denbar as an advisor in matters of policy. Through the
years, Admar’s power grew so that the king began to fear him.
Foolishly, the king decided that because of his power, Admar
could no longer be trusted, and he plotted to kill the magician.
Admar, actually still loyal to the king, learned of the
king’s plot. Fearing for his own life, he fled the capital with a
legion of his own warriors.
The king followed with an army of his own and attacked
Admar’s stronghold. There were heavy casualties on both
sides. It took time, but finally the king and Admar realized
that continued battle would result in nothing more than a gen-
eral bloodletting of the entire countryside.

An Enchanted Arena
So it was agreed that an enchanted arena should be built
where the king’s black knights would do mock battle with
Admar’s red knights. Whoever’s knights won would claim the
kingdom as his own.
You and a friend control the actions of the knights as they
fight for their masters. Movement in all eight directions is con-
trolled by the joysticks. The red knight is controlled by the
joystick in port 1, the black knight by the joystick in port 2.
The knights have also been given 20 magical arrows that
stun on contact. The arrows are launched by pressing the fire
button. When your knight has used all of his arrows, your
only defense is to run.

Teleportation Grids
To add an element of randomness to the battle, three
teleportation grids have been added to the arena. A large one
is in the center of the arena, while the other two are in cor-
ners. Either knight may use any of the three grids. When any

197
7 Arcade Games

warrior steps onto one of these grids, he is instantly teleported


to a random position in the arena.
There are also two doors on each side of the arena, which
allow you to move directly from one side to the other, in effect
wrapping around the screen. You can even shoot arrows
through these doors. If the opposing knight happens to be
standing in front of the door on the left side, for instance, and
you fire through the door on the right, you can stun him.

Typing Olympiad
“Olympiad” makes extensive use of keyboard graphics in
drawing the arena display. To avoid confusion and possible
typing errors, please refer to ““How to Type In Programs,”
Appendix B, before you attempt to enter this program. Using
“The Automatic Proofreader,” found in Appendix C, will in-
sure that you type Olympiad correctly the first time. Make
sure you read the explanation and have a copy of the Proof-
reader program available before you start typing.
Pay close attention to lines 3010-3220 as you type them
in—especially to the places where program lines are divided
on the page. If any spaces are to be left after the characters on
\ one line of the page, the correct number will be indicated in
braces at the beginning of the next line. Unless you are specifi-
cally instructed to type spaces, do not do so. For instance, in
the statement below, there should be only two spaces (as
specified in the braces) between the SHIFTed characters on the
first line and those on the second.
3188 PRINT" {UP}UCK ucccccccI{2 SPACES }UCCCCCCCCI
{2 SPACES }UCCCCCCCI{3 SPACES}B"

Note, however, that spaces are sometimes called for within a


line. In the example above, there should be a space after the
first SHIFTed K, before the next SHIFTed U is entered. Single
spaces are not indicated by braces—there’s just a gap. When-
ever more than one space is to be inserted, you'll see the num-
ber in braces (as in the first line, where you see {2 SPACES}).

lympiad an
For mistake-proof ptggram entry, be sure to read “The Automatic Proofreader,” Appendix C.
1 POKE53289,2:POKE53281,1:GOTO1998@ :rem 189
2 DIM X(15),CS(15),D2(15),C2(15) :rem 69
4 CLR:N=15 :B=32 :FJ=56320 :FT=56321 :CO=54272:JB=16:H
P=102 :GOSUB580 zrem 223
198
Arcade Games 5

RN=1 :RO=1104 : FB=103@ : FO=1954 :LB=1932 :LR=1056:GO


SUB3880 :rem 15
DX(8)=@:D :DX( 2)=48
X(1:DxX(4)=-1
)=- :DX(5)=-4
48 1:D
X(6)=39:DX(8)=1:DX(9)=-39 :rem 54
D2(8)=@ :D2(1)=-48:D2(2)=40:D2(4)=-1:D2(5)=-41:D
2(6)=39:D2(8)=1:D2(9)=-39 :rem 8
DX(10)=41:CS(@)=192:CcSs(1)=194:CS(2)=195:CS(4)=1
93:CS(5)=198:CS(6)=197 :rem 118
D2(18)=41 :C2(8)=193:C2(1)=194:C2(2)=195:C2(4)=1
93:C2(5)=198:C2(6)=197 :rem 141
CS(8)=192:CS(9)=196:CcS(18)=199 :rem 244
C2(8)=192:C2(9)=196:C2(198)=199 :rem 147
RESTORE : GOSUB48@ : FORNP=138 24T013983 : READMD: POKE
NP,MD:NEXT srem 166
PRINT"{2 UP}";SPC(JB);"{7 SPACES }" :rem 217
OP=1105 :02=1982: POKEOP, 195:POKEO2,194:POKEOP+CO
,9:POKE92+CO,5 :rem 101
IF AT+NA=@ THEN POKEOP,B:POKEO2,B:RN=RN-1:GOTO3
4 :rem 99
JV=N-( PEEK(F : FR=PEEK(
J)A FJ)ANDJB
NDN :CS(@)=C
) S(J
V) :UP=OP+Dx (Jv) :rem 51
IFPEEK(UP) <> BTHENGOSUB4000 :rem 68
POKEOP,B: POKEUP+CO,@:POKEUP,CS(JV :OP=UP:re)m 7
IFFR<>JBTHENGOSUB1OGB :rem 217
J2=N-(PEEK(FT)ANDN) :F2=PEEK(FT)ANDJB:C2(@)=C2(J
2) :U2=02+D2(J2) :rem 24
I FPEEK (U2) <> BTHENGOSUB419@ :rem 41
POKEO2,B:POK 2: POKEU2,C2
EU2+ (J2) :02=U2
CO,
srem lll
IFF2<>JBTHENGOSUB119 :rem 188
GOTO6G :rem 15
REM SHOOT ARROW :rem 110
I FNA=@ THENRETURN :rem 43
NA=NA-1:BP=INT(NA/1@):IFBP>1THENBP=1 :rem 168
PRINT" {HOME } {BLK}";NA:POKE1026D=DX(JV)
+BP,B::J
C=CS(JV) :GOSUB200 :rem 77
AP=UP+D:C1=@:GOTO115 :rem 157
IFAT=@ THENRETURN z:rem 50
AT=AT-1:BT=INT(AT/1@):IFBT>1THENBT=1 :rem 199
PRINT" {HOME} {RED}";SPC(36);AT:POKE1962+BT,B: D=
D2(J2) :JC=C2(J2) :GOSUB20G :rem 48
AP=U2+D:C1l=2 :rem 119
AD=JC+8 :I FPEEK(AP) <>BTHENRETURN :rem 228
FORA=1TOL5 :NP=AP+D :rem 71
AC=NP+CO :rem 180
IFPEEK( NP) <>BTHEN30@ srem 181
POKEAP,B: POKEAC,C1:POKENP,AD:AP=NP
:NEXT: POKEAP
, B: RETURN s:rem 169
REM STILL CHECKER :rem 4

199
5 Arcade Games
po Oe

200 IFD<>@THENRETURN :rem 39


219 IFJC=194THEND=-4@ :RETURN :rem 229
220 IFJC=195THEND=4 0
: RETURN :rem 186
230 IFJC=193THEND=-1 :RETURN :rem 179
240 IFJC=198THEND=-41 : RETURN :rem 237
250 IFJC=197THEND=3 9
: RETURN :rem 199
268 IFJC=192THEND=1 : RETURN :rem 136
270 IFJC=196THEND=—39 :RETURN :rem 245
288 D=41:RETURN :rem 154
299 REM DEATH :rem 238
300 IFPEEK(NP)<192THENPOKEAP ,
B: RETURN :rem 133
319 IFC1=0THEN330 :rem 261
312 POK B: ELB , 0
LB=LB-1 :GOSUB68 :rem 2
315 IFLB=FB-1THEN6000 :rem 206
317 GOTO34 s:rem 59
330 B: ELR
POK , 4
LR=LR-1 :GOSUB61 :rem 51
335 IFLR=FO-1THEN69190 :rem 238
348 GOTO34 :rem 55
498 NA=20:AT= 20:
{HOME} PRI
{BLK}";N NT"
A;SPC(32 );"
{RED}";AT :rem 234
4106 PRINT"{BLU}{HOME}{2 DOWN}{RVS}";SPC(16 );
"ROUND
">RN; " {OFF }":RN=RN+1:RETURN :rem 197
580 REM SOUND INITIALIZATION :rem 42
518 S=54272 :FORQ=ST OS+2
: POKEQ,@ 4
:NEXT :rem 66
520 POKES+24,15:POKES+5,17:POKES+6, 248 :rem 211
525 POKES, 15@:POKES+1,15@ :rem 186
538 RETURN :rem 120
680 DP=UP :OM=U2 :GOTO629 :rem 177
618 DP=U2:OM=UP :rem 167
628 POKEAP,B: POKEOM, B: GOSUB700@ :FORK=219TO298STEP-
1:POKEDP,K :rem 65
638 FORH=1TO100 :NEXT:NEXT: POKEDP, 211:POKEDP,B :
POKE
UP, B: POKEU2, B: RETURN :rem 120
1000 REM CHR. SET LOADER :rem 83
1918 PRINT"{CLR}{BLK}LOADING CHARACTER SET INTO ME
MORY. . .":PRINTCHRS(142) srem 122
1920 POKE52,48:POKE56,48:CLR:G=56334 :rem 59
1830 POKEG,PEEK(G)AND254 :rem 145
1848 POKE1,PEEK(1)AND251 :rem 99
1945 IFPEEK(13983)=102THEN1®60 :rem 157
1858 FORI POKEI+12T0
:=0 28
288, PEEK( 47
I+53248) :NEXT
:rem 74
1968 POKE1, PEEK(1)OR4 :rem 207
107@ POKEG, PEEK(G)OR1 :rem 249
1880 POKE53272, (PEEK(53272)AND249)+12 :rem 232
1998 FORNP=138 24T
:READMD: 013
POKENP 983
,MD: DC=DC+MD:
NEXT :rem 158
1995 IFDC<>13392THENPRINT"ERROR IN DATA. . .":STOP
zrem 166

200
Arcade Games &,

1188 GOTO2 s:rem 45


1999 REDEFINED CHARACTERS :rem 66
2008 DATA102,227,241,159,159,241,227,102 :rem 216
2618 DATA1®2,199,143,249,249,143,199,182 :rem 235
2828 DATA1 26,219,153, 24,68, 231,231,126 :rem 113
2838 DATA126,231,231,60,24,153,219,126 :rem 114
2848 DATA69 ,6, 287,253,201, 201,124,608 :rem 6
2858 DATA60 ,62,147,147,191,243,96,60 :rem 36
2868 DATA69 , 96,243,191,147,147,62,608 :rem 37
2978 DATA69 ,124,201,201,253,207,6,60 :rem 9
2082 DATAG,132,66,63,66,132,0,8,08,33,66,252,66, 33,
@,9,16,56,84,16,16,16,48,68 :rem 233
2884 DATA68,40,16,16,16,84,56,16,7,3,5,8,16,224,32
,32,4,4,7,8,16,160,192,224 :rem 2062
2886 DATA224,192,160,16,8,7,4,4,32,32,224,16,8,5,3
7 :rem 39
2888 DATAS ,49,8,16,4,16,9,0 :rem 26
2998 DATAG,@,20,10,32,28,8,0 :rem 99
2892 DATA68,9,32,132,1,48,130,17 z:rem 78
2894 DATAG ,9,9,9,0,0,9,9 srem 157
2999 REM PLAYFIELD :rem 91
3886 PRI {CLR}
NT" {RED}{12 SPACES}{RVS}O L YMPHIA
D{OFF}{14 SPACES}" :rem 72
3881 ;AT
NA=29 :AT=20 : PRINT" {HOME }";NA;SPC(B)
srem 204
3BB2 FORL=19024T0O19035: POKEL+CO,@:NEXT: FORL=1057TO19
62 :POKEL+CO, 2:NEXT :rem 219
3804 FORL=FBTOLB:POKEL, ep eR ee ee POKEL,
194 :NEXT srem 96
3818 PRINT" {UP} {BLK} UCERICCEECEECeCCeCeCteecCcCece
GCCCECECCERICI* trem 236
3828 GOSUB3999 : POKE1196+CO,8:POKE1106,66:POKE1141+
CO,%:POKE1141,66:POKE1142,HP ) :rem 51
3838 POKE1142+CO,2:PRINT"{UP}B KX} UCCCCI
{2 SPACES }UCCCCCI{ 2 SPACES }uUCCCCCI{2 SPACES}U
ececer EZa 8" :rem 144
3848 PRINT" {UP}B{3 SPACES}JCCCCK{2 SPACES }JCCCCCK
{2 SPACES}JccccckK{2 SPACESJJCCCCK{3 SPACES JB"
:rem 183
385 GOSUB3999 zrem 29
3860 PRINT"{UP}B{3 SPACES }UCCCCCCCI{2 SPACES }UCCCC
ccccil{2 SPACES }uUCCCCCCCI{3 SPACES}B" :rem 75
38678 PRINT" {UP}B{3 SPACES JgCCCcccCCK{2 SPACES }Jcccc
ccccK{2 SPACES}JCCCCCCCK UCK" :rem 210
3880 PRINT" {UP} JCI" ;SPC(34);"JCC™ :rem 43
3898 PRINT" {UP}CCK{3 SPACES }UGCCCI{4 SPACES }UCKW4
{2 SPACES}KQ9CI{4 SPACES}JUCCCCI" :rem 85
3100 PRINT"{6 SPACES }JCCCCK{2 SPACES}UCK{6 SPACES}
Jci{2 SPACES } JCCCCK{3 SPACES }UCC™ — :rem 235

201
By, Arcade Games

3110 PRINT"{UP}CCI{11 SPACES }B{10 SPACES }B


{1l SPACESJJCI" :rem 8@
3128 PRINT"{UP}UCK UCCI UCCI B{4 SPACES } {BLK} E+3
SPACESJB UCCI
{RED} £+9(BLKT (4 SP uccI{3 SPACES }B
:rem 233
3130 PRINT"{UP}B{3 SPACES}JCCK JCCK B{4 SPACES}
{ RED} &+9{BLK}£+3{4 SPACES}B JCCK JCCK UCK"
:rem 54
3148 PRINT" {UP}JCI{1l1 SPACES}B{18 SPACES }B
{1l SPACES }JCc" :rem 84
3158 PRINT" {UP}CCK[3 SPACES }UCCCCI{2 SPACES }JCI
{6 SPACES}UCK{2 SPACES }UCCCCI{6 SPACES}"_
:rem 137
3160 PRINT"{UP}{6 SPACES }JCCCCK{4 SPACES }JCKW]
{2 SPACES }£Q3CK{4 SPACES JuccccK{3 SPACES } UCC"
:rem66
3170 PRINT" {UP}CCI{34 SPACES }JCI" :rem 214
3188 PRINT" {UP}UCK ucccccccI{2 SPACES }UCCCCCCCCI
{2 SPACES }UCCCCCCCI[3 SPACES}B" :rem 239
31908 PRINT"{UP}B[3 SPACES }JcccccccK{2 SPACES }Jcccc
ccccK{ 2 SPACES } JCCCCCCCKT3 SPACES}B" rem 52
3288 GOSUB 3999 :rem 26
3218 PRINT" {UP}B{3 SPACES }UCCCCI{2 SPACES }UCCCCCI
{2 SPACES }UCCCCCI{2 SPACES }uUCCCCI{3 SPACES ]B"
Sees :rem 218
3220 PRINT"{UP}B KS} JCCCCK{2 SPACES }JCCCCCK
{2 SPACES }JCCCCCK[ 2 SPACES } JCCCCK kA B"
trem 21
3238 PRINT" {UP}B":POKE1945 ,HP :rem 236
3245 FORL=56215T056295 : POKEL, 8:NEXT :rem 121
3258 POKE1983 ,93:POKE1984, 74 :FORL=1985T02022 : POKEL
,67:NEXT :rem 237
3268 POKE1986,113
:POKE1946,66 :POKE20@21,113:POKE198
1,66:POKE2023,75:RETURN :rem 13
3990 PRINT" {UP}B" ; SPC (38); ;"B":RETURN :rem 49
3999 REM HIT DATA :rem 193
4000 I FPEEK( UP) <>HPTHENUP=OP : RETURN :rem 74
4010 RF=INT(RND(1)*879)+RO: IFPEEK( RF) <>BTHEN461@
:rem 97
4820 UP=RF: POKEUP+CO,@:
POKEOP, B: MP=UP: JP=JV:GOSUBS5
GOO :rem 198
4100 IFPEEK(U2) <>HPTHENU2=02 : RETURN :rem 241
4110 R2=INT(RND(1)*879)+RO: IFPEEK(R2)<>BTHEN411@
:rem 59
4120 U2=R2 : POKEU2+CO, 2: POKEO2, B: MP=U2:JP=J2:GOSUBS5
@00 :RETURN trem 51
5890 FORMN=208T0219: POKEMP, MN: FORW=1TO15@ :NEXT :NEX
T:POKEMP,CS(JP): RETURN trem 255
5999 REM END ROUTINE :rem 193

202
Arcade Games 5

6088 WNS=" RED ":LSS=" BLACK ":T1=4:T2=4:GOTO602@0


srem 98
6919 WNS$=" BLACK ":LSS=" RED ":T1=3:T2=5 :rem 48
6828 PRINT"{CLR}";TAB(T1);"{DOWN} {BLK}THE";WNS;"KN
IGHTS WERE VICTORIOUS! {DOWN}" :rem 44
6030 PRINTTAB(T2);"THEY DEFEATED THE";LSS$;"KNIGHTS
{ DOWN}" :rem 118
6940 PRINTTAB(14);"IN";RN-1; "ROUNDS" :rem 141
6868 PRINT"{15 DOWN}{4 SPACES}PRESS <<SPACEBAR>> T
O PLAY AGAIN{3 SPACES}" z:rem 151
6865 GETIS:IFIS$<>" "THEN6@65 :rem 18
6878 GOTO4 srem 58
7288 REM DEATH SOUND :rem 154
7818 POKES+4,129:FORQ=1T03@
:NEXT: POKES+4,128
srem 178
7848 RETURN :rem 171

203
Burn Rubber
Jonathan Cook

“Burn Rubber,” a simple but exciting race game, pits you against
the clock as you roar down straightaways, around hairpin turns,
and through dangerous S-curves.
Racing your Formula-I car around the complex track, compet-
ing against the clock, you try to finish as many laps as pos-
sible before crashing. Although a relatively simple game to
program and play, “Burn Rubber’ takes advantage of the
Commodore 64’s sprite graphics and sound effects. You have
to maneuver your car carefully, taking the turns and curves as
fast as possible to post the best lap time. You can even slow
and speed up your car, to pound down the straightaways or to
slowly make the hairpin turns.
Not only are you racing against the clock, but you’re also
trying to collect as many points as possible. Your score is
based on the average speed and the number of laps you com-
plete. The faster you go and the more laps you finish before
the eventual crash, the better your score will be. The computer
keeps track of the points per race, the time, the lap total, and
even the time per lap.

From the Starting Line


You control the car by pressing keys. The keys and their con-
trols are:
Key Controls
Ly Move the car up (north)
; Move the car down (south)
Li Move the car left (west)
: Move the car right (east)
1 ' Slower speed
= Faster speed
To start the race, just press the L key to move your car to the
left until it’s off the screen. You'll then see a display on the
right side of the screen that tells you the points, time elapsed,
laps completed, and time per lap. All except the time elapsed
should read 0. Press the space bar, as the prompt at the bot-
tom of the screen suggests, to restart the clock. Now your car
again reappears on the screen, ready to begin.
204
a
ae a
~

Arcade Gamés 5
A

Press the ; (semicolon) key to move the car to the right.


You can race either clockwise or counterclockwise; the latter
seems more natural, somehow. Immediately, you have to
maneuver the car through a tricky S-curve. From there, the
track twists and turns until it brings you back to the starting
point. Use the 1 and 2 number keys to control the speed.
Pressing repeatedly slows or speeds up your car’s engine.
You'll hear the difference in the sound. The straightaways are
where you can open up the throttle; unless you’re a peerless
driver, you'll probably have to slow down for some of the
turns. If you want to quit and find out your score, time, and
laps completed, just drive off to the left near the bottom of the
screen. The display changes and your new totals appear.
The race ends when your car crashes or is driven off the
track. To start a new race, just press the space bar again. Your
car reappears and is ready to take on the circuit again.
There’s always a new challenge just around the next
corner. f

Mier
For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
190 DIM F1(5),F2(5):PRINT"{CLR}" :rem 48
990 PRINT"{CLR}":POKE53272,23 :rem 250
1906 PRINT TAB(14) "{WHT}{RVS}BURN{SHIFT-SPACE
}RUB
BER{ OFF }" :rem 97
1910 PRINT"{YEL}
{DOWN} {RIGHT}THE OBJECT OF THIS GA
ME IS TO DRIVE" :rem 23
1826 PRINT"{RIGHT}AROUND THE TRACK AS FAST AS POSS
IBLE" srem 135
1038 PRINT"{RIGHT}WITHOUT CRASHING. YOU CAN GO AS
{SPACE }MANY" :rem 17
1948 PRINT"{RIGHT}LAPS AS YOU LIKE. YOU CAN RACE F
OR" i :rem 24
1958 PRINT"{RIGHT}POINTS OR FOR TIME. TO END A LAP
OR" s:rem 47
1968 PRINT"{RIGHT}TO RESET THE CLOCK YOU MUST DRIV
Ee THE,’ srem 201
1070 PRINT"{RIGHT}CAR OFF THE SCREEN AT THE LOWER
{SPACE} LEFT." :rem 96
1972 PRINT"{RIGHT}THERE IS NO TOP SPEED, BUT THE F
ASTER" - :rem 18
1873 PRINT"{RIGHT}YOU GO, THE HARDER IT IS TO DRIV
E.{2 DOWN}" :rem 181
1080 PRINT TAB(15) "UP={RVS}P{OFF}{DOWN}" :rem 143

205
Ls) Arcade Games
Jorn SoS

PRINT TAB(11) "LEFT={RVS}L{OFF}{3 SPACES}


{RVS}; {OFF }=RIGHT{ DOWN }" :rem 40
PRINT TAB(13) “DO WN=
RVS}. {OFF} {DOwN}"
{
:rem 119
PRINT TAB(11) "{RVS}1{OFF}=SLOWER" :rem 12
PRINT TAB(11) "{RVS}2{OFF}=FASTER{ DOWN }" .
:rem

PRINT TAB(13) "{RVS}{WHT}SPACE{SHIFT-SPACE}TO


{ SHIFT-SPACE }START{ OFF} {BLUJ" :rem 214
GET CH$:IF CHS$="" THEN 3000 :rem 61
PRINT" {CLR}":POKE53272,21 :rem 35
VL=54296 : W=54276: A=54
: SR=54278: 277=5
H=54273:L
4272:TIS="G90000" :rem 152
FORCS=54272 TO 54296:POKECS,@:NEXT :rem 1l
POKE53281,@ :rem 93
REM SET SOUND,TRACK COLOR :rem 74
FORK=1 TO 5:READF1(K) :READF2(K):NEXTK:rem 220
FOR I=55296 TO 56295:POKEI,14:NEXT :rem 175
: :rem 12
REM SET UP SPRITE @ TO LOOK LIKE A :rem 136
REM CAR AND PUT IT AT START LOCAT- :rem 181
REM ION. ALSO SET UP 1ST TRACK s:rem 213
REM WITH GOSUB 20000. srem 145
: :rem 12
V=53248 :POKEV+21,1 :rem 8
FOR S1=12288 TO 12350:READQ1:POKES1,Q1:NEXT
:rem 253
FOR S2=12352 TO 12414:READQ2:POKES2,Q2:NEXT
:rem 251
FOR S3=12416 TO 12478:READQ3:POKES3,Q3:NEXT
:rem ll
FOR S4=12488@ TO 12542 : READQ4: POKES4,Q4:NEXT
:rem 9
FOR S5=12544 TO 12606:READQ5:POKES5S,Q5:NEXT
:rem 16
P1=192 :rem 33
LX=24 :LY=204:REM CAR START LOCATION :
GOSUB 20800 mac
:rem 59
POKEV+39,1:POKE 20498,Pl :rem 31
POKEV, LX: POKEV+1,LY :rem 10
REM FREQUENCY DATA :rem 122
DATA aie Cee ee ee zrem 51
REM CAR U/D :
DATA 8,0,0,0,0,8,8,8,0 Ses
DATA 80,0,0,0,0,08,0,8,0 :rem 33
DATA 0,0,0,09,0,0,15,207,192 z:rem 45
DATA: 3,3,0,15,255,192,352-98 :rem 61
DATA 15,287,192,0,0,0,0,0,8 :rem 47
DATA 8,89,09,0,8,0,0,8,0 :rem 37
Arcade Games 5

15868 DATA 8,9,8,09,0,0,0,0,0 :rem 38


15865 REM CAR R/L :rem 136
15878 DATA 9,8,89,8,9,0,0,9,@8 z:rem 39
15882 DATA 6,09,9,09,09,9,9,8,@ srem 40
15898 DATATS 7 DIO, 64255, 8,375, Oo srem 10
15108 DATA 8,48,8,8,48,0,0,48,@ :rem 213
15118 DATA SL O1L505 3,250 07 Oso7 DL, O :rem 3
15129 DATA 0,09,09,8,0,0,0,9,@ s:rem 35
15130 DATA 9,0,9,9,0,8,9,0,@0 srem 36
15148 REM EXPLOSION SPRITE DATA s:rem 145
15166 DATA 9,9,9,08,9,0,9,0,@ :rem 39
15178 DATA 9,9,9,0,0,0,0,8,@8 srem 40
15188 DATA 12,9,8,3,3,0,0,195,08 :rem 209
15198 DATA 9,63,48,3,255,192,9,63,48 :rem 239
15260 DATA @,63,9,9,204,192,0,12,48 s:rem 156
15218 DATA 9,9,9,9,9,9,0,8,@9 srem 35
15228 DATA 0,9,9,9,9,8,9,8,@ :rem 36
15230 REM :rem 223
15248 DATA 9,9,8,0,9,9,8,204,12 s:rem 191
15258 DATA 48,48,12,48,240,48,12,48,192 :rem 139
15260 DATA 12,48,192,3,63,207,48,255,204 :rem 182
15279 DATA 12,255,249,3,255,192,9,255,240 :rem 219
15289 DATA @,255,204,15,255,243,48,63,48 :rem 184
15290 DATA 0,204, 420; 3 720) pucro pono :rem 168
15388 DATA 63,0795, 12,0 p.027 Cal etoe :rem 160
15319 REM :rem 222
15329 DATA 1250, 207 73737 Loo Oye OS s:rem 14
15330 DATA 48,51 ,252,48,255, 252,204,035 ,240 ¢reness
15340 DATA’ 127525577 [O27 OS Zoo eC gol, coo, eos
:rem 126
15350 DATA 1572555.202, 2499 2D Jp OL Re O Pee
:rem 127
Ue poe DATA’ 515255, 204,15, 205,243; 0, 20>D,e2o0.rem. 72
15369 DATA 24357, 204,48, 207,207 ,. 2,157 47..5,).5em Loo
15378 DATA 63,12,195,60,204,192,249,48,192 :rem 27
15400 : s:rem 52
15419 REM KEYBOARD CHECK FOR DIRECTION, :rem 66
15420 REM SPEED, SOUND :rem 6
15430 : srem 55
15448 SP=1:FC=1:POKEVL,
15 :POKEA, 136:POKESR, 136
:rem 33
15580 GET CLS sIFC1S=""" THEN ClLS=C35S :rem 243
15528 IF C1$S="P" THEN LY=LY-SP:C3S=C1S$ :POKE204@,P1
+1 :rem 92
15548 EF C1s="% " THEN LY=LY+SP:C3$S=C1S :POKE2049,P1
+1 s:rem 58
15560 IF ClS="L" THEN LX=LX-SP:C3S=C1$ :POKE2040,P1l
:rem 254

207
Ls) Arcade Games

15580 LE Clsars.- THEN : POKE204@,$ Pl


LX=LX+SP:C3$=C1
:rem 237
15606 IF ClS="1" THEN SP=SP-1:C1S=C3$:FC=FC-1L:IFFC
<1 THEN FC=1 :rem 90
15628 Lf cls="2" THEN SP=SP+1:C1S$=C3$:FC=FC+1:IFFC
>5 THEN FC=5 :rem 99
15630 TS=TS+SP :rem 88
15700 POKEW, 33:POKEH,F1(FC):POKEL,F2(FC) :rem 118
158980 GOSUB 17882 :rem 118
16800 POKEV ,LX:POKEV+1, LY :rem 56
16190 GOTO 15580 :rem 44
16908 : :rem 58
16919 REM CHECK STATUS OF CAR :rem 146
16920 REM UPDATE TIME,SPEED, SCORE :rem 29
16939 REM UPDATE SECTION OF TRACK :rem 2981
16948 : :rem 62
17008 IF PEEK(V+31)AND1=1THEN GOSUB1890@ :rem 252
17658 IF LY<19@ AND LX>198@ AND LP=8 THEN LP=1:SB=1
: LC=LC+1 :rem 144
17066 IF LY>180 THEN LP=@ :rem 65
171986 IF LX<6 THEN GOSUB 198000 :rem 71
17200 RETURN :rem 218
17988 : :rem 59
17919 REM EXPLOSION SEQUENCE :rem @
17920 : :rem 61
18000 POKEV+39,14:POKE2049 ,P1+2 :rem 223
18019 FOR I=1 TO 158:NEXT s:rem 74
18015 POKEW, 32: POKEW, 129 :rem 158
18020 POKEV+39,7:POKE294@, P1+3 :rem 180
18830 FOR I=l1 TO 200:NEXT srem 72
18840 POKEV+39,2:POKE204@, P1+4 :rem 178
18050 FOR I=l TO 308:NEXT :rem 75
18060 POKE20490, P1+3 :rem 255
18070 FORI=1 TO 200:NEXT :rem 76
18880 POKE29049, P1+2 :rem @
18898 FORI=1 TO 158:NEXT :rem 82
18100 LX=25 : LY=204: SP=1:C1S$="":C3S="":SB=0:LP=0:LC
=9 :TS=0 :rem 234
18110 POKEV+39, 1:POKE2040, Pl : POKEV, LX: POKEV+1, LY
:rem 203
18120 POKEV+31 ,@:FC=1 :rem 157
18140 RETURN :rem 222
18982 : :rem 60
18919 REM DISPLAY STATS ON THE RACE :rem 37
18929 : P :rem 62
19888 PRINT {HOME }":POKEW, 32:I1F SB=8 THEN TP=8:GOT
019828 s:rem 169
19818 TP=INT((TS*(100/TI))*LC) :rem 161
19820 PRINT TAB(28)"TOTAL PTs" :rem 218

208
Arcade Games 5

19825 PRINT TAB(28) "{7 SPACES}{UP}" zrem 245


19838 PRINT TAB(28) TP :rem 192
19848 PRINT"{2 DOWN}" TAB(28) "TIME" :rem 246
19858 PRINT TAB(29) TIS :rem 224
19868 PRINT"{2 DOWN}" TAB(28) "LAPS" :rem 249
19865 PRINTTAB(28) "{6 SPACES}{UP}" :rem 249
19978 PRINTTAB(28) LC srem 175
19875 PRINT"{2 DOWN}" TAB(28) "TIME/LAP" :rem 10
19877 IF LC=98 THEN LC=1 :rem 191
198980 PRINT TAB(28) "{6 SPACES}{UP}" :rem 246
19885 PRINT TAB(28) INT(TI/6@)/LC :rem 82
19896 LX=25 : LY=204:SP=1:C3S=""sC1S="":FC=1:SB=9
srem 93
191068 PRINT"{3 DOWN}" TAB(28)"PRESS {RVS}SPACE
{OFF }" s:rem 114
19119 PRINTTAB(33) "TO" :rem 254
i9iis PRINT TAB(28) "START CLOCK" :rem 94
19129 GET KH$:IF KHS$="" THEN 19120 :rem 193
19136 PRINT"{3 UP}" TAB(28) "{1l1 SPACES}" :rem 88
19133 PRINT TAB(33) "{2 SPACES}" :rem 96
19135 PRINT TAB(28) "{1l SPACES}" :rem 162
19200 TIS="G09G09G":TP=9: LP=9: LC=0: TS=0 s:rem 112
19808 RETURN :rem 226
19968 : :rem 61
19918 REM TRACK ONE :rem 63
19928 : :rem 63
23906 PRINT"K2 +JUCCCCCCCIK6 +JUCCCCCCCIK2 +3
srem 3
29018 PRINT"k2 +3B{7 SPACES}BK6 +]B{7 SPACES
}B
K2 +3 :rem 38
28828 PRINT"K2 +3B{7 SPACES}BK6 +]3B{7 SPACES}B
K2 +3 as iG a :rem 39
20030 PRINT"k2 +JB{2 SPACES}UCI{2 SPACES}BK6 +]B
{2 SPACES}UCI{2 SPACESJBK2 +] :rem 234
29940 PRINT"£2 +3B{2 SPACES }BK+J9B{ 2 SPACES }BK6 +]9B
{2 SPACES}BkK+JB{2 SPACES}Bk2 +] :rem 125
269508 PRINT"K2 +3B{2 SPACES}BK+3B{2 SPACES }JCCCccc
K{2 SPACES}BK+JB{2 SPACES}BK2 +} :rem 61
28060 PRINT"K2 +3B{2 SPACES }BK+9B{12 SPACES }BE+]B
{2 SPACES}BK2 +] :rem 23
20070 PRINT"£2 +JB{2 SPACES}BK+}B{12 SPACES }BE+]}B
{2 SPACES}BK2 +] :rem 24
20080 PRINT"k2 +¥B{2 SPACES }Bk +3 JCCCCCCCCCCCCKEK +49B
{2 SPACES}BK2 +] zrem 78
296908 PRINT"£2 +¥B{2 SPACES }Bk +} UCCCCCCCCCCCCCCK
{2 SPACES}BkK2 +] zrem 120
28190 PRINT "2 +4B{2 SPACES }BKk+3B{17 SPACES }BK2 +]
:rem 232

209
5 Arcade Games

20116 PRINT"£2 +9B{2 SPACES}BE+3B{17 SPACES}BE2 +3


:rem 233
20120 PRINT"K2 +3B{2 SPACES}BK+JB{3 SPACES }UCCCCCC
CCCCCCCKK2 +3 2 - ‘ grem 175
20130 PRINT"k2 +3B{2 SPACES}BK+3B{3 SPACES}JCCCCCC
eccccccik2? +3 _— < :rem 163
28148 PRINT"Kk2 +3B{2 SPACES}BK+3B{17 SPACES}BK2 +3
ry a :rem 236
280156 PRINT"K2 +3B{2 SPACES}BK+3B{17 SPACES}BK2 +]
% are. @ :rem 237
28168 PRINT"K2 +3B{2 SPACES }Bk+}ICCCCCCCCCccccccl
{2 SPACES}BK2 +3 vi :rem 105
20178 PRINT"£2 +3B{2 SPACES}BK16 +3B{2 SPACES}B
K2 +3 a "7 7) :rem 169
28188 PRINT"k2 +3B{2 SPACES}Bk16 +}B{2 SPACES}B
K2 +) < :rem 179
28198 PRINT"CCK{2 SPACES}JI£15 +3B{2 SPACES}BE2 +]
aa a :rem 25
20208 PRINT"{6 SPACES}JIK14 +]3B{2 SPACES}BK2 +]
PS oJ ~ srem 26
20210 PRINT"CCCI{3 SPACES }uccccccccccccccK
{2 SPACES}JBK2 +] :rem 3
28228 PRINT"K3 +3J1I{2@ SPACES}BK2 +3 :rem 56
20230 PRINT"£4 +J7ICCccccccececcecccccccKK2 +9
:rem 91
20248 PRINT"£28 +3{UP}" :rem 138
20478 RETURN :rem 221

210
Haunted Mansion
Calvin Overhulser
64 Translation by Kevin Martin

Rescuing cats from a witch’s clutches is only part of this colorful


and imaginative game. Side-stepping ghosts and bats and evading
evil spirits complete the action in this joystick-controlled
adventure.

An evil witch has captured some friendly neighborhood cats


and taken them to her haunted mansion, where she plans to
turn them into “witch cats.” The witch’s mansion is a maze of
corridors, and she has hidden the cats in nooks and crannies
throughout the house. Even scarier, she has ghosts, bats, and
evil spirits occupying the mansion. Your goal is to rescue the
cats while avoiding the witch’s minions.

Don’t Drop That Cat!


Once you've typed in and saved ‘“Haunted Mansion” (make
sure you read and use “The Automatic Proofreader” found in
Appendix C to enter an error-free version), load and run it.
There’s a short delay while the custom characters are being
created. Instructions then display.
After selecting one of six skill levels, from easy (1) to
difficult (6), use your joystick (plugged into port 2) to maneu-
ver through the maze. When you reach one of the cats, return
with it to the bottom row of the maze, the only safe spot for
felines in this game. If you run into a ghost or bat on your re-
turn, you'll drop the cat and lose points. The frightened cat
will then jump to another random location in the maze. The
ghosts and bats aren’t deadly. They’re just as scared of you as
you are of them. Bumping into one eliminates it, but you lose
points. At the higher skill levels you'll have to sacrifice points
by deliberately running into the ghosts or bats to clear a path
so that you can get to a cat.
You'll notice that the cat catcher changes color from time
to time. When he’s searching for a cat, he’s blue. After
bumping into a ghost or bat, however, he momentarily turns
white (scared himself!). When he’s got a cat under his arm, he
changes to yellow to let you know he needs to get rid of it.

211
5 Arcade Games

And if a spirit manages to grab him, he’s purple. There are


also sound effects that give you information, ranging from the
the background sound, which begins once the maze is drawn,
to the distressing beeps, which occur when an evil spirit
touches your character.
Your most dangerous enemies are the moving evil spirits,
which look like disembodied faces. If you run into one of
them, there’s no second chance—the game ends, and your fi-
nal score, skill level, and round are shown. You'll be given the
option to play another game and choose a skill level. The
higher skill levels award more points but are more difficult.

Building the Mansion


I’ve included several REMs for the major subroutines to show
how the program is logically constructed. The main loop is in
lines 210-240. Lines 300-307 are used to update the position
of the cat saver (that’s you) and the selected evil spirit. The
ON-GOSUB in line 215 for the cat saver and line 630 for the
randomly chosen evil spirit allows the new location for either
to be calculated using the same subroutines.
The joystick is read with a standard routine in lines 210-
214. Location 56320 (for a joystick in port 2) is PEEKed and
the value ANDed with 15. Depending on the result, one of
several lines is called by line 215.
If you've already looked at the game, you’ve probably no-
ticed the custom characters. The first 64 standard characters
are copied by line 110 from ROM (Read Only Memory) into
RAM (Random Access Memory). Lines 130-150 then READ
and POKE the DATA statements (lines 10000-10190) for the
custom characters into RAM locations. Line 100 lowers the top
of BASIC memory to protect the custom character set from be-
ing erased. Table 1 lists the custom characters and their screen
POKE codes.
Note that there is a custom character ‘‘space’’ (screen code
62) in addition to the normal space (screen code 32). This al-
lows the same character to be displayed on the screen with
both codes, but lets the program tell the difference. The nor-
mal space is used inside the mansion, and the custom charac-
ter space is used outside. This keeps the bats, ghosts, and evil
spirits from appearing in the sky, since they can be placed
only in a location containing a normal space.

212
Arcade Games 5

Table 1. Custom Characters

Screen Original Custom


Code Character Character
27 [ Witch
28 £ Witch
29 ] Witch
30 t Witch
31 « Evil spirit
so # Solid block
36 $ Moon
af % Moon
38 & Moon
39 ‘ Moon
40 ( Moon
41 ( Moon
42 . Moon
43 ar Moon
44 , Roof
45 3 Roof
58 ; Cat saver
59 F Ghost
60 < Cat
61 = Bat
62 > Space (outside house)

The game screen is built in lines 1000-1095, and the


maze is generated in lines 1200-1292. (Note that the al-
gorithm used to create the maze is Charles Bond’s excellent
BASIC version. Refer to COMPUTE)’s First Book of Commodore
64 Games for the article that explains the algorithm. It also in-
cludes a machine language version, which draws the maze at
incredible speed.)
Variable names, listed in Table 2, are used more than once
where possible to conserve memory. This isn’t crucial when
you're programming on the 64, but it is a good practice to get
into, especially if you program occasionally on computers with
smaller amounts of RAM.

213
% Arcade Games

Table 2. Program Variable Names

Variable Description
A Variable in READ statements.
I Miscellaneous counters in FOR/NEXT loops +
random numbers.
Random number.
Counter in FOR/NEXT loops.
Constant=0.
Constant= 1.
Constant= 40.
Volume (54296).
x<0V0OZ— Counter in FOR/NEXT loops + random
numbers.
N Current location to be updated in subroutines
300-307.
Skill level.
String for GET statements.
Flag to place character.
Cat counter.
Cat flag CF=4 means carrying cat.
Current location for cat saver.
Difference between color memory and screen
memory.
Dead flag.
Constant=32.
Joystick value.
Number of current round.
Screen RAM location.
Current score.
Sound High (54273).
Sound Low (54272).
Temporary storage for CL or A(I) during
update.
WL Constant=35.
A(0)-A(3) Variables for maze generator.
A(1)-A(13) Locations of evil spirits.

- 214
|
f\

ee “ESE
\J
/ } \ *7

\ For mistake-proof program entryve sure to read “The Automatic Proofreader,”” Appendix C.
196 POKE52 ,48 :POKE56,48:CLR srem 70
182 POKE53 280 ,@:POKE53281,0 :rem 232
185 PRINT"{CLR}K79{3 DOWN}********e }HAUNTED
{ RVS %*e*
{2 SPACES }MANSION{OFF}*******#*eke". srem 180
187 PRINT"{13 DOWN}{9 SPACES}REDEFINING{2 SPACES }c
HARACTERS" srem 1
188 POKE56334, PEEK( 56334) AND254:POKE1,PEEK(1)AND25
1 :rem 186
118 FORI=@0TO511 :POKE12288+1, PEEK(53248+1) :NEXT
srem 224
115 POKE1 , PEEK(1)O0R4:POKE56334, PEEK(56334)OR1
srem 134
130 FORI=12288+35*8TO12288+45*8+7
: READA: POKEIL,A:NE
XT :rem 42
149 FORI=12288+27*8T0O12288+31*8+7
: READA: POKEL,A:NE
Bak srem 39
158 FORI=12288+58*8T0O12288+62*8+7
: READA: POKEI,A:NE
XT s:rem
48
SC=1924 srem 50
CM=54272 s:rem 106
SH=54273 : SL=54272 : V=54296 : WF=54276 :0=0: P=1:Q=4
@:DIMA(13):POKEV,15 srem 254
POKESL+5,17:POKESL+6, 241 srem 139
GOSUB89@ s:rem 175
GOSUB99G srem 181
POKE53272, (PEEK(53272)AND24@)+12 :rem 183
GOSUB19@@ : RN=RN+1 srem 241
CL=SC+859 srem 197
JP=15-PEEK(5632@)AND15:
IFJP=8THENJ P=3 :GOTO215
:rem 202
IFJ P=2THENJP=5 :GOTO215 srem 114
IFJP=4THENJP=7 :GOTO215 srem 119
IFJ P=1THEN215 s:rem 244
JP=2 s:rem 169
TL=CL: Z=TL:ONJPGOSUB3@1 ,3909,383,300,3905,308,30
7,390 :rem 66
CL=Z:POKEV,15:POKESH,
58: POKEWF, 17 : GOSUB409 : POK
EWF,16 s:rem 33
IFDFTHEN5@@ s:rem 118
POKETL, 32: POKECL, 58 : POKECM+CL, 3+CF :rem 76
GOSUB7@@ : LIFCC=1 THENFORX=1T01599 :NEXT : GOTO17@
srem 52
GOSUB68@ : IFDFTHEN59@ :rem 199
GOTO218 :rem 98
RETURN s:rem 115
Z=Z-Q: RETURN :rem 29

215
LS Arcade Games

Z=Z+P : RETURN :rem 28


Z=Z+Q: RETURN :rem 31
Z=Z-P : RETURN :rem 34
REM COLLISION CHECK :rem 130
IFPEEK (CL )=44ORPEEK (CL)=450RPEEK (CL)=35THENCL=
TL: RETURN :rem 39
IFCFANDCL<SC+873ANDCL>SC+845THEN2008 :rem 167
IFCFANDPEEK (CL) =68THENCL=TL: RETURN :rem 221
IFPEEK (CL) =6@THENCF=4 : POKEWF , 33: FORI=1TO100:NE
XT: RETURN :rem 49
IFPEEK (CL)=61ORPEEK (CL) =59THEN1899 :rem 23
IFPEEK(CL)=31THEN190@2 :rem 201
RETURN :rem 119
REM GOTCHA! :rem 80
PRINT"{CLR}£73{DOWN}{12 RIGHT }ANOTHER VICTIM!"
:rem 255
POKE53272,21 :rem 88
PRINT"{DOWN}{13 RIGHT}SKILL LEVEL"AA :rem 112
PRINT" {DOWN}{11 RIGHT}ROUND"RN"“SCORE"SR:rem 78
PRINT" {DOWN}{1@ RIGHT}PLAY AGAIN?{2 SPACES}
{RVS}Y{OFF} OR {RVS}N{OFF}" :rem 2
GETAS : IFAS=""THEN55@ :rem 87
IFAS="Y"THENCF=@ : GOTO57@ :rem 157
IFAS<>"N"THEN55@ :rem 162
SYS2048 :rem 1989
RN=8 :SR=0 :DF=9 :rem 38
GOTO165 :rem 118
REM MOVE SPIRITS :rem 223
I=INT(RND(1)* (AA*2) )+1 :rem 116
TL=A(1I):Z=TL: POKEA(I),32 :rem 150
ONINT(RND(1)*4)+1GOSUB3@1,383,305,307 :rem 242
IFZ>SC+845ANDZ <SC+873 THEN66@2 :rem 190
IFPEEK(Z )=58THEN19@@ :rem 156
IFPEEK(Z )=32THENA(1)=Z :rem 61
POKEA(I),31:POKECM+A(I),4:RETURN :rem 175
PRINT" {HOME}{23 DOWN}{18 RIGHT}{WHT}ROUND"RN"S
CORE"SR"{LEFT} ";:RETURN :rem 236
PRINT"{CLR}YOU WILL ENTER A WITCH'S HAUNTED HO
USES "> :rem 223
PRINT" { DOWN } THE WITCH IS AWAY, FLYING ON HER B
ROOM. "; :rem 7
PRINT" {DOWN}SHE HAS CAPTURED YELLOW CATS AND Ww
ILL{3 SPACES}"; :rem 221
PRINT" {DOWN}TURN THEM INTO WITCH CATS UNLESS Y
oU{4 SPACES}{DOWN}RESCUE THEM." :rem 231
PRINT" { DOWN }GUIDE YOURSELF WITH A JOYSTICK. PI
CK -UP 2 "}; :rem 134
832 PRINT { DOWN JONE CAT AT A TIME. BRING IT TO THE
{6 SPACES}"; :rem 58

216
Arcade Games
ee eh

835 PRINT"{DOWN}BOTTOM ROW.{2 SPACES}WHILE CARRYIN


G A CAT, YOU{2 SPACES}"; :rem 218
837 PRINT"{DOWN}WILL TURN YELLOW.{2 SPACES}YOU CAN
PICK UP ONLY "; :rem 39
848 PRINT"{DOWN}ONE CAT AT A TIME, AND YOU GET POI
NTS{3 SPACES}"; :rem 49
845 PRINT"{DOWN}FOR EACH CAT YOU SAVE. WHEN YOU SA
VE 18 {DOWN}CATS, YOU GET A NEW HOUSE."
srem 142
847 PRINT: PRINT"{13 SPACES}PRESS ANY KEY";
:rem 212
858 GETAS : I FAS=""THEN85@ :rem 93
855 PRINT"{CLR}IF YOU RUN INTO A BAT OR GHOST, YOU
'LL{2 SPACES}"; :rem 34
868 PRINT"{DOWN}JUMP IN FEAR, DROP ANY CAT YOU ARE
{6 SPACES}{DOWN}CARRYING AND LOSE POINTS."
srem 232
865 PRINT"{DOWN}THE HOUSE IS ALSO°HAUNTED BY EVIL
{7 SPACES}"; :rem 196
866 PRINT"{DOWN}SPIRITS FLOATING ALONG THE HALLWAY
sat" :rem 237
867 PRINT" {DOWN}IF YOU TOUCH A SPIRIT, YOU LOSE TH
E{5 SPACES}{DOWN}GAME!" :rem 59
868 PRINT"{DOWN}(BOTTOM ROW IS SAFE) " :rem 97
8708 PRINT"{YEL}{DOWN}HIGHER SKILL LEVELS SCORE MOR
E POINTS{3 SPACES}{DOWN}BUT ARE HARDER.{OFF}"
srem 246
898 RETURN srem 129
998 PRINT"K69{DOWN}JENTER SKILL LEVEL 1-6" :rem 29
920 GETAS :1FAS=""THEN920 :rem 89
936 AA=VAL(AS) :IFAA<1ORAA>6THEN920 :rem 13
948 RETURN :rem 125
1029 POKE53280,0:POKE53281,0:PRINT"{CLR}" :rem 180
10983 PRINT">{YEL}>.>.>>>>>>>>>>>2>>{BLU}-,
{YEL}>.>
SS ey oo See s:rem 120
1005 PRINT">>>>>>>.>>.>>>>>>>{BLU}-##, {YEL}>.>>S%>
ESD >> doa tt :rem 99
1019 PRINT">>>>. >>>>>>>>>>.>{BLU}-####, [YEL}>>&([£)
‘SU >i > 25 :rem 136
1015 PRINT ">>>>>>>.>>>2>>>>{BLU}-######, {YEL}>(]T)
+ (55402 >>> srem 95
1920 PRINT">>>>>>>>>>.>>>>{BLU} -########, [YEL} >*4>
2 >>>>>>>>>> "es s:rem 258
1025 PRINT">>>>>.>>>>>>>>{BLU} -#######444, [YEL} >>>
Sess ns z:rem 224
1032 PRINT ">>>>>>>>>>>>> {BLU} —HHRREREREEEE {YEL}>>
SILO > Sat srem 198
1035 PRINT">>>. >>>>>.>>{BLU} -####H#eH HHH HHH, [YEL}>
Bio >is ass z:rem 191

217
Arcade Games

PRINT">>.>>>>>>>>{
BLU} -####4####4#######, {YEL}
>>> LO>> >> >>" :rem 75
PRINT">>>>>>>>>>{ BLU} -##### Fs Fee este eee?,
{WHT}>>>>>>>>>>"; :rem 161
PRINT">>>>>>>>>{ BLU} -####4#### 828222 et e222,
{WHT }>>>>>>>>>"3 :rem 103
PRINT">>>>>>>>{ BLU} -#### see sees tee ee ee eez?,
{WHT}>>>>>>>>"3 :rem 54
PRINT">>>>>>>{
BLU) -##### eee ee ees tet ee eeeze?,
{WHT}>>>>>>>"; :rem 252
PRINT">>>>>>{BLU} -##### tt testes eeeeeeeeze222,
{WHT }>>>>>>"; :rem 203
PRINT">>>>>{BLU}
-###### sess see ses ee esses ee eee
{WHT}>>>>>>"; :rem 168
PRINT">>>>> {BLU} ######FEFEFEEEEER ESE SESE SE TEE
{WHT}>>>>>>"; PELLET APTS “~——S¥em
154
PRINT">>>>>{
BLU} ##### ee ee sess sss see sees eeeee?
{WHT} >>>>>>"; :rem 159
PRINT">>>>>{
BLU} ##### sees ess sss sees eee eee eee?
{WHT }>>>>>>"; :rem 155
PRINT">>>>>{
BLU} ###### ee esse sss esse sees eeeee?
{WHT }>>>>>>"; :rem 157
PRINT">>>>>{ BLU} #####e sees esse se eeeeeeeeesese
{WHT}>>>>>>"; :rem 158
PRINT">>>>>{ BLU} #####e ee hess sss eesesesesesese
{WHT}>>>>>>"3 :rem 159
PRINT">>>>>{ BLU} ##### FHF Fsess sss sess ese sees ee
{WHT}>>>>>>"; :rem 160
REM BUILD MAZE :rem 68
A(@)=2:A(1)=-80:A(2)=-2:A(3)=80:WL=35:HL=32:A
=SC+846 :rem 19
POKEA,4 :rem 148
J=INT(RND(1)*4) :X=J :rem 101
B=A+A(J) : IFPEEK(B)=WLTHENPOKEB,J
:POKEA+A(J)/2
,HL:A=B:GOTO1220 :rem 8
J=(J+1)*-(J<3) : IFJ<>XTHEN123@ :rem 128
J=PEEK(A) :POKEA,HL: IFJ< 4THENA=A-A(J)
:GOTO122@
:rem 34
FORI=SC+216TOSC+856STEP
49 : POKEI , 32: POKEI+7, 32
: NEXT :rem 152
FORI=SC+14@TOSC+860STEP4@
: POKEI, 32: NEXT
s:rem 235
FORI=SC+372TOSC+852STEP4@ : POKEIL, 32: POKEI+15, 3
2:NEXT :rem 200
FORI=SC+489TOSC+849STEP4@ : POKEI , 32: POKEI+21,3
2:NEXT :rem 213
FORI=SC+372TOSC+387 : POKEIL, 32:NEXT s:rem 89
FORI=SC+489TOSC+5194:POKEI , 32:NEXT :rem 87
FORI=SC+687TOSC+712:POKEI, 32: POKEI+16@, 32 :NEX
ah :rem 97
Arcade Games 5

1388 REM PLACE GAME CHARACTERS :rem 7


1318 REMPLACE GHOSTS trem 232
1328 FORI=PTO3*AA srem 5
1338 X=INT (RND(1)*688)+SC+4@ srem 22
1348 BL=9 : GOSUB1799 : IFBLTHEN1339 :rem 146
1358 POKEX , 59: POKECM+X,1:NEXT srem 60
1468 REMPLACE BATS :rem 56
1428 FORI=PTO3*AA s:rem 6
1439 X=INT(RND(1)*688)+SC+4@ s:rem 23
1446 BL=9 :GOSUB179@9 : I FBLTHEN143@ :rem 148
1458 POKEX , 61 : POKECM+X,5:NEXT :rem 58
1506 REMPLACE CATS s:rem 58
1520 CC=11:FORI=PTO19 s:rem 232
1538 X=INT (RND(1)*680)+SC+49 s:rem 24
1548 BL=9 : GOSUB1799 : IFBLTHEN153@ srem 1590
1558 POKEX, 68 : POKECM+X, 7 :NEXT :rem 60
1696 REMPLACE SPIRITS srem 62
1629 FORI=PTOAA* 2 s:rem 7
1638 X=INT(RND(1)*688)+SC+40 :rem 25
1646 IFPEEK(X)<>32THEN1634 :rem @
1658 POKEX, RETURN
31:POKECM+X,4:A(1I)=X:NE XT:
srem 252
1780 <> 32ANDPEEK(
IF (PEEK(X)<>32)OR(PEEK (X+P)X+P) <>
35) THENBL=1 z:rem 152
1719 IF ( PEEK( X-P) <> 32ANDPEE <>35)OR(
K(X- PEEK(X+Q)
P)
<>32ANDPEEK ( X+Q) <>35 ) THENBL=1 :rem 24
1728 IF ( PEEK(X-Q) <> 32ANDPEEK( THENBL=1
<>35)X-Q)
:rem 1
17398 RETURN :rem 171
1800 REM SCARED! :rem 128
1819 IFCF=OTHEN184@ srem 196
1820 X=INT(RND(1)*680)+SC+40 :rem 26
1838 IFPEEK(X)<>32THEN1829 s:rem 2
1835 POKEX , 69 : POKECM+X, 7:CF=0: SR=SR-2*AAf2:IFSR<OT
HENSR=O srem 205
1849 POKETL, 32 : POKECL, 58: POKECL+(CM, 1 :rem 206
1843 FORI=15T : POKESL,
O1ST190: POKESH,
EP-1199 : POKEWF
,33:POKEV,I1 :rem 99
1844 FORII=1T025:NEXTII,I1I :rem 66
1845 FORI=1T0400 :NEXT: POKEWF', 32 :rem 183
1858 TL=CL: Z=TL:ONINT(RND(1)*4)+1GOSUB301,303,305,
307 :rem 62
1860 CL=Z:SR=SR-AAf 2: IFSR<OTHENSR=O :rem 78
1870 GOTO48G srem 157
1988 REM GOTCHA! SOUND srem 14
1985 POKETL, 32: POKECL, 58: POKECM+CL, 4:DF=1 srem 5
1919 POKESL,19@ :FORI=1T04:POKEWF, 17 :POKESH, 25 :FORX
=1T0O15@:NEXT: POKEWF, 16 srem 104
VOLS FORX=1T075 :NEXT :rem 1

219
Arcade Games

1913 IFI=lLORI=3THENPOKECL, 31 :GOTO1920 :rem 42


1914 POKECL, 58 :rem 38
1928 POKESL, @: FORX=1T0200 :NEXT : NEXT : FORX=1 T0500 :NE
XT: RETURN :rem 182
2888 REM LINE UP SAVED CAT :rem 190
2018 X=SC+985 :POKEX-CC, 6@ : POKECM+X-CC, 7:CC=CC-1:SR
=SR+10*AAT2:CF=0 :rem 16
2820 POKEWF, 33: FORI=1TO5@ :NEXT : RETURN :rem 149
18800 DATA255,255,255,255,255,255,255,255 +:rem 31
19810 DATA®D ,2@,0,0,8,15,63,255 :rem 155
19015 DATA®D ,@,0,0,8,248,252,255 :rem @
18820 OATAL 1.3 ais sister :rem 229
180830 DATA128,128,192,192,224,224,224,224 :rem 16
190408 DATAT a7 oleltedese ken :rem 231
18058 DATA224, 224,224, 224,192,192,128,128 :rem 18
19860 DATA255,63,15,0,0,0,8,@ :rem 168
18878 DATA255,252,240,0,8,8,8,@ :rem l
18880 DATA1 28,192, 224,248, 248,252,254,255 :rem 26
108908 DATA] ,3,7,15,31,63,127,255 :rem 76
18180 DATA255,255,255,255, 250, 246,244,224 :rem 21
18118 DATA255,255,191,63,15,15,7,63 :rem 233
18128 DATA24@, 249, 240,228,8,252,255,255 :rem 170
16130 DATA255,255,127,35,1,112,63,255 :rem 71
18140 DATA®D,102,8,24,8,08, 28,8 :rem 151
18158 DATA56,84,56,16,124,186,48,108 :rem 33
18168 DATA62, 42,62, 28, 28, 28,680,128 :rem 179
180178 DATA4@,124,85,125,57,57,61,127 :rem 32
18188 DATA®, 16,124,254, 214,138,8,8 :rem 156
18198 DATAG,8,2,0,8,8,0,@ :rem 261
28808 JP=15-PEEK(56320)AND15 :rem ll
28618 PRINTJP :GOTO20800 :rem 127

220
re
Machine
Language
Games
CUT-OFF!
Tom R. Halfhill

“CUT-OFF!” is a fast-paced, two-player game programmed entirely


in machine language. With ten levels of difficulty—ranging in speed
from moderately slow to impossibly fast—the game requires two
joysticks.
Over the years, some computer games have become classics.
Usually they are simple in concept, universal in appeal, yet
general enough to be translatable for almost any computer.
Some examples are Pong, the granddaddy of all videogames,
Breakout, Lunar Lander, and the venerable Space Invaders. For
legal reasons they may be disguised by different names, but
there probably isn’t a computer or videogame machine any-
where for which some version of these all-time favorites isn’t
available.
Another classic game is Blockade. Again, it goes by dif-
ferent names (sometimes Surround), but the basic concept re-
mains the same. Two players steer a moving line around the
screen, trying to head off each other, or force the opposing
player to crash into a wall, or back up over an existing trail.
This concept dates back to the early days of videogames. In
fact, the very first videogame I ever played was a Blockade-
style game. It was during the mid-1970s, and a friend and I
encountered the machine in a dimly lit cafe. By today’s stan-
dards the game was downright primitive. No color, crude
sound effects, and slow action. Yet we had never played any-
thing like it before. (We thought it would never catch on, be-
cause it cost 25 cents per play at a time when a quarter bought
you three plays on most pinball machines.)
Years later, the basic concept of Blockade was revived and
updated in the 1982 film TRON. In this Walt Disney produc-
tion, humans trapped inside a bizarre computer world were
forced to become gladiators on “light cycles’’—space-age
motorcycles that left walls in their wakes, counterparts of the
lengthening trails in Blockade.
That's the story behind the latest incarnation of this popu-
lar game, now dubbed ‘“CUT-OFF!”. It preserves all the tra-
ditional concepts and includes color, sound, and the broad

223
& Machine Language Games

range of speed levels possible only in a program written en-


tirely in machine language.

Typing CUT-OFF!
Pure machine language programs are usually more difficult to
enter than BASIC programs, because they consist of seemingly
endless streams of numbers. To make typing CUT-OFF! easier,
we've listed the programs in MLX format.
You may already be familiar with MLX if you've typed in
some of the machine language programs published in other
COMPUTE! books, or in COMPUTE! publications such as
COMPUTE! magazine or COMPUTE!’s Gazette magazine. If
you're not familiar with MLX, it’s a utility designed by Charles
Brannon to make typing errors almost impossible. To learn
how to use MLX, see “Using the Machine Language Editor:
MLX” in Appendix D at the back of this book. If you've pre-
viously typed in MLX, you can use it again for CUT-OFF!
Here’s the information you'll need to enter CUT-OFF!:
Starting Address—49152 3
Ending address—50663 3
To run, enter SYS 49152 3
To stop, press RUN/STOP-RESTORE 3
Remember, to load a machine language program from
disk or tape, you must use this special form of the LOAD
command:
LOAD “filename”,8,1 (for disk)
LOAD“ filename”,1,1 (for tape)
If you forget to append the ,1 to the command, the pro-
gram loads into the wrong area of memory and will not work.

Youngsters to Superhumans
After you enter the SYS 49152 command, the game screen ap-
pears instantly. (One of the best things about machine lan-
guage is that you don’t have to wait around for programs to
initialize.)
The opening screen allows you to select a skill level rang-
ing from 0 (the slowest speed, suitable for youngsters) to 9
(recommended for superhumans only). The skill levels are
spaced equally apart, so you might want to start at 3 or 4. The
level you select remains the same for the entire game. To
change levels in the middle of a game, press RUN/STOP-

224
Machine Language &

RESTORE and restart the program with the SYS command.


(Of course, this cancels the game in progress.)
To choose a skill level, move the joystick plugged into
port 1 up or down. You'll see the number on the screen
change and wrap around if you go below 0 or above 9. To
lock in your choice and begin the game, press the fire button
of joystick 1.
The game starts with the players ready to crash head-on.
Joysticks 1 and 2 control the left and right players respectively.
To steer, move the joystick up, down, right, or left. Diagonal
motion is not allowed.
The joystick fire buttons toggle a pause feature. To freeze
the action, quickly press and release the button (either joystick
button works). This leaves you free to answer the phone or do
other things. To restart the action, press and release the button
again.

Heading Them Off at the Pass


There are four ways you can crash: hitting a wall, running into
the other player’s trail, crossing your own trail, or backing into
yourself by trying to reverse your direction.
After a crash, the surviving player is awarded points equal
to the number of segments in the crashed player’s trail. This
means that the longer the players last before crashing, the
more points are at stake. Thus, it’s possible to catch up even if
you're way behind.
Each time you crash, you lose one “life.” You start with
ten lives, and the game ends when one player runs out of
lives. After each crash, the screen updates the score and re-
minds you how many lives each player has left. To restart
each round, press the joystick fire button.
When the game is over, you get a chance to change the
skill level for the next game. Just to get a peek at how fast ma-
chine language can be, try a game at level 9. You'll be lucky if
you can make one turn before crashing into a wall. Yet even
this had to be slowed down with delay loops!

225
6 achine Language Games

C CUT-oFF! OW a
For easy entry of this machine language program, be sure to read “Using the Machine Lan-
guage Editor: MLX,” Appendix D.
49152 :032,200,193,876,0906,192,187
49158 :173,066,003,024,105,001,122
49164 :141,966,003,173,067,8083,2089
49178 :105,000,141,067,003,174,252
49176 :0608,003,032,145,195,169,116
49182 :801,141,065,003,032, 203,219
49188 :195,162,802,161,247, 201,236
49194 :032,248,032,032,154,195,215
492909 :032,119,197,032,215,194, 969
49286 :173,8068,8903,201,000, 240,227
49212 :083,173,869,003,201,000,077
49218 :240,076,032,190,192,032,060
49224 :074,196,076,0960,192,832,136
49230 :154,195,169,000,141,065,034
49236 :003,032,203,195,162,008,167
49242 :161,247,201,032,240,832,235
49248 :932,154,195,932,119,197 , 657
49254 :032,215,194,173,068,8003,019
49260 :201,000,240,032,173,069,855
49206 :003,201,000, 240,8025,032,183
49272 :198,192,032,074,196,076,112
49278 :006,192,032,154,195,173,119
49284 :001,224,045,900, 220,041,147
49290 :816,240,006,8976,006,192,162
49296 :076,251,196,173,001,228,037
49302 :045,000,220,041,816, 248, 289
49308 :246,162,258,032,145,195,162
49314 :173,001,220,045,000,228,853
49320 :041,016,208,246,173,881,085
49326 :220,045,000,220,041,9016,204
49332 :248,246,162,258,032,145,231
49338 :195,076,006,192,169,147, 203
49344 :032,210,255,169,015,141,246
49350 :033,208,169,805,141,832,0818
49356 :208,162,008,169,168,157,836
49362 :000,004,169,800,157,890,0628
49368 :216, 232,224,040, 208,241,897
49374 :162,060,169,160,157,192,0838
49380 :007,169,000,157,192,219,2984
49386 :232,224,048, 208,241,169,868
49392 :000,133,253,169,004,133,164
49398 :254,169,000,133,251,169,198
49404 :216,133,252,162,000,169,168
494198 :160,160,000,145,253,169,121
49416 :900,145,251,168,039,169,004

226 ¢
Machine Language Games &

49422 :160,145,253,169,800,145,118
49428 :251,024,165,253,195,948090 ,
49434 :133,253,165,254,185,008,168
49448 :133,254,024,165,251,195196 ,
49446 :949,133,251,165,252,195216 ,
49452 :600,1 252) 232; 33,
224, 925,142
49458 :2808,205,169,012,162,016,054
49464 :157,900,216,232,224,024,141
49478 :208,248,169,131,141,016207 ,
49476 :004,169,149,141,017,804949 ,
49482 :169,148,141,818,004,169211 ,
49488 :173,141,019,004,169,143,217
49494 :141,028,004,169,134,141,183
49588 :021,004,141,022,084,169,197
49506 :161,141,923,604,169,996990 ,
49512 :141,199, 217516950027 1417295
49518 :209,217,169,081,141,199,192
49524 :865,169,087,141,209,005229 ,
49538 :169,000,141,0966,003,141,1390
49536 :8607,8003,169,807,141,875,078
49542 :0903,169,011,141,974,903,023
49548 :169,299,141,079,003,169,133
49554 :805,141,071,003,169,199,222
495608 :141,8072,003,169,005,141,171
49566 :073,003,169,152,032 210,829
,
49572 :255,824,162,000,1600,007,004
49578 :8032,240,255,174,061,003,167
49584 :173,862,003,032,205,189,972
49599 :024,162,000,160,029,032,077
49596 :248,255,174,063,003,173,072
49682 :964,003,032,205,189,096,015
49608 :169,900,141,061,003,141,203
49614 :962,003,141,063,003,141,107
49628 :964,003,169,081,141,077,235
49626 :003,169,887,141,976,003,185
49632 :032,190,1927169,012,;162,213
49638 :009,157, 216, 232,224
240,028 ,
49644 :9308,208,248,162,909,157,026
49658 :064,217,232,224,930,208,193
49656 :248,141,163,217,162,900,155
49662 :189,171,194,240,006,157,187
49668 :249,004,232,208,245,162,9080
49674 :000,189,193,194, 240,006,064
49680 :157,097 232, 208,245
3,00 5,,168
49686 :169,948,141,060,003,141,072
49692 :163,005,162,100,032,145,123
49698 :195,173,001,220,041,015,167
49704 :201,014,240,033,201,9013,230
49718 :240,010,173,001,220,041,219

227
& Machine Language Games

49716 :016,240,063,076,638,194,159
49722 :173,060,003,056, 233,001,072
49728 :201,047,248,028,141,068,013
49734 :003,141,163,005,076,030,232
49740 :194,173,960,003,024,185,123
49746 :001,201,058,240,020,141,231
49752 :860,003,141,163,005,076,824
49758 :830,194,169,057,141,060, 233
49764 :003,141,163,005,8976,038, 906
49770 :194,169,048,141,860,803,209
49776 :141,163,905,8976,030,194, 209
49782 :173,001,228,041,016, 240,041
49788 :249,162,250,032,145,195,133
49794 :173,8068,003,056, 233,948,191
498090 :170,169,050,141,068,003,217
49806 :224,000,240,013,173,060,084
49812 :003,056,233,005,141,860,134
49818 :003,202,8076,142,194,032,835
49824 :190,192,169,010,141,9068,162
49830 :003,141,969,003,096,8013,235
49836 :015,8022,005,032,019,015,015
49842 :025,019,8020,089,003,811,90089
49848 :032,021,016,947,904,9015,063
49854 :023,014,8000,8020,015,032,838
49808 :003,008,015,015,019,085,005
49866 :032,019,011,909,012,012,041
49872 :032,012,005,022,005,012,049
49878 :000,173,08708,003,205,072,225
49884 :003,240,003,876,099,195,068
49899 :173,071,083,205,073,003,242
49896 :298,121,173,075,003,174,218
49992 :074,003,201,014,249,012,814
49988 :201,007,240,015,201,813,153
49914 :240,018,201,011,240,021,213
49920 :224,013,240,024,8076,099,164
49926 :195,224,011,248,017,076,001
49932 :899,195,224,014,240,8018,026
49938 :876,099,195,224,007, 248,091
49944 :903,976,099,195,173,061,119
49958 :003,024,109,066,003,141,1298
49956 :861,003,173,062,003,185,187
49962 :000,141,062,0903,173,067, 232
49968 :003,024,109,062,003,141,134
49974 :962,003,174,068,003, 202,054
49980 :142,068,003,173,063,8083, 890
49986 :024,109,066,003,141,0863,216
49992 :003,173,8064,9083,195,880,164
49998 :141,064,003,173,867,003,817
50004 :024,109,064,003,141,964, 233

"228
Machine Language Games &

59018 :003,174,869,003,202,142,171
58916 2969,0093,996,173,865,003,249
58822 :010,170,189,061,903,024, 047
59028 :109,966,093,157,961,003,251
58034 2189,962,003,195,090,157,118
58049 2962,903,173,867,903,924,196
500846 2125,062,003,157,062,003,026
560852 2174,965,003,189,068,003,122
58858 7056, 233,001,157,068,003,144
500604 :996,160,990, 200,208, 253,937
58878 :202,208, 248,096,174,065,119
58076 :9093,188,076,003,138,919,962
580882 :170,181,247,157,878,003,222
58088 2181, 248,157,071,003,152,212
50094 :129,247,181,248,024,1985,084
58100 :212,1 248, 224,002,
49, 298,199
58196 :008,169,006,129, 247,032,009
58112 3179,197,8096;169,002,129;137
59118 :247,032,170,197,096,174,090
59124 :965,8003,189,090,220,941,219
50138 :015,201,014, 240,018, 201,131
50136 :907,248,038,201,013,2408,187
50142 :058,201,011,249,078,189, 231
50148 :074,003,076,211,195,157,176
58154 :874,063,138,8010,1709,056,173
50160 :189,070,003,233,040,149,156
58166 :247,189,071,003,233,000, 221
5@172 :149,248,976,073,196,157,127
59178 :874,003,138,019,170,024,165
58184 :189,878,003,105,001,149,013
58190 :247,189,0871,003,105,000,117
50196 :149,248,076,073,196,157,151
50262 :074,003,138,010,170,024,189
58208 :189,970,003,1905,0408,149,076
58214 :247,189,071,003,105,000,141
582209 :149,248,876,073,196,157,175
56226 :074,003,138,010,170,056,245
56232 :189,078,003,233,001,149,189
50238 :247,189,071,903, 233,000,037
58244 :149,248,076,073,196,096,138
58250 :162,000,189, 219,196, 240,056
50256 :0@06,157,255,004, 232,208,174
56262 :245,162,000,189, 232,196,086
50268 :240,006,157,879,0 232,043
05,
58274 : 208,245, 162,000,189, 244,122
58289 :196,248,906,157,0817,006,214
5@286 :232,208,245,162,000,189,122
58292 :244,196,248,006,157,033,224
58298 2006, 232,208, 245,169,012, 226

229
& Machine Language Games

50304 :162,009,157,240, 216,232,120


50318 :224,0 30,
208, 248,162, 909, 247
50316 :157,064, 217,232,224, 830,040
50322 :208,248,162,801,157,008,162
50328 :218,232, 224,037, 208, 248,039
50334 :024,162,013,160,015,0832,052
50340 :240, 255,174,069, 003,169,950
50346 :000,032, 205,189,024,162,014
50352 :013,160,031 ,032
240, ,
255,139
50358 :174,068,803,169,008,032,116
50364 :205,189,173,001, 220,045, 253
58370 :000, 220,041, 016,
208, 246,157
50376 :173,001, 220,645, 900,228,091
50382 :041,0 16,
240, 246,162, 088,143
50388 :032,145,195,032,190,192230 ,
50394 :996,01 6,018,0 85,819, 819,135
50400 :032,002,021,020,820,015,878
50406 :014,000,0820,815, 032,083,858
50412 :015,014,920, 009,814, 021,873
58418 :005,000,012,009,022,0085,839
50424 :019,061,00¥,032,190,192230 ,
50430 :162,000,189,082,197 ,
248,180
50436 :006,157,000, 005,232, 208, 190
50442 :245,162,000,189,092,197,127
50448 :240,006,157,871,005 ,
232,215
50454 :208,245,169,d12,162,001,051
50468 :157, 240, 216, 232,224, 030, 193
58466 :208, 248,162,001, 157,064,106
50472 :217,232, 224,037,208, 248, 182
58478 :173,001, 220,045,000, 220,193
58484 :041,0 208, 246, 16,
162, 250, 207
58498 :032,145,195,173,001 ,
220,856
53496 :045,0080, 220,041,016, 240,114
58502 :246,162,250,032,145,195,0876
50508 :032,200,193,076,0086,192, 007
50514 :007,801,013,005,032,015,155
58520 :022,005,018, 000,816,018, 167
50526 :085,019,019,032,002,021,192
50532 :020,020,015,014, 032,020, 221
50538 :015,032,016,812, 001,025, 207
50544 :032,001,007,001,009,014,176
50550 :000,169,015 ,141
024, ,
212,167
50556 :169,129,141,004, 212,169,180
50562 :009,141,005, 212,169,180, 254
50568 :141,008,212,169,812,141,043
50574 :@01,212,169,015,141 ,
032, 209
59580 :208,162,080 ,032,1 45,195 ,
202
50586 :056,23 3,001, 201,000, 208,085
50592 :241,169,000,141,004 ,
212,159
230
Machine Language Games &

58598 2141,005, 212,896,169,808,029


59684 :141,024,212,169,016,141,197
59619 :805,212,169,128,141,006,071
59616 :212,169,010,162,000,024, 249
58622 :109,065,003,232,224,010,065
58628 2208, 247,141,001, 212,169,150
58634 :037,141,000, 212,169,033,026
59640 :141,904,212,174,960,9003,034
58646 :832,145,195,169,000,141,128
59652 :0@04,212,141,9005, 212,141,167
58658 :8906,212,096,013,013,013,967

YS

231
Astro-PANIC!
Charles Brannon

Written entirely in ultra-fast machine language, “‘Astro-PANIC!” is


an arcade-style space game with multicolored sprites and 15 frantic
levels of difficulty. Will you be the first human to make it to level 15?
Joystick required.
“ Astro-PANIC!” is a fast-paced, high-speed, all-machine-lan-
guage game. The object is to defend your cannon, maneuver-
ing it left and right as alien saucers dodge and dive in a
relentless attack.
Plug a joystick into port 2 to play. After loading from tape
or disk (see special instructions below), type SYS 49152 to run
the program. The screen clears to black with a gray score win-
dow at the bottom. Press the f7 function key to start the
action.

Swooping Saucers
Instantly, seven alien saucers begin to sweep about the screen.
The saucers keep moving in their current direction until they
hit a screen boundary, then rebound. Sometimes they change
speed. Meanwhile, you move your cannon left and right to
evade the erratic dives and swoops of the saucers. The slight-
est contact with an alien saucer spells destruction.
Fortunately, you have your super weapon, a laser/heat
ray/particle beam/thermonuclear cannon. Simply press the
trigger button on the joystick to unleash a bolt of this in-
credible power. The bolt continues until it hits a saucer,
atomizing it, or until it reaches the top of the screen. Hold
down the fire button to access the bolt’s automatic fire mode.
You can pause the game at any time by pressing SHIFT or
freeze it by depressing the SHIFT LOCK key. Press the SHIFT
LOCK a second time to continue the game.
Scoring varies from time to time. It does depend on the
saucer’s postion, but it’s not fixed. Sometimes you'll get a
large score for dematerializing a saucer near the top of the
screen, other times you'll be rewarded with many points if you
blast one nearer your cannon. If you’re concerned about a
high score (rather than just surviving), there’s just no rule for

232
Machine Language Games &

where or when to shoot. Your best bet is to simply destroy as


many as possible, as quickly as you can.
If you destroy all seven saucers, you advance to a new
screen. Each level (1-15) is faster than the previous one and is
indicated in the score window. Be warned—levels 10 and
above are manic!
You lose a cannon whenever a saucer collides with your
cannon. The game is over after you lose all three cannons to
the marauding saucers. The scoreboard keeps track of the high
score during the current session. Press f7 to start another
game. Watch the time, though: Some people don’t know when
to quit!

PANICking
Keep moving. It’s more important to protect your cannon than
to make that tricky shot. Dodge the aliens first, shoot later.
You won’t always want to hold down the fire button to repeat,
since sometimes a shot will be in the air when you’d rather
shoot the alien right above you. Keep an eye on the move-
ment of the saucers, so you can sometimes synchronize several
wipe-out shots. Watch for the edges of the screen. Aliens will
sometimes bounce off an edge right into you.

Typing the Program


To type Astro-PANIC!, use MLX, the Machine Language Edi-
tor, which virtually guarantees fool-proof entry of machine
language programs. You'll find a complete description, as well
as the MLX program itself, in Appendix D. (If you’ve pre-
viously typed in MLX, either for another machine language
game in this book, or for other programs in COMPUTE!’s Ga-
zette magazine or COMPUTE! magazine, you can use it again
for Astro-PANIC!.) Here’s the information you'll need to enter
Astro-PANIC! with MLX:
Starting address—49152
Ending address—50777
After you are finished typing, MLX will let you save the
program to tape or disk. To load Astro-PANIC!, enter
LOAD" filename’’,8,1 for disk, or LOAD“ filename’’,1,1 for tape.
SYS 49152 to begin.
During our in-house testing of Astro-PANIC!, no one ever
made it beyond level 12. We've since heard from two COM-
PUTE!’s Gazette readers who have made it to level 15 and
233
6 Viachine Language Games

beyond. The game seems to slow down somewhat at those


levels. It may be a moot point: Level 15 waits for the truly
dedicated saucer-smasher.
Keep a sharp eye for any strange-looking lights in the sky!
\
\\astro-PANIC!)
For easy entry of this machine language program, be sure to read “Using the Machine Lan-
guage Editor: MLX,” Appendix D.
49152 :876,911,193,120,169,127,184
49158 :141,9013,220,169,001,141,179
49164 :926,208,169,233,141,018,039
49178 :208,169,027,141,017, 208,020
49176 :169,936,141,920,003,169,050
49182 :192,141,021,003,088,096,059
49188 :173,9018,208,201,233,208,953
49194 :831,169,000,141,018, 208,897
49200 :169,022,141,024, 208,169,813
49206 :200,141,022,208,169,012,9838
49212 :141,033,208,141,032,208,9855
49218 :169,001,141,025,208,076,174
49224 :005,193,169,233,141,018,963
49230 :208,169,030,141,024, 298,698
49236 :169,216,141,022, 208,169,241
49242 :600,141,9032,208,141,933,133
49248 :208,169,001,141,025,288,888
49254 :239,162,032,159, 255,173,889
49260 :141,002,013,137,198,248,071
49266 :803,076,005,193,173,089,141
49272 :198,141,000,208,173,816,988
49278 :208,041,254,013,899%9,198,162
49284 :141,016,208,173,000,220,122
49298 :841,004,208,829,173,898,171
49296 :198,208,007,173,089,198,249
49302 :2061,025,144,017,9056,173,254
49308 :089,198,233,002,141,089,148
49314 :198,173,8098,198,233,000,830
49328 :141,090,198,173,000,220, 222
49326 :841,008,208,929,173,098,211
49332 :198,240,087,173,889,198,861
49338 :201,064,176,017,024,173,073
49344 :089,198,1805,002,141,089,048
49358 :198,173,098,198,105,800,194
49356 :141,090,198,173,0090,220,002
49362 :041,016,208,047,173,088,815
49368 :198,208,042,056,173,8089,214
49374 :198,233,9024,133,188,173,139
49380 :098,198,233,000,074,102,157
49386 :180,070,188,078,180,238,128

234
Machine Language Games io

49392 ?888,198,024,165,188,185,232
49398 $933,133, 251,133,253,169,194
49484 ?007,195,9808,133,252,185,886
49418 2212,133,254,194,168,104209 ,
49416 2178,1804,064,032,003,192,861
49422 :169,004,133,252,168,900220 ,
49428 2185,226,196,153,900,956,868
49434 :200,192,088,208,245,160,015
49448 2909,152,153,8900,957,280,882
49446 :192,998,208,248,160,8900, 886
49452 2185,234,196,153,080,058,162
49458 2200, 208, 247,169, 232,141,223
49464 :248,0807,160,007,169,233,112
49476 :153,248,007,136, 208,250,040
49476 2169,255,141,8028,208,169,914
49482 :@00,141,029, 208,141,923,184
49488 :208,141,016,288,169,903,9857
49494 :141,037,208,169,008,141,9022
49589 :938,208,169,212,141,001,993
49586 :208,160,000,185,236,197,960
49512 :153,948,208,200,192,907,136
49518 :208,245,169,906,141,939,159
49524 :208,169,147,8932,218,255,113
49530 2160, 039,169, 1607.1537 1527187
49536 :007,169,005,153,152,219,065
49542 :136,916,243,160,905,162,9088
49548 :824,024,032,240,255,160,1907
49554 :0600,185,244,197,240,006, 250
49560 :032,210 298,245,,
200,,255 922
49566 :160,900,162,023,9024,032,047
49572 :248,255,160,000,185,025,905
49578 :198,248,006,032,210,255087 ,
49584 :200,208,245,169,004,141,119
49590 2835, 208,169,014,141,036,017
49596 :208,168,024,169,000,153,134
49682 :000, 212,136,816, 250,169, 209
49688 :255,141,915,212,169,128,096
49614 :141,918,212,169,143,141,996
49629 :024,212,169,015,141,139,144
49626 :198,169,003,141,136,198,039
49632 :169,900,141,088,198,141,193
49638 :137,198,170,142,090,198,141
49644 :169,184,141,889,198,138,131
49650 :910,168,010,010,010,019204 ,
49656 :824,105,031,153,991,198,982
49662 :169,000,153,092,198,153,251
49668 2003, 208,169,960,157,105,194
49674 :198,032,186,195, 232,224,953
49680 :007,208,222,169,255,141,250

235
& Machine Language Games

49686 2021, 208,173,030, 208,173,067


49692 :931,208,173,930,208,041,207
49698 :001,248,003,076,230,195,011
49704 :173,141,002,208,251,032,9879
49718 2228, 255,201,136, 208,009,859
49716 :169,832,160,900,145,251,941
49722 :076,188,196,173,088,198289 ,
49728 :208,0083,976,927,195,160,221
49734 :008,169,032,145,251,856,211
49740 2165,251,233,940,133,251,125
49746 :133,253 252,,165 ,
233,000,994
49752 2133, 252,024 ,105,21 2,133,1 79
49758 :254,173,027,212,909,008,989
49764 :145,253,169,000,145,251,839
49770 :173,031,208,041, 254,248,829
49776 :103,133,167,141,138,198,224
49782 :162,000,070,167,8070,167,242
49788 2144,071,169,032,141,005,174
49794 :212,169,246,141,006 ,
212,092
49800 :169,129,141,004, 212,169,192
49806 :234,157,249,007,160,010,191
49812 2173,027,212,157,048,208,197
49818 :140,001,212,165,162,197,007
49824 2162, 240,252,136, 208,238,116
49830 :189,236,197,157,8208,169 040,
49836 $169, 233,157,249,007,169,132
49842 :128,141,004, 212,138,8072,1985
49848 :189,1805,198,873,255,074,9054
49854 :074,074,032,201,196,104,183
49866 :170,232,224,007,208,176,189
49866 :173,138,198,873, 255,845,060
49872 2021,208,141,021,208,876,115
49878 :226,194, 238,088,198,173,051
49884 :088,198,201,021,208,8057,225
49890 :160,000,148,988,198,169213 ,
49896 :0@32,145,251,173,031,288,0848
49992 :173,030, 208,173,021, 208,027
49998 2041,254,2808,035,173,139,878
49914 2198, 240,003, 206,139,198,218
49920 :160,038,162,023,924,032,183
49926 2240,255,173,139,198,8073, 069
49932 :815,176,169,900,932,285,091
49938 :189,169,1080,032,201,196,137
49944 2876,224,193,174,139,198,004
49958 2168 ,000, 200,208,253,282,829
49956 2208,250,138,010,168,185,227
49962 ?091,198,153,002,208,189,115
49968 ?105,198,153,8003,208,185,132
49974 ?892,198,133,168,956,138,071

236
Machine Language Games
6
4998 27168, 208,289,169,000,042,071
49986 2136, 2908, 252,133,167,073,811
49992 7255,845,8016,208,164,168,16@
49998 7248,802,005,167,141,816,137
58084 2208,232,224,007,208, 204,143
58819 :162,000,138,818,168,189, 245
58816 2195,198,024,125,112,198,990
58822 2281,218,176,004, 201,058,176
58828 :176,906,032,186,195,976,911
58834 :178,195,157,185,198, 024, 203
5884 :185,991,198,121,129,198,999
58846 2133,167,185,8092,198,121,254
58852 :121,198,133,168,208,014, 206
59658 :165,167, 201,031, 240,002,176
59064 :176,986,932,186,195,876,047
50870 :178,195,165,168, 248,012,084
58076 :165,167,201,064,144,096,135
59882 :032,186,195,876,178,195,992
58888 :165,167,153,091,198,165,883
59694 :168,153,092,198, 232,224,217
581068 :907,208,165,876,030,194,892
58186 :134,169,132,178,173,027,223
58112 :212,041,0905,170,189,878,111
58118 :198,166,169,157,112,198,174
50124 :173,027,212,941,905,818,1608
59138 :168,185,876,198,166,170,149
58136 :157,120,198,185,077,198,127
50142 :157,121,198,164,170,166,174
59148 :169,896,169,235,141, 248,886
58154 :007,169,001,141,137,198,119
59168 :169,089,141,005,212,169,177
50166 :160,141,906,212,169,833,199
58172 :141,004,212,162,100,142,245
58178 :001,212,1608,008,173,927,063
50184 :212,141,039, 208,141,000, 237
58190 :212,136, 208,244, 202,208, 209
58196 :236,169,234,141,248,007,931
58202 :169,901,141,029, 208,141, 203
50268 :023,208,169,932,141,904,0897
59214 :212,169,168,141,906, 212,178
58220 2169,129,141,004, 212,162,993
59226 :100,142,001,212,160,000,153
58232 :140,900,212,173,027,212,952
59238 :141,039, 208,136,208, 244,814
50244 3202, 208,236,169, 232,141,232
58256 :248,007,169,806,141,039,172
58256 :208,169,000,141,929,208,067
58262 :141,023,208,169,128,141,128
59268 :004,212,162,190,168,908,218

27
&s Machine Language Games

58274 2136, 208, 253,202, 208,250,875


58280 :169,000,141,137,198,168,149
58286 :153,002, 208, 200,192,014,111
58292 :208,248,141,016,208,160,073
58298 :000,169,032,145, 251,173,124
58364 :030,208,206,158,007,206,175
58312 :136,198,173,136,198,246,191
56316 :083,976,224,193,160,008,9828
58322 :185,203,007,217,222,007,219
58328 :240,005,176,011,976,178,070
58334 2196, 200,192,006, 208,238,174
58342 :876,178,196,160,986,185,197
58346 :202,007,153,221,007,136,128
58352 :208,247,032,159,255,832,085
58358 :228,255, 201,136, 208,246,176
58364 :160,006,169,948,153,282,158
58370 :007,136, 208, 258,076,158,095
58376 :193,170,160,006,956,185, 262
58382 :202,007,105,008,201,058,011
58388 2144,002,169,948,153,202,162
58394 :007,136, 208,239, 202,208,194
58480 :233,096,048,016,032,048,185
58406 :816,832,048,016,000,000,086
58412 :000,000,009,800,89008,832,812
5@418 2008 ,2900, 236,000,880, 236, 2082
58424 :000,003,255,000,915,255,808
58430 :192,015,087,192,015,255,242
58436 :192,063,087,248,255,255,872
58442 2252,255,087, 252,255,255, 086
58448 2252,239,8087,236,239,255,044
58454 2236, 236,220,236, 236,220,126
58460 2236,236,220,236,252,08980,184
58466 :252,000,000,000,000,0080,838
58472 2800 ,800,800,800,0800,08088,8428
58478 2000 ,000,080,000,0009,000,046
50484 7909 ,080,083,085,192,013,089
58498 :085,112,063,255, 252,234,835
58496 2178,171,226,034,043,058,254
58562 :170,172,013,8085,112,083,113
58588 2255,192,80H8,000,000,808,811
58514 7000 ,900,000,08090,0009,808,882
58526 2020 ,800,000,808,900,8080,888
58526 2090 ,000,089,000,800,8088,894
50532 2808 ,900,900,000,808,808,100
58538 :128,032,008,032,168,032,242
5@544 :908,168,160,034,162,168,828
58558 :138,168,130,162,197,842,187
58556 2940,115,008,131,190,224,064
5@562 :046,188,162,011,127,064, 216

238
Machine Language Games &

58568 :138,281,088,0189,186,874,057
58574 :835,198,232,000,141,032,004
58588 :818,038,019,038,166,160,858
58586 :908,168,168,130,138,048,930
58592 :818,003,128,908,032,808,085
58598 :808,082,032,900,000,0800,200
58694 :808,080,800,0009,800,916,188
58619 :8908,000,118,000,000,118,158
58616 :8008,001,255,128,007,255,962
58622 :224,007,171,224,9007,255,054
59628 :224,931,171,248,127,255,228
98634 3:254,127,171,254,12/ 5255,119
59640 :254,119,171,246,119,255,992
58646 :246,118,1198,118,118,118,919
58652 :118,118,110,118,126,900,942
58658 :126,089,000,800,000,090,096
58664 :900,080,9090,013,906,004,255
58679 :061,0807,908,012,013,614,037
50676 :988,031,211,067,979,682,2190
59682 :869,058,158,848,948,648,167
59688 :648,048,048,%32,032,149,101
59694 :2808,073,071,072,032,211,153
5879 :8967,079,082,969,958,928,139
50706 :848,048,048,48,048,048,0650
58712 :800,8018,149,204,973,986,042
58718 :869,983,958,051,029,029,093
59724 :829,929,029,029,029,028209 ,
52738 :193,083,084,082,079,045,896
50736 :208,193,286,201,195,933,960
5742 :829,929,029,6029,029,029,228
50748 :831,204,969,886,069,976,083
58754 :858,948,032,000,001,255,204
5@760 :0@02,254,003,253,001,000,073
59766 :255,255,002,000,254,255,9875
50772 :803,000,253,255,813,013,199

239
Nessie
Tom R. Halfhill
64 Version by Charles Brannon

In “Nessie,” a nonviolent action game written entirely in machine


language, you're posing as a photographer trying to snap a clear
photograph of the Loch Ness monster. You need a joystick to aim
your camera.
For decades, fans and believers of Scotland’s Loch Ness mon-
ster have affectionately referred to the mysterious creature as
Nessie—hence the title of this game.
Inspired by a TV documentary on Loch Ness that re-
counted the hundreds of attempts to photograph the monster,
this game tries to re-create the difficulties of capturing the
creature on film. Whether in the game or in reality, it’s not
easy. Almost all of the photographic attempts have ended in
failure; there exist only a few controversial photos showing
parts of fins, shadowy shapes, and blurred figures. Maybe
your steady hand and sharp eye will succeed where others
have failed.
Starting Nessie
Nessie is an all-machine-language game. Normally, it’s quite
difficult to type in a machine language (ML) program. That's
because ML is simply a series of numbers. To make it easier to
enter programs like Nessie, we’ve developed MLX, the Ma-
chine Language Editor. With MLX, you can almost guarantee
that you'll type the program in correctly the first time. Before
you begin entering Nessie, then, make sure you read and
understand Appendix D. You'll find the MLX program listed
there. You need a copy of it on tape or disk before you can
start typing this game. (You may already have a copy if you
used it to type in one of the other ML games in this book or if
you typed in a copy from an issue of COMPUTE!’s Gazette
magazine. If you have an older version of MLX, you may want
to retype the listing in Appendix D, for it includes a recent
addition that turns part of the keyboard into a numeric
keypad. It makes entry even easier.)
To type in Nessie, load and run MLX. You'll h :
ply two addresses. They are: ave to sup

240
Machine Language Games &

Starting address: 49152


Ending address: 52169
After you've saved Nessie to tape or disk, you can load it
at any time by entering:
LOAD “filename”,8,1 (for disk)
LOAD“ filename’,1,1 (for tape)
Type NEW after Nessie has loaded. This will not erase the
program, but will reset some pointers that otherwise might
give you an 7?0UT OF MEMORY ERROR or cause other prob-
lems with the game. To start Nessie, type:
SYS 49152
Instantly, the game screen appears, with a boxed-in crosshair
in the center of the screen. There are also prompts to select
game options. The keys to press for each are:
f1: Telephoto
f3: Wide Angle
£5: Speed
f7: Easy Game
f8: Hard Game
There are two types of camera lenses: Telephoto and Wide
Angle. By far the easiest is the wide angle, obtained by press-
ing the f3 key. A wide angle lens allows you to cover more
area from your camera position. You'll see the viewfinder ex-
pand when you press the f3 key. Since its larger size makes it
easier to enclose Nessie, you may want to begin play with
this. The telephoto lens, which is the default selection (in
other words, if you don’t make a choice, this lens is used auto-
matically), is about half as large, making it harder to catch
Nessie within the border of the lens. In fact, the telephoto
viewfinder barely frames Nessie. Press the f1 key to switch
back to the telephoto lens if you previously selected the wide
angle lens.
Function key f5 is used to increase or decrease the speed.
The default speed is 5. Speed 1 is very slow, 9 almost too fast.
Hitting the f5 key repeatedly cycles through the levels from 1
to 9. Make sure your joystick is plugged into port 2. Now
you're ready to begin. Press f7 for an easy (default) game, or
£8 for a more difficult level of play. (Pressing the f7 key during
play restarts the game, something you might find handy.) If
you chose the hard game, the playfield will be littered with
241
& Machine Language Games

black squares that interfere with your photography. It’s better


to begin with the easy version. .
The photo session has started, and the clock is moving.

Getting the Whole Picture


At the top left of the screen is your camera’s film counter,
which shows how many pictures remain on your roll of film.
You start with a 20-exposure roll. Each time you snap a pic-
ture, the film counter decrements. The current game speed
also displays.
Your camera viewfinder starts in the center of the screen.
You can move it in any direction with the joystick. Pressing
the fire button releases the shutter. The viewfinder frame itself
is blue, with a red aiming crosshair in the center. To take a
properly centered photo, you must position the crosshair over
Nessie. If any part of Nessie is touching the viewfinder frame
when you snap the shutter, it will register as a cropped photo
when the film is developed at the end of the game. A picture
of a piece of Nessie is better than nothing, but it’s not nearly
as valuable as a photo of the whole monster. (Let's face it,
wouldn’t you feel better walking into The New York Times with
an indisputable picture of Nessie instead of a doubtful snap-
shot of a dorsal fin?)
For the same reason, you must be careful not to include
any other objects in the viewfinder while photographing
Nessie. This isn’t as easy as it sounds. When you start the
game, you'll find that Loch Ness is alive with turtles and eels.
If you photograph one of these instead, you've been
“fooled” —and your photo is worth only a handful of points.
(The reason you get any points at all is that you might be able
to sell the photo to Field & Stream or an airline magazine.) The
eels are particularly troublesome. They bear an uncanny
resemblance to Nessie, which is why so many hopeful photog-
raphers over the years have been fooled.
Make sure your camera's viewfinder doesn’t touch any
text (such as the score line) or any of the black squares in the
hard game, or you'll just end up with a cropped picture.
Another hazard to beware of is jittery hands. Nessie is not
an easy target—the creature swims around the Loch in ran-
dom directions, staying still for only a moment before slipping
away. Meanwhile, you're trying to center the monster in the
viewfinder. If you snap the shutter while moving the finder,

242
Machine Language Games &

the picture will be blurred. And that’s worth zero points.


Pressing any key (except for the CTRL, RESTORE, SHIFT,
and Commodore keys) freezes the screen. Hitting another key
restores motion. You can do this if you want to take a short
break from the game. Or if you get particularly frustrated with
Nessie’s darting behavior, you can use this feature to “freeze”
the Loch and capture her on film. It’s actually cheating, but...
When you get down to your last five pictures on the roll
of film, the viewfinder frame automatically turns from blue to
bright yellow as a warning. This is in case you're too busy to
pay attention to the film counter.

Developing the Film


After you snap your last shot, the film instantly develops (ma-
chine language—faster than Polaroid) and is displayed. Each
of the 20 finished prints shows what you photographed when
you snapped the shutter. They are arranged in the order you
shot them. (Programmers may want to note that each picture
is a sprite. Using raster interrupts permits you to have up to
64 sprites simultaneously. In this program, we have 20 sprites
displayed on one screen.) The frames show a whole Nessie, a
cropped Nessie, a colored blur, another Loch creature, or
emptiness, depending on your photographic skill. At the bot-
tom of the screen is your final score, adjusted for the amount
of time that elapsed.
To restart Nessie, just snap the shutter button. This re-
turns you to the setup screen, where you can change lenses, if
you wish, before playing again.

Pictures for Points


Since the telephoto lens is harder to use, it scores more points.
A clear, properly framed photo of Nessie taken with the wide
angle lens scores 2000 points, but a whopping 20,000 points if
you used the telephoto lens. If Nessie is not completely en-
closed (cropped), the photo scores only 100 points (1000 with
the telephoto). Snapping a picture of a turtle or eel means _
you've been fooled, and you receive only 50 points, or 500 if
you were using the telephoto. Moving the camera when you
press the shutter button gives you a blurred picture (shown by
the horizontal lines across the developed print). You get no
points for this, just as you receive no reward for taking a
photo of the Loch.

243
& Machine Language Games

Another important factor in the scoring is time. One point


(or ten points with the telephoto) is subtracted from your final
score for every four seconds you took to shoot all your pic-
tures. You have to balance your pace between reckless photog-
raphy and careful shooting in order to get the best pictures in
the least amount of time.

Anyone Can Use a Camera


Nessie is a game that can be enjoyed by almost anyone. Chil-
dren especially will delight in capturing the creature on instant
. film. Setting the speed level allows you to slow down or speed
up the creatures’ movements. Slower speeds are appropriate
for smaller children. Nessie is easy to snap, and there’s none
of the usual frustration with action games.
But set the speed to 8 or 9, the game selection to hard,
and Nessie becomes a challenge to even the most agile
photographer. You'll need a quick shutter and lots of luck to
see the monster on your developed prints. In fact, it’s almost
as hard as getting the real Loch Ness monster on film.

\shessio
For easy entry of this machine language program, be sure to read “Using the Machine Lan-
guage Editor: MLX,” Appendix D.
491592 2:469;,071,133)251 7169, 199, 224
49158 :133,252,169,000,133,253,178
49164 :169,056,133,254, 162,004,622
49170 2160,255,177, 251,145,253,235
49176 :136,192, 255, 208, 247,230,812
49182 :252,230,254, 202,048,807, 255
49188 :208,238,168,127,9876,820,097
49194 :192,198,254,160,128,169,119
49200 :000,145,253,200,208, 251,981
49206 :169,255,141,014, 212,141,218
49212 :915,212,169,128,141,9018, 231
49218 :212,169,000,141,024,212,0856
49224 :169,252,141,027,208,162, 807
49230 :005,032,189,193,169,128,026
49236 3157,205,203,157,211,263, 196
49242 :169,000,157,199, 203,189,239
49248 :024,199,157,041, 298,189,146
49254 :032,199,157,2589,907,138,117
49268 :010,168,169,000,153,005,101
49266 :208,282,016,217,173,022,184
49272 :199,141,039,208,173,023,135
49278 :199,141,940,288,173,030,149

244
Machine Language Games 6

49284 :199,141,248,007,173,931,163
49298 :199,141,249,007,169 880,135
,
49296 :141,236,203,169,160,141,172
49362 :235,203,141,000,208,141,054
49308 :802,208,169,128,141,237,917
49314 :203,141,001,208,141,903,991
49320 :208,169,255,141,021,208,146
49326 :141,028,208,169,903,141,996
49332 :029,208,141,023,208,169,1908
49338 :806,141,032,208,141,833,235
49344 :208,169,005,141,037,208,192
49350 :169,084,141,038, 208,169,159
49356 :001,141,246,203,032,231,034
49362 :193,120,169,118,141,920203 ,
49368 :903,169,196,141,021,003,237
49374 :088,168,000,132,007,152,249
493890 :919,170,185,199,203,974,045
49386 :102,007,185,205,203,157,969
49392 :004,208,185,211,2037157)194
49398 :005,208,201,050,144,907,693
49404 :201,229,176,003,076,014,183
49416 ©2193 5185 7(2295.203;,,0/3;,255116
,
49416 :624,105,901 229, 203,211
,153 ,
49422 :185,199,203,249,019,185,012
49428 :205,203,201,004,176,013,114
49434 :076,062,193,185, 205,203,182
49449 :201,024,144,003,8076,062,030
49446 :193,169,000,153,223,203,211
49452 :185,217,203,073,255,024233 ,
49458 :105,001,153, 217,293, 201,162
49464 :255,208,003,153,223,203,077
49478 :185,250,007,073,001,153,219
49476 :258,007,185,217,203,170,076
49482 :185,250,007,009,002,153,168
49488 :258,007,224,001,240,005,939
49494 :9073,002,153,250,007,024,083
49500 :185,205,203,121,217,203202 ,
49506 :153,205,203,185,199 203,222
,
49512 :121,223,203,153,199,203,182
49518 :024,185,211,203,121,229,059
49524 :203,153,211,203,200,192,254
49530 :006,240,003,076,227,192,098
49536 :173,916,208,041,003,005,062
49542 :007,141,016,208,174,245,157
49548 :203,249,908,160,000,136,119
49554 :208,253, 208, 250,173
202,160,
4956UW :027,212,201,128,144,011,107
49566 :173,027,212,201,006,176,185
49572 :249,170,932,189,193,032,005

245
& Machine Language Games
oS

49578 :228,255,240,012, 201,136,218


49584 :208,003,0876, 208,197,032,132
49590 :228,2 55,
248, 251,876, 223,175
49596 :192,169,000,15 7,
223, 203,188
49602 :173,027, 212,041,903, 168,850
49608 :185,960,199,157,2 203,197
17,
49614 :201,255,208,003,157,223,229
496208 :203,173,0827,212,041,003,193
49626 :168,185,060,199,157,229,192
49632 :203,0829,217,203, 240,215,051
49638 :096,169,008,141,2 39,
203,054
49644 :141,240,203,141, 241,203,125
49650 :141,242,203,141, 243,203,135
49656 :141,0 76,
204, 169,828,1 41, 231
49662 :244,203,169,005,1 41,
245,237
49668 :203,169,191,160,194,032,185
49674 :030,171,169, 248,168,194, 206
49680 :032,030,171,032,2 28,
255,252
49686 :240, 251,201,133, 288,018,849
49692 :169,224,141, 248,087,169, 218
49698 :225,141, 249,807,169, 808,857
49704 :141,243,203,076,019,194,148
49710 :201,134, 208,018,169, 226,234
49716 :141,248,007,169, 227,141,217
49722 :249,007,169,801,1 41,
243,180
49728 :203,076,819,194, 201,135,124
49734 :208,8 238, 245, 38,
203,173,143
49748 :245,203,016,005,1 69,
809,211
49746 :141,2 45,
203, 201,818,1 44, 982
49752 :005,169, 000,141,245, 203,083
49758 :009,048,141,006,804,876,122
49764 :619,194, 201,136, 240,051,173
49778 :201,140, 208,165, 238,076,119
49776 :204,032,157,194,162,058,143
49782 :160,040,173,027,2 12,
201,163
49788 :167,176,249,133, 253,173,251
49794 :027,212,041,003,024,185,030
49800 :004,133,254,169,160,145, 233
49806 :253,165, 254,185, 212,133,240
49812 :254,169, 800,145,253, 202,147
49818 :208,220,096,169,191,160,174
49824 :194,032,030,171,173,245,237
49838 :203,009,048,141,9 06,
004,065
49836 :856,1 809, 237, 69,
245, 203, B67
49842 :141,245,203,01 245, 203,4,205
49848 :814,245,203,01 4,
245, 203,084
49854 :696,147,146,014,1 59,
211,195
49868 :980,0 69,
969, 068,058,1 58, 186
49866 :053,032,032,832,032,032,159

246
Machine Language Games &

49872 :032,032,032,154,206,969,221
49878 :083,083,873,969,032,0832,074
49884 :932,032,032,032,155,198,189
49898 :973,876,077,032, 204,069,245
49896 :870,084,958,158,958,848,188
49962 :813,000,153,818,8 849,829
78,
49988 :146,058,212,969,9869,196 076,
49914 :880,872,079,084,079,032,164
49928 :018,878,051,146,0 215,046
58,
49926 :973,8968,069,032,193,878, 887
49932 :071,876,069,932,018,8708,092
49933 :853,146,958,211,080,869,123
49944 :969,068,013,913,070,955,961
49950 :146,958,197,065,083,089,156
49956 :932,199,065,077,069,032,254
49962 :918,070,056,146,058,209,978
49968 :965,982,00608,932,199,8965,047
49974 :077,969,000,173,000,220,881
49989 :072,041,016,141,238,203,9803
49986 :104,041,015,973,015,170,228
49992 :924,1/3,235,20 025, 09497113
35
49998 2199,141 235720371417, 000,229
50064 :208,141,9002,208,173,236,028
50018 :203,125,038,199,141,236,008
500916 :203,074,908,173,0 208,019
16,
50822 :874,974,040,008,042,040,124
59028 :942,141,016, 208,024,173, 200
50034 :237,203,125,060,199,141,055
50049 :237,203,141,001,208,141,927
50846 :003,208,173,238,203,240,167
58852 :813,169,000,141,2 283,137
47,
5@958 :169,001,141,246, 203,076, 206
50064 :160,195,173,247, 203,240,082
58070 :023,173,246,203,248,004,015
50876 :206,246,283,096,169,006,058
5@082 :141,032,208,141,033,208,157
50088 :169,128,141,004, 212,096,15¥
50094 :206,038,004,173,038,004,125
50190 :201,048,176,020,169,957,983
50106 :141,038,004, 206,937,004,184
5@112 :173,937,004,201,049,176,064
58118 :005,169,032,141,037,904,074
50124 :169,031,141,005,212,141,135
50130 :024,212,169,003,141,006, 253
50136 :212,169,255,141,9 212,181
00,
50142 :141,001,212,141,904,212,165
50148 :169,004,141,074,204,162,214
50154 :006,172,244,203,136,169,140
52160 :000,153,9032,204,173,074,198

247
& Machine Language Games

58166 :204,009,002,141,021,208,063
58172 :173,0308,208,032,127,196,250
50178 :173,030, 208,041,253,825,220
50184 2032, 204,153,032, 204,014,135
50199 2074, 204, 202, 208, 225,169,072
530196 :001,141,032,208,141,9033,064
58202 : 208,141,247, 203,169,004, 2308
58298 :141,074, 204,162,006, 169,020
58214 :000,153,052,204,173,074,182
58220 :204,009,001,141,821,208,116
58226 :173,030,208,8032,127,196,048
50232 :173,030,208,041,254,025,919
58238 :052,204,153,052,204,014, 229
50244 2074, 204, 202, 208, 225,173,139
58250 :831,208,032,127,196,173,073
58256 :031, 208,153,248, 203,173,072
50262 :600,220,8041,8015,073,015,194
58268 :153,012,204,169,255,141,002
58274 2021, 208, 206, 244, 203,173,129
50280 2244, 203, 240,038, 201,005,011
58286 :208,005,169,007,141,0840,168
560292 :2808,096,032,137,196,032,0649
58298 :057,195,076,049, 234,032,253
58304 :130,196,173,018, 298, 201,930
58310 2255, 208, 249, 238, 241, 203, 248
58316 : 208,003,238, 242, 203,896,196
58322 :169,147,032,210, 255,169,104
58328 :000,141,032,208,141,033,195
50334 :208,120,169,015,141,820,063
50348 :003,169,198,141,021,003,187
58346 :169,001,141,026, 208,169,116
58352 :027,141,017, 208,169,050, 020
56358 :141,018, 208,169,127,141,218
58364 ?9@13,220,169,255,141,027,245
583708 :208,169,0900,141,075, 204, 223
58376 :169,031,141,021,208,169,171
58382 :255,141,029, 208,141,023, 235
580388 :208,169,016,141,016, 298, 282
58394 :162,000,138,018,168,819,194
58400 :010,010,018,018,024, 185,137
58486 :029,153,000, 208,169,809, 03G
56412 2157,039, 208, 232,224,005,077
58418 2208, 232,088,162,819,168,887
50424 :000,189,248,203,841,803,164
58438 :029,012,204, 248,818,169,15@
58436 :241,153,101,198,169,000,898
50442 :076,086,197,189,852, 204,846
50448 :041,064,208,044,189,852,1982
50454 :204,208,010,169,242,153, 2498

248
Machine Language Games &
RPE SORA TTT MINI NET

5904608 :101,198,169,880,076,086,146
598466 :197,142,072,204,189,052,122
50472 :204,162,000,074,176,004,148
58478 :232,976,843,197,189,038,045
50484 :199,153,101,198,174,9072,181
58498 :204,169,005,0976,086,197,827
59496 :189,032,204,249,010,169,1498
59502 :248,153,101,198,169,819,173
58588 :0976,886,197,169, 236,153,225
58514 :161,198,169,200,924,1989,115
50526 :239,203,141,239,293,173,806
58526 :248,283,105,000,141,249,255
50532 :203,202,200,192,920,208,101
50538 :142,032,121,198,173 239,243
,
50544 :203,813,248,203,2498,929,016
99550 :056,173,;239)203; 237,242; 244
58556 :203,141,239,203,173,249,943
58562 :203,233,000,141,240 203,126
,
50568 :173,9076,264, 248,906,014, 981
50574 :239, 203,046,249, 203,162,211
59580 :024,160,000,024,032,2408,116
59586 :255,169,236,160,197,032,179
59592 :030, 171,1745 239792037 1735126
59598 :248,203,032,205,189,169,180
59694 :048,932,210,255,173,243,189
586190 :203,208,005,169,0948,032,075
50616 3210,2 loz, 1 2073271
55, 277060
50622 :196, 202, 208, 25071737090)195 ,
59628 :220,041,016,240, 249,173,111
50634 :000,220,041,916, 208,249,168
58649 :128,169,000,141,026 208,194
,
59646 :169,255,141,013,220,169,157
58652 :949,141,020,003,169,234,9068
59658 :141,021,003,088,162,255,128
59664 :154,076,000,192,159,2908, 253
59670 :076,065,089,032,065,071,124
58676 :865,073,978,9058, 211,978,039
50682 :065,0980,032,083,072,985,155
59688 :984,984,969,082,032,154,249
58694 :211,967,8979,082,069,058, 060
50700 :158,018,800,173,818 208,075
,
58706 :924,105,002,141,001,208243 ,
50712 :141,9003,208,141,00 218
298,5,
50718 :141,007,208,141,009 208, 232
,
50724 :141,011,208,174,075 204,081
,
58730 :189,097,198,168,162,000,988
50736 :185,101,198,157,248,007,176
50742 :200,232,224,005, 208,244,143
50748 :238,075,204,173,075 204,005
,

249
6 Machine Language Games

50754 :201,004, 208,005, 169,000,141


50760 :141,075,204,170,189,993,176
50766 :198,141,918, 208,169,901,9845
58772 :141,025, 208,104, 168, 104, 066
58778 :170,104,064,049,897,146, 208
50784 :194,0008,005,010, 015, 224, 832
587908 :225,226,227, 228, 228,227,183
58796 :225,226,228,225,227,226,185
58802 :228,224, 225,227,225, 224,187
58808 :229,162,000,169,8087,157,076
50814 2000, 216,157,008, 217,157,185
58820 :000, 218,157,808, 219, 232,198
58826 : 208,241,169, 000,133, 253,118
50832 :169,004,141,073, 204,133,180
59838 :254,169,005,141,072, 204, 227
58844 :160,000,169,112,145, 253,227
58850 : 208, 162,006,169, 664,145,148
58856 2253, 208, 202, 208, 250,169,170
58862 110,145,253, 200, 206,072,136
58868 : 204,173,072, 204, 208, 228, 245
58874 :162,0084, 032,008, 199,160, 239
58880 :000,824,169,893,145, 253,188
58886 :152,185,007,168, 169,093,124
58892 :145,253,200,192,040,144,154
58898 2239, 202, 208, 230,032,908,185
50904 :199,169,005,141,072, 204, 238
58918 : 160,000, 169,189,145, 253,034
58916 : 200,162,006, 169, 64, 145, 206
56922 253,200, 202, 208, 250, 169, 236
58928 125,145,253, 200, 206,872,217
56934 :204,173,072, 204, 208, 228,955
58940 032,008,199, 206,073,204, 206
58946 173,073,204, 208,144,896, 132
56952 165,253,024, 105, 848,133,216
58958 253,165, 254,105, 008,133,156
58964 254,896, 018,014, 809, 889, 156
58976 :081,0801,0087,009, 224, 225, 237
58976 2228, 228,232, 232,236, 228,136
58982 :000, 008,008,000, 255, 255,036
50988 2255, 000,000,288, BVO, BB, 043
58994 :000,000,008,255,255, 255,847
51000 :0008,0081,001,001,800,255,858
51896 :001,0008,0088, 255,081,808, 863
51612 :008,255,801, 800,800,800, 068
51818 :000,000,088,000,900,808,874
51024 :080,128,008,000,128,880, 880
51630 :002,160,0900,008,128,000,120
51836 :000,128,088, 800,000,008, 220
51842 :008,000,8808,000, 000,800,098

250
Machine Language Games &

51948 :800,008,0008,000,000,900,194
51054 :808,000,900,0800,008,900,1108
51868 :809,9008,000,0008,09080,000,116
531966 :908,009,098,000,000,2800,122
518972 :800,808,900,000,000,0008,128
51878 :147,178,170,128,128,808,199
51684 :128,128,008,128,128,000,140
51999 :128,128,800,128,128,089,146
51496 :128,128,008,128,128,000,152
51162 :128,128,900,128,128,000,158
51188 :128,128,900,128,179,178,120
51114 :128,989,900,000,090,000,942
51120 :800,008,900,0008,900,0990,176
51126 :980,900,9090,900,0008,900,182
51132 :9008,8900,900,000,900,000,188
51138 :888,09080,000,000,147,009,985
51144 :008,800,0900,0900,900,908,200
51158 :888,08080,000,000,000,0800,206
51156 :800,908,800,008,900,000,220
51162 :888,980,000,008,000,000,234
51168 :178,128,9008,008,000,000,918
51174 :888,000,000,008,000,909,246
51188 :000,000,000,000,000,000,236
51186 :889,809,099,000,000,000,242
51192 :8008,000,000,009,000,000,248
51198 :860,0900,000,000,000,000,254
51204 :8600,000,048,042,179,179,178
51210 :832,000,002,032,000,002,078
51216 :832,008,902,032,000,002,084
51222 :832,0090,002,032,000,002,090
51228 :832,000,002,032,000,002,096
51234 :832,000,002,032,000,002,192
51248 :032,000,002,032,000,002,198
51246 :832,000,002,032,000,002,114
51252 :032,000,002,042,170,170,212
51258 :8088,000,000,000,000,000,058
51264 :800,000,000,000,000,090,064
51270 :848,0900,000,0009,000,009,118
51276 :800,0900,000,000,000,0009,076
51282 :800,900,000,000,009,000,082
51288 :800,0900,000,000,000,000,088
51294 :800,900,000,000,080,179,088
51300 :000,118,170,168,086,174,04
51306 :168,822,234,186,006,174,128
51312 :170,911,1798,233,010,170,198
51318 :149,005,0964,020,001,000,191
51324 :080,900,064,064,000,000,076
51330 :080,009,000,000, 233,000,197
51336 :000,000,000,0900,000,090,136

251
& Machine Language Games
RSME SRN NRE ATED TS TIT

51342 :200, 200,200,000, 900,008,142


51348 :020, 000,200, 002, 000,900,148
51354 :080,000, 020,000, 000,000,154
51360 :000, 900,000,170, 000, 982,156
51366 :176,160,118,174,168,086,818
51372 :234,186,822,174,170,011, 201
51378 :170,233,0810,170,148,001,142
51384 :964,020, 000,080,005, 000,097
51390 :816, 800,820, G0, 000,000, 206
51396 :0008, 200,233,000, 220,900,173
51402 :008, 020,000, 000,200,000, 202
51428 :200, 200,220, BUG, BBU, OB, 208
51414 :008, 200,008,000, 000,000,214
51420 :000, 220,880, GBB, 00GB, 0BG, 220
51426 :000,170,085,018,170,157, 226
51432 :042,186,149,174,171,148,078
51438 :170,186,144,107,170, 224, 215
51444 :086,170,168,0820,081,888, 249
51450 :005,000,864,681,001,0800,865
51456 :0008, 000,200, 000, BOG, G4, BBY
51462 :233,200,088, 008,900,800, 239
51468 :000, 020, 200, 220, 200, BBW, G12
51474 :800,200,000,020,020,020,018
51480 :000, 000,000, G00, 000, B00, 824
51486 :000, 000,008,000, 800,178, 208
51492 :008,018,170,133,042,186,065
51498 :157,174,171,149,170,186, 825
51504 :148,107,170, 224,622,170,121
51510 :160,820, 001,864, 880,805,128
51516 :200, 200,294, 000, G00, B20, B64
51522 :008, 000,080,000, 022, 900,988
51528 :800, 000,020, 000,000, 000,072
51534 :908, 000,900,020, 008,000,0878
51540 :000, 000,016,008, 000,116, 216
51546 :090,000,820,080,000,005,115
51552 :080,000, 201,880, 000,001,098
51558 :868,064,001,149,144,001,017
51564 :089, 080,080,268, 188,000,189
51578 :800,020, 000,000,805, 000,139
51576 :800,080, 000,000,020, 000,120
51582 :800,000, 000,200,000, 08, 126
51588 :200,000,000, 000,000, 080,132
51594 :000,900,008, 008,000, 008,138
51600 : 088,900,008, 000,000, 090,144
51686 :000, 800,000, 808,000, 000,150
51612 :200, 000,000,000, 000,020,156
51618 :016,000,000,116,145,001,184
51624 :021,086,085,009,101, 148,196
51630 :088,017,064,000,000, 000,255
252
Machine Language Games &

51636 :800,000,900,000,2000,182 900,


51642 :898,9080,0800,000,09008,0908,186
51648 :900,0900,0900,080,000,000,192
51654 :988,800,000,0908,008,090808,198
51668 :909,000,000,000,0 800,204
00,
51666 :908,0090,000,009,080,000,2108
51672 :804,000,000,029,0080,000,249
51678 :820,000,000,980,0080,000,066
51684 :864,001,017,128,095,149,0808
51698 :964,009,089,964,021,017, 242
51696 :908,836,800,9009,080,900,100
51782 :008,0088,0800,0009,0900,009,246
51788 :8008,000,000,000,000,900,252
51714 :888,000,009,0909,009,0900,002
51728 :008,800,0900,2900,900,200,998
51726 :800,080,0900,008,98900,000,014
51732 :800,908,000,000,0008,008,828
51738 :800,000,000,000,8008,0090,026
51744 :800,008,900,000,904,064,100
51758 :969,029,181,101,8084,022,188
51756 :086,864,001,968,9008,900,007
51762 :80608,889,090,900,000,0800,059
51768 :8900,000,000,900,000,900,056
51774 :800,000,0900,000,0900,000,862
51788 :800,000,000,009,000,900,068
51786 :8600,0800,000,000,000,0900,974
51792 :000,900,000,000,900,900,9080
51798 :820,000,000,093,000,009,199
51804 :837,800,000,005,900,000,134
51818 :0805,064,800,005,068,064,948
51816 :801,085,088,002,086,989,182
51822 :8005,101,084,005,085,149,9827
51828 :801,985,080,001,064,080,171
51834 :8608,080,920,000,000,000,222
51848 :800,900,000,000,000,000,128
51846 :255,808,008,000,009,000,133
51852 :9090,000,000,000,000,000,149
51858 :888,020,000,000,093,000,003
51864 :800,037,008,008,005,000,194
51878 :880,005,000,0900,005,064,232
51876 :800,901,068,064,901,085,127
51882 :089,002,086,984,005,101,9816
51888 :885,905,085,144,001,9085,969
51894 :880,901,001,064,901,001,074
51980 :064,900,064,080,000,000,1408
51986 :000,900,0008,000,255,000,193
51912 :880,800,000,000,000,000, 200
51918 :8090,900,0908,000,900,008, 206
51924 :800,000,000,0008,020,000, 232

253
& Machine Language Games
(CSREES REI SGOT ART he SE EL

51930 :000,117,000,080,088,000,167
51936 :000,080, 000,001, 080,001,130
51942 :017,0880,005,085,064, 085, 230
51948 :149,128,021,089, 080,086,021
51954 :085,080, 005,085,064, 005,054
51960 :001,064, 020,205,900, 000, O82
51966 :020, 000,000,000, 000,800,254
51972 :000, 000, 000,000, 000,000,004
51978 :020, 000,080,000, 000,200,018
51984 :920, 000, 000,000,000, 020, 036
51990 :020,000,117, 000,000, 088, 227
51996 :800,020, 080,008, 000,980,188
52002 :000,001,080,001,017,864,197
52008 :005,085,064, 021,149,128, 236
52014 :085,089,080, 006,085,880, 215
52020 :005,085, 064,001,064, 064,079
52026 :001,064, 064,085,001, 200,193
52032 :000,000,000, 000,000,000, 064
52038 :808,000,000, 000,000, 080,070
52044 :800,000, 000,008,200, 008,976
52050 :800,000, 000,200, 000,008, G82
52056 :000, 0600, 000, 000, 00, 200, 088
52062 :000,000, 000,000,080, 000,094
52068 :000, 000,000, 200,000, 008,190
52074 :808,000, 000,080,064, 080,170
52080 :820,980, 060, 000,081,016,033
52086 :008,085,084, 000, 089,100, 220
52892 :0008,0885,885, 000, 086, U89, 213
52098 :000,085,084,000,125,000,168
52104 :820,000, 080, 000, 000, B00, 136
52110 :842,160,000, 000,000,000, 088
52116 :800,000,255, 255, 255, 080, 145
52122 :178,165,015, 255, 255, 000, 246
52128 :900,880,042,129, 064,001, 220
52134 :817,080, 005,090,160, 240, 246
52148 :063,255, 021,089, 080, 086, 254
52146 :170,170,0085,085, 964, 255,159
52152 :255,064, 020,005, 000,174, 186
52158 :040,000,000,020,000,000, 230
52164 :808,000,000,013,813,013, 235

254
Appendices
Appendix A

A Beginner’s Guide
To Typing In Programs
What Is a Program?
A computer cannot perform any task by itself. Like a car with-
out gas, a computer has potential, but without a program, it
isn’t going anywhere. Most of the programs published in this
book are written in a computer language called BASIC. BASIC
is easy to learn and is built into all Commodore 64s.

BASIC Programs
Computers can be picky. Unlike the English language, which _
is full of ambiguities, BASIC usually has only one right way of
stating something. Every letter, character, or number is signifi-
cant. A common mistake is substituting a letter such as O for
the numeral 0, a lowercase | for the numeral 1, or an upper-
case B for the numeral 8. Also, you must enter-all punctuation
such as colons and commas just as they appear in the book.
Spacing can be important. To be safe, type in the listings ex-
actly as they appear.

Braces and Special Characters


The exception to this typing rule is when you see the braces,
such as {DOWN}. Anything within a set of braces is a special
character or characters that cannot easily be listed on a printer.
When you come across such a special statement, refer to
Appendix B, “How to Type In Programs.”

About DATA Statements


Some programs contain a section or sections of DATA state-
ments. These lines provide information needed by the pro-
gram. Some DATA statements contain actual programs (called
machine language); others contain graphics codes. These lines
are especially sensitive to errors.
If a single number in any one DATA statement is
mistyped, your machine could lock up, or crash. The keyboard
and STOP key may seem dead, and the screen may go blank.
Don’t panic—no damage is done. To regain control, you have
to turn off your computer, then turn it back on. This will erase

257
A Appendix

whatever program was in memory, so always save a copy of


your program before you run it. If your computer crashes, you
can load the program and look for your mistake.
Sometimes a mistyped DATA statement will cause an er-
ror message when the program is run. The error message may
refer to the program line that READs the data. The error is still
in the DATA statements, though.

Get to Know Your Machine


You should familiarize yourself with your computer before
attempting to type in a program. Learn the statements you use
to store and retrieve programs from tape or disk. You'll want
to save a copy of your program, so that you won't have to
type it in every time you want to use it. Learn to use your ma-
chine’s editing functions. How do you change a line if you
made a mistake? You can always retype the line, but you at
least need to know how to backspace. Do you know how to
enter reverse video, lowercase, and control characters? It’s all
explained in your computer’s manuals.

A Quick Review
1, Type in the program a line at a time, in order. Press RE-
TURN at the end of each line. Use backspace or the back
arrow to correct mistakes.
2. Check the line you've typed against the line in the book.
You can check the entire program again if you get an error
when you run the program.

258
Appendix B

How to Type In Programs


To make it easy to know exactly what to type when entering
one of these programs into your computer, we have estab-
lished the following listing conventions.
Generally, Commodore 64 program listings will contain
words within braces that spell out any special characters:
{DOWN} would mean to press the cursor down key. {5
SPACES} would mean to press the space bar five times.
To indicate that a key should be shifted (hold down the
SHIFT key while pressing the other key), the key would be
underlined in our listings. For example, S would mean to
type the S key while holding the SHIFT key. This would ap-
pear on your screen as a heart symbol. If you find an under-
lined key enclosed in braces (e.g., {10 N} ), you should type
the key as many times as indicated (in our example, you
would enter ten shifted N’s).
If a key is enclosed in special brackets, K 4 , you
should hold down the Commodore key while pressing the key
inside the special brackets. (The Commodore key is the key in
the lower-left corner of the keyboard.) Again, if the key is pre-
ceded by a number, you should press the key as many times
as necessary.
Rarely, you'll see a solitary letter of the alphabet enclosed
in braces. These characters can be entered by holding down
the CTRL key while typing the letter in the braces. For exam-
ple, {A} would indicate that you should press CTRL-A.
About the quote mode: You know that you can move the
cursor around the screen with the CRSR keys. Sometimes a
rogrammer will want to move the cursor under program con-
trol. That’s why you see all the {LEFT}’s, {HOME}’s, and
{BLU}’s in our programs. The only way the computer can tell
the difference between direct and programmed cursor control
is the quote mode.
Once you press the quote (the double quote, SHIFT-2),
you are in the quote mode. If you type something and then try
to change it by moving the cursor left, you'll only get a bunch
of reverse-video lines. These are the symbols for cursor left.
_ The only editing key that isn’t programmable is the DEL key;

Zoo
Ge Appendix

you can still use DEL to back up and edit the line. Once you
type another quote, you are out of quote mode.
You also go into quote mode when you INSerT spaces
into a line. In any case, the easiest way to get out of quote
mode is to just press RETURN. You'll then be out of quote
mode and you can cursor up to the mistyped line and fix it.
Use the following table when entering cursor and color
control keys:
When You When You
Read: ‘ Press: See Read: Press: Se
{CLR} |SHIFT _CLR/HOME ) ki 3 COMMODORE 1 EJ
{HOME} ore. CLRIHOME | K2 3 COMMODORE 2 OE
{UP} |SHIFT | t crse4 | ae | COMMODORE 3 bs
{DOWN} TRS | Kaj COMMODORE 3 fr
{LEFT} |SHIFT ||— CRSR | Eis)3 COMMODORE 5 ES
{RIGHT} “—CRSR—| ke J comMopore «6 [ij]
{RVS} crei|[ 9 | R73 commopore||7 [J
{OFF} crt |{ 0 | Ks J COMMODORE 8 _
E 3
{ F2} SHIFT = fl

{ M } SHIFT f3

7“wn ~ _a

{ Fé } SHIFT £5

iis
EN
SO
I) { F8 }
3al

SHIFT ||

260
Appendix C

The Automatic Proof reader


Charles Brannon

“The Automatic Proofreader’ will help you type in program


listings without typing mistakes. It is a short error-checking
program that hides itself in memory. When activated, it lets
you know immediately after typing a line from a program list-
ing if you have made a mistake. Please read these instructions
carefully before typing any programs in this book.

Preparing the Proofreader


1. Using the listing below, type in the Proofreader. Be very
careful when entering the DATA statements—don’t type an
1 instead of a 1, an O instead of a 0, extra commas, etc.
2. Save the Proofreader on tape or disk at least twice before
running it for the first time. This is very important because
the Proofreader erases part of itself when you first type
RUN.
3. After the Proofreader is saved, type RUN. It will check itself
for typing errors in the DATA statements and warn you if
there’s a mistake. Correct any errors and save the corrected
version. Keep a copy in a safe place—you'll need it again
and again, every time you enter a program from this book
or from COMPUTE!’s Gazette magazine or COMPUTE!
magazine.
4. When a correct version of the Proofreader is run, it activates
itself. You are now ready to enter a program listing. If you
press RUN/STOP-RESTORE, the Proofreader is disabled.
To reactivate it, just type the command SYS 886 and press
RETURN.

Using the Proofreader


All listings in this book have a checksum number appended to
the end of each line. An example is “:rem 123’. Don’t enter
this statement when typing in a program. It is just for your infor-
mation. The rem makes the number harmless if someone does
type it in. It will, however, use up memory if you enter it, and
it will confuse the Proofreader, even if you entered the rest of
the line correctly.

261
C Appendix

When you type in a line from a program listing and press


RETURN, the Proofreader displays a number at the top of
your screen. This checksum number must match the checksum
number in the printed listing. If it doesn’t, it means you typed
the line differently from the way it is listed. Immediately re-
check your typing. Remember, don’t type the rem statement
with the checksum number; it is published only so you can
check it against the number which appears on your screen.
The Proofreader is not picky with spaces. It will not no-
tice extra spaces or missing ones. This is for your convenience,
since spacing is generally not important. But occasionally
proper spacing is important, so be extra careful with spaces,
since the Proofreader will catch practically everything else that
can go wrong.
There’s another thing to watch out for: if you enter the
line by using abbreviations for commands, the checksum will
not match up. But there is a way to make the Proofreader
check it. After entering the line, list it. This eliminates the
abbreviations. Then move the cursor up to the line and press
RETURN. It should now match the checksum. You can check
whole groups of lines this way.

Special Tape SAVE Instructions


When you're done typing a listing, you must disable the
Proofreader before saving the program on tape. Disable the
Proofreader by pressing RUN/STOP-RESTORE (hold down
the RUN/STOP key and sharply hit the RESTORE key.) This
procedure is not necessary for disk, but you must disable the
Proofreader this way before a tape SAVE.
A SAVE to tape erases the Proofreader from memory, so
you'll have to load and run it again if you want to type an-
other listing. A SAVE to disk does not erase the Proofreader.
Hidden Perils
The Proofreader’s home in the 64 is not a very safe haven.
Since the cassette buffer is wiped out during tape operations,
you need to disable the Proofreader with RUN/STOP-
RESTORE before you save your program. This applies only to
tape use. Disk users have nothing to worry about.
_ Not so for 64 owners with tape drives. What if you type
in a program in several sittings? The next day, you come to
your computer, load and run the Proofreader, then try to load

262
Appendix C

the partially completed program so you can add to it. But since
the Proofreader is trying to hide in the cassette buffer, it is
wiped out!
What you need is a way to load the Proofreader after
you've loaded the partial program. The problem is, a tape load
to the buffer destroys what it’s supposed to load.
After you've typed in and run the Proofreader, enter the
following lines in direct mode (without line numbers) exactly
as shown:
A$="PROOFREADER.T":B$="{18 SPACES}":FOR X=1 TO 4:A
S=A$+B$ : NEXTX
FOR X=886 TO 1018:A$=A$+CHR$ (PEEK(X) ) :NEXTX
OPEN1,1,1,A$:CLOSEL
After you enter the last line, you will be asked to press
RECORD and PLAY on your cassette recorder. Put this pro-
gram at the beginning of a new tape. This gives you a new
way to load the Proofreader. Anytime you want to bring the
Proofreader into memory without disturbing anything else, put
the cassette in the tape drive, rewind, and enter:
OPEN1:CLOSE1

You can now start the Proofreader by typing SYS 886. To


test this, PRINT PEEK (886) should return the number 173. If
it does not, repeat the steps above, making sure that A$
(“PROOFREADER.T”) contains 13 characters and that B$ con-
tains 10 spaces.
The Proofreader will load itself into the cassette buffer
whenever you type OPEN1:CLOSE1—and PROOFREADER.T
is the next program on your tape. It does not disturb the con-
tents of BASIC memory.
Replace Original Proofreader
If you typed in the original version of the Proofreader from
the October 1983 issue of COMPUTE!’s Gazette magazine, you
should replace it with the improved version below.
Automatic Proofreader
198 8:
PRINT" {CLR}PLEASE WAIT...":FORI=886TO101READ
A:CK=CK+A: POKEL,A:NEXT
110 IF CK<>17539 THEN PRINT" {DOWN}YOU MADE AN ERRO
R":PRINT"IN DATA STATEMENTS." :END
120 SYS886:PRINT"{CLR}{2 DOWN}PROOFREADER ACTIVATE
D.":NEW
263
CG Appendix

886 DATA 173,836,003, 201,150,208


892 DATA 961,096,141,151,0803,173
898 DATA 837,003,141,152,003,169
984 DATA 158,141,036,003,169,883
918 DATA 141,037,903,169,8900,133
916 DATA 254,096,032,087, 241,133
922 DATA 251,134, 252,132, 253,008
928 DATA 201,013,2408,017,201,032
934 DATA 248,005,024,101,254,133
948 DATA 254,165, 251,166,252,164
946 DATA 253,048,096,169,013,032
952 DATA 219,255,165, 214,141,251
958 DATA 863,206,251,003,169,000
964 DATA 133,216,169,819,032, 210
970 DATA 255,169,018,032,210,255
976 DATA 169,858,032, 210,255, 166
982 DATA 254,169,000,133,254,172
988 DATA 151,003,192,087, 288,006
994 DATA 032,205,189,876,235,803
1900 DATA 932,285, 221,169,032,0832
1006 DATA 210,255,032, 218,255,173
19012 DATA 251,003,133, 214,876,173
1818 DATA 003

264
Appendix D

Using the Machine


Language Editor: MLX
Charles Brannon

Remember the last time you typed in the BASIC loader for a
long machine language program? You typed in hundreds of
numbers and commas. Even then, you couldn’t be sure if you
typed it in right. So you went back, proofread, tried to run the
program, crashed, went back and proofread again, corrected a
few typing errors, ran again, crashed again, rechecked your
typing.... Frustrating, wasn’t it?
Until now, though, that has been the best way to get ma-
chine language into your computer. Unless you happen to
have an assembler and are willing to tangle with machine lan-
guage on the assembly level, it is much easier to enter a
BASIC program that reads DATA statements and POKEs the
numbers into memory.
Some of these “BASIC loaders” use a checksum to see if
you've typed the numbers correctly. The simplest checksum is
just the sum of all the numbers in the DATA statements. If
you make an error, your checksum does not match up with
the total. Some programmers make your task easier by includ-
ing checksums every few lines, so you can locate your errors
more easily.
Now, MLX comes to the rescue. MLX is a great way to en-
ter all those long machine language programs with a mini-
mum of fuss. MLX lets you enter the numbers from a special
list that looks similar to DATA statements. It checks your typ-
ing on a line-by-line basis. It won’t let you enter illegal charac-
ters when you should be typing numbers. It won’t let you
enter numbers greater than 255 (forbidden in ML). It will pre-
vent you from entering the numbers on the wrong line. In
short, MLX makes proofreading obsolete.

Tape or Disk Copies


In addition, MLX generates a ready-to-use copy of your ma-
chine language program on tape or disk. You can then use the
LOAD command to read the program into the computer, as
with any other program. Specifically, you enter:

265
D Appendix

LOAD “program name’,1,1 (for tape)


or
LOAD “program name’’8,1 (for disk)
To start the program, you need to enter a SYS command that
tranfers control from BASIC to your machine language pro-
gram. The starting SYS is always listed in the article which
presents the machine language program in MLX format.

Using MLX
Type in and save MLX (you'll want to use it in the future).
When you’re ready to type in the machine language program,
run MLX. MLX asks you for two numbers: the starting address
and the ending address. These numbers are given in the article
accompanying the ML program you're typing. For example,
“Astro-PANIC!’s” addressses should be 49152 and 50777
respectively.
You'll see a prompt. The prompt is the current line you
are entering from the MLX format listing. It increases by six
each time you enter a line. That’s because each line has seven
numbers—six actual data numbers plus a checksum number.
The checksum verifies that you typed the previous six num-
bers correctly. If you enter any of the six numbers wrong or
enter the checksum wrong, the 64 sounds a buzzer and
prompts you to reenter the line. If you enter the line correctly,
a bell tone sounds and you continue to the next line.

A Special Editor
You are not using the normal 64 BASIC editor with MLX. For
example, it will only accept numbers as input. If you make a
typing error, press the INST/DEL key; the entire number is
deleted. You can press it as many times as necessary, back to
the start of the line. If you enter three-digit numbers as listed,
the computer automatically prints the comma and goes on to
accept the next number. If you enter less than three digits, you
can press either the space bar or RETURN key to advance to
the next number. The checksum automatically appears in re-
verse video for emphasis.
To make it even easier to enter these numbers, MLX
redefines part of the keyboard as a numeric keypad (lines
581-584).

266
Appendix D

(1)(Q) vuom — (7)(8)(9)


wil
HO WL OOO®
(MC ))
When testing it, I’ve found MLX to be an extremely easy
way to enter long listings. With the audio cues provided, you
don’t even have to look at the screen if you're a touch-typist.

Done at Last!
When you get through typing, assuming you type your ma-
chine language program all in one session, you can then save
the completed and bug-free program to tape or disk. Follow
the instructions displayed on the screen. If you get any error
messages while saving, you probably have a bad disk, or the
disk is full, or you made a typo when entering the MLX pro-
gram. (Sorry, MLX can’t check itself!)

Command Control
You don’t have to enter the whole ML program in one sitting.
MLX lets you enter as much as you want, save it, and then re-
load the file from tape or disk later. MLX recognizes these
commands:
SHIFT-S:Save
SHIFT-L:Load
SHIFT-N:New Address
SHIFT-D:Display
Hold down SHIFT while you press the appropriate key.
MLX jumps out of the line you've been typing, so I recom-
mend you do it at a prompt. Use the Save command to store
what you’ve been working on. It will save on tape or disk as if
you've finished, but the tape or disk won’t work, of course,
until you finish typing. Remember what address you stopped
on. The next time you run MLX, answer all the prompts as
you did before, then insert the disk or tape containing the
stored file. When you get the entry prompt, press SHIFT-L to

267
D Appendix

reload the partly completed file into memory. Then use the
New Address command (SHIFT-N) to resume typing.

New Address and Display


After you press SHIFT-N, enter the address where you pre-
viously stopped. The prompt will change, and you can then
continue typing. Always enter a New Address that matches up
with one of the line numbers in the special listing, or else the
checksums won’t match up. You can use the Display com-
mand to display a section of your typing. After you press
SHIFT-D, enter two addresses within the line number range of
the listing. You can abort the listing by pressing any key.

Tricky Stuff
The special commands may seem a little confusing, but as you
work with MLX, they will become valuable. For example, what
if you forgot where you stopped typing? Use the Display com-
mand to scan memory from the beginning to the end of the
program. When you reach the end of your typing, the lines
will contain a random pattern of numbers, quite different from
what should be there. When you see the end of your typing,
press any key to stop the listing. Use the New Address com-
mand to continue typing from the proper location.
You can use the Save and Load commands to make copies
of the complete machine language program. Use the Load
command to reload the tape or disk, then insert a new tape or
disk and use the Save command to create a new copy. When
resaving on disk it is best to use a different filename each time
you save. For example, I like to number my work and use
filenames such as ASTRO1, ASTRO2, ASTRO3, and so on.
One quirk about tapes made with the MLX Save com-
mand: when you load them, the message “FOUND program”’
may appear twice. The tape will load just fine, however.
I think you'll find MLX to be a true labor-saving program.
Since it has been tested by entering actual programs, you can
count on it as an aid for generating bug-free machine lan-
guage. Be sure to save MLX; it will be used for future applica-
tions in COMPUTE! Books, COMPUTE! magazine, and
COMPUTE!’s Gazette magazine.

268
Appendix D

Machine Language Editor: MLX


For mistake-proof program entry, be sure to read “The Automatic Proofreader,” Appendix C.
190 PRINT" {CLR} k69";CHRS$ (142) ;CHRS$(8);:POKE53281,1
: POKE53280,1 srem 67
181 POKE 788,52:REM DISABLE RUN/STOP :rem 119
119 PRINT" {RVS}{39 SPACES}"; :rem 176
129 PRINT" {RVS}{14 SPACES}{RIGHT}{OFF}k*J}£{RVS}
{RIGHT} {RIGHT}{2 SPACES}K*I{OFF}K*IL(RVSIE£
{RVS}{14 SPACES}"; ~ srem 258
139 PRINT" {RVS}{14 SPACES}{RIGHT} £G3{RIGHT}
{2 RIGHT} {OFF}£{RVS}£k*I
{OFF} £*I{RVS}
{14 SPACES}"; zrem 35
149 PRINT" {RVS}{41 SPACES}" :rem 120
200 PRINT"{2 DOWN}{PUR}{BLK}{9 SPACES}MACHINE LANG
UAGE EDITOR{5 DOwN}" :rem 6
210 PRINT"£53{2 UP}STARTING ADDRESS?{8 SPACES}
{9 LEFT}"; srem 143
215 INPUTS: F=1-F:CS=CHRS (31+119*F) :rem 166
226 IFS <2560R(S>48968ANDS< 49152 )ORS>53247THENGOSUB
3999 :GOTO210 srem 235
225 PRINT: PRINT: PRINT :rem 18
238 PRINT"K53{2 UP}ENDING ADDRESS?{8 SPACES}
{9 LEFT}";:INPUTE:F=1-F:CS=CHR$ (31+119*F)
srem 29
240 IFE<2560R(E>40968ANDE< 49152 )ORE>53247THENGOSUB
3008 :GOTO230 :rem 183
256 IFE<STHENPRINTCS;"{RVS}ENDING < START
{2 SPACES}":GOSUB1998:GOTO 239 :rem 176
260 PRINT: PRINT: PRINT :rem 179
380 PRINT" {CLR}";CHRS (14) :AD=S:POKEV+21,0 :rem 225
318 A=1:PRINTRIGHTS ("@G90"+MID$(STRS(AD),2),5);"3s"
; s:rem 33
3r5 FORJ=ATO6 :rem 33
3290 GOSUB579: IFN=-1THENJ=J+N:GOTO3290 srem 228
396 IFN=-211THEN 719 :rem 62
400 IFN=-204THEN 799 srem 64
410 IFN=-206THENPRINT: INPUT" {DOWN} ENTER NEW ADDRES
S"3ZZ ru srem 44
415 IFN=-206THENIFZZ<SORZZ>ETHENPRINT"{RVS}OUT OF
{ SPACE } RANGE" : GOSUB1@@@ :GOTO418 :rem 225
417 IFN=-206THENAD=ZZ: PRINT :GOTO319 :rem 238
420 IF N<>-196 THEN 489 srem i353
430 PRINT: INPUT"DISPLAY:FROM";F:PRINT, "TO"; : INPUTT
& iV :rem 234
440 IFF<SORF>EORT<SORT>ETHENPRINT"AT LEAST";S;"
{LEFT}, NOT MORE THAN"; E:GOTO430 :rem 159
450 FORI=FTOTSTEP6: PRINT: PRINTRIGHTS ("G000"+MID$(S
TRS(I),2),5)7"2"G :rem 30

269
D Appendix

FORK=0TO5 :N=PEEK(I+K) : PRINTRIGHTS ("00"+MID$ (ST


RSAN Jy 2)e 3) 30" 3 :rem 66
GETAS: IFAS>""THENPRINT: PRINT: GOTO31@ :rem 25
NEXTK: PRINTCHRS (28); :NEXTI: PRINT: PRINT: GOTO319
:rem 50
IFN<@ THEN PRINT:GOTO316 :rem 168
A(J)=N:NEXTJ :rem 199
CKSUM=AD-INT (AD/256) *256:FORI= 1T0O6
: CKSUM=(CK SU
M+A(I))AND255:NEXT :rem 200
PRINTCHRS (18) ; :GOSUB57@: PRINTCHRS (146);:rem 94
IFN=-1THENA=6 :GOTO315 :rem 254
PRINTCHRS (28) : IFN=CKSUMTHEN5 39 s:rem 122
PRINT: PRINT"LINE ENTERED WRONG : RE-ENTER": PRI
NT :GOSUB18009 : GOTO 319 :rem 176
GOSUB2089 :rem 218
FORI=1T0O6: POKEAD+I-1,A(1I):NEXT: POKE54272,8:POK
E54273,@ :rem 227
AD=AD+6:IF AD<E THEN 3198 :rem 212
GOTO 7104 :rem 198
N=0 : Z=0 :rem 88
PRINT" K£9"; z:rem 81
GETAS: IFAS=""THEN581 :rem 95
AV=- (AS="M" )-2* (AS=",'")-3* (AS=".")-4*(AS="J")-

5* (AS="K") —-6* (AS="L") rem 41

AV=AV-7* (AS="U" )-8* (AS="I" )-9* (AS="0"):IFAS="H


“THENAS="6" s:rem 134
IFAV>STHENAS=CHRS (48+AV) :rem 134
PRINTCHRS (28) ; :A=ASC(AS ) : IFA=130RA=440RA=32THE
N67 :rem 229
IFA>128THENN=—A: RETURN :rem 137
IFA<>2@ THEN 630 :rem 18
PRINT"-1:
GOSUB698: IFI=LANDT=44THENN= {OFF}
{LEFT} {LEFT}"; :GOTO69¢ :rem 62
GOTO57@ :rem 189
IFA<480RA>57THEN58@ :rem 1065
PRINTAS; :N=N*10+A-48 :rem 106
IFN>255 THEN A=20:GOSUB18008 :GOTO680 :rem 229
Z=Z+1:IFZ<3THEN58@ rem 71
IFZ=OTHENGOSUB1808:GOTO57@ :rem 114
PRINT", ";:RETURN zsrem 248
S%=PEEK (209 )+256*PEEK(218)+PEEK(211) :rem 149
FORI=1T0O3:T=PEEK(S$%-I) :rem 67
IFT <> 44ANDT <> 58THENPOKES$-I, 32:NEXT s:rem 205
PRINTLEFTS$ ("{3 LEFT}",I-1);:RETURN :rem 7
PRI
{CLR}
NT" {RVS}*** SAVE ***{3 DOWN}" :rem 236

270
Appendix D

7X3 PRINT"{2 DOWN}(PRESS {RVS}RETURN{OFF} ALONE TO


CANCEL SAVE) {DOWN}" :rem 186
720 FS="": INPUT" {DOWN} FILENA
FS: IFFS$="
ME" "THENPR
; I
NT: PRINT:GOTO31@ :rem 71
730 PRINT: PRINT"{2 DOWN} {RVS}T{OFF}APE OR {RVS}D
{OFF}ISK: (T/D)" ‘ :rem 228
740 GETAS : IFA$<>"T"ANDAS <>"D"THEN74@ :rem 36
758 DV=1-7* (AS="D") : IFDV=8THENFS="90:"+FS$:OPEN15,8,
15,"S"+F$:CLOSE1L5 s:rem 212
766 TS=F$ : ZK=PEEK(53)+256*PEEK(54)-LEN(T
: POKE782
S$)
»ZK/256 :rem 3
762 POKE781,ZK-PEEK(782)*256:LEN(TS) :SYS65
POKE78@,
469 srem 1909
763 POKE780, 1: POKE781,DV: POKE782,1:SYS65466:rem 69
765 K=S: POKE254, K/256: POKE253, K-PEEK (254) *256: POKE
788,253 :rem 17
766 K=E+1 : POKE782,K/256: POKE781,K-PEEK (782) *256:SY
S65496 :rem 235
770 IF (PEEK(783)AND1)OR(191ANDST)THEN78@ :rem 111
rah)PRINT" {DOWN} DONE. {DOWN}":GOTO318 rem 113
780 PRINT" {DOWN}ERROR ON SAVE.{2 SPACES}TRY AGAIN.
"; IFDV=1THEN720 Pa . :rem 171
781 OPEN15,8,15:INPUT#15,E1$,E2$:PRINTE1$;E2$:CLOS
E15:GOTO72@ z:rem 183
790 PRINT" {CLR} {RVS}*** LOAD ***{2 DOWN}" :rem 212
795 PRINT"{2 DOWN}(PRESS {RVS}RETURN{OFF} ALONE TO
CANCEL LOAD)" srem 82
800 FS="":INPUT"{2 DOWN} FILENAME"; F$:IFF$=""THENP
RINT :GOTO319 srem 144
81 PRINT: PRINT"{2 DOWN} {RVS}T{OFFJAPE OR {RVS}D
{OFF}ISK: (T/D)" :rem 227
826 GETAS: IFA$<>"T"ANDAS <>"D" THEN820 :rem 34
830 DV=1-7* (AS="D") : IFDV=8THENFS$="0:"+F$ :rem 157
8406 TS=FS$ : ZK=PEEK(53)+256*PEEK(54)-LEN(T$ ) : POKE782
,2ZK/256 :rem 2
841 POKE781, ZK-PEEK (782 )*256: POKE78@, LEN(T$) :SYS65
469 srem 107
845 POKE78@, 1: POKE781, DV: POKE782,1:SYS65466:rem 78
850 POKE780,9:SYS65493 srem 11
860 IF (PEEK(783)AND1)OR(191ANDST)THEN870 :rem 111
865 PRINT" {DOWN} DONE." :GOTO319 :rem 96
876 PRINT" {DOWN}ERROR ON LOAD.{2 SPACES}TRY AGAIN.
{ DOWN} ": IFDV=1THEN80 — :rem 172
880 OPEN15,8,15:INPUT#15,E1$,E2$:PRINTE1$;E2$:CLOS
E15:GOTO89G srem 192

271
Appendix

1908 REM BUZZER :rem 135


1081 POKE54296,15:
POKE54277, 45: POKE54278, 165
:rem 207
19002 POKE54276,33:POKE 54273,6:POKE54272,5 :rem 42
1903 FORT=1TO200 :NEXT: POKE54276, 32: POKE54273,0:POK
E54272,0:RETURN :rem 202
28000 REM BELL SOUND :rem 78
2001 POKE54296,15:POKE54277,@: POKE54278, 247
:rem 152
2002 POKE 54276,17: POKE54273,4@:POKE54272,0:rem 86
2003 FORT=1TO100:NEXT: POKE54276,16:RETURN :rem 57
3908 PRINTCS;"{RVS}NOT ZERO PAGE OR ROM":GOTO1@8D
:rem 89

272
Index
access array (text adventure) 29 item description array (text adventure) 31
action routines (text adventure) 36-40 item flag array (text adventure) 31
ADSR envelope 148-49 item location array (text adventure) 31
animation 14, 140-42, 173-75 jiffy 66
arrays 175 Joust 4, 14
text adventure 29-31 joystick, reading 141-42
Asteroids 5 Jump Man 5
“Astro-PANIC!”” 232-39 levels of play 14
attack (sound) 148 line numbering 1
“Automatic Proofreader, The” 261-64 Lode Runner 5
automatic routines (text adventure) 34-35 Lunar Lander 223
balloon collisions 12 machine language 15, 83, 139-49
bandpass filter 147 combined with BASIC 124
BASIC 15 games 221-53
combined with machine language 124 main loop 15-16
“Beekeeper” 133-38 in text adventures 32-34
billiard cushion collisions 12 mapmaking (text adventure) 26-27
Blockade 223 Mario Bros. 4
bomb collisions 12 maze generation 212
Breakout 223 milieu 11
“Brunhilde Loves Bruno” 171-89 ML. See machine language
“Burn Rubber’ 204-10 “MLX” 83-84, 265-72
“Campaign Manager” 4, 82-119 “Nessie” 240-54
command summary 92-93 object array (text adventure) 30
formulae 88, 89, 91 object token array (text adventure) 31
strategy 88-93 “Olympiad” 197-203
typing in 84 ON/GOTO statement 37, 46
cassette buffer 141 Oregon Trail 63
characters, programmed. See custom parsing (text adventure) 35-36, 47-48
characters pitch 148
collision detection 141 play mechanic 4, 5-11
collisions 11-12, 141, 177-78, 190-91 Pong 4, 223
Commodore 64 Programmer's Reference PRINT statement 15
Guide 141 “Props” 139-58
communication, game to player 13 punishment 12-13
copying character set 172 “Quatrainment” 76-81
assembly listing 188-89 quests 41-42
custom characters 141-42, 172, 174-75, quote mode 259-60
213 raster interrupt 243
“CUT-OFF!” 223-31 registers, sound 147-49
cutoff frequency 147 release (sound) 149
decay (sound) 148 RESTORE statement 176
delay loop 143 reward 12-13
delete character 65 ring modulation 176
Donkey Kong 5, 14 room (text adventure) 25-26
flags, machine language 146 room description array (text adventure)
“Frantic Fisherman, The’ 123-32 30
game design 3-21, 45-46 room flag array (text adventure) 30
in text adventure 25-43 screen memory 140, 176
hardware interrupt, modifying 144-45 “Sea Route to India” 63-75
“Haunted Mansion” 211-20 SID chip 149
ideas 4-5 simplicity, advantages of 7
IF/THEN statement 46 simulation 11, 63-64, 94
improvisation 22 sound 147-49

273
sound-effects 147-49, 175-76 “Time Capsule” v, 44-59
Space Invaders 5, 223 transparent collisions 11
Space Panic 5 treasure hunt 41-42
sprites 124, 143-46, 172-78, 190-91, 243 Tron 223
collision 177-78, 190-91 typing in programs 259-60
pointer 173-74 variables 21, 29, 32, 135
shape 146 verb token array (text adventure) 30-31
story 5-6, 26 verbs (text adventure) 28, 37-41
strategy games 61-119 video memory, mapping 15
subroutines 16-21 voices 147-49
“Supersprite” 190-96 wall collisions 11
surround 223 Westward Ho 63
sustain (sound) 149 win-lose conditions 13-14
tar baby collisions 11 “Worm of Bemer” 159-67
text adventure v, 23-59

274
ie ee Ea TT EES gE Notes
Notes {SST 2SST ETRE CSRS A
If you've enjoyed the articles in this book, you'll find the
same style and quality in every monthly issue of COMPUTE!
Magazine. Use this form to order your subscription to
COMPUTE!.

For Fastest Service,


Call Our Toll-Free US Order Line
800-334-0868
In NC call 919-275-9809

COMPUTE!
P.O. Box 5406
Greensboro, NC 27403

My Computer Is:
] Commodore 64 []Tl-99/4A [] Timex/Sinclair [] VIC-20 [PET
[_] Radio Shack Color Computer [] Apple [)Atari [J Other
[_] Don’t yet have one...

(_] $24 One Year US Subscription


(_] $45 Two Year US Subscription
[_] $65 Three Year US Subscription
Subscription rates outside the US:
] $30 Canada
[_] $42 Europe, Australia, New Zealand/Air Delivery
[_] $52 Middle East, North Africa, Central America/Air Mail
[_] $72 Elsewhere/Air Mail
[_] $30 International Surface Mail (lengthy, unreliable delivery)
Name

Address
City State Zip

Country
Payment must be in US Funds drawn on a US Bank; International Money
Order, or charge card.
(_] Payment Enclosed (_] VISA
(_] MasterCard [_] American Express
Acct. No. Expires /
¢

eet

.é ~ *

4
‘ _

eri)é na
se A
654
©O22
20400848
+oh
sorts
Ome
oe
©

moe 5
€.% ro v
¢

“7 = yh. Aa oo ran
@ ifs! ‘. 7 AB 2) Ratan E |
Sli >. tA oO ee we Oe a 4 el SO, CE |;
Scher ellcr

ota a e- "7
heii
ee at geet
siete
©
et
06
44
oe§baal

Oo
Auom hud atte ay ete

ia, 6 _
F 4 oy Ver ee] AAO teat ay
' Paden luting oP | aodval

7 7 | wyow
¥ vontepoca prion wii
COMPUTE! Books
P.O. Box 5406 Greensboro, NC 27403

Ask your retailer for these COMPUTE! Books. If he or she


has sold out, order directly from COMPUTE!
For Fastest Service
Call Our TOLL FREE US Order Line
800-334-0868
In NC call 919-275-9809
Quantity Title Price Total
Machine Language for Beginners $14.95°
_______ Home Energy Applications $14.95°
COMPUTE''s First Book of VIC $12.95*
COMPUTE!'s Second Book of VIC $12.95°
______ SsCOMPUTE"s First Book of VIC Games $12.95*
COMPUTE''s First Book of 64 $12.95*
COMPUTE''s First Book of Atari $12.95°
COMPUTE!s Second Book of Atari $12.95"
_______ COMPUTE'’s First Book of Atari Graphics $12.95*
COMPUTE!'s First Book of Atari Games $12.95"
Mapping The Atari $14.95"
Inside Atari DOS $19.95"
The Atari BASIC Sourcebook $12.95"
Programmer's Reference Guide forTl-99/4A $4495" ss
COMPUTE!'s First Book of TlGames $12.95" _
Every Kid's First Book of Robots and Computers $ 4.95t
_______The Beginner's Guide to Buying A Personal
Computer $ 3.95T
* Add $2 shipping and handling. Outside US add $5 air mail; $2
surface mail.
+ Add $1 shipping and handling, Outside US add $5 air mail; $2
surface mail.
Please add shipping and handling for each book
ordered. ae

Total enclosed or tobe charged. ——__

All orders must be prepaid (money order, check, or charge). All


payments must be in US funds. NC residents add 4% sales tax.
[J Payment enclosed Please charge my: [] VISA [_] MasterCard
[_] American Express Acc't. No. Expires /

Name
Address
Ci State Zi

ORCI oe ok ee a a
Allow 4-5 weeks for delivery.
——
<2

Fy
(——-
ow


- é
? .
ww fo

PUVYOv, ae
; rn, "oO a] we) tra ehper? he, 5
. )ar ORSor thesae ( een oo? i, :
- nial a a q

soy sews om: aay oth y -


If you've enjoyed the articles in this book, you'll find
the same style and quality in every monthly issue of
COMPUTE!’s Gazette for Commodore.

For Fastest Service


Call Our Toll-Free US Order Line
800-334-0868
In NC call 919-275-9809

COMPUTE!’s GAZEPTTE
P.O. Box 5406
Greensboro, NC 27403

My computer is:
[.] Commodore 64 []VIC-20 [] Other
01 02 03

[-] $20 One Year US Subscription


[_] $36 Two Year US Subscription
[_] $54 Three Year US Subscription
Subscription rates outside the US:
[] $25 Canada
[$45 Air Mail Delivery
[] $25 International Surface Mail

Name
Address
City State Zip
Country

Payment must be in US Funds drawn on a US Bank, International Money


Order, or charge card. Your subscription will begin with the next avail-
able issue. Please allow 4-4 weeks for delivery of first issue. Subscription
prices subject to change at any time.
[_] Payment Enclosed [_] VISA
L_] MasterCard [_] American Express

Acct. No. Expires /

LIIIIII
IT
ttttttttitttttttLT
belie
Iiiiiiiiiiiirirrreririrrererereerereeeeeteeeeeereeereeeeereeeeeeeteeeetetttttttttt
I

The COMPUTEI’s Gazette subscriber list is made available to carefully screened organiza-
tions with a product or service which may be of interest to our readers. If you prefer not to
receive such mailings, please check this box [1].

SSSSSeeneeeeens
Worlds Inside Your 64
COMPUTE!’s Second Book of Commodore 64 Games gives you 16
new worlds to explore. From photographing the Loch Ness
monster to running a presidential campaign, these games put
L you in unique worlds where your strategy, skill, and knowl-
\ edge are tested to the limit.
\ You'll find that each of the games is of the same high
+ quality you’ve come to expect from COMPUTE! Publications.
. Some of the best games from COMPUTE! magazine and COM-
_ PUTE!’s Gazette are collected here, along with several others
Met have never before appeared in print. All are ready to
)
4 2
ype in and play.
Among the worlds you'll find in this book are:
¢ “Campaign Manager,” where you're running on the _2a
Democratic or Republican ticket, hoping to become
+ president.
¢ “Brunhilde Loves Bruno,” a dazzling game inhabited by
—- Valkyrie music, and lovers struggling to reunite.
“Olympiad,” a two-player game where knights fight a
life or death battle in a labyrinth.
¢ “Time Capsule,” a text adventure game that tests your
courage as you try to escape a dangerous prison and re-
turn to your own time.
¢ “Astro-PANIC!,” with flitting aliens that try to destroy
your base.
¢ ‘The Frantic Fisherman,” where charging sharks and
deluges of rain threaten your peaceful fishing trip.
¢ And 10 more games that carry you far into the future or
deep into the past.
Other articles show you how to write your own text
adventure games and how to design a videogame from start to
finish. There are even special-purpose programs included
which make error-free program entry painless.
You expect excellent, playable games from COMPUTE!
Publications. COMPUTE!’s Second Book of Commodore 64 Games
is no exception. From beginning to end, this book will give
you countless hours of challenging entertainment.

ISBN 0-942386-64-7

You might also like