★ APPLICATIONS ★ DIVERS ★ XFORMAT, HEXAMON, RAM/ROM-ÜBERBLICK (CPC MAGAZIN)|CPC Magazin) ★ |
XFormat, Hexamon, RAM/ROM-Überblick (CPC Magazin) | Applications Divers |
Auch diesmal bringen wir wieder drei Programme für Sesam. Allerdings ist zum Verständnis die Einführung aus Heft 12/85 ab Seite 44 erforderlich. Wer das Heft nicht hat, kann es bei uns gegen 7 DM in Briefmarken anfordern (incl. Porto). Wer mit seinen Diskettenexperimenten etwas weitergehen möchte, hat mit dem SESAM-Programm gute Chancen. Mit etwas Geschick können in Basic mit dem Erweiterungsbefehl XCALL eigene Diskettenformate erstellt, zwei zusätzliche Spuren genutzt und die Geheimnisse geschützter Diskettensoftware ergründet werden. Alle Anga- 9 Kilobyte mehr ben gelten für die Schneider-Floppy (soweit bekannt auch für den 664), für andere Laufwerke müssen passende Einsprungadressen aus dem Controller-ROM ermittelt werden. Fehlermeldungen einschalten:
sec ist dabei die Nummer eines Sektors von 1 bis 9, off ist der vom Format abhängige Erkennungsoffset: 0 für IBM-Format, &40 für CP/M-Format und &C0 für das Datenformat. drive ist 0 für Laufwerk A und 1 für Laufwerk B, track ist die gewünschte Spurnummer von 0 bis 39 (&27) oder maximal 41 (&29), buffer ist die Adresse eines RAM-Berei-ches für die jeweiligen Daten. Die Sektor-ID ist eine Erkennungsmarke von 4 Byte, der Reihe nach: Spurnummer (track), Kopfadresse (immer Null), Sektornummer (sec+off) und Sektorgröße (immer 2, entsprechend 512 Bytes). Zum Formatieren einer Spur muß ein Formatbuffer mit den Sektor-IDs aller Sektoren (also 4*9=36 Bytes) bestehen. Eine Schwierigheit ist, daß die Sektoren in einer eigenwilligen Reihenfolge formatiert werden, um ein besseres Timing für die Schreib/Lesezugriffe zu erzielen. Bastler haben da ungeahnte Möglichkeiten, für einfache Anwendungen nimmt XFORMAT die Schwerarbeit ab. Das kleine Programm ergänzt bereits formatierte Disketten mit den beiden zusätzlich möglichen Spuren, die nötige Formattabelle wird aus den schon vorhandenen Spuren abgeleitet. XFORMAT ist für das Datenformat geschrieben, für ein anderes Format muß der off-Wert in Zeile 10 verändert werden. Wir erkennen im einzelnen die Befehle für Fehlermeldungen wie Abschalten, Sektor lesen (damit eine definierte Spur eingestellt wird, der Inhalt des Sektors interessiert nicht weiter) und in einer FOR-NEXT-Schleife fürSek-tor-ID lesen. Die Sektor-ID wird an der festen RAM-Adresse &BE4F abgelegt, wo sie mit IXPEEK abgeholt werden kann. Ab Zeile 70 wird der richtige Tabellenanfang ermittelt (für Sektor 1), die neue Tracknummer gepoked und der neue Track formatiert. Das Ganze zweimal, anschließend wird sicherheitshalber mit einem Lesebefehl das Laufwerk auf eine normale Spur zurückgestellt und die Fehlermeldungen werden wieder zugelassen. Mit diesem Programm können auch versteckte Sektoren ausfindig gemacht werden. Wir müssen nur in Zeile 30 für track die Werte &28 und im zweiten Durchlauf &29 einset-zen. Zeile 70 wird ersetzt durch track=0:GOTO 180 (alles dazwischen kann auch weggelassen werden). Das Laufwerk wird vergeblich versuchen (deutlich hörbar), einen Sektor auf dieser Spur zu lesen. Im Formatbuffer stehen jedoch anschließend die ID-Werte aller doch vorhandenen Sektoren, die dann mit diesen Werten und dem Befehl für „Sektor Lesen“ ins RAM geholt werden können. Zurück zu den selbsterzeugten zusätzlichen Spuren. Der CAT-Befehl zeigt weiterhin nur 178 K free, wo bleiben die zusätzlichen 9 K? Diese müssen erst der Diskettenverwaltung mitgeteilt werden. Dazu brauchen wir zunächst die RAM-Adressen, die der Controller benutzt. Bekanntlich wird ein RAM-Bereich bei der Initialisierung (in der Regel beim Einschalten) zugeteilt und kann je nachdem, ob weitere Erweiterungen angeschlossen sind, verschoben werden. Die Floppy benutzt deshalb auch ein paar feste RAM-Adressen, die unter anderem auf den Variabien-Bereich zeigen. floppyram = 256 * PEEK (&BE7E) + PEEK (&BE7D) dpbram = 256 * PEEK (&BE43) + PEEK (&BE42)In diesem Fall interessiert uns dpbram, die Adresse des Disk-Parameter-Blocks. floppyram ist der Basiswert des gesamten benutzten RAM-Bereiches (normalerweise &A700) von insgesamt &500 Bytes. Eine erweiterte Diskette können wir nun so benutzen: Zuerst ein CAT-Befehl, damit die sonstigen Formatwerte richtig eingestellt werden, danach muß mit POKE dpbram+&18,&FF das sogenannte Login abgeschaltet werden, damit nicht bei jedem Diskettenzugriff der Standardwert wieder hergestellt wird. Wenn jetzt mit POKE dpbram + 5 + drive * &40, PEEK (dpbram + 5 + drive * &40) + 9die Standardblockanzahl um 9 erhöht wird, stehen die 9 K-Byte zur Verfügung. Der CAT-Befehl zeigt jetzt 187 K free. Sobald wieder mit anders formatierten Disketten gearbeitet werden soll, kann mit POKE dpbram+&18,0 das Login und damit die automatische Parametereinstellung wieder eingeschaltet werden. HEXAMON mit SESAM HEXAMON wurde als schnelle Bildschirmausgabe für ein umfassenderes Monitorprogramm entwickelt, das jeder in Basic selbst schreiben kann. Es läßt sich aber unabhängig davon auch für eine schnelle Textausgabe verwenden. Darüber hinaus ist HEXAMON bereits ein einfacher Ein-Befehl-Monitor. Voraussetzung ist lediglich, daß das Programm SESAM geladen ist, dann können mit dem SESAM-Befehl |XCALL insgesamt 5 Funktionen aufgerufen werden. HEXAMON ist für alle Fälle ebenfalls in 256-Byte-Schritten verschiebbar. Dazu muß nur nach dem Laden an eine Adresse &xx00 der Befehl CALL hmon+&290,hmon gegeben werden, wobei hmon die Ladeadresse ist. Charakterausgabe |XCALL,hmon+&235,&FF,zeichen,anzahlZeichen ist der ASCII-Wert eines beliebigen Zeichens, anzahl ist die gewünschte Anzahl bis 255 (0 entspricht 256). Bei der Befehlsfolge |XCALL, hmon + &200 ,&FF, 0, 256 * anzahl + min, adr ist adr eine RAM-Adresse, von der ab die genannte Anzahl Zeichen ausgegeben wird, min sollte 0 sein oder 32(&20) (siehe Text). Hexadezimalausgabe |XCALL,hmon+&210,&FF,0,byteDer hexadezimale Wert von byte wird ausgegeben. |XCALL, hmon+&220,&FF, anzahl, 0, adrAb adr wird die angegebene Anzahl Bytes hexadezimal mit je einem Leerzeichen ausgegeben. Pageausgabe |XCALL,hmon+&240,&FF,anzahl,refadr.adrDas ist das Hauptstück von HEXAMON. Mit diesem Befehl wird ein ganzer RAM-Block auf den Bildschirm gebracht (Achtung, nur für MODE 2 geeignet). Dabei ist adr wie gehabt die gewünschte RAM-Adresse und anzahl ist die Anzahl der Zeilen. In einer Zeile werden jeweils 16 Byte hexadezimal und daneben als Charakter dargestellt. Links wird zusätzlich die tatsächliche RAMadresse und rechts eine frei wählbare Referenzadresse (refadr) ausgegeben. Eine Standardpage (16*16 Byte) kommt damit in ca. 2 Sekunden auf den Bildschirm. Die Ausgabe erfolgt nur in WINDOW 0, mit POKE &B20C, windownummer läßt sich auch jedes andere Fenster erreichen. Sesam öffne dich! ROM-Pageausgabe Im Page-Befehl ist der Wert &FF angegeben. Von der Konzeption der SESAM-Routine her bedeutet das zunächst, daß das auszuführende Programm im RAM liegt. Mit einem anderen Wert (0 für Basic-ROM, 7 für Floppy-ROM, &FE für Betriebssystem-ROM) wird aber eine ROM-Selektion vorgenommen, die auch bei der HEXAMON-Aus-führung bestehen bleibt. Mit anderen Worten: Mit passendem adr-Wert und ROM-Nummer wird auch ein ROM-In-halt direkt auf den Bildschirm gebracht. Druckerausgabe HEXAMON benutzt den Firmwareeinsprung TXT WR CHAR (&BB5D). Es ist relativ einfach, diesen Vektor auf die Druckerausgabe umzubiegen. Leider sind jedoch weitere Vorkehrungen notwendig. Zum einen dürfen die Steuerzeichen 0 bis 31, die mit HEXAMON als Sonderzeichen auf den Bildschirm gebracht werden, auf keinen Fall an den Drucker gegeben werden. Zum anderen gibt es Probleme mit den Grafiksonderzeichen. Als Beispiel: Das Zeichen 127 wird vom NLQ 401 nicht beachtet und würde dadurch das gesamte Druckbild durcheinanderbringen. Hier hilft nur ein Anpassungsprogramm wie LIST#8. Die Unterdrückung der Steuerzeichen geschieht über HEXAMON. Aus der Befehlsliste kennen wir bereits den Wert min. Dabei handelt es sich um die niedrigste Zeichennummer, die zugelassen wird. Zweckmäßig sind dafür nur 0 (Bildschirmdarstellung, alle Zeichen zugelassen) und 32 (Druckerausgabe, Steuerzeichen unterdrückt). Für den Pageausgabebefehl muß min indirekt gesetzt werden: POKE hmon+268,min. Neben einer vom Drucker abhängigen Anpassung wie LIST#8 sind dann trotz der langen Vorrede nur wenige POKEs erforderlich: wrcharl=PEEK(&BB5E):wrcharh=PEEK(&BB5F) Drucker: POKE hmon +&268,32: POKE &BB5D, &C3: POKE &BB5E, &2B: POKE &BB5F.&BD Bildschirm: POKE hmon + &268.0: POKE &BB5D, &CF: POKE &BB5E, wrcharl:POKE &BB5F, wrcharh RAM/ROM Überblick mit Sesam Mit dem SESAM-Befehl XPEEK kann man ein 16K-ROM direkt in den Bildschirmspeicher übertragen und damit sichtbar machen: |XPEEK,0,&FE,&C000,&4000 (Betriebssystem-ROM) |
|
|