Surias – writing a program can be fun!

Me in 1981 using a Commodore PET to play Surias.

This is an unpublished article I wrote in around 1981 about a game my brother and I wrote for the Commodore PET. I am yet to find a program listing or cassette for the game, which I would love to spin up in a simulator! Incidentally, the Chris Howland mentioned in the article turns out to have quite an interesting life – born in Britain he became quite famous in Germany as a DJ, musician and actor.

After the initial novelty of having a computer in the house wore off, realising the limitations of the system (i.e. ‘IT’ wouldn’t wait on us hand and foot, answer the door, write best-selling war games) we thought about writing a good, solid, and maybe even an epic (-ette, -ish, sort of) program. Perhaps that was a mistake, but this is the story of our program, and how it was written. This is the story of SURIAS. A legend in its own FOR/NEXT loop.

Around the end of 1978 (yes, that long ago!), we (my brother Laurie, and myself) felt there was a lacking of interactive war games (except the infamous Star Trek) for the PET. This, of course, means the 2001 series (8k). We still have our old PET, and so this program runs in 8k, and was written in the old BASIC, although only two lines don’t work for new ROM PETs. A friend of Laurie, Andrew Shorney, who, by a meaningless coincidence, writes programs in COBOL for a supermarket chain, and himself, were in a pub getting rather drunk. (If there are any eligible Surias followers out there, it was the Naval Volunteer in Bristol). Andrew came up with the concept for the game. That was just the idea that you move armies from one county to another, and you have a stronghold, to which troops arrive by sea, and that the army of Surias has to defend its own country. You are, therefore, invading a country, in a time when the two opposing sides confronted each other on the battle field.

The name ‘Surias’ was invented, also, by Andrew (It’s an anagram of a certain large, well-known communist country). One evening Laurie told me the concept, but he couldn’t remember the name. “It’s an anagram of a large Communist country’: he said. A few minutes later I said “Surias?” I had re-discovered the name, and therefore claim a tiny fraction of the fame for the name. One Sunday, after lunch, Laurie took our PET over to Andrew’s house. By that evening the PET was back in our house with the map graphics on tape. Full credit for the graphics must go to Andrew, who before then, had never used a PET. Influenced by Chris Howland’s ‘Something Bit Me’ we began to try to write Surias.

That was a mistake.

A few days later: “We’re just being far too ambitious. It’s impossible”

Six months later. With the added knowledge of dimensioned variables (things like ?V(X) ) I decided it was possible to write Surias on our PET. Yes. Dimensioned variables, or as I call them, variable variables, they were the thing. In a few days time you could move troops, and it would print the numbers on the screen.

Now a few words to those thinking of writing a game on any computer, but especially the PET. A ‘Programmer’s Toolkit’ is very nice, and it makes life a lot easier, but it is not a necessity. To be honest, renumberers are necessary, but machine code versions on tape are just as good. Access to, or preferably ownership of, a printer is a huge help. We got our printer about halfway through the development. The toolkit came too late to be of much use.

Now back to the development. I put in the tests to check if there were enough armies in a particular county, and soon ‘Surias’ began to take shape.

Co-writing a program is a good idea. Many a time I would declare something impossible, returning a few minutes later only to find that Laurie had solved it.

Probably the biggest mistake we made, apart from starting on this whole venture in the first place:, was to structure the program badly. This is a direct result of not thinking how we would tackle each section of the program, in advance. I know that is the correct procedure, but those who are against letting a program take shape as it is written are probably the ones who stated a few years ago, that it was bad programming practice to use a ‘GOTO’ statement in a program. This may sound odd, but programming is more fun this way. Certainly, it is a lot less efficient, but programming becomes more of a pastime when done in this way. Heaven forbid, though, if people like Andrew wrote their COBOL programs that way!

