Quick-Tips

Laufwerk schreibgeschützt?

Standen Sie schon einmal vor der Frage, ob ein Laufwerk schreibgeschützt ist oder nicht, ohne bei einem Schreibversuch die lästige Systemfehlermeldung zu erhalten? Man muß nur vor dem Versuch, ein File ("_____.") zu erzeugen, den Critical-Event-Handler umleiten und danach wieder zurücksetzen. Die in C implementierte, aber in jeder Sprache mögliche Routine erlaubt diese Abfrage (s.Listing).

Markus Maresch, A-8042 Graz

int drv_prt(int drv)
{ static char file[] = "X:\\________.___";"
    / * Dieses File duerfte es wohl */ 
    /* nicht geben */
    void (*old_crit)(); 
    void _no_warn(void); 
    long old, Super (void *stack); 
    int protected=1; 
    int fh;
    *file=drv+' A'; 
    old=Super(0L);
    old_crit=(void*)(*(long*)0x404);
    *(long*)0x404=(long)_no_warn;
    Super( (void*)old) ;
    if ( (fh=Fcreate(file,0))>=0 )
    {   Fclose(fh);
        Fdelete(file); 
        protected=0;
    }
    old=Super(0L);
    *(long*)0x404=(long)old_crit;
    Super((void*)old); 
    return protected;
}
void _no_warn(void)
{ return;
}
Parameter: 
drv: 0=A, 1=B, ..
ret: 1=schreibgeschützt
     0 sonst

1st_WORD- und HARLEKIN-Druck-Utilities

Bei der Zusammenarbeit beider Programme gibt es an sich keine Probleme, doch kann man sie noch besser kombinieren, als das in der Grundkonfiguration beider Programme der Fall ist.

Druckt 1st_Word, so sind der HARLEKIN-Spooler und -Druckfilter automatisch mit aktiv, da diese sich ins System einklinken. Leider kommt der Spooler nicht recht zur Geltung, da 1st_Word nicht gerade über eine schnelle Druckausgabe verfügt. Der Spooler verhält sich dabei eher wie ein Getränkelager im Hochsommer, wenn die Nachfrage größer ist als die Produktionsmenge. Der Druckfilter von HARLEKIN kann jedoch 1st_Word ein wenig Arbeit abnehmen, da er in einem Punkt genau über dieselben Funktionen verfügt, nämlich die Konvertierung von Sonderzeichen. Es bietet sich an, die betreffenden Zeilen aus dem 1st_Word-Treiber herauszulöschen und in das HARLEKIN-HEX-File einzubauen. Das hat den Vorteil, daß diese Zeichenkonvertierung nicht nur in 1st_Word aktiv ist, sondern im ganzen System, da HARLEKIN sich in die Druckausgabe einklinkt und überall die Zeichen konvertiert. Die Zeiten der falschen Sonderzeichen sind vorbei, auch wenn man eine Datei aus dem Desktop ausdruckt.

Um auch die von 1st_Word benutzten flexiblen Spaces aus dem Desktop drucken zu können (viele werden die fehlenden Leerzeichen beim Drucken einer 1st_Word-Datei aus dem Desktop kennen), fügen Sie folgende Zeile in das HARLEKIN-HEX-File ein - und zwar unterhalb der Zeile TRANSLATION:

1C 20 * Wordplus Blocksatz
        Space
1E 20 * Wordplus Space

Natürlich können Sie auf diese Art und Weise auch beliebige Zeichen benutzen, um Steuercodes an den Drucker zu schicken. Um den Überblick zu behalten - man denke nur an manche wilden 1st_Word-Druckertreiber, in denen alle hebräischen Zeichen zu Steuercodes umgewandelt wurden - sollte man im Zeichensatzeditor von HARLEKIN diese Zeichen sinngemäß definieren und als System-Font installieren, so daß man am Aussehen deren Funktion erkennt.

Der HARLEKIN-Druckerfilter bietet sicherlich eine sehr brauchbare Eigenschaft, auch wenn diese in der Vielzahl der Programmfunktionen fast untergeht. Andere Rechner, man denkt schweren Herzens an den AMIGA, haben eine solche Funktion bereits eingebaut. Somit braucht nicht jedes Programm seinen eigenen Druckertreiber. Mit dem HARLE-KIN-Druckfilter kann der ST das nun auch.

Karl Napp, W-4000 Düsseldorf

Alternativer Systemzeichensatz

Das kleine Programm installiert einen neuen Zeichensatz, indem es den Systemzeichensatz des ST ersetzt. Geschrieben ist es in Turbo C Version 2.0 und dem MAS-68K von Borland.

