Quick-Tips

Länge von Dateinamen

Leider kommen nur recht wenige Programme mit den langen Dateinamen zurecht, die unter MiNT möglich sind und z.B. vom MinixFS unterstützt werden. Das Problem ist in den meisten Fällen, daß für die Dateinamen nur ein Array in der Größe 8+3+1+1 = 13 (+1 jeweils für Punkt und die Null am Ende des Strings) verwendet wird. Manche Compiler machen ein 14 Byte großes Array daraus, um eine Wortgrenze zu erreichen. Dies ist natürlich nicht genug für die 16, 32 oder mehr Zeichen, die das Minix-File-System erlaubt. Es gibt aber durchaus die Möglichkeit, daß Dateinamen noch länger sind. Daher rate ich jedem, der sauber programmieren will, die Benutzung der abgedruckten Routine (Listing 1). Sie macht nichts anderes als auf „U:“ alle Verzeichnisse mit Dpathconf auf die maximale Pfadlänge und die maximale Länge der Dateinamen abzufragen. Dies funktioniert. weil auf „U:“ alle Dateisysteme gemountet sind. Ab MiNT 1.08 ist es möglich, Dateisysteme nachträglich zu mounten, daher darf man sich nicht darauf verlassen, daß die Zahlen, wenn man sie am Anfang des Programms ermittelt hat, am Ende immer noch stimmen. Eine Verifizierung der ermittelten Werte ist auf jeden Fall notwendig. Momentan steht die Obergrenze in MiNT auf 128 Zeichen maximal für beide Längen, diese Schranke kann aber schon in der nächsten MiNT-Version fallen.

Das Programm muß mit der MiNT-Library compiliert werden. Die Routine main macht nichts weiter, als auf MiNT zu testen und dann die eigentliche Testfunktion max_length aufzurufen. Wichtig ist noch zu erwähnen, daß der Wert 0x7fffffffL für eine unbegrenzte Länge steht.

Marcus Haebler

/* Routine zur Ermittlung der maximalen */
/* Längen für Pfade und Dateinamen */
/* (c)1994 by MAXON-Computer */
/* Autor: Marcus Haebler */
/* Adresse: Althausweg 29, 48159 Muenster */
/* email: haeblerBuni-muenster.de */

#include <mintbind.h>
#include <stdio.h>

int max(long a, long b)
{
    if (a < b) return b;    /* wir geben den größeren */
    else return a;      /* der beiden Werte zurück */
}

int max_length(long *fname, long *path)
{
    long u_length;
    char *name;
    long dir_handle;
    Dsetdrv ('U'-'A'); /* Laufwerk U: setzen */
    Dsetpath(" \\ " ); /* Pfad auf "U:\" */ 
    u_length = Dpathconf(".", 3) +5;
    /* maximale Länge der Dateinamen */

    name = (char*) Malloc((long) u_length);
    /* Speicher anfordern */

    if (name == 0L) return -1; /* -1 bei Fehler */

    dir_handle = Dopendir(".", 0); /* öffne Verzeichnis */

    /* lese bis ein Fehler auftritt */
    while ((Dreaddir(u_length, dir_handle, name) & 0xFF000000) == 0)
    {
        *fname = max(Dpathconf(name + 4, 3), *fname); 
        /* Länge des Namens ermitteln */
        *path = max(Dpathconf(name +4, 2) *path);
        /* Pfadlänge ermitteln */
    }
    closedir(dir_handle);   /* Verzeichnis schließen */

    Mfree((long) name); /* Speicher freigeben •/
    return 0;   /• gib Null zurück */
}

/* main ruft max_length auf •/

int main()
{
    long path = 0, fname = 0 
    /* Initialisierung mit 0 ist wichtig */

    if (Pdomain(-1) <= 0)
    /* MiNT? Besser über Cookie-Jar!!! */
    {
        printf("Kein MiNT vorhanden.\n"); 
        return -1;
    }

    /* Werte ausgeben oder Fehlermeldung anzeigen */ 
    if (max_length(&fname, &path) == -1)
        printf("Fehler: nicht genug Speicher"); 
    else
        Printf("maximale Pfadlänge: 0x%1x, maximale Länge : 0x%1x\n", path, fname); 
    return 0;
}

Der Falcon030 und GFA-BASIC

Schon beim Kauf unseres Falcon030 wurden wir darauf hingewiesen, daß GFA-BASIC Probleme mit der Textausgabe auf Drucker habe. Ein Test zeigte, daß sich tatsächlich weder mit LPRINT oder OUT#0,b% noch mit BIOS(3,0,b%) oder GEMDOS(5,b%) dem Drucker irgend ein Zeichen entlocken läßt.

