The Envision Story

In 1979, I dropped out of high school. I was a bit disillusioned by the whole "mass education" thing, I suppose. Or perhaps 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 consisted of trite little programs written in Edu27 BASIC on the Digital PDP-8 we had at school - when it wasn't broken. The programs were written using cards, which had to be filled in with pencil. Despite this, I still wanted a computer of my own.

My parents, bless their hearts, did precisely that. In 1980, they purchased an Atari 800 computer with 16K of memory (same amount of memory as the great hulking PDP-8 beastie). It also had a 410 cassette recorder. I think it cost about CDN $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.

I was the only one in the family who ever really used the thing. 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. I used that bloody cassette recorder for three years. Along the way, I added a 32K memory expansion (a christmas present from my parents).

Toward the end of that time, 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 it. How could this little sequence of babble produce this stunning explosion of colour on my screen? I had to figure this out.

Unfortunately, I was 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 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 I finally have an 810 disk drive (which I picked up in 1983). One day I am reading about how a program called Instedit received a $25,000 prize and a crystal trophy from Atari, as part of their Atari Star Award promo. No offense to Sheldon Leemon, but this made me sick. I was pretty certain that I could write a character editor as good as, if not perhaps better than Instedit, and do the whole thing in assembly language. So I started doing just that (it may or may not have been better than Instedit, but it sure was faster).

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. It didn't strike me at first that I'd actually have to implement all these nifty ideas.

I started writing a separate prototype 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, suddenly, I learned something new. I don't recall how I learned it, but when 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. I can just hear you programmers saying, "Good lord!"

The problem was I was performing a loop, and the loop was performed with DEY/BPL. But the Y index register held an unsigned number (well, it was meant to be unsigned). The SHIFT-DEL code was (by an amazing stroke of luck) the only code in which I used a loop count greater than 127. I used BPL/BMI all over the place. I had only been using that and BEQ/BNE. I never used BHI and BLO because I didn't understand them. Now enlightenment had come crashing down upon my head, and I went though all 8000 lines of code looking for problems and switching to BLO/BHI and CMP/BNE where appropriate.

Somehow, I wound up stitching 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 forsee in stitching 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. Eventually, both my Atari 800 and my 810 drive both died at exactly the same time. Lucky for me, I had earned money in the summer delivering hydro bills during a postal strike, which I had invested in stock, which in turn increased in value to the point where it allowed me to buy a brand new Atari 130XE and a 1050 disk drive. The addition of extra disk space (plus a ramdisk) rescued me from having to suffer the wretched "disk-flip" manoeuver.

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 which apparently couldn't do graphics at all. As it turned out, it could do graphics... sort of. I discovered I could download a single 8x8 image which actually printed, except that the eighth pixel column of each cell would not get printed. It was, however, 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.COM program.

At this point, I started trying to find someone who could publish my program. I originally had an agent, if you can believe that. 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 (though I doubt they do this today). Months went by with not a single bit of progress, so I 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 games companies, after all. In the end, I contacted Antic, who had since acquired all the APX software. They replied saying that they wanted to publish my program. In an ironic twist of fate, they mentioned that they wanted to replace Instedit with it. Glee.

But there were some "buts". They wanted some changes made. Specifically:

Eighteen months of work and various forms of "enlightenment", and there were still hills to be climbed. I pushed on.

I changed the name to Envision which, although I kind of liked the new name, turned out to sound remarkably similar to another program released just after Envision's debut, called "N-Vision", an awful drawing program for the Atari ST. Well, I thought it was awful.

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, which 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 and copying each frame onto the displayed map at the user's chosen position. Easy-peasy.

I thought the 130XE support would be simple, since the first thing that popped into my head was "more fonts!" Then I realised that the map editor should probably support the extra fonts too, 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 working (and saving). I also had to go back and rewrite several bits of the map printing program.

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.COM), a program to convert Micropainter pictures to map files (MAPCONV.COM), a program to spit out map data into a binary file (DATAGEN.COM) and a program to print out fonts (PRINTFNT.COM). I realise now, of course, that they should have had ".EXE" endings instead of ".COM" but, well, there you go. Hindsight's 20/20.

In the end, I had over 10,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.00 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.

There are a few things that bother me about the finished product:

There are several things I liked about the finished product. Some of them seem insignificant, but it's the little things, you know: