Creative software design and construction has brought me great joy. I was lucky to have access to computers much earlier than most of my peers.
Here are some of the things that I've made just for the fun of it or as part of school assignments
- Four-deck blackjack, HP-65 calculator, 1974
My father was a blackjack card counter who eventually became unwelcome to play the game at the casinos he preferred so he switched to poker (7th place Texas Holdem in the World Series of Poker). Our HP-65 programmable calculator could store programs up to 100 keystrokes and had ten registers plus the 4-level RPN stack. He challenged me to get this primitive calculator to play blackjack with four decks, including splits and doubling down.
- Chemical compound listing, BASIC, CDC 6600 mainframe, 1975
A sophomore chemistry assignment required me to write out every combination of 41 positive valences with 43 negative valences. This was nearly 1800 lines of writing. For example:
sodium chloride NaCl Na+Cl- disodium oxide Na2O Na+Na+O-- trisodium phosphate Na3PO4 Na+Na+Na+(PO4)--- ...and so on
- Hangman Program, APL, CDC 6600 mainframe and Tektronix 4013 APL Terminal, 1977
Despite being in high school, I was allowed to use UNLV's graphics terminal during the summer. I wrote an APL program that showed the typical hangman game stick figure appear with each incorrectly guessed letter. I had to read the Tektronics terminal spec and play around a lot until I figured out how to send graphics byte code to the terminal, and had to create a vector character font. It was my first real graphics program.
- Chess Program, FORTRAN, Prime 450 Minicomputer, 1979
I got the rules implemented and a very rudimentary mini-max evaluation going so it played legal but very bad chess
- Star Trek, BASIC, Prime 550 Minicomputer, 1981-2
I made major modifications to the standard Star Trek game that had been going around for years. It was real-time so if you hesitated you'd keep getting fired on. It had full-screen character graphics instead of scrolling character graphics so the long-range scan, the short-range scan, and the various status indicators updated in real time. The Klingons were smarter. It was the most popular game on Occidental College's minicomputer.
- 3D graphics pipeline, Pascal, HP 9286A microcomputer, 1983-7
I was lucky that Dr. Jim Blinn, one of the pioneers of Computer Graphics, taught my Computer Graphics class at Caltech. This was his first time teaching the course and we all knew it was special. We each wrote a complete 3D graphics pipeline in Pascal down to the pixel level (there was no other API), including clipping, quadric curves and surfaces, and hidden line elimination. I later ported it to a Apple II/Z80 hybrid, and then to an IBM PC AT's Microsoft Pascal and 8086/8087 assembler.
- Planar Embedding, C language, VAX 550 Minicomputer, 1983
My first C language program. I implemented a fairly complex graph algorithm and was amazed that it worked the first time I ran it, which is a testement to the clarity of Kernighan and Ritchie's book The C Programming Langauage.
- Dithered flood fill algorithm, 68000 assembler, HP 9826A microcomputer, 1983
- VLSI design application, Pascal, HP 9826A microcomputer, 68000 assembler, 1983-4
- MSDOS utilities, 80286 assembler, 1984-6
Wrote various useful utilities including a disk usage tree that rolled up totals to the root. Wouldn't it be nice if, 35 years later, Windows could do this?
- Self-modifying Breshenham, 8086 assembler, IBM AT, 1985
A line rasterizer that replaced branchs that identified the current octant by modifying the remaining branch instructions instead, leading to more setup but less branching. The break-even point was a ten-pixel long line.
- Mandelbrot Set, 80286/80287 assembler, IBM AT, 1985
As soon as A. K. Dewney's Scientific American article on the Mandelbrot Set came out, I coded it up in Pascal. Soon after, I rewrote in in 80287 assembler, optimizing the main loop so as to never need access to memory outside the floating point stack.
- Chess with incremental evaluation, C language, IBM AT, 1987
This new chess program incrementally calculated square control based on the delta from the previous position.
- Tektronic terminal emulator for PC, 1988
I wanted to be able to do my CAD work from home so I wrote a terminal emulator.
- Desktop PacMan game, Microsoft Windows, 1991
This was a little pacman that chased the mouse cursor around the windows desktop, avoiding windows, and going "waka-waka-waka...". I didn't have a microphone so I plugged the headphones into the mike jack and talked into them, which worked!
- Nethack modifications, MSDOS, 1995
I downloaded and built Nethack and played around with some small modifications. Just getting it to build on the PCs of the time was a challenge.
- Document concordance, PHP 2003
A friend wanted an online concordance (list of all word occurrences) for a large document. At his urging, I learned PHP and set this up for him in just a few days. This led to a many years of PHP development.
- APL Interpreter, C++, 2004
Between terms while getting my teaching certification I spent a solid month writing a complete APL Interpreter.
- Class Planner, Excel automation, 2004-10
I needed a compact way to plan my upcoming classes and created an Excel solution that let me easily shift lessens forward or backward in time.
- Bouncer game, Java, 2005
While learning Java I wrote a very simple video game where the object is to use a repulsive cursor to direct a bouncing ball to hit all the pegs on the board. I no longer include a link to this because most current browsers require special configuration to use the APPLET tag.
- NY Times Puzzles, C#, 2005
The NY Times published a series of special puzzles. Two lent themselves to brute force computer solutions. I learned enough C# to write a simple UI and solver for each of them in about eight hours.
- Multi-threaded programming, 2006
I bought my first multiple-processor computer and made my Mandelbrot and chess programs multi-threaded as a way to get more experience with the relevant techniques
- Equation grapher, Excel automation, 2007-10
None of the free off-the-shelf equation graphers were able to make the graphs I needed to illustrate math problems. I wrote an Excel solution in VB that let me graph multiple curves and decorate them as required. The workflow let me create lots of graphs quickly.
- Right triangle illustrator, Visio, 2008-10
I needed to be able to make high-quality illustrations of right triangles where some of the dimensions were given. Visio was a great tool for this and I was able to declaratively specify all the needed logic, which included placing angle dimensions outside the triangle when an angle got too small to fit the numbers inside.
- Logic Problem Solver, Java, Swing, OWL, 20011-12
I started hearing about the Semantic Web and learned a bunch about RDF, OWL and related technologies. I wrote a Java Swing-based UI and a custom OWL wrapper, and modelled the type of puzzle-book logic problem that have statements such as: Mary likes ice cream and Jasmine doesn't like cake; Mary drives a car and neither Jose or Karl rides a bicycle, etc. where you have to figure out everyone's preferences. The cool thing about this type of semantic model is that once you build the model the problem is solved almost like magic.
- Project Euler problems, Python, 2017
I took an online MIT Python course with a friend who was new to programming. For fun, I also started using Python to solve math problems from Project Euler, making it through the first 65. As part of this, I wound up with a quite extensive set of math classes including a list of prime numbers that expands on demand.
- Adventure Game Machine Learning Infrastructure, Python, 2019
I took MIT's one machine learning class and loved the culminating project, which was an adventure game. I was disappointed with the procedure nature of the provided and made the adventure game content 100% declarative and made the machine modelling interface declarative also. Using this declarative infrastructure, I specified an emulation of Hugh Lampert's 1980 "C.I.A. Adventure" game, written in BASIC, which I'd enjoyed many years ago. I replaced the provided TTY logger with a full-screen dashboard class, which is useful enough that I expect to make a separate github project for it.