1 REM FONTFX 1.0C 6/12/86; Jay Holovacs 5 DEFINT A-Z:DIM CD(94,11):XCNR=190:YCNR=10:AC$=CHR$(28)+CHR$(29)+CHR$(30)+CHR$(31)+"FCSLDTKQMBE":ES$=CHR$(27):ZO$=CHR$(0):FL=0 6 FOR CHAR=0 TO 94:CD(CHAR,0)=139:NEXT CHAR 'DEFAULT PARAMETERS 7 ON ERROR GOTO 1600 10 CLS:PRINT@93,"* * FONTFX * *":PRINT:PRINT@161,"Typeface editor for Epson FX printers":PRINT @220," by Jay Holovacs":PRINT @295,". . hit any key";:R$=INPUT$(1) 20 GOSUB 1200:CLS 100 REM LOOP 105 GOSUB 950 110 R$=INKEY$:IF R$="" THEN 110 115 IF INSTR(1,AC$,R$) THEN 117 ELSE 110 117 ON INSTR(1,AC$,R$) GOTO 120,122,124,125,126,127,128,129,130,131,132,140,133,134,135 120 DIR=1:GOSUB 700:GOTO 110'RIGHT 122 DIR=-1:GOSUB 700:GOTO 110 'LEFT 124 DIR=-1:GOSUB 750:GOTO 110 'UP 125 DIR=1:GOSUB 750:GOTO 110 'DOWN 126 IF NE THEN 110 ELSE SW=1:GOSUB 500:GOSUB 800:FL=1:GOTO 110 'FILL BIT 127 IF NE THEN 110 ELSE SW=0:GOSUB 500:GOSUB 800:FL=1:GOTO 110 'CLEAR BIT 128 GOSUB 1100:GOTO 100 'SAVE 129 GOSUB 1200:GOTO 100 'LOAD 130 GOSUB 1300:GOTO 100 'DOWNLOAD 131 GOSUB 1400:GOTO 100 'TEST 132 GOSUB 1500:GOTO 100 'KLONE 133 GOSUB 1700:GOTO 110 'SHIFT CHAR 134 GOSUB 1550:GOTO 110 'BLANK A CHAR 135 GOSUB 900:GOTO 100 'EDIT MODE 140 CLOSE:CLS:IF FL THEN PRINT @40,"Data modified since last save":PRINT"QUIT (Y/N)?";:IF INPUT$(1)<>"Y" THEN 100 142 END 300 REM DRAW GRID--ENTRY/XCNR,YCNR 320 LINE(XCNR,YCNR)-(XC+34,YC+41),1,B 322 FOR X=5 TO 40 STEP 5:LINE(XC,X+YC)-(XC-3,X+YC):NEXT 325 FOR X=4 TO 33 STEP 3:LINE(X+XC,YC)-(X+XC,YC-3):NEXT 330 RETURN 400 REM DRAW PIXEL--ENTRY/LROW,LCOL,SW 405 FOR Q=0 TO 2:FOR Q1=0 TO 3:PSET(LCOL+Q,LROW+Q1,SW) 410 NEXT Q1,Q:RETURN 500 REM DRAW A PIXEL--ENTRY/SW,RCUR,CCUR 502 IF NE THEN RETURN 505 LROW=YCNR+1+5*(RCUR-1):LCOL=XCNR+1+3*(CCUR-1):GOSUB 400:RETURN 600 REM PLACE CURSOR MARKERS--ENTRY/SW,RCUR,CCUR=CURSOR LOCATION 620 LROW=YCNR-6:LCOL=XCNR+1+3*(CCUR-1):GOSUB 650:RETURN 'HORIZONTAL 630 LCOL=XCNR-5:LROW=YCNR+1+5*(RCUR-1):GOSUB 650:RETURN 'VERTICAL 650 REM DRAW CURSORS--ENTRY/LCOL,LROW 655 FOR Q=1 TO 2:FOR Q1=1 TO 2:PSET(LCOL+Q,LROW+Q1,SW) 660 NEXT Q1,Q:RETURN 700 REM LEFT/RIGHT SCROLL--ENTRY/DIR,CCUR 705 IF CCUR+DIR<1 OR CCUR+DIR>11 OR NE THEN RETURN 710 SW=0:GOSUB 620:CCUR=CCUR+DIR:SW=1:GOSUB 620:RETURN 750 REM UP/DOWN SCROLL--ENTRY/DIR,RCUR 755 IF RCUR+DIR<1 OR RCUR+DIR>8 OR NE THEN RETURN 760 SW=0:GOSUB 630:RCUR=RCUR+DIR:SW=1:GOSUB 630:RETURN 800 REM MODIFY A BIT IN ARRAY VALUE--ENTRY/SW,CHAR,RCUR,CCUR 805 IF SW THEN CD(CHAR,CCUR)=CD(CHAR,CCUR) OR 2^(8-RCUR) ELSE CD(CHAR,CCUR)=CD(CHAR,CCUR)AND NOT(2^(8-RCUR)) 810 RETURN 900 REM ACCEPT PARAMETERS 905 NE=0:SW=1:CLS:RCUR=1:CCUR=1:GOSUB 620:GOSUB 630:GOSUB 300 910 PRINT @5,"* *EDIT CHARACTER* *":CHAR=65:INPUT "ASCII (33-127)";CHAR:CHAR=CHAR-33:IF CHAR<0 OR CHAR>94 THEN 910 911 PRINT@55,CHAR+33 912 IF CD(CHAR,0)AND128 THEN PRINT @97,"N"; ELSE PRINT @97,"Y"; 913 R$="":PRINT@80,;:INPUT "DESCENDER (Y/N)";R$:IF R$<>"" THEN FL=1:IF R$<>"Y" THEN CD(CHAR,0)=CD(CHAR,0)OR 128 ELSE CD(CHAR,0)=CD(CHAR,0) AND 127 920 PRINT@137,(CD(CHAR,0)\16)AND7;:QQ=0:PRINT@120,;:INPUT "CHAR START (0-7)";QQ:IF QQ THEN PRINT@137,QQ:QQ=(QQAND7)*16:CD(CHAR,0)=(CD(CHAR,0)AND112)ORQQ:FL=1 930 PRINT@176,CD(CHAR,0)AND15; 935 QQ=12:PRINT@160,;:INPUT "CHAR END (5-11)";QQ:IF QQ<>12 THEN FL=1:CD(CHAR,0)=(CD(CHAR,0)AND240) OR QQ:PRINT @176,QQ 'ALLOW FOR DEFAULT ENTRY 940 GOSUB 1000:RCUR=1:CCUR=1:RETURN 950 PRINT @240,"F)ill C)lear S)ave B)lank E)dit":PRINT @280,"L)oad D)own T)est K)lone Q)uit M)ove";:RETURN 'COMMAND LINE 1000 REM DRAW A CHARACTER--ENTRY/CHAR 1005 SW=1:FOR RCUR=1 TO 8:MSK=2^(8-RCUR):FOR CCUR=1 TO 11 1010 IF CD(CHAR,CCUR) AND MSK THEN GOSUB 500 1015 NEXT CCUR,RCUR:RETURN 1050 PRINT". . hit [enter] to BYPASS":RETURN 1100 REM SAVE ROUTINE 1105 NE=1:F$="":CLS:PRINT" * *SAVE A SET OF CHARACTERS* *":PRINT@85,;:GOSUB 1050:PRINT @125,;:INPUT "SAVE FILE";F$:IF F$="" THEN 1199 1108 OPEN F$ FOR OUTPUT AS 1 ELSE RETURN 1109 PRINT@165,". . FILE BEING WRITTEN. ." 1110 FOR CHAR=0 TO 94:FOR CCUR=0 TO 11:PRINT #1,CD(CHAR,CCUR);" ";:NEXT CCUR,CHAR 1115 CLOSE:FL=0 1199 CLS:RETURN 1200 REM LOAD FILE 1205 NE=1:CLS:PRINT @5,"* *LOAD AN EXISTING FILE* *":IF FL THEN PRINT@40,"NOTE: Current Data has been modified":PRINT " since last SAVE" 1206 F$="":PRINT @125,;:GOSUB 1050:PRINT @165,;:INPUT "FILE TO LOAD";F$:IF F$<>"" THEN OPEN F$ FOR INPUT AS 1 ELSE 1299 1208 PRINT @205,". .FILE BEING LOADED. ." 1210 FOR CHAR=0 TO 94:FOR CCUR=0 TO 11:INPUT #1,CD(CHAR,CCUR):NEXT CCUR,CHAR:CLOSE #1 1215 FL=0 1299 CLS:RETURN 1300 REM DOWNLOAD TO PRINTER 1305 NE=1:CLS:PRINT"* * DOWNLOAD TO PRINTER * *" 1307 IF(INP(187)AND6)<>2 THEN BEEP:PRINT" Printer not ready . . Hit any key";:R$=INPUT$(1):GOTO 1349 1310 GOSUB 1050:A1=0:A2=0:PRINT"ASCII RANGE:";:INPUT "from ";A1:INPUT " to ";A2:IF A1=0 OR A2=0 THEN 1349 1315 INPUT "LOAD STD CHAR SET FIRST";R$:IF INSTR(1,"Yy",R$) THEN LPRINT ES$;":";ZO$;ZO$;ZO$; 1318 PRINT "DOWNLOAD IN PROGRESS..." 1320 LPRINT ES$;"%";CHR$(1);ZO$;:LPRINT ES$;"&";ZO$;CHR$(A1);CHR$(A2); 1325 A1=A1-33:A2=A2-33:FOR CHAR=A1 TO A2:FOR CCUR=0 TO 11:LPRINT CHR$(CD(CHAR,CCUR));:NEXT CCUR,CHAR 1330 CLS:PRINT"DOWNLOAD COMPLETE":BEEP 1332 PRINT" TEST (Y/N)?";:IF INPUT$(1)="Y" THEN GOSUB 1400 1349 CLS:RETURN 1400 REM TEST CHARACTERS 1405 NE=1:CLS:TS$="":PRINT "* *TEST CHARACTERS* *":IF(INP(187)AND6)<>2 THEN BEEP:PRINT" Printer not ready . . Hit any key";:R$=INPUT$(1):GOTO 1449 1415 GOSUB 1050:LINE INPUT "STRING TO PRINT:";TS$:IF TS$=""THEN 1449 1420 INPUT "PROPORTIONAL MODE";R$:LPRINT ES$;"p";:IF INSTR(1,"Yy",R$) THEN LPRINT CHR$(49); ELSE LPRINT CHR$(48); 1425 LPRINT TS$ 1449 CLS:RETURN 1500 REM KLONE A CHARACTER 1505 NE=1:CLS:PRINT " * * COPY A CHARACTER * *":GOSUB 1050:A1=0:A2=0:INPUT "SOURCE ASCII";A1:INPUT "DEST ASCII";A2:IF A1=0 OR A2=0 THEN 1549 1508 PRINT "OK? (Y/N)";:IF INPUT$(1)<>"Y" THEN PRINT". . CANCELLED. .":RETURN 1510 A1=A1-33:A2=A2-33:FOR QQ=0 TO 11:CD(A2,QQ)=CD(A1,QQ):NEXT QQ:RETURN 1549 CLS:RETURN 1550 REM BLANK A CHARACTER--ENTRY/CHAR 1552 IF NE THEN RETURN 1555 FOR CCUR=1 TO 11:CD(CHAR,CCUR)=0:NEXT:GOSUB 1790:FL=1:RETURN 1600 REM ERROR HANDLING 1605 IF ERR=7 AND ERL=1110 THEN BEEP:PRINT".. MEMORY OVERFLOW. .HIT ANY KEY" ELSE 1610 1606 IF INSTR(1,F$,".DO")=0 THEN F$=F$+".DO" 1608 INPUT$(1):KILL F$:RESUME 100 'GOSUB STACK IS LOST ON MEMORY ERROR 1610 IF ERR=9 OR (ERR=5 AND (ERL=1325 OR ERL=1510)) THEN BEEP:PRINT "BAD INPUT VALUE . . hit any key":R$=INPUT$(1):RESUME 1549 1615 IF ERL<>1110 AND ERL<>1108 THEN 1625 ELSE IF ERR>58 THEN PRINT". .DISK ERROR" 1616 IF ERR=64 THEN PRINT ". .DISK FULL" 1617 IF ERR=63 THEN PRINT". .DISK WRITE PROTECTED" 1619 IF ERR=59 THEN PRINT". .DRIVE NOT READY" 1620 BEEP:PRINT ". . hit any key":R$=INPUT$(1):RESUME 1115 1625 IF ERL<>1206 THEN 1690 1627 IF ERR=52 THEN BEEP:PRINT". .FILE NOT FOUND" 1628 IF ERR=59 THEN PRINT ". .DRIVE NOT READY" 1629 BEEP:PRINT "FILE ERROR. . .HIT ANY KEY":R$=INPUT$(1):RESUME 1215 1690 PRINT "ERR:";ERR;" IN LINE:";ERL:STOP 1692 RESUME NEXT 1700 REM SHIFT CONTROLLER--ENTRY/CHAR=CURRENT ASCII 1704 IF NE THEN RETURN ELSE PRINT @200,"R/L/U/D/[enter]?";:R$=INPUT$(1):GOSUB 1790:FL=1 1705 ON INSTR(1,CHR$(13)+"RDUL",R$) GOSUB 1715,1720,1730,1740,1750 1710 PRINT@200," ";:GOSUB 1000:RCUR=1:CCUR=1:RETURN 1715 RETURN 1720 FOR QQ=10 TO 1 STEP -1:CD(CHAR,QQ+1)=CD(CHAR,QQ):NEXT QQ:CD(CHAR,1)=0:RETURN 'RIGHT SHIFT 1730 FOR QQ=1 TO 11:CD(CHAR,QQ)=CD(CHAR,QQ)\2:NEXT QQ:RETURN 'SHIFT DOWN 1740 FOR QQ=1 TO 11:CD(CHAR,QQ)=(CD(CHAR,QQ)*2)AND 255:NEXT QQ:RETURN 'SHIFT UP 1750 FOR QQ=2 TO 11:CD(CHAR,QQ-1)=CD(CHAR,QQ):NEXT QQ:CD(CHAR,11)=0:RETURN 'LEFT SHIFT 1790 FOR QQ=31 TO 271 STEP 40:PRINT @QQ," ";:NEXT QQ:GOSUB 300:RCUR=1:CCUR=1:SW=1:GOSUB 620:GOSUB 630:RETURN 'DRAW NEW GRID