Quick-Tips

Patchprogramm gesucht?

In der Zeitschrift ST-COMPUTER 1/92 (Seite 173) suchte Markus Reinmut aus Braunschweig nach einem Programm, mit dem man Patches im TOS 1.04 ausprobieren und im RAM laufen zu lassen kann.

Es gibt eine Software-Lösung zu diesem Problem von Markus Fritze (Sigma-Soft): Das PD-Programm TOSPATCH erlaubt ein komfortables Patchen in 192K-ROMs. Es ist damit möglich, brennfertige ROM-Dateien zu erzeugen, ein TOS auf einen beliebigen Bereich zu relozieren und beim Booten in den Rechner zu laden.

Das Programm ist übrigens Teil der Turbo-Assembler-Distribution, ist aber trotzdem PD. Mit diesem Programm wäre es möglich, eine gewisse Standardisierung bezüglich des ROM-Patchens zu erreichen.

M. Hohmuth, O-8038 Dresden

Haben auch Sie einen Quick-Tip ?

Standen Sie auch einmal vor einem kleinen, aber schier unlösbarem Problem? Dann, durch Zufall bekamen Sie einen Tip und schon war es gelöst.

Ähnlich haben wir uns diese neue Rubrik in der ST Computer vorgestellt. Aufgerufen sind auch Sie, liebe Leser(innen)! Geben Sie Ihre Erfahrungen weiter, egal, ob es um Anwendungen, Programmieren o.ä. geht.

Wir sammeln Ihre (und unsere) Tips und stellen Sie ggf. in den Quick-Tips vor.

Einsendungen an MAXON Computer ST Computer Redaktion Stichwort: Quick-Tip Industriestr. 26 W-6236 Eschborn

Laufschrift als Verzierung

Viele Programmierer erstellen ihre Programme bzw. Spiele erst auf dem ATARI, da es dort viele Sprachen und eine große Auswahl von Compilern gibt, und setzen diese dann auf andere Computer um (z. B. Ian Oliver -“Carrier Command“ oder Steve Bak - „Goldrunner“, „Return to Genesis“). Das bedeutet aber auch, daß sich eine Anzahl von kleinen oder weniger kleinen Hilfsprogrammen, sogenannten Utilities ansammeln. Derlei werden, nachdem sie nicht mehr unabkömlich sind, weitergereicht an Freunde oder Bekannte. Bis sie letztendlich als PD für jedermann erhältlich sind.

Selbst jeder Hobby-Prgrammierer gibt seinen Programmen nicht immer den letzten Schliff, aus Zeitmangel, Trägheit usw. und später werden diese mal ausgeliehen, mal an Freunde kopiert. Wie an den beiden Beispielen gezeigt, fehlt es den meisten Hilfsprogrammen an dem gewissen Etwas, das Signum des Programmierers. Für Berufs-Prgrammierer, deren Name im Business bekannt ist, und von denen man weiß, was sie zu leisten vermögen, sind derlei „Verzierungen“ natürlich unnütz, aber was ist mit dem kleinen, unbekannten Programmierer?

Wäre es nicht zweckmäßig sich auf diese Weise, als Hobby-Programmierer, einen Namen zu machen? Denn wenn man mal später einen bekannten Namen hört, denkt man an dessen nützliche Programme, die schon so oft geholfen haben, da sie sich von anderen „Rohbauten“ unterscheiden. Vorstellbar wäre das Verwenden einer Laufschrift, die nach dem Laden erscheint, und zwei Balken, die Erhebungen auf dem Bildschirm antäuschen (Bild 1 und Listing 1). Jedoch gibt es noch viele andere Verzier-Möglichkeiten, um sich in der Welt des Programmierens Aufmerksamkeit zu verschaffen. Hoffentlich vergißt niemand, auf der Suche nach einer geeigneten Verzierung für sein Programm, daß, wenn die Verzierung länger als das eigentliche Programm ist, etwas übertrieben gehandelt wurde!.

M. Brust und Ch. Roth,

' ********************************************
' * Demonstration einer Laufschrift in BASIC *
' * von Matthias Brust und Christian Roth    *
' ********************************************
'
@balken 
@lauf_schrift
'
PROCEDURE balken 
    LOCAL i|,mus&
    BOUNDARY 0              !Umrahmung aus.
    ADD muster&,100         !Y-pos des 1. Musters
    FOR i|=8 DOWNTO 1       !8 Graustufen werden
        DEFFILL 1,2,i|      !nebeneinander gelegt
        PBOX 0,SUB(muster&,5),639,muster& !und
        ADD muster&, 5      !und bilden das erste
    NEXT i|                 !Muster.
    SUB muster&,3           !Der Schönheit halber.
    FOR i|=1 TO 8           !2. Muster, wird ab-
        DEFFILL 1,2,i|      !gebaut. Sonst wie
        PBOX 0,SUB(muster&,5),639,muster& 
        ADD muster&,5       !ersteres.
    NEXT i|
    GET 0,90,639,174,balken$ !Eine Kopie anlegen. 
    PUT 0,214,balken$       !Und kopieren.
    BOUNDARY 1              !Umrahmung wieder ein.
