1000 '*** DOWNLOAD.BAS *** MBASIC *** Kaypro II *** Versie 2.0 29-06-'84 *** 1010 ' 1020 ' J.R. Ferguson , Rotterdam 1030 ' 1040 ' HULPPROGRAMMA VOOR HET ONTWERPEN, OPSLAAN EN DOORGEVEN VAN ZELF 1050 ' GEDEFINIEERDE KARAKTERS VOOR EEN PRINTER ('DOWNLOAD CHARACTERS') 1060 ' Instelbaar voor de volgende printers: 1070 ' 1. Epson FX-80 1080 ' 2. Star Gemini-10X 1090 ' 1100 ' Microsoft BASIC-80 release 5.0 (extended or disk version) 1110 ' karaktercode: ASCII 1120 ' Voor verdere dokumentatie: zie achteraan het programma. 1130 ' 1140 DEFSTR A,C,F,H,P,W 1150 DEFINT B,E,G,I-L,N,R,T 1160 ' 1170 '==> HIER PRINTERTYPE INSTELLEN 1180 ' 1 : Epson FX-80 1190 ' 2 : Star Gemini-10X 1200 TYP=1 1210 ' 1220 '==> INTERPRETERVERSIE (0=nee,1=ja) 1230 INTERPRETER=0 1240 ' 1250 '==> TESTVERSIE (0=nee,1=ja) 1260 TEST=0 1270 ' 1280 ' FUNCTIES ALGEMEEN 1290 ' 1300 DEF FNAT(R,K)=C.ESC+"="+CHR$(55-R)+CHR$(32+K) 'plaats cursor 1310 DEF FNPR =FNAT(R.PR,0)+C.CES 'nieuwe prompt 1320 DEF FNB.BSY=(INP(N.PSTA) XOR B.PBSYLOW) AND N.PBSY 'printer busy 1330 DEF FNB.EXP(N)=(N AND &H80)<32 'code expansion 1340 DEF FNFILS =FNAT(R.FIL,K.FIL)+"file : "+FILS+C.CEL 1350 DEF FNCS.LN=FNAT(R.LN0,K.LI-1)+"-"+FNAT(R.LN0,K.RE+1)+"-" +FNAT(R.LN1,K.LI-1)+"-"+FNAT(R.LN1,K.RE+1)+"-" 'richtlijntjes 1360 ' 1370 ' FOUTBERICHTEN 1380 ' 1390 DEF FNF.INV =F.1+"Invoerfout" 1400 DEF FNF.DEF =F.1+"Er is (nog) geen karakter gedefinieerd!" 1410 DEF FNF.COD =F.1+"Geen karaktercode opgegeven" 1420 DEF FNF.BER(N)=F.1+"Code"+STR$(N)+" (dec) buiten het toegestane gebied" +" ("+STR$(N.MIN)+" -"+STR$(N.MAX)+" dec)" 1430 DEF FNF.KWY =F.1+"Karakterdefinitie gewijzigd" 1440 DEF FNF.PR0 =F.1+"Patroon moet binnen de opgegeven grenzen liggen" 1450 DEF FNF.PR1 =F.1+"Minimum breedte 5 posities" 1460 DEF FNF.GK(N) =F.1+"Geen karakters gedefinieerd na code"+STR$(N)+" dec" 1470 DEF FNF.BFN(F)=F.1+"Filenaam "+F+" onjuist : probeer het nog eens" 1480 DEF FNF.FNF(F)=F.1+"Geen file "+F+" aanwezig" 1490 DEF FNF.FAE(F)=F.1+"File " +F+" bestaat al" 1500 DEF FNF.EMP(F)=F.1+"File " +F+" is leeg !" 1510 DEF FNF.FRO(F)=F.1+"File " +F+" is 'Read only'" 1520 DEF FNF.VOL=F.1+"Disk is vol !" 1530 DEF FNF.ONL=F.1+"Zet printer on-line" 1540 DEF FNF.KV =F.1+"Kies uit onderstaand menu" 1550 DEF FNF.KS =F.1+"Kies uit onderstaand menu" 1560 ' 1570 ' ARRAYDIMENSIONERING 1580 ' 1590 DIM PP(256) 'karakterpatronen packed (elk K.MAX+1 byte) 1600 DIM PU(8) 'karakterpatronen unpacked (per regel K.MAX karakters) 1610 DIM CM.TST(11) 'commandostrings voor printertest 1620 ' 1630 ' PROGRAMMAVOORBEREIDING EN ERROR TRAP 1640 ' 1650 GOSUB 7390 'lees konstanten 1660 ON ERROR GOTO 1690 1670 GOTO 4140 'naar hoofdmenu 1680 ' 1690 CLOSE:IF N.ERR>0 THEN ON N.ERR GOTO 4630,4780,4960,5470 1700 ON ERROR GOTO 0 1710 ' 1720 ' ALGEMEEN GEREEDSCHAP 1730 ' 1740 '+ 1750 '+ LAADT OBJECT MODULE CS.OBJ 1760 '+ in : CS.OBJ bevat hexadecimale codering met 1770 '+ positie 1-3: startadres, tevens laadadres 1780 '+ positie 4- : inhoud 1790 '+ uit: N0 (startadres) lok: I,N 1800 '+ 1810 N0=VAL("&H"+MID$(CS.OBJ,1,4)):I=4 1820 FOR N=N0 TO N0+LEN(CS.OBJ)\2-2 1830 POKE N,VAL("&H"+MID$(CS.OBJ,I,2)):I=I+2 1840 NEXT N 1850 RETURN 1860 '+ 1870 '+ WIS HUIDIG PATROON 1880 '+ 1890 B.DES=0:N.PLI=1:N.PRE=K.MAX:B.FWY=B.FWY OR B.KAR:B.KWY=0:B.KAR=0 1900 FOR I=1 TO R.MAX:PU(I)=CS.UIT:NEXT I:RETURN 1910 '+ 1920 '+ WIS ALLE KARAKTERDEFINITIES 1930 '+ 1940 B.DEF=0:B.EXP=0:B.FWY=B.FIL:B.FIL=0:N.COD=0:B.COD=0:FILS="" 1950 FOR I=0 TO N.MAX:PP(I)="":NEXT I 1960 GOSUB 1870 'wis huidig patroon 1970 GOSUB 3450 'laat blanko patroon zien 1980 GOSUB 3170 'wis karaktercode 1990 GOSUB 3400 'wis filenaam 2000 RETURN 2010 '+ 2020 '+ INVOER FILENAAM met hoofdletterconversie 2030 '+ en evt. toevoeging van default filetype 2040 '+ uit: F,FCB lok: C,I,I1,I2 2050 '+ 2060 FCB="" 2070 PRINT FNPR;:LINE INPUT;"Geef filenaam : ";F:IF F="" THEN RETURN 2080 FOR I=1 TO LEN(F) 'hoofdletterconversie 2090 C=MID$(F,I,1):IF C>="a" AND C<="z" THEN MID$(F,I,1)=CHR$(ASC(C)-32) 2100 NEXT I 2110 IF INSTR(F,".")=0 THEN F=F+CS.EXT 2120 I1=INSTR(F,":"):I2=INSTR(F,".") 2130 FCB=STRING$(36,0):MID$(FCB,2,11)=SPACE$(11) 2140 IF I1 THEN MID$(FCB,1,1)=CHR$(ASC(MID$(F,1))-ASC("A")+1) 2150 IF I2-I1>0 THEN MID$(FCB,2,8)=MID$(F,I1+1,I2-I1-1) 2160 MID$(FCB,10,3)=MID$(F,I2+1) 2170 RETURN 2180 '+ 2190 '+ PRINTER ON-LINE ? 2200 '+ uit: B.ERR 2210 '+ 2220 IF FNB.BSY THEN GOSUB 2250 2230 RETURN 2240 '+ 2250 B.ERR=-1:PRINT FNF.ONL; 2260 WHILE FNB.BSY:WEND:RETURN 2270 '+ 2280 '+ TRANSPARANTE UITVOER NAAR PRINTER 2290 '+ in : P uit te voeren string lok: I,N0 2300 '+ 2310 IF INSTR(P,C.TAB)=0 THEN LPRINT P;:RETURN 2320 FOR I=1 TO LEN(P) 2330 WHILE FNB.BSY:WEND 'buffer clear ? 2340 OUT N.PDAT,ASC(MID$(P,I,1)) 'data out 2350 N0=INP(N.PSTA) 2360 OUT N.PSTA,(N0 OR N.PSTR) XOR B.PSTRLOW 'strobe 2370 OUT N.PSTA,(N0 AND NOT N.PSTR) XOR B.PSTRLOW 2380 NEXT I 2390 RETURN 2400 '+ 2410 '+ INVOER KARAKTERCODE 2420 '+ uit: N.COD,B.COD,B.KWY,B.KAR,B.ERR lok: A,B,C,CS,I,N,N0 2430 '+ 2440 IF NOT(B.COD AND B.KWY) THEN 2480 2450 B.ERR=-1 2460 PRINT FNF.KWY;FNPR;"Eerst onder deze code vastleggen ?";:GOSUB 2900 2470 IF J THEN GOSUB 3880 2480 N0=N.COD ' bewaar huidige code 2490 PRINT FNPR;"GEEF KARAKTERCODE of ontsnap met " 2500 PRINT "ecimaal exadecimaal arakter : "; 2510 CS="DHK"+C.ESC:GOSUB 2990 2520 IF B.ERR THEN PRINT F.0;:B.ERR=0 2530 IF N=4 THEN N.COD=N0:RETURN 2540 PRINT FNPR;"GEEF KARAKTERCODE "; 2550 B=0:ON N GOSUB 2630,2690,2750 2560 B.ERR=0:PRINT F.0;:IF B THEN B.ERR=-1:PRINT FNF.INV;:GOTO 2490 2570 IF N.COD>=N.MIN AND N.COD<=N.MAX THEN 2600 2580 B.ERR=-1:PRINT FNF.BER(N.COD); 2590 GOTO 2490 2600 B.COD=-1:GOSUB 3170 'laat code zien 2610 RETURN 2620 '+ decimaal 2630 INPUT; "decimaal : ",A:IF A="" THEN PRINT C.CR;C.CES;:GOTO 2630 2640 GOSUB 2860:IF LEN(A)>3 THEN B=-1:RETURN 2650 FOR I=1 TO LEN(A):IF INSTR(CS.DI,MID$(A,I,1))=0 THEN B=-1 2660 NEXT I:IF B THEN RETURN ELSE N.COD=VAL(A) 2670 RETURN 2680 '+ hexadecimaal 2690 INPUT; "hexadecimaal : ",A:IF A="" THEN PRINT C.CR;C.CES;:GOTO 2690 2700 GOSUB 2860:IF LEN(A)>2 THEN B=-1:RETURN 2710 FOR I=1 TO LEN(A):IF INSTR(CS.HX,MID$(A,I,1))=0 THEN B=-1 2720 NEXT I:IF B THEN RETURN ELSE N.COD=VAL("&H"+A) 2730 RETURN 2740 '+ karakter 2750 PRINT "karakter"; 2760 IF TYP=1 THEN PRINT " [ voor alternatieve groep eerst ]"; 2770 PRINT " : "; 2780 N=0:ON TYP GOTO 2790,2810 2790 C="":WHILE C="":C=INKEY$:WEND 2800 IF C=C.ESC THEN N=128:PRINT C.ALT;C.BS; ELSE 2820 2810 C="":WHILE C="":C=INKEY$:WEND 2820 N=N+ASC(C):GOSUB 3280:PRINT CKAR; 2830 N.COD=N:RETURN 2840 '+ verwijder spaties, tabs, linefeeds en een eventueel plusteken aan 2850 ' het begin van string A 2860 WHILE INSTR(" "+C.TAB+C.LF,LEFT$(A,1)):A=MID$(A,2):WEND 2870 IF LEFT$(A,1)="+" THEN A=MID$(A,2) 2880 RETURN 2890 '+ 2900 '+ INVOER J/N 2910 '+ uit: J (Boolean) lok: C,N 2920 '+ 2930 PRINT " (J/N) : "; 2940 C="":WHILE C="":C=INKEY$:WEND 2950 N=INSTR("JjNn",C):IF N THEN J= N<3 ELSE PRINT C.BEL;:GOTO 2940 2960 IF J THEN PRINT "ja "; ELSE PRINT "nee "; 2970 RETURN 2980 '+ 2990 '+ KIES UIT MENU 3000 '+ in: CS,B.ERR uit: N,B.ERR lok: C 3010 '+ 3020 C="":WHILE C="":C=INKEY$:WEND 3030 IF C>="a" AND C<="z" THEN C=CHR$(ASC(C) AND &HDF) '==> hoofdletter 3040 N=INSTR(CS,C):IF N=0 THEN PRINT C.BEL;:GOTO 3020 3050 RETURN 3060 '+ 3070 '+ BEELDT ATRIBUUT AF 3080 '+ in : B.DES,N.PLI,N.PRE 3090 '+ lok: A 3100 '+ 3110 A=SPACE$(K.MAX):MID$(A,N.PLI,1)="[":MID$(A,N.PRE,1)="]" 3120 PRINT FNAT(R.ATR,K.LI);A;:RETURN 3130 '+ 3140 '+ DRUK HUIDIGE KARAKTERCODE AF OP CONSOLE 3150 '+ in: B.COD,N.COD lok: N,CDEC,CHEX,CKAR 3160 '+ 3170 PRINT FNAT(R.COD,K.COD);C.CEL;:IF NOT B.COD THEN RETURN 3180 N=N.COD:GOSUB 3280 'vertaal naar dec/hex/kar strings 3190 PRINT "code : ";CDEC;" dec, ";CHEX;" hex, kar ";CKAR;:RETURN 3200 '+ 3210 '+ DRUK KARAKTERCODE AF OP PRINTER 3220 '+ in: N lok: N0,CDEC,CHEX,CKAR 3230 '+ 3240 GOSUB 3280:LPRINT CDEC;"d ";CHEX;"h, kar ";CKAR; 3250 IF TYP=2 THEN LPRINT:LPRINT SPC(18); 3260 LPRINT ": ";:RETURN 3270 '+ 3280 '+ VERTAAL KARAKTERCODE NAAR DEC STRING, HEX EN KARAKTER 3290 '+ in: N uit: CDEC,CHEX,CKAR lok: N0 3300 '+ 3310 CDEC=MID$(STR$(N),2):WHILE LEN(CDEC)<3:CDEC="0"+CDEC:WEND 3320 CHEX=HEX$(N):IF LEN(CHEX)=1 THEN CHEX="0"+CHEX 3330 N0=N 3340 IF N0>127 THEN CKAR=C.ALT:N0=N0-128 ELSE CKAR=" " 3350 IF N0=127 THEN CKAR=CKAR+"" 3360 IF N0>31 AND N0<127 THEN CKAR=CKAR+CHR$(N0) 3370 IF N0<32 THEN CKAR=CKAR+C.CTR+CHR$(N0+64) 3380 RETURN 3390 '+ 3400 '+ LAAT FILENAAM ZIEN 3410 '+ 3420 IF B.FIL THEN PRINT FNFILS; ELSE PRINT FNAT(R.FIL,K.FIL);C.CEL; 3430 RETURN 3440 '+ 3450 '+ LAAT HUIDIG KARAKTERTPATROON ZIEN 3460 '+ in : PU() lok: C,I,J 3470 '+ 3480 IF B.DES THEN I=R.TOP-R.DES+1 ELSE I=R.BOT 3490 FOR J=I TO I+R.DES-1:PRINT FNAT(J,K.LI);CS.DMY:NEXT J 3500 IF B.DES THEN I=R.BOT-1 ELSE I=R.BOT+R.DES-1 3510 FOR J=1 TO R.MAX:PRINT FNAT(I+J,K.LI);PU(J):NEXT J 3520 IF TYP=1 THEN GOSUB 3070 'attribuut 3530 RETURN 3540 '+ 3550 '+ BEPAAL OF ER KARAKTERS ZIJN GEDEFINIEERD 3560 '+ in : PP() uit: B.DEF lok: I 3570 '+ 3580 I=0:WHILE PP(I)="":I=I+1:WEND:B.DEF=I1 THEN RETURN 3640 I= 0:J= 32:GOSUB 3670 3650 I=128:J=160:GOSUB 3670 3660 RETURN 3670 '+ 3680 WHILE NOT B.EXP AND I"":I=I+1:WEND:RETURN 3690 '+ 3700 '+ UNPACK KARAKTERDEFINITIE 3710 '+ in : PP(), N.COD uit: B.DES, N.PLI, N.PRE, PU() lok: I,J,J0,J1,N,P 3720 '+ 3730 IF NOT B.COD THEN GOSUB 2410 'vraag code 3740 P=PP(N.COD):IF P="" THEN GOSUB 1870:GOTO 3810 3750 B.KAR=-1:B.KWY=0:N=ASC(P) 3760 ON TYP GOSUB 3830,3850 3770 FOR I=1 TO R.MAX:PU(I)=CS.UIT:NEXT I 3780 FOR I=1 TO K.MAX:N=ASC(MID$(P,I+1)) 3790 FOR J=J0 TO J1 STEP SGN(J1-J0):IF N MOD 2 THEN MID$(PU(J),I,1)=C.AAN 3800 N=N\2:NEXT J,I 3810 GOSUB 3450 'laat patroon zien 3820 RETURN 3830 '+ Epson 3840 N.PRE=N MOD 16:N=N\16:N.PLI=N MOD 8+1:B.DES= N\8=0:J0=1:J1=R.MAX:RETURN 3850 '+ Star 3860 B.DES=-N:J0=R.MAX:J1=1:RETURN 3870 '+ 3880 '+ PACK KARAKTERDEFINITIE 3890 '+ in: B.DES, N.PLI, N.PRE, PU() uit: PP() lok: I,J,J0,J1,N,P 3900 '+ 3910 IF NOT B.COD THEN GOSUB 2410 'vraag code 3920 IF NOT B.COD THEN RETURN 3930 PRINT W.V; 3940 IF NOT B.KAR THEN PP(N.COD)="":GOSUB 3550:GOSUB 3600:PRINT W.0;:RETURN 3950 ON TYP GOSUB 4000,4030 3960 FOR I=1 TO K.MAX:N=0:FOR J=J0 TO J1 STEP SGN(J1-J0) 3970 N=2*N-(MID$(PU(J),I,1)=C.AAN):NEXT J:P=P+CHR$(N):NEXT I 3980 PP(N.COD)=P:B.FWY=B.FIL:B.DEF=-1:B.KWY=0 3990 PRINT W.0;:RETURN 4000 '+ Epson 4010 P=CHR$(128 *(B.DES+1) + 16*(N.PLI-1) + N.PRE):J0=R.MAX:J1=1 4020 B.EXP=FNB.EXP(N.COD):RETURN 4030 '+ Star 4040 P=CHR$(-B.DES):J0=1:J1=R.MAX:RETURN 4050 '+ 4060 '+ DEBUG ROUTINE : Laat globale variabelen zien 4070 '+ 4080 PRINT C.CHM; 4090 PRINT "B.ERR=";B.ERR;"N.ERR=";N.ERR;"B.FIL=";B.FIL;"B.FWY=";B.FWY; 4100 PRINT "B.DEF=";B.DEF;"B.EXP=";B.EXP;"B.KAR=";B.KAR;"B.KWY=";B.KWY; 4110 PRINT "B.COD=";B.COD; 4120 RETURN 4130 ' 4140 ' HOOFDMENU 4150 ' 4160 B.ERR=0:B.FIL=0:B.FWY=0:B.DEF=0:B.EXP=0:B.KAR=0:B.KWY=0:B.COD=0:N.ERR=0 4170 FILS="":PP(N.MAX+1)=C.SEN 4180 WIDTH 255:WIDTH LPRINT 255 4190 GOSUB 1870 'wis huidig patroon 4200 PRINT C.CLR;"DOWNLOAD "; 4210 IF TYP=1 THEN PRINT "EPSON FX-80"; 4220 IF TYP=2 THEN PRINT "STAR GEMINI-10X"; 4230 IF INTERPRETER=0 THEN PRINT " - PORTIONS COPYRIGHTED BY MICROSOFT, 1981" 4240 GOSUB 3450:PRINT FNCS.LN 'laat patroon + richtlijntjes zien 4250 GOSUB 3400:GOSUB 3170 'laat filenaam + code zien 4260 IF TEST THEN GOSUB 4060 4270 PRINT FNPR;W.M0 4280 PRINT "nformatie over dit programma" 4290 PRINT "ile overzicht" 4300 PRINT "ees karakterdefinities uit file" 4310 PRINT "chrijf karakterdefinities naar file" 4320 PRINT "ieuwe definities" 4330 PRINT "ode : geef (nieuwe) karaktercode op" 4340 PRINT "oek eerstvolgend patroon" 4350 PRINT "ijzig patroon" 4360 PRINT "

