1 REM *›2 REM * THE FERGEE FILE PRINTER›3 REM *›4 REM * BY›5 REM * DR. JOHN FERGUSON›6 REM ›10 REM * This program will print files created with BANK STREET WRITER and a number of other›11 REM * editors and word processors. It will translate symbols embedded in text as shown›12 REM * on the title page, and print out the file on a NEC 8023AC printer using its special›13 REM * characters and controls. For other printers, change control codes in lines›14 REM * 3515-3570 and 4340. The underline is set by ASCII codes 27 and 88 found in›15 REM * lines 5030 and 5040. It is cleared with ASCII codes 27 and 89 in line 5040. These›16 REM * may be substituted one for one with other codes if necessary.Change number of›17 REM * indent spaces by replacing the two 8's in line 5060. Change other defaults at 50.›18 REM ›30 GOTO 6000›35 GRAPHICS 0›40 DIM TOP$(10),NF$(1),PAUSE$(1),EM$(10),H$(75),FONT$(5),S$(30),FILE$(15),R$(1),TAB$(40),Z$(34)›44 MEM=16000›45 DIM T$(MEM),SPACE$(8),L$(150),A$(1),RJ$(203),N$(150),WCT$(27):RJ$(1)="":RJ$(203)="":RJ$(2)=RJ$›50 REM DEFAULTS›51 NO=1:MAR=8:LL=64:PG=1:TOP$="TOP (#.)":TOP=1:NF$="Y":PAUSE$="N":NUM=55:EM$="N":FONT$="PICA":H$="":S$=""›52 R$="Y":TAB$="050"›70 FOR N=0 TO 234:READ R:POKE 1536+N,R:NEXT N:REM TRANSLATE SRT›75 FOR N=0 TO 202:READ R:POKE ADR(RJ$)+N,R:NEXT N:REM RIGHT JUSTIFY SRT›76 FOR N=1 TO 34:READ R:Z$(N,N)=CHR$(R):NEXT N›77 FOR N=1 TO 27:READ R:WCT$(N,N)=CHR$(R):NEXT N:REM WORD COUNTER SRT›80 GRAPHICS 0›100 TRAP 40000:TRAP 1000:? "}":? "ENTER NUMBER TO CHANGE OR ÒÅÔÕÒÎ":F=0:POKE 1779,0:POKE 1780,0›105 ? :POKE 85,25:? "Default"›106 POKE 85,25:? " "›110 ? " 1. Line spacing- ";NO›120 ? " 2. Text lines per page- ";NUM›130 ? " 3. Left margin- ";MAR›140 ? " 4. Line length- ";LL›150 ? " 5. Start with page- ";PG›160 ? " 6. Page number, where- ";TOP$›170 ? " 7. Start at top- ";NF$›180 ? " 8. Pause between pages- ";PAUSE$›190 ? " 9. Emphasized print- ";EM$›200 ? "10. Right justified- ";R$›210 ? "11. Font type- ";FONT$›220 ? "12. Tabs set at- ";TAB$:? ›230 ? "13. Special codes: ";S$:? ›240 ? "14. Header: ";H$›250 ? :INPUT D›255 TRAP 100›260 ON D GOTO 270,300,330,350,360,380,430,440,460,465,470,600,650,700›270 IF NO=1 THEN NO=2:GOTO 100›271 IF NO=2 THEN NO=1:GOTO 100›300 ? "}":? :? "HOW MANY TEXT LINES PER PAGE?":? :? "(Normal value is 55)":? ›320 ? :? :INPUT NUM:GOTO 100›330 ? "}":? :? "ENTER # SPACES FOR LEFT MARGIN"›335 ? :INPUT MAR›340 GOTO 100›350 ? "}":? :? "ENTER LINE LENGTH (1-150)"›351 ? :? "Normal values:";:POKE 85,20:? "Pica 64"›352 POKE 85,20:? "Elite 78"›353 POKE 85,20:? "Proportional 100"›354 POKE 85,20:? "Condensed 118"›355 ? :? :INPUT LL:IF LL<1 OR LL>150 THEN 350›357 GOTO 100›360 ? "}":? :? "ENTER NUMBER FOR FIRST PAGE":? ›365 INPUT PG›370 GOTO 100›380 ? "}":? :? "DO YOU WANT PAGES NUMBERED AS:"›385 ? :? " (1) TOP #."›390 ? " (2) TOP Page #"›395 ? " (3) BOTTOM - # -"›400 ? " (4) NONE"›405 ? :INPUT D:ON D GOTO 410,415,420,425›410 TOP=1:TOP$="TOP (#.)":GOTO 100›415 TOP=2:TOP$="TOP (Page)":GOTO 100›420 TOP=3:TOP$="BOTTOM":GOTO 100›425 TOP=4:TOP$="NONE":GOTO 100›430 IF NF$="Y" THEN NF$="N":GOTO 100›431 IF NF$="N" THEN NF$="Y":GOTO 100›440 IF PAUSE$="Y" THEN PAUSE$="N":GOTO 100›441 IF PAUSE$="N" THEN PAUSE$="Y":GOTO 100›460 IF EM$="Y" THEN EM$="N":GOTO 100›461 IF EM$="N" THEN EM$="Y":GOTO 100›465 IF R$="Y" THEN R$="N":GOTO 100›466 IF R$="N" THEN R$="Y":GOTO 100›470 ? "}":? :? "ENTER FONT TYPE"›475 ? :? " (1) PICA"›480 ? " (2) ELITE"›485 ? " (3) PROPORTIONAL"›490 ? " (4) CONDENSED"›495 ? :INPUT D:ON D GOTO 500,505,510,515›500 FONT$="PICA":GOTO 100›505 FONT$="ELITE":GOTO 100›510 FONT$="PROP.":GOTO 100›515 FONT$="COND.":GOTO 100›600 ? "}":? :? "TABS NOW SET AT: ";TAB$›610 ? :? :? "To change, enter new tab positions as three digit numbers separated by commas.":? :? ›620 INPUT T$:IF T$="" THEN 100›630 TAB$=T$:GOTO 100›650 ? "}":? :? "ENTER SPECIAL PRINTER CODES":? :? "(Do not use spaces or punctuation)"›660 ? :? :INPUT S$:GOTO 100›700 ? "}":? :? "ENTER HEADER: ":? :INPUT H$:GOTO 100›1000 REM DISPLAY FILE LIST›1010 ? "}"›1015 TRAP 100›1020 CLOSE #2:OPEN #2,6,0,"D:*.*":CLOSE #1:OPEN #1,4,0,"K:"›1030 FOR X=1 TO 63:INPUT #2,L$›1040 POKE 85,1:IF L$(5,16)="FREE SECTORS" THEN 1080›1045 IF L$(11,13)="SYS" THEN X=X-1:GOTO 1070›1050 IF X/2=INT(X/2) THEN POKE 85,20:? " ";›1060 ? " ";CHR$(64+X);" ";L$(3,17);" ";:T$((X-1)*16+1,(X-1)*16+16)=L$›1070 NEXT X:GOTO 1030›1080 ? :? :? "TYPE LETTER OF FILE TO PRINT OR"›1085 ? "ÒÅÔÕÒÎ FOR MENU":? ›1090 GET #1,A:A=A-64:? CHR$(64+A)›1100 L$=T$((A-1)*16+3,(A-1)*16+13)›1110 FILE$="D:"›1120 FOR X=1 TO 8:IF L$(X,X)=" " THEN 1140›1130 FILE$(LEN(FILE$)+1)=L$(X,X)›1140 NEXT X›1150 FILE$(LEN(FILE$)+1)=".":FILE$(LEN(FILE$)+1)=L$(9,11)›2000 REM GET FILE›2010 NUMBER=(SECT-1)*125:NUMHI=INT(NUMBER/256):NUMLO=NUMBER-256*NUMHI›2060 T$=CHR$(0):T$(MEM)=CHR$(0):T$(2)=T$›2070 TRAP 40000:TRAP 2300›2075 CLOSE #1:CLOSE #2:OPEN #2,6,0,FILE$›2080 INPUT #2,L$:SECT=VAL(L$(14,17))›2085 CLOSE #2›2090 NUMBER=(SECT-1)*125:NUMHI=INT(NUMBER/256):NUMLO=NUMBER-256*NUMHI›2100 REM GET CIO›2110 IO=1:CLOSE #IO:OPEN #IO,4,0,FILE$›2120 IO=16*IO:TRAP 2200›2130 IOCB=832+IO:POKE IOCB+2,7›2140 ADRHI=INT(ADR(T$)/256)›2150 ADRLO=ADR(T$)-ADRHI*256›2160 POKE IOCB+4,ADRLO:POKE IOCB+5,ADRHI:POKE IOCB+8,NUMLO:POKE IOCB+9,NUMHI›2170 I=USR(ADR("hhhªLVä"),IO)›2180 FOR N=1 TO 128:GET #1,B:T$(NUMBER+N,NUMBER+N)=CHR$(B):NEXT N›2200 CLOSE #IO/16:T$=T$(1,NUMBER+N-1)›2210 IF T$(LEN(T$))<>CHR$(155) THEN T$(LEN(T$)+1)=CHR$(155)›2220 GOTO 3000›2300 TRAP 40000:CLOSE #IO:? :? "ý CANNOT LOAD FILE!":FOR N=1 TO 300:NEXT N:GOTO 2000›3000 ? "}":? :? :? "PRESS: ÐRINT FILE (PRINTER ON?)"›3010 ? :? " ÖIEW OR EDIT FILE"›3020 ? :? " ÍENU"›3030 POKE 764,255›3040 IF PEEK(764)=10 THEN 3500›3050 IF PEEK(764)=16 THEN 7000›3060 IF PEEK(764)=37 THEN 100›3070 GOTO 3040›3500 REM SET PRINTER CONFIGURATION›3505 TRAP 40000:TRAP 4500:F=0›3510 CLOSE #2:OPEN #2,8,0,"P:"›3515 IF FONT$="PICA" THEN ? #2;"N";:REM SET FONT›3520 IF FONT$="ELITE" THEN ? #2;"E";›3525 IF FONT$="PROP." THEN ? #2;"P";›3530 IF FONT$="COND." THEN ? #2;"Q";›3540 ? #2;"L";:IF MAR<100 THEN ? #2;"0";:REM SET MARGIN›3545 IF MAR<10 THEN ? #2;"0";›3550 ? #2;MAR;›3560 IF EM$="Y" THEN ? #2;"!";:REM SET ENHANCED MODE›3570 N$="(":N$(LEN(N$)+1)=TAB$:N$(LEN(N$)+1)=".":? #2;N$;:REM SET TABS›3580 ? #2;S$;:REM SPECIAL CODES›3590 POKE 1787,0:POKE 1789,LL+1›3600 PGS=PG:IF NF$="N" THEN 4110›3610 LINES=0›4000 REM TRANSLATE SECTION›4020 IF PGS=1 THEN ? #2:GOTO 4080›4030 ? #2;H$;:REM HEADER›4040 IF TOP>2 THEN ? #2:GOTO 4080›4050 FOR N=1 TO LL-LEN(H$)-2:? #2;" ";:NEXT N›4060 IF TOP=1 THEN ? #2;PGS;"."›4070 IF TOP=2 THEN ? #2;"Page ";PGS›4080 ? #2:? #2:REM TOP SPACE›4110 E=LEN(T$)›4120 L$="":L$(150)="":L$(2)=L$›4125 N$=" ":N$(150)=" ":N$(2)=N$›4130 USED=PEEK(1787):F=F+USED:LIMIT=E-F:IF LIMIT>255 THEN LIMIT=255›4135 IF PEEK(1791)0 THEN FOR N=1 TO PEEK(1790):? #2;" ";:NEXT N›4240 IF PEEK(1787)<1 THEN POKE 1787,1›4250 IF R$<>"Y" THEN 4280›4260 IF PEEK(1782)=0 THEN ? #2:GOTO 4310›4270 ? #2;L$(1,PEEK(1782)):GOTO 4310›4280 IF PEEK(1788)<1 THEN ? #2:GOTO 4130›4285 IF L$=" " THEN ? #2:GOTO 4130›4300 ? #2;L$(1,PEEK(1788))›4310 IF NO=2 THEN ? #2:LINES=LINES+1:REM LINE SPACING›4320 LINES=LINES+1›4325 IF LINES = CLEAR UNDERLINE"›6120 POKE 85,9:? "] = ATARI CHARACTER"›6130 POKE 85,9:? "[ = CTRL CHARACTER"›6140 POKE 85,9:? "^ = ATARI CTRL CHARACTER"›6150 POKE 85,9:? "\ = ESCAPE"›6200 GOTO 40›7000 REM VIEW FILE ROUTINE›7010 CLOSE #1:OPEN #1,12,0,"S:"›7020 B=1:F=0:G=0›7030 TRAP 40000:REM TRAP 7000›7040 ? "}";"PRESS: ÕP, ÄOWN, ÂEGINNING, ÅND,"›7050 ? " ÃHANGE, ÐRINT, ÍENU"›7055 ? "":? ›7060 POKE 764,255›7070 GOTO 8000›7080 IF PEEK(764)=58 AND LEN(T$)-B>500 THEN B=F:GOTO 7040›7090 IF PEEK(764)=11 THEN B=B-G:GOTO 7040›7100 IF PEEK(764)=21 THEN 7020›7110 IF PEEK(764)=42 THEN B=INT(LEN(T$)/500)*500:GOTO 7040›7120 IF PEEK(764)=18 THEN 7500›7130 IF PEEK(764)=10 THEN 3500›7140 IF PEEK(764)=37 THEN POKE 764,255:GOTO 100›7150 GOTO 7080›7500 REM EDIT PRINT FILE ROUTINE›7510 ? "}";"MOVE CURSOR AND SET: ÂEGINNING, ÅND"›7520 ? "OR: ÁBORT (NOTE: EOL = )"›7525 ? "":? :? :X=3:Y=18:IF B<1 THEN B=1›7530 TRAP 7540:FOR N=B TO B+531:IF ASC(T$(N,N))=155 THEN ? " ";:NEXT N›7535 ? T$(N,N);:NEXT N›7540 POKE 764,255:POSITION X,Y:? "";›7550 IF PEEK(764)=135 THEN X=X+1:GOTO 7620›7560 IF PEEK(764)=134 THEN X=X-1:GOTO 7620›7570 IF PEEK(764)=142 THEN Y=Y-1:GOTO 7620›7580 IF PEEK(764)=143 THEN Y=Y+1:GOTO 7620›7590 IF PEEK(764)=21 THEN 7700›7600 IF PEEK(764)=42 THEN 7800›7610 IF PEEK(764)=63 THEN 7000›7615 GOTO 7550›7620 IF X>38 THEN X=1›7630 IF X<1 THEN X=38›7640 IF Y>23 THEN Y=0›7650 IF Y<0 THEN Y=23›7660 GOTO 7540›7700 B=B+((Y-4)*38)+X-3:T$=T$(B,LEN(T$)):GOTO 7000›7800 B=B+((Y-4)*38)+X-3:T$=T$(1,B):GOTO 7000›8000 POKE 1787,0:POKE 1789,38›8010 IF B<2 THEN B=0:GOTO 8030›8020 IF T$(B,B)<>" " THEN B=B-1:GOTO 8020›8030 E=LEN(T$):F=B:G=0›8040 FOR M=1 TO 16›8050 L$="":L$(80)="":L$(2)=L$›8060 USED=PEEK(1787):F=F+USED:G=G+USED:LIMIT=E-F:IF LIMIT>255 THEN LIMIT=255›8070 IF LIMIT<0 THEN 7080›8080 POKE 1791,LIMIT›8090 X=USR(ADR(Z$),ADR(T$)+F,ADR(L$))›8100 X=USR(1536)›8110 IF PEEK(1782)=0 THEN ? ›8120 IF PEEK(1788)=0 THEN ? :GOTO 8140›8125 IF PEEK(1790)>0 THEN FOR NN=1 TO PEEK(1790):? " ";:NEXT NN›8130 ? L$(1,PEEK(1788))›8140 NEXT M›8150 GOTO 7080›