CODINGROM ★ Die Firmware des CPC und das CP/M|Schneider Aktiv) ★

Die Firmware des CPC und das CP/M (Schneider Aktiv)
★ 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 ★ 

Wer schon mal unter CP/M mit der Floppy des CPC 464 gearbeitet hat, weiß die Leistungsfähigkeit dieses Betriebssystems gegenüber AMSDOS zu schätzen. Allerdings hört es dann auch schon auf. CP/M weiß nichts von der Supergrafik des CPC, von seinen Sound-Kanälen oder gar von seiner Echtzeitverarbeitung. Auf gut deutsch : Unter CP/M liegt das meiste des CPC einfach brach. Irgendwie lohnt es sich ja nicht, überhaupt CP/M zum Eigenbedarf einzusetzen, 39K freier Speicher unter CP/M sind eben immer noch weniger als 41K unter BASIC. Doch man kann die "alte" Firmware des CPC auch unter CP/M durchaus zum Leben erwachen lassen. Gewiefte Maschinenprogrammierer haben das auch versucht - und bekamen im Wesentlichen nur ein paar bunte Pünktchen auf den Schirm und der Rech-er hüllte sich in tiefes Schweigen, er ist abgestürzt. Ähnliche Effekte bekamen übrigens auch die Besitzer der Vortex-Floppy präsentiert, wenn sie mit Turbo-Pascal zu arbeiten versuchten. Mit der zweiten Version des Floppy-ROMs von Vortex ist dieses Problem nun behoben.

Woran liegt's ? Der Kernel des CPC verwendet die Register AF,BC\DE* und HL' für seine eigenen Belange. Daher sind diese Register für den Anwender tabu - aber wie erklärt man das Turbo ? Turbo Pascal zeichnet sich nämlich dadurch aus, daß es von den Fähigkeiten ( und Registern ) des Z80-Pro-zessors intensiven Gebrauch macht. Und damit steht es unter CP/M nicht gerade allein da. Dies wußten natürlich auch AMSTRAD und VORTEX. Mit der Floppy von Schneider läuft es ja auch einwandfrei, solange man die Firmware nicht benutzt. Im Vortex-ROM 1. Version liegt hier eben ein Fehler. Das DOSROM verbiegt nämlich den Interrupt-Vektor auf Adresse 56. Wichtig ist, an den Interrupt zu denken, weil der 300 mal pro Sekunde die Firmware aufruft und damit die Register AF,BC\DE' und HL' ( kurz : Alternativ-Register) verändert - worüber die restliche Software wenig beglückt ist. Im Schneider-ROM existiert demzufolge eine Routine, die erstmal mit den Registern herumhantiert, so daß die Firmware von der Manipulation der Alternativregister durch die Anwendersoftware nichts merkt - und im Gegenzug merkt die Anwendersoftware nichts vom Interrupt durch die Firmware. Die Vortex-Routine hat hier den Fehler - sie braucht zwar fast genauso lang wie die Schneidersche, tut aber eigentlich nichts. Wie gesagt - im neuen ROM ist dieses Problem auch behoben. Probleme tun sich erst auf, wenn der Programmierer auf die Grafik oder den Tongenerator mittels Firmware zugreifen will. Jetzt schaltet der CPC nämlich das Firmware-ROM ein - und tragischerweise steht hier auf Adresse 56 noch der Sprung in die alte Interrupt-Routine. Ändern kann man das auch nicht, da ROM bekanntlich Read Only Memory heißt. Was tun ?

Man muß vor dem Aufrufen einer Firmware-Routine die Register wieder mit den System-Werten laden, zuvor aber den Anwender-In-halt retten. Und nach Beenden der Firmware-Routine sollten die System-Werte tunlichst gerettet und durch die Anwender-Werte ersetzt werden. Das ist mühsame Rumschieberei von Daten. Aber das DOS hat diese Probleme ja wohl auch, denn wie sollte man sonst die Tastatur lesen oder ein Zeichen auf den Bildschirm bringen können? Also muß eine derartige Routine schon im DOS-ROM existieren. Im Schneider-ROM steht sie auf Adresse C168, bei Vortex auf C32B ( so unterschiedlich sind die beiden ROMs übrigens nicht ... ). Allerdings muß dies nicht immer so sein, bei Vortex ist man sich nie sicher, welche Version des ROMs gerade anwesend ist ...

Die Routine wird benutzt wie folgt: CALL C168 , DEFW Firmware. Dabei ist anzumerken, daß selbstverständlich beim Vortex-ROM diese Adresse CI68 durch C32B zu ersetzen ist !! Das DEFW Firmware bedeutet, daß hier nun die Adresse der Firmware-Routine folgen muß. Mit CALL C168 sagen wir dem System nämlich nur, daß wir eine Firmware-Routine aufrufen wollen. Danach muß noch klargemacht werden, WELCHE . Beispiel: Die Routine #BD19 ( mit Namen MC Wait Flyback ) wartet auf den Strahlrücklauf des Monitorbildes. Diese Adresse ist sogar mal im BASIC-Handbuch erwähnt ( nämlich beim CALL-Be-fehl ).

