Wird dem Packer LHArc, der übrigens besser und schneller komprimiert als der noch weit verbreitete Arc, in der zu übergebenden Parameterzeile kein ausdrücklicher Befehl, sondern nur der Archivpfad und der Archivname gegeben, so wird dies als Befehl zum Auspacken des angegebenen Archives verstanden
x c:\archiv.lzh
ist also gleichbedeutend mit
c:\archiv.lzh.
Diesen Umstand nun kann sich der für gewöhnlich faule ST-User nicht nur zunutze machen, um zwei Buchstaben zu sparen, sondern vor allem, um den Packer als TTP-Anmeldung im Desktop anzumelden. Dazu wird LZH.TTP selektiert, Extras...Anwendung anmelden angewählt, als Endung LZH und als Parametertyp TOS erlaubt Parameter eingestellt, zuerst installieren und dann Extras... Arbeit sichern angewählt, schon packt sich ein Archiv, das geöffnet bzw. mit einem Doppelklick „gestartet“ wird, praktisch von selbst aus. Dazu muß allerdings der Packer im gleichen Verzeichnis stehen bleiben, in dem er als Anwendung angemeldet wurde! Die Auspackung erfolgt zudem in das Verzeichnis des Packers und nicht des Archivs. Es ist daher eine ständig installierte Ramdisk oder eine bestimmte Partition der Festplatte zu empfehlen.
Natürlich kann diese Installation auch direkt im DESKTOP.INF mit einem ASCII-Editor durchgeführt werden, was sich vor allem dann empfiehlt, wenn man eine Festplatte besitzt, mehrere DESKTOP. INFs zur Auswahl stehen und die Installation bei allen erfolgen soll. Folgende Zeile ist dann einzufügen:
.#P 03 04 C:\LZH.TTP* *.LZH*
Sebastian Lovens, W-4100 Duisburg
... wenn eine Altertbox erscheint und das ist höchst unangenehm. Die Lösung ist denkbar einfach: Mittels SETMOUSE soll der Cursor direkt in die Alertbox plaziert werden. Zum Beispiel:
SETMOUSE 310,260...
ALERT
Über diesen Befehl habe ich nirgends etwas nachlesen können. Vielleicht hilft er einigen Lesern.
Jean Wantzenrieder, F-57810 Bourdonnay
Anscheinend habe ich beim Testen meines Programms RSCTEST (ST-Computer Heft 1/1991, ab Seite 90) nur neuere RSC-Files benutzt. Die RSCs älterer Programme, bei denen das erste Objekt im File nicht auch das erste Objekt in der Baumindextabelle ist, vertragen sich erst dann mit RSCTEST.PRG, wenn folgende Änderung im Code vorgenommen wird:
Aufruf der nachfolgenden Funktion:
/* Erster Parameter
Adresse des ersten
Objektes im RSC-Pile */
rsrc_AllFix((OBJECT *) (rsc->rsh_object + (long) rsc), nrObj);
Der beschrieben Fehler betrifft nur das Testprogramm, im Konverterprogramm wird das erste Objekt korrekt ermittelt.
Christoph Conrad, W-5100 Aachen
Bei dem Quicktip „SIGNUM!-Zeichensätze in OMIKRON.-BASIC (ST-COMPUTER 4/ 91, Seite 182) ist leider eine Listingzeile unvollständig wiedergegeben worden. Die Zeile 35 müßte wie folgt lauten:
35 ELSE A=Font+650+LPEEK(Font+Z*4+140)
Vor kurzem kaufte ich mir einen Handscanner von Golden Image mit der Typbezeichnung „JS-105".Ganz schnell stellte ich fest, daß er nicht die volle Breite erfaßt. Das Übel liegt bei der Software „Touch up“ (Version 1.56) von Migraph, die ich entsprechend Tabelle 1 gepatcht habe.
In SED liegt der Speicherbereich bei Adresse $B900. Bei anderen Software-Versionen muß man nach den. in Klammer angegebenen, alten Bytes suchen.
Anschließend sah ich mir das Innenleben des Scanners genauer an. Dabei fiel mir auf, daß auf der Platine neben den vorhandenen DIP-Schaltemder Platz für weitere Schalter nur aufgedruckt ist. So habe ich einfach vier weitere DIP-Schalter eingelötet, die fortan folgende Bedeutung haben:
Der Erste verändert die Auflösung. Wird er auf ON geschaltet, erhält man Auflösungsstufen von 500 bis 800 dpi. Der zweite und dritte Schalter ergeben zusammen 16 verschiedene Rasterstufen. Mit dem vierten Schalter kann das Bild invertiert werden.
Einen kleinen Nachteil möchte ich nicht verschweigen. Dadurch, daß nun die maximale Auflösung mehr als verdoppelt werden konnte (3536 Bildpunkte in der Breite), muß man noch viel mehr eine ruhigere Hand haben und entsprechend langsamer ziehen. Aber ich denke, dafür einen 800-dpi-Scanner für 500 DM zu besitzen, ist nicht zu verachten,
Frank Dahlke, W-3000 Hannover 91
Adresse | alte Werte (hex) | neue Werte (hex) | Auflösung alt |
---|---|---|---|
$B990 | 408 ($01 $98) | 416 ($01 $A0) | 100 dpi |
$B99E | 816 ($03 $30) | 848 ($03 $50) | 200 dpi |
$B9AC | 1224 ($04 $C8) | 1296 ($05 $10) | 300 dpi |
$B9BA | 1632 ($06 $60) | 1744 ($06 $D0) | 400 dpi |
Tabelle 1: Scanner-Patch
In der letzten Ausgabe berichteten wir, daß durch einfaches Umschalten eines DlP-Schalters und Einbaueines HD-Laufwerkes alle Mega-STE und TT-Computer 1.44 MB Disketten formatieren, lesen und schreiben können. Dies trifft nur bedingt zu. Wie wir nun herausgefunden haben funktioniert dieser Kniff leider nur auf TT-Computern einwandfrei. Zunächst muß der DIP Switch Nummer 7 umgeschaltet werden und nicht, wie angegeben Nummer 5. Falls ein Teac-HD-Laufwerk vom Typ FD-235HF verwendet wird ist zu beachten, daß die Jumper D0 & OP auf dem Laufwerk gesteckt sind. Dies ist offensichtlich ab Werk nicht so. Doch damit nicht genug, es erscheint dann zwar in der Formatierbox die Option Hohe Schreibdichte, beim Mega STE sind allerdings noch mehr Umstände nötig. Es müssen zusätzlich noch zwei Brücken auf der Mega STE-Platine gelötet, bzw. gesteckt werden. Die Brücken haben die Bezeichnung: W-401 & W-402 (unterhalb des SCSI-Host-Adapters). Danach kann man immerhin schon HD-Disketten mit dem Mega STE lesen. Schreiben und formatieren ist allerdings nicht ohne größeren Aufwand möglich. Dies liegt wohl an einem Hardware-Fehler im Mega STE. Die HD-Umschaltung stört scheinbar den DMA-Zähler, so daß die Übertragung von mehreren Sektoren unmöglich wird.
In der nächsten Ausgabe werden wir eine Hardware-Umbaulösung abdrucken, mit der es möglich wird, auch auf Mega STE-Computern das HD-Diskettenformat voll zu unterstützen.
CM
Werden in einem Programm Variablen eingegeben, die eine anschließende Dimensionierung eines Arrays innerhalb eines Programms zur Folge haben, so kann es vorkommen, daß die eigegebenen Variablen zu groß sind, die Dimensionierung den zur Verfügung stehenden Arbeitsspeicher überschreitet und das Programm mit einer Fehlermeldung abbricht.
Mittels nachfolgend beschriebener Routine (s.Listing) und Formeln kann dieses Problem umgangen werden, da vor der Dimensionierung berechnet wird, wieviel Speicherplatz das zu dimensionierende Array belegen würde. Die Formeln lauten:
Für eindimensionale Arrays:
belegter_speicher = (X*6)+10
Für zweidimensionale Arrays:
belegter_speicher = (14+(X+6))+((6+(X*6))+Y
Für dreidimensionale Arrays:
belegter_speicher = ((14+Y*6)+((6+Y*6)*Z))*(X+1)-((X+(X-1))*4)
Wolfgang Frank, W-3587 Borken
Variableneingabe:
Input x,y,z
Arbeitsspeicher = fre(0) !Zur Verfügung stehender Speicher
belegter_speicher = >FORMEL wie oben<
if belegter_speicher >= Arbeitsspeicher
' Dimensionierung würde den zur Verfügung
' stehenden Arbeitsspeicher überschreiten
goto Variableneingabe
else
dim Variable (x,y,z)
endif
Für alle TT-Besitzer, die noch TOS 3.01 eingebaut haben, hier ein paar Tips zum Umbau auf TOS 3.05:
Es werden 4 EPROMS vom Typ 271001 mit einer Zugriffszeit von 120ns benötigt. Wer ein UV-Löschgerät besitzt kann evtl. Geld sparen, bei unserem Redaktions-TT030/8 befand sich z.B. das TOS 3.01 noch in EPROMs. Sie lassen sich mit dem Löschgerät löschen und mit Hilfe des Junior-Prommers (ab Software-Version 2.40) und dem Mega-EPROM-Adapter einwandfrei brennen. Die 4-EPROM-Dateien der TOS 3.05 sind bezeichnet mit 00, 0E, E0 & EE. Entsprechende Bezeichnungen finden sich auch auf der TT-Platine. Laut Atari ist TOS 3.05 leider noch nicht als Ersatzteil lieferbar.
CM
Die Konvertierungsprogramme, mit deren Hilfe man SIGNUM!-24-Nadler-Fonts in 9-Nadler- bzw. Laserfonts umwandeln kann, sind gut zu handhaben, solange man nur einige wenige Zeichensätze bearbeiten will. Steht man jedoch vor der Notwendigkeit, einige Dutzend Fonts zu konvertieren, wird die Sache schnell zur Qual.
Mit einem kleinen GFA-BASIC-Programm läßt sich die Arbeit leicht automatisieren: es werden im aktuellen Verzeichnis nacheinander alle Dateien *.P24 gesucht und der Name ohne Extension an das aufzurufende Konvertierungsprogramm übergeben. Da die Programme CV24Txxx.TOS leider keine Kommandozeilenparameter auswerten, sondern partout eine Tastatureingabe erwarten, muß man den Namen des Fonts mit einem kleinen Trick übergeben: mittels KEYPRESS werden Tastatureingaben simuliert und somit der Name vor Aufruf des Konvertierungsprogramms im Tastaturpuffer hinterlegt.
Anschließend werden noch zwei RETURN im Puffer abgelegt, um die „Eingabe“ abzuschließen und nach der Konvertierung ein Programmende zu bewirken.
Auf diese Weise lassen sich, wenn mit einer Festplatte gearbeitet wird, rund 100 Zeichensätze in ca. einer halben Stunde konvertieren. Dazu compiliert man das BASIC-Programm und kopiert es zusammen mit den Konvertierungsprogrammen in den Ordner mit den Zeichensätzen.
Wolfgang Schneider, O-1185 Berlin
' Signum-Druckerfonts rationell konvertieren
' GFA-BASIC 3.X
RESERVE 10000
INLINE dtabuff%,50
cvnm$="CV24TL30" ! bzw. cvnm$="CV24TP9"
olddta%=FGETDTA()
~FSETDTA(dtabuff%)
fnd!=(FSFIRST("*.P24",0)=0)
~FSETDTA(olddta%)
WHILE fnd!
ftnm$=CHAR{dtabuff%+30}
ftnm$=LEFT$(ftnm$,INSTR(ftnm$,".")-1)
FOR i%=1 TO LEN(ftnm$)
KEYPRESS ASC(MID$(ftnm$, i%))
NEXT i%
KEYPRESS 13
KEYPRESS 13
EXEC 0, cvnm$
~FSETDTA(dtabuff%)
fnd!=(FSNEXT()=0)
~FSETDTA(olddta%)
WEND
EDIT
Der EXIST-Befehl in GFA-BASIC 3.x läßt nur eine Überprüfung von Dateien zu. Eine Abfrage von Ordnern allerdings ist damit normalerweise nicht möglich. Dies ist nur über GEMDOS-Routinen zu realisieren. Um nun nicht auf zwei verschiedene Arten Dateien und Ordner feststellen zu müssen, habe ich mir einen erweiterten Exist-Befehl in Form einer Funktion erstellt. Die Funktion habe ich gleichfalls EXIST genannt. so daß der Aufruf dem normalen BASIC-Befehl entspricht, mit Ausnahme des vorangestellten Klammeraffen @. Die Funktion EXIST bedient sich der beiden GEMDOS-Routinen 26 (FSETDTA) und 78 (FSFIRST), die in GFA-BASIC 3.x implementiert sind. Wichtig ist dabei, daß beim FSFIRST-Befehl das 4. Bit gesetzt ist. damit nicht nur Dateien, sondern auch Ordner gefunden werden.
Hans-Jürgen Merkel. W-6600
' ***************************************************
' * Erweiterter Exiet-Befehl als Funktion definiert *
' * GFA-BASIC 3.x *
' ***************************************************
' Aufruf aus einem Programm heraus:
' IF @EXIST("ORDNER1\ORDNER2") THEN ! Es wird ORDNER2 im Verzeichnis ORDNER1
! gesucht
' ENDIF
'
FUNCTION exist(such$)
~FSETDTA(BASEPAGE4-128) ! Setzen d. Disk-Transfer-Adresse
IF FSFIRST(such$+CHR$(0),&X10000)=0 ! Auf zur Dateisuche, mit gesetztem Ordner Bit
wert%=TRUE ! War die Suche erfolgreich, TRUE
ELSE ! andernfalls
wert%=FALSE ! verneinen
ENDIF
RETURN wert% ! Inhalt der Rückgabevariablen an
ENDFUNC ! Funktionsaufruf übermitteln
Folgenden „eiskalten Entlöttip“ möchte ich gerne weitergeben: Das Auslöten von Vielbeiner-ICs ist eigentlich ein Kinderspiel. Wenn man ein IC-Beinchen von der Bauteileseite her erhitzt und sobald das Lot flüssig geworden ist, von der Lötseite her das Sprühröhrchen einer Kältespraydose auf das unten herausstehende Beinchen schiebt, kann mit einem kräftigen Sprüher das Lötauge völlig ausgeblasen werden. Am Ende fällt das IC fast von alleine aus der Platine. Je nach Übung benötigt man vielleicht einen „Platinenhalter“, auch muß gelegentlich zwischendurch das Sprühröhrchen abgekniffen werden. Auch sollte man die Leiterbahnumgebung mit Klebeband absichern. damit umherfliegende Zinnbröckelchen nicht zu Kurzschlußbrücken führen können.
Uwe Bergholter, W-2075 Ammersbek
Die Bildstabilität des Atari Schwarzweißmonitors ist bekanntlich sehr gut. Umso mehr fällt auf, wenn das Bild zu zucken beginnt. Ich beobachtete rapide Verkleinerung und Vergrößerung des Bildes um etwa 5 mm, manchmal während einiger Minuten. Die Bildstabilität im Vergleich zu einem Billigfernseher wurde unterschritten.
Anscheinend war die Hochspannung der Bildröhre nicht stabil, deshalb die Bildgrößenänderung - aber warum? Nun - Hochspannungseinbrüche deuten auf Isolationsfehler, denn der sinkende Isolationswiderstand belastet die Hochspannungsquelle. Wird nichts dagegen getan, bildet sich ein Kanal verkohlter Isolation, was definitiv zerstörend wirkt. Von dieser Erkenntnis bleibt nur noch ein kleiner Schritt zur Prüfung der möglichen Ursache: Maßnahme (erst Warnung lesen!): Den nicht unter Strom stehenden Monitor aufschrauben, den Hochspannungstransformator auf verschmutzte Oberfläche prüfen! Siehe da, die feine, klebrige Staubschicht dient als Ableitwiderstand. Ich habe den Transformator und das Kabel zur Bildröhre mit einem langhaarigen, eher steifen Flachpinsel gereinigt. Putzen mit (blei- und zusatzfreiem) Reinigungsbenzin war nicht erforderlich. Wenn schon - denn schon, der Rest des Monitors wird auch entstaubt. Mein Monitor (Kauf ca. 1984) läuft nun wieder seinem guten Ruf entsprechend.
WARNUNG: Ein Monitor ist auch nach dem Ausschalten und Trennen vom 220 Volt-Netz noch gefährlich! Wessen berufliche Ausbildung den Umgang mit Hochspannung (Bildröhren usw.) nicht einschließt, bittet einen Fernsehreparateur um die kleine Mühe.
Emil Zahner, CH-K9I0 Affolter
Früher oder später geht die Maus in die Falle! Gemeint ist natürlich die linke Maustaste, die so allmählich (bei jahrelanger Anwendung) ihren Geist aufgibt. So kann man die Taste wieder auf Trab bringen:
Maus öffnen. Links und rechts auf der Platine befinden sich die Schalter. Jetzt muß man einen KubikmillimeterGraphit zwischen Plastikkappe und Metallabdeckung des betroffenen Schalters, mit Schütteln und Klopfen in das Schalterinnere hineinmogeln, dazu einfach den Schalter mehrmals betätigen.
Danach wäre es gut, die Maus mit der linken und rechten Seitenkante locker auf eine harte Oberfläche aufzuklopfen, um das Graphit gleichmäßig zu verteilen. Das müßte eigentlich geholfen haben. Prozedur ggf. wiederholen.
Es zeigt sich aber, daß die Wirkung dieser „Reparatur“ langsam nachläßt. Kein Problem: Einfach die Maus heftig schütteln, um das Graphit neu zu verteilen und schon funktioniert die Sache wieder wie neu
Torsten Biehl, W-6750 Kaiserslautern
Von der Interruptprogrammierung und dem Verbiegen von Systemvektoren waren die Pascal-Programmierer bis jetzt ausgeschlossen, weil man hierbei die Adressen von Routinen kennen muß. Es ist aber im neuen Maxon Pascal und sogar in ST Pascal plus (ab V2.06) möglich, Adressen von Routinen zu bestimmen.
Beginnen wir mit ST Pascal plus(Listing 1):
Ab der Compilerversion 2.06 existiert der Schalter {$Y+}, mit dem man alle globalen Variablen, Funktions- und Procedurenamen als Symbole in das Linkfile übernehmen kann. Dies dient dazu, daß sogenannte symbolische Debugger bei der Fehlersuche benutzt werden können. Symbole sind aber nichts anderes als Stellvertreter für Speicheradressen. Ist zum Beispiel X der Name einer globalen Variable, so repräsentiert das Symbol X die Speicherstelle, an der die Variable X während der Laufzeit im Speicher liegt. Das gleiche gilt für Proceduren und Funktionen. Sei also ROUTIN eine Procedure, dann ist während der Laufzeit das Symbol ROUTIN die Adresse der Routine im Speicher. Aber diese interessiert uns gerade. Wie kommen wir aber nun an dieses Symbol heran? Hierfür brauchen wir einen Assembler. der externe Symbole verarbeiten kann. Für den Assembler ist nun ROUTIN nichts anderes alsein Variable für eine Adresse. Diese können wir in einer Funktion als eine Long_Integer-Variable übergeben und schon haben wir im Pascal-Programm die Adresse der Routine ROUTIN als Long_Integer. Was jetzt noch unklar ist, dürfte sich beim Betrachten des Listings aufklären.
In MAXON Pascal (Listing 2) ist die Sache eigentlich kinderleicht, denn die Funktion Addr(Objekt):Pointer; liefert zu jeder Struktur, jedem Funktions- oder Procedure-Namen die Addresse bzw. einen Pointer auf die Adresse des Objekts. Jetzt kann man über Typenumwandlung den Pointer in eine LongInt-Variable um wandeln und schon hat man das gewünschte Ergebnis.
Wolfgang Sattler, W6670 StJngbert
PROGRAM Procedurenadresse;
{ ST Pascal plus }
FUNCTION Get_Adresse:LONG_INTEGER; EXTERNAL;
{Assemblerroutine}
{$Y+} { Symbole hinzufügen}
PROCEDURE Routin ;
BEGIN
WRITELN (' HELLO WORLD ');
END;
{$Y-}
BEGIN
WRITELN(get_adresse);
REPEAT
UNTIL KEYYPRES;
END.
; Adresse von Routinen in Pascal ST Plus
; erstellt mit Borlands MAS-68K
GLOBL ROUTIN,GET_ADRESSE
GET_ADRESSE:
move.l (SP)+,ruck
;ruck speichert Rücksprungadresse
;Test: Routine ausführen
jsr ROUTIN
; Adresse der Routine zurück
move.l #ROUTIN,D0
move.l ruck,A0
jmp (A0)
rts
BSS
ruck: DS.L 1
END
PROGRAM Procedurenadresse;
{ Maxon Pascal 1.1 }
PROCEDURE Routin ;
BEGIN
WRITELN (' HELLO WORLD ');
END;
PROCEDURE Get_Adresse;
VAR ADRESSE: LONGINT;
addr_ptr: Pointer;
BEGIN
addr_ptr:=Addr(Routin);
ADRESSE:=LONGINT(addr_ptr);
WRITELN(adresse);
END;
BEGIN
get_adresse;
END.