{"id":213,"date":"2026-07-16T04:13:38","date_gmt":"2026-07-16T04:13:38","guid":{"rendered":"https:\/\/permacomputer.solarpunk.au\/?p=213"},"modified":"2026-07-16T04:13:38","modified_gmt":"2026-07-16T04:13:38","slug":"word-processors-in-basic-part-1","status":"publish","type":"post","link":"https:\/\/permacomputer.solarpunk.au\/?p=213","title":{"rendered":"Word Processors in BASIC, Part 1"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Quickwriter<\/h1>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"418\" style=\"aspect-ratio: 766 \/ 418;\" width=\"766\" controls src=\"https:\/\/permacomputer.solarpunk.au\/wp-content\/uploads\/2026\/07\/quickwriter-screen-2026-07-16_12.08.18.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Found in <strong>June 1988<\/strong> issue of <em>Nibble<\/em> magazine (Volume 9, Number 6).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Archive.org link <a href=\"https:\/\/archive.org\/details\/nibbledisks_nib34b\" data-type=\"link\" data-id=\"https:\/\/archive.org\/details\/nibbledisks_nib34b\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The project was alerted to the existence of a few text editors and word processors in <em>Nibble <\/em>magazine by someone <a href=\"https:\/\/matrix.to\/#\/#basic:solarpunk.au\" data-type=\"link\" data-id=\"https:\/\/matrix.to\/#\/#basic:solarpunk.au\">on matrix<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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 <em>Quickwriter<\/em> and <em>Nibblewriter<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">diskM8 File Dump<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Please find an ASCII conversion of the BASIC dump obtained using the following commands:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>$ diskm8 -ingest \/path\/to\/your\/disk\/images\n$ diskm8 -search \"quickwriter\"\n$ diskm8 -with-disk \"your_disk_image.do\" -file-extract \"QUICKWRITER.BAS\"<\/code><\/pre>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-2b86fbd2-33c8-416a-b89a-7bb5b0210f78\" href=\"https:\/\/permacomputer.solarpunk.au\/wp-content\/uploads\/2026\/07\/quickwriter0x0801.BAS_.asc\">quickwriter#0x0801.BAS<\/a><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Code Listing<\/h1>\n\n\n\n<pre class=\"wp-block-code alignwide has-small-font-size\"><code>10  REM **********************\n20  REM *     TYPEWRITER     *\n30  REM *  BY JAMES D EVANS  *\n40  REM * COPYRIGHT (C) 1988 *\n50  REM * BY MICROSPARC, INC *\n60  REM * CONCORD, MA  01742 *\n70  REM **********************\n80  HIMEM: 38144:X =  FRE (0)\n90  ONERR  GOTO 2740\n100  GOSUB 2220\n110  GOTO 230\n120  REM **WARMSTART 80-COL CARD**\n130  ON  NOT PD GOTO 140: PRINT D$;\"PR#A$C307\": GOTO 150\n140  POKE 54,7: POKE 55,195: CALL 1002: PRINT \n150  RETURN \n160  REM **GET CHAR ROUTINE**\n170  POKE  - 16368,0: ON  NOT PLUS GOTO 180: PRINT  CHR$ (0);: GET A$: ON  NOT  LEN (A$) GOTO 170:B =  ASC (A$): GOTO 190\n180  INVERSE : PRINT \" \";BS$;: NORMAL : WAIT  - 16384,128:B = ( PEEK ( - 16384) - 128):A$ =  CHR$ (B): POKE  - 16368,0: PRINT \" \";BS$;: ON  NOT B GOTO 180\n190  RETURN \n200  REM \n210  REM ***MAIN PROGRAM***\n220  REM \n230  FOR I = M TO M + 80: POKE I,160: NEXT \n240  GOSUB 850: GOSUB 2050\n250 C = LM:LL = 0: POKE  - 16368,0\n260  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\n270  WAIT  - 16384,128:A$ =  CHR$ ( PEEK ( - 16384) - 128): POKE  - 16368,0\n280  IF A$ &lt; \" \" OR A$ =  CHR$ (127) THEN  GOSUB 330: GOTO 260\n290  PRINT A$: POKE M + C - LM, ASC (A$) + 128\n300 C = C + (C &lt; RM - 1):LL = LL + (LL &lt; RM - LM): POKE H,5: PRINT C + 1;\" \"\n310  GOTO 260\n320  REM **CTRL-CHAR EVALUATION**\n330  ON ( LEN (A$) = 0) GOTO 610: PRINT  CHR$ ( PEEK (M + (C - LM))); CHR$ (24)\n340  IF A$ =  CHR$ (127) THEN A$ =  CHR$ (4): ON C = LM GOTO 610:C = C - 1: POKE H,5: PRINT C + 1;\" \"\n350  IF A$ =  CHR$ (4) AND (LL + LM + 1) &gt; 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\n360  ON A$ &lt;  &gt;  CHR$ (15) OR C = (RM - 1) GOTO 370:LL = LL + (LL &lt; (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\n370  IF A$ =  CHR$ (8) THEN C = C - (C &gt; LM): POKE H,5: PRINT C + 1;\" \": GOTO 610\n380  IF A$ =  CHR$ (21) THEN C = C + (C &lt; RM - 1): POKE H,5: PRINT C + 1\" \":LL = LL + ((C + 1 - LM) &gt; LL): GOTO 610\n390  IF A$ =  CHR$ (9) THEN  GOSUB 940: GOTO 610\n400  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\n410  IF A$ =  CHR$ (13) THEN  GOSUB 660: POP : GOTO 250\n420  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\n430  IF A$ =  CHR$ (18) THEN A$ =  CHR$ (93): VTAB 2: POKE H,C: POP : GOTO 290\n440  IF A$ =  CHR$ (12) THEN A$ =  CHR$ (91): VTAB 2: POKE H,C: POP : GOTO 290\n450  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\n460  IF A$ =  CHR$ (14) THEN A$ =  CHR$ (64): VTAB 2: POKE H,C: POP : GOTO 290\n470  IF A$ =  CHR$ (26) THEN  GOSUB 990: GOTO 610\n480  IF A$ =  CHR$ (7) THEN A$ =  CHR$ (95): VTAB 2: POKE H,C: POP : GOTO 290\n490  IF A$ =  CHR$ (24) THEN  GOSUB 1850\n500  IF A$ =  CHR$ (10) THEN  GOSUB 1260: POP : GOTO 260\n510  IF A$ =  CHR$ (19) THEN C = LM: PRINT : VTAB 3: POKE H,5: PRINT C + 1;\" \": GOTO 610\n520  ON A$ &lt;  &gt;  CHR$ (5) GOTO 550: FOR I = M + (RM - LM - 1) TO M STEP  - 1: IF  PEEK (I) &lt;  &gt; 160 THEN C = LM + I - M + ((I - M) &lt; (RM - LM - 1)):I = M: GOTO 540\n530  NEXT \n540  PRINT : VTAB 3: POKE H,5: PRINT C + 1;\" \": GOTO 610\n550  IF A$ =  CHR$ (23) THEN  GOSUB 1640: GOTO 610\n560  IF A$ =  CHR$ (6) THEN  GOSUB 1780: GOTO 610\n570  IF A$ =  CHR$ (16) THEN  GOSUB 1170: POP : GOTO 260\n580  IF A$ =  CHR$ (17) THEN  GOSUB 1340: GOTO 610\n590  IF A$ =  CHR$ (27) AND (C &lt; (RM - 1)) THEN  GOSUB 1900: GOTO 610\n600  IF A$ =  CHR$ (30) THEN  GOSUB 2000\n610  RETURN \n620  REM \n630  REM ***UTILITY SUBROUTINES***\n640  REM \n650  REM **PRINT LINE**\n660 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$\n670  PRINT : PRINT D$;\"PR#\";SL\n680  PRINT  CHR$ (9);\"80N\";\n690  PRINT  TAB( LM);\n700  ON US GOTO 720\n710  PRINT AP$(R): GOTO 790\n720 J = 1\n730  FOR I = M TO M + LL\n740  ON  PEEK (I) &lt;  &gt; 92 GOTO 760:J =  NOT J: ON J GOTO 750: PRINT U1$;: GOTO 770\n750  PRINT U2$;: GOTO 770\n760  PRINT  CHR$ ( PEEK (I));\n770  NEXT \n780  PRINT U2$\n790 R = R + 1:US = 0\n800  ON SP &lt; 2 GOTO 810: PRINT : ON SP &lt; 3 GOTO 810: PRINT : ON SP &lt; 4 GOTO 810: PRINT \n810  GOSUB 130\n820  GOSUB 870\n830  RETURN \n840  REM **WINDOW**\n850  PRINT CL$\n860  FOR I = 1 TO LM: PRINT  CHR$ (255);: NEXT : POKE H,RM: FOR I = RM TO 79: PRINT  CHR$ (255);: NEXT \n870  VTAB 1: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT \n880  FOR I = M TO M + 80: POKE I,160: NEXT : VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT \n890  VTAB 3: PRINT \"COL: \";LM + 1;\" \"\n900  VTAB 5: PRINT \"LINE:\";R\n910  IF R &gt; 300 THEN  VTAB 10: POKE H,19: PRINT  CHR$ (7);\"NO MORE ROOM!  RESTART PROGRAM.\"\n920  RETURN \n930  REM **TAB**\n940  FOR I = C + 1 + (C &lt; RM - 1) TO RM - 1:C = I * TB(I) - 1: ON C &gt; 0 GOTO 960: NEXT \n950 C = RM - 1\n960 I = RM - 1: PRINT : VTAB 3: POKE H,5: PRINT C + 1: IF C + 1 &gt; LL THEN LL = C + 1 - LM\n970  RETURN \n980  REM **CENTER TEXT**\n990  PRINT : VTAB 6: POKE H,23: PRINT \"CENTERING.....\": PRINT : VTAB 2\n1000  FOR I = 0 TO LL\n1010  IF  PEEK (M + I) &lt;  &gt; 160 THEN X = I:I = LL: GOTO 1030\n1020  NEXT : GOTO 1140\n1030 Y = 0: FOR I = RM - LM - 1 TO 0 STEP  - 1\n1040 Y = Y + 1: IF  PEEK (M + I) &lt;  &gt; 160 THEN Y = Y - 1:I = 0: GOTO 1060\n1050  NEXT \n1060 XL = RM - LM - X - Y: REM STRING LENGTH     \n1070 K = 0: FOR J = M + X TO M + X + XL - 1:K = K + ( PEEK (J) &lt; 128): NEXT : REM HANDLE &lt;ESC&gt; AND UNDERLINE CODES\n1080 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)\n1090 J = 0:T =  INT ((RM - LM - XL - K) \/ 2) + K: IF (T + XL) &gt; (RM - LM) THEN  PRINT : VTAB 6: POKE H,9: PRINT  CHR$ (7);\"TOO MANY &lt;ESC&gt; CODES TO CENTER. PRESS RETURN TO RESUME TYPING \";: GOSUB 170: PRINT : VTAB 6: PRINT LC$: GOTO 1150\n1100  FOR I = M + X TO M + X + XL: POKE I,160: NEXT :\n1110  FOR I = M + T TO M + T + XL - 1:J = J + 1: POKE I, ASC ( MID$ (X$,J)): NEXT \n1120  POKE H,LM: POKE 8,RM - LM: CALL 768\n1130 LL = T + XL:C = LM + T + XL: IF C &gt;  = RM THEN C = C - 1\n1140  PRINT : VTAB 6: PRINT LC$: VTAB 3: POKE H,5: PRINT C + 1;\" \"\n1150  RETURN \n1160  REM **PRINT TEST PATTERN**\n1170  PRINT : PRINT D$;\"PR#\";SL\n1180  PRINT  CHR$ (9);\"80N\";\n1190  PRINT  TAB( LM)\".\" TAB(  INT (((RM - LM) \/ 2) - 1))\".\" TAB(  INT (((RM - LM) \/ 2)))\".\";\n1200  IF  NOT RF THEN  PRINT : GOTO 1230\n1210  PRINT RF$\n1220  PRINT FF$\n1230  GOSUB 130\n1240  RETURN \n1250  REM **ISSUE REVERSE LINEFEED**\n1260  ON  NOT RF GOTO 1320\n1270  PRINT : PRINT D$;\"PR#\";SL\n1280  PRINT  CHR$ (9);\"80N\";\n1290  PRINT RF$: PRINT RF$\n1300  PRINT FF$\n1310  GOSUB 130\n1320  RETURN \n1330  REM **QUIT?**\n1340  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$ &gt; \"S\"))\n1350  IF A$ = \"Q\" THEN  GOSUB 1390: PRINT CL$: END \n1360  IF A$ = \"R\" THEN  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$: RETURN \n1370  IF A$ = \"S\" THEN  GOSUB 1390: RUN \n1380  GOTO 1340\n1390  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$;: POKE H,19: PRINT \"SAVE THIS DOCUMENT? (Y\/N)\";: GOSUB 2870\n1400  IF A$ &lt;  &gt; \"Y\" AND A$ &lt;  &gt;  CHR$ (121) THEN 1620\n1410  PRINT : VTAB 10: PRINT LC$;: POKE H,19: PRINT \"ENTER DOCUMENT NAME: \";: FOR I = 1 TO 15: PRINT \"_\";: NEXT \n1420 HZ = 0:FL$ = \"\": POKE H,40\n1430  GOSUB 170: ON A$ &gt;  CHR$ (31) GOTO 1480\n1440  ON A$ =  CHR$ (13) GOTO 1500\n1450  IF A$ =  CHR$ (8) AND (FL$ = \"\" OR  LEN (FL$) = 1) THEN 1410\n1460  IF A$ =  CHR$ (8) THEN HZ = HZ - 1: POKE H, PEEK (H) - 1:FL$ =  MID$ (FL$,1, LEN (FL$) - 1): GOTO 1430\n1470  ON A$ =  CHR$ (27) GOTO 1410: ON A$ &lt; \" \" GOTO 1430\n1480  ON HZ = 15 GOTO 1430: IF A$ &gt;  CHR$ (95) THEN A$ =  CHR$ ( ASC (A$) - 32)\n1490 FL$ = FL$ + A$: PRINT A$;:HZ = HZ + 1: GOTO 1430\n1500  ON FL$ = \"\" GOTO 1620\n1510  IF  MID$ (FL$,1,1) &lt; \"A\" THEN  PRINT : VTAB 10: POKE H,19: PRINT LC$;\"INVALID NAME -- PRESS RETURN TO REENTER \";: GOSUB 170: GOTO 1410\n1520  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\n1530  IF ((X$ &lt; \"0\") AND (X$ &lt;  &gt; \".\")) OR ((X$ &gt; \"9\") AND (X$ &lt; \"A\")) OR (X$ &gt; \"Z\") THEN  PRINT : VTAB 10: POKE H,19: PRINT LC$;\"INVALID NAME -- PRESS RETURN TO REENTER \";: GOSUB 170: GOTO 1410\n1540  NEXT \n1550  PRINT : PRINT D$;\"OPEN \";FL$;\",D1\"\n1560  PRINT D$;\"CLOSE \";FL$\n1570  PRINT D$;\"DELETE \";FL$;\",D1\"\n1580  PRINT D$;\"OPEN \"FL$;\",D1\"\n1590  PRINT D$;\"WRITE \";FL$\n1600  FOR I = 1 TO R: PRINT AP$(I): NEXT \n1610  PRINT D$;\"CLOSE\"\n1620  RETURN \n1630  REM **SET MARGINS**\n1640  PRINT : VTAB 8: POKE H,19: PRINT \"LEFT MARGIN...\": VTAB 10: POKE H,19: PRINT \"&lt;-  -&gt;    &lt;RETURN&gt; = ACCEPT\"\n1650  PRINT : VTAB 3: POKE H,5: PRINT LM;\" \": VTAB 2: POKE H,LM: PRINT  CHR$ (0);: GOSUB 170\n1660  IF A$ =  CHR$ (8) THEN LM = LM - (LM &gt; 1): PRINT : VTAB 2: POKE H,LM: PRINT \" \"\n1670  IF A$ =  CHR$ (21) OR A$ =  CHR$ (32) THEN  IF LM &lt; (RM - 2) THEN  PRINT : VTAB 2: POKE H,LM: PRINT  CHR$ (255):LM = LM + 1\n1680  IF A$ &lt;  &gt;  CHR$ (13) THEN 1650\n1690  PRINT : VTAB 8: POKE H,19: PRINT \"RIGHT MARGIN...\"\n1700  PRINT : VTAB 3: POKE H,5: PRINT RM;\" \": VTAB 2: POKE H,RM - 1: PRINT  CHR$ (0);: GOSUB 170\n1710  IF A$ =  CHR$ (8) THEN RM = RM - (RM &gt; LM + 2): PRINT : VTAB 2: POKE H,RM: PRINT  CHR$ (255)\n1720  IF A$ =  CHR$ (21) OR A$ =  CHR$ (32) THEN RM = RM + (RM &lt; 79): PRINT : VTAB 2: POKE H,RM - 1: PRINT \" \"\n1730  IF A$ &lt;  &gt;  CHR$ (13) THEN 1700\n1740  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$\n1750 C = LM: PRINT : VTAB 3: POKE H,5: PRINT C + 1;\" \": VTAB 2: POKE H,LM: POKE 8,RM - LM: CALL 768: PRINT \n1760  RETURN \n1770  REM **SELECT LINE SPACING**\n1780  PRINT : VTAB 10: POKE H,6: PRINT \"ENTER NUMBER OF SPACES BETWEEN LINES (1-4):\" SPC( 4)\"(CURRENT=\";SP;\")\";: POKE H,49: GOSUB 170\n1790  IF A$ =  CHR$ (13) THEN  GOTO 1820\n1800  IF A$ &lt; \"1\" OR A$ &gt; \"4\" THEN 1780\n1810 SP =  VAL (A$)\n1820  PRINT : VTAB 10: PRINT LC$\n1830  RETURN \n1840  REM **TRUNCATE LINE**\n1850  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$ &lt;  &gt; \"Y\" AND A$ &lt;  &gt;  CHR$ (121) THEN 1850\n1860  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 \n1870  PRINT : VTAB 6: PRINT LC$\n1880  RETURN \n1890  REM **ENTER &lt;ESC&gt; CODE**\n1900 A = C: VTAB 6: POKE H,13: PRINT \"TYPE &lt;ESC&gt; CODE &amp; PRESS &lt;RETURN&gt; TO RESUME TEXT ENTRY\"\n1910  VTAB 2: POKE H,C: GOSUB 170: IF A$ =  CHR$ (13) THEN  PRINT : GOTO 1970\n1920  IF A$ =  CHR$ (8) THEN B =  PEEK (M + C - LM): POKE H,C: PRINT  CHR$ (B + 227 * (B = 27)):C = C - (C &gt; A): POKE M + C - LM,160: VTAB 2: POKE H,C: PRINT \" \": GOTO 1960\n1930  IF B &lt; 27 THEN 1910\n1940  POKE M + C - LM,B:B = B + 227 * (B = 27): INVERSE : VTAB 2: POKE H,C: PRINT  CHR$ (B): NORMAL \n1950 C = C + (C &lt; RM - 1):LL = LL + (LL &lt; C)\n1960  POKE H,5: PRINT C + 1;\" \": GOTO 1910\n1970  VTAB 6: PRINT LC$\n1980  RETURN \n1990  REM **CTRL-CODE TO PRINTER**\n2000  VTAB 6: POKE H,17: PRINT \"TYPE CONTROL-CHARACTER TO BE SENT TO PRINTER: \";: GOSUB 170: ON ((B &gt; 26) OR (B = 13)) GOTO 2020\n2010  PRINT : PRINT D$;\"PR#\";SL: PRINT  CHR$ (9);\"80N\";: PRINT A$;: GOSUB 130\n2020  PRINT : VTAB 6: PRINT LC$: IF B &lt; 26 AND B &lt;  &gt; 13 THEN  VTAB 4: POKE H,79: INVERSE : PRINT  CHR$ (B + 64): NORMAL \n2030  RETURN \n2040  REM **HELP SCREEN**\n2050  PRINT : VTAB 11: FOR I = 1 TO 80: PRINT U$;: NEXT \n2060  PRINT \"&lt;CTRL-B&gt;: \"; CHR$ (92);\" (UNDERLINE TEXT)\";: POKE H,39: PRINT V$ + \" &lt;CRTL-P&gt;: PRINT TEST PATTERN\"\n2070  PRINT \"&lt;CTRL-D&gt;: CLOSE LINE (DELETE CHAR)\";: POKE H,39: PRINT V$ + \" &lt;CTRL-Q&gt;: QUIT OR START ANEW\"\n2080  PRINT \"&lt;CTRL-E&gt;: JUMP TO LAST CHARACTER\";: POKE H,39: PRINT V$ + \" &lt;CTRL-R&gt;: TYPE \"; CHR$ (93)\n2090  PRINT \"&lt;CTRL-F&gt;: SET PRINTER LINE SPACING\";: POKE H,39: PRINT V$ + \" &lt;CTRL-S&gt;: JUMP TO LINE START\"\n2100  PRINT \"&lt;CTRL-G&gt;: TYPE \"; CHR$ (95);: POKE H,39: PRINT V$ + \" &lt;CTRL-T&gt;: SET OR CLEAR TAB STOP\"\n2110  PRINT \"&lt;CTRL-I&gt;: TAB\";: POKE H,39: PRINT V$ + \" &lt;CTRL-V&gt;: ENABLE REVERSE LINEFEEDS\"\n2120  PRINT \"&lt;CTRL-J&gt;: REVERSE PRINTER LINEFEED\";: POKE H,39: PRINT V$ + \" &lt;CTRL-W&gt;: SET LINE WIDTH (MARGINS)\"\n2130  PRINT \"&lt;CTRL-L&gt;: TYPE \"; CHR$ (91);: POKE H,39: PRINT V$ + \" &lt;CTRL-X&gt;: ERASE TO END OF LINE \"\n2140  PRINT \"&lt;CTRL-N&gt;: TYPE \"; CHR$ (64);: POKE H,39: PRINT V$ + \" &lt;CTRL-Z&gt;: CENTER TEXT\"\n2150  PRINT \"&lt;CTRL-O&gt;: OPEN LINE\";: POKE H,39: PRINT V$ + \" &lt;DELETE&gt;: DESTRUCTIVE BACKSPACE\"\n2160  PRINT \"&lt;CTRL-^&gt;: SEND CONTROL CHAR TO PRINTER\";: POKE H,39: PRINT V$ + \" &lt;ESC&gt;   : EMBED PRINTER &lt;ESC&gt; CODES\"\n2170  FOR I = 1 TO 80: PRINT U$;: NEXT \n2180  RETURN \n2190  REM \n2200  REM ***GLOBAL SETUP***\n2210  REM \n2220  TEXT : HOME \n2230  DIM TB(80),AP$(300): REM TAB STOP AND TEXT STRING ARRAYS\n2240  REM **INSTALL BUFFER PRINTER**\n2250  FOR I = 768 TO 792: READ X: POKE I,X: NEXT \n2260  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\n2270  REM **MACHINE AND DOS ID**\n2280 PLUS = ( PEEK (64435) = 234 OR  PEEK (64435) = 56):PD = ( PEEK (48640) = 76): REM IF PLUS THEN II OR II+; IF PD THEN PRODOS\n2290  REM ***PRINTER CODES***\n2300 U1$ =  CHR$ (27) +  CHR$ (88): REM ESC+X TURNS ON UNDERLINE\n2310 U2$ =  CHR$ (27) +  CHR$ (89): REM ESC+Y TURNS OFF UNDERLINE\n2320 FF$ =  CHR$ (27) +  CHR$ (102): REM ESC+LOWERCASE F ACTIVATES FORWARD LINEFEEDS\n2330 RF$ =  CHR$ (27) +  CHR$ (114): REM ESC+LOWERCASE R ACTIVATES REVERSE LINEFEEDS\n2340  REM **ALL-PURPOSE REALS**\n2350 I = 0:J = 0:K = 0:X = 0:Y = 0\n2360  REM **DEDICATED REALS**\n2370 SL = 1: REM PRINTER SLOT\n2380 RF = 0: REM REVERSE LINEFEED FLAG\n2390 R = 1: REM ROW\n2400 C = 1: REM COLUMN\n2410 LM = 5: REM LEFT MARGIN\n2420 RM = 75: REM RIGHT MARGIN\n2430 LL = 0: REM LINE LENGTH\n2440 M = 38144: REM START OF TEXT BUFFER\n2450 H = 1403: REM HORZ POSITION\n2460 SP = 1: REM DEFAULT LINE SPACING\n2470  REM **STRING EQUIVALENTS**\n2480 X$ = \"\"\n2490 V$ =  CHR$ (252)\n2500 U$ =  CHR$ (95)\n2510 D$ =  CHR$ (4)\n2520 CL$ =  CHR$ (12): REM CLEAR SCREEN\n2530 LC$ =  CHR$ (29): REM CLEAR LINE\n2540 BS$ =  CHR$ (8): REM BACKSPACE\n2550  REM   \n2560  REM ***TITLE***\n2570  REM   \n2580  VTAB 4: HTAB 9: PRINT \"TURN ON PRINTER OR....\": HTAB 6: PRINT \"PRESS PRINTER 'SELECT' BUTTON.\"\n2590  PRINT D$;\"PR#1\": PRINT \n2600  HOME : POKE 1912,0\n2610  PRINT D$;\"PR#3\": PRINT CL$\n2620 A$ = \"TYPEWRITER\"\n2630 CL =  - 16336: SPEED= 150\n2640  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 \n2650  SPEED= 255\n2660  PRINT : VTAB 10: POKE H,32: PRINT \"BY JAMES D EVANS\"\n2670  VTAB 14: POKE H,24: PRINT \"COPYRIGHT 1988 BY MICROSPARC, INC.\"\n2680  VTAB 16: POKE H,27: PRINT \"* PRESS &lt;RETURN&gt; TO BEGIN *\";\n2690  POKE  - 16368,0: WAIT  - 16384,128: POKE  - 16368,0\n2700  RETURN \n2710  REM \n2720  REM ***ERROR TRAP***\n2730  REM \n2740  POKE 216,0:EC =  PEEK (222):LN =  PEEK (218) +  PEEK (219) * 256: CALL 54915\n2750  PRINT : VTAB 10\n2760  IF EC = 4 THEN  PRINT \"DISK IS WRITE-PROTECTED -- PLEASE REMOVE TAB FROM NOTCH \";: GOTO 2830\n2770  IF EC = 8 THEN  PRINT \"DISK I\/O ERROR -- PLEASE CHECK DISK AND DRIVE \";: GOTO 2830\n2780  IF EC = 9 THEN  PRINT \"DISK IS FULL -- PLEASE INSERT A DIFFERENT DISK \";: GOTO 2830\n2790  IF EC = 10 THEN  PRINT \"FILE LOCKED -- PLEASE THINK OF A DIFFERENT FILE NAME \";: GOTO 2830\n2800  IF EC = 11 THEN  PRINT \"ILLEGAL FILE NAME -- PLEASE THINK OF A DIFFERENT NAME \";: GOTO 2830\n2810  IF EC = 255 THEN  PRINT \"&lt;CTRL-C&gt; IS NOT AN ACCEPTABLE KEYSTROKE -- PLEASE NOTE \";: GOTO 2830\n2820  PRINT \"ERROR #\";EC;\" HAS OCCURRED IN LINE \";LN;\" -- PLEASE NOTE \";\n2830  PRINT \"AND HIT &lt;RETURN&gt; -&gt;\";\n2840  GOSUB 170: IF A$ &lt;  &gt;  CHR$ (13) THEN  GOTO 2840\n2850  PRINT : VTAB 10: PRINT LC$: ONERR  GOTO 2740\n2860  GOTO 260\n2870  GET A$: IF A$ &lt;  &gt; \"Y\" AND A$ &lt;  &gt; \"N\" AND A$ &lt;  &gt; \"y\" AND A$ &lt;  &gt; \"n\" THEN 2870\n2880  RETURN \n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":220,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"We found 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.\n\nBoth programs are quite long and involved, so instead of creating one enormous post, we decided to split the discussion up into two feature posts.","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[18],"tags":[31,20,17,26],"class_list":["post-213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-basic-text-editors","tag-apple-ii-basic","tag-basic","tag-retrocomputing","tag-videos"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/permacomputer.solarpunk.au\/wp-content\/uploads\/2026\/07\/6213123497_509ab72c17_k.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=213"}],"version-history":[{"count":6,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/213\/revisions"}],"predecessor-version":[{"id":224,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/213\/revisions\/224"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/media\/220"}],"wp:attachment":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}