PeeWee-DOS

Developer(s): Michael Leidel
Date: 1986
Type: Program
Platform(s): TS 2068

PeeWee-DOS is an April Fool program that pretends to be a CP/M-style disk operating system. After a start-up beep and the banner “PeeWee-DOS VERSION 0.5 (C) Itty Bitty Machine Co.,1986”, it shows an A> prompt and accepts whatever you type. Each command you enter is answered with an error message from a list of 66, which runs from the plausible (“Non-System Disk in Drive A”, “BDOS error on Drive A”) to the silly (“Colonel error”, “Stack spilling out onto desktop”). Now and then it just says “Huh?”. When it runs out of messages, the program fakes a breakdown (“My mind is slipping, Dave…”), flashes REBOOT and starts again.

REM lines credit Michael Leidel, who adapted it from DOMSDOS, a program taken from LIST Library Tape #4.6 that first appeared in April 1984 and was reprinted in April 1985. DOMSDOS is covered in the CATS and LISTing newsletter articles linked to this post. Two copies were on the Larken disks; this is the fuller 104-line version, as the other copy is missing about 30 of the error-message DATA lines.

Program Analysis

Start-up

Line 30 creates e$(100,64), and line 40 READs messages into it until it reaches the "END" marker. POKE 23609,1 sets a short keyboard click, and the banner is followed by a series of low BEEPs that sound like a drive seeking.

Command line

Lines 100–116 make a simple line editor from INKEY$. Each character is echoed in front of an underscore cursor with a short BEEP. CHR$ 12 (DELETE) backs the cursor up, and ENTER calls the routine at line 118. POKE 23692,255 keeps the screen from stopping with a “scroll?” prompt as messages pile up.

Error selection

Line 120 replies “Huh?” one time in ten. Otherwise line 150 prints e$(s), and line 160 moves s to the next message. When s reaches the "END" entry, line 151 plays out the meltdown with long PAUSEs, then a flashing red REBOOT, and RUN restarts the program.

Notable Techniques

  • A message table read from DATA into a fixed-width string array, with a sentinel entry marking the end.
  • An INKEY$ loop that gives a convincing command-line prompt, with its own cursor and backspace handling.
  • Uses POKE 23692,255 to suppress the scroll prompt.

Potential Issues

  • The messages are meant to be picked at random, but n is set to 0 in line 20 and never changed, so line 140 always starts at message 1. The test in line 160 (RND+(1)*2<1) can never be true, so the counter never resets. As a result the messages always come out in DATA order, which testing confirmed. Only the “Huh?” replies are random.
  • The +(1)* in lines 140 and 160 look like transcription slips for a plain *, carried over from the source listing.

This copy came from a Larken disk. For tape, the LKDOS prefixes were removed from the SAVE and LOGICALL lines, and the saved variables were dropped, because the program builds its own message table. It was tested in ZEsarUX on a stock TS2068.

Related Articles

April Fool’s joke program.
April Fool’s joke program.

Image Gallery

