home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib34b.dsk / QUICKWRITER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  16KB  |  288 lines

  1. 10  REM **********************
  2. 20  REM *     TYPEWRITER     *
  3. 30  REM *  BY JAMES D EVANS  *
  4. 40  REM * COPYRIGHT (C) 1988 *
  5. 50  REM * BY MICROSPARC, INC *
  6. 60  REM * CONCORD, MA  01742 *
  7. 70  REM **********************
  8. 80  HIMEM: 38144:X =  FRE(0)
  9. 90  ONERR  GOTO 2740
  10. 100  GOSUB 2220
  11. 110  GOTO 230
  12. 120  REM **WARMSTART 80-COL CARD**
  13. 130  ON   NOT PD GOTO 140: PRINT D$;"PR#A$C307": GOTO 150
  14. 140  POKE 54,7: POKE 55,195: CALL 1002: PRINT 
  15. 150  RETURN 
  16. 160  REM **GET CHAR ROUTINE**
  17. 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
  18. 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
  19. 190  RETURN 
  20. 200  REM 
  21. 210  REM ***MAIN PROGRAM***
  22. 220  REM 
  23. 230  FOR I = M TO M +80: POKE I,160: NEXT 
  24. 240  GOSUB 850: GOSUB 2050
  25. 250 C = LM:LL = 0: POKE  -16368,0
  26. 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
  27. 270  WAIT  -16384,128:A$ =  CHR$( PEEK( -16384) -128): POKE  -16368,0
  28. 280  IF A$ <" "  OR A$ =  CHR$(127)  THEN  GOSUB 330: GOTO 260
  29. 290  PRINT A$: POKE M +C -LM, ASC(A$) +128
  30. 300 C = C +(C <RM -1):LL = LL +(LL <RM -LM): POKE H,5: PRINT C +1;" "
  31. 310  GOTO 260
  32. 320  REM **CTRL-CHAR EVALUATION**
  33. 330  ON ( LEN(A$) = 0) GOTO 610: PRINT  CHR$( PEEK(M +(C -LM))); CHR$(24)
  34. 340  IF A$ =  CHR$(127)  THEN A$ =  CHR$(4): ON C = LM GOTO 610:C = C -1: POKE H,5: PRINT C +1;" "
  35. 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
  36. 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
  37. 370  IF A$ =  CHR$(8)  THEN C = C -(C >LM): POKE H,5: PRINT C +1;" ": GOTO 610
  38. 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
  39. 390  IF A$ =  CHR$(9)  THEN  GOSUB 940: GOTO 610
  40. 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
  41. 410  IF A$ =  CHR$(13)  THEN  GOSUB 660: POP : GOTO 250
  42. 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
  43. 430  IF A$ =  CHR$(18)  THEN A$ =  CHR$(93): VTAB 2: POKE H,C: POP : GOTO 290
  44. 440  IF A$ =  CHR$(12)  THEN A$ =  CHR$(91): VTAB 2: POKE H,C: POP : GOTO 290
  45. 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
  46. 460  IF A$ =  CHR$(14)  THEN A$ =  CHR$(64): VTAB 2: POKE H,C: POP : GOTO 290
  47. 470  IF A$ =  CHR$(26)  THEN  GOSUB 990: GOTO 610
  48. 480  IF A$ =  CHR$(7)  THEN A$ =  CHR$(95): VTAB 2: POKE H,C: POP : GOTO 290
  49. 490  IF A$ =  CHR$(24)  THEN  GOSUB 1850
  50. 500  IF A$ =  CHR$(10)  THEN  GOSUB 1260: POP : GOTO 260
  51. 510  IF A$ =  CHR$(19)  THEN C = LM: PRINT : VTAB 3: POKE H,5: PRINT C +1;" ": GOTO 610
  52. 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
  53. 530  NEXT 
  54. 540  PRINT : VTAB 3: POKE H,5: PRINT C +1;" ": GOTO 610
  55. 550  IF A$ =  CHR$(23)  THEN  GOSUB 1640: GOTO 610
  56. 560  IF A$ =  CHR$(6)  THEN  GOSUB 1780: GOTO 610
  57. 570  IF A$ =  CHR$(16)  THEN  GOSUB 1170: POP : GOTO 260
  58. 580  IF A$ =  CHR$(17)  THEN  GOSUB 1340: GOTO 610
  59. 590  IF A$ =  CHR$(27)  AND (C <(RM -1))  THEN  GOSUB 1900: GOTO 610
  60. 600  IF A$ =  CHR$(30)  THEN  GOSUB 2000
  61. 610  RETURN 
  62. 620  REM 
  63. 630  REM ***UTILITY SUBROUTINES***
  64. 640  REM 
  65. 650  REM **PRINT LINE**
  66. 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$
  67. 670  PRINT : PRINT D$;"PR#";SL
  68. 680  PRINT  CHR$(9);"80N";
  69. 690  PRINT  TAB( LM);
  70. 700  ON US GOTO 720
  71. 710  PRINT AP$(R): GOTO 790
  72. 720 J = 1
  73. 730  FOR I = M TO M +LL
  74. 740  ON  PEEK(I) < >92 GOTO 760:J =   NOT J: ON J GOTO 750: PRINT U1$;: GOTO 770
  75. 750  PRINT U2$;: GOTO 770
  76. 760  PRINT  CHR$( PEEK(I));
  77. 770  NEXT 
  78. 780  PRINT U2$
  79. 790 R = R +1:US = 0
  80. 800  ON SP <2 GOTO 810: PRINT : ON SP <3 GOTO 810: PRINT : ON SP <4 GOTO 810: PRINT 
  81. 810  GOSUB 130
  82. 820  GOSUB 870
  83. 830  RETURN 
  84. 840  REM **WINDOW**
  85. 850  PRINT CL$
  86. 860  FOR I = 1 TO LM: PRINT  CHR$(255);: NEXT : POKE H,RM: FOR I = RM TO 79: PRINT  CHR$(255);: NEXT 
  87. 870  VTAB 1: POKE H,LM: POKE 8,RM -LM: CALL 768: PRINT 
  88. 880  FOR I = M TO M +80: POKE I,160: NEXT : VTAB 2: POKE H,LM: POKE 8,RM -LM: CALL 768: PRINT 
  89. 890  VTAB 3: PRINT "COL: ";LM +1;" "
  90. 900  VTAB 5: PRINT "LINE:";R
  91. 910  IF R >300  THEN  VTAB 10: POKE H,19: PRINT  CHR$(7);"NO MORE ROOM!  RESTART PROGRAM."
  92. 920  RETURN 
  93. 930  REM **TAB**
  94. 940  FOR I = C +1 +(C <RM -1) TO RM -1:C = I *TB(I) -1: ON C >0 GOTO 960: NEXT 
  95. 950 C = RM -1
  96. 960 I = RM -1: PRINT : VTAB 3: POKE H,5: PRINT C +1: IF C +1 >LL  THEN LL = C +1 -LM
  97. 970  RETURN 
  98. 980  REM **CENTER TEXT**
  99. 990  PRINT : VTAB 6: POKE H,23: PRINT "CENTERING.....": PRINT : VTAB 2
  100. 1000  FOR I = 0 TO LL
  101. 1010  IF  PEEK(M +I) < >160  THEN X = I:I = LL: GOTO 1030
  102. 1020  NEXT : GOTO 1140
  103. 1030 Y = 0: FOR I = RM -LM -1 TO 0  STEP  -1
  104. 1040 Y = Y +1: IF  PEEK(M +I) < >160  THEN Y = Y -1:I = 0: GOTO 1060
  105. 1050  NEXT 
  106. 1060 XL = RM -LM -X -Y: REM STRING LENGTH     
  107. 1070 K = 0: FOR J = M +X TO M +X +XL -1:K = K +( PEEK(J) <128): NEXT : REM HANDLE <ESC> AND UNDERLINE CODES
  108. 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)
  109. 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
  110. 1100  FOR I = M +X TO M +X +XL: POKE I,160: NEXT :
  111. 1110  FOR I = M +T TO M +T +XL -1:J = J +1: POKE I, ASC( MID$ (X$,J)): NEXT 
  112. 1120  POKE H,LM: POKE 8,RM -LM: CALL 768
  113. 1130 LL = T +XL:C = LM +T +XL: IF C > = RM  THEN C = C -1
  114. 1140  PRINT : VTAB 6: PRINT LC$: VTAB 3: POKE H,5: PRINT C +1;" "
  115. 1150  RETURN 
  116. 1160  REM **PRINT TEST PATTERN**
  117. 1170  PRINT : PRINT D$;"PR#";SL
  118. 1180  PRINT  CHR$(9);"80N";
  119. 1190  PRINT  TAB( LM)"." TAB(  INT(((RM -LM)/2) -1))"." TAB(  INT(((RM -LM)/2)))".";
  120. 1200  IF   NOT RF  THEN  PRINT : GOTO 1230
  121. 1210  PRINT RF$
  122. 1220  PRINT FF$
  123. 1230  GOSUB 130
  124. 1240  RETURN 
  125. 1250  REM **ISSUE REVERSE LINEFEED**
  126. 1260  ON   NOT RF GOTO 1320
  127. 1270  PRINT : PRINT D$;"PR#";SL
  128. 1280  PRINT  CHR$(9);"80N";
  129. 1290  PRINT RF$: PRINT RF$
  130. 1300  PRINT FF$
  131. 1310  GOSUB 130
  132. 1320  RETURN 
  133. 1330  REM **QUIT?**
  134. 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"))
  135. 1350  IF A$ = "Q"  THEN  GOSUB 1390: PRINT CL$: END 
  136. 1360  IF A$ = "R"  THEN  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$: RETURN 
  137. 1370  IF A$ = "S"  THEN  GOSUB 1390: RUN 
  138. 1380  GOTO 1340
  139. 1390  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$;: POKE H,19: PRINT "SAVE THIS DOCUMENT? (Y/N)";: GOSUB 2870
  140. 1400  IF A$ < >"Y"  AND A$ < > CHR$(121)  THEN 1620
  141. 1410  PRINT : VTAB 10: PRINT LC$;: POKE H,19: PRINT "ENTER DOCUMENT NAME: ";: FOR I = 1 TO 15: PRINT "_";: NEXT 
  142. 1420 HZ = 0:FL$ = "": POKE H,40
  143. 1430  GOSUB 170: ON A$ > CHR$(31) GOTO 1480
  144. 1440  ON A$ =  CHR$(13) GOTO 1500
  145. 1450  IF A$ =  CHR$(8)  AND (FL$ = ""  OR  LEN(FL$) = 1)  THEN 1410
  146. 1460  IF A$ =  CHR$(8)  THEN HZ = HZ -1: POKE H, PEEK(H) -1:FL$ =  MID$ (FL$,1, LEN(FL$) -1): GOTO 1430
  147. 1470  ON A$ =  CHR$(27) GOTO 1410: ON A$ <" " GOTO 1430
  148. 1480  ON HZ = 15 GOTO 1430: IF A$ > CHR$(95)  THEN A$ =  CHR$( ASC(A$) -32)
  149. 1490 FL$ = FL$ +A$: PRINT A$;:HZ = HZ +1: GOTO 1430
  150. 1500  ON FL$ = "" GOTO 1620
  151. 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
  152. 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
  153. 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
  154. 1540  NEXT 
  155. 1550  PRINT : PRINT D$;"OPEN ";FL$;",D1"
  156. 1560  PRINT D$;"CLOSE ";FL$
  157. 1570  PRINT D$;"DELETE ";FL$;",D1"
  158. 1580  PRINT D$;"OPEN "FL$;",D1"
  159. 1590  PRINT D$;"WRITE ";FL$
  160. 1600  FOR I = 1 TO R: PRINT AP$(I): NEXT 
  161. 1610  PRINT D$;"CLOSE"
  162. 1620  RETURN 
  163. 1630  REM **SET MARGINS**
  164. 1640  PRINT : VTAB 8: POKE H,19: PRINT "LEFT MARGIN...": VTAB 10: POKE H,19: PRINT "<-  ->    <RETURN> = ACCEPT"
  165. 1650  PRINT : VTAB 3: POKE H,5: PRINT LM;" ": VTAB 2: POKE H,LM: PRINT  CHR$(0);: GOSUB 170
  166. 1660  IF A$ =  CHR$(8)  THEN LM = LM -(LM >1): PRINT : VTAB 2: POKE H,LM: PRINT " "
  167. 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
  168. 1680  IF A$ < > CHR$(13)  THEN 1650
  169. 1690  PRINT : VTAB 8: POKE H,19: PRINT "RIGHT MARGIN..."
  170. 1700  PRINT : VTAB 3: POKE H,5: PRINT RM;" ": VTAB 2: POKE H,RM -1: PRINT  CHR$(0);: GOSUB 170
  171. 1710  IF A$ =  CHR$(8)  THEN RM = RM -(RM >LM +2): PRINT : VTAB 2: POKE H,RM: PRINT  CHR$(255)
  172. 1720  IF A$ =  CHR$(21)  OR A$ =  CHR$(32)  THEN RM = RM +(RM <79): PRINT : VTAB 2: POKE H,RM -1: PRINT " "
  173. 1730  IF A$ < > CHR$(13)  THEN 1700
  174. 1740  PRINT : VTAB 8: PRINT LC$: VTAB 10: PRINT LC$
  175. 1750 C = LM: PRINT : VTAB 3: POKE H,5: PRINT C +1;" ": VTAB 2: POKE H,LM: POKE 8,RM -LM: CALL 768: PRINT 
  176. 1760  RETURN 
  177. 1770  REM **SELECT LINE SPACING**
  178. 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
  179. 1790  IF A$ =  CHR$(13)  THEN  GOTO 1820
  180. 1800  IF A$ <"1"  OR A$ >"4"  THEN 1780
  181. 1810 SP =  VAL(A$)
  182. 1820  PRINT : VTAB 10: PRINT LC$
  183. 1830  RETURN 
  184. 1840  REM **TRUNCATE LINE**
  185. 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
  186. 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 
  187. 1870  PRINT : VTAB 6: PRINT LC$
  188. 1880  RETURN 
  189. 1890  REM **ENTER <ESC> CODE**
  190. 1900 A = C: VTAB 6: POKE H,13: PRINT "TYPE <ESC> CODE & PRESS <RETURN> TO RESUME TEXT ENTRY"
  191. 1910  VTAB 2: POKE H,C: GOSUB 170: IF A$ =  CHR$(13)  THEN  PRINT : GOTO 1970
  192. 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
  193. 1930  IF B <27  THEN 1910
  194. 1940  POKE M +C -LM,B:B = B +227 *(B = 27): INVERSE : VTAB 2: POKE H,C: PRINT  CHR$(B): NORMAL 
  195. 1950 C = C +(C <RM -1):LL = LL +(LL <C)
  196. 1960  POKE H,5: PRINT C +1;" ": GOTO 1910
  197. 1970  VTAB 6: PRINT LC$
  198. 1980  RETURN 
  199. 1990  REM **CTRL-CODE TO PRINTER**
  200. 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
  201. 2010  PRINT : PRINT D$;"PR#";SL: PRINT  CHR$(9);"80N";: PRINT A$;: GOSUB 130
  202. 2020  PRINT : VTAB 6: PRINT LC$: IF B <26  AND B < >13  THEN  VTAB 4: POKE H,79: INVERSE : PRINT  CHR$(B +64): NORMAL 
  203. 2030  RETURN 
  204. 2040  REM **HELP SCREEN**
  205. 2050  PRINT : VTAB 11: FOR I = 1 TO 80: PRINT U$;: NEXT 
  206. 2060  PRINT "<CTRL-B>: "; CHR$(92);" (UNDERLINE TEXT)";: POKE H,39: PRINT V$ +" <CRTL-P>: PRINT TEST PATTERN"
  207. 2070  PRINT "<CTRL-D>: CLOSE LINE (DELETE CHAR)";: POKE H,39: PRINT V$ +" <CTRL-Q>: QUIT OR START ANEW"
  208. 2080  PRINT "<CTRL-E>: JUMP TO LAST CHARACTER";: POKE H,39: PRINT V$ +" <CTRL-R>: TYPE "; CHR$(93)
  209. 2090  PRINT "<CTRL-F>: SET PRINTER LINE SPACING";: POKE H,39: PRINT V$ +" <CTRL-S>: JUMP TO LINE START"
  210. 2100  PRINT "<CTRL-G>: TYPE "; CHR$(95);: POKE H,39: PRINT V$ +" <CTRL-T>: SET OR CLEAR TAB STOP"
  211. 2110  PRINT "<CTRL-I>: TAB";: POKE H,39: PRINT V$ +" <CTRL-V>: ENABLE REVERSE LINEFEEDS"
  212. 2120  PRINT "<CTRL-J>: REVERSE PRINTER LINEFEED";: POKE H,39: PRINT V$ +" <CTRL-W>: SET LINE WIDTH (MARGINS)"
  213. 2130  PRINT "<CTRL-L>: TYPE "; CHR$(91);: POKE H,39: PRINT V$ +" <CTRL-X>: ERASE TO END OF LINE "
  214. 2140  PRINT "<CTRL-N>: TYPE "; CHR$(64);: POKE H,39: PRINT V$ +" <CTRL-Z>: CENTER TEXT"
  215. 2150  PRINT "<CTRL-O>: OPEN LINE";: POKE H,39: PRINT V$ +" <DELETE>: DESTRUCTIVE BACKSPACE"
  216. 2160  PRINT "<CTRL-^>: SEND CONTROL CHAR TO PRINTER";: POKE H,39: PRINT V$ +" <ESC>   : EMBED PRINTER <ESC> CODES"
  217. 2170  FOR I = 1 TO 80: PRINT U$;: NEXT 
  218. 2180  RETURN 
  219. 2190  REM 
  220. 2200  REM ***GLOBAL SETUP***
  221. 2210  REM 
  222. 2220  TEXT : HOME 
  223. 2230  DIM TB(80),AP$(300): REM TAB STOP AND TEXT STRING ARRAYS
  224. 2240  REM **INSTALL BUFFER PRINTER**
  225. 2250  FOR I = 768 TO 792: READ X: POKE I,X: NEXT 
  226. 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
  227. 2270  REM **MACHINE AND DOS ID**
  228. 2280 PLUS = ( PEEK(64435) = 234  OR  PEEK(64435) = 56):PD = ( PEEK(48640) = 76): REM IF PLUS THEN II OR II+; IF PD THEN PRODOS
  229. 2290  REM ***PRINTER CODES***
  230. 2300 U1$ =  CHR$(27) + CHR$(88): REM ESC+X TURNS ON UNDERLINE
  231. 2310 U2$ =  CHR$(27) + CHR$(89): REM ESC+Y TURNS OFF UNDERLINE
  232. 2320 FF$ =  CHR$(27) + CHR$(102): REM ESC+LOWERCASE F ACTIVATES FORWARD LINEFEEDS
  233. 2330 RF$ =  CHR$(27) + CHR$(114): REM ESC+LOWERCASE R ACTIVATES REVERSE LINEFEEDS
  234. 2340  REM **ALL-PURPOSE REALS**
  235. 2350 I = 0:J = 0:K = 0:X = 0:Y = 0
  236. 2360  REM **DEDICATED REALS**
  237. 2370 SL = 1: REM PRINTER SLOT
  238. 2380 RF = 0: REM REVERSE LINEFEED FLAG
  239. 2390 R = 1: REM ROW
  240. 2400 C = 1: REM COLUMN
  241. 2410 LM = 5: REM LEFT MARGIN
  242. 2420 RM = 75: REM RIGHT MARGIN
  243. 2430 LL = 0: REM LINE LENGTH
  244. 2440 M = 38144: REM START OF TEXT BUFFER
  245. 2450 H = 1403: REM HORZ POSITION
  246. 2460 SP = 1: REM DEFAULT LINE SPACING
  247. 2470  REM **STRING EQUIVALENTS**
  248. 2480 X$ = ""
  249. 2490 V$ =  CHR$(252)
  250. 2500 U$ =  CHR$(95)
  251. 2510 D$ =  CHR$(4)
  252. 2520 CL$ =  CHR$(12): REM CLEAR SCREEN
  253. 2530 LC$ =  CHR$(29): REM CLEAR LINE
  254. 2540 BS$ =  CHR$(8): REM BACKSPACE
  255. 2550  REM   
  256. 2560  REM ***TITLE***
  257. 2570  REM   
  258. 2580  VTAB 4: HTAB 9: PRINT "TURN ON PRINTER OR....": HTAB 6: PRINT "PRESS PRINTER 'SELECT' BUTTON."
  259. 2590  PRINT D$;"PR#1": PRINT 
  260. 2600  HOME : POKE 1912,0
  261. 2610  PRINT D$;"PR#3": PRINT CL$
  262. 2620 A$ = "TYPEWRITER"
  263. 2630 CL =  -16336: SPEED= 150
  264. 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 
  265. 2650  SPEED= 255
  266. 2660  PRINT : VTAB 10: POKE H,32: PRINT "BY JAMES D EVANS"
  267. 2670  VTAB 14: POKE H,24: PRINT "COPYRIGHT 1988 BY MICROSPARC, INC."
  268. 2680  VTAB 16: POKE H,27: PRINT "* PRESS <RETURN> TO BEGIN *";
  269. 2690  POKE  -16368,0: WAIT  -16384,128: POKE  -16368,0
  270. 2700  RETURN 
  271. 2710  REM 
  272. 2720  REM ***ERROR TRAP***
  273. 2730  REM 
  274. 2740  POKE 216,0:EC =  PEEK(222):LN =  PEEK(218) + PEEK(219) *256: CALL 54915
  275. 2750  PRINT : VTAB 10
  276. 2760  IF EC = 4  THEN  PRINT "DISK IS WRITE-PROTECTED -- PLEASE REMOVE TAB FROM NOTCH ";: GOTO 2830
  277. 2770  IF EC = 8  THEN  PRINT "DISK I/O ERROR -- PLEASE CHECK DISK AND DRIVE ";: GOTO 2830
  278. 2780  IF EC = 9  THEN  PRINT "DISK IS FULL -- PLEASE INSERT A DIFFERENT DISK ";: GOTO 2830
  279. 2790  IF EC = 10  THEN  PRINT "FILE LOCKED -- PLEASE THINK OF A DIFFERENT FILE NAME ";: GOTO 2830
  280. 2800  IF EC = 11  THEN  PRINT "ILLEGAL FILE NAME -- PLEASE THINK OF A DIFFERENT NAME ";: GOTO 2830
  281. 2810  IF EC = 255  THEN  PRINT "<CTRL-C> IS NOT AN ACCEPTABLE KEYSTROKE -- PLEASE NOTE ";: GOTO 2830
  282. 2820  PRINT "ERROR #";EC;" HAS OCCURRED IN LINE ";LN;" -- PLEASE NOTE ";
  283. 2830  PRINT "AND HIT <RETURN> ->";
  284. 2840  GOSUB 170: IF A$ < > CHR$(13)  THEN  GOTO 2840
  285. 2850  PRINT : VTAB 10: PRINT LC$: ONERR  GOTO 2740
  286. 2860  GOTO 260
  287. 2870  GET A$: IF A$ < >"Y"  AND A$ < >"N"  AND A$ < >"y"  AND A$ < >"n"  THEN 2870
  288. 2880  RETURN