CODING ★ Der Gläsernen CPC ★

Gläsernen CPC (CPC Amstrad International)
★ 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 ★ 

In den bisherigen Folgen des "Gläsernen CPC” haben wir uns intensiv damit beschäftigt, die inneren Strukturen des CPC 464 zu durchleuchten, und dabei einige Möglichkeiten entdeckt, die ohnehin schon sehr umfangreichen Fähigkeiten dieses Computers noch beträchtlich zu erweitern.

Dabei war uns. insbesondere das Betriebssystem behilflich, ein Maschinenprogramm, das bereits fest im CPC eingebaut ist und etwa 16 KByte ROM-Speicherplatz beansprucht. Es stellt alle notwendigen Kontakte zur Peripherie her (Bildschirm. Tastatur, Kassettenrekorder usw.) und erledigt zahlreiche interne Verwaltungsauf-gaben. Besonders für den Assembler-Programmierer stellt es deshalb eine nahezu unerschöpfliche Quelle nützlicher Unterprogramme dar. die ihm eine Menge Arbeit abnehmen - ohne eine genaue Kenntnis des Betriebssystems ist eine effektive Programmierung kaum denkbar.

Neben dem Betriebssystem enthält der CPC aber noch weitere 16 KByte ROM. die vom Basicinterpreter belegt werden. Es stellt sich natürlich die Frage, ob hier nicht ebenfalls interessante oder hilfreiche Routinen zu finden sind. Und damit wären wir beim Thema dieser Folge angelangt: Wir werden erforschen, was dieser bisher recht unbekannte Bereich des CPC 464 so alles hergibt.

Um die Erwartungen nicht zu hoch zu schrauben, sollen aber zunächst einige Probleme erwähnt werden, die einem unvermeidlich begegnen, wenn man in dieses sehr komplexe und umfangreiche Programm einsteigt.

Während das vorbildlich strukturierte Betriebssystem des CPC über "genormte” Einsprungstellen mit genau definierten Übergabeparametern verfügt, ist der Interpreter für eine externe Benutzung nicht im geringsten vorbereitet. Dem neugierigen Programmierer bleibt es deshalb nicht erspart, sich ein möglichst gut kommentiertes ROM-Listing vorzunehmen und selber Z80-Prozessor zu spielen, bis er genau weiß, an welcher Stelle welche Informationen in welchen Registern zu finden sind.

Dabei stellt sich dann schnell heraus, daß der Interpreter im Gegensatz zum Betriebssystem schon ein sehr spezialisiertes Programm ist. Es hat eben hauptsächlich die Aufgabe. Basic-Befehle zu identifizieren und sie mit Hilfe entsprechender Maschinencode-Sequenzen auszuführen. die wiederum - wie sollte es auch anders sein - zu einem großen Teil vom Betriebssystem zur Verfügung gestellt werden.

Deshalb findet man hier kaum Material. das allgemein anwendbar ist -vielleicht ein paar Routinen zur Behandlung von Tabellen, aber das wär's dann schon im wesentlichen. Ganz anders sieht die Angelegenheit jedoch aus. wenn man noch zusätzliche oder erweiterte Basic-Befehle einbauen möchte. Für derartige Projekte stellt der Interpreter natürlich eine Menge wichtiger Unterprogramme zur Verfügung- man muß nurwissen, wo sie sich befinden und was sie genau bewirken.

Doch um es gleich klarzustellen: Wir sprechen hier nicht von den üblichen RSX-Kommandos. So bequem diese Methode der Befehlserweiterung auch sein mag, sie bringt doch einige unschöne Einschränkungen mit sich. Abgesehen von dem lästigen Strich vor dem Befehlswort können String-und Fließkommavariablen nur recht umständlich mit Hilfe des Variablen-poinlers (der "Klammeraffenfunktion") behandelt werden, und eine Realisierung von Basic-Funktionen. wie vergleichsweise SIN oder MID$. ist überhaupt nicht möglich.

