/* -------------------------------------------------------------- */ /* KIO'S FONTEDITOR ... FOR ATARI ST / RTOS VS. 2.0 / MONOCHROME */ /* -------------------------------------------------------------- */ /* VERSION 1.0 28/04/1987 */ /* ----------------------- */ /* (C) BY GÜNTER WOIGK */ /* alias KIO */ /* GABELSBERGERSTR. 5 */ /* HEY YOU ! */ ; /* 8520 ERLANGEN */ /* ----------------------- */ /* KIO-BOX E R L A N G E N */ /* 09131 - 20 7996 */ ; /* ABER HALLO ! */ /* */ /* MO-FR : 19:00 - 10:00 */ /* SA+SO : 19:00 - 17:00 */ /* ----------------------- */ /* WRITTEN FOR C'T-PD-POOL */ /* -------------------------------------------------------------- */ /* LOAD F0.FONTEDx+F0.FONTEDy --- FONTEDITOR ... & USE MOUSE ... */ /* -------------------------------------------------------------- */ SC=$8000; /*+M*/;/*+T*/ MODULE FONTED; SYSTEM; A1;XC; DATEI :ED.FONTn (NE) <->; MAUS: EV(80000000); /* TASTATURPROZESSOR HAT WAS UEBER DIE MAUS */ RTASTE:EV(00000001); /* RECHTE TASTE WURDE GEDRUECKT */ LTASTE:EV(00000002); /* LINKE TASTE ... */ BEWEGG:EV(00000004); /* MAUS WURDE BEWEGT */ KLICK: EV(00000008); /* EIN BUTTON IM SCREEN WURDE ANGEKLICKT */ PROBLEM; SPC DATEI DATION INOUT ALPHIC CONTROL(ALL); SPC A1 DATION INOUT ALPHIC CONTROL(ALL); SPC XC DATION OUT ALPHIC CONTROL(ALL); SPC MAUS INTERRUPT; SPC BEWEGG INTERRUPT; SPC LTASTE INTERRUPT; SPC RTASTE INTERRUPT; SPC KLICK INTERRUPT; SPC (SCRSET,SCKILL,SCRCHG,WIDTH,CLEAR,PEN,TEXT ) ENTRY GLOBAL; SPC (SPRITL,SPRITS ) ENTRY GLOBAL; SPC MOUSE TASK GLOBAL; /* TASK WERTET MAUS-INFOS AUS */ SPC KICK ENTRY GLOBAL; /* KICKT DEN IRPT 'KLICK' */ SPC SYSI ENTRY GLOBAL; /* INITIALISIERT SYSF */ SPC SYSF(,) BIT(16) GLOBAL; /* ZUGRIFF AUF SYSTEM-FOND */ TYPE BTN STRUCT (/ (L,R,O,U)FIXED /); SPC (MAUSL,MAUSR,MAUSZ,FONTEDITOR ) TASK; SPC (BUTTONZEICHNEN,MAUSZEIGER ) ENTRY; DCL TRUE INV BIT INIT('1'B); DCL FALSE INV BIT INIT('0'B); DCL MAUSF BIT; /* MAUS SHOWN/HIDDEN-FLAG */ DCL (ML,MR) BIT GLOBAL; /* ZUSTAND DER MAUSTASTEN */ DCL (MX,MY) FIXED GLOBAL; /* X,Y-POS. DER MAUS */ DCL (AX,AY) FIXED; /* ALTE X,Y-POS. DER MAUS */ DCL (SX,SY) FIXED; /* POS. DER SPITZE */ DCL MAUS0(16) BIT(16); /* HINTERGRUNDMASKE */ DCL MAUS1(16) BIT(16); /* VORDERGRUNDMASKE */ DCL ZWARR(1,16) BIT(16); /* ZWISCHEN-ARRAY */ DCL BACKG(1,16) BIT(16); /* GERETTETER HINTERGRUND */ DCL CHAR1(1,16) BIT(16); DCL CHAR2(1,16) BIT(16); DCL CHARX(1,16) BIT(16); /* AKTUELL BEARBEITETES ZEICHEN */ DCL CHARY(1,16) BIT(16); /* 'ALTE' VERSION DAVON -> UNDO */ DCL PIX0(1,16) BIT(16); /* GRAFIK FÜR 0-BIT IN MATRIX */ DCL PIX1(1,16) BIT(16); /* 1 */ DCL SCREEN INV CHAR(5) INIT('FNTED'); DCL GANZERSCREEN BTN; DCL SPARE(40,16)BIT(16); DCL BUTTON(32) BTN; /* BUTTONS IM SCREEN */ DCL (RX,RY) FIXED; /* EXAKTE POS., WO RECHTE TASTE GEDRÜCKT WURDE */ DCL (LX,LY) FIXED; /* EXAKTE POS., WO LINKE TASTE GEDRÜCKT WURDE */ DCL (BX,BY) FIXED; /* EXAKTE POS., WO L.O.R. TASTE GEDRÜCKT WURDE */ DCL TASTE FIXED; /* BUTTONNUMMER DIESER TASTE: + = L / - = R */ /* MAUSZEIGER IN BILDSCHIRMGRENZEN ZWINGEN */ /* --------------------------------------- */ MAUSGRENZ:PROC((X,Y)FIXED IDENT); X=MX;Y=MY; IF X<2 THEN X=2; ELSE IF X>621 THEN X=621;FIN; FIN; IF Y<2 THEN Y=2; ELSE IF Y>381 THEN Y=381;FIN; FIN; MX=X;MY=Y; END; /* PROZEDUR ZEICHNET MAUSZEIGER */ /* ---------------------------- */ MAUSEIN:PROC; DCL (X,Y) FIXED; CALL MAUSGRENZ(X,Y); AX=X;AY=Y; CALL SPRITL(X,Y,16,16,SCREEN,BACKG); FOR I TO 16 REPEAT; ZWARR(1,I)=(BACKG(1,I) AND MAUS0(I)) OR MAUS1(I); END; CALL SPRITS(X,Y,16,16,SCREEN,ZWARR); END; /* PROZEDUR ENTFERNT MAUSZEIGER */ /* ---------------------------- */ MAUSAUS:PROC; CALL SPRITS(AX,AY,16,16,SCREEN,BACKG); END; /* PROZEDUR SCHALTET MAUSZEIGER EIN */ /* -------------------------------- */ SHOWMOUSE:PROC; IF NOT MAUSF THEN CALL MAUSEIN; MAUSF=TRUE; ENABLE BEWEGG; FIN; END; /* PROZEDUR SCHALTET MAUSZEIGER AUS */ /* -------------------------------- */ HIDEMOUSE:PROC; IF MAUSF THEN MAUSF=FALSE; DISABLE BEWEGG; CALL MAUSAUS; FIN; END; /* PROZEDUR STARTET DIE MAUS */ ; /* ABER ZUNAECHST NOCH UNSICHTBAR */ /* ------------------------- */ STARTMAUS:PROC; MX=320;MY=200; CALL MAUSZEIGER; MAUSF=FALSE;DISABLE BEWEGG;ACTIVATE MAUSZ; WHEN LTASTE ACTIVATE MAUSL; WHEN RTASTE ACTIVATE MAUSR; WHEN MAUS ACTIVATE MOUSE; ENABLE MAUS; ENABLE LTASTE; ENABLE RTASTE; ENABLE KLICK; END; /* PROZEDUR SCHALTET MAUS AB */ /* ------------------------- */ STOPMAUS:PROC; CALL HIDEMOUSE; DISABLE MAUS; DISABLE LTASTE; DISABLE RTASTE; DISABLE KLICK; PREVENT MOUSE; PREVENT MAUSL; PREVENT MAUSR; PREVENT MAUSZ; TERMINATE MAUSZ; END; /* TASK BEWEGT MAUSZEIGER */ /* ---------------------- */ MAUSZ:TASK PRIO 4; REPEAT; WHILE (MX/=AX OR MY/=AY)AND MAUSF REPEAT; CALL MAUSAUS; CALL MAUSEIN; AFTER 0.03 SEC RESUME; END; WHEN BEWEGG RESUME; PREVENT MAUSZ; END; END; /* PROZEDUR ZEICHNET BOX */ /* --------------------- */ BOX:PROC(E BTN); CALL LINE(E.L,E.O,E.R,E.O,1); CALL LINE(E.L,E.U,E.R,E.U,1); CALL LINE(E.L,E.O,E.L,E.U,1); CALL LINE(E.R,E.O,E.R,E.U,1); END; /* PROZEDUR UMRAHMT BUTTON */ /* ----------------------- */ FRAME:PROC(B BTN); B.L=B.L-2;B.R=B.R+2; B.O=B.O-2;B.U=B.U+2; CALL BOX(B); CALL SETPIX(B.L,B.O,0); CALL SETPIX(B.L,B.U,0); CALL SETPIX(B.R,B.O,0); CALL SETPIX(B.R,B.U,0); END; /* PROZEDUR LOESCHT FENSTER */ /* ------------------------ */ CLEARWINDOW:PROC(E BTN); FOR I FROM E.O BY 16 TO E.U-16 REPEAT; CALL SPRITS(E.L,I,E.R-E.L+1,16,SCREEN,SPARE); END; CALL SPRITS(E.L,E.U-15,E.R-E.L+1,16,SCREEN,SPARE); END; /* PROZEDUR UMRAHMT FENSTER */ /* ------------------------ */ FRAMEWINDOW:PROC(E BTN); FOR I TO 8 REPEAT; CASE I ALT; /* GANZ AUSSEN */ ALT; ALT;CALL BOX(E); ALT; ALT;CALL BOX(E); ALT;CALL BOX(E); ALT; OUT; /* GANZ INNEN */ FIN; E.L=E.L+1;E.R=E.R-1;E.O=E.O+1;E.U=E.U-1; END; END; /* PROZEDUR UMRAHMT UND RETTET FELD */ ; /* DIE MAUS WIRD BEI BEDARF */ /* -------------------------------- */ ; /* KURZZEITIG AUSGESCHALTET */ OPENWINDOW:PROC(E BTN,F(,)BIT(16)IDENT)REENT; IF MAUSF THEN CALL HIDEMOUSE; CALL OPENWINDOW(E,F); CALL SHOWMOUSE; ELSE CALL SPRITL(E.L,E.O,E.R-E.L+1,E.U-E.O+1,SCREEN,F); CALL CLEARWINDOW(E); CALL FRAMEWINDOW(E); FIN; END; /* PROZEDUR ENTFERNT FENSTER */ ; /* DIE MAUS WIRD BEACHTET */ /* ------------------------- */ CLOSEWINDOW:PROC(E BTN,F(,)BIT(16)IDENT) REENT; IF MAUSF THEN CALL HIDEMOUSE; CALL CLOSEWINDOW(E,F); CALL SHOWMOUSE; ELSE CALL SPRITS(E.L,E.O,E.R-E.L+1,E.U-E.O+1,SCREEN,F); FIN; END; /* ZENTRIERE FENSTER */ /* ----------------- */ CENTERWINDOW:PROC(E BTN IDENT,F(,)BIT(16)IDENT); E.L=320-8*1 UPB F; E.R=639-E.L; E.O=(400-2 UPB F)//2; E.U=E.O+2 UPB F -1; END; /* BERECHNE LAENGE EINES STRINGS */ /* ----------------------------- */ LEN:PROC(S CHAR(80)) RETURNS(FIXED); FOR I FROM 80 BY -1 TO 1 REPEAT; IF S.CHAR(I)/=' ' THEN RETURN(I); FIN; END; RETURN(0); END; /* GEBE STRING ZENTRIERT IN EINEM FENSTER AUS */ ; /* BEACHTET MAUS */ /* ------------------------------------------ */ PRINTCENTERED:PROC(S CHAR(80),Z FIXED,E BTN) REENT; IF MAUSF THEN CALL HIDEMOUSE; CALL PRINTCENTERED(S,Z,E); CALL SHOWMOUSE; ELSE CALL TEXT((E.L+E.R+1)//2-4*LEN(S),E.O+Z,1,S); FIN; END; /* GEBE TEXT ZENTRIERT AUS */ ; /* MAUS WIRD BEACHTET */ /* ----------------------- */ TEXTCENTERED:PROC(S()CHAR(80)IDENT,E BTN) REENT; DCL Z FIXED; DCL D FIXED; IF MAUSF THEN CALL HIDEMOUSE; CALL TEXTCENTERED(S,E); CALL SHOWMOUSE; ELSE D=(E.U-E.O-16)//1 UPB S; IF D>32 THEN D=32;FIN; Z=(E.U-E.O+1-D*1 UPB S)//2; FOR I TO 1 UPB S REPEAT; CALL PRINTCENTERED(S(I),Z,E); Z=Z+D; END; FIN; END; /* SICHERHEITSABFRAGE MIT VARIABLEM TEXT */ ; /* BEACHTET MAUS */ /* ------------------------------------- */ JAODERNEIN:PROC(E BTN) RETURNS(BIT) REENT; DCL Z BTN; IF MAUSF THEN Z=BUTTON(1); CALL BUTTONZEICHNEN(1,(E.R+E.L)//2-24,E.U-30,'<>',TRUE); WHEN KLICK RESUME; PREVENT FONTEDITOR; BUTTON(1)=Z; RETURN(ABS(TASTE)==1); /* LINKS ODER RECHTS EGAL */ ELSE CALL SHOWMOUSE; RETURN(JAODERNEIN(E)); CALL HIDEMOUSE; FIN; END; /* INFO-FENSTER MANAGEN */ /* -------------------- */ INFOFENSTER:PROC(S()CHAR(80)IDENT,F(,)BIT(16)IDENT,E BTN); CALL CENTERWINDOW(E,F); CALL OPENWINDOW(E,F); CALL TEXTCENTERED(S,E); WHEN KLICK RESUME; PREVENT FONTEDITOR; CALL CLOSEWINDOW(E,F); END; /* COPYRIGHT MELDUNG */ /* ----------------- */ COPYRIGHTMESSAGE:PROC; DCL F(20,160)BIT(16); DCL E BTN; DCL S(7)CHAR(80); S(1)='Fonteditor /28-04-1987/'; S(2)='-----------------------'; S(3)='(c) by Günter Woigk'; S(4)=''; S(5)='Dieses Programm ist Public Domain.'; S(6)='Solange mein (c) nicht entfernt'; S(7)='wird, darf es frei kopiert werden.'; CALL INFOFENSTER(S,F,E); END; /* WEITERE INFORMATIONEN AUSGEBEN */ /* ------------------------------ */ WEITEREINFORMATIONEN:PROC; DCL F(31,300)BIT(16); DCL E BTN; DCL S(17)CHAR(80); S(1)='Fonteditor (c) G.Woigk'; S(2)='----------------------'; S(3)=''; S(4)='Version: 1.0'; S(5)='Für Atari ST mit Monochrom-Monitor'; S(6)='ab RTOS-Version 2.0.'; S(7)=''; S(8)='Alle Funktionen werden mit der Maus angesprochen.'; S(9)=''; S(10)='Eine einfache Anleitung gibt es unter .'; S(11)=''; S(12)='Eine genaue Anleitung und die neueste Version dieses'; S(13)='Programmes erhält man gegen Einsendung von 20 DM an:'; S(14)=''; S(15)='Günter Woigk'; S(16)='Gabelsbergerstr. 5'; S(17)='8520 Erlangen'; CALL INFOFENSTER(S,F,E); END; /* BEDIENUNGS-ANLEITUNG */ /* -------------------- */ DOC:PROC; DCL E BTN; DCL S(19) CHAR(80); DCL F(32,330) BIT(16); S(01)='Bedienung des KIO-Fonteditors:'; S(02)='------------------------------'; S(03)=''; S(04)='Beenden mit EXIT oder UNLOAD (retten keine Fonts !)'; S(05)='Unterbrechen der Arbeit mit PAUSE'; S(06)='Der Editor-Screen wird bei jedem Maus-Klick angezeigt.'; S(07)='Evtl. löst man damit aber eine Aktion aus. => Benutze PAUSE !'; S(08)='Linke und rechte Maustaste werden nur im Arbeitsfeld'; S(09)='unterschieden: Malen und Löschen.'; S(10)=''; S(11)='COPY kopiert einen Font zwischen folgenden Stellen:'; S(12)=''; S(13)='1. ED.FONT1, ED.FONT2 und ED.FONT3'; S(14)='2. Font-Puffer des Fonteditors .'; S(15)='3. Systemfont von RTOS .'; S(16)=''; S(17)='Das Kopieren von und zur Diskette muß mit dem'; S(18)='COPY-Befehl des RTOS bewerkstelligt werden.'; S(19)='Dazu evtl. den Fonteditor pausieren lassen.'; CALL INFOFENSTER(S,F,E); END; /* GRUESSE AUSRICHTEN */ /* ------------------ */ GRUESSE:PROC; DCL E BTN; DCL F(18,112)BIT(16); DCL S(6)CHAR(80); S(1)='Heavy many greetings to'; S(2)=''; S(3)='Lord,Maggi,Zerberus,Ali,'; S(4)='Hirsch,Peterl,Marvin,'; S(5)='B.Gerz und Axel N.'; S(6)='Christian P. (rem. vs.>2.0)'; CALL INFOFENSTER(S,F,E); END; /* INFORMATION UEBER FEHLER IM PROGRAMM */ /* ------------------------------------ */ INFOUEBERFEHLER:PROC; DCL F(30,264) BIT(16); DCL E BTN; DCL S(13) CHAR(80); S(01)='Fehler im Programm.'; S(02)='-------------------'; S(03)=''; S(04)='1. Manchmal erscheint die Meldung: .'; S(05)=' INTERRUPT not suspended (CONTINUE) .'; S(06)=' (lästig, aber nicht tragisch) .'; S(07)=''; S(08)='2. Wie kann man die Zeichen < TOCHAR(32)'; S(09)=' und >= TOCHAR(127) ausdrucken ?? .'; S(10)=''; S(11)='3. Wie kriegt man die Umlaut-Umschaltung'; S(12)=' geregelt, ohne daß der alte Zeichen -'; S(13)=' satz (teilweise) restauriert wird ???'; CALL INFOFENSTER(S,F,E); END; /* PAUSIEREN, #MAIN ANZEIGEN, UND WEITER MIT KLICK */ /* ----------------------------------------------- */ PAUSE:PROC REENT; IF MAUSF THEN CALL HIDEMOUSE; CALL PAUSE; CALL SHOWMOUSE; ELSE CALL SCRCHG('MAIN'); WHEN KLICK RESUME; PREVENT FONTEDITOR; FIN; END; /* DAS PROGRAMM BEENDEN */ /* -------------------- */ BEENDEPROGRAMM:PROC; DCL E BTN;DCL F(16,130)BIT(16);DCL S(6)CHAR(80); S(1)='Programm beenden.'; S(2)='-----------------'; S(3)=''; S(4)='Sind Sie sicher ??'; S(5)=''; S(6)=''; CALL CENTERWINDOW(E,F); CALL OPENWINDOW(E,F); CALL TEXTCENTERED(S,E); IF JAODERNEIN(E) THEN CALL STOPMAUS; CALL SCRCHG('MAIN'); CALL SCKILL(SCREEN); TERMINATE; FIN; CALL CLOSEWINDOW(E,F); END; /* DAS PROGRAMM BEENDEN UND AUS DEM SPEICHER LÖSCHEN */ /* ------------------------------------------------- */ LOESCHEN:PROC; DCL E BTN;DCL F(18,140)BIT(16);DCL S(7)CHAR(80); S(1)='Programm beenden und'; S(2)='aus dem Speicher löschen'; S(3)='------------------------'; S(4)=''; S(5)='Sind Sie sicher ??'; S(6)=''; S(7)=''; CALL CENTERWINDOW(E,F); CALL OPENWINDOW(E,F); CALL TEXTCENTERED(S,E); IF JAODERNEIN(E) THEN CALL SCRCHG('MAIN'); CALL SCKILL(SCREEN); PUT 'UNLOAD MOUSE*,FONTED*' TO XC BY A,SKIP; FIN; CALL CLOSEWINDOW(E,F); END; /* PROZEDUR SUCHT BUTTON-NUMMER ZU KOORDINATEN */ /* ------------------------------------------- */ BUTTONNUMMER:PROC((X,Y)FIXED)RETURNS(FIXED); DCL Z BTN; FOR I TO 1 UPB BUTTON REPEAT; Z=BUTTON(I); IF Z.R>0 THEN IF Z.L>>>',53,E); CASE T ALT CALL LESEN('FONT1',G); ALT CALL LESEN('FONT2',G); ALT CALL LESEN('FONT3',G); ALT /* ARBEITSFOND */ FOR I TO 256 REPEAT; FOR J TO 16 REPEAT; G(I,J)=H(I,J); END; END; OUT /* SYSTEMFOND */ CALL GETSYSFOND(G); FIN; CALL PRINTCENTERED(' ZIEL festlegen:',53,E); WHEN KLICK RESUME;PREVENT FONTEDITOR; T=ABS(TASTE); IF T/=6 THEN CALL PRINTCENTERED('<<<< copying >>>>',53,E); CASE T ALT CALL SCHREIBEN('FONT1',G); ALT CALL SCHREIBEN('FONT2',G); ALT CALL SCHREIBEN('FONT3',G); ALT /* ARBEITSFOND */ FOR I TO 256 REPEAT; FOR J TO 16 REPEAT; H(I,J)=G(I,J); END; END; OUT /* SYSTEMFOND */ CALL PUTSYSFOND(G); FIN; FIN; FIN; FOR I TO 6 REPEAT; BUTTON(I)=B(I); END; CALL CLOSEWINDOW(E,F); IF T==4 THEN CALL PRINTFONT(G);FIN; END; /* ZEICHEN IN EDITIERBOX ÜBERNEHMEN */ ; /* BEACHTET MAUS */ /* -------------------------------- */ LADECHAR:PROC(C(,)BIT(16)IDENT,A(,)BIT(16)IDENT) REENT; DCL (X,Y) FIXED; DCL (L,O) FIXED; IF MAUSF THEN CALL HIDEMOUSE; CALL LADECHAR(C,A); CALL SHOWMOUSE; ELSE FOR I TO 16 REPEAT; CHARY(1,I)=A(1,I); /* ALTE VERSION BESETZEN */ CHARX(1,I)=C(1,I); /* AKTUELLE VERSION */ END; L=BUTTON(26).L-1; O=BUTTON(26).O-1; Y=BUTTON(27).O; FOR I TO 16 REPEAT; X=BUTTON(27).L; FOR J TO 8 REPEAT; IF C(1,I).BIT(J) THEN CALL SPRITS(X,Y,16,16,SCREEN,PIX1); CALL SETPIX(L+J,O+I,1); ELSE CALL SPRITS(X,Y,16,16,SCREEN,PIX0); CALL SETPIX(L+J,O+I,0); FIN; X=X+16; END; Y=Y+16; END; FIN; END; /* ZEICHEN IN EDITIERBOX LÖSCHEN */ /* ----------------------------- */ CLEARCHAR:PROC; FOR I TO 16 REPEAT; CHARX(1,I)='00'B4; END; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN IN EDITIERBOX INVERTIEREN */ /* --------------------------------- */ INVERTCHAR:PROC; FOR I TO 16 REPEAT; CHARX(1,I)=NOT CHARX(1,I); END; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN NACH LINKS ROLLEN */ /* ------------------------- */ LROLLCHAR:PROC; FOR I TO 16 REPEAT; CHARX(1,I).BIT(9)=CHARX(1,I).BIT(1); CHARX(1,I)=CHARX(1,I) CSHIFT 1; END; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN NACH RECHTS SCHIEBEN */ /* ---------------------------- */ RROLLCHAR:PROC; FOR I TO 16 REPEAT; CHARX(1,I)=CHARX(1,I) CSHIFT(-1); CHARX(1,I).BIT(1)=CHARX(1,I).BIT(9); END; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN HOCHROLLEN */ /* ------------------ */ UROLLCHAR:PROC; DCL Z BIT(8); Z=CHARX(1,1); FOR I TO 15 REPEAT; CHARX(1,I)=CHARX(1,I+1); END; CHARX(1,16)=Z; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN RUNTERROLLEN */ /* -------------------- */ DROLLCHAR:PROC; DCL Z BIT(8); Z=CHARX(1,16); FOR I FROM 16 BY -1 TO 2 REPEAT; CHARX(1,I)=CHARX(1,I-1); END; CHARX(1,1)=Z; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN VERTIKAL SPIEGELN */ /* ------------------------- */ VMC:PROC; DCL Z BIT(8); FOR I TO 8 REPEAT; Z=CHARX(1,I); CHARX(1,I)=CHARX(1,17-I); CHARX(1,17-I)=Z; END; END; VMIRRORCHAR:PROC; CALL VMC; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN HORIZONTAL SPIEGELN */ /* --------------------------- */ HMC:PROC; DCL (B,C) BIT(8); FOR I TO 16 REPEAT; B=CHARX(1,I); FOR J TO 8 REPEAT; C.BIT(J)=B.BIT(9-J); END; CHARX(1,I)=C; END; END; HMIRRORCHAR:PROC; CALL HMC; CALL LADECHAR(CHARX,CHARY); END; /* ZEICHEN UM 180 GRAD DREHEN */ /* -------------------------- */ XMIRRORCHAR:PROC; CALL HMC; CALL VMC; CALL LADECHAR(CHARX,CHARY); END; /* BUTTONS INITIALISIEREN */ /* ---------------------- */ INITIALISIEREBUTTONS:PROC; DCL B BTN; DCL F(1,40)BIT(16); DCL C BIT(16); DCL N FIXED; FOR I TO 1 UPB BUTTON REPEAT; BUTTON(I).R=0; END; BUTTON(1 UPB BUTTON)=GANZERSCREEN; CALL BUTTONZEICHNEN(30, 10, 5,'(c)' ,TRUE ); CALL BUTTONZEICHNEN(31, 39, 5,'Info' ,TRUE ); CALL BUTTONZEICHNEN(13, 76, 5,'Hilfe' ,TRUE ); CALL BUTTONZEICHNEN(16,121, 5,'Bugs' ,TRUE ); CALL BUTTONZEICHNEN(11,158, 5,'Grüße' ,TRUE ); CALL BUTTONZEICHNEN(29,203, 5,'Exit' ,TRUE ); CALL BUTTONZEICHNEN(10,240, 5,'Unload' ,TRUE ); CALL BUTTONZEICHNEN(15,293, 5,'< Pause >' ,TRUE ); CALL BUTTONZEICHNEN(12,370, 5,'<< COPY >>' ,TRUE ); CALL BUTTONZEICHNEN(14,539,303,'Undo' ,TRUE ); CALL BUTTONZEICHNEN(24,531,325,'Invert' ,TRUE ); CALL BUTTONZEICHNEN(25,535,347,'Clear' ,TRUE ); CALL BUTTONZEICHNEN(18,470, 5,'<----' ,TRUE ); CALL BUTTONZEICHNEN(22,514, 5,'<--->' ,TRUE ); CALL BUTTONZEICHNEN(19,558, 5,'---->' ,TRUE ); CALL BUTTONZEICHNEN(17,605, 5,'><' ,TRUE ); FOR I TO 16 REPEAT; /* '<--->' GESTÜRZT EINLESEN */ FOR J TO 16 REPEAT; CALL GETPIX(513+I,4+J,N); C.BIT(J)=(N/=0); END; F(1,I)=C; END; FOR I FROM 9 TO 32 REPEAT; F(1,I+8)=F(1,I); END; B.L=605;B.R=620;B.O=030;B.U=111; BUTTON(20)=B;CALL FRAME(B); /* HOCHROLLEN */ CALL SPRITS(605,51,16,40,SCREEN,F); FOR I TO 8 REPEAT; F(1,41-I)=F(1,I); END; B.O=117;B.U=198; BUTTON(23)=B;CALL FRAME(B); /* V SPIEGELN */ CALL SPRITS(605,138,16,40,SCREEN,F); B.O=204;B.U=285; FOR I TO 8 REPEAT; F(1,I)=F(1,I+8); END; BUTTON(21)=B;CALL FRAME(B); /* RUNTERROLLEN */ CALL SPRITS(605,225,16,40,SCREEN,F); B.L=010;B.R=250;B.O=030;B.U=366; BUTTON(28)=B;CALL FRAME(B); /* BOX MIT ALLEN ZEICHEN DES FONTS */ B.L=470;B.R=597;B.O=030;B.U=285; BUTTON(27)=B;CALL FRAME(B); /* BOX MIT VERGRÖßERTEM ZEICHEN */ B.O=300;B.U=366;CALL FRAME(B); CALL BUTTONZEICHNEN(26,490,347,'$',TRUE); CALL LINE(494,300, 510,316, 1); /* PFEIL ^ */ CALL LINE(494,300, 478,316, 1); CALL LINE(478,316, 486,316, 1); CALL LINE(510,316, 501,316, 1); CALL LINE(486,316, 490,342, 1); CALL LINE(501,316, 497,342, 1); CALL LINE(490,342, 497,342, 1); END; /* MAUSZEIGER DEFINIEREN */ /* --------------------- */ MAUSZEIGER:PROC; SX=1;SY=1; MAUS1(01)='0000000000000000'B;MAUS0(01)='0000000000001111'B; MAUS1(02)='0111111111100000'B;MAUS0(02)='0000000000001111'B; MAUS1(03)='0111111110000000'B;MAUS0(03)='0000000000001111'B; MAUS1(04)='0111111000000000'B;MAUS0(04)='0000000000111111'B; MAUS1(05)='0111110000000000'B;MAUS0(05)='0000000011111111'B; MAUS1(06)='0111111000000000'B;MAUS0(06)='0000000011111111'B; MAUS1(07)='0111011100000000'B;MAUS0(07)='0000000001111111'B; MAUS1(08)='0110001110000000'B;MAUS0(08)='0000000000111111'B; MAUS1(09)='0110000111000000'B;MAUS0(09)='0000100000011111'B; MAUS1(10)='0100000011100000'B;MAUS0(10)='0000110000001111'B; MAUS1(11)='0100000001110000'B;MAUS0(11)='0001111000000111'B; MAUS1(12)='0000000000111000'B;MAUS0(12)='0001111100000011'B; MAUS1(13)='0000000000011000'B;MAUS0(13)='1111111110000011'B; MAUS1(14)='0000000000000000'B;MAUS0(14)='1111111111000011'B; MAUS1(15)='0000000000000000'B;MAUS0(15)='1111111111111111'B; MAUS1(16)='0000000000000000'B;MAUS0(16)='1111111111111111'B; END; /* MAUSZEIGER ALS BUCHSTABE DARSTELLEN */ /* ----------------------------------- */ MAUSCHAR:PROC; SX=8;SY=8; MAUS1(01)='0000000000000000'B; MAUS0(01)='1000000000000001'B; MAUS1(16)='0000000000000000'B; MAUS0(16)='1000000000000001'B; FOR I FROM 2 TO 15 REPEAT; MAUS1(I)='0010000000000100'B; MAUS0(I)='1000000000000001'B; END; FOR I TO 16 REPEAT; MAUS1(I)=MAUS1(I) OR ((CHAR1(1,I) SHIFT (-4)) AND '0FF0'B4); END; END; /* MAUSZEIGER ALS SCHREIBSTIFT DARSTELLEN */ /* -------------------------------------- */ MAUSSTIFT:PROC; SX=1;SY=14; MAUS1(01)='0000000000000000'B; MAUS0(01)='1111111111111111'B; MAUS1(02)='0000000000000000'B; MAUS0(02)='1111111111111111'B; MAUS1(03)='0000000000000000'B; MAUS0(03)='1111111000000111'B; MAUS1(04)='0000000011110000'B; MAUS0(04)='1111110000000000'B; MAUS1(05)='0000000111111110'B; MAUS0(05)='1111100000000000'B; MAUS1(06)='0000001000011100'B; MAUS0(06)='1111000000000000'B; MAUS1(07)='0000010010001000'B; MAUS0(07)='1110000000000001'B; MAUS1(08)='0000100100110000'B; MAUS0(08)='1100000000000011'B; MAUS1(09)='0001001001100000'B; MAUS0(09)='1000000000000111'B; MAUS1(10)='0010010011000000'B; MAUS0(10)='0000000000001111'B; MAUS1(11)='0111100110000000'B; MAUS0(11)='0000000000011111'B; MAUS1(12)='0111111110000000'B; MAUS0(12)='0000000000111111'B; MAUS1(13)='0111111000000000'B; MAUS0(13)='0000000000111111'B; MAUS1(14)='0111100000000000'B; MAUS0(14)='0000000011111111'B; MAUS1(15)='0110000000000000'B; MAUS0(15)='0000001111111111'B; MAUS1(16)='0000000000000000'B; MAUS0(16)='0000111111111111'B; END; /* MAUSZEIGER ALS RADIERGUMMI DARSTELLEN */ /* ------------------------------------- */ MAUSRADIERGUMMI:PROC; SX=4;SY=13; MAUS1(01)='0000000000000000'B; MAUS0(01)='1111111111111111'B; MAUS1(02)='0000000000000000'B; MAUS0(02)='1111111111111111'B; MAUS1(03)='0000000000000000'B; MAUS0(03)='1111111100000011'B; MAUS1(04)='0000000001111000'B; MAUS0(04)='1111111000000001'B; MAUS1(05)='0000000010000100'B; MAUS0(05)='1111110000000000'B; MAUS1(06)='0000000100000010'B; MAUS0(06)='1111100000000000'B; MAUS1(07)='0000001000000100'B; MAUS0(07)='1111000000000000'B; MAUS1(08)='0000011000001000'B; MAUS0(08)='1110000000000001'B; MAUS1(09)='0000111110010000'B; MAUS0(09)='1100000000000011'B; MAUS1(10)='0001111111100000'B; MAUS0(10)='1000000000000111'B; MAUS1(11)='0010001111000000'B; MAUS0(11)='0000000000001111'B; MAUS1(12)='0111110110000000'B; MAUS0(12)='0000000000011111'B; MAUS1(13)='0111110100000000'B; MAUS0(13)='0000000000111111'B; MAUS1(14)='0011111000000000'B; MAUS0(14)='0000000001111111'B; MAUS1(15)='0001110000000000'B; MAUS0(15)='1000000011111111'B; MAUS1(16)='0000000000000000'B; MAUS0(16)='1100000111111111'B; END; /* MAUSZEIGER AENDERN */ ; /* MAUS WIRD BEACHTET */ /* ------------------ */ MAUSZEIGERAENDERN:PROC(N FIXED) REENT; IF MAUSF THEN CALL HIDEMOUSE; CALL MAUSZEIGERAENDERN(N); CALL SHOWMOUSE; ELSE MX=MX+SX;MY=MY+SY; CASE N ALT CALL MAUSZEIGER; ALT CALL MAUSCHAR; ALT CALL MAUSSTIFT; ALT CALL MAUSRADIERGUMMI; OUT; FIN; MX=MX-SX;MY=MY-SY; FIN; END; /* TESTE, OB MAUSZEIGER AUF EIN PIXEL ZEIGT */ /* ---------------------------------------- */ ONPIXEL:PROC((X,Y)FIXED IDENT) RETURNS(BIT); X=(X-2-BUTTON(27).L)//2; Y=(Y-2-BUTTON(27).O)//2; IF X<0 OR X>60 OR Y<0 OR Y>124 THEN RETURN(FALSE);FIN; IF (X REM 8)>=6 OR (Y REM 8)>=6 THEN RETURN(FALSE);FIN; X=1+X//8; Y=1+Y//8; RETURN(TRUE); END; /* PROZEDUR ZUM ZEICHEN MALEN */ /* -------------------------- */ PAINT:PROC(B BIT); /* TRUE: SETZEN, FALSE: LÖSCHEN */ DCL (X,Y) FIXED; IF B THEN CALL MAUSZEIGERAENDERN(3); /* MAUS := STIFT */ ELSE CALL MAUSZEIGERAENDERN(4); /* MAUS := GUMMI */ FIN; WHILE ML OR MR REPEAT; X=MX+SX;Y=MY+SY; IF ONPIXEL(X,Y) THEN IF CHARX(1,Y).BIT(X)/=B THEN CHARX(1,Y).BIT(X)=B; CALL HIDEMOUSE; CALL SETPIX(BUTTON(26).L-1+X,BUTTON(26).O-1+Y,TOFIXED(B)); X=BUTTON(27).L-16+16*X; Y=BUTTON(27).O-16+16*Y; IF B THEN CALL SPRITS(X,Y,16,16,SCREEN,PIX1); ELSE CALL SPRITS(X,Y,16,16,SCREEN,PIX0); FIN; CALL SHOWMOUSE; FIN; FIN; AFTER 0.02 SEC RESUME; END; CALL MAUSZEIGERAENDERN(1); /* MAUS := ZEIGER */ END; /* BESTIMME, WELCHES ZEICHEN IM FONT GEMEINT IST */ /* --------------------------------------------- */ BESTIMMECHAR:PROC RETURNS(FIXED); DCL (X,Y)FIXED; X=(BX-BUTTON(28).L)//15; Y=(BY-BUTTON(28).O)//21; IF X<0 OR Y<0 OR X>=16 OR Y>=16 THEN RETURN(0); ELSE RETURN(X+16*Y+1); FIN; END; /* VERSCHIEBE EIN ZEICHEN IM SCREEN */ /* -------------------------------- */ MOVECHAR:PROC(C(,)BIT(16)IDENT,F(,)BIT(8)IDENT); DCL N FIXED; FOR I TO 16 REPEAT; CHAR1(1,I)=C(1,I); END; CALL MAUSZEIGERAENDERN(2); /* BUCHSTABE */ WHEN KLICK RESUME; PREVENT FONTEDITOR; CASE ABS(TASTE)-25 ALT;/* AKT.CHAR */ CALL LADECHAR(C,C); /* ALTE UND AKT. VERSION BESETZEN */ ALT; ALT;/* FONT */ N=BESTIMMECHAR; IF N/=0 THEN CALL TOFONT(N,C,F); CALL PRINTN(N,F); FIN; OUT; FIN; CALL MAUSZEIGERAENDERN(1); /* PFEIL */ END; /* ZEICHEN AUS DEM FONT AUFNEHMEN */ /* ------------------------------ */ MOVEFROMFONT:PROC(F(,)BIT(8)IDENT); DCL N FIXED; N=BESTIMMECHAR;IF N==0 THEN RETURN;FIN; CALL FROMFONT(N,CHAR1,F); CALL MOVECHAR(CHAR1,F); END; /* VERTEILER FUER MAUS-MENUE (UNTERSTER LEVEL) */ /* ------------------------------------------- */ HAUPTMENUE:PROC(F(,)BIT(8) IDENT); REPEAT; CALL SHOWMOUSE; WHEN KLICK RESUME; PREVENT FONTEDITOR; CASE ABS(TASTE) ALT /* 01 */; ALT /* 02 */; ALT /* 03 */; ALT /* 04 */; ALT /* 05 */; ALT /* 06 */; ALT /* 07 */; ALT /* 08 */; ALT /* 09 */; ALT /* 10 */;CALL LOESCHEN; ALT /* 11 */;CALL GRUESSE; ALT /* 12 */;CALL KOPIEREN(F); ALT /* 13 */;CALL DOC; ALT /* 14 */;CALL LADECHAR(CHARY,CHARY); /* UNDO */ ALT /* 15 */;CALL PAUSE; ALT /* 16 */;CALL INFOUEBERFEHLER; ALT /* 17 */;CALL XMIRRORCHAR; ALT /* 18 */;CALL LROLLCHAR; ALT /* 19 */;CALL RROLLCHAR; ALT /* 20 */;CALL UROLLCHAR; ALT /* 21 */;CALL DROLLCHAR; ALT /* 22 */;CALL HMIRRORCHAR; ALT /* 23 */;CALL VMIRRORCHAR; ALT /* 24 */;CALL INVERTCHAR; /* EDIT-FELD INVERTIEREN */ ALT /* 25 */;CALL CLEARCHAR; /* AKT.CHAR.LÖSCHEN */ ALT /* 26 */;CALL MOVECHAR(CHARX,F); /* AKT.CHAR.ORIG.GRÖßE */ ALT /* 27 */;CALL PAINT(TASTE>0); /* EDITIER-BOX */ ALT /* 28 */;CALL MOVEFROMFONT(F); /* GES-FONT */ ALT /* 29 */;CALL BEENDEPROGRAMM; ALT /* 30 */;CALL COPYRIGHTMESSAGE; ALT /* 31 */;CALL WEITEREINFORMATIONEN; OUT /* 32 */; FIN; END; END; /* ARBEITSSCREEN INITIALISIEREN */ /* ---------------------------- */ INITSCREEN:PROC; DCL (M,N) FIXED; CALL WIDTH(N,M); IF M/=400 THEN PUT 'FONTEDITOR: Dieses Programm arbeitet nur mit dem Monochrom-Monitor !' TO A1 BY SKIP(2),A,SKIP; TERMINATE; FIN; CALL SCRSET(SCREEN); CALL CLEAR; CALL SCRCHG(SCREEN); CALL INITIALISIEREBUTTONS; END; /* ALLGEMEINE INITIALISIERUNGEN */ /* ---------------------------- */ ALLGINIT:PROC; GANZERSCREEN.L=0; GANZERSCREEN.O=0; GANZERSCREEN.U=399; GANZERSCREEN.R=639; FOR I TO 1 UPB SPARE REPEAT; FOR J TO 2 UPB SPARE REPEAT; SPARE(I,J)='0000'B4; END; END; PIX0(1,01)='FFFF'B4; PIX0(1,16)='FFFF'B4; FOR I FROM 2 TO 15 REPEAT; PIX0(1,I)='8001'B4; END; FOR I TO 16 REPEAT; PIX1(1,I)=NOT PIX0(1,I); END; END; /* DIE HAUPTTASK ! */ /* --------------- */ FONTEDITOR:TASK PRIO 6; DCL FONT(256,16) BIT(8); CALL ALLGINIT; CALL SYSI; CALL STARTMAUS; CALL GETSYSFOND(FONT); CALL INITSCREEN; CALL PRINTFONT(FONT); CALL FROMFONT(5,CHARX,FONT); /* '$' */ CALL LADECHAR(CHARX,CHARX); CALL HAUPTMENUE(FONT); END; MODEND;