Summer of '85: DOSBOS is rejected by ANALOG Computing
Although my first Atari computer was the Atari 400, we were able to upgrade it to an Atari 800XL by 1985. The 800XL was a tremendous improvement with its much improved keyboard and 64K of RAM. Eventually we also got a 1050 disk drive for it, which made programming much easier.
Writing programs and saving them on cassette was an exercise in patience that I didn’t have as a young teenager.
One of the first programs of a decent size that I actually completed was something I called DOSBOS. It was a “utility” that let you view disk contents (and a few other things) from BASIC. It was not very elegant as it was a BASIC program itself, but I worked on it for many weeks each day after school.
Still, I remember that my Dad was very impressed with it and encouraged me to submit it to a magazine. Magazine submissions required an accompanying printout, but we didn’t yet have a printer. As I recall, he was able to print my docs and the program listing at his work (on green bar paper) so that I could submit it.
My favorite Atari magazine back then was ANALOG, so that was the one I decided to submit it to. Alas, it was rejected, which shouldn’t have been too surprising. ANALOG published some high-quality programs and this first program of mine was just not good enough.
I still have a rejection letter for it, though! I really like this rejection letter, because it is personal with hand-written comments:
Looking at the dates on the printout and the letter, it took me about 2 months to hear back from ANALOG. I guess compared to that, waiting a couple days for something to get approved for the Apple App Store is nothing!
The docs for DOSBOS spanned 6 pages and were longer than the program itself which was only 2 pages!
Like I said, I’m not surprised DOSBOS was rejected. Being a BASIC program greatly limited its usefulness. To use it you had to LIST it to disk so it could be ENTERed. It used high line numbers so it would have less of a chance of overwriting a BASIC program you were working on, but if any lines were the same you could lose your code.
With Atari BASIC you could SAVE or LIST programs to disk. Saving was faster, but LOADing a SAVEd program erased what was in memory. LISTing was slower because it was writing the plain text to disk (instead of the tokenized version), which made the files bigger. But you could ENTER it which would act as if it were typed in and thus not erase what was in memory, unless the line numbers overlapped.
This meant the process to use DOSBOS when working on a BASIC program was:
ENTER “D:DOSBOS.LST”
GOTO 32000This started running it and then you could use it how you wanted.
Since you didn’t want it to stick around when saving your actual program, you would manually remove it by doing this:
GOTO DELETEThat command makes use of Atari BASIC’s ability to use variables at GOTO locations as I described in Programming the Atari with BASIC.
Frankly, it was probably just easier to save your program and type DOS to get to the actual DOS menu. Nevertheless, it was fun to create and it always feels good to finish something. And I have to say, I still really like the name DOSBOS!
Here is the original program listing, printed on that green bar paper that was so common at the time.
I actually still have this on a 5.25” floppy disk:
Here is the BASIC source code, although the inverse characters I used for text and comments do not display properly:
32000 REM DOSBOS VERSION 3.8 5-2-85 by Paul Lefebvre
32005 REM THIS PROGRAM USES LESS THAN 5K OF RAM !!!!
32010 REM ƒ…Õ†÷¡“…¡¬Ã≈”¨†œ–≈Œ†…œ√¬ß”
32015 CLR :DIM FL$(28),FL2$(28),FL3$(15):CLOSE #1:CLOSE #3
32020 OPEN #1,4,0,"E:":OPEN #3,4,0,"K:"
32025 POKE 54286,64:? "}":POKE 65,0:POKE 702,64:POKE 694,0:GOSUB 32300
32030 CLOSE #2:POSITION 0,(X+2)/2:? "††™™™™†ƒœ”¬œ”†≥Æ∏†‚˘†–·ıφÃÂÊ‚ˆÚ†™™™™†":POSITION 2,(X+4)/2
32035 ? "A. Enter File G. Unlock File":? "B. Exit DOSBOS H. Write Dos":? "C. Copy File ";
32040 ? "I. Format Disk":? "D. Delete File J. Load File":? "E. Rename File K. Save File":? "F. Lock";
32045 ? " File L. List File"
32050 POSITION 2,(X+16)/2:? "CHOICE?";:GET #3,CH:? CHR$(CH):IF CH=155 THEN GOTO 32025
32055 REM «œ‘œ†ƒ≈”…“≈ƒ†∆’Œ√‘…œŒ
32060 ON CH-64 GOTO 32155,32075,32120,32140,32235,32165,32175,32220,32205,32185,32085,32100
32065 ? "˝":POSITION 9,(X+16)/2:? " ":GOTO 32050
32070 REM ≈ÿ…‘†–“œ«“¡Õ
32075 CLOSE #1:CLOSE #3:? "}":CLR :POKE 65,3:LET DOSBOS=32000:DELETE=32480:TRAP 40000:? "∆“≈≈†“¡ÕΩ";FRE(0):END
32080 REM ”¡÷≈†∆…Ã≈
32085 ? "Save under what name?";:GOSUB 32450
32090 ? "Saving ";FL2$;" ...";:TRAP 32280:SAVE FL2$:GOTO 32025
32095 REM Ã…”‘†∆…Ã≈
32100 ? "List under what name?";:GOSUB 32450
32105 ? "Listing ";FL2$;" to disk ...";
32110 TRAP 32280:LIST FL2$,0,31999:GOTO 32025
32115 REM √œ–Ÿ†∆…Ã≈†®±©
32120 ? "Copy what file?";:GOSUB 32450
32125 ? "Insert source disk,press “≈‘’“Œ?";:GET #3,R:IF R<>155 THEN 32025
32130 MEM=FRE(0):GOTO 32390
32135 REM ƒ≈Ã≈‘≈†∆…Ã≈
32140 ? "Delete what file?";:GOSUB 32450
32145 ? "Deleting ";FL2$;" ...";:CMD=33:GOTO 32440
32150 REM ≈Œ‘≈“†∆…Ã≈†®±©
32155 ? "Enter what file?";:GOSUB 32450:GOTO 32375
32160 REM Ü√À†∆…Ã≈
32165 ? "Lock what file?";:GOSUB 32450:? "Locking ";FL2$;" ...";:CMD=35:GOTO 32440
32170 REM ’ŒÃœ√À†∆…Ã≈
32175 ? "Unlock what file?";:GOSUB 32450:? "Unlocking ";FL2$;" ...";:CMD=36:GOTO 32440
32180 REM Ü¡ƒ†ÔÚ†“’Œ†∆…Ã≈
32185 ? "Load what file?";:GOSUB 32450:TRAP 32275
32190 ? "Run this file also?";:GET #3,R:IF R=ASC("Y") THEN ? :? "Running ";FL2$;" ...";:RUN FL2$
32195 ? :? "Loading ";FL2$;" ...";:LOAD FL2$
32200 REM ∆œ“Õ¡‘†ƒ…”À†ƒ“…÷≈†£±
32205 ? "Press 'Y' to format disk ":? "in drive #1?";:GET #3,R:IF R<>89 THEN 32025
32210 ? :? "Formating disk in drive one ...";:CMD=254:FL2$="D1:":GOTO 32440
32215 REM ◊“…‘≈†ƒœ”Æ”Ÿ”†‘œ†ƒ“…÷≈†£±
32220 ? "Press 'Y' to write DOS.SYS ":? "to drive #1?";:GET #3,R:IF R<>89 THEN 32025
32225 ? :? "Writing DOS.SYS to drive one ...";:TRAP 32280:OPEN #2,8,0,"D:DOS.SYS":GOTO 32025
32230 REM “≈Œ¡Õ≈†∆…Ã≈
32235 ? "Old Filename?";:GOSUB 32450
32240 ? "New Filename?";:INPUT #1,FL3$:FL$=FL2$:FL$(LEN(FL$)+1)=",":FL$(LEN(FL$)+1)=FL3$
32245 ? "Renaming ";FL2$;" ...";:TRAP 32280:FL2$=FL$:CMD=32:GOTO 32440
32250 REM –’‘†ƒ≈÷…√≈†ßƒ±∫߆…Œ†∆…Ã≈Œ¡Õ≈
32255 IF FL$="" THEN GOTO 32025
32260 IF FL$(1,2)="D:" THEN FL2$=FL$:RETURN
32265 FL2$(1,3)="D1:":FL2$(4)=FL$:RETURN
32270 REM ≈““œ“†»¡ŒƒÃ≈“†®±©
32275 POKE 842,12:POKE 54286,64
32280 ? :? "ERROR-";:GOSUB 32350
32285 ? "Press any key to continue ";:GET #3,R
32290 GOTO 32015
32295 REM ƒ…“≈√‘œ“Ÿ†“œ’‘…Œ≈
32300 POKE 752,1:CLOSE #4:OPEN #4,6,0,"D:*.*":X=-1
32305 TRAP 32280:X=X+1:IF X=29 THEN 32340
32310 INPUT #4,FL$
32315 IF FL$(5,16)="FREE SECTORS" THEN POSITION 2,(X)/2:? FL$:POSITION 21,(X)/2:? "FREE RAM=";FRE(0):GOTO 32340
32320 FL2$=FL$(11):FL3$=FL$(1,10):FL$(11,11)=".":FL$(12)=FL2$:FL$(1,10)=FL3$
32325 IF X/2=INT(X/2) THEN POSITION 2,(X)/2:? FL$:GOTO 32305
32330 POSITION 21,(X-1)/2:? FL$
32335 GOTO 32305
32340 CLOSE #4:POKE 752,0:RETURN
32345 REM ≈““œ“†»¡ŒƒÃ≈“†®≤©
32350 IF PEEK(195)=170 THEN ? "∆ÈφŒÔÙ†∆ÔıÓ‰":RETURN
32355 IF PEEK(195)=144 THEN ? "ƒÈÛΆ…Û†–ÚÔلى":RETURN
32360 IF PEEK(195)=167 THEN ? "∆Èφ–ÚÔلى":RETURN
32365 ? PEEK(195):RETURN
32370 REM ≈Œ‘≈“†∆…Ã≈†®≤©
32375 ? "}":TRAP 32275:POKE 54286,0:POKE 54272,0:POSITION 2,15:? "POKE 842,12:GOTO 32025"
32380 POSITION 2,10:POKE 842,13:ENTER FL2$
32385 REM √œ–Ÿ†∆…Ã≈†®≤©
32390 CLOSE #1:LGTH=0:BYTE=0:SAV=0:DIM PROG(INT(MEM/8)):? :? "Copying ";FL2$;" ...";
32395 OPEN #1,4,0,FL2$:TRAP 32415
32400 GET #1,BYTE:LGTH=LGTH+1:PROG(LGTH)=BYTE
32405 IF LGTH>INT(MEM/8) THEN ? "Œœ‘†≈Œœ’«»†“¡Õ°˝":FOR DELAY=1 TO 500:NEXT DELAY:GOTO 32430
32410 GOTO 32400
32415 ? :? "˝Insert dest'n disk,press “≈‘’“Œ?";:GET #3,R
32420 OPEN #2,8,0,FL2$:TRAP 32280
32425 FOR SAV=1 TO LGTH:PUT #2,PROG(SAV):NEXT SAV
32430 CLOSE #1:CLOSE #3:GOTO 32015
32435 REM ÿ…œ†√œÕÕ¡Œƒ†
32440 TRAP 32280:XIO CMD,#2,0,0,FL2$:GOTO 32025
32445 REM …Œ–’‘†”’¬≠“œ’‘…Œ≈
32450 INPUT #1,FL$:GOSUB 32255:RETURN
32455 ? "}":? "ƒœ”¬œ”†ƒ≈Ã≈‘≈“†–“œ«“¡Õ":FOR ERASE=32000 TO 32475 STEP 5
32460 POSITION 2,5:? ERASE:? "POKE 842,12:NEXT ERASE"
32465 POSITION 0,3:POKE 842,13:STOP
If for some weird reason you really want to give DOSBOS a try, here is an ATR disk image you can download and boot from with your favorite hardware or emulator:
At the BASIC prompt, you can load DOSBOS with this command:
LOAD “D:DOSBOS.BAS”Want to help support Goto 10? Check out the store, which has some merch you might like.