There are many classics of space wasting in Surias. There are two different sections for winning and losing, with statements like “BATTLE IS UNDERWAY, SIR” being repeated. The table of POKE locations for the screen is repeated, but you need only enter it once, and change the line numbers for the second, or not at all, if you see the end of this article. These ‘faults’ are mainly due to the lack of a printer and toolkit when the main program was structured. The most useful toolkit function, apart from RENUMBER, we found to be FIND, which will find any variable, word, command, sentence, etc. in the whole program, and list it.

Soon the program was playable, and feeling pleased with ourselves, we showed it to my brother-in-law, saying we had just bought it from that PET orientated SOFTware house, for £5. He played a game, and remarked on what a bargain it had been. He now, of course, knows that we wrote it, and has a version running on his Nascom-1 under Xtal Basic. My other brother, Ashley, who has a KIM, has yet to implement Surias on his machine!

The July 1980 cover of Practical Computing magazineThe program was left alone for some time, but then we started making little additions. The random sundry assorted disasters, for instance, or the summer and winter messages. One day we took our big box of software over to a friend’s house, Ken Otway, who looks exactly like the Tuscan designer on the cover of July 1980 Practical Computing. We showed him our latest version of the game. He gave us two very good ideas to improve it, incorperated in this version. One was to have battle reports being printed at the bottom of the screen, instead of the screen clearing every time. The other was to have something flashing on the screen where a battle is taking place. Should you be embarking on the process of writing a game, get as many people as possible to play it, and make suggestions.

The program is in no way intended to be at all historically accurate, or geographically correct.

February 1981: Shock! Horror! Bug Time

“Here,”said Laurie. “Get this American Cream Soda down you…you’re going to need it.”

I needed it. He had just discovered that if you capture counties 1-6 in any order, you won the game instantly. (Well as quickly as it takes to get counties 1-6). Bye bye, good times. Hello headaches.

April 1981: What was wrong with the program, is really rather embarrassing.

Many moons ago, when you could only hike through the galaxy on radio, I had this ace little routine that stopped any enemy armies accumulating in county 6, if you surrounded it. There was, however, a little snag…it didn’t work! Ho-hum. What could we do when inquisitive hackers asked what the routine did? “Oh yes,”came the reply. “That’s our fingerprint routine:” And there it remained. Infact, it was that, combined with line 550 being where 3395 is now, that messed it all up. The line to check if county 6 was lost had always read:
IF N(6)=0 THEN 1870

Due to friendly negative numbers popping up, we changed it to:
IF N (6)<=THEN 1870
...only going to prove that we're human, I suppose.

I hope you enjoy the game, and to save you thinking them out, here are some suggested alterations:

a) Give yourself more armies. (Line 270)

b) Give the PET fewer armies. (Line 310)

c) Make a 'disaster' less likely to happen. It stands at 1 in 20 at the moment. To make it, for instance, 1 in 50, change line 2170 so:
2170 PY=1:M0=51

Other possible refinements, if you have the memory, and/or money, could be CB2 sound, light pen (we've got one, but not enough memory to add the facility!), levels of difficulty, colour graphics, hi-res, and so on. Perhaps you might prefer "'Ark at they soldiers, sire:" in line 1520. There's no accounting for taste...

Thanks once again to Andrew Shorney, for thinking up the concept at Gateway's expense, and doing the map, Ken Otway, for helpful advice, and to Roger Horsman, for making us feel like well-known Pet Pundits. Also to Chris Howland, another 'calcaholic' like myself, and for giving us the sheer nerve to write a program.

Posted in computers, nostalgia | Tagged , , , | Leave a comment

Noughts and crosses

The cover of 6502 games, a bitmap style picture of a cowboy being shot.I just inherited a load of books on programming the 6502 processor in assembly language (and a Kim-1 computer, more on that later!). Among them was an intriguing 1980 book by Rodnay Zaks called 6502 Games. Zaks wrote what, for many, is the default text book on programming the 6502, but this book is a bit more playful.

The Games Board for the Sym-1 computer

The games in this book are based around a hardware accessory for the Sym-1 computer. The Sym-1 was very much like a Kim-1, a 6502-based development board. (Intriguingly I read somewhere that it could use an oscilloscope as a VDU, I’d love to know more about that!) The Sym-1 Games Board consists of a bunch of LEDs and a number keypad, and even though I don’t have one of those, nor a Sym-1, the book itself is interesting.

A page from the book where Zaks discussed artificial intelligence

I just noticed that the Games Board seems to be made by Sybex, who published the games book. Maybe this book was just a ruse to sell hardware. Anyway…

The most complex game is in the final chapter: ‘tic tac toe’, or noughts and crosses as we call it in the UK. Artificial intelligence long pre-dates this book, of course, but it’s interesting to see the term used here to describe a computer playing a game. It got me thinking about two approaches to solving this problem, which he discusses:

1) A heuristic approach, where the computer learns from its mistakes. This is, I think, how LLMs work, by training on huge amounts of data. It’s also how the matchbox-based noughts and crosses engine, MENACE, works. Often these systems come up with models that the creators of the tools don’t themselves fully understand. This approach takes time and a lot of memory, something lacking on a 1980 home computer. (By the way, there’s a great video of Matt Parker demonstrating MENACE to Professor Hannah Fry in the 2019 Ri Christmas Lectures).

