Leserbriefe

DATA und BSS-Segment

Wie kann man einem Assembler anweisen, eine mit ‘.dc’ definierte Konstante und einen mit '.ds' definierten Speicherbereich korrekt dem Datensegment bzw. dem BSS-Segment im Programm Vorspann zuzuweisen?

Bis jetzt wird bei meinen Programmen der Speicherbereich auch dem Programmtext zugewiesen und das Programm somit unnötig lang.

(Jörg Michael K., Wedel/Holstein}

Red.: Jeder Assembler bietet über sogenannte Schlüsselwörter mit Namen ‘data' und ‘bss' anzugeben, in welche Bereiche das Folgende hineingeschrieben werden soll. Die genaue Vorgehensweise finden Sie in Ihrem Handbuch. Wichtig dabei ist, daß Sie dem BSS-Segment nur nicht-initialisierte Variablen zuweisen können, also kein ‘.dc’, sondern nur '.ds‘ verwenden können.

Laserdrucker überlistet

Gibt es folgenden Zusatz zum ATARI, der mir besonders nützlich und ökonomisch erschiene: eine Möglichkeit, den Laserdrucker per Schalter zu- und abzuschalten?

Sehr häufig brauche ich den Laser nicht. Da die Stecker aber eine begrenzte Lebensdauer haben, scheue ich das Umstecken. Dann aber habe ich den erheblichen Lärm des Ventilators - das kurze Kabel stellt sicher, daß man den Ventilator fast ‘im Ohr’ hat. Dazu kommt der nicht unerhebliche Stromverbrauch.

Bitte vermitteln Sie mir bitte einen ingeniösen Zusatz, um den Laserdrucker per Schalter zu- oder abzuschalten.

(Manfred D., Zürich)

Red.: Das Problem kennen wir, aber Sie werden sehen, es ist ganz einfach zu lösen: Der Laser-Drucker hat an seiner Rückseite eine Klappe und wenn Sie diese öffnen, schaltet er sich automatisch ab, und Sie können sich wieder ohne Probleme mit Ihren Mitmenschen verständigen. Wollen Sie weiterdrucken, schließen Sie die Klappe einfach wieder (ganz schön ingeniös, oder?).

Anwort auf einen Leserbrief: GFA-Patch

Da ich vor einiger Zeit vor dem selben Problem stand wie Frau Müller (siehe Leserbriefe 12/ 88) und eine Anregung für das alte GFA-BASIC 2.0 gefunden habe, möchte ich Ihnen hiermit meine daraus resultierende Lösung anbieten.

Aus einer Veröffentlichung habe ich die alte und neue Adresse von kbshift sowie die zu patchenden Adressen für den Interpreter, den Run-Only-Interpreter 2.0 und den Compilers 1.71 entnommen. Anhand der Bytefolge $10, $38, $0e, die der kbshift-Adresse vorausgeht, habe ich die Patchadresse für den Compiler 1.8 ermittelt.

Darauf basierend habe ich ein kurzes Programm geschrieben, das diesen Patch wahlweise für das Blitter-TOS durchführt oder wieder die alte Adresse einsetzt. Zuerst muß der Benutzer aus einer Alertbox auswählen, welche Betriebssystemversion er hat. Daraufhin wird das Programm gepatcht und die alte Adresse hinten angehängt.

' GFAPATCH 
' zur Anpassung der Alt-Shift-Ctrl Abfrage älterer 
' GFA-BASIC Versionen an das Blitter-TOS 
'
DIM patch(2),adresse(10) 
'
' Einlesen der zu patchenden Werte und Adressen 
'
READ patch(1),patch(2) 
DO 
    INC zaehler 
    READ adresse(zaehler) 
    EXIT IF adresse(zaehler)*-1 
