VBR V37.2 - Anleitung NAME C:VBR SYNOPSIS VBR SHOW/S : SET/S : RESET/S : FORCE/S : QUIET/S : BESCHREIBUNG Kleines Hilfsprogramm zum Verlegen der Interrupt-Vektortabelle aus dem ChipRAM ins FastRAM. Hohe Sicherheit, gibt von einem anderen Programm belegten Speicher nicht frei. Benötigt Kickstart Release 2.04, einen MC68010 Prozessor (oder besser), sowie FastRAM. Aufruf nur aus dem CLI bzw. der Shell möglich. QUELLSOURCE Der Quellsource zu VBR befindet sich im Unterverzeichnis Source und kann mit SAS/C 6.2 oder höher compiliert werden (möglicherweise reicht auch SAS/C 6.0 oder 6.1). COPYRIGHT VBR V37.2 ist frei kopierbar (freely distributable). VBR darf frei auf Public-Domain und Shareware Disketten, speziell auf der von Fred Fish vertriebenen AmigaLibDisk Serie, vertrieben werden, solange diese nicht einen angemessenen Preis ($6 oder DM 8,--) pro Diskette überschreitet. Vor der Benutzung in kommerziellen Produkten ist eine Erlaubnis beim Autor (mir :->) einzuholen. VBR V37.2 darf kopiert und vertrieben werden über elektronische Netzwerke wie z.B. das Internet, auch darf es auf anonymen FTP-Servern, Mail-Boxen oder Boards abgelegt werden. Das Copyright liegt immer noch beim Autor. DISCLAIMER Sie benutzen VBR V37.2 auf eigene Gefahr. Ich übernehme keine Garan- tie, weder explizit noch implizit, für die korrekte Funktion dieses Programms. Für jeden Schaden, der - direkt oder indirekt - durch die Benutzung dieses Programms entsteht, haften Sie und nur Sie allein. Wenn Sie das nicht wollen, benutzen Sie dieses Programm nicht. Ich kann nicht verantwortlich oder haftbar gemacht werden für Schäden, die durch Gebrauch, Mißbrauch oder fehlerhafte Benutzung des Programms entstehen. Zusammenfassung: You break it, you own both halves. AUTOR & SUPPORT Klaus Weber Graf-Spee-Str. 23b 2900 Oldenburg Germany INTERNET: Klaus.Weber@arbi.informatik.uni-oldenburg.de Bitte lesen Sie erst die Sparte 'BEKANNTE PROBLEME' durch, bevor Sie mir einen Bug-Report schicken. Kommentare und Verbesserungsvorschläge sind willkommen. VERSIONEN Version Datum Kommentar ------- ----- --------- V37.1 28.03.1993 Erste veröffentlichte Version V37.2 30.03.1993 - Blöden Fehler behoben: Ich habe vergessen, die dos.library wieder zu schließen. Ist mir natür- lich erst 5 Stunden _nach_ Freigabe von V37.1 aufgefallen... >:-[ - Code etwas aufgeräumt, dadurch ist das Programm auch 20 Bytes kürzer geworden. VERWENDUNG & THEORIE Beim Amiga (bzw. allgemein bei Prozessoren der MC680x0 Reihe) liegt ab Adresse Null eine Tabelle von 256 Langworten (1024 Bytes), in der die Adressen der Interruptroutinen vermerkt sind, d.h. bei einem auftretenden Interrupt sieht der Prozessor in dieser Tabelle nach, an welche Adresse jetzt zur Behandlung dieses Interrupts gesprungen werden muß. Beim MC68010 und dessen Nachfolgern existiert ein sog. Vektor-Basisregister (kurz: VBR), mit dem sich diese Tabelle an eine andere (gerade) Speicheradresse verlegen läßt (das VBR zeigt auf den Anfang der Vektor-Tabelle). Das Programm VBR V37.2 ist nun in der Lage, die Vektor-Tabelle ins FastRAM zu verschieben. Was aber bringt das für Vorteile ? Nun, bei bestimmten Bildschirm-Darstellungsmodi greift die Video-Hardware des Amiga besonders intensiv auf das ChipRAM zu. Bei der Darstellung eines HIRES Screens in 16 Farben bei vollem Overscan wird die zur Verfügung stehende Übertragungsband- breite des ChipRAMs fast vollständig ausgenutzt (nur bei Rechnern, die nicht mit dem AA-Chipsatz ausgerüstet sind). Da Zugriffe der Video-Hardware Priorität vor Zugriffen des Prozessors haben, kann es unter Umständen vorkommen, daß der Zugriff des Prozessors auf eine Adresse im ChipRAM maximal um die Zeit verzögert wird, die notwendig ist, um ein Bildschirmbild komplett aufzubauen (1/50 sec bei PAL, 1/60 sec bei NTSC). Dieses Problem tritt nicht bei Zugriffen auf das FastRAM des Rechners auf; hier kann der Zugriff des Prozessors auf das FastRAM parallel (gleichzeitig) zum Zugriff der Video-Hardware auf das ChipRAM erfolgen. Der schnelle Zugriff auf die Adressen der Interrupt-Routinen ist immer dann besonders wichtig, wenn viele Interrupts bearbeitet werden müssen. Dies ist z.B. dann der Fall, wenn Daten über die serielle Schnittstelle des Amiga von oder zu einem schnellen Modem übertragen werden sollen. Um schnellstmögliche Übertragungen auch bei stark komprimierbaren Daten (z.B. Textdateien) zu gewährleisten, ist es ratsam, das Modem mit einer hohen Geschwindigkeit anzusteuern (38400 oder gar 57600 bits/sec). Mit ausreichend schnellen Modems ist es auf diese Weise möglich, Datenübertragungsraten von über 4000 Zeichen pro Sekunde (characters per second, cps) zu erreichen (i.a. allerdings ist dazu mindestens ein MC68020 erforderlich). Da der Baustein, der im Amiga die serielle Datenübertragung ab- wickelt, keine Möglichkeit hat, empfangene Zeichen zwischenzu- speichern, ist er darauf angewiesen, nach jedem empfangenen Zeichen einen Interrupt auszulösen. Die Interrupt-Routine muß nun dieses Zeichen so schnell wie möglich auslesen und in einen Puffer schreiben, bevor es durch das nächste ankommende Zeichen über- schrieben wird. Dauert es zu lange, bis das Zeichen vom Prozessor abgeholt wird, wird es durch das nächste Zeichen überschrieben; bei Dateiübertragungen kommt es dadurch zu einem Übertragungs- fehler. Durch Verlegen der Interruptvektor-Tabelle ins FastRAM kann man zumindest mithelfen, die Geschwindigkeit serieller Über- tragungen zu erhöhen. MOTIVATION Die Idee, die Interruptvektor-Tabelle ins FastRAM zu verlegen, ist nicht neu, und es gibt schon einige Programme, die diese Aufgabe erledigen (die Programme heißen allesamt VBR; ich wollte mit dieser Tradition nicht brechen :->). Jedes dieser Programme hatte aller- dings kleine Schwächen, mit denen ich mich nicht abfinden wollte (die Verlegung der Vektor-Tabelle war nicht rückgängig zu machen, unter widrigen Umständen konnte eines dieser Programme Speicher freigeben, den ein anderes Programm angefordert hatte, was über kurz oder lang zum Absturz des Systems führte, usw.) und so habe ich eben eine eigene Version geschrieben. Diese Version ist (fast) narrensicher, flexibel und (hoffentlich) so systemkonform wie möglich. VBR V37.2 gibt niemals Speicher frei, den es nicht selbst belegt hat. ARGUMENTE Ohne Argumente wird lediglich die aktuelle Adresse, auf die das Vektor-Basisregister zeigt, ausgegeben. SHOW/S : Momentane VBR-Adresse anzeigen. Wird diese Option zusammen mit SET oder RESET angegeben, so wird zuerst der Wert des Vektor-Basisregisters angezeigt, dann die Operation (SET/ RESET) durchgeführt, und der neue Wert angezeigt. SET/S : Interruptvektor-Tabelle ins FastRAM verlegen. Falls die Tabelle schon im FastRAM lag, so wird dies angegeben. Außerdem wird dann angezeigt, ob die Verschiebung von VBR V37.2 oder von einem anderen Programm durchgeführt wurde. RESET/S : Interruptvektor-Tabelle wieder ins ChipRAM (Adresse 0) zurückverlegen. Falls die Verlegung ins FastRAM von VBR durchgeführt wurde, wird der belegte Speicher für die Tabelle im FastRAM wieder freigegeben. Hat jedoch ein anderes Programm die Tabelle verlegt, so wird VBR weder den Speicher freigeben, noch das Vektor-Basisregister auf 0 setzen. Das Zurücksetzen des Vektor-Basisregisters kann jedoch durch zusätzliche Angabe von FORCE erzwungen werden. Falls das Vektor-Basisregister schon den Wert 0 hatte, so wird auch dies angegeben. FORCE/S : Zurücksetzen des Vektor-Basisregisters erzwingen, auch wenn die Verlegung der Interruptvektor-Tabelle nicht von VBR V37.2 durchgeführt wurde. Nur sinnvoll bei gleichzei- tiger Angabe von RESET. Obwohl VBR V37.2 das Vektor- Basisregister auf 0 setzt, gibt es den Speicher für die Tabelle (im FastRAM) _nicht_ wieder frei. Dies ist so beabsichtigt, denn _nur_ das Programm, das diesen Speicher vom System angefordert hat, darf diesen auch zurückgeben! Andernfalls kann es leicht zum Absturz des System kommen. Wurde die Verlegung der Interruptvektor-Tabelle ins FastRAM von VBR V37.2 durchgeführt, so wird FORCE nicht beachtet, d.h. der Speicher wird korrekt wieder freige- geben. QUIET/S : Keine Texte ausgeben, auch nicht bei Fehlern. Sinnvoll, wenn VBR V37.2 in die Startup-Sequence oder in User-Startup eingefügt wird. Diese Option ist nicht sinnvoll im Zusammenhang mit SHOW, diese Kombination wird aber akzeptiert. In der Startup-Sequence bzw. in User-Startup kann die Umgebungsvariable (Environment- variable) $RC geprüft werden, um zu erfahren, ob etwas schiefgegangen ist. Bei Fehlern enthält sie den Wert 10, wenn alles in Ordnung ist, den Wert 0. Wird VBR V37.2 unter einer Kickstartversion kleiner als 2.04 aufgerufen, so enhält $RC den Wert 20. MELDUNGEN VBR V37.2 gibt folgende Meldungen aus (solange nicht die QUIET Option angegeben wird): (In alphabetischer Reihenfolge) Alien VBR setup reset, some memory is lost Das Rücksetzen des Vektor-Basisregisters wurde erzwungen (mit der FORCE Option), obwohl die Verlegung der Interruptvektor- Tabelle ins FastRAM nicht von VBR V37.2 durchgeführt wurde. Dies führt möglicherweise dazu, daß das Programm, welches die Verlegung ins FastRAM durchgeführt hat, den Speicher für die Tabelle nicht mehr freigibt. Current VBR address: 0x ist die aktuelle Adresse, auf die das Vektor- Basisregister zeigt. Die Adresse wird in hexadezimaler Schreibweise ausgegeben, wie das vorangestellte "0x" auch andeutet. FORCE makes no sense without RESET Ohne RESET ist die Angabe von FORCE sinnlos. Das Setzen des Vektor-Basisregisters, z.B. bei Speichermangel, kann nicht erzwungen werden. New VBR address: 0x Die Verlegung der Interruptvektor-Tabelle wurde erfolgreich durchgeführt; die Tabelle liegt jetzt ab Adresse im Speicher. Die Adresse wird in hexadezimaler Schreibweise ausgegeben, wie das vorangestellte "0x" auch andeutet. SET and RESET are mutually exclusive SET und RESET dürfen nicht gleichzeitig angegeben werden. Bitte entscheiden Sie, was Sie wollen. :-> This program requires a MC 68010 or better Dieses Programm benötigt mindestens einen MC 68010, da der MC 68000 kein Vektor-Basisregister besitzt. Unable to allocate memory for new vectortable Sie haben nicht genug FastRAM für die Interruptvektor- Tabelle frei. Beachten Sie, daß VBR V37.2 explizit FastRAM anfordert, da eine Verlegung an eine andere Stelle des ChipRAMs keine Vorteile bringen würde. VBR V37.2 benötigt 1048 Bytes FastRAM für die Tabelle, hierzu müssen Sie noch den Speicher addieren, den das Programm selbst benötigt. Unable to reset VBR: alien VBR setup detected Die Interruptvektor-Tabelle liegt zwar im FastRAM, diese Verlegung wurde aber nicht von VBR V37.2 durchgeführt. Somit weigert sich VBR V37.2 (aus Sicherheitsgründen), das Vektor- Basisregister auf 0 zurückzusetzen, da es den Speicher, den die Interruptvektor-Tabelle belegt hat, nicht wieder frei- geben kann. Wollen Sie das Rücksetzen des Vektor-Basisregisters erzwingen (und den evtl. Verlust des Speichers in Kauf nehmen), benutzen Sie zusätzlich die FORCE Option. VBR already set by alien program Die Interruptvektor-Tabelle liegt bereits im FastRAM. Diese Verlegung wurde nicht von VBR V37.2, sondern von einem anderen Programm durchgeführt. VBR already set by VBR 37.2 Die Interruptvektor-Tabelle liegt bereits im FastRAM. Diese Verlegung wurde von VBR V37.2 durchgeführt. VBR not set Das Vektor-Basisregister ist schon zurückgesetzt. VBR reset Das Vektor-Basisregister wurde erfolgreich zurückgesetzt. wrong number of arguments Es wurden andere Parameter als SHOW,SET,RESET,FORCE oder QUIET angegeben. BEKANNTE PROBLEME VBR V37.2 darf nur vom CLI bzw. von der Shell aus gestartet werden. Wenn Sie für das Programm ein Piktogramm (Icon) kreieren und es über dieses Piktogramm aufrufen, stürzt VBR V37.2 mit dem Fehlercode #87000004 ab. Unterstützung von Workbench-Starts würde das Programm ungefähr 5 Mal länger werden lassen. Vielleicht implementiere ich das ja dennoch eines Tages... :-> Manche Programme, die das Vektor-Basisregister verändern, reagieren sehr empfindlich, wenn VBR V37.2 das VBR manipuliert (mittels der FORCE Option). Dies kann im Extremfall zum Absturz des Systems führen. Bitte benutzen Sie die FORCE Option mit Vorsicht; ohne Angabe von FORCE hingegen sollten in keinem Fall Probleme auftauchen. Auf manchen Rechnern (Amiga 500 mit Speichererweiterung, sowie alte Amiga 2000) gibt es sog. Ranger-MEM (auch als SlowRAM oder auch SlowFastRAM bezeichnet), das ab Adresse $C00000 eingeblendet wird. Obwohl dieser Speicher vom System als FastRAM verwaltet wird, unter- liegt er den Beschränkungen, denen das ChipRAM unterworfen ist. Ins- besondere wird der Prozessor genau wie bei Zugriffen aufs ChipRAM abgebremst. Falls Ihr Rechner also nur ChipRAM und Ranger-MEM besitzt, bringt das Verlegen der Interruptvektor-Tabelle keinerlei Geschwin- digkeitsvorteile. Obwohl es kein Fehler in VBR V37.2 ist, soll hier noch kurz auf die Probleme eingegangen werden, die andere Programm (überwiegend Spiele) bekommen, wenn das Vektor-Basisregister einen von Null verschiedenen Wert enthält: Einige Programme (das betrifft hauptsächlich Spiele, die von der Workbench aus gestartet werden; bei Programmen, zu deren Start ein Neustart (booten) von Diskette notwendig ist, wird das Vektor-Basisregister ja auch nicht verschoben) halten sich nicht an die Programmierrichtlinien von Commodore und ignorieren den Wert des Vektor-Basisregisters einfach. Diese Programme schreiben die Adresse für ihre Interruptroutinen einfach so in den Speicher, als ob das Vektor-Basisregister den Wert 0 hätte. Da der Prozessor den Wert des VBR natürlich _nicht_ ignoriert, stürzen diese Programme meist ab. Für diesen Fall wurde die RESET (und die FORCE) Option vorgesehen. Bevor Sie also ein Programm starten, welches mit einem VBR-Wert ungleich 0 nicht zurechtkommt, sollten sie VBR V37.2 mit der Option RESET aufrufen. Meist sind die betreffenden Programme auch nicht multitaskingfähig und kehren nicht zur Workbench zurück, so daß auch bedenkenlos die FORCE Option angegeben werden kann. Falls das betreffende Programm über eine Befehlsdatei (scriptfile) ge- startet wird, können Sie die Zeile VBR RESET FORCE auch als erste Zeile in diese Befehlsdatei einfügen (mit einem Editor), dann wird das Vektor-Basisregister vor dem Start des Programms auf 0 gesetzt. Ich möchte nochmals betonen, daß diese Probleme _kein_ Fehler von VBR V37.2 sind, sondern _allein_ auf schlampige Programmierung der Programme, die nicht mit einem VBR-Wert ungleich 0 zurechtkommen, zurückzuführen sind. Das Verschieben der Interruptvektor-Tabelle ins FastRAM ist ein völlig legaler Vorgang (der auch vom Betriebssystem des Amiga unterstützt wird), und Programme, die damit Probleme haben, sind fehlerhaft. Etwas Positives hat die Sache aber doch: die meisten Computerviren, die Interrupts für ihre dunklen Zwecke mißbrauchen, kommen mit einer ins FastRAM verschobenen Interruptvektor-Tabelle auch nicht zurecht. Diese Viren schreiben die Adressen ihrer Interruptroutinen auch so in den Speicher, als wenn das VBR den Wert 0 hätte. Diese Routinen werden aber nicht angesprungen, weil der Prozessor ja ganz woanders nach den Adressen der Interruptroutinen sucht. Auf diese Weise hilft VBR V37.2 also mit, die Verbreitung von Viren auf Ihrem Rechner zu vermeiden. Dies ist natürlich nur dann sinnvoll, wenn das Antivirenprogramm Ihres Vertrauens auch das Vektor-Basisregister unterstützt. Sollte dies nicht der Fall sein, setzen Sie den Autor des Antivirenprogramms hiervon in Kenntnis oder benutzen Sie ein anderes Programm, um Ihren Rechner auf Virenbefall zu untersuchen. DANK SAS Institute Inc. für ihr hervorragendes SAS/C Entwicklungssystem. Markus 'ill' Illenseer und Matthias 'Tron' Scheler, aus ihrer An- leitung zu ASwarm II V1.3 habe ich den generellen Aufbau und einige Textpassagen für dieses Dokument entnommen. Andreas 'atte' Gelhausen für's Korrekturlesen. WARENZEICHEN UND REGISTRIERTE WARENZEICHEN - Amiga®, Workbench(tm) und Kickstart sind Warenzeichen oder registrierte Warenzeichen von Commodore-Amiga, Inc. - Commodore® ist ein Warenzeichen oder registriertes Waren- zeichen von Commodore Electronics Limited. - SAS/C® ist ein Warenzeichen oder registriertes Warenzeichen von SAS Institute Inc.