2) A human-programmed algorithmic approach. This requires much more thinking by a human programmer, who needs a deep knowledge, in this case, of how to play the game and all its possible strategies and outcomes. The human applies the usual skills of computational thinking to solve the problem of how to get a machine to play a game that normally humans play.

So which approach is best? Zaks’ hand was forced down the second path due to lack of computer memory, but it strikes me that – if the problem is simple enough – it’s best to take the human-programmed route. The designer learns more. The algorithm is not opaque, you can challenge it if you think it’s biased. It’s open to inspection, improvement in a way LLMs, for example, seem not to be.

I don’t think I’ve ever coded a noughts and crosses game, so inspired by Rodnay Zaks’ very thorough discussion of approaches to creating algorithms for the game, I thought I’d have a go at writing one in Python.

Broadly speaking, he suggests assigning a numerical value to each potential square depending on the threat from the human opponent and the machine’s chances of winning. Clever.

I know that what I’m doing here below is not original, it’s purely an exercise for relaxation in creating some simple programs to play a game, inspired by reading a chapter in a very old computer book.

Simplest version

I started by writing a version for two human players, just so I could set up a user interface and handle the board, detecting wins and draws. The code is here.

It just uses a list to store the board, with 9 elements. A dash is used to show an empty square, capital O and X for each player’s marks. It scans each row, column and diagonal to counts Os and Xs, and if there are 3 it knows someone has won. It also counts free squares, so if no-one has won and every square is filled, it must be a draw. You make your move by typing in the number of the square:

012
345
678

Shooting fish in a barrel

As a stepping-stone to a clever machine that can beat me, I created a laughably simple version. In this one, the human plays against the machine which always just picks the first available square. As the human always goes first, it’s incredibly easy to beat.

I have created you and now you will destroy me

Then I tried to implement something much cleverer, and closer to Zaks’ algorithm. I don’t doubt there are much more elegant and compact ways of doing this, but I wanted to code something a child (and I) could understand.

Zaks’ algorithm is impressively sophisticated, especially for a small 6502 assembly language program. It incorporates randomness and the machine varies its skill level depending on how well it’s doing, which makes for a much more entertaining opponent. I decided to do something much simpler.

This clever version has a new list called ‘move_weight’ which it uses to score how good a square might be. It scans rows, columns and diagonals. Squares already played get a score of 0, playable squares 1. An additional point is added if the human already has placed a O on that line. If the human has two Os on the line, it gets an extra 5 points, but if the computer has two Xs on the line and can win, it gets 6.

You can also choose who goes first, human or machine. The human always plays O, the machine X.

It’s a pretty boring opponent, always playing the first square suggested by the algorithm if there’s more than one choice, but it’s also pretty good. When I’m being dozy, it can beat me!

It also prints out the ‘move_weight’ list, so you can see how it made its choice and it also prints out when it thinks it’s in danger of losing or spots a winning square. A typical bit of game play might look like this:

0 1 2    - - -
3 4 5    - - -
6 7 8    - - -

Player O go:
0
0 1 2    O - -
3 4 5    - - -
6 7 8    - - -

Computer thinking...
[0, 1, 2, 1, 1, 1, 2, 1, 2]
0 1 2    O - X
3 4 5    - - -
6 7 8    - - -

Player O go:
4
0 1 2    O - X
3 4 5    - O -
6 7 8    - - -

Computer thinking...
danger at 8
[0, 1, 0, 1, 0, 2, 2, 2, 6]
0 1 2    O - X
3 4 5    - O -
6 7 8    - - X

Player O go:
6
0 1 2    O - X
3 4 5    - O -
6 7 8    O - X

Computer thinking...
danger at 3
winning move at 5
[0, 1, 0, 6, 0, 8, 0, 2, 0]
0 1 2    O - X
3 4 5    - O X
6 7 8    O - X

Game over!
Winner is X

micro:bit version

Using IDLE for the first time in ages made me miss the micro:bit Python Editor, so I made a version for the BBC micro:bit. It uses the serial console for entering moves and it even works in the simulator, as well as showing the board on the micro:bit’s LED display. Bright LEDs are the human’s Os, and dim LEDs are the computer’s Xs. I may see if I can create a version you can just play on the micro:bit itself with no computer attached, and maybe add a bit of randomness to make the computer a more interesting opponent. There’s also clearly scope to use functions to shorten some repetitive bits of code.

Self-contained micro:bit version

I also made a self-contained version that you can play just using a micro:bit V2, with no serial console or computer needed.

It works best with a headphones or speaker attached so you can clearly hear the speech instructions and who wins.

This version only works on a micro:bit V2 with built-in speaker which has more memory.

Press A to go first, B for micro:bit to go first.

Press B to step through possible play squares which blink.

Press A to choose a square to play.

Press reset button on back of the micro:bit to play a new game.

In conclusion

All in all, a nice, relaxing coding activity prompted by a 1980 book on programming the 6502!

Posted in computers, microbit | Tagged , , , , , , | Leave a comment

Raspberry Pi video art installation

My daughter makes video art and needed a simple solution for showing one of her pieces continually in a loop.

I used an old Raspberry Pi model B for this. I just realised that the only place I had documented this was on my now-deleted Twitter account, and I can’t recall where I learned about this method, so I just had a quick look at the machine in question to try and work out what I did to make it. I’m recording it here in case it’s useful to anyone else or, more likely, me.

The Pi has Raspbian Buster on it, no GUI/desktop, just the command line stuff. It needs omxplayer, which I think was installed by default.

I put the source video MP4 file in the default pi user’s home directory. (I may have transferred the file from a USB stick using fdisk to identify and

sudo mount /dev/sda1 /media/usb-drive/

to mount the drive, but you could also probably transfer the file using SFTP, FTP over SSH).

I also doubtless used raspi-config to force the audio to either HDMI or the 3.5mm audio jack, and maybe alsamixer to set the volume level.

The magic happened by editing rc.local:

sudo nano /etc/rc.local

Then I added some lines so it looked a bit like this:

# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
omxplayer -o local --loop /home/pi/video-art.mp4 &
exit 0

Now when the Pi reboots, after quite a lot of boot-up text scrolling, the video plays and loops automatically. Connect to your monitor or projector and install in your art gallery!

Posted in Raspberry Pi | Tagged , , | Leave a comment

Why did 1973 matter to Classic Mac OS?

So I was clearing off an old 350MHz graphite Apple Macintosh G4 Server which had OS 10.4.9 on it, and decided to put Mac OS 9.2 on it for the lolz.

This was a mistake, as I had been intending to sell it, but now I am discovering old software, games and artwork I made many many years ago.

One thing that intrigued me was this dialogue box that popped up:

Mac OS 9 error message that the clock is set to a date before 1973

The motherboard’s battery long since died and I removed it, so the system clock goes back to its default setting. But why does Mac OS care if the clock is set to a date before 1973? Why 1973 specifically?

