DATUM per Mausklick: Der Wievielte ist heute?

Sicher haben Sie sich schon gefragt, ob man diese kleinen Uhrplatinen, die man zusätzlich in den ST einbauen kann, nicht intensiver nutzen kann. Nur um immer das richtige Datum auf den Disketten zu haben, dazu sind sie zu teuer. Man müßte zum Beispiel das Datum in einer Textverarbeitung o. ä. an der Stelle des Cursors ausgeben lassen können. Wenn Sie diese Funktion in herkömmlichen Textverarbeitungsprogrammen vermissen, dann ist dieses mit dem Megamax C-Compiler geschriebene Accessory genau das richtige für Sie.

Natürlich funktioniert das Programm auch dann, wenn man keine zusätzliche Uhr eingebaut hat. Man muß nur einmal das Datum mit Hilfe des Kontrollfeldes eingeben. Das Datum kann auf zwei verschiedene Arten ausgegeben werden: kurz („5.6.1987“) und lang („5. Juni 1987“). Nachdem man den entsprechenden Eintrag im Menü angeklickt hat, erscheint eine Alertbox (siehe Bild 1). Das Datum wird anschließend hinter dem Cursor ausgegeben (Bild 2).

Das Besondere an dem Programm ist, daß es den Tastaturpuffer verändert. Dazu wird die Routine ,,output()“ benutzt. Dieses Unterprogramm speichert einen vorher zusammengestellten String in den Tastaturpuffer. Bevor man diese Routine in eigene Programme einbauen kann (was natürlich möglich ist), muß man einiges wissen:

Das Betriebssystem des ST besitzt eine Funktion namens „Iorec“ (Xbios 14), welche einem die Adresse des Tastaturpuffers und andere interessante Parameter übergibt (besser: sie übergibt die Adresse auf eine Tabelle mit den gewünschten Werten). Der Tastaturpuffer ist 256 Byte lang (auch das erfahren wir durch diese Funktion) und kann 64 Zeichen aufnehmen. Das bedeutet, daß pro Zeichen vier Byte gebraucht werden. Im ersten Byte sind einige Flags gespeichert, die angeben, ob z. B Control oder Alternate zusammen mit der Taste gedrückt wurden. Das zweite Byte gibt den Scancode der Taste an. Das dritte Byte ist ganz einfach leer und im vierten Byte schließlich steht der Ascii-Code der gedrückten Taste (Bild 3). Es existieren noch zwei Zeiger, die auf den Anfang und das Ende der noch auszugebenden Zeichen zeigen. Das bedeutet, daß wir es mit einem „Fifo“-Puffer (first in-first out) zu tun haben. Wenn diese Zeiger den gleichen Wert haben, ist der Puffer leer. Wenn nicht, werden die Zeichen nacheinander ausgegeben.

Jetzt wird’s kompliziert: Die „output()“-Routine schreibt nicht sofort alle Zeichen in den Tastaturpuffer. Es gibt Programme (1st Word Plus), die den Tastaturpuffer gerne mal leeren, und dann wäre vom Datum nicht mehr viel übrig. Also muß ein Buchstabe nach dem anderen in den Tastaturpuffer geschrieben und dann von der Textverarbeitung ausgegeben werden. Anders gesagt: Der ST muß zwei Programme quasi gleichzeitig abarbeiten (Multitasking), wobei ein Programm (die Textverarbeitung) gar nicht dafür vorbereitet ist. Die Lösung des Problems heißt: EVNT_TIMER! Nachdem dieser AES-Befehl abgearbeitet wurde, wird die Textverarbeitung gestartet. Diese wiederum wartet auf ein Zeichen im Tastaturpuffer, indem sie ebenfalls einen EVNT-Befehl abarbeitet. Nun tritt das Accessory wieder in Aktion. Ein Zeichen wird in den Tastaturpuffer geschrieben und der EVNT_TIMER-Befehl erneut abgearbeitet. Die Textverarbeitung findet das Zeichen im Puffer und gibt es aus. Die Suche nach einem weiteren Zeichen ist erfolglos, und so wird das Accessory erneut gestartet. Nachdem alle Zeichen ausgegeben wurden, wird diese Routine beendet.

Ein Tip für 1st Word Plus-Benutzer: Wenn Sie das Datum sauber ausgeben wollen, dann schreiben Sie zuerst den Ort, geben das Datum aus und wählen dann im Menüpunkt „Attribute“ die Funktion „rechtsbündig“ aus.

/********************************************/
/*                                          */
/*               DATUM V1.C                 */
/*                                          */
/* geschrieben von: Simon Gleissner         */
/*                  Bingenheimer Str. 46    */
/*                  6361 Reichelsheim       */
/*                                          */
/*                   mit MEGAMAX-C          */
/********************************************/

#include "osbind.h" /* alles laden... */ 
#include "obdefs.h" 
#include "gemdefs.h" 
#include "define.h" 
#include "gembind.h"