Source Code

    1 REM PeeWee-DOS
    2 REM Version 0.5
    3 REM by Michael Leidel
    4 REM adapted from DOMSDOS            taken from LIST Library         Tape #4.6
    5 REM Originally appeared in          April 1984, reprinted           in April 1985. This is          a DOS written in BASIC,         and intended for use on         all domestic computers.         This version does not           have any bugs...maybe
    6 REM type RUN to "boot" your         new DOS.  GOTO 9999 to          SAVE it to tape.
    7 RANDOMIZE 
   10 BEEP .8,24
   20 LET n=0: LET i=1: LET k=i
   25 LET s=0
   30 DIM e$(100,64)
   40 READ e$(i): IF e$(i,1 TO 3)<>"END" THEN LET i=i+1: GO TO 40
   50 CLS 
   55 POKE 23609,1
   60 PRINT "PeeWee-DOS"
   70 PRINT "VERSION 0.5"
   80 PRINT "(C) Itty Bitty Machine Co.,1986"
   90 PRINT 
   92 BEEP .8,-40: PAUSE 10: BEEP 1,-40: PAUSE 20: BEEP 2,-40: PAUSE 20: BEEP .005,12
   95 PRINT 
  100 PRINT "A>_";
  102 POKE 23692,255
  104 LET l$=INKEY$
  106 IF l$="" THEN GO TO 104
  108 IF l$=CHR$ 13 THEN GO SUB 118: GO TO 95
  112 IF l$=CHR$ 12 THEN PRINT (CHR$ 8)+(CHR$ 8)+"_  "+(CHR$ 8);: BEEP .01,48: PAUSE 3: GO TO 104
  116 PRINT (CHR$ 8)+l$+"_";: BEEP .005,12: PAUSE 6: GO TO 104
  118 REM process command
  119 PRINT (CHR$ 8)+" ": PRINT : PRINT 
  120 IF RND<.1 THEN PRINT "Huh?": RETURN 
  140 IF S=0 THEN LET S=INT (RND+(1)*N+1)
  150 IF e$(s,1 TO 3)<>"END" THEN PRINT E$(S)
  151 IF e$(s,1 TO 3)="END" THEN PRINT "Wait a minute...": PAUSE 300: PRINT : PRINT : PRINT "Wait a minute...": PAUSE 300: PRINT : PRINT : PRINT "Oh, no! Major fatal type error!!": PAUSE 300: PRINT : PRINT : PRINT "My mind is slipping, Dave...": PAUSE 300: PRINT : PRINT : PRINT "I can feel it, Dave...": PAUSE 300: PRINT : PRINT : PRINT "Good evening, gentlemen. I would like to...": PAUSE 90: CLS : PRINT AT 12,12; INK 2; FLASH 1;" REBOOT ": PAUSE 200: RUN 
  160 IF S>0 THEN LET S=S+1: IF RND+(1)*2<1 THEN LET S=0
  170 RETURN 
  172 DATA "Non-System Disk in Drive A"
  174 DATA "Command not found"
  180 DATA "Can't continue error"
  190 DATA "Frankly, can't continue error"
  200 DATA "Can't take any more error"
  210 DATA "BDOS error on Drive A"
  220 DATA "Disc drive inoperable"
  230 DATA "Main Bus failure error"
  240 DATA "Are you sure?"
  250 DATA "I mean, are you really sure??"
  260 DATA "Command not recognized"
  270 DATA "Reboot and retry"
  280 DATA "Division by Zero error"
  290 DATA "Division by Zero error again"
  300 DATA "Please reconsider..."
  310 DATA "Please, please reconsider"
  320 DATA "Pressing wrong keys error"
  330 DATA "Help, I'm on fire!"
  340 DATA "You can't be serious..."
  350 DATA "Try keying HELP"
  360 DATA "Key SYSGEN to recover"
  365 DATA "Illegal Subscript"
  370 DATA "Illegal substance - call POLICE"
  380 DATA "Out of memory"
  390 DATA "Out of sight"
  400 DATA "Out of mind"
  410 DATA "Too much"
  420 DATA "Too complex"
  430 DATA "Much too complex"
  440 DATA "NEXT without FOR"
  450 DATA "FOR without NEXT"
  460 DATA "FOR without FOR"
  470 DATA "NEXT without NEXT"
  480 DATA "GOTO undefined"
  490 DATA "GOTO Jail...Do not pass GO...Do not collect $200"
  500 DATA "Bad subscript"
  510 DATA "Naughty subscript"
  520 DATA "EVIL subscript!!"
  530 DATA "Syntax error"
  535 DATA "Surtax error"
  540 DATA "Syntax currently 15"
  550 DATA "File locked"
  560 DATA "File missing"
  570 DATA "File missing...believed killed  in action"
  580 DATA "Language not available"
  590 DATA "Language not printable"
  592 DATA "Command Interpreter error"
  594 DATA "Slight error"
  595 DATA "Major error"
  596 DATA "Colonel error"
  597 DATA "Fatal error"
  598 DATA "Fatal Kernel error"
  599 DATA "Apoplectic error"
  600 DATA "Unspeakable error"
  610 DATA "Program too large"
  620 DATA "Program too small"
  630 DATA "Range error (aim higher)"
  632 DATA "Stack Underflow"
  634 DATA "Stack Overflow"
  636 DATA "Stack spilling out onto desktop"
  640 DATA "Write Protected"
  650 DATA "Really Write Protected"
  660 DATA "Read Protected"
  670 DATA "Read AND Write Protected"
  680 DATA "Not Worth Reading At All..."
  682 DATA "End-of-File Encountered"
  690 DATA "END"
 9992 SAVE "DOS.B1" LINE 1
 9998 REM  was LKDOS-only

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.