Anstelle eines CALL #BD19 in Maschinensprache muß nun die Konstruktion CALL #C168 DEFW #BD19 bzw. bei Vortex CALL #C32B DEFW #BD19 benutzt werden. Wen die Problematik der Alternativregister näher interessiert, der sei hiermit an das Firmware-Handbuch zum CPC 464 von Schneider verwiesen. Obwohl sich die Firmware-Sprungleiste des CPC großer Bekanntheit erfreut, soll es immer noch Leute geben, die sie nicht kennen. Für diese armen Zeitgenossen sei gesagt, daß diese Leiste am besten im bereits erwähnten Firmware-Handbuch dokumentiert ist. Man kann aber auch mit dem Buch "CPC 464 Inside Out" von Huslik arbeiten. Wer das "CPC 464 Intern" aus dem Hause Data Becker sein eigen nennt und sich gut in Z80 Assembler auskennt, müßte mit dem Intern auch zurechtkommen ( in diesem Buch fehlen leider die Angaben zu den Ein- und Aussprungsbedingungen der Routine).

Mit etwas Phantasie und dem nötigen Wissen um die Firmware des CPC kann man so auch unter Turbo Echtzeitverarbeitung betreiben, also z.B. die Befehle AFTER und EVERY des BASIC nachbilden. Es ist sogar möglich, mit einigem Geschick RSX-Befehle in Turbo einzubinden, z.B. BASIC (das ist der einzige Befehl des BASIC-ROMs).

An dieser Stelle noch ein Hinweis: Der CALL CI68 bzw. C32B schaltet NICHT das Firmware-ROM ( das untere ROM ) ein !! Deswegen sollte die Adresse nach dem CALL CI68 IMMER eine Adresse der Firmware-Sprung-leiste sein, da die Sprünge der Sprungtabelle das Firmware-ROM selbständig ein- und wieder ausschalten. Man darf ja nicht vergessen : Unter CP/M darf auf keinen Fall das Firmware oder das BASIC-ROM eingeschaltet sein, da in den unteren 16K das Anwenderprogramm liegt ( z.B. das compilierte Pascal ) und in den oberen 16K das Disc-ROM mit dem für CP/M lebenswichtigen BIOS ( hardwareabhängiger Systemteil ). Deshalb ist es äußerst ratsam, von direkten ROM-Einsprüngen abzusehen. Die Firmware-Sprungleiste ist doch wahrhaft umfangreich genug. Beim CPC 464 ( Achtung : NICHT bei den Systemen mit BASIC 1.1, also nicht beim CPC 664 und CPC 6128 ) liegt an Adresse BD3A der Zeileneditor des BASIC und an den Adressen BD3D..BDCA die Arithmetik-Sprungleiste. Diese Einsprünge sind nicht als solche definiert und im Firmware-Handbuch auch nicht dokumentiert, sehr wohl aber in den genannten Büchern von Huslik und Data Becker. Wer sich auf dem 464 also Arbeit sparen möchte, kann diese Adressen verwenden, nach dem gleichen Strickmuster wie die "echten" Firmware-Routinen.

Der in diesem Text beschriebene Trick mit CI68 läuft übrigens nur auf den 44K-CP/Ms ( warum wohl ? ), der CPC 6128 profitiert davon also nicht, wenn er unter CP/M 3.0 arbeitet !! Wie man dies dann bewerkstelligt, möchte ich in einer der nächsten Ausgaben von SCHNEIDER aktiv dem geneigten Leser erklären, bis dahin bleibt dem 6128-Besitzer nur : Warten oder mit CP/M 2.2 arbeiten. Oder - auch das sollte nicht vergessen werden - er wühlt sich selbst durch das BIOS des 6128. Ach so - wer dies auch beim 464/664 versucht und aus der Routine CI68 nicht schlau wird, der sehe im Firmware-Handbuch mal im Anhang XI nach. Dieser Teil ist überschrieben mit 'Wechselseitiger Regjster-Satz', was eine nicht sehr gelungene Übersetzung der 'Alternativ-Register' ist.

Das war's vorerst, viel Spaß beim creativen Arbeiten mit CP/M und CPC .

SA

★ PUBLISHER: Schneider Aktiv
★ AUTHOR: Stefan Ralf Petersen

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » L'assembleur en Douceur (5/x) : Les modes d'adressage (Micro-Mag)
» Coding » A Guide to EPROMs on the CPC (4/4)
» Coding » Cours et Initiation MICROMAG
» Coding Src's » Disassembly of AMSDOS ROM CPCplus
» Coding » Clefs2 08 - Logiciel Interne Adr Rom Disk
» Coding » Clefs1 30 Adr Reel Rom 464
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 403 millisecondes et consultée 553 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.