GET "FED.DEFS"
LET READFONT() BE //READ INTO CURRENT FONT
[
LET V = VEC 50
WS("*NINPUT FONT FILE: ")
IF NOT GETKEYST(V) THEN RETURN
LET STR = OPENAFILE(V,0)
IF STR EQ 0 THEN [ WS("*NNO SUCH FILE !"); RETURN ]
LET WORDX = FONT-2
UNTIL ENDOFS(STR) DO
[
RV WORDX = GETS(STR);WORDX = WORDX + 1
]
WS (FORMATN("*N <D> WORDS",WORDX-FONT+2))
CLOSEAFILE(STR)
]
AND WRITEFONT() BE
[
LET V = VEC 50
WS("*NOUTPUT FONT FILE: ")
IF NOT GETKEYST(V) THEN RETURN
LET STR = GETAFILE(V,1)
GETHW()
LET MAXWORD = GETLAST()
FOR I= FONT-2 TO MAXWORD DO PUTS(STR,RV I)
CLOSEAFILE(STR)
]
AND GETHW() BE
[
RV(FONT-1)=0 //WIDTH
RV(FONT-2)=0 //HEIGHT
FOR I=0 TO 377B DO
[
LET W = GETHWX(I)
IF W GR RV(FONT-1) THEN RV(FONT-1)=W
]
]
AND GETHWX(CHAR) = VALOF
[
LET P = FONT+CHAR+FONT!CHAR
LET HGT = (RV (P+1) RSHIFT 8) + (RV(P+1) & 177B)
IF HGT GR RV(FONT-2) THEN RV(FONT-2) = HGT
IF ((RV P) & 1) NE 0 THEN RESULTIS (RV P) RSHIFT 1
RESULTIS 16+ GETHWX(RV P RSHIFT 1)
]
AND CUOUT() BE //OUTPUT IN CU FORMAT,MAGNIFIED 7 TIMES
[
LET V = VEC 50
WS("*N.CU FORMAT OUTPUT FILE: ")
IF NOT GETKEYST(V) THEN RETURN
LET STR = GETAFILE(V,1)
GETHW() //SET HEIGHT AND WIDTH
PUTS(STR, BOXSIZE*RV(FONT-2)) //OUTPUT HEIGHT IN BITS
LET WORDW = (BOXSIZE*RV(FONT-1))/16 +1
PUTS(STR, WORDW) //WIDTH IN WORDS
GAP = 0
FOR I = 0 TO 377B DO
[
LET P = FONT+I+FONT!I
//DUMMY CHARACTER (0 WIDTH) DO NOT PUT OUT
IF RV (P) EQ 1 THEN LOOP
IF ((RV(P) & 1) EQ 1) & ((RV(P+1) & #477) EQ 0) THEN LOOP
//PUT THE CHARACTER ONTO THE SCREEN, FROM WHICH IT WILL BE OUTPUT
BSTORE(FARRAY,0,FHMAX*FWMAX)
FCHEIGHT = 0
FCWIDTH = COPYCH(I,FARRAY)
BUILDCHAR()
//NOW WE HAVE THE CHARACTER IN FARRAY AND IN THE DISPLAY AREA
PUTS(STR,I) //OUTPUT THE CHARACTER CODE
PUTS(STR,FCWIDTH*BOXSIZE) //WIDTH OF THIS CHARACTER IN BITS
FOR J = 0 TO BOXSIZE*RV(FONT-2)-1 DO //FOR ALL SCAN LINES
[
LET OFFS = DISPLAYAREA+(CTOPMARGIN+J)*NWRDS + LWMARGIN
FOR K = 0 TO WORDW-1 DO
PUTS(STR,RV(OFFS+K))
]
]
GAP = 1
CLOSEAFILE(STR)
]
AND GETKEYST(V) = VALOF
[
V>>STR.LENGTH = 0
[
LET CHAR = GETCHAR()
SWITCHON CHAR INTO
[
CASE $*N: BREAK
CASE 33B: RESULTIS 0
CASE 10B: //BACKSPACE
IF V>>STR.LENGTH GR 0 DO
[
PUTS(DSP, $/)
PUTS(DSP, V>>STR.CHAR↑(V>>STR.LENGTH))
(V>>STR.LENGTH)= (V>>STR.LENGTH)-1
]
ENDCASE
DEFAULT: PUTS(DSP,CHAR)
V>>STR.LENGTH = V>>STR.LENGTH+1
V>>STR.CHAR↑(V>>STR.LENGTH) = CHAR
]
] REPEAT
RESULTIS V>>STR.LENGTH
]