Als letzte und einzige Möglichkeit der Textausgabe blieb nun übrig, den Drucker am Programmanfang als Datei zu öffnen (OPEN "o", #0, "LST:") und die Texte über den Dateikanal (im Beispiel Kanal #0) auszugeben (z.B. PRINT #0;"Hurra, er druckt"). Diese Ausgabeart funktioniert leider nur bedingt, da der Falcon beim Schließen des Dateikanals mit CLOSE die Meldung „HANDLE-Fehler“ bringt. Schließt man den Datei kanal allerdings nicht, läßt sich relativ gut mit dieser Lösung arbeiten.

Nun ist es nur noch erforderlich, einen im Programm noch nicht verwendeten Datei kanal #k zu finden und jedes LPRINT im Quelltext durch PRINT Hk zu ersetzen. Ein Tip: Man speichert das Programm mit SAVE,A als ASCII-Listing ab (Endung .LST) und lädt es in einen schnellen Editor (z.B. TEMPUS oder 7UP). Mit SUCHEN/ERSETZEN ersetzt man zunächst alle LPRINT (auf Groß-/Kleinschreibung achten!) durch PRINT #k. Anschließend ersetzt man alle 'PRINT #k ' (man beachte das Leerzeichen hinter 'k') durch 'PRINT#k:'. Dadurch wird erreicht, daß Leerzeilen beim Ausdruck erhalten bleiben.

Marcus Gigl

Maustastenentprellung

Wer kennt es nicht, das leidige Problem des Tastenprellens unserer flinken, fleißigen ATAR-Mäuse? (Kompatible Mäuse prellen oft noch viel schlimmer!) Was machen? Mir hilft diese kleine selbstausgetüftelte Schaltung. Das Mono-Flop 74221 erzeugt bei Druck der linken Maustaste einen Impuls definierter Länge, die vom externen RC-Glied abhängt. Hier muß ein bißchen mit der Einstellung des Trimmers experimentiert werden. Der Impuls muß so lang sein, daß er das Tastenprellen schluckt, aber so kurz, daß er den 'Doppelklick' nicht verschluckt. Die drei NAND-Gatter dienen dem Entprellen bei gedrückter und gehaltener linker Maustaste, um z.B. Fenster zu verschieben, Dateien zu kopieren etc. Die Schaltung wird einfach zwischen Maus und Mausport des ATIs gesteckt. Die linke Maustaste belegt auf dem 9pol.Sub-D-Stecker den Pin 6. Diese Leitung muß aufgetrennt werden. Die Stromversorgung für diese kleine Bastelei wird auch einfach dem Maus-Port entliehen. +5 Volt liegt auf Pin 7, GND auf Pin 8 Die TTL-Jongleure unter uns werden sicher schon entdeckt haben, daß es sich bei dem SN74221 um ZWEI Monoflops in einem Gehäuse handelt. Wer Spaß dran hat, kann das ganze also auch für die RECHTE Maustaste bauen, er braucht dann nur noch ein weiteres SN7400, einen Trimmer und einen Kondensator. Die rechte Maustaste belegt den Pin 9.

Peter 'Friedl' Hostermann

HD-Laufwerk im Mega-STE

Ich möchte mit diesem Quicktip gleichzeitig auf den Leserbrief des Herrn Unterbäumer aus Hamburg (ST-Computer 1/94) antworten. Da ich bereits mehr als zehn HD-Laufwerke in 520er, 1040er und Mega-STEs eingebaut habe, glaube ich, einige Erfahrung dahingehend zu besitzen. Man sollte bei der Mega-STE-Serie mit TOS 2.05 (wobei es unerheblich ist, ob 2.05 oder 2.06) so Vorgehen, daß man einfach ein 235 HF (laufen am besten mit ATARI) des Herstellers TEAC (Mitsumi tut's auch), das in PCs breite Verwendung findet, einbaut. Danach muß - was wichtig ist - die entsprechende Routine des TOS aktiviert werden, indem man am „Mäuseklavier“ in der Nähe der SIMMs (rechts vorne im Rechner) den DIP-Schalter umlegt, der von den anderen abweichend gestellt ist. (Er liegt außen. Die anderen sind im übrigen ohne Funktion.) Wird jetzt der Rechner gestartet, erscheint unter dem Menüpunkt „Formatieren“ im Desktop die Option ‘hohe Schreibdichte’, und es kann im Prinzip losgehen. Da die mir bekannten Mega-STEs alle einen 02-02 Floppy-Controller besitzen, ist die Wahrscheinlichkeit sehr groß, daß alles läuft. Die Jumper des Laufwerks müssen auf Drive 0 eingestellt sein, und PIN 2 des Shugart-Busses sollte das HD-Signal vom Laufwerk liefern, was bei PCs nicht der Fall ist. Dort läuft die HD-Erkennung anders. Also müssen die Jumper, falls das Laufwerk für einen PC vorgesehen ist, umgesteckt werden.

Wenn nach einiger Zeit der Betrieb im HD-Modus fehlerhaft ist (Schreib-/Lesefehler, Sektor nicht gefunden o.ä.), verkraftet der Controller die 16 MHz nicht. Dieses Problem kann auch erst nach einigen Monaten auftauchen. Dann empfehle ich, einen AJAX-Chip einzusetzen, der voll pinkompatibel zum WD 020-02 ist. Nützt auch das nichts, kann man den Takteingang des Floppy-Controllers mit einen 74-F07-Baustein verstärken. Wer die Desktop-Funktion nicht benutzen will, wird ohnehin auf komfortable Formatierprogramme (PumpUp und Co.) zurückgreifen. Hilft dennoch alles nichts, sollte man erst jetzt auf eine Lösung mit einem Modul zurückgreifen. Dies ist aber - wenn überhaupt - nur bei Rechnern der allerersten Serien nötig.

Thomas Pfaff



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]