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:
- Wie werden solche Treiber geladen (man braucht wohl GDOS.PRG)?
- 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