10 REM >Printer 1.31 EPSON M80
   20 REM (C)J.G.Harston
   30 REM B/B+/E/M/C/A/T
   40 :
   50 MODE&83:IF HIMEM-TOP>5000 MODE&80
   60 :
   70 REM Settings for EPSON compatible printers
   80 REM xxxx0$ is to turn an effect off, xxxx1$ is to turn it on
   90 reset$=CHR$27+CHR$64                        :REM reset printer, LF=>CR+LF
  100 nlq0$=CHR$27+"x0":nlq1$=CHR$27+"x1"         :REM NLQ off/on
  110 bold0$=CHR$27+"F":bold1$=CHR$27+"E"         :REM bold off/on
  120 comp0$=CHR$18:comp1$=CHR$15                 :REM compressed off/on
  130 doubl0$=CHR$27+"H":doubl1$=CHR$27+"G"       :REM double strike off/on
  140 super0$=CHR$27+"T":super1$=CHR$27+"S0"      :REM superscript off/on
  150 sub0$=CHR$27+"T":sub1$=CHR$27+"S1"          :REM subscript off/on
  160 wide0$=CHR$20:wide1$=CHR$14
  170 high0$=CHR$27+"w0":high1$=CHR$27+"w1"       :REM d/high off/on
  180 dwi0$=CHR$27+"h0":dwi1$=CHR$27+"h1"         :REM d/high&wide off/on
  190 quad0$=CHR$27+"h0":quad1$=CHR$27+"h2"       :REM quad off/on
  200 ital0$=CHR$27+"5":ital1$=CHR$27+"4"         :REM italics off/on
  210 iFlg%=FALSE                                 :REM Use codes/Add 128 for italics
  220 charsel$=CHR$27+"R"                         :REM char set selection
  230 USchar$=charsel$+CHR$0                      :REM select US chars
  240 UKchar$=charsel$+CHR$3                      :REM select UK chars
  250 pound$=UKchar$+"#"+USchar$:Ipound$=UKchar$+CHR$(35+128)+USchar$
  260 under0$=CHR$27+"-0":under1$=CHR$27+"-1"     :REM underline off/on
  270 font0$=""                                   :REM Font 0
  280 font1$=""                                   :REM Font 1
  290 font2$=""                                   :REM Font 2
  300 font3$=""                                   :REM Font 3
  310 lf%=0                                       :REM change this to lf%=1 if
  320                                             :REM your printer doesn't do
  330                                             :REM automatic LF after CR
  340 :
  350 high%=TRUE:prn%=FALSE:reset%=TRUE:pl%=66:l%=60:ff%=TRUE:ffl%=FALSE
  360 rr%=82:ds%=1:nlq%=FALSE:pound%=TRUE:pound2%=TRUE:code%=FALSE:op%=TRUE
  370 eol$=LEFT$(CHR$13+CHR$10,lf%+1)
  380 :
  390 ON ERROR IF FNerr END
  400 C%=0:under%=0:bold%=0:REPEAT:*.
  410   PRINT"Press SHIFT-Escape to exit."
  420   REPEAT:REPEAT:IF ADVAL(-4)<63 PRINT;63-ADVAL(-4);" bytes in printer buffer. ";ADVAL(-4);" bytes free."
  430       INPUTLINE"File: "F$:IF LEFT$(F$,1)="*" OSCLIF$
  440     UNTIL(LEFT$(F$,1)<>"*" AND F$<>"")
  450     C%=OPENIN(F$):IF C%=0 PRINT"Can't open '"F$"'"'
  460   UNTILC%<>0:prn%=FNyn("Printer",prn%)
  470   REPEAT:INPUT"First page (1) "sp%
  480     INPUT"Last page (255) "ep%:IF ep%<1 ep%=255
  490   UNTILep%>=sp%
  500   IFop% PROCoptions:op%=FALSE ELSE IFFNyn("Change options",FALSEPROCoptions
  510   CLS:IF prn% VDU2:IF reset% PROCprn(reset$)
  520   IFprn% PROCprn(USchar$)
  530   IFprn% ANDnlq% PROCprn(nlq1$)
  540   IFcode% VDU23,128,0,0,8,4,254,4,8,0,23,129,0,0,&F8,8,&2A,&1C,8,0
  550   IFsp%>1 VDU3
  560   line%=0:page%=0:it%=0:REPEAT B%=BGET#C%
  570     IF B%>31 AND B%<127 AND B%<>96 VDUB%+it% ELSE PROCchar(B%)
  580     IF(B%=32 AND POS>rr%)OR(POS>78 AND rr%<80) PROCchar(13)
  590     IFline%=l% ANDep% ANDpage%=ep%-1 VDU3
  600     IFline%=l% MOVE 0,32:DRAW 1279,32:PROCcls:line%=0:page%=page%+1:IFsp%ANDpage%=sp%-1 CLS:PRINT"Printing from page ";sp%:VDU2:sp%=0
  610   UNTILEOF#C%:CLOSE#C%:C%=0
  620   IFprn% PROCcls:VDU3
  630   IFline%=0 line%=l%:page%=page%-1
  640   PRINT'"'"+F$+"' printed. ";page%+1;" pages with ";line%;" lines on the last page."
  650 UNTIL0
  660 DEFPROCoptions
  670 high%=FNyn("Use VIEW highlight 2 as escape char",high%)
  680 IFprn% reset%=FNyn("Reset printer",reset%)
  690 REPEAT:PRINT"Printer page length (";pl%;:INPUT") "pl2%:IF pl2%<>0 pl%=pl2%
  700   IFpl%<40 PRINT"Too short"
  710 UNTILpl%>39
  720 REPEAT:PRINT"Text page length (";l%;:INPUT") "l2%:IF l2%<>0 l%=l2%
  730   IFl%<4 PRINT"Too short"
  740 UNTILl%>3
  750 ff%=FNyn("Force FF at end of page",ff%)
  760 IF NOTff% AND l%<>pl% ffl%=FNyn("Send LFs to advance to next page",ffl%)
  770 INPUT"Lefthand margin (RETURN for non, 79=max): "ll%:IF ll%>30 ll%=0
  780 INPUT"Righthand margin (RETURN for non, 79=max): "rr%:IF rr%<30 rr%=82
  790 PRINT"Line spacing (";ds%;:INPUT") "ds2%:IF ds2%<>0 ds%=ds2%
  800 nlq%=FNyn("Set NLQ",nlq%)
  810 pound%=FNyn("Convert CHR$96 (`) into pound symbols",pound%)
  820 pound2%=FNyn("Convert CHR$163 (£) into pound symbols",pound2%)
  830 code%=FNyn("Show codes",code%)
  840 ENDPROC
  850 DEFPROCchar(B%):z%=0:IF B%=221 B%=9
  860 IFB%=10:B%=13
  870 IFB%=13 ANDcode%:PROCvdu(CHR$129+CHR$8)
  880 IFB%=13 ANDprn%:PROCprn(eol$)
  890 IFB%=13 ANDprn% ANDds%>1:FORz%=1 TO ds%:PROCprn(eol$):NEXT
  900 IFB%=13:line%=line%+1:PROCvdu(CHR$13+CHR$10):ENDPROC
  910 IFB%=12 ANDprn%:PROCcls:line%=l%:ENDPROC
  920 IFB%=12 line%=l%:ENDPROC
  930 IFB%=9 ANDcode%:PROCvdu(CHR$128+CHR$8)
  940 IFB%=9 ANDprn%=0:PRINTSTRING$(8-((POS+1) MOD 8),CHR$9);:ENDPROC
  950 IFB%=9:PRINTSPC(8-((POS+1) MOD 8));:ENDPROC
  960 IFB%=&1C ANDprn% ANDunder%=0:PROCprn(under1$):under%=under%EOR 1:ENDPROC
  970 IFB%=&1C ANDprn% ANDunder%=1:PROCprn(under0$):under%=under%EOR 1:ENDPROC
  980 IFB%=&1D ANDhigh% PROCmark2:ENDPROC
  990 IFB%=&1D ANDprn% ANDbold%=0:PROCprn(bold1$):bold%=bold%EOR 1:ENDPROC
 1000 IFB%=&1D ANDprn% ANDbold%=1:PROCprn(bold0$):bold%=bold%EOR 1:ENDPROC
 1010 IFprn%ANDiFlg%IF(B%=96 ANDpound%)OR(B%=163 ANDpound2%):PROCprn(Ipound$):ENDPROC
 1020 IFprn%IF(B%=96 ANDpound%)OR(B%=163 ANDpound2%):PROCprn(pound$):ENDPROC
 1030 IFB%=96 OR B%=163:VDUB%+it%:ENDPROC
 1040 IFB%=&1A AND(code%=0 ORprn%):VDU32:ENDPROC
 1050 IFB%=&1A ANDcode%:PROCvdu(CHR$130):ENDPROC
 1060 IFB%>159 ANDcode% ANDprn%=0:VDU9,8:COLOUR129:COLOUR0:VDUB-128:COLOUR1:COLOUR128:ENDPROC
 1070 IFB%>126 ANDcode% ANDprn%=0:VDU9,9,9,9,9,8,8,8,8,8:COLOUR129:COLOUR0:PRINT"[";B;"]";:COLOUR1:COLOUR128:ENDPROC
 1080 IFprn%=0:VDU9,9,8,8:COLOUR129:COLOUR0:VDU94,B%+64:COLOUR1:COLOUR128:ENDPROC
 1090 ENDPROC
 1100 DEFPROCcls
 1110 IFpl%<l% ENDPROC
 1120 IFff% PROCprn(CHR$12):ENDPROC
 1130 IFlf% FORz%=line% TO pl%-1:PROCprn(CHR$10):NEXT
 1140 ENDPROC
 1150 DEFPROCmark2:B$=CHR$BGET#C%:IFprn%=0 ENDPROC
 1160 IFB$="!":PROCprn(13):REPEATz%=BGET#C%:UNTILz%=13 ORz%=10:ENDPROC
 1170 IFB$="B":PROCprn(bold1$):ENDPROC
 1180 IFB$="b":PROCprn(bold0$):ENDPROC
 1190 IFB$="C":PROCprn(comp1$):ENDPROC
 1200 IFB$="c":PROCprn(comp0$):ENDPROC
 1210 IFB$="D":PROCprn(doubl1$):ENDPROC
 1220 IFB$="d":PROCprn(doubl0$):ENDPROC
 1230 IFB$="I" ANDiFlg%:it%=128:ENDPROC
 1240 IFB$="i" ANDiFlg%:it%=0:ENDPROC
 1250 IFB$="I":PROCprn(ital1$):ENDPROC
 1260 IFB$="i":PROCprn(ital0$):ENDPROC
 1270 IFB$="N":PROCprn(nlq1$):ENDPROC
 1280 IFB$="n":PROCprn(nlq0$):ENDPROC
 1290 IFB$="Q":PROCprn(quad1$):ENDPROC
 1300 IFB$="q":PROCprn(quad0$):ENDPROC
 1310 IFB$="S":PROCprn(super1$):ENDPROC
 1320 IFB$="s":PROCprn(super0$):ENDPROC
 1330 IFB$="T":PROCprn(high1$):ENDPROC
 1340 IFB$="t":PROCprn(high0$):ENDPROC
 1350 IFB$="W":PROCprn(wide1$):ENDPROC
 1360 IFB$="w":PROCprn(wide0$):ENDPROC
 1370 IFB$="X":PROCprn(dwi1$):ENDPROC
 1380 IFB$="x":PROCprn(dwi0$):ENDPROC
 1390 IFB$="Y":PROCprn(sub1$):ENDPROC
 1400 IFB$="y":PROCprn(sub0$):ENDPROC
 1410 REM Upper case to set, lower case to release.
 1420 REM Eg:  This is *BBold*b and this is *Iin italics*i.
 1430 REM Highlight 1 does underlining as usual.
 1440 IFB$="0":PROCprn(font0$):ENDPROC
 1450 IFB$="1":PROCprn(font1$):ENDPROC
 1460 IFB$="2":PROCprn(font2$):ENDPROC
 1470 IFB$="3":PROCprn(font3$):ENDPROC
 1480 ENDPROC
 1490 DEFFNerr:PRINT:VDU3:COLOUR1:COLOUR128:REPORT:IFC%:A%=C%:C%=0:CLOSE#A%
 1500 PRINT:=ERR=17 AND INKEY-1
 1510 DEFPROCvdu(A$):*FX3,4
 1520 PRINTA$;:*FX3
 1530 ENDPROC
 1540 DEFPROCprn(A$):LOCAL z%
 1550 FOR z%=1 TO LEN A$:VDU1,ASCMID$(A$,z%,1):NEXT
 1560 ENDPROC
 1570 DEFFNyn(A$,F%):LOCAL K%:PRINTA$;"? (";CHR$(78-11*F%);") ";
 1580 REPEAT:K%=GET AND&DF:UNTILK%=89 OR K%=78 OR K%=F% OR K%=13:PRINTSTRING$(4,CHR$8);:IF K%=13 K%=78-11*F%
 1590 IF K%=78 PRINT"No ":=FALSE
 1600 IF K%=89 PRINT"Yes":=TRUE
 1610 PRINTCHR$K%;"  ":=K%