I have my own "failed submission" story. I got the idea, since I liked the game Mad Libs, to create a digital version of it. These were some of the first programs I ever wrote. I started out in Basic on the Atari, writing hardcoded stories in Basic. Each program would run a single story. It would ask for what words to fill in the blanks in Graphics 0, and then would show the story in Graphics 2, I think.
I got the idea to create a "system" so the Mad Libs could be saved to text files, so the program to play them would only have to be written once. I tried this idea out in Basic on the Apple II. The only way I could figure out how to do this (it may have been before I learned how to use a word processor, much less how it saved files) was to write separate programs for creating a Mad Lib, and playing it. The way I did the "create" part was very clunky. I asked the user how many words were in the story, and how many blanks, so I could dimension my arrays. Then it had them enter the blanks and the story one "item" at a time, using Input statements. So, blanks were entered as "NOUN", "ADJECTIVE", etc. They were supposed to be entered in the order that they appeared in the story. Then, to enter the story, each word had to be entered one at a time... You'd mark the corresponding position of a blank in the story by leaving the prompt blank (just press Return). The blanks were saved in one file, and the story in another. I then wrote a "displayer" program to load both of these, and ask the player to enter words to fill in the blanks, and then it displayed the story with word-wrapping, and pagination.
I then realized I'd make mistakes entering the blanks and story. So, I figured I needed a way to edit them. I wrote a separate program to do that. It had a menu system, but it was the same one-item-at-a-time approach, for both blanks and the words in the story. I spent from Jr. high to high school debugging and improving these programs, on my free time. I started getting the idea to submit this to Compute! Magazine, since I'd been reading it for a while, and enjoyed it a lot. I changed the name of the program to "Ad Libs," thinking calling it Mad Libs would violate copyright. I wrote up an article, and spent a lot of time making sure it described how the system worked accurately and clearly, and how to use it. To submit it, I needed a copy of the programs on disk, maybe even an electronic version of the article. Though, what I remember is just sending a printout of the article text. I had to figure out a mailer for the disk (I taped up a couple pieces of cardboard around it to protect it), and sent it in. I got a form rejection letter, saying it "didn't fit our editorial focus," something like that.
I learned many years later that it was good practice to float the idea for an article with a publisher before spending time writing it, because they may not like the idea to begin with.
I think sometime while I was in college, I realized that the way I did this was complicated both in implementation, and for the user, and that I could do it better by leveraging a word processor. I wrote a version in Basic on my Atari that had me use a word processor or text editor to write the story with embedded blanks (I had them enclosed in []'s, so, "[NOUN], [VERB], etc.). This worked out well, since I could implicitly get the ordering and position of the blanks in the story down in a very natural way. You'd save that to disk. My program would read in the file, ask the user to fill in the blanks, and then would nicely format the story. A lot simpler. By that point, Compute! had stopped publishing type-ins. I didn't think there was a point to repeating the process (with anyone else).
Anyway, back in the 2000s, I managed to use a friend's Apple IIGS to transfer some of my Apple disks to images, so I can run my old programs in emulation. It was not an easy process, but I managed to get my most prized Apple projects into images. This was one of them.
Jeez. And to think I always just did it the hard way: either by issuing XIO commands (XIO 33 to delete a file, and XIO 254 to format a disk, are the only two I remember off the top of my head), or issuing an OPEN #1,6,0,"D1:*.*" followed by a FOR T=1 to 1 STEP 0:GET #1,A:?CHR$(A);:N.T to pull a directory listing. :-)
Actually I exaggerate slightly: I eventually found that directory listing sequence tedious enough to save it to disk as a LOADable / RUNnable program... And eventually, once I had more than one disk drive, I did myself one better by having the program interrogate the IOSB that BASIC used for the LOAD and RUN commands, to determine what drive the program itself had been loaded from, so that Dn:SELFMENU.BAS always listed the directory of the DRIVE IT WAS RUN FROM. :-) Put a copy of that program on every disk, and it became trivial to get a directory of any disk no matter what drive it was in. Very handy!