Deshalb möchten wir Ihnen in dieser Folge die notwendige Basis-Software nebst einigen Hintergrundinformationen und Beispielen liefern, um "echte" Basicerweiterungen zu schreiben. und ehrlich gesagt: Wir sind schon sehr gespannt darauf, was die vielen talentierten Assembler-Programmierer unter unseren Lesern daraus machen werden. Wäre es nicht z.B. eine reizvolle Aufgabe, das Basic des CPC so umzustricken, daß für einen anderen Computer geschriebene Programme ohne große Änderungen direkt übernommen werden können?

Doch bevor wir dazu kommen, wie so etwas im Prinzip möglich ist, werden wir etwas Grundlagenforschung betreiben. Was geht zum Beispiel im CPC vor. wenn man die Zeile

PRINT PEEK(&ACA4)/code]

eingibt und dann mit ENTER abschließt?

&ACA4 ist die Startadresse eines Eingabepuffers, in dem sich der CPC 464 zunächst einmal alle Zeichen merkt, die Sie über die Tastatur eingeben. Das obige Kommando wird also den ASC'II-Code 80 für den Buchstaben "P” (bzw. 112 für "p") zurückgcben, und

PRINT PEEK(&ACA5)

ergibt dann entsprechend den Code für das "R” von PRINT. Den Rest können Sie sich denken: Hier steht die Zeile im Klartext.

Die eigentliche Arbeit beginnt für den Interpreter erst, nachdem Sie ENTER gedrückt haben. Die Zeile wird daraufhin in einen zweiten Puffer ab Adresse &0040 übertragen und dabei in den Interpretercode umgewandelt. der eine besonders schnelle und effektive Programmausführung ermöglicht. Schauen wir uns einmal an, wie das aussieht:

PRINT HEX$(PEEK(&0040))

ergibt "BF”, und dieser hexadezimale Code ist in der Tat alles, was von unserem PRINT-Befehl noch übrig geblieben ist. Der CPC hat nämlich inzwischen jedes Wort der Eingabezeile mit Hilfe einer umfangreichen Tabelle überprüft und getestet, ob es sich um einen gültigen Befehl handelt. Ist das wie bei PRINT der Fall, so wird er durch ein einziges Kennbyte ersetzt, das sogenannte "Token".

Und jetzt weiter: An der nächsten Adresse (&0041) finden wir den Wert &20. den ASC'II-Code für das Leerzeichen nach dem PRINT-Befehl. und dann &FF - sollte das etwa das Token für HEXS sein? Nein, leider falsch geraten! Dieser Code besagt nur. daß jetzt eine Basic-Funktion folgt, und das eigentliche Kennbyte für HEXS. nämlich &73, befindet sich eine Stelle weiter an der Adresse &0043.

Damit haben wir schon einige wichtige Informationen gewonnen, die hier noch durch ein paar Fakten ergänzt werden sollen: Alle Kommandos und Operatoren erscheinen im Interpretercode als ein Kennbyte im Bereich zwischen &80 und &FE (dezimal 128 - 254). Funktionen dagegen erhalten einen Wert zwischen &00 und &79 (dezimal 0- 127). Um sie bei der Ausführung von normalen ASCII-Zeichen, Zahlen und Variablen zu unterscheiden, werden sie
zusätzlich noch durch den Code &FF markiert, wie wir bereits gesehen haben.

Verfolgen wir aber den Weg unserer Eingabezeile noch ein Stück weiter: Was passiert nach der Umwandlung in den Interpretercode? Das hängt davon ab, ob Sie eine Zeile mit oder ohne Zeilennummer eingegeben haben. Findet der CPC keine Zahl am Anfang, so wird die Zeile auf der Stelle ausgeführt, und das geht so: Die Anfangsadresse des Puffers wird einer zentralen Routine des Interpreters als Programmzeiger übergeben, der "Interpreterschleife", die nun die codierten Befehle nacheinander liest, aus den Kennbytes die Adressen der zuständigen Unterprogramme berechnet und sie aufruft. Der Programmzeiger wandert dabei Byte für Byte durch die Zeile, bis er auf eine 0 als Endmarkierung trifft, und dann geht's zurück in den Direktmodus: Ready!

