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
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
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
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;
}
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
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
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
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);
}