LOOP 
'
' Was darf's sein? 
'
ALERT 2,"|Soll eine Blitter-|oder Normal-TOS| Version erzeugt werden ?",0,"Blitter|Normal",version 
'
' Und jetzt in die Endlosschleife 
'
DO 
    FILESELECT DIR$ (0) + "\*.prg","",gfa$ 
    EXIT IF gfa$="" 
    OPEN "U",#1,gfa$ 
    FOR i%=1 TO zaehler 
        '
        ' Ist die Datei groß genug? 
        '
        IF adresse(i%)<LOF(#1) 
            SEEK #1,adresse(i%)-3 
            byte1=INP(#1) 
            byte2=INP(#1) 
            byte3=INP(#1) 
            ' Dann überprüfe die 3 Byte vor der zu patchenden 
            ' Stelle,und ändere die kbshift Adresse gegebenen 
            ' falls 
            '
            IF byte1=&H10 AND byte2=&H38 AND byte3=&HE 
                OUT #1,patch(version) 
                fertig!=TRUE 
            ENDIF 
        ENDIF 
    NEXT i% 
    CLOSE #1 
    '
    ' Melde Erfolg oder Mißererfolg 
    '
    IF fertig! 
        ALERT 0,"Okay !|"+gfa$+" |wurde gepatcht. ",2,"Nochmal|Abbruch",a% 
    ELSE 
        ALERT 3,"Für diese Version von|"+gfa$+"|kenne ich leider|die Patch-Adresse nicht!",2,"Weiter|Abbruch",b% 
    ENDIF 
    EXIT IF a%=2 OR b%=2 
LOOP 
'
' Blitter-,Normal-TOS 
'
DATA &H61,&H1B 
'
' zu patchende Adresssen und Endezeichen 
'
DATA &H63AD,&H5D39,&H9BCF,&H9C83,-1

GFA-PATCH

Einbindung und Programmierung von GDOS-Treibern

Das Betriebssystem des ATARI, insbesondere das VDI, verfügt über einige Befehle, mit denen sich Gerätetreiber laden lassen, von denen man Eigenschaften des Ausgabegerätes erfragen kann. Ich arbeite z. Zt. an einer Meßwertauswertung, die weder auf einen Drucker zugeschnitten sein soll noch nur in der Auflösung von Hardcopies arbeitet, sondern die die jeweilige Grafikauflösung optimal nutzt. Hierzu meine Fragen:

  1. Wie werden solche Treiber geladen (man braucht wohl GDOS.PRG)?
  2. Wie werden diese Treiber vom VDI angesprochen (mit anderen Worten, wie programmiere ich einen solchen Treiber)?

Über Literaturhinweise (das Profi-Buch habe ich bereits) wäre ich ebenso dankbar wie übereine Veröffentlichung als Leserbrief. Vielleicht knabbern ja noch andere an solchen Problemen.

Frank A., Köln

Red.: Wie Sie ganz richtig vermuten, führt der Weg eines eigenen Gerätetreibers über das Programm GDOS.PRG, das bei ATARI aus der Mailbox zum Download vorhanden ist oder beim Fachhändler zu besorgen sein müßte. Beim ATARI ST wurde ein abgemagerter GDOS-Handler implementiert, der nur die Bildschirmtreiber im ROM kennt. Dieser GDOS-Handler wird durch GDOS.PRG ersetzt, das die Möglichkeit hat, beim Starten Treiber für bestimmte Geräte sowie Zeichensätze zu laden. Die Namen für diese Zeichensätze und Treiber müssen in der Datei ASSIGN.SYS eingetragen sein.

Ein VDI-Gerätetreiber ist eine völlig normale Programmdatei ohne Startup-Code, die als erste Routine einen Dispatcher (Verteiler) für die eingehenden VDI Aufrufe enthält. Jeder Gerätetreiber hat eine Nummer, an der er, beim Öffnen dieses Gerätetreibers mit v_opnwk(), identifiziert wird. Einige dieser Nummern sind schon vordefiniert und sollten daher nicht benutzt werden.

An dieser Stelle ist es sicherlich nicht möglich, eine umfassende Darstellung einer Implementierung eines VDI-Gerätetreibers zu geben: allerdings soll tatsächlich auf das Profibuch - allerdings auf die 1. Auflage von 1988 - verwiesen werden. In ihm ist beschrieben, welche Routinen zur Verfügung gestellt werden müssen (Seite 216) und wie der VDI-Dispatcher im ROM des ATARI ST aussieht (Seite 218). Auf Seite 252 findet man die Beschreibung der Routine v_opnwk(), die das Öffnen eines Treibers aus dem Programm heraus übernimmt.

Trotzdem wollen wir den Aufruf an alle Leser weitergeben:

Wer hat einen VDI-Treiber implementiert, oder wer hat Erfahrungen damit?

Mausaufruf auch aus GFA-BASIC

Nun geht es doch: In einer der letzten Ausgaben hat ein Leser eine Routine zum Positionieren des Mauszeigers in ‘C’ vorgestellt. Damit nicht nur ‘C*-Programmierer in den Genuß dieser überaus sinnvollen Funktion kommen, habe ich die Routine in GFA-BASIC umgeschrieben.

Allerdings ist der Aufruf etwas anders. So muß man nicht vorher 'open workstation’ aufrufen, das macht das GFA-BASIC von alleine (denk' ich mir doch), man muß sich nur die Handle-Nummer besorgen. Diese steht in Contrl[6] (‘C’), was Contrl+12 in BASIC entspricht. Anschließend muß vsin_mode aufgerufen werden (zum Setzen in den Sample-Mode) und dann, ehe wir’s vergessen, 'vsm_locator'. Bei 'vsin mode' wird das Eingabegerät angegeben, man weiß ja nie, welche Eingabegeräte durch GDOS implementiert werden.

Markus Seelis, Peine-Siedersdorf

Routine zum Setzen des Mauszeigers in GFA-BASIC
Marcus Seelis, 25.0kt'88

Gosub Hin_da(38,46) 
'
Procedure Hin_da(X%,Y%) 
    Local Handle% 
    '
    Handle%=Dpeek(Contrl+12)        ! Gerätekennung holen
    Dpoke Contrl+2,0                ! kein ptsin-Wertepaar
    Dpoke Contrl+6,2                ! zwei intin-Daten
    Dpoke Contrl+12,Handle% 
    Dpoke Intin,1                   ! Eingabegerät (1-4) 
    Dpoke Intin+2,2                 ! 1 = request, 2 = sample
    Vdisys 33                       ! vsin_mode  
    Dpoke Contrl+2,1                ! ein ptsin-Wertepaar 
    Dpoke Contrl+6,0                ! kein intin-Wertepaar
    Dpoke Contrl+12,Handle% 
    Dpoke Ptsin,X%                  ! ptsin-Wertepaar=Koordinaten 
    Dpoke Ptsin+2,Y% 
    Vdisys 28                       ! vsm_locator
Return

Setzen des Mauszeigers in GFA-BASIC

Mit BASIC parken

Mit großer Begeisterung habe ich in der Novemberausgabe Ihrer Zeitschrift das schöne Programm von Hartmut Thordsen gesehen, das es mit einem einfachen aber genialen Trick ermöglicht, Festplatten ohne die bisher nötigen Umstände zu parken. Nun ist PASCAL nicht gerade eine der verbreitetsten Programmiersprachen. Es ist aber natürlich problemlos möglich, ein entsprechendes Programm auch in anderen Programmiersprachen zu realisieren. Hier ist es - da die Variablendeklarationen wegfallen - sogar einfacher und kürzer:

RESERVE 10000 
name$="SHIP.PRG" 
cmd$="" 
env$="" 
done%= GEMDOS(75,0,L:VARPTR(nameS),L:VARPTR(cmd$), L:VARPTR(env$)) 
IF done%=-33 
    ALERT 3,"SHIP.PRG nicht gefunden | Festplatte nicht gesichert!",1," PECH ",dummy! 
ELSE 
    ALERT 1,"Festplatte geparkt.|Geräte jetzt abschalten oder|Fortsetzung mit Weiter* ", 0,"WEITER",dummy! 
ENDIF 
END 

Mit BASIC parken



Aus: ST-Computer 03 / 1989, Seite 182

Links

Copyright-Bestimmungen: siehe Über diese Seite