APPLICATIONSDIVERS ★ XFORMAT, HEXAMON, RAM/ROM-ÜBERBLICK|CPC MAGAZIN)|CPC Magazin) ★

XFormat, Hexamon, RAM/ROM-Überblick (CPC Magazin)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

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:

  • |XCALL,&CA72,7,0 Fehlermeldungen ausschalten:
  • |XCALL,&CA72,7,1 Sektor lesen:
  • |XCALL,&C666,7,0.sec + off,256 * track + drive, buffer Sektor schreiben:
  • |XCALL, &C64E, 7,0, sec+off, 256 * track + drive, buffer Sektor-ID lesen:
  • |XCALL, &C55D, 7,0,0, drive Track formatieren:
  • |XCALL, &C652, 7, 0, sec + off, 256 * track + drive, for-matbuffer

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) + 9

die 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,anzahl

Zeichen 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,byte

Der hexadezimale Wert von byte wird ausgegeben.

|XCALL, hmon+&220,&FF, anzahl, 0, adr

Ab adr wird die angegebene Anzahl Bytes hexadezimal mit je einem Leerzeichen ausgegeben.

Pageausgabe

|XCALL,hmon+&240,&FF,anzahl,refadr.adr

Das 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)
|XPEEK,&C000,0,&C000,&4000 (Basic-ROM)

Der Aufbau des Bildschirmspeichers verhindert allerdings, daß wir daraus unmittelbar Informationen ablesen können. Um die ROM-Bytes in ihrer richtigen Reihenfolge darzustellen, brauchen wir das kleine Programm LOOK 1. Beim Basic-ROM sehen wir zwar noch keinen Unterschied, aber wer die Schneider-Floppy besitzt, kann im XPEEK-Befehl die 0 durch 7 ersetzen und es wird ein Streifen erkennbar, der uns zeigt, daß das Controller-ROM einen ungenutzten Bereich enthält. Ebenso kann man einen Überblick bekommen, welche RAM-Bereiche belegt sind, wenn i in Zeile 10 eine RAM-Adresse erhält.

Look 1

10 i =&C000:j=&C000
20 FOR z=0 TO 199
30 k=z MOD 8
40 IF z>0 AND k=0 THEN j=j+80
50 |XPEEK,i,0,j+k*&800,80
60 i=i+-80 70 NEXT

Look 2

1O i=384: j=&C0000
20 FOR z=O TO 15999
30 k=z MOD 8:l=<z\8> MOD 25
40 IF z>0 AND k=0 AND l=0 THEN j=j+1
50 |XPEEK , i ,&FE, j+k*&800+l *80, 1
60 i=i+1
70 NEXT

Das Programm LOOK 2 ist erheblich langsamer. Die Bytes werden in diesem Fall nicht nebeneinander, sondern untereinander geschrieben. Das hat den Vorteil, daß auch SYMBOL-Tabellen erkennbar werden. Mit den Beispielwerten wird der im Betriebssystem-ROM enthaltene Zeichensatz des CPC dargestellt. Der Startwert i=384 wurde gewählt, weil 384 Bytes des Bildschirmspeichers unsichtbar bleiben. In diesem Fall überspringen wir den ROM-An-fang, um das Ende vollständig zu sehen.

Vor jedem Programmablauf sollte ein MODE-Kom-mando gegeben werden, um den Bildschirmoffset zurückzusetzen.

Sesam-Nachlese

Zunächst gilt es, einen Fehler zu berichtigen. Im Hyperload-Programm können doch nicht ganz 4000 Baud erreicht werden. Der angegebene Wert bewirkt ca. 2700 Baud. Bis 3600 Baud sind möglich mit IXCALL,&BC68, &FF,&A,0,0,&5D. Hilfreich mag es sein, den Befehl name$ = UPPER$ (name$) einzufügen. Da die Schreibweise beim Schreiben und Lesen genau übereinstimmen muß, ist so die Gefahr von Fehlern geringer.

Dann war da noch die Rede von einer Anpassung für den CPC 664. Hier ist sie: Die letzten drei Werte in der DATA-Zeile 150 müssen geändert werden in CD,D6,B9.

Die Anwendungsbeispiele sind in der Regel nicht auf den 664 übertragbar. Nicht nur ROM-Routinen haben andere Adressen, sondern auch RAM-Tabellen haben eine veränderte Lage. Was gleich blieb, ist nur die Firmware-Einsprungtabelle. In der neuen SESAM-Anwendung HEXAMON wird z.B. ein POKE für WINDOW-Änderungen angegeben. Das ist ein typischer Wert, der beim 664 abweicht. Im übrigen läuft das Programm auf dem 664.

HEXAMON ist nebenbei auch ein Beispiel für eine weitere SESAM-Einsatz-Möglichkeit. Wer Programme in Maschinensprache selbst schreibt, hat immer einen lästigen Pflichtteil: die Übernahme der Parameter in die Z-80-Regi-ster. Diese Übergabe kann jedoch auch mit SESAM geschehen, so daß das Programm sich auf das Wesentliche beschränken kann. Bei HEXAMON können auf diese Weise auch alle Unterprogramme (wenn auch mit eigenwilliger Reihenfolge der Werte) genutzt werden. Weitere Tips und Informationen stehen in den Beschreibungen zu den jeweiligen SESAM-Programmen.

Gerhard Knapienski , CPC MAGAZIN

★ PUBLISHER: CPC Magazin
★ YEARE: 1985 , 1986
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LICENCE: LISTING
★ AUTHOR: Gerhard Knapienski

★ AMSTRAD CPC ★ DOWNLOAD ★

Je participe au site:
» Newfile(s) upload/Envoye de fichier(s)
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Basic Program Status Window
» Applications » Relo
» Applications » RSX Bexec (CPC Amstrad International)
» Applications » Varia-Blo (CPC Amstrad International)
» Applications » Gestion Souris (AM-Mag)
» Applications » Build a Monster (The Amstrad User)

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop
Page créée en 523 millisecondes et consultée 15 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.