Word Processors in Basic, Part 1

surprisetalk1 pts0 comments

Word Processors in BASIC, Part 1 – The People's Permacomputer Project

Skip to content

Word Processors in BASIC, Part 1

Written by

vidak

in

BASIC Text Editors

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<br>$ diskm8 -search "quickwriter"<br>$ diskm8 -with-disk "your_disk_image.do" -file-extract "QUICKWRITER.BAS"

quickwriter#0x0801.BAS

Code Listing

10 REM **********************<br>20 REM * TYPEWRITER *<br>30 REM * BY JAMES D EVANS *<br>40 REM * COPYRIGHT (C) 1988 *<br>50 REM * BY MICROSPARC, INC *<br>60 REM * CONCORD, MA 01742 *<br>70 REM **********************<br>80 HIMEM: 38144:X = FRE (0)<br>90 ONERR GOTO 2740<br>100 GOSUB 2220<br>110 GOTO 230<br>120 REM **WARMSTART 80-COL CARD**<br>130 ON NOT PD GOTO 140: PRINT D$;"PR#A$C307": GOTO 150<br>140 POKE 54,7: POKE 55,195: CALL 1002: PRINT<br>150 RETURN<br>160 REM **GET CHAR ROUTINE**<br>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<br>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<br>190 RETURN<br>200 REM<br>210 REM ***MAIN PROGRAM***<br>220 REM<br>230 FOR I = M TO M + 80: POKE I,160: NEXT<br>240 GOSUB 850: GOSUB 2050<br>250 C = LM:LL = 0: POKE - 16368,0<br>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<br>270 WAIT - 16384,128:A$ = CHR$ ( PEEK ( - 16384) - 128): POKE - 16368,0<br>280 IF A$ 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<br>360 ON A$ CHR$ (15) OR C = (RM - 1) GOTO 370:LL = LL + (LL LM): POKE H,5: PRINT C + 1;" ": GOTO 610<br>380 IF A$ = CHR$ (21) THEN C = C + (C LL): GOTO 610<br>390 IF A$ = CHR$ (9) THEN GOSUB 940: GOTO 610<br>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<br>410 IF A$ = CHR$ (13) THEN GOSUB 660: POP : GOTO 250<br>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<br>430 IF A$ = CHR$ (18) THEN A$ = CHR$ (93): VTAB 2: POKE H,C: POP : GOTO 290<br>440 IF A$ = CHR$ (12) THEN A$ = CHR$ (91): VTAB 2: POKE H,C: POP : GOTO 290<br>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<br>460 IF A$ = CHR$ (14) THEN A$ = CHR$ (64): VTAB 2: POKE H,C: POP : GOTO 290<br>470 IF A$ = CHR$ (26) THEN GOSUB 990: GOTO 610<br>480 IF A$ = CHR$ (7) THEN A$ = CHR$ (95): VTAB 2: POKE H,C: POP : GOTO 290<br>490 IF A$ = CHR$ (24) THEN GOSUB 1850<br>500 IF A$ = CHR$ (10) THEN GOSUB 1260: POP : GOTO 260<br>510 IF A$ = CHR$ (19) THEN C = LM: PRINT : VTAB 3: POKE H,5: PRINT C + 1;" ": GOTO 610<br>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) 92 GOTO 760:J = NOT J: ON J GOTO 750: PRINT U1$;: GOTO 770<br>750 PRINT U2$;: GOTO 770<br>760 PRINT CHR$ ( PEEK (I));<br>770 NEXT<br>780 PRINT U2$<br>790 R = R + 1:US = 0<br>800 ON SP 300 THEN VTAB 10: POKE H,19: PRINT CHR$ (7);"NO MORE ROOM! RESTART PROGRAM."<br>920 RETURN<br>930 REM **TAB**<br>940 FOR I = C + 1 + (C 0 GOTO 960: NEXT<br>950 C = RM - 1<br>960 I = RM - 1: PRINT : VTAB 3: POKE H,5: PRINT C + 1: IF C + 1 > LL THEN LL = C + 1 - LM<br>970 RETURN<br>980 REM **CENTER TEXT**<br>990 PRINT : VTAB 6: POKE H,23: PRINT "CENTERING.....": PRINT : VTAB 2<br>1000 FOR I = 0 TO LL<br>1010 IF PEEK (M + I) 160 THEN X = I:I = LL: GOTO 1030<br>1020 NEXT : GOTO 1140<br>1030 Y = 0: FOR I = RM - LM - 1 TO 0 STEP - 1<br>1040 Y = Y + 1: IF PEEK (M + I) 160 THEN Y = Y - 1:I = 0: GOTO 1060<br>1050 NEXT<br>1060 XL = RM - LM - X - Y: REM STRING LENGTH<br>1070 K = 0: FOR J = M + X TO M + X + XL - 1:K = K + ( PEEK (J) AND UNDERLINE CODES<br>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)<br>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 CODES TO CENTER. PRESS RETURN TO RESUME TYPING ";: GOSUB 170: PRINT : VTAB 6: PRINT LC$: GOTO 1150<br>1100 FOR I = M + X TO M + X + XL: POKE I,160: NEXT :<br>1110 FOR I = M + T TO M + T + XL - 1:J = J + 1: POKE I,...

goto poke print vtab peek gosub

Related Articles