Wenn Sie jedoch eine Zeile mit Zeilennummer eingeben, so geschieht etwas ganz anderes: Der Inhalt des Puffers ab Adresse &0040 wird in den Programmspeicher kopiert und an der richtigen Stelle einsortiert. Löschen Sie jetzt bitte den Speicher mit NEW und geben Sie dann

10 PRINT

ein. damit wir mit der folgenden Direkteingabe untersuchen können, wie das aussieht:

FOR adr=&170 TO & 175:PRINT HEX$ (PEEK(adr),2);” ”;:NEXT

wobei &170 die Anfangsadresse des Speicherbereichs für Basicprogramme ist. Aufdem Bildschirm sollte jetzt folgende Anzeige erscheinen:

06 00 0A 00 BF 00

Zu Beginn steht hierein 2-Byte-Wert, der die Länge der Zeile angibt, also insgesamt 6 Bytes. Beachten Sie bitte, daß wie üblich zuerst das Lowbyte und dann das Highbyte der Zahl angegeben wird! Danach folgt dann ein weiterer Wert, der entsprechend die Zeilennummer enthält (&0A=10), und danach das inzwischen bekannte Token &BF für PRINT. Den Abschluß bildet die bereits erwähnte Endmarkierung, ein Nullbyte.

Und jetzt ein kleiner Versuch: Ersetzen wir doch einmal das PRINT-Token durch einen anderen Wert, zum Beispiel &8A:

POKE &174,&8A

Und wenn Sie jetzt die Zeile LISTen, steht dort wahrhaftig nicht mehr 10 PRINT, sondern 10 CLS, womit Sie also wissen, welches Token zu diesem Befehl gehört.

Übrigens gibt es beim CPC 464 ein paar unbenutzte Kennbytes, die keinem bestimmten Befehl zugeordnet sind. Eines von dieser Sorte ist der Code &E0, der für unsere Befehlserweiterung noch eine sehr wichtige Rolle spielen wird. Doch zunächst werden wir den armen CPC damit in eine teuflische Zwickmühle bringen: Den unendlichen Syntax-Error! Setzen wir also den Code in die Programmzeile ein:

POKE &174,&E0

Wenn Sie jetzt das Programm mit RUN starten, passiert folgendes: Der CPC findet das Token &E0. aber keinen dazu passenden Befehl, den er ausführen könnte. Aha, denkt ersieh, das kann nur ein Syntax-Error sein! Also wird das Programm abgebrochen, die Meldung ausgegeben, und dann soll wie üblich die fehlerhafte Zeile angezeigt werden. Doch halt -schon wieder ein Problem! Leider gibt es für &E0 kein Befehlswort, das man anzeigen könnte, und in seiner Verzweiflung fällt dem Computer nichts Besseres ein, als nochmals einen Syntax-Error auszugeben, womit sich der Teufelskreis schließt. Die einzige Möglichkeit, dieses Spiel zu beenden, ist ein totaler Reset mit CTRL-SHIFT-ESC.

Nach diesem famosen Absturz können wir uns jetzt ein paar Gedanken darum machen, wie eine Befehlserweiterung realisiert wird. Wie unsere Experimente gezeigt haben, gibt es also drei kritische Stellen, an denen ein Eingriff vorgenommen werden muß:

  • Bei der Umwandlung in den Interpretercode
  • Bei der Ausführung der Befehle
  • Beim Listen der Basiczeilen

Möglich werden die Eingriffe dadurch, daß der Interpreter an einigen wichtigen Stellen Unterprogramme im RAM aufruft, die normalerweise nur aus einem RET-Befehl bestehen, also keine Auswirkungen haben. Solche "Patchs” werden gerne eingebaut, um noch nachträglich Anpassungen oder Korrekturen vornehmen zu können, ohne daß gleich das ganze Programm umgeschrieben werden muß.

