I'm going to blab on about how this thing came into being. You can skip over this whole section if you just want to find out how to use the darn thing.

It all started back when I first became interested in Apple II stuff, way back in 1998. I was using mainly an Apple II emulator with a DOS 3.3 disk image, and drawing crappy hi-res graphics with a little painting program I wrote in BASIC. Over a very short time period, I wrote another BASIC program called File Manager. It would keep the catalog of the disk onscreen, and prompt me for commands. I would press U or Unlock, L for Lock, R for Rename, etc. and it would ask me for the name of the file I wanted to work with and any other information it needed.

The day came when I typed in some machine language program wrong, and screwed over my DOS 3.3 disk. I can't remember if I created a new DOS 3.3 disk after that, or if I went immediately to a ProDOS disk; either way, I eventually did everything in ProDOS. I managed to extract the files off the DOS 3.3 disk image using some obscure utility program called ImageFile or something like that. I started using File Manager in ProDOS. If I remember correctly, I had already put some ProDOS functionality in File Manager earlier.

I realized that File Manager was really clunky, so I started crafting a new file manager. God only knows how I managed to pull it off. I made this new program display the list of files and let you select one, instead of insisting on typing it. With the help of the people at comp.sys.apple2, I figured out how to read the directory as a file to get its catalog. Eventually I ended up with ProDOS File Navigator 2.0 (or whatever the first version number was).

The feature list grew and grew, until PFN hit version 2.5. This was the last version of PFN for quite a while, and the last ever BASIC version.

Few people actually know about ProDOS File Navigator, since it was only included with my disk image that I uploaded every once in a while, and it wasn't available separately.

As I remember it, one newbie at comp.sys.apple2 had an Apple II or II+ and was looking for some good program launchers he could use. Of course I mentioned ProDOS File Navigator. He had managed to run ProDOS on his computer, but because he only had 48K of memory he couldn't run BASIC.SYSTEM. This is what started my little dream of one day possibly writing PFN in assembly language, to be used as a ProDOS SYS file, not requiring BASIC.

A couple years ago, I finally got around to starting PFN 3.0, this time done all in assembly language. I couldn't really find a cross-assembler I knew how to set up, so I wrote my own in RealBasic. I couldn't find any information on the ProDOS MLI on the Internet, believe it or not (maybe I just wasn't searching hard enough) so I had to find a book in the library to help me. I wrote the first routines of the program, and assembled it. It crashed right through the ceiling. I tested each of the individual routines I was using, and they all seemed to work OK, but for some reason when I put it all together it all fell apart. I thought it might have to do with using my own homemade cross-assembler. I put the whole thing on hold and didn't return for quite some time later.

I came across a cross-assembler called P65 that was written in Perl. I had recently learned to use Perl in CGI scripts for my web site, so I thought, hey, here's a *real* cross-assembler that I can actually figure out how to set up! I did, and I ran my PFN 3.0 code through it. Still crashed. Darn.

I noticed that it looked like it was responding to the keyboard properly. I pressed A (for About) to see what it would do. I noticed that amongst the garbage on the screen, I could make out the numbers 1 through 7 running down the screen. I knew that in the About routine I had it display information about each of the peripheral cards installed, so I knew it had to be doing something right. I got an idea to look at address $6000, where all my strings were; they weren't there. Somehow ProDOS wasn't loading them, so all that garbage on the screen was from printing strings that weren't really strings, and the inadvertent switch into 40-column mode was caused by a $15 character that got printed. I moved the strings and stuff to an earlier part of the program, wrote a routine in the startup code to relocate it to $6000, reassembled, and ran it. It worked!!!

In about a week I had gotten the whole thing finished. And the rest is history.

