GET "FED.DEFS" STATIC [ GAP = 1 //GAP BETWEEN BOXES IN FEDIT EXTENSIONCOUNT FCWIDTH FCHEIGHT LOCKXPOINT LOCKYPOINT FARRAY CLMARGIN = LWMARGIN*16 //MUST BE ON A WORD BOUNDARY TO OUTPUT CU FORMAT CTOPMARGIN = 50 ] LET FEDIT() BE [ DCB!3= OLINES/2; DCB!0 = S420; BSTORE(DISPLAYAREA,0,NWRDS*LINES) FARRAY = DISPLAYAREA+OLINES*NWRDS //SET UP A SEPARATE DCB FOR FARRAY LET SDCB = VEC 6 IF (SDCB & 1) NE 0 THEN SDCB = SDCB+1 SDCB!0 = S420 //SYSTEM DISPLAY AREA SDCB!1 = 1400B + FWMAX //TAB 3 SDCB!2 = FARRAY SDCB!3 = FHMAX/2 DCB!3 = (OLINES-FHMAX)/2 DCB!0 = SDCB //HOOK UP BIG AREA,FARRAY,SYS ARRAY //DRAW BOUNDARIES CLMARGIN = CLMARGIN - BOXSIZE //TEMPORARILY OFFSET ORIGIN CTOPMARGIN = CTOPMARGIN - BOXSIZE FOR I = 0 TO (FWMAX*16)+1 DO [ SETBOX(I,0,TRUE) //TOP AND BOTTOM SETBOX(I,FHMAX+1,TRUE) ] FOR I = 0 TO FHMAX+1 DO [ SETBOX(0,I,TRUE) SETBOX ((FWMAX*16)+1,I,TRUE) //SIDES ] CLMARGIN = CLMARGIN+BOXSIZE CTOPMARGIN = CTOPMARGIN+BOXSIZE WS("*NFONT 3*N!");CURRENTFONT = 3; FONT = FONTVEC!CURRENTFONT [ //TRACK MOUSE AND ADD OR DELETE BITS IF RV 424B GR NWRDS*16 THEN RV 424B = NWRDS*16 IF RV 424B LS 0 THEN RV 424B = 0 IF RV 425B GR OLINES THEN RV 425B = OLINES IF RV 425B LS 0 THEN RV 425B = 0 RV 426B = RV 424B RV 427B = RV 425B LET X = (RV 424B)-CLMARGIN+2 LET Y = (RV 425B)-CTOPMARGIN+2 X = X LS 0? 0,X/BOXSIZE Y = Y LS 0? 0,Y/BOXSIZE X = X LS (FWMAX*16)? X,(FWMAX*16)-1 Y = Y LS FHMAX? Y, FHMAX -1 SWITCHON ((RV 177030B) & 7) INTO [ CASE 0: CASE 1: CASE 2: CASE 3: SETBOX(X,Y,TRUE);SETARRAY(FARRAY,X,Y,TRUE); ENDCASE CASE 5: TRANSLATECHAR(X, Y); ENDCASE CASE 6: SETBOX(X,Y,FALSE);SETARRAY(FARRAY,X,Y,FALSE);ENDCASE ] IF ENDOFS(KEYS) THEN LOOP LET CHAR = GETCHAR() SWITCHON CHAR INTO [ CASE 33B: WS("*NCONFIRM WITH CR TO QUIT"); IF GETCHAR() EQ $*N THEN [ RV MOUSELINK = TRUE; FINISH ] ENDCASE; CASE 3: CUOUT();ENDCASE //.CU FORMAT OUTPUT CASE 20B: //CONTROL P- PUTBACK IN FONT PUTITBACK();ENDCASE CASE 6: //CONTROL F. CHANGE FONT CURRENTFONT = GETCHAR()&3 WS("FONT ");PUTS(DSP,60B+CURRENTFONT) FONT = FONTVEC!CURRENTFONT ENDCASE; CASE 11B: //CONTROL I. INPUTFONT READFONT();ENDCASE CASE 17B: //CONTROL O. OUTPUTFONT WRITEFONT();ENDCASE CASE 23B: //CONTROL S - SHOW CHARACTER SHOWCHAR(GETCHAR()) ENDCASE CASE 27B: //CONTROL W - SETCHARWIDTH SETCHARWIDTH() ENDCASE CASE 4: //CONTROL D- DISPLAY ALL CHARACTERS FOR I = 0 TO 377B DO [ SHOWCHAR(I); IF GETCHAR() NE $*S THEN BREAK ] ENDCASE DEFAULT: ENDCASE ] WS("*N!") ] REPEAT ] AND SHOWCHAR(CHAR) BE [ EXTENSIONCOUNT = 0 BSTORE(FARRAY,0,FWMAX*FHMAX) FCHEIGHT = 0 FCWIDTH = COPYCH(CHAR,FARRAY) BUILDCHAR() SETTICK(FCWIDTH,TRUE) WS(FORMATN("*NCHARACTER IS <C> (<B>),TOTAL WIDTH = <D>, HEIGHT = <D>, <D> EXTENSIONS",CHAR,CHAR,FCWIDTH,FCHEIGHT,EXTENSIONCOUNT -1)) ] AND SETTICK(X,SC) BE [ LET V = VEC 6 V>>ITEM.XMIN = CLMARGIN + BOXSIZE*X - GAP V>>ITEM.YMIN = CTOPMARGIN-1 V>>ITEM.XMAX = CLMARGIN + BOXSIZE*X - GAP + 1 V>>ITEM.YMAX = CTOPMARGIN + FHMAX*BOXSIZE TEST SC IFSO SETBLOCK(V,0,0) IFNOT CLEARBLOCK(V) ] AND SETBOX(X,Y,SC) BE [ LET V = VEC 6 V>>ITEM.XMIN = CLMARGIN + (BOXSIZE*X) V>>ITEM.YMIN = CTOPMARGIN + (BOXSIZE*Y) V>>ITEM.XMAX = CLMARGIN + (BOXSIZE*(X+1)) -GAP V>>ITEM.YMAX = CTOPMARGIN + (BOXSIZE*(Y+1)) -GAP TEST SC IFSO SETBLOCK(V,0,0) IFNOT CLEARBLOCK(V) ] AND SETARRAY(ARRAY,X,Y,SC) BE [ LET INDEX = (FWMAX*Y) + (X/16) LET XBIT = 100000B RSHIFT (X REM 16) TEST SC IFSO ARRAY!INDEX = (ARRAY!INDEX) % XBIT IFNOT ARRAY!INDEX = (ARRAY!INDEX) & (NOT XBIT) ] //COPY A CHARACTER FROM THE CURRENT FONT INTO FARRAY. //RETURN THE WIDTH IN BITS AND COPYCH(CHAR,ARRAY) = VALOF [ LET P = FONT + CHAR P = P + RV P LET HD = ((RV (P+1)) RSHIFT 8 ) LET XH = (RV (P+1)) & 177B EXTENSIONCOUNT = EXTENSIONCOUNT + 1 FCHEIGHT = (HD+XH) GR FCHEIGHT? (HD+XH),FCHEIGHT FOR I = 0 TO XH+HD-1 DO RV(ARRAY+(FWMAX*I)) = (I GE HD)? RV(P-XH+I-HD),0 TEST ((RV P) &1) NE 0 IFSO RESULTIS ((RV P) RSHIFT 1) //NO EXTENSION IFNOT RESULTIS (16+ COPYCH((RV P) RSHIFT 1,ARRAY+1)) ] //BUILD A CHARACTER IN THE DISPLAY AREA FROM FARRAY AND BUILDCHAR() BE [ LET V = VEC 6 V>>ITEM.XMIN = CLMARGIN V>>ITEM.YMIN = CTOPMARGIN-1 V>>ITEM.XMAX = CLMARGIN + BOXSIZE*FWMAX*16 V>>ITEM.YMAX = CTOPMARGIN+ BOXSIZE*FHMAX CLEARBLOCK(V) FOR I = 0 TO FWMAX-1 DO [ FOR J = 0 TO FHMAX - 1 DO [ LET X = RV(FARRAY+(FWMAX*J)+I) IF X EQ 0 THEN LOOP LET K = 0 UNTIL X EQ 0 DO [ IF X LS 0 THEN SETBOX(16*I + K,J,TRUE) X = X LSHIFT 1 K = K+1 ] ] ] ] AND PUTITBACK() BE [ //FIRST INTERPRET FARRAY, AND VERIFY THAT ALL IS WELL WITH //THE USER LET FDVEC = VEC (3*FWMAX) LET WTMP = NIL LET EXTCOUNT = 0 FOR I = 0 TO FWMAX-1 DO [ LET P = FARRAY+I LET W = 0 LET D = 0 LET FIRST = 0 LET LAST = 0 FOR J = 0 TO FHMAX-1 DO [ IF (RV P) NE 0 THEN [ EXTCOUNT = I D = (D % (RV P)) IF FIRST EQ 0 THEN FIRST = P LAST = P] P = P+FWMAX ] FDVEC!(3*I) = FIRST EQ 0?0,(FIRST-FARRAY-I)/FWMAX //HD FDVEC!((3*I)+1) = FIRST EQ 0?0,1+(LAST-FIRST)/FWMAX //XH UNTIL D EQ 0 DO [ D=D LSHIFT 1; W=W+1 ] IF I*16 LS FCWIDTH-1 THEN [ EXTCOUNT = I IF FIRST EQ 0 THEN WTMP=16 IF (I+1)*16 GE FCWIDTH-1 THEN WTMP=(FCWIDTH-1)REM 16 ] FDVEC!((3*I)+2) = W GR WTMP? W, WTMP //WIDTH OF INK ] //DO THE JOB WS("*NTYPE CHARACTER TO BE REPLACED") LET CHAR = GETCHAR() LET GOTBACK = COMPACTFONT(CHAR) //FIND THE LAST POINTER (INCLUDING EXTENSIONS) LET LASTE = BIGGESTCHAR() //MOVE THE BITMAP SPACE UP BY THE NUMBER OF EXTENSIONS REQUIRED LET EFONT = GETLAST() //RETURNS END OF FONT + 1 FOR I = (EFONT-1) BY -1 TO (FONT+LASTE+1) DO RV(I+EXTCOUNT)=RV I //MOVE THE POINTERS UP FOR I = FONT TO (FONT+LASTE) DO RV I = (RV I) + EXTCOUNT //MOVE EFONT UP EFONT = EFONT+EXTCOUNT //COPY FROM FARRAY INTO THE FONT FOR I = 0 TO EXTCOUNT DO [ LET HD = FDVEC!(3*I) LET XH = FDVEC!((3*I) + 1) LET WIDTH = I EQ EXTCOUNT? 1+2*(FDVEC!(3*I+2)), 2*(LASTE+1+I) //COPY FROM FARRAY IF (HD+XH) GR 0 DO FOR K = 0 TO XH-1 DO [ RV EFONT = RV(FARRAY+I+((HD+K)*FWMAX)) EFONT = EFONT+1 ] RV EFONT = WIDTH RV (EFONT+1) = (HD LSHIFT 8) % XH //SET UP A POINTER TO EFONT IN THE RIGHT PLACE IN THE POINTER //AREA. IF I=0, THE RIGHT PLACE IS FONT!CHAR, OTHERWISE IT //IS AT LASTE LET PXX = I EQ 0? CHAR,LASTE+I PXX = FONT+PXX RV PXX = EFONT - PXX EFONT = EFONT+2 ] ] AND CHASE(X) = VALOF [ IF FONT!X EQ 0 THEN RESULTIS X LET Q = RV(FONT + X + (FONT!X)) IF (Q&1) NE 0 THEN RESULTIS X LET T = Q RSHIFT 1 LET R = CHASE(T) RESULTIS X GR R? X,R ] AND GETLAST() = VALOF //FIND THE FIRST WORD BEYOND THE FONT [ LET LASTX = 0 FOR I = 0 TO 377B DO [ LET T = GETBIGGEST(I) IF T GR LASTX THEN LASTX = T ] RESULTIS LASTX +2 ] AND GETBIGGEST(CHAR) = VALOF [ IF FONT!CHAR EQ 0 THEN RESULTIS 0 LET T = FONT + CHAR + (FONT!CHAR) LET EXT = RV T IF (EXT & 1) NE 0 THEN RESULTIS T LET U = GETBIGGEST( EXT RSHIFT 1) RESULTIS U GR T? U,T ] //COMPACT FONT BY REMOVING CHAR. RETURNS NUMBER OF WORDS RECOVERED AND COMPACTFONT(CHAR) = VALOF [ LET ENDOFFONT = GETLAST() LET GETBACK = 0 LET EXTCHAR = RV(FONT+CHAR+(FONT!CHAR)) IF (EXTCHAR & 1) EQ 0 THEN GETBACK = COMPACTFONT( EXTCHAR RSHIFT 1) LET P = FONT+CHAR + (FONT!CHAR) LET OURVAL = CHAR+ (FONT!CHAR) FONT!CHAR = 0 //ZAP THE CHARACTER LET ELAST = BIGGESTCHAR() //LAST POINTER ENDOFFONT = ENDOFFONT - GETBACK //DETERMINE THE AMOUNT OF SPACE WE WILL GET BACK FROM THE BITMAP //AREA LET XH = (RV(P+1))&177B XH = XH EQ 0? 0,XH+2 //DON'T ZAP 0 WIDTH CHARACTERS IF ENDOFFONT GR P THEN //DO THE FOLLOWING ONLY IF THE DELETED CHARACTER IS NOT THE LAST ONE IN THE BITMAP AREA [ //MOVE THE BITMAP DOWN BY XH WORDS FOR I = P+2 TO ENDOFFONT-1 DO RV(I-XH) = RV I //DECREMENT POINTERS BY THE AMOUNT OF SPACE REMOVED FOR I = 0 TO ELAST DO IF (I+(FONT!I)) GR OURVAL THEN FONT!I = (FONT!I)-XH ENDOFFONT = ENDOFFONT-XH //BECAUSE WE MOVED IT DOWN ] IF CHAR LS 400B THEN RESULTIS GETBACK+XH //THE CHARACTER IS AN EXTENSION. WE MUST REMOVE ITS PLACE //IN THE EXTENSION TABLE (PAINFULLY). FOR I = 0 TO 377B DO TANDD(I,CHAR) //DECREMENT PSEUDO //CHARACTERS IN THE BITMAP AREA WHICH POINT TO THINGS BEYOND CHAR FOR I = FONT+CHAR TO ENDOFFONT-1 DO RV I = RV (I+1) //MOVE //FONT DOWN FOR I = 0 TO CHAR-1 DO FONT!I = (FONT!I) -1 //DECREMENT RESULTIS GETBACK+XH+1 ] AND TANDD(I,CHAR) BE [ IF FONT!I EQ 0 THEN RETURN LET P = FONT+I+(FONT!I) LET Q = RV P IF (Q & 1) EQ 0 THEN [ IF (Q RSHIFT 1) GR CHAR THEN RV P = Q-2 //DECREMENT //IF PSEUDO-CHARACTER IS GREATER THAN OURS TANDD(Q RSHIFT 1, CHAR) //FOLLOW THE POINTER ] ] AND BIGGESTCHAR() = VALOF [ LET LASTE = 0 FOR I = 0 TO 377B DO [ LET T = CHASE(I) LASTE = LASTE GR T? LASTE,T ] RESULTIS LASTE ]