Coders of a certain vintage will be familiar with the story of Mel, the Real Programmer in which Ed Nather (writing in 1983) relates his experience from 20 years previously in attempting to patch a BlackJack program written by his ex-colleague (Mel Kaye) for the ancient RPC-4000 computer, and how the complexity of the code he had to work through left him so impressed with Mel’s familiarity with the inner workings of the computer that he abandoned the attempt to patch the code and even 20 years later, he still held Mel as the archetype of a “Real Programmer”.
I first came across the story on a BBS sometime the early 90s, at a time when I was just starting to become competent with x86 assembly code, and self-modifying code was a pretty fascinating idea, as was extreme performance optimisation.
Then recently I came across the Mel story again, and went looking to see what (if anything) of the legendary machines and codes had made their way into the retro-computing archives across the net. The ‘holy grail’ would be a copy of the original BlackJack program with the back-to-front cheat option, and major bragging rights would come from being able to make the patch that Ed Nather had given up looking to make.
I’m not there yet.
What I have found so far is:
- What looks to be a dump of a paper tape copy of the BlackJack game for the LGP-30, the predecessor to the RPC-4000 – I have attempted (so far unsuccesfully) to load this into an LGP-30 simulator. I also can’t work out how the contents of the paper tape could be decoded into object code (which could then be disassembled).
- A printout from a run of that LGP-30 version of the game
- A copy of the RPC-4000 reference manual, with description of registers and opcodes
- Documentation for the RPC-4000 version of BlackJack, written by Mel Kaye, including what seems to be a writeup of the feature that Ed was asked to make work correctly (“PLAYING CONVENTIONS…8:. If SENSE SWITCH 32 is depressed, there is a better than normal chance of an ace being dealt as the player’s first card”).
From looking at the opcodes in the programming manual, I believe that the loop in question must have been based around opcode 21 “COMPARE MEMORY GREATER”, with the eventual ‘overflow’ to opcode 22 (TEST MINUS).
I don’t know what sort of work this loop would have been doing, although given the program documentation clearly states program execution starts at 00000, and that is also where (in the story) control is eventually transferred to once the loop exits, the loop must have been some kind of post-game cleanup, ready to re-start.
So my current theory is
- the data stored in the upper memory locations is the card deck, (stored initially perhaps as numbers 1..52)
- as cards were “dealt” they were marked as such by (e.g.) setting the sign bit
- the loop without apparent exit is going through the pack removing the ‘dealt’ marker, prior to being shuffled at the start of a new game.
It is apparent that Ed’s memory was not completely accurate; not completely surprising given the 20 year gap from when the events occurred until when they were documented. He mentions the clue that helped him understand the way the loop exited as being the fact that the index register bit was set even though Mel never used the index register, and says this index register bit is “between the address and the operation code in the instruction word”. However reference manual is clear that the index register bit is the least significant bit, and in fact the opcode bits (0..4) are adjacent to the data address bits (5..16). I can’t see any way the index bit could have been part of the loop/overflow.