Für alle Protext-Anwender, die neben den vielseitigen Optionen der bekannten Standardprogramme die Sortierfunktionen, Phrasendefinitionen und diversen Extras schätzen gelernt haben, entstand meist die Frage, wie man in NLQ drucken, einen eigenen Zeichensatz erstellen kann usw. Natürlich wird es über das Zusatzprogramm Prodruck ermöglicht, einen eigenen Druckertreiber zu erstellen, doch die Einarbeitungsmühe rentiert sich nur bei entsprechender intensiver Nutzung des Programms. Doch es geht auch anders:
Über die meistgenutzte Befehlstaste ESC und “G“ lädt man sich den Zeichensatz ein, der in der 1. Zeile als fünftletztes Zeichen ein ESC enthält. Wird dieses ESC am Seitenanfang des aktuellen Schriftstückes positioniert, läßt sich beispielsweise mit “x1" problemlos der Drucker auf NLQ umstellen (Star NL 10). Auch eine Kombination mit geändertem Zeilenabstand (im Programm sind ja nur 1-, 1,5- und 2zeilige Abstände vorgesehen) kann in Verbindung mit NLQ z.B. durch “ESC 2 ESC x1” vorgenommen werden. Die angegebenen Druckerbefehle sind nur eine kleine, aber wirkungsvolle Auswahl. Weitere Kombinationen bei weiteren Druckertypen unterliegen dem allseits bekannten “trial and error”.
Klaus Tollkühn
Gegenüber den übrigen ST-Modellen benötigt man beim 1040 STE keine Löterfahrung, um den internen Speicher zu verändern. Dort sind vier Speicher-Slots für SIMM-RAM-Karten vorhanden. Schwieriger wird es dann schon, wenn man vor dem Problem steht, welche SIMM-Karten man verwendet. Generell können sowohl 1MBx8- als auch 1MBx9-Karten benutzt werden. Bei letzterer liegt allerdings der gegenüber der ersten Karte zusätzliche Speicher (Datenleitung) brach. Er wird vom ST nicht erkannt. Die Zugriffszeit der RAMs sollte 130nS oder schneller sein. Werden nur zwei der vier Plätze verwendet, sind der vordere und der dritte zu bestücken. War Ihr Rechner vor dem Ausbau mit 256kB SIMM-Karten bestückt, können Sie diese leider nicht zum Ausbau auf 2,5 MB verwenden.
TW
Als Ergänzung zu unserer Schaltung im ST-EXTRA 1/90 hier eine weitere Anschlußmöglichkeit. Diese hat, gegenüber der bisherigen, den Vorteil, daß sie auch mit Rechnern, die kein Composite Sync- und kein 12V-Signal haben, funktioniert. Der Nachteil ist, daß nun der Fernseher von Hand auf SCART-Empfang umgeschaltet werden muß. Die Verdrahtung ist im Bild zu sehen.
Dirk Rode
Viele Accessories lassen sich auch als Programm starten. Dazu muß die Endung “. ACC” durch ".PRG" ersetzt werden. Dieses Umbenennen ist aber lästig, wenn man das Accessory nur kurz ausprobieren will. Einfacher ist es, wenn man in die DESKTOP.INF Datei der Boot-Diskette oder -Partition folgende Zeile einfügt:
#G 04 FF *.ACC@ @
Accessories werden danach im Desktop ganz normal als Datei angezeigt, jedoch kann man sie mit einem Doppelklick starten. Accessories, die nicht als Programm gestartet werden können, führen leider nach dem Starten eine Endlosschleife aus, so daß ein Reset notwendig wird; also vorher wichtige Texte etc. abspeichern!
Thomas Mokler
Wie vielen anderen Festplattenbesitzem war es mir nach kurzer Zeit zu lästig, Festplatte und Computer getrennt einzuschalten. Ich probierte die verschiedenen Lösungen fürs gemeinsame Einschalten aus, die mich nicht zufriedenstellten, da sie zu umständlich waren (Diskette im Laufwerk...). Außerdem stellte ich fest, daß meine Festplatte schneller hochfährt, wenn der Computer solange ausgeschaltet bleibt. Ich entwickelte eine kleine Schaltung, mit der der Computer verzögert eingeschaltet wird. Die Schaltung besieht aus einem Operationsverstärker LM741, einem Trimmer zur Einstellung der Zeit und einem Kondensator, welcher über einen 100 kOhm-Widerstand geladen wird. Wird der eingestellte Spannungspegel erreicht, liegt am Ausgang des OPs in etwa Betriebsspannung an. Diese Spannung macht über den Spannungsteiler den Transistor leitend, welcher dann das Relais ansteuert. Die Diode soll Induktionsspannungen kurzschließen. Das Relais muß aus Sicherheitsgründen für 220 V zugelassen sein (VDE-Zeichen) und doppelseitig abschalten. Die Sicherung arbeitet von 6 bis 24 V zuverlässig, man kann sich nach der Relaisspannung richten. Die Betriebsspannung muß nicht aufwendig stabilisiert werden, da die Zeitkonstante nicht von der Betriebsspannung abhängt. Der Trimmer läßt sich von zirka 5 bis 70 Sekunden einstellen. Wird der Trimmer auf den rechten oder linken Anschlag gestellt, wird der Transistor immer bzw. nie leitend. Die Schaltung kann in das Gehäuse des Computers oder Netzteils bei Verwendung eines 12V-Relais eingebaut werden (Vorsicht bei Schaltnetzteilen!).
Thomas Mokler
Sie haben ein schönes Programm erstellt und stellen fest, daß es in gewissen Fällen angenehm wäre, den Output auszudrucken. Man kann natürlich den Bildschirminhalt mehr oder weniger bequem auf den Drucker geben. Eleganter ist jedoch die Verwendung der folgenden Aussage im Programm:
if (Cprnos()) Fforce(1,Fdup(3));
Wenn der Drucker nicht angeschlossen ist, erscheint der Output wie bisher auf dem Bildschirm. Ist er angeschlossen, wird die Bildschirmausgabe auf den Drucker umgeleitet.
Walter Fassler
Die in Mega STs eingebaute Uhr sowie baugleiche Erweiterungen für kleinere STs können mehr als nur Datum und Uhrzeit ermitteln. In diesem Chip ist zum Beispiel ein Wecker eingebaut, der leider nicht benutzt werden kann, weil ab TOS 1.2 unsinnige Werte in die Alarmregister geschrieben werden, um ein Vorhandensein der Uhr zu testen. Benutzen kann man aber immerhin die Register für Wochentag und Schaltjahr. Diese Register können nicht über XBIOS erreicht, sondern müssen direkt adressiert werden.
Wochentag:
Bit 0 in $FFFC3B löschen
(Bank 0 selektieren);
Register ist $FFFC2D
Schaltjahr:
Bit 0 in $FFFC3B setzen
(Bank 1):
Register ist $FFFC37
Das Wochentag-Register beinhaltet Werte von 0 bis 6, wobei 0 für Sonntag und 6 für Samstag steht. Das Schaltjahr-Register wird jedes Jahr um eins erhöht. Wird die Zahl drei erreicht, folgt danach eine 0, die soviel wie “Schaltjahr" bedeutet. Zu beachten ist weiterhin, daß diese Register nur 4 Bits breit sind und daß sich die CPU beim Zugriff im Supervisormodus befinden muß. Ein Omikron.BASIC-Programm soll die Programmierung verdeutlichen:
Thomas Mokler
CLS
Tag_ermitteln
PRINT "Wochentag : ";MID$("SoMoDiMiDoFrSa", 2*Tag!+1,2)
Schaltjahr_Ermitteln
PRINT "Schaltjahr in ";4-Sjahr!;" Jahren"
PRINT
INPUT "Einstellungen richtig (J/N)";a$
IF A$="n“ OR A$=“N" THEN
PRINT
Tag_Stellen
PRINT
Schaltjahr_Stellan
ENDIF
END
'
DEF PROC Tag_Stellen
POKE $FFFC3B,PEEK($FFFC3B) and 14
A$=CHR$(48+(PEEK($FFFC2D] AND 15))
INPUT "Wochentag (0-6; O=Sonntag) :";A$ USING "0-9-8-7x",Ret!,1
IF Ret!=0 THEN
POKE $FFFC2D,ASC(A$)-48
ENDIF
RETURN
'
DEF PROC Schaltjahr_Stellen
POKE $FFFC3B,PEEK($FFFC3B) OR 1
A$=CHR$(48+(PEEK($FFFC37) AND 15))
INPUT "Schaltjahr in .. Jahren :";A$
USING "+0+1+2+3x",Ret!,1
IF Ret!=0 THEN
POKE $FFFC37,4-(ASC(A$)-48)
ENDIF
RETURN
'
DEF PROC Tag_Ermitteln
POKE $FFFC3B,PEEK($FFFC3B) AND 14
Tag!=PEEK($FFFC2D) AND 15
RETURN
'
DEF PROC Schaltjahr_Ermitteln
POKE $FFFC3B, PEEK($FFFC3B) OR 1
Sjahr!=PEEK($FFFC37) AND 15
RETURN
Listing 1: Die Ausnutzung der Mega ST-Uhr unter Omikron.BASIC
Es gibt Situationen, in denen man wissen muß oder möchte, mit welchem Namen das Programm gestartet wurde. Meist versucht man, im aktuellen Ordner oder in einem vorgegebenen Pfad eine entsprechende Datei zu finden. Es gibt allerdings eine wesentlich einfachere Methode ohne jegliche Dateizugriffe.
Jedes Programm besitzt eine Basepage, die direkt vor dem Programm steht und 256 Bytes beansprucht. In dieser Basepage gibt es unter anderem einen Zeiger auf die Basepage des Programms (den Parent). von dem das aktuelle Programm aufgerufen wurde, und einen Zeiger auf eine sogenannte DTA (Disk Transfer Area). In dieser DTA wird der Name des Programms vermerkt, das aufgerufen werden soll. Wenn man sich nun über die eigene Basepage den Zeiger auf die Basepage des Parents besorgt, kann man in der DTA des Parents nachsehen. mit welchem Namen das Programm aufgerufen wurde. Da man in der DTA auch die Datei länge erfahren kann, wäre dies auch eine Möglichkeit, sich vor Linkviren zu schützen. Das funktioniert auch, wenn das Programm im AUTO-Ordner steht oder vom Desktop aufgerufen wurde, da das TOS oder Desktop auch nur Programme sind, die eine Basepage besitzen. Eine Ausnahme besteht dann, wenn das Programm nicht direkt mit Pexec() gestartet wurde, wie das die meisten Debugger machen. Jetzt zu den Zeigern:
Den Zeiger auf die eigene Basepage müssen Sie in Ihrer Dokumentation nachlesen. Der Laser C-Compiler bietet z.B. eine externe Variable “_base" an. Den Zeiger auf den Parent finden Sie ab der Position 36 ($24) in der Basepage. Der Zeiger auf den DTA befindet sich ab der Position 32 ($20). Der DTA hat folgendes Format (Offsets stehen in HEX-Zahlen am Anfang):
Axel Seeberg
typedef struct
{
$00 char d_res[21] /* reserviert */
$15 char d_attrib: /* Dateiattribut */
$16 int d_time; /* Zeit */
$18 int d_date; r Datum */
$1A long d_length; /* Dateilänge */
$1E long d_fname[14]; /* Dateiname */
}
Der Aufbau des DTA
Die Datenbank 1st_Address ist zweifellos ein sehr gutes Produkt. Leider paßt sie die Datensätze nicht an, wenn man zusätzliche Felder einfügt oder löscht. Um nun nicht alle Datensätze mit einem Editor bearbeiten zu müssen, gibt es eine ganz einfache Lösung. Man erstellt die neue Datenbank, jedoch erst einmal unter anderem Namen. Jetzt schreibt man für die alte Datenbank eine Druckerliste für die Übertragung über den Tastaturprozessor (KEYBUF), in der alle Felder, welche die neue Datenbank enthalten soll, eingetragen sind. Hier müssen dann evtl. Felder ausgelassen oder durch ein RETURN ersetzt werden. Jetzt wird der gesamte Datensatz über “drucken" in den Tastaturpuffer umgeleitet, wobei vor dem Anklicken von OK erst die Caps-Lock-Taste gedrückt werden muß. damit der Speicher einfriert. Jetzt wird die neue Datenbank aufgerufen. F2 gedrückt und dann Caps Lock. Nun schreibt das Programm sämtliche Daten im neuen Format in die neue Datenbank. Wichtig ist aber, daß dabei kein Bildschirmschoner verwendet wird, da dieser, wenn er aktiv wird, den Vorgang solange stoppt, bis der Schirm wieder sichtbar ist (im Gegensatz zu Bildschirmuhren arbeitet 1st_Address bei einer Bildschirmabschaltung auch intern nicht weiter). Jetzt kann man die alten *\MSK- und *.DAT-Dateien löschen und die neuen umbenennen - fertig.
Ulrich Behning
In einer der letzten Ausgaben hat ein Leser von Problemen berichtet, die er bei der Programmierung von Accessories mit Sozobon C hatte. Auch wenn er seine Probleme nicht genau beschrieben hat, ist die Ursache dafür mit ziemlicher Sicherheit im Startup-Code (DSTART.O) zu suchen. Für Accessories ist er in der vorliegenden Form nämlich ungeeignet, unter anderem wegen der Art und Weise, in der er die Startadresse der Basepage ermittelt. Anbei deshalb eine Minimalversion für einen Accessory-Startup-Code zusammen mit einem Testprogramm. Es ist übrigens durchaus möglich, einen Startup-Code zu schreiben, der für Programme und Accessories gleichermaßen geeignet ist. Man muß nur die Basepage auf das Vorhandensein eines Elternprozesses überprüfen. Existiert einer, wurde der Code als Programm gestartet.
Ernst-Christian Maschler
* Desk-Accessory-Startup-Code
* (c) MAXON Computer GmbH 1990
*
* Benutzung:
* cc -c -o dastart.o dieshier.s
* cc -c test.c
* ld -o test.acc dastart.o test.o aesfast.a
.text
start: move.l #initsp,sp *256 Bytes v. Start
*Basepage
jsr main *main: nie zurück
.bss
.even
stack: .ds.l 1024 *Stack=4k
initsp: .ds.l 1
.end
/* Ein (nutzloses) ACC z. Test v. dastart.o */
#include <gemfast.h>
int msgbuf[8];
main()
{
int ap_id,menu_id;
ap_id=appl_init();
menu_id=menu_register(ap_id," Test”);
while(1){
evnt_mesag(msgbuf);
if((msgbuf[0]==AC_OPEN) && (msgbuf[4]==menuid))
form_alart(1, "[1][Test][OK]”);
}/* while */
} /* main •/
Listing 2: Ein Minimal-Code für Accessories unter Sozobon C
Viele neue Drucker haben einen hübschen Befehl zur Blocksatzformatierung, beim Star LC 10 z.B. “ESC 32 n". Man kann zwischen jedem Zeichen einer Zeile den Abstand vergrößern und so den rechten Rand des Absatzes justieren. Der Parameter “n” soll angeben, um wieviel 1/240 Grad der Zeichenabstand breiter wird. Leider muß man beim LC 10 ziemlich lange herumsuchen, bis man den Befehl im Griff hat. Im bei stehenden Programm werden die Einschränkungen gelistet. Auch am Parameter “n” mußte nachgeschliffen werden. Die Prozedur rechnet die Länge des fehlenden Endstücks der Zeile zuerst in Zeichenbreiten, dann in “n"-Gesamtbreite aus. Da jedes Zeichen den gleichen Zuschuß bekommt, wird gerechnet, wieviel “n”jedes Zeichen haben soll und wieviel Zeichen überhaupt breiter werden sollen. Bitte beachten: N% speichert die ganzzahlige Division von Nn und L%, genauer heißt es “Nn DIV L%+1” Die Anzahl der bleibenden Zeichen wird “Anfang" genannt und bestimmt den Anfang der Zeile, die nicht geändert wird.
Jean Wantzenriether
' Blockaatz mit GFA-BASIC
' (c) MAXON Computer GmbH 1990
'
PRINT CHR$(10);CHR$(7);
DATA "Der Blocksatz mit dam LC10. Achtung !"
DATA "Ohne NLQ geht es nicht. Italic und"
DATA "Condensed sowie Proportional sind"
DATA "ausgeschlossen."
DATA "PICA und ELITE"
DATA "in ihren drei NLQ-Styles **"
'
a%=34 !Anzahl Zeichen pro Zeile
mode$="PICA" 'oder ELITE
LPRINT TAB(10); 'TAB initialisieren
LPRINT CHR$(27)+"x“+CHR$(1) !NLQ ein
'
FOR i%=1 TO 6
READ a$
IF LEN(aS)=a%
LPRINT TAB(10);a$
ELSE
@formatiaran
ENDIF
NEXT i%
'
PROCEDURE formatieren
erst%=1 !Einrückungen bleiben
WHILE MID$(a$,erst%,1)=" "
INC erst%
WEND
lang%=LEN(aS)
nn-(a%-lang*)*(20-4.28*(mode$="PICA"))
n%=nn/(lang%-erst%+1) +1
anfang%=lang%-nn/n%
LPRINT TAB(10);LEFT$(aS,anfang%)
LPRINT CHR$(27);" ";CHR$(n«); !EIN
LPRINT MID$(a$,anfang%+1,a%);
LPRINT CHR$(27);" " CHR$(0) !AUS
RETURN
Listing 3: Blocksatz mit GFA-BASIC (ab Version 2.0) und Star L-10
Wenn Sie Turbo Pascal 5.0 unter PC-Speed V1.4 laufen lassen und die ATT Olivetti-Auflösung 640x400 monochrom benutzen wollen, ist wie folgt vorzugehen (s.Listing 4):
K. Eisenegger
program init_graph; {Programmname}
uses crt,graph; {Unit Graph und CRT ladan}
var treiber, modus: integer; {Variablen}
procedure ST_hires; {Grafikkarte a.}
var treiber, modus: integer; {m. detect abf-}
begin {ragen! Detect installie-}
treiber:=8; {rt EGA Modus! Hier: ATT }
modus:=5; {640*400}
initgraph(treiber,modus,'');
end;
procedure detect_karte;
var treiber, modus: integer; {Prozedur lief-}
begin {ert nicht max.Auf1.d.SM124}
treiber:=detect; {nämlich 640x400}
initgraph(treiber,modus,'');
end;
begin
clrscr; {CRT Modus Bildsch. löschen }
ST_hires; {640x400 Mono einschalten }
{ hier Hauptprogramm }
closegraph { ...schließen }
end. { und tschüß }
Listing 4: Der Olivetti-Modus des PC-Speed unter TP 5.0