int contrl[12], /* diverse Variablen & Felder */ 
	intin[128], 
	ptsin[128], 
	intout [128], 
	ptsout[128], 
	msgbuff [8], 
	menu_id, 
	alert, 
	datum, 
	schleife, 
	monat,
	out_pointer, 
	ibufsize, 
	ibufhd, 
	ibuftl; 
long iorec_point,
	ibuf;
char out _puffer[30]; 
char fo_astring[] =
	"[1] [DATUM V1.0 wurde von|Simen Gleissner geschrieben.|Wie möchten Sie das Datum?|Lang: 24. Dezember 1987|Kurz: 24.12.1987][Lang|Kurz| Zurück]";
	/* Bitte beim Abtippen beachten: Der String muß in einer Zeile stehen! */ 
extern gl_apid;

main()					/* Hauptprogramn */
{
	iorec_point=Iorec(1); 				/* Zeiger auf Tastaturzeiger */
	ibuf=* (lcog*)iorec_point; 			/* Zeiger auf Tastaturpuffer */
	ibufsize=*(int*)(iorec point+4); 	/* Größe des Puffers */
	appl_init(); 						/* Applikation anmelden */
	menu_id=menu_register(gl_apid," Datum "); /* Accessory anmelden */
	FOREVER								/* Endlosschleife */
	{
		out_pointer=0; /* Zeiger an den Anfang des Ausgabepnffer */
		evnt_mesag(msgbuff); /* Auf Nachricht im Ereignispuffer warten */
		if (msgbuff[0]==AC_OPEN&&msgbuff [4]==menu_id) /* Accessory angeklickt? */
		{
			alert=form_alert(3,fo_astring); /* Alertbax anzeigen */ 
			if(alert!=3)	/* kein Abbruch */
			{
				date();		/* Datum in Ausgabepuffer schreiben */
				output();	/* Ausgabepuffer ausgeben */
			}
		}
	}
}

output ()	/* Ausgabepuffer ausgeben */
{			/* (jetzt kommt ein bißchen Multitasking) */
	for(schleife=0;schleife<out_pointer;) /* Schleife */
	{
		evnt_timer(0,0); 	/* Kontrolle des Computers kurzzeitig abgeben */ 
		ibufhd=*(int*) (iorec_point+6); /* Head-Zeiger des Tastaturpuffers */
		ibuftl=4+*(int*) (iorec_point+8); /* Tai1-Zeiger des Tastaturpuffers */ 
		if (ibuftl=ibuf size)	/* zeigt Tail-Zeiger auf Pufferende? */
			ibuftl=0; 			/* Ja: auf Pufferanfang */
		if (ibuftl!=ibufhd)		/* Head=Tail? (Puffer voll) */
		{						/* Nein: Zeichen in Puffer schreiben */
			*(long*) (ibuf+ibuftl)=0x1e0000+out_puffer[schleife++];
			*(int*) (iorec_point+8)=ibuftl; /* und Tail abspeichern */
		}
	}
}

date() /* Datum in Ausgabepuffer schreiben */
{
	datum=Tgetdate();		/* Datum holen, */
	transform (datum & 31); /* Tag isolieren & in den Puffer schreiben */ 
	to_buffer(46); 			/* '.' in den Puffer schreiben und */
	monat=(datum&480)/32;	/* Monat holen */
	if (alert=1)			/* Wurde 'langes’ Datum gewünscht */
	{						/* Ja: */
		switch(monat)		/* Entsprechenden Monatsnamen in den Puffer */
		{
			case 1:	text("	Januar	");
					break;
			case 2:	text("	Februar	");
					break;
			case 3:	text("	März	");
					break;
			case 4:	text("	April	");
					break;
			case 5:	text("	Mai	");
					break;
			case 6:	text("	Juni	");
					break;
			case 7:	text("	Juli	");
					break;
			case 8:	text("	August	");
					break;
			case 9:	text("	September	");
					break;
			case 10: text(" Oktober "); 
					break;
			case 11: text(" November "); 
					break;
			case 12: text(" Dezember "}; 
				break;
		}
	}
	else			/* 'kurzes' Datum */
	{
		transform (monat);	/* Monat und */
		to_buffer(46);		/* in den Puffer schreiben */
	}
	transform( (datum&65024)/512+1980); /* Jahr isolieren und in den Puffer */
}

text (string)	/* schreibt einen String in den Ausgabepuffer */
char *string;
{
	for (schleife=0; string [schleife] !=0;)
		to_buffer (string [schleife++]);
}

transform (number)	/* wandelt eine Zahl in einen String und */
int number; /* schreibt diesen in den Ausgabepuffer */
{
	int step=1000, 
		flag=0, 
		zahl;

	for (schleife=0; schleife<4; schleife++)
	{
		zahl=number/step; 
		number-=zahl*step;
		step/=10;
		if (flag=1||zahl!=0)
		{
			to_buffer(48+zahl); 
			flag=1;
		}
	}
}

to_buffer(ascii) /* Schreibt ein einzelnes Zeichen in den Ausgabepuffer */ 
char ascii;
{
	out_puffer[out_pointer++]=ascii;
}
Bild 3: Das macht der Puffer

Simon Gleissner
Aus: ST-Computer 11 / 1987, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite