← ST-Computer 03 / 1989

Leserbriefe

Grundlagen

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