Tag: Apple II BASIC

  • Word Processors in BASIC, Part 2

    Word Processors in BASIC, Part 2

    Nibblewriter

    Found in November 1988 issue of Nibble magazine.

    Archive.org link here.

    The project was alerted to the existence of a few text editors and word processors in Nibble magazine by someone on matrix.

    What we found was a great wealth of BASIC programs for the Apple II computer. We uncovered several particularly interesting BASIC word processors. Two that are of particular interest are Quickwriter and this one, Nibblewriter.

    diskM8 File Dump

    Please find an ASCII conversion of the BASIC dump obtained using the following commands:

    $ diskm8 -ingest /path/to/your/disk/images
    $ diskm8 -search "nibblewriter"
    $ diskm8 -with-disk "your_disk_image.do" -file-extract "NIBBLEWRITER.BAS"

    Code Listing

    10  REM *************************
    20  REM *     NIBBLEWRITER      *
    21  REM *     ------------      *
    30  REM *  BY ROBERT T. YUILLE  *
    40  REM *  COPYRIGHT (C) 1988   *
    50  REM *  BY MICROSPARC, INC.  *
    60  REM *  CONCORD, MA  01742   *
    70  REM *************************
    80  HOME : PRINT  CHR$ (21)
    90  REM   SET HIMEM
    100 PRODOS =  PEEK (48896) = 76: IF  NOT PRODOS THEN  HIMEM: 24832: GOTO 170
    110  REM   FOR PRODOS
    120  POKE 768,32: POKE 769,248: POKE 770,190
    130  POKE 771,169: POKE 772,53: POKE 773,32
    140  POKE 774,245: POKE 775,190: POKE 776,96
    150  CALL 768
    160  REM   INITIALIZATION
    170 LM$ = "1.0":RM$ = "1.0":TM$ = "1.0":BM$ = "1.0"
    180 LM = 8:RM = 66:TM = 6:BM = 60
    190  POKE 30,0: POKE 233,0: REM  NEWF & PRNTF
    200 D$ =  CHR$ (4):B$ =  CHR$ (7):E$ =  CHR$ (27):R$ =  CHR$ (13): IF  NOT PRODOS THEN D$ =  CHR$ (13) +  CHR$ (4)
    210 M1$ = "MARGIN VALUE EXCEEDS MAXIMUM"
    220 M2$ = "MARGIN VALUE IS LESS THAN MINIMUM"
    230 M3$ = "CHAR CANNOT BE USED IN THIS INPUT"
    240 FL$ = "WP.40.O"
    250 FADDR = 26124: REM   FILENAME ($660C)
    260 ST = 6:DR = 1: REM  DEFAULT SLOT AND DRIVE
    270  PRINT D$"PR#0"
    280 :
    290  REM   LOAD WP OBJECT FILE
    300 :
    310 LK = 1: ONERR  GOTO 3130
    320  PRINT D$"BLOAD NW.BIN"
    330  POKE 216,0: REM  RESET ERROR FLAG
    340 :
    350  REM    INITIALIZE & READ MENU DATA
    360 :
    370  READ MITEMS: DIM MENU$(9): FOR J = 0 TO MITEMS: READ MENU$(J): NEXT 
    380  DIM X$(1):X$(0) = "   ":X$(1) = "-->"
    390 :
    400  REM   MAIN MENU
    410 :
    420  TEXT : HOME : GOSUB 3040: POKE 216,0: ONERR  GOTO 3130
    430 PX = 38:SX = 4:SE = SE + (SE = 0):MX = MITEMS: GOSUB 2960: IF Z = 20 THEN  PRINT B$: GOTO 420
    440  ON SE GOTO 480,560,670,890,940,990,1480,2750,1740
    450 :
    460  REM   START NEW DOCUMENT
    470 :
    480  IF  PEEK (30) = 2 THEN  GOSUB 2660: IF ESCF = 1 THEN 420
    490  GOSUB 1830: IF ESCF = 1 THEN 420
    500  POKE 30,0
    510  CALL 26112: REM   ENTRY ($6600)
    520  GOTO 420
    530 :
    540  REM   LOAD NEW DOCUMENT
    550 :
    560  IF  PEEK (30) = 2 THEN  GOSUB 2660: IF ESCF = 1 THEN 420
    570  GOSUB 1830: IF ESCF = 1 THEN 420
    580  HTAB 1: VTAB 20: PRINT "LOADING "FL$
    590 LK = 3: ONERR  GOTO 3130
    600  PRINT D$"BLOAD "FL$",S"ST",D"DR
    610  POKE 216,0
    620  POKE 30,1: REM  SET NEWF FOR LOADED FILE
    630  GOTO 510
    640 :
    650  REM   SAVE CURRENT DOCUMENT
    660 :
    670  HOME : IF  PEEK (30) <  > 2 THEN  VTAB 5: PRINT "THERE IS NO CURRENT DOCUMENT": VTAB 10: PRINT "PRESS RETURN FOR MAIN MENU: ";: GET A$: GOTO 420
    680 EF =  PEEK (252) + 256 *  PEEK (253): REM  EFL($FC) & EFH($FD)
    690 LN = EF - 28672
    700  ONERR  GOTO 800
    710  PRINT D$"VERIFY "FL$",S"ST",D"DR
    720  HOME : VTAB 5: PRINT "FILE: '"FL$"' ALREADY EXISTS"
    730  VTAB 13: PRINT "PRESS 'Y' TO REPLACE EXISTING FILE": PRINT : PRINT "PRESS 'N' TO RENAME FILE": VTAB 10: PRINT "DO YOU WANT TO REPLACE": PRINT "THE EXISTING FILE? (Y/N) ";
    740  GET A$
    750  IF A$ = "N" OR A$ = "n" THEN  POKE 216,0: GOTO 840
    760  IF A$ <  > "Y" AND A$ <  > "y" THEN  GOTO 740
    770  HTAB 1: VTAB 20: PRINT "DELETING "FL$
    780 LK = 2: ONERR  GOTO 3130
    790  PRINT D$"DELETE "FL$",S"ST",D"DR
    800  HTAB 1: VTAB 21: PRINT "SAVING "FL$
    810 LK = 2: ONERR  GOTO 3130
    820  PRINT D$"BSAVE "FL$",A$7000,L"LN",S"ST",D"DR
    830  POKE 216,0: GOTO 420
    840  GOSUB 1830: IF ESCF = 1 THEN 420
    850  GOTO 670
    860 :
    870  REM   RENAME CURRENT DOCUMENT
    880 :
    890  GOSUB 1830: IF ESCF = 1 THEN 420
    900  GOTO 510
    910 :
    920  REM   CONTINUE WITH CURRENT DOCUMENT
    930 :
    940  IF  PEEK (30) <  > 2 THEN 670
    950  GOTO 510
    960 :
    970  REM   PRINTER ROUTINE
    980 :
    990  IF  PEEK (30) <  > 2 THEN 670
    1000  HOME : VTAB 2: PRINT "MARGIN VALUES ARE AS FOLLOWS:": PRINT : PRINT "LM= "LM$"  RM= "RM$"  TM= "TM$"  BM= "BM$
    1010  VTAB 10: PRINT "DO YOU WANT TO CHANGE MARGINS (Y/N)? ";
    1020  GET A$
    1030  IF A$ = "Y" OR A$ = "y" THEN 1060
    1040  IF A$ <  > "N" AND A$ <  > "n" THEN 1020
    1050  GOTO 1370
    1060 M$ = "LM":MA$ = "7.0":MI$ = "0.5"
    1070  GOSUB 2330: IF ESCF = 1 THEN 420
    1080 N =  VAL (N$)
    1090  IF N > 7 THEN MSG$ = M1$: GOSUB 2250: GOTO 1060
    1100  IF N < .5 THEN MSG$ = M2$: GOSUB 2250: GOTO 1060
    1110 LM = N * 10 - 2
    1120 LM$ = N$
    1130 M$ = "RM":MA$ = "7.0":MI$ = "0.5"
    1140  GOSUB 2330: IF ESCF = 1 THEN 420
    1150 N =  VAL (N$)
    1160  IF N > 7 THEN MSG$ = M1$: GOSUB 2250: GOTO 1130
    1170  IF N < .5 THEN MSG$ = M2$: GOSUB 2250: GOTO 1130
    1180 RM = 80 - (N * 10 - 4) - LM
    1190  IF RM <  = 0 THEN MSG$ = "LEFT MARGIN EXCEEDS RIGHT MARGIN": GOSUB 2250:RM = 66: GOTO 990
    1200 RM$ = N$
    1210 M$ = "TM":MA$ = "8.0":MI$ = "0.2"
    1220  GOSUB 2330: IF ESCF = 1 THEN 420
    1230 N =  VAL (N$)
    1240  IF N > 8 THEN MSG$ = M1$: GOSUB 2250: GOTO 1210
    1250  IF N < .2 THEN MSG$ = M2$: GOSUB 2250: GOTO 1210
    1260 TM =  INT (6 * N + .5)
    1270 TM$ = N$
    1280 M$ = "BM":MA$ = "8.0":MI$ = "0.2"
    1290  GOSUB 2330: IF ESCF = 1 THEN 420
    1300 N =  VAL (N$)
    1310  IF N > 8 THEN MSG$ = M1$: GOSUB 2250: GOTO 1280
    1320  IF N < .2 THEN MSG$ = M2$: GOSUB 2250: GOTO 1280
    1330 BM = 66 -  INT (6 * N + .5)
    1340  IF TM >  = BM THEN MSG$ = "TOP MARGIN EXCEEDS BOTTOM MARGIN": GOSUB 2250: GOTO 1210
    1350 BM$ = N$
    1360  GOTO 990
    1370  POKE 26,TM: POKE 27,BM: POKE 28,LM: POKE 29,RM
    1380  HOME : VTAB 2: PRINT "BE SURE YOUR PRINTER IS READY": VTAB 10: PRINT "PRESS RETURN TO CONTINUE: ";: GET A$
    1390  HOME : VTAB 15: PRINT "PRESS ESCAPE TO CANCEL PRINTING."
    1400  VTAB 10: PRINT "PRESS SPACE BAR TO CONTINUE: "
    1410  PRINT D$"PR#1"
    1420  PRINT  CHR$ (9)"80N": POKE 233,1: CALL 26112: POKE 233,0
    1430  PRINT D$"PR#0"
    1440  GOTO 420
    1450 :
    1460  REM   HELP SCREEN
    1470 :
    1480  TEXT : HOME 
    1490  NORMAL : PRINT "             HELP SCREEN": REM  13 SPACES
    1500  PRINT : PRINT 
    1510  PRINT "<ARROWS> - MOVE CURSOR"
    1520  PRINT 
    1530  PRINT "<ESCAPE> - RETURN TO MAIN MENU"
    1540  PRINT 
    1550  PRINT "<DELETE> - DELETE CHAR LEFT OF CURSOR"
    1560  PRINT 
    1570  PRINT "<CTRL>-D - DELETE CHAR UNDER CURSOR"
    1580  PRINT 
    1590  PRINT "<CTRL>-E - CHANGE INSERT/REPLACE CURSOR"
    1600  PRINT 
    1610  PRINT "<CTRL>-Y - CLEAR FROM CURSOR TO EOL"
    1620  PRINT 
    1630  PRINT "<CTRL>-Z - SHOW CR'S AS INV ASTERISK"
    1640  PRINT 
    1650  PRINT "   <TAB> - MOVE CURSOR TO NEXT TAB POS"
    1660  PRINT 
    1670  PRINT "<CTRL>-F - MOVE TO FIRST LINE"
    1680  PRINT "<CTRL>-C - MOVE TO CENTER LINE"
    1690  PRINT "<CTRL>-L - MOVE TO LAST LINE";
    1700  HTAB 1: VTAB 24: PRINT "PRESS RETURN TO CONTINUE: ";: GET A$: GOTO 420
    1710 :
    1720  REM   QUIT
    1730 :
    1740  HOME : VTAB 10: PRINT "DO YOU REALLY WANT TO QUIT (Y/N)? ";
    1750  GET A$
    1760  IF A$ = "Y" OR A$ = "y" THEN 1790
    1770  IF A$ = "N" OR A$ = "n" THEN 420
    1780  GOTO 1750
    1790  HOME : END 
    1800 :
    1810  REM   FILENAME INPUT ROUTINE
    1820 :
    1830  HOME :N$ = "":ESCF = 0
    1840  VTAB 2: PRINT "ENTER FILENAME FOR DOCUMENT": PRINT : PRINT 
    1850  PRINT "PRESS '?' TO CATALOG DISK": PRINT 
    1860  PRINT "ESCAPE ON 1ST CHAR RETURNS TO MAIN MENU": PRINT 
    1870  PRINT "ESCAPE ON ANY OTHER CHARACTER": PRINT " CANCELS INPUT AND STARTS OVER": PRINT 
    1880  PRINT "RETURN ACCEPTS INPUT"
    1890  HTAB 1: VTAB 15: PRINT "FILENAME: ";
    1900  GET C$
    1910  IF C$ = E$ THEN ESCF = 1: RETURN 
    1920  IF C$ = "?" THEN  PRINT D$ LEFT$ ("CATALOG",7 - 4 * PRODOS)",S"ST",D"DR: HTAB 1: VTAB 24: PRINT "PRESS RETURN TO CONTINUE: ";: GET A$: GOTO 1830
    1930 AN =  ASC (C$)
    1940  IF AN > 96 AND AN < 123 THEN AN = AN - 32
    1950  IF AN < 65 OR AN > 90 THEN MSG$ = "FIRST POSITION MUST BE A LETTER": GOSUB 2250: GOTO 1830
    1960  PRINT  CHR$ (AN)
    1970 N$ =  CHR$ (AN)
    1980  FOR K = 1 TO 15
    1990  HTAB 1: VTAB 18: CALL  - 958
    2000  VTAB 15: HTAB (11 + K)
    2010  GET C$
    2020  IF C$ = E$ THEN K = 15: NEXT : GOTO 1830
    2030  IF C$ =  CHR$ (8) AND K = 1 THEN K = 15: NEXT : GOTO 1830
    2040  IF C$ =  CHR$ (8) THEN K = K - 1: HTAB (11 + K): PRINT " ":N$ =  LEFT$ (N$,K): GOTO 2000
    2050  IF C$ = R$ THEN LC = K:K = 15: GOTO 2110
    2060 AN =  ASC (C$)
    2070  IF AN > 96 AND AN < 123 THEN AN = AN - 32
    2080  IF (AN < 65 OR AN > 90) AND (AN < 48 OR AN > 57) AND AN <  > 46 THEN MSG$ = "CHARACTER CANNOT BE USED IN FILENAME": GOSUB 2250: GOTO 1990
    2090  PRINT  CHR$ (AN)
    2100 N$ = N$ +  CHR$ (AN)
    2110  NEXT 
    2120  IF C$ <  > R$ THEN MSG$ = "FILENAME TOO LONG, LIMIT - 15 CHARACTERS": GOSUB 2250: GOTO 1830
    2130 FL$ = N$
    2140  FOR I = 0 TO 15
    2150  POKE FADDR + I,0
    2160  NEXT 
    2170  FOR K = 1 TO  LEN (N$)
    2180  POKE FADDR - 1 + K, ASC ( MID$ (N$,K,1)) + 128
    2190  NEXT 
    2200  POKE FADDR + LC,0
    2210  RETURN 
    2220 :
    2230  REM   ERROR MESSAGES
    2240 :
    2250  PRINT B$
    2260  HTAB 1: VTAB 18
    2270  PRINT MSG$: PRINT : PRINT 
    2280  PRINT "PRESS RETURN AND TRY AGAIN: ";: POKE  - 16368,0: GET AA$
    2290  RETURN 
    2300 :
    2310  REM   PRINTER MARGIN ROUTINE
    2320 :
    2330  HOME :N$ = "":ESCF = 0
    2340  VTAB 2: PRINT "ENTER VALUE FOR "M$: PRINT "MAXIMUM "MA$" - MINIMUM "MI$: PRINT 
    2350  PRINT "ESCAPE ON 1ST CHAR RETURNS TO MAIN MENU": PRINT 
    2360  PRINT "ESCAPE ON ANY OTHER CHARACTER": PRINT " CANCELS INPUT AND STARTS OVER": PRINT 
    2370  PRINT "RETURN ACCEPTS INPUT"
    2380  PRINT : PRINT "RETURN ON 1ST CHAR ACCEPTS DEFAULT (1.0)"
    2390  HTAB 1: VTAB 15: PRINT M$":  1.0"
    2400  HTAB 5: VTAB 15
    2410  GET C$
    2420  IF C$ = E$ THEN ESCF = 1: RETURN 
    2430  IF C$ = R$ THEN N$ = "1.0": RETURN 
    2440 AN =  ASC (C$)
    2450  IF AN < 48 OR AN > 57 THEN MSG$ = M3$: GOSUB 2250: GOTO 2330
    2460  PRINT C$;: CALL  - 868
    2470 N$ = C$
    2480  FOR K = 1 TO 3
    2490  HTAB 1: VTAB 18: CALL  - 958
    2500  VTAB 15: HTAB (5 + K)
    2510  GET C$
    2520  IF C$ = E$ THEN K = 3: NEXT : GOTO 2330
    2530  IF C$ =  CHR$ (8) AND K = 1 THEN K = 3: NEXT : GOTO 2330
    2540  IF C$ =  CHR$ (8) THEN K = K - 1: HTAB (5 + K): PRINT " ":N$ =  LEFT$ (N$,K): GOTO 2500
    2550  IF C$ = R$ THEN K = 3: GOTO 2600
    2560 AN =  ASC (C$)
    2570  IF (AN < 48 OR AN > 57) AND AN <  > 46 THEN MSG$ = M3$: GOSUB 2250: GOTO 2490
    2580  PRINT C$
    2590 N$ = N$ + C$
    2600  NEXT 
    2610  IF C$ <  > R$ THEN MSG$ = "INPUT TOO LONG, LIMIT - 3 CHARACTERS": GOSUB 2250: GOTO 2330
    2620  RETURN 
    2630 :
    2640  REM  ERASE CURRENT DOCUMENT?
    2650 :
    2660  HOME :ESCF = 0: VTAB 8: PRINT "YOU ARE ABOUT TO ERASE": PRINT "THE CURRENT DOCUMENT."
    2670  VTAB 12: PRINT "DO YOU REALLY WANT TO DO THIS? (Y/N) ";
    2680  GET A$
    2690  IF A$ = "N" OR A$ = "n" THEN ESCF = 1: RETURN 
    2700  IF A$ <  > "Y" AND A$ <  > "y" THEN 2680
    2710  RETURN 
    2720 :
    2730  REM  SELECT SLOT AND DRIVE
    2740 :
    2750  HOME : VTAB 1: PRINT "WHICH SLOT DO YOU WANT TO USE? (2-7) ";
    2760  GET A$
    2770  IF A$ =  > "2" AND A$ <  =  CHR$ (54 + PRODOS) THEN  PRINT A$:ST =  VAL (A$): GOTO 2790
    2780  GOTO 2760
    2790  VTAB 5: PRINT "WHICH DISK DRIVE": PRINT "DO YOU WANT TO USE? (1-2) ";
    2800  GET A$
    2810  IF A$ = "1" OR A$ = "2" THEN  PRINT A$:DR =  VAL (A$): GOTO 2830
    2820  GOTO 2800
    2830  POKE 216,0: ONERR  GOTO 2870: IF PRODOS THEN  PRINT D$"PREFIX,S";ST;",D";DR:
    2840  IF PRODOS THEN  GOTO 420
    2850  PRINT D$"VERIFY JUNK,S";ST;",D";DR
    2860  GOTO 420
    2870  POKE 216,0:EN =  PEEK (222):EL =  PEEK (218) + 256 *  PEEK (219): IF EL = 2850 AND EN = 6 THEN 420
    2880  VTAB 23: PRINT "DISK ERROR": PRINT "PRESS RETURN TO CONTINUE ";: POKE  - 16368,0: GET AA$: GOTO 420
    2890 :
    2900  REM  DATA FOR MAIN MENU
    2910 :
    2920  DATA  9,MAIN MENU,START NEW DOCUMENT,LOAD DOCUMENT,SAVE DOCUMENT,RENAME DOCUMENT,CONTINUE WITH CURRENT DOCUMENT,PRINT DOCUMENT,HELP,SET SLOT/DRIVE,QUIT
    2930 :
    2940  REM   MENU HANDLER
    2950 :
    2960 SL = SE
    2970 N = SL:OS = SL: GOSUB 3000:Z = 0: VTAB 24: HTAB PX: CALL  - 868: POKE  - 16368,0
    2980  VTAB 24: HTAB PX: PRINT SL;: WAIT  - 16384,128:Z =  PEEK ( - 16384) - 128: IF Z >  = 49 AND Z <  = MX + 48 THEN SL = Z - 48:N = OS: GOSUB 3000: GOTO 2970
    2990 Z = (Z = 21 OR Z = 10) - (Z = 8 OR Z = 11) + 10 * (Z = 13) + 20 * (Z = 27): ON  NOT Z GOTO 2980:SL = SL + Z * (Z < 10):SL = SL - MX * (SL > MX) + MX * (SL < 1):N = OS: GOSUB 3000: ON Z < 10 GOTO 2970:SE = SL: POKE  - 16368,0: RETURN 
    3000  VTAB 3 + 2 * N: HTAB SX: PRINT X$(SL = OS);: RETURN 
    3010 :
    3020  REM   PRINT A MENU
    3030 :
    3040  HOME :TL$ = MENU$(0): VTAB 1: PRINT "NIBBLEWRITER   (C)1988   MICROSPARC,INC.": VTAB 2: FOR I = 1 TO 40: PRINT "-";: NEXT 
    3050  VTAB 3: HTAB  INT ((40 -  LEN (TL$)) / 2)
    3060  PRINT TL$
    3070  FOR I = 1 TO MITEMS: VTAB 3 + 2 * I: HTAB 8: PRINT I". "MENU$(I): NEXT 
    3080  VTAB 24: HTAB 1: PRINT "USE ARROWS/NUMBERS & PRESS RETURN: ";
    3090  RETURN 
    3100 :
    3110  REM  DISK ERRORS
    3120 :
    3130  HOME : VTAB 10
    3140  POKE 216,0
    3150  IF  PEEK (222) = 6 OR  PEEK (222) = 7 THEN MSG$ = "FILE (" + FL$ + ")" +  CHR$ (13) + "IS NOT ON THIS DISK.": ON (( PEEK (218) + 256 *  PEEK (219) = 320) + 1) GOTO 3210,3230
    3160  IF  PEEK (222) = 13 THEN MSG$ = "FILE (" + FL$ + ")" +  CHR$ (13) + "IS NOT A BINARY FILE.": GOTO 3210
    3170  IF  PEEK (222) = 9 OR  PEEK (222) = 17 THEN MSG$ = "DISK OR DIRECTORY IS FULL.": GOTO 3210
    3180  IF  PEEK (222) = 10 THEN MSG$ = "EXISTING FILE (" + FL$ + ")" +  CHR$ (13) + "IS LOCKED.": GOTO 3210
    3190  PRINT "SYSTEM ERROR #"; PEEK (222);" HAS OCCURRED"
    3200  PRINT "AT LINE #"; PEEK (218) +  PEEK (219) * 256:MSG$ = ""
    3210  GOSUB 2250
    3220  GOTO 420
    3230  VTAB 24: PRINT "BINARY FILE NOT FOUND": END
  • Word Processors in BASIC, Part 1

    Word Processors in BASIC, Part 1

    Quickwriter

    Found in June 1988 issue of Nibble magazine (Volume 9, Number 6).

    Archive.org link here.

    The project was alerted to the existence of a few text editors and word processors in Nibble magazine by someone on matrix.

    What we found was a great wealth of BASIC programs for the Apple II computer. We uncovered several particularly interesting BASIC word processors. Two that are of particular interest are Quickwriter and Nibblewriter.

    Both programs are quite long and involved, so instead of creating one enormous post, we decided to split the discussion up into two feature posts.

    diskM8 File Dump

    Please find an ASCII conversion of the BASIC dump obtained using the following commands:

    $ diskm8 -ingest /path/to/your/disk/images
    $ diskm8 -search "quickwriter"
    $ diskm8 -with-disk "your_disk_image.do" -file-extract "QUICKWRITER.BAS"

    Code Listing

    10  REM **********************
    20  REM *     TYPEWRITER     *
    30  REM *  BY JAMES D EVANS  *
    40  REM * COPYRIGHT (C) 1988 *
    50  REM * BY MICROSPARC, INC *
    60  REM * CONCORD, MA  01742 *
    70  REM **********************
    80  HIMEM: 38144:X =  FRE (0)
    90  ONERR  GOTO 2740
    100  GOSUB 2220
    110  GOTO 230
    120  REM **WARMSTART 80-COL CARD**
    130  ON  NOT PD GOTO 140: PRINT D$;"PR#A$C307": GOTO 150
    140  POKE 54,7: POKE 55,195: CALL 1002: PRINT 
    150  RETURN 
    160  REM **GET CHAR ROUTINE**
    170  POKE  - 16368,0: ON  NOT PLUS GOTO 180: PRINT  CHR$ (0);: GET A$: ON  NOT  LEN (A$) GOTO 170:B =  ASC (A$): GOTO 190
    180  INVERSE : PRINT " ";BS$;: NORMAL : WAIT  - 16384,128:B = ( PEEK ( - 16384) - 128):A$ =  CHR$ (B): POKE  - 16368,0: PRINT " ";BS$;: ON  NOT B GOTO 180
    190  RETURN 
    200  REM 
    210  REM ***MAIN PROGRAM***
    220  REM 
    230  FOR I = M TO M + 80: POKE I,160: NEXT 
    240  GOSUB 850: GOSUB 2050
    250 C = LM:LL = 0: POKE  - 16368,0
    260  VTAB 2: POKE H,C: INVERSE : PRINT  CHR$ ( PEEK (M + (C - LM)));: NORMAL : POKE H,C: PRINT  CHR$ (24);: ON  NOT PLUS GOTO 270: GET A$: GOTO 280
    270  WAIT  - 16384,128:A$ =  CHR$ ( PEEK ( - 16384) - 128): POKE  - 16368,0
    280  IF A$ < " " OR A$ =  CHR$ (127) THEN  GOSUB 330: GOTO 260
    290  PRINT A$: POKE M + C - LM, ASC (A$) + 128
    300 C = C + (C < RM - 1):LL = LL + (LL < RM - LM): POKE H,5: PRINT C + 1;" "
    310  GOTO 260
    320  REM **CTRL-CHAR EVALUATION**
    330  ON ( LEN (A$) = 0) GOTO 610: PRINT  CHR$ ( PEEK (M + (C - LM))); CHR$ (24)
    340  IF A$ =  CHR$ (127) THEN A$ =  CHR$ (4): ON C = LM GOTO 610:C = C - 1: POKE H,5: PRINT C + 1;" "
    350  IF A$ =  CHR$ (4) AND (LL + LM + 1) > C THEN LL = LL - 1: POKE M + RM - LM,160: FOR I = M + C - LM TO M + LL + 1: POKE I, PEEK (I + 1): NEXT : VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT : GOTO 610
    360  ON A$ <  >  CHR$ (15) OR C = (RM - 1) GOTO 370:LL = LL + (LL < (RM - LM - 1)): FOR I = M + LL TO M + C - LM STEP  - 1: POKE I, PEEK (I - 1): NEXT : POKE M + C - LM,160: VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT : GOTO 610
    370  IF A$ =  CHR$ (8) THEN C = C - (C > LM): POKE H,5: PRINT C + 1;" ": GOTO 610
    380  IF A$ =  CHR$ (21) THEN C = C + (C < RM - 1): POKE H,5: PRINT C + 1" ":LL = LL + ((C + 1 - LM) > LL): GOTO 610
    390  IF A$ =  CHR$ (9) THEN  GOSUB 940: GOTO 610
    400  IF A$ =  CHR$ (20) THEN TB(C + 1) =  NOT TB(C + 1):X = 160 * ( NOT TB(C + 1)) + 252 * (TB(C + 1)): PRINT : VTAB 4: POKE H,C: PRINT  CHR$ (X): GOTO 610
    410  IF A$ =  CHR$ (13) THEN  GOSUB 660: POP : GOTO 250
    420  IF A$ =  CHR$ (22) THEN RF = 1: VTAB 6: POKE H,20: PRINT "REVERSE LINEFEEDS ENABLED -- PRESS RETURN ";: GOSUB 170: PRINT : VTAB 6: PRINT LC$: GOTO 610
    430  IF A$ =  CHR$ (18) THEN A$ =  CHR$ (93): VTAB 2: POKE H,C: POP : GOTO 290
    440  IF A$ =  CHR$ (12) THEN A$ =  CHR$ (91): VTAB 2: POKE H,C: POP : GOTO 290
    450  IF A$ =  CHR$ (2) THEN A$ =  CHR$ (92):US = 1: VTAB 2: POKE H,C: PRINT A$: POKE M + C - LM,92: POP : GOTO 300
    460  IF A$ =  CHR$ (14) THEN A$ =  CHR$ (64): VTAB 2: POKE H,C: POP : GOTO 290
    470  IF A$ =  CHR$ (26) THEN  GOSUB 990: GOTO 610
    480  IF A$ =  CHR$ (7) THEN A$ =  CHR$ (95): VTAB 2: POKE H,C: POP : GOTO 290
    490  IF A$ =  CHR$ (24) THEN  GOSUB 1850
    500  IF A$ =  CHR$ (10) THEN  GOSUB 1260: POP : GOTO 260
    510  IF A$ =  CHR$ (19) THEN C = LM: PRINT : VTAB 3: POKE H,5: PRINT C + 1;" ": GOTO 610
    520  ON A$ <  >  CHR$ (5) GOTO 550: FOR I = M + (RM - LM - 1) TO M STEP  - 1: IF  PEEK (I) <  > 160 THEN C = LM + I - M + ((I - M) < (RM - LM - 1)):I = M: GOTO 540
    530  NEXT 
    540  PRINT : VTAB 3: POKE H,5: PRINT C + 1;" ": GOTO 610
    550  IF A$ =  CHR$ (23) THEN  GOSUB 1640: GOTO 610
    560  IF A$ =  CHR$ (6) THEN  GOSUB 1780: GOTO 610
    570  IF A$ =  CHR$ (16) THEN  GOSUB 1170: POP : GOTO 260
    580  IF A$ =  CHR$ (17) THEN  GOSUB 1340: GOTO 610
    590  IF A$ =  CHR$ (27) AND (C < (RM - 1)) THEN  GOSUB 1900: GOTO 610
    600  IF A$ =  CHR$ (30) THEN  GOSUB 2000
    610  RETURN 
    620  REM 
    630  REM ***UTILITY SUBROUTINES***
    640  REM 
    650  REM **PRINT LINE**
    660 X$ = "":X =  VAL (X$) +  PEEK (131) + 256 *  PEEK (132): POKE X,RM - LM: POKE X + 1,(M -  INT (M / 256) * 256): POKE X + 2, INT (M / 256):X$ =  MID$ (X$,1):AP$(R) = X$
    670  PRINT : PRINT D$;"PR#";SL
    680  PRINT  CHR$ (9);"80N";
    690  PRINT  TAB( LM);
    700  ON US GOTO 720
    710  PRINT AP$(R): GOTO 790
    720 J = 1
    730  FOR I = M TO M + LL
    740  ON  PEEK (I) <  > 92 GOTO 760:J =  NOT J: ON J GOTO 750: PRINT U1$;: GOTO 770
    750  PRINT U2$;: GOTO 770
    760  PRINT  CHR$ ( PEEK (I));
    770  NEXT 
    780  PRINT U2$
    790 R = R + 1:US = 0
    800  ON SP < 2 GOTO 810: PRINT : ON SP < 3 GOTO 810: PRINT : ON SP < 4 GOTO 810: PRINT 
    810  GOSUB 130
    820  GOSUB 870
    830  RETURN 
    840  REM **WINDOW**
    850  PRINT CL$
    860  FOR I = 1 TO LM: PRINT  CHR$ (255);: NEXT : POKE H,RM: FOR I = RM TO 79: PRINT  CHR$ (255);: NEXT 
    870  VTAB 1: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT 
    880  FOR I = M TO M + 80: POKE I,160: NEXT : VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT 
    890  VTAB 3: PRINT "COL: ";LM + 1;" "
    900  VTAB 5: PRINT "LINE:";R
    910  IF R > 300 THEN  VTAB 10: POKE H,19: PRINT  CHR$ (7);"NO MORE ROOM!  RESTART PROGRAM."
    920  RETURN 
    930  REM **TAB**
    940  FOR I = C + 1 + (C < RM - 1) TO RM - 1:C = I * TB(I) - 1: ON C > 0 GOTO 960: NEXT 
    950 C = RM - 1
    960 I = RM - 1: PRINT : VTAB 3: POKE H,5: PRINT C + 1: IF C + 1 > LL THEN LL = C + 1 - LM
    970  RETURN 
    980  REM **CENTER TEXT**
    990  PRINT : VTAB 6: POKE H,23: PRINT "CENTERING.....": PRINT : VTAB 2
    1000  FOR I = 0 TO LL
    1010  IF  PEEK (M + I) <  > 160 THEN X = I:I = LL: GOTO 1030
    1020  NEXT : GOTO 1140
    1030 Y = 0: FOR I = RM - LM - 1 TO 0 STEP  - 1
    1040 Y = Y + 1: IF  PEEK (M + I) <  > 160 THEN Y = Y - 1:I = 0: GOTO 1060
    1050  NEXT 
    1060 XL = RM - LM - X - Y: REM STRING LENGTH     
    1070 K = 0: FOR J = M + X TO M + X + XL - 1:K = K + ( PEEK (J) < 128): NEXT : REM HANDLE <ESC> AND UNDERLINE CODES
    1080 A = M + X:X$ = "":B =  VAL (X$) +  PEEK (131) + 256 *  PEEK (132): POKE B,XL: POKE B + 1,A -  INT (A / 256) * 256: POKE B + 2, INT (A / 256):X$ =  MID$ (X$,1)
    1090 J = 0:T =  INT ((RM - LM - XL - K) / 2) + K: IF (T + XL) > (RM - LM) THEN  PRINT : VTAB 6: POKE H,9: PRINT  CHR$ (7);"TOO MANY <ESC> CODES TO CENTER. PRESS RETURN TO RESUME TYPING ";: GOSUB 170: PRINT : VTAB 6: PRINT LC$: GOTO 1150
    1100  FOR I = M + X TO M + X + XL: POKE I,160: NEXT :
    1110  FOR I = M + T TO M + T + XL - 1:J = J + 1: POKE I, ASC ( MID$ (X$,J)): NEXT 
    1120  POKE H,LM: POKE 8,RM - LM: CALL 768
    1130 LL = T + XL:C = LM + T + XL: IF C >  = RM THEN C = C - 1
    1140  PRINT : VTAB 6: PRINT LC$: VTAB 3: POKE H,5: PRINT C + 1;" "
    1150  RETURN 
    1160  REM **PRINT TEST PATTERN**
    1170  PRINT : PRINT D$;"PR#";SL
    1180  PRINT  CHR$ (9);"80N";
    1190  PRINT  TAB( LM)"." TAB(  INT (((RM - LM) / 2) - 1))"." TAB(  INT (((RM - LM) / 2)))".";
    1200  IF  NOT RF THEN  PRINT : GOTO 1230
    1210  PRINT RF$
    1220  PRINT FF$
    1230  GOSUB 130
    1240  RETURN 
    1250  REM **ISSUE REVERSE LINEFEED**
    1260  ON  NOT RF GOTO 1320
    1270  PRINT : PRINT D$;"PR#";SL
    1280  PRINT  CHR$ (9);"80N";
    1290  PRINT RF$: PRINT RF$
    1300  PRINT FF$
    1310  GOSUB 130
    1320  RETURN 
    1330  REM **QUIT?**
    1340  PRINT : VTAB 8: POKE H,19: PRINT "Q)UIT   R)ESUME   S)TART ANEW": PRINT : HTAB 20: PRINT "PRESS Q, R, OR S:";: GOSUB 170:A$ =  CHR$ ( ASC (A$) - 32 * (A$ > "S"))
    1350  IF A$ = "Q" THEN  GOSUB 1390: PRINT CL$: END 
    1360  IF A$ = "R" THEN  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$: RETURN 
    1370  IF A$ = "S" THEN  GOSUB 1390: RUN 
    1380  GOTO 1340
    1390  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$;: POKE H,19: PRINT "SAVE THIS DOCUMENT? (Y/N)";: GOSUB 2870
    1400  IF A$ <  > "Y" AND A$ <  >  CHR$ (121) THEN 1620
    1410  PRINT : VTAB 10: PRINT LC$;: POKE H,19: PRINT "ENTER DOCUMENT NAME: ";: FOR I = 1 TO 15: PRINT "_";: NEXT 
    1420 HZ = 0:FL$ = "": POKE H,40
    1430  GOSUB 170: ON A$ >  CHR$ (31) GOTO 1480
    1440  ON A$ =  CHR$ (13) GOTO 1500
    1450  IF A$ =  CHR$ (8) AND (FL$ = "" OR  LEN (FL$) = 1) THEN 1410
    1460  IF A$ =  CHR$ (8) THEN HZ = HZ - 1: POKE H, PEEK (H) - 1:FL$ =  MID$ (FL$,1, LEN (FL$) - 1): GOTO 1430
    1470  ON A$ =  CHR$ (27) GOTO 1410: ON A$ < " " GOTO 1430
    1480  ON HZ = 15 GOTO 1430: IF A$ >  CHR$ (95) THEN A$ =  CHR$ ( ASC (A$) - 32)
    1490 FL$ = FL$ + A$: PRINT A$;:HZ = HZ + 1: GOTO 1430
    1500  ON FL$ = "" GOTO 1620
    1510  IF  MID$ (FL$,1,1) < "A" THEN  PRINT : VTAB 10: POKE H,19: PRINT LC$;"INVALID NAME -- PRESS RETURN TO REENTER ";: GOSUB 170: GOTO 1410
    1520  FOR I = 1 TO  LEN (FL$):X$ =  MID$ (FL$,I,1): IF X$ = " " THEN FL$ =  LEFT$ (FL$,I - 1) + "." +  RIGHT$ (FL$, LEN (FL$) - I): GOTO 1540
    1530  IF ((X$ < "0") AND (X$ <  > ".")) OR ((X$ > "9") AND (X$ < "A")) OR (X$ > "Z") THEN  PRINT : VTAB 10: POKE H,19: PRINT LC$;"INVALID NAME -- PRESS RETURN TO REENTER ";: GOSUB 170: GOTO 1410
    1540  NEXT 
    1550  PRINT : PRINT D$;"OPEN ";FL$;",D1"
    1560  PRINT D$;"CLOSE ";FL$
    1570  PRINT D$;"DELETE ";FL$;",D1"
    1580  PRINT D$;"OPEN "FL$;",D1"
    1590  PRINT D$;"WRITE ";FL$
    1600  FOR I = 1 TO R: PRINT AP$(I): NEXT 
    1610  PRINT D$;"CLOSE"
    1620  RETURN 
    1630  REM **SET MARGINS**
    1640  PRINT : VTAB 8: POKE H,19: PRINT "LEFT MARGIN...": VTAB 10: POKE H,19: PRINT "<-  ->    <RETURN> = ACCEPT"
    1650  PRINT : VTAB 3: POKE H,5: PRINT LM;" ": VTAB 2: POKE H,LM: PRINT  CHR$ (0);: GOSUB 170
    1660  IF A$ =  CHR$ (8) THEN LM = LM - (LM > 1): PRINT : VTAB 2: POKE H,LM: PRINT " "
    1670  IF A$ =  CHR$ (21) OR A$ =  CHR$ (32) THEN  IF LM < (RM - 2) THEN  PRINT : VTAB 2: POKE H,LM: PRINT  CHR$ (255):LM = LM + 1
    1680  IF A$ <  >  CHR$ (13) THEN 1650
    1690  PRINT : VTAB 8: POKE H,19: PRINT "RIGHT MARGIN..."
    1700  PRINT : VTAB 3: POKE H,5: PRINT RM;" ": VTAB 2: POKE H,RM - 1: PRINT  CHR$ (0);: GOSUB 170
    1710  IF A$ =  CHR$ (8) THEN RM = RM - (RM > LM + 2): PRINT : VTAB 2: POKE H,RM: PRINT  CHR$ (255)
    1720  IF A$ =  CHR$ (21) OR A$ =  CHR$ (32) THEN RM = RM + (RM < 79): PRINT : VTAB 2: POKE H,RM - 1: PRINT " "
    1730  IF A$ <  >  CHR$ (13) THEN 1700
    1740  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$
    1750 C = LM: PRINT : VTAB 3: POKE H,5: PRINT C + 1;" ": VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT 
    1760  RETURN 
    1770  REM **SELECT LINE SPACING**
    1780  PRINT : VTAB 10: POKE H,6: PRINT "ENTER NUMBER OF SPACES BETWEEN LINES (1-4):" SPC( 4)"(CURRENT=";SP;")";: POKE H,49: GOSUB 170
    1790  IF A$ =  CHR$ (13) THEN  GOTO 1820
    1800  IF A$ < "1" OR A$ > "4" THEN 1780
    1810 SP =  VAL (A$)
    1820  PRINT : VTAB 10: PRINT LC$
    1830  RETURN 
    1840  REM **TRUNCATE LINE**
    1850  VTAB 6: POKE H,14: PRINT "OKAY TO ERASE TEXT FROM CURSOR TO END OF LINE? (Y/N) ": VTAB 2: POKE H,C: GOSUB 170: ON (A$ = "N" OR A$ =  CHR$ (110)) GOTO 1870: IF A$ <  > "Y" AND A$ <  >  CHR$ (121) THEN 1850
    1860  FOR I = M + C - LM TO M + LL - 1: POKE I,160: NEXT : VTAB 2: POKE H,C: FOR I = 1 TO RM - C: PRINT " ";: NEXT :LL = C - LM: PRINT 
    1870  PRINT : VTAB 6: PRINT LC$
    1880  RETURN 
    1890  REM **ENTER <ESC> CODE**
    1900 A = C: VTAB 6: POKE H,13: PRINT "TYPE <ESC> CODE & PRESS <RETURN> TO RESUME TEXT ENTRY"
    1910  VTAB 2: POKE H,C: GOSUB 170: IF A$ =  CHR$ (13) THEN  PRINT : GOTO 1970
    1920  IF A$ =  CHR$ (8) THEN B =  PEEK (M + C - LM): POKE H,C: PRINT  CHR$ (B + 227 * (B = 27)):C = C - (C > A): POKE M + C - LM,160: VTAB 2: POKE H,C: PRINT " ": GOTO 1960
    1930  IF B < 27 THEN 1910
    1940  POKE M + C - LM,B:B = B + 227 * (B = 27): INVERSE : VTAB 2: POKE H,C: PRINT  CHR$ (B): NORMAL 
    1950 C = C + (C < RM - 1):LL = LL + (LL < C)
    1960  POKE H,5: PRINT C + 1;" ": GOTO 1910
    1970  VTAB 6: PRINT LC$
    1980  RETURN 
    1990  REM **CTRL-CODE TO PRINTER**
    2000  VTAB 6: POKE H,17: PRINT "TYPE CONTROL-CHARACTER TO BE SENT TO PRINTER: ";: GOSUB 170: ON ((B > 26) OR (B = 13)) GOTO 2020
    2010  PRINT : PRINT D$;"PR#";SL: PRINT  CHR$ (9);"80N";: PRINT A$;: GOSUB 130
    2020  PRINT : VTAB 6: PRINT LC$: IF B < 26 AND B <  > 13 THEN  VTAB 4: POKE H,79: INVERSE : PRINT  CHR$ (B + 64): NORMAL 
    2030  RETURN 
    2040  REM **HELP SCREEN**
    2050  PRINT : VTAB 11: FOR I = 1 TO 80: PRINT U$;: NEXT 
    2060  PRINT "<CTRL-B>: "; CHR$ (92);" (UNDERLINE TEXT)";: POKE H,39: PRINT V$ + " <CRTL-P>: PRINT TEST PATTERN"
    2070  PRINT "<CTRL-D>: CLOSE LINE (DELETE CHAR)";: POKE H,39: PRINT V$ + " <CTRL-Q>: QUIT OR START ANEW"
    2080  PRINT "<CTRL-E>: JUMP TO LAST CHARACTER";: POKE H,39: PRINT V$ + " <CTRL-R>: TYPE "; CHR$ (93)
    2090  PRINT "<CTRL-F>: SET PRINTER LINE SPACING";: POKE H,39: PRINT V$ + " <CTRL-S>: JUMP TO LINE START"
    2100  PRINT "<CTRL-G>: TYPE "; CHR$ (95);: POKE H,39: PRINT V$ + " <CTRL-T>: SET OR CLEAR TAB STOP"
    2110  PRINT "<CTRL-I>: TAB";: POKE H,39: PRINT V$ + " <CTRL-V>: ENABLE REVERSE LINEFEEDS"
    2120  PRINT "<CTRL-J>: REVERSE PRINTER LINEFEED";: POKE H,39: PRINT V$ + " <CTRL-W>: SET LINE WIDTH (MARGINS)"
    2130  PRINT "<CTRL-L>: TYPE "; CHR$ (91);: POKE H,39: PRINT V$ + " <CTRL-X>: ERASE TO END OF LINE "
    2140  PRINT "<CTRL-N>: TYPE "; CHR$ (64);: POKE H,39: PRINT V$ + " <CTRL-Z>: CENTER TEXT"
    2150  PRINT "<CTRL-O>: OPEN LINE";: POKE H,39: PRINT V$ + " <DELETE>: DESTRUCTIVE BACKSPACE"
    2160  PRINT "<CTRL-^>: SEND CONTROL CHAR TO PRINTER";: POKE H,39: PRINT V$ + " <ESC>   : EMBED PRINTER <ESC> CODES"
    2170  FOR I = 1 TO 80: PRINT U$;: NEXT 
    2180  RETURN 
    2190  REM 
    2200  REM ***GLOBAL SETUP***
    2210  REM 
    2220  TEXT : HOME 
    2230  DIM TB(80),AP$(300): REM TAB STOP AND TEXT STRING ARRAYS
    2240  REM **INSTALL BUFFER PRINTER**
    2250  FOR I = 768 TO 792: READ X: POKE I,X: NEXT 
    2260  DATA 169,149,133,7,160,0,132,6,177,6,201,27,208,2,169,126,32,7,195,200,196,8,208,240,96
    2270  REM **MACHINE AND DOS ID**
    2280 PLUS = ( PEEK (64435) = 234 OR  PEEK (64435) = 56):PD = ( PEEK (48640) = 76): REM IF PLUS THEN II OR II+; IF PD THEN PRODOS
    2290  REM ***PRINTER CODES***
    2300 U1$ =  CHR$ (27) +  CHR$ (88): REM ESC+X TURNS ON UNDERLINE
    2310 U2$ =  CHR$ (27) +  CHR$ (89): REM ESC+Y TURNS OFF UNDERLINE
    2320 FF$ =  CHR$ (27) +  CHR$ (102): REM ESC+LOWERCASE F ACTIVATES FORWARD LINEFEEDS
    2330 RF$ =  CHR$ (27) +  CHR$ (114): REM ESC+LOWERCASE R ACTIVATES REVERSE LINEFEEDS
    2340  REM **ALL-PURPOSE REALS**
    2350 I = 0:J = 0:K = 0:X = 0:Y = 0
    2360  REM **DEDICATED REALS**
    2370 SL = 1: REM PRINTER SLOT
    2380 RF = 0: REM REVERSE LINEFEED FLAG
    2390 R = 1: REM ROW
    2400 C = 1: REM COLUMN
    2410 LM = 5: REM LEFT MARGIN
    2420 RM = 75: REM RIGHT MARGIN
    2430 LL = 0: REM LINE LENGTH
    2440 M = 38144: REM START OF TEXT BUFFER
    2450 H = 1403: REM HORZ POSITION
    2460 SP = 1: REM DEFAULT LINE SPACING
    2470  REM **STRING EQUIVALENTS**
    2480 X$ = ""
    2490 V$ =  CHR$ (252)
    2500 U$ =  CHR$ (95)
    2510 D$ =  CHR$ (4)
    2520 CL$ =  CHR$ (12): REM CLEAR SCREEN
    2530 LC$ =  CHR$ (29): REM CLEAR LINE
    2540 BS$ =  CHR$ (8): REM BACKSPACE
    2550  REM   
    2560  REM ***TITLE***
    2570  REM   
    2580  VTAB 4: HTAB 9: PRINT "TURN ON PRINTER OR....": HTAB 6: PRINT "PRESS PRINTER 'SELECT' BUTTON."
    2590  PRINT D$;"PR#1": PRINT 
    2600  HOME : POKE 1912,0
    2610  PRINT D$;"PR#3": PRINT CL$
    2620 A$ = "TYPEWRITER"
    2630 CL =  - 16336: SPEED= 150
    2640  VTAB 6: POKE H,31: FOR I = 1 TO 10: PRINT  MID$ (A$,I,1) + " ";:X =  PEEK (CL) +  PEEK (CL) +  PEEK (CL) +  PEEK (CL) +  PEEK (CL): NEXT 
    2650  SPEED= 255
    2660  PRINT : VTAB 10: POKE H,32: PRINT "BY JAMES D EVANS"
    2670  VTAB 14: POKE H,24: PRINT "COPYRIGHT 1988 BY MICROSPARC, INC."
    2680  VTAB 16: POKE H,27: PRINT "* PRESS <RETURN> TO BEGIN *";
    2690  POKE  - 16368,0: WAIT  - 16384,128: POKE  - 16368,0
    2700  RETURN 
    2710  REM 
    2720  REM ***ERROR TRAP***
    2730  REM 
    2740  POKE 216,0:EC =  PEEK (222):LN =  PEEK (218) +  PEEK (219) * 256: CALL 54915
    2750  PRINT : VTAB 10
    2760  IF EC = 4 THEN  PRINT "DISK IS WRITE-PROTECTED -- PLEASE REMOVE TAB FROM NOTCH ";: GOTO 2830
    2770  IF EC = 8 THEN  PRINT "DISK I/O ERROR -- PLEASE CHECK DISK AND DRIVE ";: GOTO 2830
    2780  IF EC = 9 THEN  PRINT "DISK IS FULL -- PLEASE INSERT A DIFFERENT DISK ";: GOTO 2830
    2790  IF EC = 10 THEN  PRINT "FILE LOCKED -- PLEASE THINK OF A DIFFERENT FILE NAME ";: GOTO 2830
    2800  IF EC = 11 THEN  PRINT "ILLEGAL FILE NAME -- PLEASE THINK OF A DIFFERENT NAME ";: GOTO 2830
    2810  IF EC = 255 THEN  PRINT "<CTRL-C> IS NOT AN ACCEPTABLE KEYSTROKE -- PLEASE NOTE ";: GOTO 2830
    2820  PRINT "ERROR #";EC;" HAS OCCURRED IN LINE ";LN;" -- PLEASE NOTE ";
    2830  PRINT "AND HIT <RETURN> ->";
    2840  GOSUB 170: IF A$ <  >  CHR$ (13) THEN  GOTO 2840
    2850  PRINT : VTAB 10: PRINT LC$: ONERR  GOTO 2740
    2860  GOTO 260
    2870  GET A$: IF A$ <  > "Y" AND A$ <  > "N" AND A$ <  > "y" AND A$ <  > "n" THEN 2870
    2880  RETURN