Bei der Entwicklung des CPC 464 wurde diese Möglichkeit wohl vorgesehen, um den Anwender mit einer Software-Korrektur trösten zu können, falls sich nach der Markteinführung noch ein Fehler hcrausgestellt hätte - siehe "CHAIN MERGE" beim Floppy-Laufwerk. Beim CPC 664 und 6128 dagegen waren sich die Programmierer ihrer Sache schon wesentlich sicherer: Die "Dummy-Returns” wurden ersatzlos gestrichen, so daß wir unsere Ausführungen leider auf den CPC 464 beschränken müssen.

Wie diese Patchs nun konkret ausgenutzt werden, können Sie dem Assemblerprogramm "XBASIC-Basis-routinen” entnehmen. Falls Sie über einen Assembler verfügen und damit umgehen können, sollten Sie jetzt auf der Stelle das Listing abtippen, denn wir kommen sofort zur Sache! Zunächst werden wir Ihnen die XBASIC-Routinen im einzelnen vorstellen und dabei gleich demonstrieren, wie ein neuer Befehl eingebunden wird. Er soll "BEEP” heißen und einfach nur einen kurzen Kontroll-ton erzeugen, genau wie PRINT CHR$(7). (Siehe Listing: Basicrou-tinen.)

Beginnen wir also mit der ersten Routine, die mit dem Label INIT gekennzeichnet ist. Dieses Programm muß einmalig aufgerufen werden, um alle neuen Befehle und Funktionen zu initialisieren. Wenn Sie die ORG-Anweisung nicht geändert haben, geschieht das einfach von Basic aus mit CALL &A000. Damit werden die eben erwähnten "Dummy-Returns” durch Sprungbefehle ersetzt und die XBASIC-Routinen in den Interpreter eingehängt.

Die INCODE-Routine wird nach der Initialisierung jedesmal vom Interpreter aufgerufen, wenn er versucht, ein Wort aus der Eingabezeile als gültigen Befehl zu identifizieren. Das ist natürlich eine gute Gelegenheit, ihn zunächst eine eigene Tabelle mit neuen Befehlsworten durchsuchen zu lassen. Das Label BEFTAB. das die Startadresse dieser Tabelle markiert, finden Sie am Ende des Listings. Damit der Interpreter das neue BEEP-Kommando akzeptiert, müssen wir hier folgende Eintragung vornehmen:

BEFTAB DM ”BEE”
DB &D0 ;”P”+&80
DB &80 ;Token
DB 0 ;Ende der Tabelle

Das Wort wird also in Großbuchstaben angegeben, wobei Sic im Unterschied zu den RSX-Erweiterungen auch Blanks benutzen dürfen. Der letzte Buchstabe muß durch ein gesetztes Bit 7 gekennzeichnet werden, indem zu dem ASCII-Code der Wert &80 (dezimal 128) addiert wird. Danach folgt direkt das Befehlstoken, wobei Sie Werte von &80 an aufwärts bis &FF benutzen können. Insgesamt sind also 128 neue Kommandos möglich - doch halt! Hatten wir nicht vorhin gesagt, daß diese Codes bereits mit den normalen Basic-Befehlen belegt sind? Sehr richtig, doch wir haben uns hier einen besonderen Trick einfallen lassen, da der CPC 464 sonst nur sieben freie Tokens zur Verfügung stellen würde. Die INCODE-Routine sorgt dafür, daß jedes neue Kommando mit dem bereits bekannten Super-Syntax-Error-Token &E0 codiert wird und zusätzlich mit dem Wert, den Sie in der Tabelle angeben. Das reicht dann zur Unterscheidung. Und bitte nicht vergessen: Damit sich der Interpreter nicht totsucht, muß das Ende der Tabelle auf jeden Fall durch ein Nullbyte markiert werden!

Die LIST-Routine wird angesprungen, wenn beim Listen einer Zeile ein fragwürdiger Code wie &E0 auftaucht. Den normalerweise fälligen Syntax-Error fangen wir so ab und geben dem Interpreter dafür Gelegenheit. das passende Wort in der eben beschriebenen Befehlstabelle zu suchen. Eine zusätzliche Eintragung ist hier also nicht nötig.

