In 1979, I dropped out of high school. Perhaps I was a bit disillusioned by the whole "mass education" thing or maybe I was just an idiot. Before I left, though, I did manage to acquire a taste for computers even though all I had ever done were trite little programs written in EDU-27 BASIC on the Digital PDP-8 we had at school... when it wasn't broken. The programs were written using cards that had to be filled in with pencil. Despite this, I still wanted a computer of my own.
My parents, bless their hearts, filled that desire. In 1980, they purchased an Atari 800 computer with 16K of memory (same amount of memory as that great hulking PDP-8 beastie). It also had a 410 cassette recorder. I think it cost about CAD $1400.00 at the time. Which was a lot. Being a recent drop-out, I believe they knew they were rolling some hefty dice on me.
The computer was meant to be for the whole family but I was the only one who ever used it. After first mastering Star Raider, I learned Atari BASIC and wrote a few simple programs. A slot machine game. A hangman game. All just using plain old text. Eventually I moved on to more complex stuff but still written in BASIC. Along the way, I added a 32K memory expansion (a Christmas present from my parents). I eventually got an 810 disk drive though I don't recall how. I used that bloody cassette recorder for three years.
By 1983 I started getting interested in 6502 assembly language. I remember seeing sample assembly programs and not being able to make one ounce of sense out of any of them. How could this little sequence of nonsense produce this stunning explosion of colour on my screen? I had to figure this out.
I was unfortunately living out in boonie-land with nobody available to answer questions. All my computer friends pretty much stopped at BASIC and besides, they were all Apple II+ owners who often referred to yours truly as "that Atari guy". They were a tight-knit group, those Apple guys.
So I wound up scouring magazine stands for any magazine that had an assembly program listing for the Atari (wasn't much). In the end, it took me almost an entire year to learn 6502 assembly language. As it turned out, I still had a little ways to go. More on that later.
Now it's 1984 and one day I am reading about how Sheldon Leemon's awesome Instedit tool received a $25,000 prize and a crystal trophy from Atari as part of their "Atari Star Award" promo. I felt pretty certain that I could write a character editor as good as if not perhaps better than Instedit and write the whole thing in assembly language. So I set out to do just that.
In a few weeks I had the character editor near completion and it was only about 4K. One feature was still missing, however. Instedit had this little text window which held about four lines of text and you could type into it to see how characters looked up against one another. My character editor didn't have anything like that. I didn't have any room left on the display for it so I had to think of something else. So I thought about it, using a level of ambition reserved solely for those who don't realise what they're getting themselves into.
I thought that the editable area should be bigger than four lines. I thought that the area should support all the different text modes. I thought that you should be able to save the area and load it up later since it sucked having to retype everything all the time. I thought the area should be sizeable. How on Earth I was going to implement all this stuff didn't cross my mind at this stage.
I started writing a separate program to edit an area of text. It took about a year to write but it was fairly powerful; much more powerful than Instedit's editable window. However, I couldn't finish it because I was having a problem with the code that deletes a row of text from the map (when you press SHIFT-DEL).
I couldn't make it work. It was driving me nuts. A month went by and I was about to give up hope when I suddenly learned something new. I don't recall how I learned it but the moment I did, it made me wonder how any of my code ever worked at all. I learned about two's-complement signed arithmetic. Specifically, the nature of the sign bit. Anyway, the code would reach that loop, treat my positive loop counter as a negative number because I was telling it to do so and it would then just immediately fall out of the loop without doing anything. Derp.
With this new enlightenment in my brainmeats I went though all 8000 lines of code looking for similar problems and switching to appropriate branch instructions where needed.
I somehow managed to stitch the two programs into one, which was difficult because both were designed as stand-alone applications. Never mind the fact that I had 8000 lines of assembly code with virtually no comments whatsoever and most of my labels were completely "disemvowelled" for no logical reason.
The one problem I did not foresee in glueing these two programs together was that the source code would no longer fit on one side of a 90K disk. Since I only had one 810 drive, I had to get creative. I actually had to pull the disk out and flip it over during the assembly. Three times (SynAssembler was a two pass assembler). Sometimes I made it and other times I just wasn't fast enough and would have to start over.
One day my Atari 800 and my 810 drive both died at exactly the same time. Luckily, I had earned money a couple of summers earlier delivering electricity bills during a postal strike, which I invested in stock, which by this time had increased in value to the point where it provided just enough to buy a brand new Atari 130XE with a 1050 disk drive. The addition of extra disk space (plus a ramdisk) rescued me from having to suffer the wretched "disk-flip" manoeuver.
The program was pretty much done at this point but I thought it would be cool if I wrote a separate program that could print maps out to a dot matrix printer. Unfortunately, all I had was an Epson MX-70 that according to its specs couldn't do graphics at all. As it turned out, it could do graphics... sort of. After a lot of experimentation I discovered I could download a single 8x8 pixel image which actually printed except that it refused to print the eighth pixel column; it just left an empty gap there. Still, it was enough to allow me to write the tool. I later acquired a Roland printer that could do quad density and I added lots of options to the program as a result. This became the PRINTMAP program.
I had also been trying for some time to find someone who would publish my program. I originally had an agent (ha ha). She was pretty keen at first. She warned me about Broderbund and how they rip you off by signing a contract with you and then shelving the product because it competed with something they were working on (that's what she told me). Months went by with not a single bit of progress so I just got rid of her and decided to go it alone.
Nobody I contacted was interested in publishing tools for the Atari. I should have expected this; they were all game companies, after all. I finally contacted Antic, who had since acquired the APX software catalogue. They replied saying that they wanted to publish my program. Interestingly, they mentioned that they wanted to replace Instedit with it. Is that irony? I think that's irony.
But... there were some "buts"; they wanted some changes made. Specifically:
After eighteen months of work there were still hills to be climbed so I agreed to make these changes and pushed on.
I changed the name to Envision. I kind of liked the new name but it sounded remarkably similar to another program released immediately after Envision's debut, called N-Vision, a drawing program for the Atari ST. I thought that might confuse people but there was nothing I could do about it by then.
I figured animation would be the most difficult thing to retrofit. After thinking about it for a while I hit upon the idea of simply keeping an array of coordinates on the map for each frame. This allowed me to support many frames of animation at a cost of only two bytes per frame. Playback just involved copying the map to the undo buffer, then fetching each frame from there and drawing it at the user's chosen screen position. Easy-peasy.
I thought the 130XE support would be simple since the first thing that popped into my head was "more fonts!". I then decided that the map editor should probably support the extra fonts somehow. I decided that the user should be able to apply any font to any row of the map. This was the scariest retrofit ever. It's a good thing I was both ambitious and naive or I would have thought twice about it.
It took a couple of weeks but I eventually got it all working. I had to go back and rewrite several bits of the map printing program to add the extra font support.
I started writing other tools using bits of code from the map printing program and Envision itself. These included a program that could display and scroll any map (MAPDSPLY), a program to convert Micropainter pictures to map files (MAPCONV), a program to spit out map data into a binary file (DATAGEN) and a program to print out fonts (PRINTFNT).
In the end I had around 11,000 lines of uncommented assembly code. I wrote scads of really awful documentation containing hideous paragraphs of enormous size and the program shipped.
My first published program.
I was published.
It was terribly exciting.
During its lifetime I only made about USD $2000 from the sales. That works out to a wage of approximately 40 cents per hour. What can I say? It was a labour of love and I was quite proud of it.
There are a few things that bother me about the final product:
There are several things I liked about the final product. Some of them seem insignificant but it's the little things, you know: