Quick-Tips

BGI spielt falsch!

Bei meiner Arbeit mit dem PURE C habe ich einen Fehler in der Bibliothek zum BGI (Borland Graphic Interface) entdeckt: Die Funktion clearviewport() wartet ab dem zweiten Aufruf auf einen Tastendruck, der durchaus auch von der Maus kommen kann. Dabei erscheint der Mauszeiger. Dieser Fehler taucht scheinbar nur bei TOS 3.05 auf.

Verantwortlich für diese Fehlfunktion ist ein Aufruf von vsm_locator aus der Funktion clearviewport. Da der Aufruf am Ende der Funktion erfolgt und keine Daten weiterverarbeitet werden, kann man ihn durch einen Aufruf von vq_mouse ersetzen. Dazu muß mit einem Diskettenmonitor die Symboltabelle am Ende der

Datei „PCBGILIB.LIB“ geändert werden.

Das Symbol vsmloca liegt an folgenden Offsets zum Anfang der Datei „PCBGILIB.-LIB“:

PC Version Offset
16. Aug. 1991 $2F17
29. Aug. 1991 $2F29
20. Sep. 1991 $2F29

Es ist jeweils mit vq_mouse zu überschreiben. Die Funktion clearviewport läuft dann wie auf einem MS-DOS-Computer; üble Auswirkungen auf andere Funktionen oder auf die Lauffähigkeit von anderen Programmen konnten bisher nicht festgestellt werden.

R. Lause, 5413 Bendorf 3

Haben auch Sie einen Quick-Tip ?

Standen Sie auch einmal vor einem kleinen, aber schier unlösbarem Problem? Dann, durch Zufall bekamen Sie einen Tip und schon war es gelöst.

Ähnlich haben wir uns diese neue Rubrik in der ST Computer vorgestellt. Aufgerufen sind auch Sie, liebe Leser(innen)! Geben Sie Ihre Erfahrungen weiter, egal, ob es um Anwendungen, Programmieren o.ä. geht.

Wir sammeln Ihre (und unsere) Tips und stellen Sie ggf. in den Quick-Tips vor.

Einsendungen an: maxon Computer

ST Computer Redaktion Stichwort: Quick-Tip Industriestr. 26 W-6236 Eschborn

Programm ruft Funktion

Für mancherlei Zwecke ist es günstig, aus einem Programm heraus Systemfunktionen aufrufen zu können. Das Shareware-Programm Gemini/Mupfel bietet die Möglichkeit, über die Systemvariable shell_p den eingebauten Kommandozeilen-Interpreteraus laufenden Programmen anzusprechen. Die Methode ist in der Anleitung zur Mupfel für C dokumentiert. Der Inhalt der Variablen shell_p an der Adresse $4F6 verrät, wo die Einsprungadresse der Mupfel liegt. Die Übertragung dieses Aufrufs in GFA-Basic war für mich lange ein Problem, aber schließlich ist es doch gelungen.

Das entscheidende ist der Aufruf der C-compilierten Mupfel-Routine aus GFA-BASIC mittels C:(). Als Parameter erwartet Mupfel dann noch die Adresse der Kommandozeile, und diese muß den Konventionen für C-Strings entsprechen, braucht also am Schluß ein Null-Byte. Das war es schon. Der Rest sind Sicherheitsabfragen, die verhindern, daß wir eine Routine aufrufen, die es nicht gibt, wenn Mupfel gar nicht im System ist.

Wer die Mupfel so aufruft, der denke daran, nach Resets ShellO.prg im Auto-Ordner zu haben, damit in _shell j) sicher nichts Gültiges steht.

D. Schulten, W-6900 Heidelberg

'Beispiel zum Aufruf der Mupfel aus GFA-BASIC 
'Autor: Dietrich Schulten
'Mupfel ist Shareware, (c)bei Stefan Eissing und 
' Gereon Steffens
' (c)1991 by MAXON-Computer

IF NOT FN System("")=-1     !Mupfel meldet sich?
    DO                      !Mehrfache Eingabe möglich
        PRINT CHR$(65+GEMDOS(25))+":"+DIR$(0)+">";
        !Prompt zeigt aktuellen Pfad
        INPUT "",comm$          !Kommando holen
        EXIT IF comm$="exit"    !exit:Ausgang
        IF LEN(comm$)           !Wenn Kommando eingegeben,
            back%=FN System(comm$) !Mupfel aufrufen
            PRINT CHR$(27)+"f"; !evtl. doppelten Cursor wieder aus 
            PRINT "Returncode: ";back%
        ENDIF
    LOOP
ENDIF
'
' Eigentlicher Aufruf der Mupfel anhand _shell_p 
FUNCTION system(cmd$)
    LOCAL cmd%,shell_p%,back%,xbramup$ !Variablen "kapseln"
    shell_p%=LPEEK(&H4F6)   !Wo liegt die Einsprungadresse der Mupfel?
    IF shell_p%             !Wenn in _shell_p etwas steht,
        cmd$=cmd$+CHR$(0)   !für C Nullbyte an die Kommandozeile anhängen 
        cmd%=V:cmd$         !Adresse der Kommandozeile erfragen
        back%=C:shell_p%(L:cmd%) !Mupfel aufrufen mit Zeiger auf Kommandozeile 
    ELSE
        PRINT "Mupfel ist nicht vorhanden!" 
        back%=-1 
    ENDIF
    RETURN back%
ENDFUNC

Bildschirmproblem des STE

Wie in der ST Computer 11/91 erwähnt, gibt es auf dem neuen MEGA STE manchmal Probleme mit der XBIOS-Funktion setscreen. Wird diese Funktion nur zum Ändern der logischen bzw. physikalischen Bildschirmadresse und nicht zum Wechseln der Auflösung verwendet, muß als dritter Parameter -1 übergeben werden (laut Atari!). Theoretisch wäre es auch möglich, die aktuelle Auflösung zu übergeben.

Leider funktioniert dies nur auf den alten STs. Speziell im Monochrommodus spinnt der MEGA STE und verpaßt dem Bildschirm „Eselsohren“! Da viele Programmierer sich mal wieder nicht an die Regeln gehalten haben, sehen die frischgebackenen MEGA-STE-Besitzer,nicht nur mit dem Super-Charger, plötzlich doppelt.

Was also tun? Man klinke sich in den XBIOS-Trap (natürlich mit XBRA) und warte auf den Setscreen-Aufruf. Kommt einer, kann man an den Parametern feststellen, ob der Fehlerfall vorliegt. Da der Fehler nur im Monchrommodus auftritt, darf als dritter Parameter auf keinen Fall der Wert 2 übergeben werden. Also mache aus 2 -1, und das Problem ist erledigt.

Das Assembler-Programm FALTOFF geht nach diesem Schema vor und sollte von den von Eselsohren gestreßten Usern in den Auto-Ordner kopiert werden. Bisher sind keine Unverträglichkeiten aufgefallen. FALTOFF ist völlig transparent und stört auch in den Farbmodi nicht.

R. Kurz, W-7992 Tettnang

; FALTOFF.PRG

; Dieses Machwerk beseitigt das Bildschirm-Falten 
; auf dem MEGA STE. Erstellt mit MAS 68k Okt.1991 
; Auto: Richard Kurz 
; (c)1991 by MAXON-Computer

start:      bra init        ; Gehe über Los ...
            dc.b 'XBRA'     ; XBRA
            dc.b 'FALT' 
old_vec:    dc.l 0

new_vec:    move.l  sp,a0       ; Neuer XBIOS-TRAP
            btst    #5,(a0)     ; Super oder nicht?
            beq     user        ; Man weiß ja nie
            addq.l  #6,a0
            bra     do_it
user:       move.l  usp,a0

do_it:      cmpi.w  #5,(a0)     ; Bin ich gemeint?
            bne     finito      ; Nö
            cmpi.w  #2,10(a0)   ; Parameter falsch?
            bne     finito      ; Nö
            move.w  #-1,10(a0)  ; Parameter ersetzen

finito:     move.l  old_vec(pc),-(sp) ; zum
                                ; Orginal
            rts

init:       move.l  #-1,-(sp)   ; einrichten
            move.w  #46,-(sp)
            move.w  #5,-(sp)
            trap    #13
            addq.l  #8,sp
            move.l  d0,a0

is_XBRA:    cmp.l   #'XBRA',-12(a0) ; XBRA
            bne     install
            cmp.l   #'FALT',-8(a0) 
            beq     schon_da
            move.l  -4(a0),a0
            bra     is_XBRA

schonda:    clr.w   -(sp)       ; Bin schon
                                ; installiert
            trap    #1          ; Kommentarloses
                                ; Ende

install:    pea.l   new_vec     ; Vektor-Biegerei
            move.w  #46,-(sp) 
            move.w  #5,-(sp) 
            trap    #13
            addq.l  #8,sp 
            move.l  d0,old_vec

            pea     info        ; Ein wenig
                                ; labern
            move    #9,-(sp)
            trap    #1
            addq.l  #6,sp

            clr.w   -(sp) ; und Tschüß
            move.l  #init-start+256,-(sp) 
            move.w  #$31,-(sp) 
            trap    #1

info:       dc.b    13,10,'Bildschirm-Falten beseitigt'
            dc.b    13,10,'Richard Kurz 1991' 
            dc.b    13,10,0

Rückkehr zum System-Font?