RETURN
'
PROCEDURE lauf_schrift
    CLIP 0,0,639,399        !Überflüssige Bewegungen weg. 
    LOCAL x%, text1$, text2$, text3$ 
    text1$="--> Laufschriftdemo <---" !Textteile.
    text2$=SPACE$(20)       !Auch dies ist möglich.
    text3$="Beliebiger Text einsetzen!!!"
    FOR x%=639 DOWNTO -620  'Von Unsichtbar ins 
        TEXT x%,200,text1$+text2$+text3$
    NEXT x%                 !Sichtbare und zurück.
    CLIP OFF                !Wieder in den vorigen Zustand.
RETURN

Rechte Maustaste arbeitslos?

Da ich in vielen Dialogen meiner Programme auch die rechte Maustaste benutze, bleibt mir leider die Benutzung von form_do versperrt, weil es nur die linke Maustaste erkennt. Gerne hätte ich nun aber das form_do-Handling beim Drücken eines Knopfes, so daß der Knopf invertiert wird, aber trotzdem als Notbremse mit gedrückter Maus noch verlassen werden kann, ohne daß die Aktion ausgeführt wird. Also habe ich eine kleine Funktion geschrieben, die genau dieses ermöglicht.

Die Funktion muß direkt nach dem Drük-ken des Knopfes mit dessen Koordinaten angesprungen werden. Man möge mir den intensiven Gebrauch von Line-A-Routinen verzeihen, doch dürfte es ein leichtes sein, die Routine auch auf VDI umzuschreiben.

Benötigte globale defines und Variablen:

Am Anfang des Programms muß einmal linea_init() aufgerufen werden.

#include <aes.h>
#include <linea.h>

#define TRUE 1 
#define FALSE 0

int mask_black [1] = {-1};

H. Plontke, W-6070 Langen

int mousek(void)
{
int dummy,k;

    graf_mkstate(&dummy,&dummy,&k,&dummy); 
    return k;
}

int mousex(void)
{
int dummy,x;

    graf_mkstate(&x,&dummy,&dummy,&dummy); 
    return x;
}

int mousey(void)
{
int dummy,y;

    graf_mkstate(&dummy,&y,&dummy,&dummy); 
    return y;
}

int inside(int x,int y,int x1,int y1,int x2,int y2)
{
    if((x > x1) && (x < x2) && (y > y1) && (y < y2)) 
        return TRUE;
    else
        return FALSE;
}

int do_button(int x1,int y1,int x2,int y2)
{
int in;

    set_wrt_mode(XOR); 
    set_pattern(mask_black,0,0); 
    hide_mouse();
    filled_rect(x1 + 2,y1 + 2,x2 - 2,y2 - 2); 
    show_mouse(1);

    in = TRUE; 
    while(mousek() ) {
        if(in == TRUE && (!inside(mousex(),mousey() , x1,y1,x2,y2))) { 
            in = FALSE; 
            hide_mouse();
            filled_rect(x1 + 2,y1 + 2,x2 - 2,y2 - 2); 
            show_mouse(1);
        } else if (in == FALSE && inside(mousex(),mousey(),x1,y1,x2,y2)) { 
            in = TRUE; 
            hide_mouse();
            filled_rect(x1 + 2,y1 + 2,x2 - 2,y2 - 2); 
            show_mouse(1);
        }
    }
    return in;
}

Programm ruft Programm

Der Aufruf eines weiteren Programms aus einem bereits aktiven heraus wird durch das Betriebssystem des ST unterstützt. Liegt dieses Programm aber irgendwo auf der Festplatte, womöglich in einem Unterunterverzeichnis versteckt, und es benötigt dann auch noch ein bestimmtes RSC-File, wird der Ladeversuch oftmals mit der Meldung „* .RSC nicht vorhanden!“ abgebrochen.

Das Problem: Das weitere Programm wird mit dem Environment des aufrufenden Programms gestartet.

Die Lösung: Der Pfad des Programms wird in eine Laufwerks- und Pfadangabe zerlegt. Mit diesen beiden Angaben kann über die Funktionen dset-drv() und destpath() (CHDRIVE und CHDIR in GFA-BASIC) dem Programm sein gewünschter Startpfad gegeben werden. Nun kann mit pexec() das Programm ohne weitere Parameter aufgerufen werden.

S. Kaminski, Vf-2391 Quern

