Wenn man stolzer Besitzer einer Festplatte ist, läuft das Booten normalerweise so ab:
Lästig ist eigentlich nur, daß man nicht mit einem Fußtritt auf die Steckdose alles einschalten kann, da man sonst den Reset-Knopf drücken muß, damit der ST die Festplatte erkennt (beim 1040 ist das nur lästig, aber beim Mega ST geht das gehörig auf die Wirbelsäule). Abhilfe schafft eine Einschaltverzögerung, die aber etwas teuer ist (ab 50,-DM aufwärts), oder ein Kondensator, der in den Rechner eingelötet wird (mit zwei linken Händen sollte man das lieber lassen). Die Lösung ist ganz einfach: Der Griff zum Reset-Knopf wird simuliert. Wenn der ST bootet, wartet er auf die Platte. Hat er sie in einer bestimmten Zeit nicht gefunden, geht er davon aus, daß es keine Harddisk gibt. Also wird von Diskette gebootet. Rein zufällig steht dort unser Programm. Es wartet 15 Sekunden (nun sollte die Festplatte startklar sein) und führt einen Reset durch. Die Zeilen 9 bis 14 kann man weglassen, was aber stört, falls man das Programm aus Versehen angeklickt hat.
Stefan Endrejat
'IS_HD_DA PRG von Stefan Endrejat
'(c) 1990 MAXON Computer GmbH
'
test%=BIOS(10) !Bitmap der Laufwerke
FOR i|=2 TO 15 !Teste Laufwerk C...P
IF BTST(test%,i|)=TRUE !Wenn Bit gesetzt
SYSTEM !Platte da, alao Ende
ENDIF !
NEXT i| !nächstes Bit
'
PRINT "Festplatte nicht initialisiert!"
zeile|=CRSLIN
FOR zeit|=15 DOWNTO 1 !Verzögerung b. Reset
PRINT AT(1,zeile|);"Reset in ";zeit;" Sekunden.";SPC(2)
PAUSE 50 !1 Sekunde Pause
NEXT zeit|
'
' RESET-Routine aus dam Scheibenkleistar
'
~GEMDOS(&H20,L:0)
LPOKE &H420,0 'Wert für Kaltstart
LPOKE &H426,0 'Hart für Kaltatart
LPOKE &H43A,0 'Wert für Kaltatart
reset_vektor%=LPEEK(&HFC0004)
CALL reset_vektor% 'byebye
Listing : Kaltstart nach 15 Sekunden...
Wer viel mit Massenspeichem wie Festplatten oder Diskettenlaufwerken arbeitet, kennt sicher das Problem, daß manchmal bis zu 3 Ordner geöffnet werden müssen, um ein bestimmtes Programm zu laden. Dazu sind dann insgesamt 5 Doppelklicks notwendig. Das TOS erlaubt es, einen Doppelklick zu wiederholen. Klicken Sie zum Beispiel zweimal kurz auf ein Laufwerkssymbol und lassen die linke Maustaste gedrückt. Das Fenster öffnet sich trotzdem. Bewegen Sie den Mauszeiger vom Laufwerkssymbol weg, um nicht ein weiteres Fenster zu öffnen. Dann können Sie den Mauspfeil auf die zu ladende Datei bzw. den zu öffnenden Ordner bewegen (linke Maustaste immer noch gedrückt lassen). Die Datei (oder der Ordner) öffnet sich, ein weiterer Doppelklick wird nicht erforderlich. Zum Öffnen einer Datei muß die Maustaste wieder losgelassen werden. Solange die linke Maustaste gedrückt ist, müssen Sie aufpassen, daß kein falsches Objekt angewählt wird. Dies erfordert etwas Übung.
Thomas Mokier
Die MC68000 CPU hat an Pin 17 ( Halt) einen Anschluß, der bei allen STs unbelegt ist. Erhält dieser Pin ein Low-Signal wird der laufende Buszyklus beendet, und anschließend geht der Prozessor in den HALT-Zustand. In diesem Zustand sind alle Adreß- und Datenleitungen hochohmig. Der Prozessor ist dann abgeschaltet. Man kann also in seinen ST einen Schalter einbauen, mit dem man GND und -Halt verbindet. Wenn dann bei Ihrem Lieblingsspiel das Telefon klingelt, können Sie den Computer anhalten und nachher wieder absturzfrei weiterspielen. Bedingung hierfür ist aber, daß während dieser Zeit keine Tastatur- oder Mauseingaben gemacht werden, weil der Tastaturprozessor nicht angehalten wird. Eine zweite Anwendungsmöglichkeit eines solchen Schalters ergibt sich für Programmierer, die fremde Programme analysieren wollen. Schaltet man z.B. bei NEOCHROME auf Halt, verändert sich der Bildschirminhalt, weil in diesem Programm Rasterzeilen-Interrupts angewendet werden. Dies erlaubt einem erfahrenen Programmierer Rückschlüsse auf das Programm. Die dritte Anwendungsmöglichkeit besteht darin, statt eines Schalters einen Schlüsselschalter einzubauen. Es muß beim Kauf darauf geachtet werden, daß sich der Schlüssel auch in geschlossenem Zustand abziehen läßt (das ist leider nicht immer der Fall). So bleibt Ihr wertvoller ST vor unberechtigtem Zugriff verschont. Wird der Rechner bei geschlossenem Haltschalter eingeschaltet, bleibt der Bildschirm schwarz: nichts funktioniert. Besitzer eines Mega ST können den -Halt-Anschluß an Pin 33 des Mega-Busses abgreifen. Der Masseanschluß ist an Pin 31 oder 32 vorhanden.
Thomas Mokier
Mit Interesse habe ich als Besitzer eines DeskJet Plus den Test in der April-Ausgabe gelesen und kann dem Autor nur zustimmen. Das größte Manko, die sehr hohen Betriebskosten, läßt sich jedoch mit einem einfachen Trick drastisch senken: Da die Lebensdauer des Druckkopfes im allgemeinen die Reichweite des Tintenvorrates deutlich überschreitet, bietet sich ein Wiederbefüllen durch das Lüftungsloch an. Mit einer Injektionsspritze und einem ordinären Tintenfaß läßt sich die Patrone wieder auffüllen. Zwar wird diese Methode von HP nicht empfohlen, hat sich aber bei vielen Nutzern als erfolgreich erwiesen (siehe USENET). Der Druckkopf, der durch eine Tinte mit anderen Eigenschaften verstopfen könnte, würde ja eh weggeworfen. Ich benutze schwarze Tinte von Markenherstellern, die in Deutschland meist vom selben Lieferanten versorgt werden. Sollte dann doch eine Düse verstopfen und auch durch Reinigen nicht frei werden, verbleiben ja noch 49 andere, die Qualität bleibt auch dann noch auf höherem Niveau als bei manchem Nadeldrucker. ATARI-User sollten sich vor dem Erwerb von Hard- oder Softfont-Modulen unbedingt ansEhen, ob sie mit Script oder Signum! nicht viel mehr für viel weniger erhalten.
Frank Helfertch
Wenn man die Uhrzeit messen will, sind die "normalen" Pascal-Funktionen (clock, get-time) unbrauchbar, da sie beide im 2-Sekundentakt arbeiten. In der ST-Computer 7/88 (und korrigiert 1/89) wurde aber ein kleines GFA-BASIC-Programm abgedruckt, das Zeitmessung im Millisekundenbereich erlaubt. Mit der Zusatzbibliothek PASTIX ist auch die Übernahme von Peeks und Pokes (obwohl im Standard-Pascal nicht vorgesehen) ein Kinderspiel, da die betreffenden Funktionen alle vordefiniert sind. Die Umsetzung schien jedoch unmöglich, da laut Handbuch die Verwendung der XBIOS-Routine 31 nicht möglich ist. Die Praxis zeigt jedoch, daß - entgegen der Meinung von CCD - die Funktion nutzbar ist; die Uhr läuft also korrekt. Man muß nur darauf achten, daß man die Compiler-Option $I+ nicht verwendet, sonst produziert man drei Bomben. Abhilfe für diesen Fall: die Integer-Variablen durch short-Integer und trunc durch long-trunc ersetzen. Das Listing muß mit $i eingebunden werden, ein erstmaliger Aufruf erfolge mit inituhr (um die Uhr zu starten), danach kann die Zeit - ähnlich wie mit "clock" - seit dem Aufruf mit uhr200 abgefragt werden - nur etwas genauer.
Philipp Maier
procedure inituhr (var uhr: integer);
var bild: integer;
zeit: integer;
function physbase: integer,
xbios(2);
procedure xbtimer(timer,kontrolle,daten: integer; routine: integer);
xbios(31)
(* Einbindan dar PASTRIX-Routinen *)
procedure lpoke(adresse: integer; wert: integer);
external;
procedure wpoke(adresse: integer;wert: integer);
external;
BEGIN
bild:=physbase;
zeit:=bild+32200
uhr:=zeit+20;
lpoke(zeit,146341893);
lpoke(zeit+4,16775695);
lpoke(zeit+0,41743359) ;
wpoke(zeit+12,21177)
lpoke(zeit+14,uhr)
wpoke(zeit+18,20083)
lpoke(uhr,0);
xbtimar(0,2,246, zeit);
end;
function zeit200 (uhr: integer): integer;
var u: integer
(* Noch eine PASTRIX Funktion *)
function lpeek(adresse: integer): integer;
external;
begin
u :=lpeek(uhr);
u :=u+u div 1024
u :=trunc(u+0.5)
zeit200 :=u;
END
Listing : Eine genaue Uhr unter Pascal
Zu 1st Word+ 3.15 ist viel Kluges geschrieben worden. Allerdings enthält das Programm seine Tücken, die besonders Umsteiger von Version 2.02 rasend machen können. Es handelt sich durchweg um Kleinigkeiten, die in Tests und Rezensionen nicht angesprochen wurden. Der Reihe nach:
Erstnutzer lesen auf Seite 50 unter Rubrik 4.2.5. "Lineale ändern", daß sie das Dialogfenster durch Anklicken des Paragraphenzeichens am linken Rand der Linealzeile erreichen. Richtiger muß es heißen "durch Doppelklick...", da Allnutzer diesen Passus sicher nicht im Handbuch lesen, sind sie auf eigene Versuchsreihen angewiesen.
Auf Seite 56 will das Handbuch Erstnutzern einreden, daß sie feste Leerzeichen nur über Mausklick ins Schlüsselkästchen, also überaus umständlich, setzen könnten. Ihnen wie auch verunsicherten Altnutzern sei gesagt: natürlich lassen sich feste Leerzeichen nach wie vor auch über die Tastenkombination "Control-Space" setzen.
Die Möglichkeit, die aktuelle Datei ohne vorheriges Abspeichern auszudrucken, ist prima. Leider wird verschwiegen, daß der Ausdruck dann mehr als doppelt so lange dauert. Wenn also auf der Diskette noch genügend Platz ist, kann es günstiger sein, doch zu speichern, um anschließend doppelt so schnell drucken zu lassen.
Altnutzer haben auch ohne deutlichen Hinweis im Handbuch sicher inzwischen erfahren, daß die Menüpunkte "Lineal bzw. Position anzeigen" mittlerweile gleichzeitig verwirklicht werden können. Wenn eine Möglichkeit mit dem Häkchen markiert wird, schaltet sich die andere Darstellungsart nicht mehr automatisch aus.
Wirklich ärgerlich ist aber nur die nirgendwo angesprochene Falle für Altnutzer über die Formatdateien auf Seite 61 des Handbuchs. Alle Umsteiger von Version 2.02, die die Möglichkeit nutzen, über bestimmte Extensions Briefköpfe, Seitenformate, wiederkehrende Texte usw. einzulesen, können über zwei Dinge stolpern, die einen rasend machen können: Wer sich wundert, wieso sein wunderschöner Briefkopf nicht eingelesen wird, obwohl das bei der Vorversion immer geklappt hat, resigniert entweder oder stellt fest, daß der Ordner für diese Dateien nicht mehr "FORMATS" heißt, sondern ganz heimlich "FORMATE". Kaum entdeckt, schon geändert - und klappt immer noch nicht? Dann arbeiten Sie mit zwei Laufwerken (Programmdisk in A, Datendisk in B) -oder mit vergleichbarer Verteilung auf zwei Partitionen der Festplatte und haben den Ordner "FORMATE" auf Laufwerk B und nicht auf A, wie es jetzt nötig ist. Im Ergebnis ist es so zwar besser, nur -es muß halt gesagt werden; denn welcher Routinier liest bei einem Update immer alles von vorne bis hinten durch!
Hans-Jürgen Hageman
Für viele Anwendungen ist es von Interesse zu erfahren, welche TOS-Version auf dem Rechner installiert und von wann sie ist (Erstellungsdatum). Mit einem kleinen OFA-BASIC-Programm, das leicht in andere Sprachen zu übertragen ist, laßt sich das Problem lösen.
HE
' TOS-Version und -Datum
'
' Anfangsadresse des Betriebssystem-Headars
'
adresse=(LPEEK(&H4F2))
'
' Versionsnummer des TOS im BCD-Format
'
version$=HEX$(DPEEK(adresse+2))
PRINT "TOS-Version: "+LEFT$(version$,1)+ "."+RIGHT$(version$,1)
'
' TOS-Erstellungsdatum im BCD-Format
'
datum$=HEX$(LPEEK(adresse+24))
PRINT "Erstellungsdatum: "+MID$(datum$,LEN(datum$)-5,2)+"."+MID$(datum$ 1,LEN(datum$)-6)+"."+RIGHT$(datum$,4)
END
Listing : So findet man TOS-Version und -Datum.
Gepatchtes TOS im Mega ohne viel Aufwand Wenn Mega ST-Besitzer ein gepatchtes TOS verwenden wollen, waren sie bisher im Nachteil. Bei den meisten Megas (z.T. auch beim 1040) befindet sich das TOS in zwei Custom-Chips von ATARI. Da es keine pin-gleichen EPROMS gibt, mußte man entweder mit dem Original-ATARI-TOS arbeiten, oder seinen Rechner Umrüsten (siehe ST-Computer 1/90 "Patch As Patch Can"). Meist sind die übrigen vier Plätze für EPROMs nicht einmal gesockelt, so daß man auch diese nachträglich einbauen muß. Dieses Projekt verhilft nun allen Mega ST-Besitzern, ohne daß sie an Ihrem Rechner herumlöten müssen, zur Möglichkeit ein gepatchtes TOS zu verwenden.
Will man das Betriebssystem in zwei EPROMs packen, werden Chips mit 128 kByte Speicherkapazität benötigt. Diese gibt es, mit ungebanktem (linearem) Adreßraum als Typ 27010. Leider besitzt dieser IC 32 Pins. Die Fassungen im ST sind aber nur für 28polige Bausteine vorgesehen. Diese Tatsache ist jedoch nicht weiter tragisch, vor allem, wenn man sich die Pinbelegung der Sockel und der EPROMs anschaut (Bild 1). Wie man sieht haben viele Pins die gleiche Bedeutung, so daß man die EPROMs fast direkt in die Sockel stecken könnte. Aber eben nur fast, ohne ein klein wenig Tüftelei kommt man nicht aus.
HE
Wenn man keine Möglichkeit hat, das abgebildete Layout (Bild 2) auf eine Platine zu übertragen, kann man sich auch mit einer Lochrasterplatine behelfen. Die meisten Verbindungen sind einfach nur durchzuschleifen. Das Pin /OE vom 27010 muß mit Masse, Bit 16 der Adresse an das richtige Pin und die Stromversorgungsleitungen müssen extra gelegt werden. Wenn Sie beim Aufbau als Sockel für den 32poligen 27010 nur Pinreihen nehmen und für den Anschluß im Mega ST Pinreihen mit langen Beinchen verwenden, können Sie durch Umstecken der Chips (TOSROM und 27010) das Original-Betriebssystem neben dem gepatchten verwenden.
Ein Anmerkung noch zum Aufbau der Platine. Im Mega ist recht wenig Platz zwischen den ROMs. Sie sollten deshalb die Länge der Platine so gering wie möglich halten. Für den Austausch benötigen Sie zweimal die gleiche Platine (für jedes TOS-ROM eine).
Sie werden sich jetzt sicherlich fragen, für was die drei einzelnen Lötpunkte gedacht sind. Wenn Sie hier einen Umschalter anschließen und als EPROM-Typeinen 27020-Chip benutzen, können Sie ebenso wie bei der 6-EPROM-Variante zwei Betriebssystemversionen in den EPROMs unterbringen. Der Umschalter dient zum Wechseln zwischen den Versionen (natürlich nur im ausgeschalteten Zustand des Rechners, es sei denn. Sie lieben den Anblick von Bomben auf dem Monitor des STs).
Zum Brennen der Mega-Bit-EPROMs (27010 bis 27(MO) bietet sich unser Junior Prommer mit dem neuem Mega-Modul (siehe ST-Computer EXTRA Nr. 3) an. Damit können Sie die neuen 32poligen EPROM-Typen genauso elegant bearbeiten, wie die herkömmlichen 28poligen Chips.
Uns haben mehrere Briefe zu diesem Thema erreicht, so daß wir dies hier noch einmal aufgreifen möchten. Wenn der 16 MHz-Takt für den Floppy-Controller, aus welchen Gründen auch immer, extern erzeugt werden muß, ist die Verwendung eines Quarzoszillators wohl die einfachste und eleganteste Lösung. Nun sollte auch der 8 MHz-Takt für den 'normalen' Betrieb des Controllers aus diesem abgeleitet werden. Das Prinzip dazu ist in Bild 1 zu sehen. Das vom Quarzoszillator kommende Signal wird auf den Takteingang eines JK-Flip-Flops gegeben. Seine Ausgange wechseln nun, bei der dargestellten Belegung der Eingänge |J und K liegen fest auf 1 (+5V)|, bei jeder fallenden Flanke des Taktsignals ihren Zustand. So erhält man am Ausgang ein Signal mit 8 MHz. Die Realisierung mit ICs ist in Bild 2 wiedergegeben. Für das Flip-Flop eignet sich sowohl der 74LS73 als auch der 74LSI03. Da diese beiden Bausteine eine unterschiedliche Pin-Belegung haben, sind beide angegeben (in Klammem die für den 74LS 103).
Übrigens eignen sich für den Umbau nur die Controller mit der Bezeichnung WD1727/ 0202. Die alte Version WD1772/0002 arbeitet nur bis etwa 14 MHz einwandfrei.
PROCEDURE init_font
' (c) MAXON Computer GmbH 1990
'
' LINEA_0 MOVE.L A1,D0 RTS
linea0$=MKI$(&HA000)+MKI$(&H2009)+MKI$(&H4E75)
Iinea0%=V:linea0$
fonttab%=C:linea0%() ! Font-Tabelle holen
fhadr1%={fonttab%+4} ! erster Fontheader
fhadr2%={fhadr1%+84} ! Zeiger -> 16x8-ZSatz
INLINE fadr%,4006 ! eigenen Font laden
oldfontptr%={fhadr2% + 76} ! alter Zeiger
RETURN
PROCEDURE remove_font
IF oldfontptr%<>0
LPOKE fhadr% + 76,oldfontptr%
ENDIF
RETURN
Listing 1: So wird der Font eingebunden.
Schon in mehreren Zeitschriften - auch in der ST-Computer - wurden Routinen abgedruckt, die die Einbindung eines eigenen Fonts ins Betriebssystem oder ein eigenes Programm erlauben. Leider waren die meisten dieser Routinen recht lang, da dort der Font oft ins ganze System integriert wird. Falls man aber nur einen Font in ein eigenes Programm einbinden möchte, gibt es eine ganz legale Möglichkeit, dies in wenigen Programmzeilen zu erledigen. Mit dem Line A-Aufruf holt man sich den Pointer auf eine Tabelle, die wiederum Pointer auf verschiedene Fonts enthält. Der zweite Eintrag enthält einen Pointer auf den 8x8-Syslemzeichensatz. Dessen Eintrag mit dem Offset 84 zeigt auf den nächsten Fontheader (16x8-Systemfont). Dort Findet man den Pointer auf die eigentlichen Font-Daten. Man muß sich jetzt nur noch den alten Pointer merken und kann seinen eigenen einbinden. Der Font muß allerdings im ATARI-Format vorliegen. Hier sind die Bytes so organisiert, daß zuerst das erste Byte des ersten Zeichens, dann das erste Byte des zweiten Zeichens usw. bis zum ersten Byte des 256. Zeichens folgen, dann kommt das zweite Byte des ersten Zeichens, das zweite Byte des zweiten usw. So geht es bis zum letzten Byte des letzten Zeichens weiter. Die am meisten verbreiteten Fonts sind jedoch leider im „STAD-Format“, wo die Bytes für die Zeichen direkt auf einanderfolgen. Mit Listing 2 kann man sich einen solchen Font ins ATARI-Format umwandeln.
Harald Plontke
FILESELECT "\*.fnt",a$
IF a$<>"" AND EXIST(a$)
buffer% = MALLOC(4096*2) ! reservieren
s%=buffer% ! Quellbereich
d%=buffer%+4006 ! Zielbereich
BLOAD a$,buffer% !...und einladen
FOR z1&=0 TO 255
FOR z2&=0 TO 15
BYTE{d%+z1&+z2&*256}=BYTE{s%}
INC s%
NEXT z2&
NEXT z1&
FILESELECT "\*.inl","",a$
IF a$<>""
BSAVE a$,buffer%+4096,4006
ENDIF
~MFRE(buffer%)
ENDIF
Listing 2: Umwandlung von STAD-Fonts ins ATARI-Format
1. Zuerst eine Reaktion auf den Quick-Tip von Thomas Appel im Heft 4/1990. Es geht dabei um die RSC-Dateien und merkwürdige Werte, die nach einem Doppelklick zurückgeliefert werden. Dies ist kein Bug, sondern ein dokumentiertes Feature des AES! Wird ein TOUCHEXIT-Objekt per Doppelklick verlassen, wird Bit 15 im Rückgabeparameter gesetzt. Das eigentliche Objekt läßt sich einfach feststellen:
Dummerweise ist dieses Feature nicht im GFA-Handbuch beschrieben, jedenfalls nicht in der holländischen Übersetzung.
2. Um den Programmablauf zu steuern, fragte ich in einem GFA 3.5-Programm den Ereignispuffer sowie die Tastatur per EVNT_MULTI() ab. Die relevanten Elemente des Puffers halte ich per ABSOLUTE gesetzt, um die Auswertung übersichtlicher zu gestalten. Im Interpreter funktionierte es perfekt, aber in der compilierten Version reagierte das Programm nur noch auf Tastendrücke: Ereignisse wurden gar nicht ausgewertet. Es stellte sich heraus, daß die Ursache des Problems darin lag, daß ich das Puffer-Array in einer Prozedur dimensionierte. Offensichtlich wunderte das Array durch den Speicher bei Garbage-Collections, wodurch die ABSOLUTE-Werte ihre Gültigkeit verloren. Lösung: Die Dimensionierung gleich am Anfang im "Hauptprogramm" und nicht in einer Prozedur durchführen.
3. In demselben Programm kam es später zu mysteriösen Abstürzen, die nur eins gemeinsam hatten: Es geschah immer während einer WIND_... Funktion. Leider war es immer an einer anderen Stelle, und die Ursache war nur schwer zu finden. Wieder einmal war die Garbage-Collection schuld an der Sache. Die Fenstertitel hatte ich, natürlicherweise, in einem String-Array aufbewahrt. Der dynamischen String-Abhandlung des GFA-BASICs zufolge wanderte auch dieses Array durch den Speicher, auch wenn es am Anfang des Programms deklariert wurde. Abhilfe schafft hier nur eins: die Titel- und Info-Zeilen Ihrer Fenster dort abzulegen, wo Sie sicher sind, daß sie auch dort bleiben. Dies funktioniert zum Beispiel per MALLOC oder INLINE, wobei Sie den String in diesen Puffer kopieren. Ist a% die Adresse des Puffers und t$ der String, dann geht es am einfachsten mit BMOVE a%,V:t$,LEN(t$). Die Adresse a% übergeben Sie dann an WIND_SET(), wenn Sie die Titel- oder Info-Zeile setzen. Eventuell könnten Sie, wenn Sie auf Nummer sicher gehen wollen, noch einen CHR$(0) an den String anhängen.
Peter Kocourek
ret& = FORM_DO(tree%,0)
dclick!=BTST(ret&,15) ! Vielleicht einen
ret& = BCLR(ret&,15) ! Doppelklick
OB_STATE(tree%,ret&) = BCLR(OB_STATE(tree%,ret&),0)
Listing 3: Verbesserung des Listings in Ausgabe 4