Problem: Mit der Funktion TEXT (VDI #8) läßt sich ein Text auf den Grafikbildschirm schreiben, dessen Größe mit SET CHARACTER HE1GHT, ABSOLUTE MODE (VDI #12) verändert werden kann. Eine Rückkehr zum ursprünglichen 8*16-System-Font ist dann allerdings nicht mehr möglich (evtl. GEM-Fehler, oder schlichtweg vergessen?).

Lösung: Mittels GRAF_HANDLE (AES #77) wird das Handle des Bildschirms erfragt. Übergibt man der Funktion OPEN VIRTUAL SCREEN WORKSTATION (VDI #100) dieses Handle, so wird nun auf dem geöffneten Ausgabegerät (hier der Bildschirm) ein virtuelles neues Ausgabegerät (ebenfalls der Bildschirm) geöffnet, dessen Handle zurückgeliefert wird.

Sinn dieser Funktion ist es, daß mehrere Programme (z.B. das eigene Programm und das AES) den Bildschirm gleichzeitig nutzen können, ohne sich dabei in die Quere zu kommen. Unter Benutzung des neuen Handles können Sie nun die Texthöhe beliebig verändern und den Text ausgeben lassen. Übergeben Sie jedoch das alte Handle an TEXT, so haben Sie den normalen 8*16-System-Font. Wollen Sie keine Änderungen der Textgröße mehr durchführen, schließen Sie das virtuelle Ausgabegerät mittels CLOSE VIRTUAL SCREEN WORKSTATION (VDI #101), dessen Handle dann ungültig ist.

Nunmehr dürfte es keine Schwierigkeiten mehr geben, z.B. eine große Überschrift und anschließend normalen Text auf den Grafikbildschirm zu zaubern. Zur besseren Umsetzung in Ihre Lieblingsprogrammiersprache folgt die Bezeichnung der Funktionen in C:

AES 77  = gr_handle  
VDI 8   = vgtext  
VDI 12  = vst_height  
VDI 100 = v_opnvwk  
VDI 101 = v_clsvwk

Und noch ein Tip: Die Texthöhe 4 entspricht der Icon-Schriftgröße 66, Texthöhe 6 dem System-Font 88.

Achtung MEGAMAX Modula 2-Programmierer! Die Funktion VDI Attributes. SetAbsTHeight (VDI #12) liefert die VAR-Parameter in umgekehrter (!) Reihenfolge, also: cellH, cellW, charH, charW, und das gilt auch für VDIAttributes.SetPtsHeight.

Dr. K. Fröhlich, W-6054 Rodgau

Mit TOS 2.05 Boot-Selektionsprogramme sinnvoll nutzen

Viele Boot-Selektionsprogramme stellen die Funktion zur Verfügung, aus einem speziellen Ordner heraus aus mehreren Desktop.Inf-Dateien eine zu verwendende auszuwählen und so je nach Konfiguration oder Lust und Laune andere Desktop-Voreinstellungen beim Booten zu bestimmen. Insbesondere beim TOS 1.xx, das nicht so komfortabel Einstellungen vornehmen lassen kann wie das neue TOS 2.xx oder 3.xx, ist das ausgesprochen von Vorteil. Z.B. Superboot geht dabei so vor, daß es eine eventuell vorhandene Desktop.Inf-Datei löscht und die selektierten Inf-Dateien als Datei Desktop.Inf in das Wurzelverzeichnis kopiert; ggf. werden noch automatisch zu startende Programme eingetragen.

Soweit, so praktisch, doch das Verfahren hat für die Anwender der neueren TOS-Versionen einen entscheidenden Nachteil; das Betriebssystem interessiert sich nicht mehr im mindesten beim Booten für Dateien, die Desktop.Inf heißen - Newdesk.Inf muß es sein. Nun gibt es zwei Möglichkeiten, das mit viel Mühe installierte Boot-Programm und die mit viel Liebe erstellten zweiundvierzig Desktop.Inf-Dateien dennoch zu verwenden.

Einerseits kann man die Programmdatei mit Hilfe eines Monitorprogrammes - etwa dem SED von der Kleisterscheibe, um auch hier die Werbung nicht fehlen zu lassen - patchen, d.h. in dieser Datenwüste die Zeichen „DESKTOP“ durch „NEWDESK“ ersetzen. Wer aber nicht gerne in irgendwelchen Programmdateien rumpfuscht, kann sich einfach den Umstand zunutze machen, daß im Auto-Ordner nach dem Boot-Selektionsprogramm ja noch Programme ausgeführt werden können/müssen. Installiert man also ein Programm, das bei Vorhandensein eine eventuelle Datei Newdesk.Inf löscht und Desktop.Inf in Newdesk.Inf umbenennt, ist man aller Probleme enthoben. In GFA-BASIC kann das für Festplattenbenutzer z.B. so aussehen:

If Exist("C:\DESKTOP.INF")
    If Exist("C:\NEWDESK.INF") 
        Kill "C:\NEWDESK.INF" 
    Endif
    Rename "C:\DESKTOP.INF" As "C:\NEWDESK.INF"
Endif

S. Lovens, 4100 Duisburg



Aus: ST-Computer 01 / 1992, Seite 164

Links

Copyright-Bestimmungen: siehe Über diese Seite