' Routine zum starten anderer Programme aus eigenen Programmen heraus 
' Verhindert den erfolglosen Versuch mit falschem Environment 
' Geschrieben von Steffan Kaminski (2/92)
' Programmiersprache : GFA-BASIC
' 
PROCEDURE starte_prg
    IF EXIST(pfad$+"*.PRG")=TRUE
        ~MENU_BAR(menadr%,0)            ! Menü ausschalten
        CHDRIVE LEFT$(pfad$,1)          ! Laufwerk setzen
        CHDIR MID$(pfad$,1)             ! Pfad setzen
        EXEC 0,pfad$+"*.PRG","",""      ! Programm starten
        ~MENU_BAR(menadr%,1)            ! Menü wieder einschalten 
    ELSE
        ~FORM_ALERT(1,"[3][ Das Programm | steht nicht im | angegebenen Verteichnis !][Abbruch]")
    ENDIF
RETURN

Fehlerberichtigung!

In Ihrem Quicktip „Dialogbox mal größer“ in der ST-COM-UTER 2/92, Seite 162, konnte ich zwei Fehler feststellen. Die Zeile 33 müßte richig lauten:

TEXT 320-(LEN(t$)/2)X8,y1+(a*20),t$

(falsch war hier das Pluszeichen in der letzten Klammer). Der Fehler wirkt sich so aus, daß die Textzeilen, die in der Box untereinander stehen sollten, in der obersten Zeile fast übereinander liegen und nur einen Zeilenvorschub von einer Pixel-Größe haben.

In Zeile 53 ist der letzte Grö-ßer-Operator falsch, diese Zeile müßte so richtig sein:

IF x>x1 AND x<x2 AND y>y1 AND y<y2

Dieser Fehler bleibt zunächst unsichtbar und ist nicht so dramatisch wie der erste. Erst, wenn die Maustaste gedrückt wird und sich der Mauszeiger zwar innerhalb einer Dialogbox, aber nicht auf dem „OK“-Knopf befindet, hört man den bekannten „Plink“-Ton, der eigentlich nur zu hören sein dürfte, wenn man den Mausknopf außerhalb der Dialogbox drückt. Vielen Dank auch an Herrn Hitzschke, der die Fehler ebenfalls bemerkte.

S. Heilgenthal, W-8770 Lohr Pßochsbach

Trennhilfe im Fileselector

Zu Anfang des Programms erscheint eine Filselectorbox, in der man irgendeine Datei anwählen kann. Das Programm zerlegt daraufhin den Parameter datei$ in zwei. Der gewählte Pfad wird in p$ und der gewählte Dateiname in f$ abgelegt. Das beigefügte Listing kann man z.B. in eigene Textverarbeitungsprogramme einbauen, damit man beim Abspeichern nicht immer hin- und herklicken muß.

A. Hitzschke, W-2990 Papenburg

' Programm zum Trennen des vollen Dateinamens 
' in einen Pfad und eine einzelnen Datei
' 
' Autor: Andre Hitzschke 
' Sprache: ab GFA-BASIC 1.0
' 
FILESELECT "\*.*","", datei$
IF datei$<>"" AND EXIST <datei$> 
    z$ = ""
    FOR i=1 TO LEN<datei> 
        z$=MID$<datei$,i, 1>
        IF z$="Ü" 
            stelle=i 
        ENDIF 
    NEXT i
    ' 
    f$=RIGHT$<datei$,LEN<datei$>-stelle>
    ! Datei unter "f$"
    p$=RIGHT<LEFT$<datei$,stelle>,stelle>
    ! Pfad unter "p$"
    ' 
    PRINT "Sie wählten die Datei ..."
    FILESELECT p$+"*.*",f$,datei$
    END
ENDIF

MROS-Programme

Wer bisher den TT-Desktop als Autoordnerprogramm TT GEM3.PRG startete, dem blieben außer „LIVE“ alle MROS-Programme verwehrt, beim Bewegen der Maus gab es dann 4 Bomben. Mit dem folgenden kleinen C-Programm kann dem abgeholfen werden. Das Programm schreibt in die Versionsnummer des TOS ganz frech eine „0300“ hinein, dem MROS wird also vorgetäuscht, es laufe auf einem TT, so daß die für den neuen Desktop notwendige Anpassung dort vorgenommen wird. Leider läuft das ganze nur bis zum Ende des danach gestarteten MROS-Pro-gramms, aber das ist ja schon mal besser als gar nichts.

H. Plontke, W-6070 Langen

void main(void)
{
long Super(void *stack);
void *stack;

    stack=(void *)Super(0);
    * unsigned int *) ( *(unsigned long *)0x4f2 + 2)=0x0300;
    Super(stack);
}


Aus: ST-Computer 05 / 1992, Seite 166

Links

Copyright-Bestimmungen: siehe Über diese Seite