Die KOMMAN-Routine ist dafür zuständig, den Error abzufangen, den unser Code &E0 in der Interpreterschleife auslöst. Hier kommt eine zweite Tabelle ins Spiel, in der die Adressen der Routinen eingetragen werden, die die neuen Kommandos ausführen. Der Anfang dieser Tabelle ist mit dem Label KOMADR gekennzeichnet, und unsere Eintragung lautet einfach:

KOMADR DW BEEP ;Adresse der Beep-Routine

Die erste Adresse, die Sie hier angeben. wird dem Token &80 zugeordnet. die zweite dann dem Token &81 usw. Sie sollten die Codes also auch in dieser Reihenfolge benutzen.

Die KOMMAN-Routine liest den auf &E0 folgenden Code, berechnet die dazugehörige Tabellenposition und übergibt diesen Wert wieder dem Interpreter, der sich dann die Sprungadresse holen und den Sprung ausführen kann.

Natürlich muß jetzt auch die BEEP-Routine irgendwo existieren, damit der Sprung nicht ins Leere geht. Also schreiben wir kurzerhand eine:

BEEP LD A,7 ;CHRS (7) in den Akku
JP &BB5A ;TXT OUTPUT

Und das wär's dann schon! Die Be-triebssystemroutine TXT OUTPUT führt u.a. die Steuerzeichen aus, und mehr brauchen wir hier wohl nicht zu erklären. Sehr wichtig ist allerdings noch die folgende Tatsache: Wenn eine der Erweiterungsroutinen aufgerufen wird, befindet sich im HL-Registerpaar der Basic-Programm-zeiger. Er zeigt dann auf den nächsten Ausdruck, also auf den folgenden Befehl odercin Befehlsargument, und darf auf keinen Fall überschrie-ben werden. Falls das HL-Register-paar anderweitig benutzt wird, muß der Programmzeiger solange auf den Z 80-Stack gerettet werden, sonst gibt es unweigerlich üblen Ärger!

Wenn Sie nun das Programm mit den angegebenen Ergänzungen assem-blieren und initialisieren, so sollte nach der Eingabe von BEEP ein kurzer Ton zu hören sein. Und noch ein weiterer Test: Geben Sie die Programmzeile

10 beep

ein und überprüfen Sie, ob der neue Befehl nach LIST in Großbuchstaben erscheint. Wenn ja, so wurde er vom Interpreter einwandfrei als Kommando identifiziert.

Doch jetzt genug der Beeperei. Das XBASIC-Basisprogramm enthält noch eine weitere Routine, die wir jedoch etwas später besprechen wollen - sie ermöglicht das Einbinden von neuen Basic-Funktionen. Zunächst möchten wir anhand eines etwas anspruchsvolleren Kommandos zeigen, wie die Übergabe von Befehlsargumenten vor sich geht. Hier ist das Demonstrationsobjekt:

GPEN < Grafik-Farbstift >, < Schreibmodus >

Mit diesem Befehl wird die Schreibfarbe für Grafik gewählt und zusätzlich die Verknüpfung mit der Hintergrundfarbe:

0 = normal
1 = XOR
2 = AND
3 = OR

was beim CPC 464 sonst nur mit dem Steuerzeichen CHR$ (23) möglich ist. Dieser zweite Parameter soll wahlweise sein, d.h., er muß nicht angegeben werden.

Wie gehen wir jetzt vor? Zunächst die übliche Prozedur:

1. Die Eintragung in der Befehlstabelle BEFTAB

Sie wird einfach an die Eintragung für BEEP angeschlossen; es spielt aber ansonsten keine Rolle, in welcher Reihenfolge die neuen Befehlsnamen hier stehen.

BEFTAB DM ”BEE”
DB &D0 ;”P”+&80
DB &80 ;Token DM ”GPE”
DB &CE ;”N”+&80
DB & 81 ;Token
DB 0 ;Ende der Tabelle

2. Die Eintragung in die Adressta-belle KOMADR

KOMADR DW BEEP; Adr. der Beep-Routinc DW GPEN; Adr. der Gpen-Routine