1970 is a significant date in computing – midnight UTC on 1 January 1970 is ‘the UNIX epoch‘ base. Time in Unix is measured from this point.

But 1970 is not 1973, and OS 9 is not Unix. (Its successor Mac OS X was, of course, built on Unix.)

I did a bit of digging into dates in HFS+, the Macintosh file system widely in use around the time this machine was made, around the turn of the millennium. Or Y2K if you prefer.

HFS Plus stores dates in several data structures, including the volume header and catalog records. These dates are stored in unsigned 32-bit integers (UInt32) containing the number of seconds since midnight, January 1, 1904, GMT. This is slightly different from HFS, where the value represents local time.

The maximum representable date is February 6, 2040 at 06:28:15 GMT.

The date values do not account for leap seconds. They do include a leap day in every year that is evenly divisible by four. This is sufficient given that the range of representable dates does not contain 1900 or 2100, neither of which have leap days.

So its timestamps start in 1904. And end in 2040. So, some more dates – but neither of them is 1973!

I tried searching the internet for anything about Mac OS and 1973, about the text of the dialogue box and found almost nothing. I did find a TikTok about an old clamshell iBook and this poem by Jeffrey Joe Nelson:

System Note

Your Macintosh’s clock is set to a year before 1973.

This may cause certain of your pomes to behave erratically.

So then I asked around at work, and after kicking around a few ideas, a colleague has, I think, probably solved it.

Look at the wording of that dialogue box very carefully…

Network time error

Your Macintosh’s clock is set to a year before 1973. This may cause certain applications to behave erratically.

[my bold]

Now my colleague reasoned thus:

Counting seconds in a 32 bit number gives you 136 years’ worth of counting.

If the classic Apple Mac OS epoch (zero time) is indeed 1904,  then 1973 would be precisely half way through that range.

If for reasons of temporary insanity, say, a third party developer held that as a signed 32 bit number, anything before 1973 would look negative. Negative time sounds like a dangerous concept. Certainly one that could cause applications to behave erratically.

No-one inside Apple would be so foolish.

But the developer of certain applications might!

I think he’s cracked it! What do you think?

David Tennant in Doctor Who saying wibbly wobbly timey wimey stuff

Updates!

@prozacchiwawa@functional.cafe on Mastodon adds this intriguing comment:

If an app cheaply checked whether subtracting two dates yielded a positive or negative result in signed space, moving the two dates farther apart than half the unsigned space could fool it. I’m wondering if that’s what they had in mind.

For example, 2023 (0xdfeb9580) – 1941 (0x4599a080) yields 0x9a51f500, which might mean to some apps that 2023 is before 1941.

 

 

Posted in Apple, lowendmac, operating systems | Tagged , , , | Leave a comment

This link may be unsafe

Or: The Straw That Broke This Camel’s Back

Screenshot showing how an https link to my Mastadon page was changed to http by Twitter, triggering a security alert

Elon Musk changed Twitter bio links to Mastadon to http instead of https – or blocked them.

He is a free speech absolutist free marketeer who doesn’t believe in free speech he doesn’t like, nor does he believe in free market competition.

Effectively he changed users’ profiles to make it look like they are scammers.

An insane way to treat users, aside from the many other, probably more important, reasons to quit Twitter.

Anyway, I’ve deleted my Twitter account now.

I know there are reasons to keep your account live, but, if you’re a journalist, I ask you especially to consider ceasing to post on Twitter and only use it for passive research, out of solidarity with your colleagues on The New York Times, Washington Post, CNN, Voice of America and other outlets who had their accounts suspended by Elon Musk for reporting on him.

  • Your DMs are not secure and may be used against you, just as he has used internal private messages against people
  • Your account could be suspended at any time and you won’t be told why
  • Posting on Twitter is providing free content on a toxic platform whose owner is using it to suppress journalism and spread disinformation, for example about COVID

twitter is over if you want it

Posted in internet | Tagged , , | Leave a comment