Maxifont.bas
This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.
Maxifont is a small program written by Dennis Wyatt for the Maximite Computer by Geoff Graham 2011/2012.
It will create a font, based on your input and save the font to a filename of your choice, appended with the .fnt descriptor.
It can add, flip horizontally or vertically, any of the characters it creates.
You only have to run the MAxifont.bas program and it will check the current Version of MMBasic and run the appropriate program for the version Installed - Currently only versions 2.7B, 3, 3.0A and 3.1 are supported.
The limitations of the software is the limited memory size for variables and arrays and therefore, only small font sizes can have lots of characters. The larger the font size, the less characters can be edited. This lies in the way Arrays are stored and in part, the way I have written Maxifont.
I will endeavour to Update the program so that it could enable larger fonts, with support for more characters
Regards
Dennis Wyatt dpwyatt(at)iinet.net.au
Maxifont.BAS:
10 '********************************************* 20 '* Maxifont startup program * 30 '* Detects which version of firmware * 40 '* V2.7B , V3.0 , V3.0A or V3.1 * 50 '********************************************* 60 version = MM.VER 70 IF version = 3.01 THEN RUN "Maxf3_1.bas" 80 IF version = 3 or version = 3.0001 THEN RUN "Maxf3_0.bas" 90 IF version = 2.0702 THEN RUN "MaxF2_7.bas" 100 CLS 120 PRINT " Sorry your firmware version is not supported yet" 130 END
MaxF2_7.BAS:
10 '********************************** 15 '* Maxi-Font * 20 '* Font Editor by Dennis Wyatt * 30 '* Using mmBasic for the * 40 '* Maximite computer * 50 '********************************** 55 ' get maximum screen dimension-split into 20 parts 60 Max_x=MM.HRES : Min_x=CINT(Max_x/20) 70 Max_y=MM.VRES : Min_y=CINT(max_y/20) 80 CLS 84 addchar=1 85 '*********************************** 86 ' Set to Capture SD card errors 87 '*********************************** 90 OPTION Error Continue 95 '*********************************** 96 '* Show front page 97 '*********************************** 100 FONT LOAD "gothic.fnt" AS #4 : FONT #4 110 LOCATE 0,1 : ?"200000000000004" 115 LOCATE 0,33 : ? "1" : LOCATE max_x-32,33 : ? "1" 116 LOCATE 0,65 : ? "1" : LOCATE max_x-32,65 : ? "1" 120 LOCATE 0,92 130 ?"300000000000005" 135 '********************************************** 136 '* return to font 1 and unload gothic font 137 '* need the memory 138 '********************************************** 140 FONT #1 : FONT unload #4 150 FONT LOAD "invade.fnt" AS #5 :FONT #5 160 LOCATE 40,57 : ? "0 2 4": LOCATE 15*min_x,57: ? "1 3 5" 170 FONT #1 180 LOCATE 9*min_x,37: ? "Welcome to" 190 FONT #1,3 : LOCATE 7.3*min_x,52 : ? "MaxiFont" 200 LINE (0,124)-(max_x,124),1 210 FONT #1,1 220 LOCATE 2*min_x,130 230 ? "This program will help you to design some interesting fonts, with" 240 LOCATE 2*min_x,145 250 ? "the added scope of allowing the design of program sprites, for the" 260 LOCATE 2*min_x,160 270 ? "inclusion into some Maximite games, or just make some gothic borders." 280 LOCATE 2*min_x,190 290 ? "The design of the font should take into account the available" 300 LOCATE 2*min_x,205 310 ? "memory in the system. This is about 37 Kb, for arrays, used in the" 320 LOCATE 2*min_x,220 330 ?"design process. This limits the number of characters, in the editor" 340 LOCATE 2*min_x,235 350 ?"at one time. A 255 pixel wide font by 64 pixels high can only have" 360 LOCATE 2*min_x,250 370 ?"2 Characters, if I rewrite the code. A 10 pixel by 10 pixel font can" 380 LOCATE 2*min_x,265 390 ?"have only 70 characters in the editor at one time." 400 LOCATE 2*min_x,280 410 ?"You can always append the files together later. Once saved the font" 420 LOCATE 2*min_x,295 430 ?"takes up one quarter the size." 440 LOCATE 2*min_x,310 450 ?"It would be easier to design a smaller font and just piece them" 460 LOCATE 2*min_x,325 470 ?"together to form one large picture." 480 LOCATE 2*min_x,340 490 ?"If you encounter an out of memory error, then reduce the number of " 500 LOCATE 2*min_x,355 510 ?"Characters" 520 LOCATE 9*min_x,385 : ?"press any key" 530 DO WHILE (INKEY$="") 540 FONT #5 550 PAUSE 100 560 frontpage=NOT frontpage 580 IF (frontpage=1) THEN 590 LOCATE 40,57 : ? "1 3 5": LOCATE 15*min_x,57: ? "0 2 4" 600 ELSE 610 LOCATE 40,57 : ? "0 2 4": LOCATE 15*min_x,57: ? "1 3 5" 620 ENDIF 630 LOOP 640 FOR a=1 TO 5 650 PAUSE 150 660 ON a GOTO 670,680,690,700,710 670 LOCATE 40,57 : ? "6 6 6": LOCATE 15*min_x,57: ? "6 6 6":NEXT a 680 LOCATE 40,57 : ? "7 7 7": LOCATE 15*min_x,57: ? "7 7 7":NEXT a 690 LOCATE 40,57 : ? "8 8 8": LOCATE 15*min_x,57: ? "8 8 8":NEXT a 700 LOCATE 40,57 : ? "9 9 9": LOCATE 15*min_x,57: ? "9 9 9":NEXT a 710 t$=CHR$(59)+" "+CHR$(59)+" "+CHR$(59) 720 LOCATE 40,57 : ? t$: LOCATE 15*min_x,57: ? t$ :NEXT a 730 FONT #1 : FONT unload #5 735 t$=" " 740 LINE(2*min_x,130)-(max_x,max_y),0,BF 745 LOCATE 0,130 750 ? t$; : INPUT "Width of Font? ",fwidth 760 IF (fwidth>255) THEN 761 ? t$+"Cannot be bigger than 255 pixels": GOTO 750 762 ENDIF 770 ? t$; : INPUT "Height of Font ? ",fheight 780 IF (fheight > 64) THEN 781 ? t$+"Cannot be higher than 64 pixels":GOTO 770 782 ENDIF 790 IF (fheight =0) THEN 791 ? t$+"Cannot be lower than 1 pixels":GOTO 770 792 ENDIF 800 ? t$; : INPUT "Number of Characters ? ",fnumber 810 IF (fnumber =0) THEN 811 ? t$+"Cannot be less than 1 Character":GOTO 800 812 ENDIF 820 IF (fnumber >128) THEN 821 ? t$+"Cannot be more than 128 Characters":GOTO 800 822 ENDIF 830 ? t$; : INPUT "Start Character set at ?";fstart 840 IF (fstart<32) THEN 841 ? t$+"Cannot be less than 32 ": GOTO 830 842 ENDIF 850 CLS 860 OPTION base 0 870 DIM values(4) 880 DIM plot(fnumber,fwidth,fheight) 890 LINE (0,0)-(max_x-1,100),1,BF 900 LINE (10,10)-(max_x-11,90),0,BF 910 GOSUB 3050 920 LINE (0,101)-(max_x-1,max_y-1),1,B 930 LINE (2,103)-(6*min_x,max_y-3),1,B 940 screenx=Max_x-1-(7*min_x) 950 screenstepx=CINT(screenx/fwidth-1) 960 countxmax=screenstepx*fwidth+7*min_x 970 screeny=max_y-104 : screenstepy=CINT(screeny/fheight-1) 980 countymax=screenstepy*fheight+104 990 LINE (7*min_x,103)-(19*min_x,19*min_y),0,BF 1000 FOR countx = 7*min_x TO countxmax STEP screenstepx 1010 LINE (countx,103)-(countx,countymax),1 1020 NEXT countx 1030 FOR county = 103 TO countymax STEP screenstepy 1040 LINE (7*min_x,county)-(countxmax,county),1 1050 NEXT county 1060 box_x=screenstepx-2 : box_y=screenstepy-2 1070 cursorx=7*min_x+1 : cursory=104 1080 GOSUB 3100 1090 GOSUB 2880 ' read font info into display 1100 TIMER=0 1110 plotx=1 : ploty=1 : charxy=1 1120 LOCATE 160,15 : ?"X-Position":GOSUB 1830 1130 LOCATE 160,30 : ?"Y-Position":GOSUB 1850 1140 LOCATE 160,45 : ?"Character #":GOSUB 1870 1145 LOCATE 160,60 : ? "Character code ":GOSUB 1880 1150 DO 1160 text$=INKEY$ 1170 IF (text$<>"") THEN GOSUB 1270 1180 timerloop=TIMER 1190 IF (timerloop>oldloop+100) THEN 1200 oldloop=oldloop+100 1210 cmode=NOT cmode 1220 GOSUB 1250 1230 ENDIF 1240 LOOP 1250 LINE (cursorx,cursory)-(cursorx+box_x,cursory+box_y),cmode,BF 1260 RETURN 1270 IF (ASC(text$)=131) THEN 1280 IF (plotx=fwidth) THEN 1290 ' do nothing at right edge already 1300 ELSE 1310 cursorx=cursorx+screenstepx 1320 plotx=plotx+1 1330 GOSUB 1830 1340 ENDIF 1350 IF (plot(charxy,plotx-1,ploty)=0) THEN direction=1:GOSUB 1890 1360 IF(plot(charxy,plotx-1,ploty)=1) THEN direction=1 :GOSUB 1920 1370 ENDIF 1380 ENDIF 1390 IF (ASC(text$)=130) THEN 1400 IF (plotx=1) THEN 1410 ' do nothing at left edge already 1420 ELSE 1430 cursorx=cursorx-screenstepx 1440 plotx=plotx-1 1450 GOSUB 1830 1460 ENDIF 1470 IF (plot(charxy,plotx+1,ploty)=0) THEN direction=-1 : GOSUB 1890 1480 IF(plot(charxy,plotx+1,ploty)=1) THEN direction=-1 :GOSUB 1920 1490 ENDIF 1500 ENDIF 1510 IF (ASC(text$)=128) THEN 1520 IF (ploty=1) THEN 1530 ' do nothing at top edge already 1540 ELSE 1550 cursory=cursory-screenstepy 1560 ploty=ploty-1 1570 GOSUB 1850 1580 ENDIF 1590 IF (plot(charxy,plotx,ploty+1)=0) THEN direction=-1 : GOSUB 1950 1600 IF(plot(charxy,plotx,ploty+1)=1) THEN direction=-1 :GOSUB 1980 1610 ENDIF 1620 ENDIF 1630 IF (ASC(text$)=129) THEN 1640 IF (ploty=fheight) THEN 1650 ' do nothing at bottom edge already 1660 ELSE 1670 cursory=cursory+screenstepy 1680 ploty=ploty+1 1690 GOSUB 1850 1700 IF (plot(charxy,plotx,ploty-1)=0) THEN direction=1 : GOSUB 1950 1710 IF(plot(charxy,plotx,ploty-1)=1) THEN direction=1 :GOSUB 1980 1720 ENDIF 1730 ENDIF 1740 IF(text$="-") THEN GOSUB 2720 1745 IF (ASC(text$)=132) THEN GOSUB 5000 1750 IF(text$="e"OR text$="E") THEN 1760 CLS : ? "Hope you found this tool useful!" : END 1770 ENDIF 1775 IF (text$="c" OR text$="C") THEN GOSUB 5500 1776 IF (text$="v" OR text$="V") THEN GOSUB 6500 1777 IF (text$="h" OR text$="H") THEN GOSUB 7500 1780 IF (ASC(text$)=139) THEN GOSUB 2010 1790 IF(text$="+") THEN GOSUB 2800 1800 IF (ASC(text$)=32) THEN GOSUB 2040 1810 IF (text$="s" OR text$="S") THEN GOSUB 2070 1820 IF (text$="l" OR text$="L") THEN GOTO 2260 1830 LOCATE 220,15 : ?" ":LOCATE 220,15 : ? plotx 1840 RETURN 1850 LOCATE 220,30 : ? " ":LOCATE 220,30: ? ploty 1860 RETURN 1870 LOCATE 230,45 : ?" " : LOCATE 230,45 : ? charxy 1880 LOCATE 245,60 : ?" " : LOCATE 245,60 : ? fstart+charxy-1 1885 RETURN 1890 tempx=cursorx-(direction*screenstepx) 1900 LINE (tempx,cursory)-(tempx+box_x,cursory+box_y),0,BF 1910 RETURN 1920 tempx=cursorx-(direction*screenstepx) 1930 LINE (tempx,cursory)-(tempx+box_x,cursory+box_y),1,BF 1940 RETURN 1950 tempy=cursory-(direction*screenstepy) 1960 LINE (cursorx,tempy)-(cursorx+box_x,tempy+box_y),0,BF 1970 RETURN 1980 tempy=cursory-(direction*screenstepy) 1990 LINE (cursorx,tempy)-(cursorx+box_x,tempy+box_y),1,BF 2000 RETURN 2010 PIXEL(52+plotx,292+ploty)=1 2020 plot(charxy,plotx,ploty)=1 2030 RETURN 2040 plot(charxy,plotx,ploty)=0 2050 PIXEL(52+plotx,292+ploty)=0 2060 RETURN 2070 GOSUB 5300: LOCATE 270,20 : ? " " 2075 LOCATE 270,20 : INPUT "Filename to Save : ",savename$ 2080 IF (RIGHT$(savename$,3)<>"fnt") THEN savename$=savename$+".fnt" 2090 OPEN savename$ FOR output AS #1 2100 typefile$="save" 2110 ON MM.ERRNO GOTO 3350,3410,3470,3530,3590,3650 2120 PRINT #1,fheight","fwidth","fstart","fstart+fnumber-addchar 2130 FOR numchar=1 TO fnumber 2140 FOR row = 1 TO fheight 2150 temp$="" 2160 FOR column=1 TO fwidth 2170 IF (plot(numchar,column,row)=1) THEN temp$=temp$+"X" 2180 IF (plot(numchar,column,row)=0) THEN temp$=temp$+" " 2190 NEXT column 2200 PRINT #1,temp$ 2210 NEXT row,numchar 2215 IF addchar=0 THEN GOSUB 5100 2220 CLOSE #1 2230 GOSUB 5300 2240 LOCATE 270,20 : ?"save ok" 2250 RETURN 2260 GOSUB 5300: LOCATE 270,20 : ? " " 2270 LOCATE 270,20 : INPUT "Filename to load : ",fname$ 2280 IF (RIGHT$(fname$,3)<>"fnt") THEN fname$=fname$+".fnt" 2290 OPEN fname$ FOR input AS #2 2300 typefile$="load" 2310 ON MM.ERRNO GOTO 3350,3410,3470,3530,3590,3650 2320 LINE INPUT #2,temp$ 2330 ERASE values 2340 DIM values(4) 2350 pointer=1: fwidth =0: fheight=0 :fnumber=0 :fstart=0 2360 FOR a= 1 TO LEN(temp$) 2370 a$=MID$(temp$,a,1) 2380 IF (a$=",") THEN 2390 values(pointer)=VAL(rwidth$) 2400 pointer=pointer+1 2410 rwidth$="" 2420 ELSE 2430 rwidth$=rwidth$+a$ 2440 ENDIF 2450 NEXT a 2460 LOCATE 300,45 2480 values(4)= VAL(rwidth$) 2490 LOCATE 300,60 2510 fwidth=values(2) 2520 fheight=VAL(temp$) 2530 fstart=values(3) 2540 fnumber=values(4)-values(3)+1 2550 ERASE plot : GOSUB 3290 2560 DIM plot(fnumber,fwidth,fheight) 2565 GOSUB 3290 2570 FOR a= 1 TO fnumber 2580 FOR c=1 TO fheight 2590 LINE INPUT #2,temp$ 2600 FOR b=1 TO fwidth 2610 IF (MID$(temp$,b,1)=CHR$(32)) THEN 2620 plot(a,b,c)=0 2630 ELSE 2640 plot(a,b,c)=1 2650 ENDIF 2660 NEXT b,c,a 2670 CLOSE #2 2680 GOSUB 5300 2690 LOCATE 270,20 2695 ?"load ok" 2700 GOSUB 3050 2710 GOTO 950 2720 IF (charxy =1) THEN 2730 'rem do nothing 2740 ELSE 2750 charxy=charxy-1 2760 GOSUB 1870 2770 GOSUB 2880 2780 ENDIF 2790 RETURN 2800 IF (charxy =fnumber) THEN 2810 'rem do nothing 2820 ELSE 2830 charxy=charxy+1 2840 GOSUB 1870 2850 GOSUB 2880 2860 ENDIF 2870 RETURN 2880 LINE (52,292)-(52+fwidth,292+fheight),0,BF 2890 a=charxy : IF (a=0) THEN a=1 2900 cursorx=7*min_x+2 : cursory=105 2910 plotx=1 :ploty=1 2920 FOR c=1 TO fheight 2930 FOR b=1 TO fwidth 2940 tempx=cursorx+(b-1)*screenstepx : tempy=cursory+(c-1)*screenstepy 2950 temp2x=tempx+box_x : temp2y=tempy+box_y 2960 IF (plot(a,b,c)=0) THEN 2970 LINE (tempx,tempy)-(temp2x,temp2y),0,BF 2980 ELSE 2990 LINE (tempx,tempy)-(temp2x,temp2y),1,BF 3000 PIXEL(52+b,292+c)=1 3010 ENDIF 3020 NEXT b,c 3030 GOSUB 1870 3040 RETURN 3050 LOCATE 100,15 : ? " ":LOCATE 20,15: ? "Width ";fwidth 3060 LOCATE 50,30 : ? " ":LOCATE 20,30: ? "Height ";fheight 3070 LOCATE 130,45 : ? " ":LOCATE 20,45: ? "Characters in Set ";fnumber 3080 LOCATE 80,60 : ? " ":LOCATE 20,60: ? "Start Character ";fstart 3090 RETURN 3100 LOCATE 10,110 : ? "Move --- Cursor keys" 3110 LOCATE 10,125 : ? "Set ___ Left Alt." 3120 LOCATE 10,140 : ? "Erase --- Space" 3130 LOCATE 10,155 : ? "Load --- l or L" 3140 LOCATE 10,170 : ? "Save --- s or S" 3150 LOCATE 10,185 : ? "Char Up ___ +" 3160 LOCATE 10,200 : ? "Char Down --- -" 3165 LOCATE 10,215 : ? "Add Char ___ Insert" 3166 LOCATE 10,230 : ? "Copy Char ___ c or C" 3167 LOCATE 10,245 : ? "Flip Vert. ___ v or V" 3168 LOCATE 10,260 : ? "Flip Horiz.___ h or H" 3170 LOCATE 10,275 : ? "Exit ___ e or E" 3180 LINE (4,290)- (6*min_x-2,max_y-6),1,B 3190 LOCATE 10,300: ?"Pixel":LOCATE 10,320: ? "Size" 3200 LINE (50,291)-(6*min_x-4,max_y-70),0,BF 3210 LINE (50,290)-(50+fwidth+4,290+fheight+4),1,B 3220 LOCATE 30,Max_y-65 3230 ? "Code Written by" 3240 LOCATE 15,Max_y-45 3250 ? "Dennis Wyatt ";:FONT LOAD "copyr.fnt" AS #6 :FONT #6 3252 ? " "; : FONT #1 : FONT unload #6 : ? " 2011" 3260 LOCATE 15,Max_y-25 3270 ? "dpwyatt@iinet.net.au" 3280 RETURN 3290 'pause routine for array erasure completion 3300 TIMER=0 3310 DO WHILE timertemp<3000 3320 timertemp=TIMER 3330 LOOP 3340 RETURN 3350 LOCATE 270,40: ? "ERROR -No SD Card present" 3352 LOCATE 270,55: ? "Please insert card and re-enter" 3354 LOCATE 270,70: ? "Filename at the prompt above" 3356 PAUSE 2000 3360 IF (typefile$="save") THEN 3370 GOTO 2070 3380 ELSE 3390 GOTO 2260 3400 ENDIF 3410 LOCATE 270,40: ? "Card is Write Protected" 3412 LOCATE 270,55: ? "Please write enable and re-enter" 3414 LOCATE 270,70: ? "Filename at the prompt above" 3420 IF (typefile$="save") THEN 3430 GOTO 2070 3440 ELSE 3450 GOTO 2260 3460 ENDIF 3470 LOCATE 270,40: ? "not enough space" 3472 LOCATE 270,55: ? "Please rectify and re-enter" 3474 LOCATE 270,70: ? "Filename at the prompt above" 3480 IF (typefile$="save") THEN 3490 GOTO 2070 3500 ELSE 3510 GOTO 2260 3520 ENDIF 3530 LOCATE 270,40 : ? "All root dir. taken" 3540 IF (typefile$="save") THEN 3550 GOTO 2070 3560 ELSE 3570 GOTO 2260 3580 ENDIF 3590 LOCATE 270,40 : ? "Invalid Filename" 3592 LOCATE 270,55: ? "Please rectify and re-enter" 3594 LOCATE 270,70: ? "Filename at the prompt above" 3600 IF (typefile$="save") THEN 3610 GOTO 2070 3620 ELSE 3630 GOTO 2260 3640 ENDIF 3650 LOCATE 270,40: ? "Cannot find File" 3652 LOCATE 270,55: ? "Please re-enter" 3654 LOCATE 270,70: ? "Filename at the prompt above" 3660 IF (typefile$="save") THEN 3670 GOTO 2070 3680 ELSE 3690 GOTO 2260 3700 ENDIF 5000 ' insert character function 5001 addchar=0 5010 savename$="temp.fnt" 5015 GOSUB 2090 5020 fname$="temp.fnt" 5030 GOSUB 2290 5088 addchar=1 5089 KILL "temp.fnt" 5090 RETURN 5100 temp$="" 5105 FOR column=1 TO fwidth 5110 temp$=temp$+" " 5120 NEXT column 5130 FOR row = 1 TO fheight 5140 PRINT #1,temp$ 5150 NEXT row 5160 RETURN 5300 LOCATE 270,20 : LINE (270,20)-(19*min_x,80),0,bf 5310 RETURN 5500 ' Copy function 5510 GOSUB 5300 5520 LOCATE 270,20 5530 INPUT "Copy which Character # ";copychar 5535 IF copychar>fnumber THEN 5536 LOCATE 270,35 : ? "Not that many Char." : GOTO 5520 5537 ENDIF 5540 LOCATE 270,35 5550 INPUT "To which Character # ";tochar 5555 IF tochar>fnumber THEN 5556 LOCATE 270,50 : ? "Not that many Char." : GOTO 5540 5557 ENDIF 5560 FOR copy1= 1 TO fwidth 5570 FOR copy2= 1 TO fheight 5580 plot(tochar,copy1,copy2)=plot(copychar,copy1,copy2) 5590 NEXT copy2,copy1 5600 LOCATE 270,50 : ? " " 5610 LOCATE 270,50 : ? "done" 6000 RETURN 6500 ' flip vertical function 6510 FOR flipV = 1 TO INT(fheight/2) 6520 FOR flipV1 = 1 TO fwidth 6530 flipvtemp=plot(charxy,flipV1,flipV) 6540 plot(charxy,flipV1,flipV)=plot(charxy,flipV1,fheight-flipV+1) 6550 plot(charxy,flipV1,fheight-flipV+1)=flipvtemp 6560 NEXT flipV1 : NEXT flipV 6570 GOSUB 5300 6580 LOCATE 270,20 6590 ? "Vertical Flip Done" 6600 GOSUB 2880 7000 RETURN 7500 ' flip horizontal function 7510 FOR flipH = 1 TO INT(fwidth/2) 7520 FOR flipH1 = 1 TO fheight 7530 fliphtemp=plot(charxy,flipH,flipH1) 7540 plot(charxy,flipH,flipH1)=plot(charxy,fwidth-flipH+1,flipH1) 7550 plot(charxy,fwidth-flipH+1,flipH1)=fliphtemp 7560 NEXT fliph1 7570 NEXT flipH 7580 GOSUB 5300 7590 LOCATE 270,20 7600 ? "Horizontal Flip Done" 7610 GOSUB 2880 8000 RETURN
MaxF3_0.BAS:
'********************************** '* Maxi-Font * '* Font Editor by Dennis Wyatt * '* Using mmBasic for the * '* Maximite computer * '********************************** ' get maximum screen dimension-split into 20 parts Max_x=MM.HRes : Min_x=Cint(Max_x/20) Max_y=MM.VRes : Min_y=Cint(max_y/20) Cls addchar=1 '*********************************** ' Set to Capture SD card errors '*********************************** Option Error Continue '*********************************** '* Show front page '*********************************** Font Load "gothic.fnt" As #4 : Font #4 Locate 0,1 : ?"200000000000004" Locate 0,33 : ? "1" : Locate max_x-32,33 : ? "1" Locate 0,65 : ? "1" : Locate max_x-32,65 : ? "1" Locate 0,92 ?"300000000000005" '********************************************** '* return to font 1 and unload gothic font '* need the memory '********************************************** Font #1 : Font unload #4 Font Load "invade.fnt" As #5 :Font #5 Locate 40,57 : ? "0 2 4": Locate 15*min_x,57: ? "1 3 5" Font #1 Locate 9*min_x,37: ? "Welcome to" Font #1,3 Locate 7.3*min_x,52 : ? "MaxiFont" Line (0,124)-(max_x,124),1 Font #1,1 Locate 2*min_x,130 ? "This program will help you to design some interesting fonts, with" Locate 2*min_x,145 ? "the added scope of allowing the design of program sprites, for the" Locate 2*min_x,160 ? "inclusion into some Maximite games, or just make some gothic borders." Locate 2*min_x,190 ? "The design of the font should take into account the available" Locate 2*min_x,205 ? "memory in the system. This is about 37 Kb, for arrays, used in the" Locate 2*min_x,220 ?"design process. This limits the number of characters, in the editor" Locate 2*min_x,235 ?"at one time. A 255 pixel wide font by 64 pixels high can only have" Locate 2*min_x,250 ?"2 Characters, if I rewrite the code. A 10 pixel by 10 pixel font can" Locate 2*min_x,265 ?"have only 70 characters in the editor at one time." Locate 2*min_x,280 ?"You can always append the files together later. Once saved the font" Locate 2*min_x,295 ?"takes up one quarter the size." Locate 2*min_x,310 ?"It would be easier to design a smaller font and just piece them" Locate 2*min_x,325 ?"together to form one large picture." Locate 2*min_x,340 ?"If you encounter an out of memory error, then reduce the number of " Locate 2*min_x,355 ?"Characters" Locate 9*min_x,385 : ?"press any key" Do While (Inkey$="") Font #5 Pause 100 frontpage=Not frontpage If (frontpage=1) Then Locate 40,57 : ? "1 3 5": Locate 15*min_x,57: ? "0 2 4" Else Locate 40,57 : ? "0 2 4": Locate 15*min_x,57: ? "1 3 5" EndIf Loop For a=1 To 5 Pause 150 On a GoTo explode1,explode2,explode3,explode4,explode5 explode1: Locate 40,57 : ? "6 6 6": Locate 15*min_x,57: ? "6 6 6":Next a explode2: Locate 40,57 : ? "7 7 7": Locate 15*min_x,57: ? "7 7 7":Next a explode3: Locate 40,57 : ? "8 8 8": Locate 15*min_x,57: ? "8 8 8":Next a explode4: Locate 40,57 : ? "9 9 9": Locate 15*min_x,57: ? "9 9 9":Next a explode5: t$=Chr$(59)+" "+Chr$(59)+" "+Chr$(59) Locate 40,57 : ? t$: Locate 15*min_x,57: ? t$ :Next a Font #1 : Font unload #5 t$=" " Line(2*min_x,130)-(max_x,max_y),0,BF Locate 0,130 Fontwidth: ? t$; : Input "Width of Font? ",fwidth If (fwidth>255) Then ? t$+"Cannot be bigger than 255 pixels": GoTo Fontwidth EndIf Fontheight: ? t$; : Input "Height of Font ? ",fheight If (fheight > 64) Then ? t$+"Cannot be higher than 64 pixels":GoTo Fontheight EndIf If (fheight =0) Then ? t$+"Cannot be lower than 1 pixels":GoTo Fontheight EndIf Fontnumber: ? t$; : Input "Number of Characters ? ",fnumber If (fnumber =0) Then ? t$+"Cannot be less than 1 Character":GoTo Fontnumber EndIf If (fnumber >128) Then ? t$+"Cannot be more than 128 Characters":GoTo Fontnumber EndIf Fontstart: ? t$; : Input "Start Character set at ?";fstart If (fstart<32) Then ? t$+"Cannot be less than 32 ": GoTo Fontstart EndIf Cls Option base 0 Dim values(4) Dim plot(fnumber,fwidth,fheight) Line (0,0)-(max_x-1,100),1,BF Line (10,10)-(max_x-11,90),0,BF GoSub UpdateFontDetails Line (0,101)-(max_x-1,max_y-1),1,B Line (2,103)-(6*min_x,max_y-3),1,B screenx=Max_x-1-(7*min_x) Setupgrid: screenstepx=Cint(screenx/fwidth-1) countxmax=screenstepx*fwidth+7*min_x screeny=max_y-104 : screenstepy=Cint(screeny/fheight-1) countymax=screenstepy*fheight+104 Line (7*min_x,103)-(19*min_x,19*min_y),0,BF For countx = 7*min_x To countxmax Step screenstepx Line (countx,103)-(countx,countymax),1 Next countx For county = 103 To countymax Step screenstepy Line (7*min_x,county)-(countxmax,county),1 Next county box_x=screenstepx-2 : box_y=screenstepy-2 cursorx=7*min_x+1 : cursory=104 GoSub Instructions GoSub Displayfontchar ' read font info into display Timer=0 plotx=1 : ploty=1 : charxy=1 Locate 160,15 : ?"X-Position":GoSub update_x_position Locate 160,30 : ?"Y-Position":GoSub update_y_position Locate 160,45 : ?"Character #":GoSub update_char_number Locate 160,60 : ? "Character code ":GoSub update_char_code Do text$=Inkey$ If (text$<>"") Then GoSub Continueloop timerloop=Timer If (timerloop>oldloop+100) Then oldloop=oldloop+100 cmode=Not cmode GoSub flash_cursor_pos EndIf Loop flash_cursor_pos: Line (cursorx,cursory)-(cursorx+box_x,cursory+box_y),cmode,BF Return Continueloop: If (Asc(text$)=131) Then If (plotx=fwidth) Then ' do nothing at right edge already Else cursorx=cursorx+screenstepx plotx=plotx+1 GoSub update_x_position EndIf If (plot(charxy,plotx-1,ploty)=0) Then direction=1:GoSub clear_right If(plot(charxy,plotx-1,ploty)=1) Then direction=1 :GoSub draw_right EndIf EndIf If (Asc(text$)=130) Then If (plotx=1) Then ' do nothing at left edge already Else cursorx=cursorx-screenstepx plotx=plotx-1 GoSub update_x_position EndIf If (plot(charxy,plotx+1,ploty)=0) Then direction=-1 : GoSub clear_right If(plot(charxy,plotx+1,ploty)=1) Then direction=-1 :GoSub draw_right EndIf EndIf If (Asc(text$)=128) Then If (ploty=1) Then ' do nothing at top edge already Else cursory=cursory-screenstepy ploty=ploty-1 GoSub update_y_position EndIf If (plot(charxy,plotx,ploty+1)=0) Then direction=-1 : GoSub clear_down If(plot(charxy,plotx,ploty+1)=1) Then direction=-1 :GoSub clear_up EndIf EndIf If (Asc(text$)=129) Then If (ploty=fheight) Then ' do nothing at bottom edge already Else cursory=cursory+screenstepy ploty=ploty+1 GoSub update_y_position If (plot(charxy,plotx,ploty-1)=0) Then direction=1 : GoSub clear_down If(plot(charxy,plotx,ploty-1)=1) Then direction=1 :GoSub clear_up EndIf EndIf If(text$="-") Then GoSub Char_up If (Asc(text$)=132) Then GoSub Insert_char If(text$="e"Or text$="E") Then Cls : ? "Hope you found this tool useful!" : End EndIf If (text$="c" Or text$="C") Then GoSub Copy_char If (text$="v" Or text$="V") Then GoSub Vertical_flip If (text$="h" Or text$="H") Then GoSub horizontal_flip If (Asc(text$)=139) Then GoSub Set_plot If(text$="+") Then GoSub Char_down If (Asc(text$)=32) Then GoSub Clear_plot If (text$="s" Or text$="S") Then GoSub Save_font If (text$="l" Or text$="L") Then GoTo Load_font update_x_position: Locate 220,15 : ? plotx;" " Return update_y_position: Locate 220,30: ? ploty;" " Return update_char_number: Locate 230,45 : ? charxy;" " update_char_code: Locate 245,60 : ? fstart+charxy-1;" " Return clear_right: tempx=cursorx-(direction*screenstepx) Line (tempx,cursory)-(tempx+box_x,cursory+box_y),0,BF Return draw_right: tempx=cursorx-(direction*screenstepx) Line (tempx,cursory)-(tempx+box_x,cursory+box_y),1,BF Return clear_down: tempy=cursory-(direction*screenstepy) Line (cursorx,tempy)-(cursorx+box_x,tempy+box_y),0,BF Return clear_up: tempy=cursory-(direction*screenstepy) Line (cursorx,tempy)-(cursorx+box_x,tempy+box_y),1,BF Return Set_plot: Pixel(52+plotx,292+ploty)=1 plot(charxy,plotx,ploty)=1 Return Clear_plot: plot(charxy,plotx,ploty)=0 Pixel(52+plotx,292+ploty)=0 Return Save_font: GoSub Clear_box : Locate 270,20 : ? " " Locate 270,20 : Input "Filename to Save : ",savename$ If (Right$(savename$,3)<>"fnt") Then savename$=savename$+".fnt" Insert_save_font: Open savename$ For output As #1 typefile$="save" On MM.Errno GoTo No_sd_card, Card_protected, no_space_left, All_root_gone, Invalid_filename, Cannot_find_file Print #1,fheight","fwidth","fstart","fstart+fnumber-addchar For numchar=1 To fnumber For row = 1 To fheight temp$="" For column=1 To fwidth If (plot(numchar,column,row)=1) Then temp$=temp$+"X" If (plot(numchar,column,row)=0) Then temp$=temp$+" " Next column Print #1,temp$ Next row next numchar If addchar=0 Then GoSub Insert_Char_now Close #1 GoSub Clear_box Locate 270,20 : ?"save ok" Return Load_font: GoSub Clear_box : Locate 270,20 : ? " " Locate 270,20 : Input "Filename to load : ",fname$ If (Right$(fname$,3)<>"fnt") Then fname$=fname$+".fnt" Insert_Load_Font: Open fname$ For input As #2 typefile$="load" On MM.Errno GoTo No_sd_card, Card_protected, no_space_left, All_root_gone, Invalid_filename, Cannot_find_file Line Input #2,temp$ Erase values Dim values(4) pointer=1: fwidth =0: fheight=0 :fnumber=0 :fstart=0 For a= 1 To Len(temp$) a$=Mid$(temp$,a,1) If (a$=",") Then values(pointer)=Val(rwidth$) pointer=pointer+1 rwidth$="" Else rwidth$=rwidth$+a$ EndIf Next a values(4)= Val(rwidth$) fwidth=values(2) fheight=Val(temp$) fstart=values(3) fnumber=values(4)-values(3)+1 Erase plot : GoSub My_pause Dim plot(fnumber,fwidth,fheight) GoSub My_pause For a= 1 To fnumber For c=1 To fheight Line Input #2,temp$ For b=1 To fwidth If (Mid$(temp$,b,1)=Chr$(32)) Then plot(a,b,c)=0 Else plot(a,b,c)=1 EndIf Next b nextc next a Close #2 GoSub Clear_box Locate 270,20 ?"load ok" GoSub UpdateFontDetails GoTo Setupgrid Char_up: If (charxy =1) Then 'rem do nothing Else charxy=charxy-1 GoSub update_char_number GoSub Displayfontchar EndIf Return Char_down: If (charxy =fnumber) Then 'rem do nothing Else charxy=charxy+1 GoSub update_char_number GoSub Displayfontchar EndIf Return Displayfontchar: Line (52,292)-(52+fwidth,292+fheight),0,BF a=charxy : If (a=0) Then a=1 cursorx=7*min_x+2 : cursory=105 plotx=1 :ploty=1 For c=1 To fheight For b=1 To fwidth tempx=cursorx+(b-1)*screenstepx : tempy=cursory+(c-1)*screenstepy temp2x=tempx+box_x : temp2y=tempy+box_y If (plot(a,b,c)=0) Then Line (tempx,tempy)-(temp2x,temp2y),0,BF Else Line (tempx,tempy)-(temp2x,temp2y),1,BF Pixel(52+b,292+c)=1 EndIf Next b next c GoSub update_char_number Return UpdateFontDetails: Locate 100,15 : ? " ":Locate 20,15: ? "Width ";fwidth Locate 50,30 : ? " ":Locate 20,30: ? "Height ";fheight Locate 130,45 : ? " ":Locate 20,45: ? "Characters in Set ";fnumber Locate 80,60 : ? " ":Locate 20,60: ? "Start Character ";fstart Return Instructions: Locate 10,110 : ? "Move --- Cursor keys" Locate 10,125 : ? "Set ___ Left Alt." Locate 10,140 : ? "Erase --- Space" Locate 10,155 : ? "Load --- l or L" Locate 10,170 : ? "Save --- s or S" Locate 10,185 : ? "Char Up ___ +" Locate 10,200 : ? "Char Down --- -" Locate 10,215 : ? "Add Char ___ Insert" Locate 10,230 : ? "Copy Char ___ c or C" Locate 10,245 : ? "Flip Vert. ___ v or V" Locate 10,260 : ? "Flip Horiz.___ h or H" Locate 10,275 : ? "Exit ___ e or E" Line (4,290)- (6*min_x-2,max_y-6),1,B Locate 10,300: ?"Pixel":Locate 10,320: ? "Size" Line (50,291)-(6*min_x-4,max_y-70),0,BF Line (50,290)-(50+fwidth+4,290+fheight+4),1,B Locate 30,Max_y-65 ? "Code Written by" Locate 15,Max_y-45 ? "Dennis Wyatt ";:Font Load "copyr.fnt" As #6 :Font #6 ? " "; : Font #1 : Font unload #6 : ? " 2011" Locate 15,Max_y-25 ? "dpwyatt@iinet.net.au" Return My_pause: 'pause routine for array erasure completion Timer=0 Do While timertemp<3000 timertemp=Timer oop Return No_sd_card: Locate 270,40: ? "ERROR -No SD Card present" Locate 270,55: ? "Please insert card and re-enter" Locate 270,70: ? "Filename at the prompt above" Pause 2000 If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Card_protected: Locate 270,40: ? "Card is Write Protected" Locate 270,55: ? "Please write enable and re-enter" Locate 270,70: ? "Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf no_space_left: Locate 270,40: ? "not enough space" Locate 270,55: ? "Please rectify and re-enter" Locate 270,70: ? "Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf All_root_gone: Locate 270,40 : ? "All root dir. taken" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Invalid_filename: Locate 270,40 : ? "Invalid Filename" Locate 270,55: ? "Please rectify and re-enter" Locate 270,70: ? "Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Cannot_find_file: Locate 270,40: ? "Cannot find File" Locate 270,55: ? "Please re-enter" Locate 270,70: ? "Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Insert_char: ' insert character function addchar=0 savename$="temp.fnt" GoSub Insert_save_font fname$="temp.fnt" GoSub Insert_Load_Font addchar=1 Kill "temp.fnt" Return Insert_Char_now: temp$="" For column=1 To fwidth temp$=temp$+" " Next column For row = 1 To fheight Print #1,temp$ Next row Return Clear_box: Locate 270,20 : Line (270,20)-(19*min_x,80),0,bf Return Copy_char: ' Copy function GoSub Clear_box Copy_input1_error: Locate 270,20 Input "Copy which Character # ";copychar If copychar>fnumber Then Locate 270,35 : ? "Not that many Char." GoTo Copy_input1_error EndIf Copy_input2_error: Locate 270,35 Input "To which Character # ";tochar If tochar>fnumber Then Locate 270,50 : ? "Not that many Char." : GoTo Copy_input2_error EndIf For copy1= 1 To fwidth For copy2= 1 To fheight plot(tochar,copy1,copy2)=plot(copychar,copy1,copy2) Next copy2 next copy1 Locate 270,50 : ? " " Locate 270,50 : ? "done" Return Vertical_flip: ' flip vertical function For flipV = 1 To Int(fheight/2) For flipV1 = 1 To fwidth flipvtemp=plot(charxy,flipV1,flipV) plot(charxy,flipV1,flipV)=plot(charxy,flipV1,fheight-flipV+1) plot(charxy,flipV1,fheight-flipV+1)=flipvtemp Next flipV1 Next flipV GoSub Clear_box Locate 270,20 ? "Vertical Flip Done" GoSub Displayfontchar Return horizontal_flip: ' flip horizontal function For flipH = 1 To Int(fwidth/2) For flipH1 = 1 To fheight fliphtemp=plot(charxy,flipH,flipH1) plot(charxy,flipH,flipH1)=plot(charxy,fwidth-flipH+1,flipH1) plot(charxy,fwidth-flipH+1,flipH1)=fliphtemp Next fliph1 Next flipH GoSub Clear_box Locate 270,20 ? "Horizontal Flip Done" GoSub Displayfontchar Return
MaxF3_1.BAS:
'********************************** '* Maxi-Font * '* Font Editor by Dennis Wyatt * '* Using mmBasic for the * '* Maximite computer * '* V 3.1 * '********************************** ' get maximum screen dimension-split into 20 parts Max_x=MM.HRes : Min_x=Cint(Max_x/20) Max_y=MM.VRes : Min_y=Cint(max_y/20) Cls addchar=1 '*********************************** ' Set to Capture SD card errors '*********************************** Option Error Continue '*********************************** '* Show front page '*********************************** Font Load "gothic.fnt" As #4 : Font #4 Print @(0,1) "200000000000004" Print @(0,33) "1" Print @(max_x-32,33) "1" Print @(0,65) "1" Print @(max_x-32,65) "1" Print @(0,92) "300000000000005" '********************************************** '* return to font 1 and unload gothic font '* need the memory '********************************************** Font #1 Font unload #4 Font Load "invade.fnt" As #5 Font #5 Print @(40,57) "0 2 4" Print @(15*min_x,57) "1 3 5" Font #1 Print @(9*min_x,37) "Welcome to" Font #1,3 Print @(7.3*min_x,52)"MaxiFont" Line (0,124)-(max_x,124),1 Font #1,1 Print @(2*min_x,130)"This program will help you to design some interesting fonts, with" Print @(2*min_x,145)"the added scope of allowing the design of program sprites, for the" Print @(2*min_x,160)"inclusion into some Maximite games, or just make some gothic borders." Print @(2*min_x,190)"The design of the font should take into account the available" Print @(2*min_x,205)"memory in the system. This is about 37 Kb, for arrays, used in the" Print @(2*min_x,220)"design process. This limits the number of characters, in the editor" Print @(2*min_x,235)"at one time. A 255 pixel wide font by 64 pixels high can only have" Print @(2*min_x,250)"2 Characters, if I rewrite the code. A 10 pixel by 10 pixel font can" Print @(2*min_x,265)"have only 70 characters in the editor at one time." Print @(2*min_x,280)"You can always append the files together later. Once saved the font" Print @(2*min_x,295)"takes up one quarter the size." Print @(2*min_x,310)"It would be easier to design a smaller font and just piece them" Print @(2*min_x,325)"together to form one large picture." Print @(2*min_x,340)"If you encounter an out of memory error, then reduce the number of " Print @(2*min_x,355)"Characters" Print @(9*min_x,385)"press any key" Do While (Inkey$="") Font #5 Pause 100 frontpage=Not frontpage If (frontpage=1) Then Print @(40,57)"1 3 5" @(15*min_x,57)"0 2 4" Else Print @(40,57)"0 2 4" @(15*min_x,57)"1 3 5" EndIf Loop For a=1 To 5 Pause 150 On a GoTo explode1,explode2,explode3,explode4,explode5 explode1: Print @(40,57)"6 6 6" @(15*min_x,57)"6 6 6" Next a explode2: Print @(40,57)"7 7 7" @(15*min_x,57)"7 7 7" Next a explode3: Print @(40,57)"8 8 8" @(15*min_x,57)"8 8 8" Next a explode4: Print @(40,57)"9 9 9" @(15*min_x,57)"9 9 9" Next a explode5: t$=Chr$(59)+" "+Chr$(59)+" "+Chr$(59) Print @(40,57)t$ @(15*min_x,57) t$ Next a Font #1 Font unload #5 t$=" " Line(2*min_x,130)-(max_x,max_y),0,BF Print @(0,130)""; Fontwidth: ? t$; Input "Width of Font? ",fwidth If (fwidth>255) Then ? t$+"Cannot be bigger than 255 pixels" GoTo Fontwidth EndIf Fontheight: ? t$; Input "Height of Font ? ",fheight If (fheight > 64) Then ? t$+"Cannot be higher than 64 pixels" GoTo Fontheight EndIf If (fheight =0) Then ? t$+"Cannot be lower than 1 pixels" GoTo Fontheight EndIf Fontnumber: ? t$; Input "Number of Characters ? ",fnumber If (fnumber =0) Then ? t$+"Cannot be less than 1 Character" GoTo Fontnumber EndIf If (fnumber >128) Then ? t$+"Cannot be more than 128 Characters" GoTo Fontnumber EndIf Fontstart: ? t$; : Input "Start Character set at ?";fstart If (fstart<32) Then ? t$+"Cannot be less than 32 " GoTo Fontstart EndIf Cls Option base 0 Dim values(4) Dim plot(fnumber,fwidth,fheight) Line (0,0)-(max_x-1,100),1,BF Line (10,10)-(max_x-11,90),0,BF GoSub UpdateFontDetails Line (0,101)-(max_x-1,max_y-1),1,B Line (2,103)-(6*min_x,max_y-3),1,B screenx=Max_x-1-(7*min_x) Setupgrid: screenstepx=Cint(screenx/fwidth-1) countxmax=screenstepx*fwidth+7*min_x screeny=max_y-104 screenstepy=Cint(screeny/fheight-1) countymax=screenstepy*fheight+104 Line (7*min_x,103)-(19*min_x,19*min_y),0,BF For countx = 7*min_x To countxmax Step screenstepx Line (countx,103)-(countx,countymax),1 Next countx For county = 103 To countymax Step screenstepy Line (7*min_x,county)-(countxmax,county),1 Next county box_x=screenstepx-2 box_y=screenstepy-2 cursorx=7*min_x+1 cursory=104 GoSub Instructions GoSub Displayfontchar ' read font info into display Timer=0 plotx=1 : ploty=1 : charxy=1 Print @(160,15)"X-Position" GoSub update_x_position Print @(160,30)"Y-Position" GoSub update_y_position Print @(160,45)"Character #" GoSub update_char_number Print @(160,60)"Character code " GoSub update_char_code Do text$=Inkey$ If (text$<>"") Then GoSub Continueloop timerloop=Timer If (timerloop>oldloop+100) Then oldloop=oldloop+100 cmode=Not cmode GoSub flash_cursor_pos EndIf Loop flash_cursor_pos: Line (cursorx,cursory)-(cursorx+box_x,cursory+box_y),cmode,BF Return Continueloop: If (Asc(text$)=131) Then If (plotx=fwidth) Then ' do nothing at right edge already Else cursorx=cursorx+screenstepx plotx=plotx+1 GoSub update_x_position EndIf If (plot(charxy,plotx-1,ploty)=0) Then direction=1 : GoSub clear_right If(plot(charxy,plotx-1,ploty)=1) Then direction=1 : GoSub draw_right EndIf EndIf If (Asc(text$)=130) Then If (plotx=1) Then ' do nothing at left edge already Else cursorx=cursorx-screenstepx plotx=plotx-1 GoSub update_x_position EndIf If (plot(charxy,plotx+1,ploty)=0) Then direction=-1 : GoSub clear_right If(plot(charxy,plotx+1,ploty)=1) Then direction=-1 :GoSub draw_right EndIf EndIf If (Asc(text$)=128) Then If (ploty=1) Then ' do nothing at top edge already Else cursory=cursory-screenstepy ploty=ploty-1 GoSub update_y_position EndIf If (plot(charxy,plotx,ploty+1)=0) Then direction=-1 : GoSub clear_down If(plot(charxy,plotx,ploty+1)=1) Then direction=-1 :GoSub clear_up EndIf EndIf If (Asc(text$)=129) Then If (ploty=fheight) Then ' do nothing at bottom edge already Else cursory=cursory+screenstepy ploty=ploty+1 GoSub update_y_position If (plot(charxy,plotx,ploty-1)=0) Then direction=1 : GoSub clear_down If(plot(charxy,plotx,ploty-1)=1) Then direction=1 :GoSub clear_up EndIf EndIf If(text$="-") Then GoSub Char_up If (Asc(text$)=132) Then GoSub Insert_char If(text$="e"Or text$="E") Then Cls ? "Hope you found this tool useful!" End EndIf If (text$="c" Or text$="C") Then GoSub Copy_char If (text$="v" Or text$="V") Then GoSub Vertical_flip If (text$="h" Or text$="H") Then GoSub horizontal_flip If (Asc(text$)=139) Then GoSub Set_plot If(text$="+") Then GoSub Char_down If (Asc(text$)=32) Then GoSub Clear_plot If (text$="s" Or text$="S") Then GoSub Save_font If (text$="l" Or text$="L") Then GoTo Load_font update_x_position: Print @(220,15)plotx;" " Return update_y_position: Print @(220,30)ploty;" " Return update_char_number: Print @(230,45)charxy;" " Return update_char_code: Print @(245,60)fstart+charxy-1;" " Return clear_right: tempx=cursorx-(direction*screenstepx) Line (tempx,cursory)-(tempx+box_x,cursory+box_y),0,BF Return draw_right: tempx=cursorx-(direction*screenstepx) Line (tempx,cursory)-(tempx+box_x,cursory+box_y),1,BF Return clear_down: tempy=cursory-(direction*screenstepy) Line (cursorx,tempy)-(cursorx+box_x,tempy+box_y),0,BF Return clear_up: tempy=cursory-(direction*screenstepy) Line (cursorx,tempy)-(cursorx+box_x,tempy+box_y),1,BF Return Set_plot: Pixel(52+plotx,292+ploty)=1 plot(charxy,plotx,ploty)=1 Return Clear_plot: plot(charxy,plotx,ploty)=0 Pixel(52+plotx,292+ploty)=0 Return Save_font: GoSub Clear_box Print @(270,20)" " Print @(270,20); Input "Filename to Save : ",savename$ If (Right$(savename$,3)<>"fnt") Then savename$=savename$+".fnt" Insert_save_font: Open savename$ For output As #1 typefile$="save" On MM.Errno GoTo No_sd_card, Card_protected, no_space_left, All_root_gone, Invalid_filename, Cannot_find_file Print #1,fheight","fwidth","fstart","fstart+fnumber-addchar For numchar=1 To fnumber For row = 1 To fheight temp$="" For column=1 To fwidth If (plot(numchar,column,row)=1) Then temp$=temp$+"X" If (plot(numchar,column,row)=0) Then temp$=temp$+" " Next column Print #1,temp$ Next row next numchar If addchar=0 Then GoSub Insert_Char_now Close #1 GoSub Clear_box Print @(270,20)"save ok" Return Load_font: GoSub Clear_box Print @(270,20)" " Print @(270,20); Input "Filename to load : ",fname$ If (Right$(fname$,3)<>"fnt") Then fname$=fname$+".fnt" Insert_Load_Font: Open fname$ For input As #2 typefile$="load" On MM.Errno GoTo No_sd_card, Card_protected, no_space_left, All_root_gone, Invalid_filename, Cannot_find_file Line Input #2,temp$ Erase values Dim values(4) pointer=1: fwidth =0: fheight=0 :fnumber=0 :fstart=0 For a= 1 To Len(temp$) a$=Mid$(temp$,a,1) If (a$=",") Then values(pointer)=Val(rwidth$) pointer=pointer+1 rwidth$="" Else rwidth$=rwidth$+a$ EndIf Next a values(4)= Val(rwidth$) fwidth=values(2) fheight=Val(temp$) fstart=values(3) fnumber=values(4)-values(3)+1 Erase plot GoSub My_pause Dim plot(fnumber,fwidth,fheight) GoSub My_pause For a= 1 To fnumber For c=1 To fheight Line Input #2,temp$ For b=1 To fwidth If (Mid$(temp$,b,1)=Chr$(32)) Then plot(a,b,c)=0 Else plot(a,b,c)=1 EndIf Next b next c next a Close #2 GoSub Clear_box Print @(270,20)"load ok" GoSub UpdateFontDetails GoTo Setupgrid Char_up: If (charxy =1) Then 'rem do nothing Else charxy=charxy-1 GoSub update_char_number GoSub Displayfontchar EndIf Return Char_down: If (charxy =fnumber) Then 'rem do nothing Else charxy=charxy+1 GoSub update_char_number GoSub Displayfontchar EndIf Return Displayfontchar: Line (52,292)-(52+fwidth,292+fheight),0,BF a=charxy If (a=0) Then a=1 cursorx=7*min_x+2 : cursory=105 plotx=1 :ploty=1 For c=1 To fheight For b=1 To fwidth tempx=cursorx+(b-1)*screenstepx tempy=cursory+(c-1)*screenstepy temp2x=tempx+box_x temp2y=tempy+box_y If (plot(a,b,c)=0) Then Line (tempx,tempy)-(temp2x,temp2y),0,BF Else Line (tempx,tempy)-(temp2x,temp2y),1,BF Pixel(52+b,292+c)=1 EndIf Next b next c GoSub update_char_number Return UpdateFontDetails: Print @(100,15) " " @(20,15)"Width ";fwidth Print @(50,30) " " @(20,30)"Height ";fheight Print @(130,45) " " @(20,45)"Characters in Set ";fnumber Print @(80,60) " "@(20,60)"Start Character ";fstart Return Instructions: Print @(10,110)"Move --- Cursor keys" Print @(10,125)"Set ___ Left Alt." Print @(10,140)"Erase --- Space" Print @(10,155)"Load --- l or L" Print @(10,170)"Save --- s or S" Print @(10,185)"Char Up ___ +" Print @(10,200)"Char Down --- -" Print @(10,215)"Add Char ___ Insert" Print @(10,230)"Copy Char ___ c or C" Print @(10,245)"Flip Vert. ___ v or V" Print @(10,260)"Flip Horiz.___ h or H" Print @(10,275)"Exit ___ e or E" Line (4,290)- (6*min_x-2,max_y-6),1,B Print @(10,300)"Pixel" @(10,320)"Size" Line (50,291)-(6*min_x-4,max_y-70),0,BF Line (50,290)-(50+fwidth+4,290+fheight+4),1,B Print @(30,Max_y-65)"Code Written by" Print @(15,Max_y-45)"Dennis Wyatt "; Font Load "copyr.fnt" As #6 Font #6 Print " "; Font #1 Font unload #6 Print " 2011" Print @(15,Max_y-25)"dpwyatt@iinet.net.au" Return My_pause: 'pause routine for array erasure completion Timer=0 Do While timertemp<3000 timertemp=Timer Loop Return No_sd_card: Print @(270,40)"ERROR -No SD Card present" Print @(270,55)"Please insert card and re-enter" Print @(270,70)"Filename at the prompt above" Pause 2000 If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Card_protected: Print @(270,40)"Card is Write Protected" Print @(270,55)"Please write enable and re-enter" Print @(270,70)"Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf no_space_left: Print @(270,40)"not enough space" Print @(270,55)"Please rectify and re-enter" Print @(270,70)"Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf All_root_gone: Print @(270,40)"All root dir. taken" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Invalid_filename: Print @(270,40)"Invalid Filename" Print @(270,55)"Please rectify and re-enter" Print @(270,70)"Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Cannot_find_file: Print @(270,40)"Cannot find File" Print @(270,55)"Please re-enter" Print @(270,70)"Filename at the prompt above" If (typefile$="save") Then GoTo Save_font Else GoTo Load_font EndIf Insert_char: ' insert character function addchar=0 savename$="temp.fnt" GoSub Insert_save_font fname$="temp.fnt" GoSub Insert_Load_Font addchar=1 Kill "temp.fnt" Return Insert_Char_now: temp$="" For column=1 To fwidth temp$=temp$+" " Next column For row = 1 To fheight Print #1,temp$ Next row Return Clear_box: Line (270,20)-(19*min_x,80),0,bf Return Copy_char: ' Copy function GoSub Clear_box Copy_input1_error: Print @(270,20); Input "Copy which Character # ";copychar If copychar>fnumber Then Print @(270,35)"Not that many Char." GoTo Copy_input1_error EndIf Copy_input2_error: Print @(270,35); Input "To which Character # ";tochar If tochar>fnumber Then Print @(270,50) "Not that many Char." GoTo Copy_input2_error EndIf For copy1= 1 To fwidth For copy2= 1 To fheight plot(tochar,copy1,copy2)=plot(copychar,copy1,copy2) Next copy2 Next copy1 Print @(270,50)" " Print @(270,50)"done" Return Vertical_flip: ' flip vertical function For flipV = 1 To Int(fheight/2) For flipV1 = 1 To fwidth flipvtemp=plot(charxy,flipV1,flipV) plot(charxy,flipV1,flipV)=plot(charxy,flipV1,fheight-flipV+1) plot(charxy,flipV1,fheight-flipV+1)=flipvtemp Next flipV1 Next flipV GoSub Clear_box Print @(270,20)"Vertical Flip Done" GoSub Displayfontchar Return horizontal_flip: ' flip horizontal function For flipH = 1 To Int(fwidth/2) For flipH1 = 1 To fheight fliphtemp=plot(charxy,flipH,flipH1) plot(charxy,flipH,flipH1)=plot(charxy,fwidth-flipH+1,flipH1) plot(charxy,fwidth-flipH+1,flipH1)=fliphtemp Next fliph1 Next flipH GoSub Clear_box Print @(270,20)"Horizontal Flip Done" GoSub Displayfontchar Return