Wie wird nun der neue Zeichensatz in den Rechner gebracht? Schaut man sich die Vdiesc-Struktur an, auch als sogenannte negative Line A-Variablen bekannt, findet man zwei interessante Zeiger. Über Vdiesc->cur_font->fnt_dta findet man den Zeiger, der dem VDI den Weg zum Zeichensatz zeigt und mit Vdiesc->v_fnd_ad finden die Ausgaberoutinen vom TOS den Systemzeichensatz. Die Funktion install_font übernimmt die ganze Arbeit für uns. Es wird ein Zeichensatz geladen und dann die beiden Zeiger auf unsren Zeichensatz umgebogen. Ist der neue Font installiert, wird das Programm mit Ptermres beendet. Es belegt dann 5000 Bytes im Speicher.

Dem aufmerksamen Leser wird allerdings beim Überfliegen des Listings etwas eher merkwürdig Vorkommen. Was ist denn das für eine Funktion new_system_fnt? Im Assembler-Listing ist es einfach eine Reservierung von Speicher. Warum dann nicht gleich im C-Listing schreiben: char new system_font[4096]?

Die Erklärung: Der Linker von Turbo C legt alles, was Daten sind, ins DATA- oder BSS-Segment, je nachdem. Nur werden eben DATA- und BSS-Segmente immer ganz am Ende des Programms abgelegt. Genau das ist aber recht dumm, da Ptermres eben den Speicher ab der Basepage des Programms ablegt. Somit müßte das ganze Programm im Speicher gehalten werden, obwohl man ja nur diese 4096 Bytes benötigt. Durch den kleinen Trick, das Array new_system_font wie eine Funktion zu definieren, gelangt nun das Array genau hinter den Startup-Code des Programms. So lassen sich ein paar Bytes sparen.

Der neue Zeichensatz muß genau so aufgebaut sein, wie es der Systemzeichensatz ist. Oder anders ausgedrückt: Es muß ein 8x 16-Zeichensatz (für Farbe ein 8x8-Zeichensatz) sein, wie er auch für GDOS gebraucht werden könnte, nur ohne Font-Header, eben Daten pur.

Letztendlich sollte man nicht verschweigen, daß es sich bei diesem Programm um eins der Kategorie „Quick and Dirty“ handelt. Will man seine Programme richtig mit neuen Zeichensätzen versorgen, sollte man nicht die Mühe scheuen und das GDOS benutzen. Zum Beispiel kann mit einem Setscreen-Aufruf der Bildschirm neu initialisiert werden; tja, und schon zeigen die beiden Zeiger wieder auf den Systemzeichensatz im ROM. Und dann gibt es Programme, die, ohne auf Verluste zu achten, nur im ROM nach Zeichen suchen, ein Beispiel ist da Omikron.BASIC, da nützt dann die ganze Zeigerbiegerei nichts. Da zudem noch Line-A-Variablen benutzt werden, wird das ganze auch nur auf dem ST funktionieren. Ich habe das Programm mit dem Disketten-ROM 1.0 und dem ROM-TOS 1.0,1.02 (Blitter-TOS) und 1.04 (Rainbow-TOS) ausprobiert.

Wer den Zeichensatz nur für sein eigenes Programm ändern will, kann es genau so machen wie im Listing zu lesen. Nur sollte er dann unbedingt die alten Zeiger auf den Systemzeichensatz vorm Ändern sichern und nach Verlassen seines Programms wieder restaurieren, weil ja sonst der Speicherbereich, in dem der neue Zeichensatz liegt, über kurz oder lang schutzlos den folgenden Programmen ausgeliefert ist.

Vif Rimkus, W-3002 Wedemark2

Listing zu 3:

/* Datei FONT_RES.C */
/* Fixed on 28. 2. 1991 */
/* (c) by Ulf Rimkus */
#include <linea.h>
#include <stdio.h>
#include <stdlib.h>
#include <tos.h>
void install_font(const char *new_font);
extern void newsystem_fnt(void);
int
main(void)
{
    install_font("DATA.FNT");
    /* Fontdaten installieren */
    Ptermres(5000,0);
    /* Programm beenden und */
    /* 5000 Byte für Font im Speicher halten */ 
    return 0;
}
void
install_font(const char *new_font)
{
    int font;
    if ((font=Fopen(new_font,0)) >= 0) /* Font datei öffnen */
    {
        Fread(font, 4096,(char *)new_system_fnt);
        Fclose(font); 
        linea_init();
        Vdiesc->cur_font->fnt_dta=(void *)new_system_fnt;
        /* Für GEM */
        Vdiesc->v_fnt_ad=(void *)new_system_fnt; /* Für TOS */
    }
    else
    {
        puts("\033EFehler: Kann Fontdaten nicht finden"); 
        puts("Mit beliebiger Taste weiter");
        Crawcin(); 
        exit (-1);
    }
}


Aus: ST-Computer 05 / 1991, Seite 173

Links

Copyright-Bestimmungen: siehe Über diese Seite