rinter : stuur karakterdefinities en maak proefafdruk "; 4370 CS="IFLSNCZWP"+C.ESC:GOSUB 2990:IF B.ERR THEN PRINT F.0;:B.ERR=0 4380 IF N<3 THEN ON N GOSUB 4480,4680:IF B.ERR THEN 4260 ELSE 4200 4390 IF N=10 THEN 4420 4400 ON N-2 GOSUB 4830,5310,5730,5820,5880,5990,6730:GOTO 4260 4410 '+ exit 4420 PRINT W.E; 4430 IF NOT B.DEF OR B.FIL AND NOT B.FWY THEN 4460 4440 PRINT FNPR;"Mogen de gemaakte wijzigingen verloren gaan ?"; 4450 GOSUB 2900:IF NOT J THEN B.ERR=-1:PRINT FNF.KS;:GOTO 4260 4460 PRINT FNPR;W.E;:WIDTH 80:WIDTH LPRINT 132:ON ERROR GOTO 0:END 4470 ' 4480 ' INFORMATIE OVER DIT PROGRAMMA 4490 ' 4500 PRINT W.I; 4510 N.ERR=1 4520 OPEN "I",#1,CS.HLP:IF EOF(1) THEN ERROR E.EMP 4530 PRINT C.CLR;:N=0 4540 WHILE N<22 AND NOT EOF(1):LINE INPUT #1,R$:PRINT R$:N=N+1:WEND 4550 PRINT FNAT(1,0);STRING$(78,"-") 4560 PRINT " DRUK OP DE SPATIEBALK OM VERDER TE LEZEN"; 4570 PRINT ", OF STOP MET DE TOETS "; 4580 C="":WHILE C="":C=INKEY$:WEND 4590 IF INSTR(C.CR+" ",C)=0 THEN PRINT C.BEL;:GOTO 4580 4600 IF C=" " AND NOT EOF(1) THEN 4530 4610 CLOSE #1 4620 N.ERR=0:RETURN 4630 '+ error trap 1 4640 IF ERR=E.FNF THEN B.ERR=-1:PRINT FNF.FNF(CS.HLP);:B=-1:RESUME 4620 4650 IF ERR=E.EMP THEN B.ERR=-1:PRINT FNF.EMP(CS.HLP);:B=-1:RESUME 4620 4660 ON ERROR GOTO 0 4670 ' 4680 ' FILE DIRECTORY OVERZICHT 4690 ' 4700 PRINT W.F;"[ RETURN = *";CS.EXT;" ]" 4710 GOSUB 2020 'vraag filenaam masker 4720 IF F="" THEN F="*"+CS.EXT 4730 PRINT W.F;F;FN PR 4740 N.ERR=2:WIDTH 80:FILES F:PRINT 4750 PRINT:PRINT "Verder met willekeurige toets "; 4760 WHILE INKEY$="":WEND:PRINT F.0; 4770 WIDTH 255:N.ERR=0:RETURN 4780 '+ error trap 2 4790 IF ERR=E.BFN THEN PRINT FNF.BFN(F);:B.ERR=-1:RESUME 4710 4800 IF ERR=E.FNF THEN PRINT FNF.FNF(F);:B.ERR=-1:RESUME 4770 4810 ON ERROR GOTO 0 4820 ' 4830 ' LEES KARAKTERDEFINITIES UIT FILE 4840 ' 4850 PRINT W.L; 4860 IF NOT B.DEF THEN B.FWY=0:GOTO 4890 4870 PRINT FNPR;"Huidige definities uitwissen ?";:GOSUB 2900 4880 IF J THEN GOSUB 1940:B.FWY=0 ELSE B.FWY=-1 4890 N.ERR=3 4900 GOSUB 2070:IF F="" THEN PRINT W.0;:RETURN 'vraag filenaam 4910 OPEN "I",#1,F:IF EOF(1) THEN ERROR E.EMP ELSE CLOSE #1 'file aanwezig ? 4920 IF FILS="" THEN FILS=F ELSE IF INSTR(FILS,F)=0 THEN FILS=FILS+","+F 4930 PRINT FNFILS;W.L;:GOSUB 5020 'lees karakterpatronen 4940 B.COD=-1:N.COD=0:GOSUB 5880 'zoek eerste patroon 4950 N.ERR=0:RETURN 4960 '+ error trap 3 4970 IF ERR=E.BFN THEN B.ERR=-1:PRINT FNF.BFN(F);:RESUME 4900 4980 IF ERR=E.FNF THEN B.ERR=-1:PRINT FNF.FNF(F);:RESUME 4950 4990 IF ERR=E.EMP THEN B.ERR=-1:PRINT FNF.EMP(F);:RESUME 4950 5000 ON ERROR GOTO 0 5010 '+ 5020 '+ LEES KARAKTERDEFINITIES 5030 '+ in : F filenaam 5040 '+ uit: PP() gelezen karakterdefinities 5050 '+ B.FIL,B.FWY,B.DEF,B.ERR 5060 '+ lok: B karakterdefinitie in invoer 5070 '+ B.E interne foutkonditie 5080 '+ C laatst gelezen karakter ("fielded") 5090 '+ P karakterpatroon 5100 '+ I,N,N1,N2 indices 5110 '+ 5120 OPEN "R",#1,F,1:FIELD #1,1 AS C 5130 I=0:B.E=0 'zoek download definitie commando 5140 GET #1:I=I+1:B= C=MID$(CM.DD,I,1):IF B AND IC.EOF THEN 5130 5170 CLOSE #1:GOSUB 3550:GOSUB 3600 'bepaal B.DEF en B.EXP 5180 RETURN 5190 '+ lees download definitie 5200 GET #1:N1=ASC(C) 'lees begincode 5210 IF N1N.MAX THEN 5270 5220 IF TYP=1 THEN GET #1:N2=ASC(C) 'lees eindcode 5230 IF TYP=2 THEN N2=N1 5240 P0=STRING$(K.MAX+1,0) 5250 FOR N=N1 TO N2:P=P0:FOR I=1 TO K.MAX+1:GET #1:MID$(P,I,1)=C:NEXT I 5260 PP(N)=P:B.FIL=-1:B.DEF=-1:NEXT N:RETURN 5270 '+ karaktercode buiten toegestane bereik 5280 B.ERR=-1:PRINT FNF.BER(N1);FNPR;"Verder lezen ?";:GOSUB 2900:B.E=NOT J 5290 RETURN 5300 ' 5310 ' SCHRIJF KARAKTERDEFINITIES NAAR FILE 5320 ' 5330 IF NOT B.DEF THEN PRINT FNF.DEF;:RETURN 5340 PRINT W.S; 5350 GOSUB 2070:IF F="" THEN PRINT W.0;:RETURN 'vraag filnaam 5360 N.ERR=4:OPEN "I",#1,F:CLOSE #1 'test of file al bestaat 5370 IF INTERPRETER THEN CS.OBJ=CS.GETFCB:GOSUB 1750:GETFCB=N0 'laadt GETFCB 5380 CS.DMA=STRING$(128,0):CALL GETFCB(FCB,CS.DMA):N=ASC(CS.DMA) 5390 IF N=&HFF THEN ERROR E.BFN 5400 IF ASC(MID$(CS.DMA,N*32+10)) AND &H80 THEN ERROR E.FRO 5410 PRINT FNF.FAE(F); 5420 PRINT FNPR;"Mag ";F;" worden overschreven ?";:GOSUB 2900 5430 IF J THEN B.ERR=-1 ELSE PRINT F.0;:RETURN 5440 FILS=F:PRINT FNFILS;W.S;:GOSUB 5540 'schrijf karakterpatronen weg 5450 B.FIL=-1:B.FWY=0:PRINT W.0;:N.ERR=0 5460 RETURN 5470 '+ error trap 4 5480 IF ERR=E.FNF THEN RESUME 5440 5490 IF ERR=E.BFN THEN B.ERR=-1:PRINT FNF.BFN(F);:RESUME 5350 5500 IF ERR=E.DF THEN B.ERR=-1:PRINT FNF.VOL ;:RESUME 5460 5510 IF ERR=E.FRO THEN B.ERR=-1:PRINT FNF.FRO(F);:RESUME 5460 5520 ON ERROR GOTO 0 5530 '+ 5540 '+ SCHRIJF KARAKTERDEFINITIES WEG 5550 '+ in : PP() karakterdefinities 5560 '+ F filenaam 5570 '+ lok: I,N,N1,N2 indices 5580 '+ N.BYT byte teller 5590 '+ 5600 OPEN "O",#1,F:PRINT #1,CM.CC;:N.BYT=1+LEN(CM.CC):N1=N.MIN 5610 IF B.EXP THEN PRINT #1,CM.EXP;:N.BYT=N.BYT+LEN(CM.EXP) 5620 WHILE PP(N1)="":N1=N1+1:WEND 5630 IF N1"" AND N2N.MAX THEN 5970 5920 PRINT W.Z;:WHILE PP(N)="":N=N+1:WEND:IF N>N.MAX THEN 5970 ELSE N.COD=N 5930 GOSUB 3700:GOSUB 3450:GOSUB 3170 'unpack, laat patroon + code zien 5940 PRINT W.0;:B.COD=-1:B.KAR=-1:B.KWY=0:RETURN 5950 '+ error escape 5960 B.ERR=-1:PRINT FNF.DEF;:RETURN 'geen definities 5970 B.ERR=-1:PRINT FNF.GK(N.COD);:RETURN 'geen karakters meer 5980 ' 5990 ' WIJZIG KARAKTERPATROON 6000 ' 6010 K0=K.LI-1:IF B.DES THEN R0=R.BOT-1 ELSE R0=R.BOT+R.DES-1 6020 R=1:K=1:B0=0:PRINT FNPR;W.M1 6030 IF TYP=1 THEN PRINT "[ en ] : grenzen proportional mode" 6040 PRINT " : descender ja/nee omhoog" 6050 PRINT " : karaktercode opgeven 8" 6060 PRINT " : dit patroon vastleggen links 4 6 rechts" 6070 PRINT " : nieuw patroon 2" 6080 PRINT " : zoek eerstvolgend patroon omlaag" 6090 PRINT " : exit naar hoofdmenu : punt aan/uit"; 6100 CS=C.RE+C.LI+C.OP+C.NE+C.CR+"DCVNZE" 6110 IF TYP=1 THEN CS=CS+"[]" 6120 IF TEST THEN GOSUB 4060 6130 PRINT FNAT(R0+R,K0+K);:GOSUB 2990 'kies uit menu 6140 IF B.ERR THEN PRINT F.0;FNAT(R0+R,K0+K);:B.ERR=0 6150 IF N=11 THEN 6190 6160 ON N GOSUB 6240,6270,6300,6330,6360,6400,6550, 6610,6630,6680,6190,6440,6490 6170 IF B0 THEN 6010 ELSE 6120 6180 '+ exit 6190 IF NOT B.KWY THEN RETURN 6200 PRINT FNPR;"Wilt U dit karakter vastleggen ?";:GOSUB 2900 6210 IF J THEN GOSUB 3880 6220 B.KWY=0:RETURN 6230 '+ rechts 6240 IF K1 THEN K=K-1 6280 RETURN 6290 '+ op 6300 IF R1 THEN R=R-1 6340 RETURN 6350 '+ punt aan/uit 6360 IF MID$(PU(R),K,1)=C.AAN THEN MID$(PU(R),K,1)=C.UIT:PRINT C.UIT;:B.KWY=-1:RETURN 6370 IF TYP=1 AND (KN.PRE) THEN B.ERR=-1:PRINT FNF.PR0;:RETURN 6380 MID$(PU(R),K,1)=C.AAN:PRINT C.AAN;:B.KAR=-1:B.KWY=-1:RETURN 6390 '+ descender ja/nee 6400 B.KAR=-1:B.KWY=-1:B.DES=NOT B.DES:GOSUB 3450 6410 IF B.DES THEN R0=R.BOT-1 ELSE R0=R.BOT+R.DES-1 6420 RETURN 6430 '+ linkergrens 6440 IF N.PRE-K<4 THEN B.ERR=-1:PRINT FNF.PR1;:RETURN 6450 I=1:WHILE ISTRING$(K-1,C.UIT) THEN B.ERR=-1:PRINT FNF.PR0;:RETURN 6470 N.PLI=K:B.DEF=-1:B.KAR=-1:B.KWY=-1:GOSUB 3070:RETURN 6480 '+ rechtergrens 6490 IF K-N.PLI<4 THEN B.ERR=-1:PRINT FNF.PR1;:RETURN 6500 J=K.MAX-K 6510 I=1:WHILE ISTRING$(J,C.UIT) THEN B.ERR=-1:PRINT FNF.PR0;:RETURN 6530 N.PRE=K:B.DEF=-1:B.KAR=-1:B.KWY=-1:GOSUB 3070:RETURN 6540 '+ karaktercode 6550 N.OUD=N.COD:GOSUB 2410 'vraag code 6560 IF N.COD=N.OUD OR PP(N.COD)="" THEN 6590 6570 PRINT FNPR;"Bestaande definitie overnemen ?";:GOSUB 2900 6580 IF J THEN PRINT W.G;:GOSUB 3700:B.KAR=-1:B.KWY=0:PRINT W.0; 6590 B0=-1:RETURN 6600 '+ vastleggen 6610 GOSUB 3880:B0=-1:RETURN 6620 '+ nieuw patroon 6630 IF NOT B.KWY THEN 6660 6640 PRINT FNPR;"Mag dit patroon verloren gaan ?";:GOSUB 2900 6650 IF NOT J THEN B0=-1:RETURN 6660 GOSUB 1870:GOSUB 3450:B0=-1:RETURN 'wis huidig patroon laat het zien 6670 '+ zoek volgend patroon 6680 IF NOT B.KWY THEN 6710 6690 PRINT FNPR;"Mag dit patroon verloren gaan ?";:GOSUB 2900 6700 IF NOT J THEN B.ERR=-1:PRINT FNF.KV;:B0=-1:RETURN 6710 GOSUB 5880:B0=-1:RETURN 'zoek patroon 6720 ' 6730 ' KARAKTERDEFINITIES NAAR PRINTER / PROEFAFDRUK 6740 ' 6750 IF NOT B.DEF THEN B.ERR=-1:PRINT FNF.DEF;:RETURN 6760 PRINT FNPR;"Proefafdruk ?";:GOSUB 2900:J0=J 6770 GOSUB 2190 'printer on-line ? 6780 PRINT W.P1;:P=CM.CC:GOSUB 2280:N1=N.MIN 'copy original characters 6790 IF B.EXP THEN LPRINT CM.EXP; 'expand printable code 6800 WHILE PP(N1)="":N1=N1+1:WEND 6810 IF N1"" AND N2N.MAX THEN 6980 6950 GOSUB 3240:P1=STRING$(3,N):IF N>127 THEN P1=CM.ALT+P1+CX.ALT 6960 P1=P1+" ":P=CM.TST(0):FOR T=1 TO CM.TST%:P=P+P1+CM.TST(T):NEXT T 6970 GOSUB 2280:N=N+1:GOTO 6940 'print patroon 6980 PRINT W.0;:RETURN 6990 ' 7000 ' DOKUMENTATIE / INITIALISATIE 7010 ' 7020 ' 7030 'SYSTEEM-AFHANKELIJKE FUNKTIES EN KONSTANTEN : 7040 'Ingesteld voor de Kaypro II microcomputer 7050 ' 7060 'cursorbesturing en speciale karakters: 7070 ' karakters C.CLR, C.CHM, C.BS, C.CEL, C.CES, C.AAN 7080 ' funkties FNAT en FNPR 7090 ' 7100 'indeling toetsenbord: 7110 ' C.LI, C.RE, C.OP, C.NE 7120 ' 7130 'indeling beeldscherm: 7140 ' gebaseerd op 24 regels van elk 80 kolommen 7150 ' R.PR, R.ERR, R.BOT, R.FIL en R.COD 7160 ' K.LI, K.RE, K.FIL en K.COD 7170 ' 7180 'printer uitvoer en handshaking 7190 ' N.PDAT, N.PSTA, N.PBSY, B.PBSYLOW, N.PSTR, B.PSTRLOW 7200 ' 7210 ' 7220 ' GLOBALE VARIABELEN 7230 ' 7240 'FILS filenamen ingelezxen karakterdefinities 7250 'B.ERR foutkonditie opgetreden 7260 'N.ERR foutafhandelingsgroep 7270 'B.FIL file ingelezen 7280 'B.FWY filegegevens gewijzigd 7290 'B.DEF karakters gedefinieerd 7300 'B.EXP printable code expansion nodig 7310 'B.KAR huidig karakter gedefinieerd 7320 'B.KWY huidig karakterpatroon gewijzigd 7330 'B.COD huidige karaktercode bekend 7340 'N.COD huidige karaktercode (dec) 7350 'B.DES wel/geen descender 7360 'N.PLI beginkolom proportionering 7370 'N.PRE eindkolom proportionering 7380 ' 7390 ' KONSTANTEN 7400 ' 7410 ' 7420 '+ regelnummers (0 = onderrand scherm) 7430 ' 7440 IF TYP=1 THEN R.MAX=8 'karakterhoogte 7450 IF TYP=2 THEN R.MAX=7 7460 IF TYP=1 THEN R.DES=1 'verplaatsing descender 7470 IF TYP=2 THEN R.DES=2 7480 R.PR =9 'promptregel 7490 R.ERR=R.PR+1 'foutbericht 7500 R.BOT=R.PR+4 'onderrand karakterpatroon inclusief descender 7510 R.TOP=R.BOT+R.DES+R.MAX-1 7520 R.ATR=R.BOT-1 7530 R.LN0=R.BOT+2 'onderste richtlijn 7540 R.LN1=R.LN0+4 'bovenste richtlijn 7550 R.FIL=R.BOT-1 'melding filenaam 7560 R.COD=R.BOT 'melding karaktercode 7570 ' 7580 '+ kolomnummers (0 = linkerrand scherm) 7590 ' 7600 IF TYP=1 THEN K.MAX=11 'karakterbreedte 7610 IF TYP=2 THEN K.MAX=9 7620 K.LI =7 'linkerrand karakterpatroon 7630 K.RE =K.LI+K.MAX-1 7640 K.FIL=K.RE+8 'melding filenaam 7650 K.COD=K.RE+8 'melding karaktercode 7660 ' 7670 '+ overige getalkonstanten 7680 ' 7690 E.BFN =64 'bad filename 7700 E.FNF =53 'file not found 7710 E.DF =61 'disk full 7720 E.FRO =254 'file is "read only" 7730 E.EMP =255 'empty file 7740 IF TYP=1 THEN N.MIN=0 'laagste karaktercode 7750 IF TYP=2 THEN N.MIN=32 7760 IF TYP=1 THEN N.MAX=255 'hoogste karaktercode 7770 IF TYP=2 THEN N.MAX=126 7780 N.PDAT=&H8 'printer data poort 7790 N.PSTA=&H1C 'printer status poort 7800 N.PBSY=&H8 'printer busy status bit (in) 7810 B.PBSYLOW=-1 '-1 = active low, 0 = active high 7820 N.PSTR=&H10 'printer strobe bit (uit) 7830 B.PSTRLOW=0 '-1 = active low, 0 = active high 7840 N.REC =128 'recordgrootte in bytes 7850 ' 7860 '+ karakters 7870 ' 7880 C.SEN="*" 'sentinel 7890 C.FIL=CHR$( 0) 'opvulkarakter 7900 C.BEL=CHR$( 7) 'waarschuwingssignaal 7910 C.CR =CHR$(13) 'carriage return 7920 C.LF =CHR$(10) 'line feed 7930 C.TAB=CHR$( 9) 'horizontal tab 7940 C.DC2=CHR$(18) 'device control 2 7950 C.DC4=CHR$(20) 'device control 4 7960 C.ESC=CHR$(27) 'escape 7970 C.EOF=CHR$(26) 'end of file markering 7980 C.SI =CHR$(15) 'shift in 7990 C.SO =CHR$(14) 'shift out 8000 C.BS =CHR$( 8) 'backspace 8010 C.LI ="4" 'toets voor 'links' 8020 C.RE ="6" 'toets voor 'rechts' 8030 C.OP ="8" 'toets voor 'omhoog' 8040 C.NE ="2" 'toets voor 'omlaag' 8050 C.CLR=CHR$(26) 'clear screen 8060 IF TEST THEN C.CHM=CHR$(30)'cursor home 8070 C.CEL=CHR$(24) 'clear to end of line 8080 C.CES=CHR$(23) 'clear to end of screen 8090 C.AAN=CHR$(31) 8100 C.UIT="+" 8110 C.DMY="x" 8120 C.CTR="^" 8130 C.ALT="." 8140 ' 8150 '+ karakterverzamelingen en strings 8160 ' 8170 CS.NL=C.CR+C.LF'new line 8180 CS.DI="0123456789" 8190 CS.HX=CS.DI+"ABCDEFabcdef" 8200 CS.UIT=STRING$(K.MAX,C.UIT) 8210 CS.DMY=STRING$(K.MAX,C.DMY) 8220 IF TYP=1 THEN CS.HLP="DLEPSON.HLP" 'filenaam info file 8230 IF TYP=2 THEN CS.HLP="DLSTAR.HLP" 8240 IF TYP=1 THEN CS.EXT=".DLE" 'type-aanduiding datafile 8250 IF TYP=2 THEN CS.EXT=".DLS" 8260 CS.GETFCB="0080D5E5EB235E23560E1ACD0500E1235E23560E11CD0500E1235E2356EB77C9" 8270 ' 8280 '+ printer commando's 8290 ' 8300 ON TYP GOTO 8320,8640 8310 ' 8320 ' Epson: 8330 ' 8340 CM.RC =C.ESC+"%"+CHR$(0)+CHR$(0) 'select ROM character group 8350 CM.DC =C.ESC+"%"+CHR$(1)+CHR$(0) 'select download character group 8360 CM.CC =C.ESC+":"+STRING$(3,0) 'copy original characters 8370 CM.DD =C.ESC+"&"+CHR$(0) 'download definition command 8380 CM.ELI=C.ESC+"M" 'elite 8390 CM.PIC=C.ESC+"P" 'pica 8400 CM.SUB=C.ESC+"S1" 'subscript 8410 CX.SUB=C.ESC+"T" 'subscript off 8420 CM.PRO=C.ESC+"p1" 'proportional 8430 CX.PRO=C.ESC+"p0" 'proportional off 8440 CM.ALT=C.ESC+"4" 'alternate 8450 CX.ALT=C.ESC+"5" 'alternate off 8460 CM.EXP=C.ESC+"6" 'printable code expansion 8470 CX.EXP=C.ESC+"7" 'printable code expansion off 8480 CM.SEL=C.ESC+"!" 'select print mode 8490 CM.TST%=11 8500 CM.TST(0) =CM.DC+CM.SEL+CHR$(4) '16.5 cpi : pica condensed 8510 CM.TST(1) =CM.SEL+CHR$(1) '12.0 cpi : elite 8520 CM.TST(2) =CM.SEL+CHR$(0) '10.0 cpi : pica 8530 CM.TST(3) =CM.SEL+CHR$(33) ' 6.0 cpi : elite enlarged 8540 CM.TST(4) =CM.SEL+CHR$(32) ' 5.0 cpi : pica enlarged 8550 CM.TST(5) =CM.SUB+CM.SEL+CHR$(4) 'subscript pica condensed 8560 CM.TST(6) =CM.SEL+CHR$(1) 'subscript elite 8570 CM.TST(7) =CM.SEL+CHR$(0) 'subscript pica 8580 CM.TST(8) =CM.SEL+CHR$(33) 'subscript elite enlarged 8590 CM.TST(9) =CM.SEL+CHR$(32) 'subscript pica enlarged 8600 CM.TST(10)=CX.SUB+CM.SEL+CHR$(0)+CM.PRO 'pica proportional 8610 CM.TST(11)=CX.PRO+CM.RC+CS.NL 8620 GOTO 8880 8630 ' 8640 ' Star: 8650 ' 8660 CM.RC =C.ESC+"$"+CHR$(0) 'select ROM character group 8670 CM.DC =C.ESC+"$"+CHR$(1) 'select download character group 8680 CM.CC =C.ESC+"*"+CHR$(0) 'copy original characters 8690 CM.DD =C.ESC+"*"+CHR$(1) 'download definition 8700 CM.PIC=C.ESC+"B"+CHR$(1) 'pica 8710 CM.ELI=C.ESC+"B"+CHR$(2) 'elite 8720 CM.EMP=C.ESC+"E" 'emphasized 8730 CX.EMP=C.ESC+"F" 'emphasized off 8740 CM.SUB=C.ESC+"S"+CHR$(1) 'subscript 8750 CX.SUB=C.ESC+"T" 'subscript off 8760 CM.TST%=10 8770 CM.TST(0) =CM.DC+C.SI '16.5 cpi : condensed 8780 CM.TST(1) =CM.ELI '12.0 cpi : elite 8790 CM.TST(2) =C.DC2 '10.0 cpi : pica 8800 CM.TST(3) =C.SI+C.SO ' 8.5 cpi : condensed enlarged 8810 CM.TST(4) =CM.ELI ' 6.0 cpi : elite enlarged 8820 CM.TST(5) =C.DC2 ' 5.0 cpi : pica enlarged 8830 CM.TST(6) =C.DC4+CM.EMP 'pica emphasized 8840 CM.TST(7) =CX.EMP+C.SUB+C.SI 'subscript condensed 8850 CM.TST(8) =CM.ELI 'subscript elite 8860 CM.TST(9) =C.DC2 'subscript pica 8870 CM.TST(10)=CX.SUB+CM.RC+CS.NL 8880 ' 8890 ' WERKBERICHTEN 8900 ' 8910 W.M0="=== HOOFDMENU ============== STOP PROGRAMMA MET ===" 8920 W.M1="=================== WIJZIG KARAKTERPATROON =====================" 8930 F.0 =FNAT(R.ERR,0)+C.CEL 8940 F.1 =F.0+C.BEL+">>> " 8950 W.0 =F.0 8960 W.1 =W.0+"> " 8970 W.G =W.1+"Even geduld ... " 8980 W.I =W.1+"Informatie ... " 8990 W.F =W.1+"File overzicht : " 9000 W.L =W.1+"Lezen ... " 9010 W.S =W.1+"Schrijven ... " 9020 W.N =W.1+"Nieuwe definities" 9030 W.Z =W.1+"Zoeken ... " 9040 W.P1=W.1+"Definities naar printer ... " 9050 W.P2=W.1+"Proefafdruk ... " 9060 W.V =W.1+"Vastleggen ... " 9070 W.E =W.1+"Exit" 9080 RETURN ties naa