3. Die Gpen-Routine persönlich Hier müssen wir uns natürlich zunächst um das auf den Befehl folgende Argument kümmern, das ja nicht nur aus einer Zahl, sondern auch aus einem komplizierten arithmetischen Ausdruck bestehen kann. Doch glücklicherweise brauchen wir uns um die Berechnung keine Gedanken zu machen, da uns der Interpreter verschiedene Unterprogramme zur Verfügung stellt, die diese Aufgabe für uns erledigen.
Die wichtigsten Routinen und ihre Eigenschaften haben wir für Sie in einer Übersicht zusammengestellt. Da der GPEN-Befehl nur 8-Bit-Werte als Parameter benötigt, können wir die Routine (7) benutzen, die eine besonders bequeme Abgrenzung des Wertebereichs ermöglicht. In der Praxis sieht das dann so aus:

GPEN LD A,16
CALL &C1FB; Argument < 16 holen
CALL &BBDE; GRA SET PEN
CALL &DD55; folgt Komma?
RET NC ; nein, fertig
LD A,4
CALL &C1FB; Argument PUSH HL ; Programmzeiger retten
CALL &BC59; SCR ACCESS
POP HL
RET

Neu ist hier noch die Routine &DD55, die testet, ob das nächste Zeichen im Basicprogramm ein Komma ist. Falls ja, kommt sie mit gesetztem Carry-Flag zurück, anderenfalls ist es gelöscht Die Betriebssystem-Routine SCR ACCESS sorgt für die Einstellung des Grafikschreibmodus. Da sie das HL-Registerpaar verändert, muß, wie gesagt, vorher der Basic-Programmzeiger in Sicherheit gebracht werden.

Wie Sie sehen, besteht das ganze GPEN-Programm eigentlich nur aus ein paar Unterprogrammaufrufen, wobei wir wechselweise den Interpreter und das Betriebssystem benutzen. Nach dem gleichen Schema könnte man jetzt noch ein GPAPER-Kom-mando einbauen - probieren Sie es doch einmal übungshalber! Dazu ein Tip: Die zuständige Betriebssystemroutine für die Grafik-Hintergrundfarbe ist GRA SET PAPER und wird mit CALL &BBE4 aufgerufen. Ihr muß beim Einsprung die Farbstiftnummer im Akku übergeben werden; das HL-Registerpaar wird nicht verändert.

Und da wir gerade bei Grafik sind, hier noch ein zusätzlicher Hinweis: Beim Aufruf der neuen Befehle durch den Basic-Interpreter, ist im Adress-bereich &0000 - &3FFF RAM selektiert und im Bereich &C000 - &FFFF natürlich das Basic-ROM. Wenn Sie direkt auf den Bildschirmspeicher zugreifen wollen, müssen Sie vorher die richtige Speicherkonfiguration einschalten, indem Sie Ihre Routine zum Beispiel über den in der letzten Folge besprochenen RST&18-Vektor aufrufen.

Damit wollen wir jetzt das Kapitel "Basic-Kommandos” abschließen. Im nächsten Teil werden wir uns mit den Basic-Funktionen beschäftigen.

(M. Uphoff), CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1986
★ LANGUAGE:
★ LiCENCE: ???
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1986
★ AUTHOR: M. Uphoff
 

Page précédente : Gläsernen CPC : Fill-routinen
★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Der  Glaesernen  CPC    (86-05)    (CPC  Amstrad  International)    GERMANDATE: 2021-08-12
DL: 128
TYPE: PDF
SiZE: 356Ko
NOTE: 2 pages/PDFlib v1.6

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

Lien(s):
» Coding » Création Animations Graphiques par Michel Maignot
» Coding » Cours et initiation d'ANTIBUG
» Coding » Gläsernen CPC (CPC Amstrad International)
» Coding » Cours et initiation du Magazine Micro News
» Coding » Gläsernen CPC : Fill-routinen (CPC Amstrad International)
» Coding » Etude du FDC par Michel Maignot
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» 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
Page créée en 591 millisecondes et consultée 567 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.