APPLICATIONSPROGRAMMATIONRAM ★ FUNKTIONSWEISE UND STEUERUNG ★

Vortex Speichemuteiterimaen (Schneider Aktiv)Applications Programmation
★ 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 ★ 

Nutzung der zweiten 64 kByte beim CPC 6128

Der RAM Speicher auf der vortex Speichererweiterung (dieser wird der Einfachheit halber von nun an als externer RAM bezeichnet) kann direkt in den Adressbereich der Z80 CPU des CPC's eingeblendet werden. Da die Z80 nun aber, wie die meisten 8 Bit Microprozessoren, nur einen 16 Bit breiten Adressbus besitzt und daher immer nur 64KB direkt adressieren kann, ist der insgesamt verfügbare RAM (128...576KB) nicht gleichzeitig ansprechbar, sondern immer nur in Portionen von 64KB oder weniger. Dieses Verfahren, Speicher - die denselben Adressraum belegen -kontrolliert dem Gesamtsystem zuzuschalten wird als Mapping oder Bank Switching bezeichnet und muß immer dann eingesetzt werden, wenn der Adressraum der CPU kleiner als der Gesamtspeicher ist.

Übrigens wird dieses Verfahren in allen CPC's bereits auch ohne RAM Erweiterung schon eingesetzt, belegt doch z.B. das BASIC ROM dieselben Adressen wie der Bildspeicher. Selbstverständlich können Bildspeicher und BASIC ROM nicht gleichzeitig angesprochen werden -dies würde unweigerlich zu einem Buskonflikt auf dem Datenbus führen - und so sorgt das Gate Array über zusätzliche Steuerleitungen und über einen Konfigurationsport (7Fxx) dafür, daß immer nur einer der möglichen Speicher angesprochen wird. Also hier z.B. nur Bildspeicher oder nur BASIC ROM. Wie man also leicht einsieht, reicht die bloße Adresse nicht mehr aus, um eine bestimmte Speicherzelle in einem bestimmten Speicher anzusprechen.

Der externe RAM auf der(den) vortex Karte(n) nun kann in 32KB Blöcken in den Adressraum der Z80 eingeblendet werden, (siehe Abbildung). Die Steuerung erfolgt hierbei über zwei Ports:

  • Bankselect/RAMCard Enable: Port FBBDH
  • Blockselect/Mapplng Enable: Port 7FxxH

(1) Bankselect: FBBDH

Die Speichererweiterung besitzt ein Bankselect-Register, in das nur geschrieben werden kann. Das Bankselect Register hat mit dem eigentlichen Speicherzugriff noch nichts zu tun, sondern dient lediglich zur Erweiterung des Adressraums der Z80. Es besitzt darüber hinaus noch gewisse "Schalter", um z.B. die ganze Karte erst einmal zu aktivieren.

Die einzelnen Bits des Bankselect Registers haben folgende Bedeutung:

BitBedeutung
0-2Bankselect - wähle eine der maximal 8 möglichen 64KB großen Bänke für den späteren Zugriff aus. Diese drei Bits erweiteren gewissermaßen den Z80 Adressbus auf eine virtuelle Breite von 19 Bit(—>512KB). 0—>Bank 0, 1—>Bank 1, usw.
3RAMCard-ROM Disable; 0=Enable ROM 1-Disable ROM
4RAM-Disable - eine 1 sperrt den Zugriff sowohl auf den internen als auch den externen RAM. Datenzugriff ist nur noch aus den ROM's möglich. Bevor man dieses Bit also setzt sollte man sich sicher sein, daß im Folgenden kein Zugriff auf den RAM notwendig ist, damit das Ganze kein "way of no return" wird. (Achtung: ein CALL nnnn benutzt auch den RAM—>Stack!). Dieses Steuerbit wird im Normalfall nicht benötigt und ist für spätere spezielle Anwendungen vorgesehen.
5RAMCard-RAM Disable? 0=Disable 1=Enable

Dieses Bit ist sozusagen der "Hauptschalter" der RAM Karte. Wird dieses Bit nicht gesetzt, so bleibt auch das Mapping Bit im Port 7Fxx (siehe unten) wirkungslos: Die Karte kann nicht aktiviert werden. Dieses Steuerbit wurde speziell deshalb eingebaut, da es Cassettensoftware gibt - vornehmlich Spiele -, die einen eigenen Lader besitzen und hierbei den Gate Array Port benutzen. Schaltet man vor dem Laden dieser Spiele die RAM Karte nicht ab, so führt dies in den meisten Fällen zum "Absturz".

Normalerweise benötigt man lediglich Bit 0-2 und 5 beim Arbeiten mit der Karte. Bit 3 und 4 sind für spezielle Anwendungen vorgesehen und führen bei unsachgemäßer Benutzung unweigerlich zum "Absturz" des ganzen Rechners.
(2) Blockselect/M*pping Enable: 7FxxH

Der Port 7FxxH ist in allen CPC's für die Steuerung des Gate Arrays belegt und erfüllt dabei sehr viele Aufgaben. Diese reichen von der Farbwahl über den Bildschirmmode bis zur ROM Konfiguration d.h., bereits schon das Gate Array übernimmt gewisse Funktionen des Speichermappings (siehe oben). Gewisse Bits des Ports werden vom Gate Array nicht benutzt und werden daher für die Steuerung der RAM Erweiterung eingesetzt.

BitBedeutung
6

Blockselect - wähle den unteren oder den oberen Block der momentanen selektierten Bank an. 0=unterer Block 1=oberer Block

5Mapping Enable - eine 1 blendet den durch Bit 6 und die Banknummer (Bit 0-2 Port FBBDH) angew[hlten Block in den Adressraum der Z80 ein und schaltet den entsprechenden Block des internen Speichers ab.

Interrupts und vortex RAM Erweiterung

Definition: Die Z80 CPU besitzt einen Steuereingang über den es von "außen" möglich ist, den normalen Programmablauf zu unterbrechen, um spezielle Programme durchzuführen.

Alle CPC's "leben" vom Interrupt. Diese etwas laxe Aussage soll zum Ausdruck bringen, * daß alle wesentlichen Steuerfunktionen der CPC's über den Interrupt abgewickelt werden. Einzige Interruptquelle im CPC ohne Peripherie ist das Gate Array. Dieses fordert 300 Mal in der Sekunde einen Interrupt bei der Z80 an. Würde nun das Betriebssystem alle diese Interrupts ohne weitere Wertung bedienen, so wäre der Rechner hoffnungslos "verstopft" und nur noch damit beschäftigt, Interrupts zu versorgen. Aus diesem Grunde unterstützt das Betriebssystem eine Prioritäts- und Warteschlangen- (qeues) Struktur, die den Programmdurchsatz der Maschine nur unwesentlich verringert, (siehe hierzu auch Firmware Handbuch zum CPC 464).

Die Z80 CPU kann in drei verschiedenen Interruptmodi betrieben werden: IM 0, IM 1 und IM 2. Diese unterscheiden sich durch die Art und Weise, wie die Z80 auf eine Interruptanforderung reagiert. In den CPC's wird der Interruptmode 1 (IM 1) eingesetzt - dies ist zwar die unflexibelste Interrupt Methode der Z80, setzt aber auf der anderen Seite auch nur die minimalsten Anforderungen an die Hardware voraus.

Akzeptiert die Z80 im CPC einen Interrupt, so wird das augenblicklich ablaufende Mikroprogramm unterbrochen und der Ablauf verzweigt zur Adresse 0038H. Hier steht nun ein Zeiger auf die entsprechende Routine, die den Interrupt behandeln soll.

Dieser Zeiger nun, darf nicht unkontrolliert verändert werden, da der Rechner sonst augenblicklich "abstürzt". Dies ist ein Sachverhalt, den man immer im Auge behalten muß, wenn man selbst direkt mit der Karte arbeiten möchte, d.h. wenn man nicht auf die Software (BOS und CP/M Patch) zurückgreift, die mit der Karte ausgeliefert wird. So muß man unbedingt darauf achten, daß beim An- oder Abschalten von Speicherblöcken (oben oder unten) der Interrupt abgeschaltet (DI) wird und hinterher auch nicht ins "Leere" geht.

Setzt man die Speichererweiterung als bloßen Datenspeicher ein (d.h. das Programm läuft nie im externen RAM), so ist die Steuerung der Karte relativ einfach. Möchte man jedoch den Programmspeicher erweitern, wie dies z.B. unter CP/M der Fall ist, so muß man wesentlich sorgfältiger vorgehen und immer darauf achten, daß der Interrupt immer den "richtigen Weg” geht.

BEISPIELE:

Im Folgenden finden Sie einige einfache Maschinenprogramme, die die Programmierung der vortex Speichererweiterungen verdeutlichen und hierbei allerdings lediglich den Charakter von Anregungen haben sollen. Es wird kein Anspruch auf Vollständigkeit erhoben.

1. Datenspeicherung in einem unteren Block (0000H...7FFFH):

Das Steuerprogramm und der Stack müssen (!!!) oberhalb von 7FFFh liegen, da der untere Block beim Aktivieren des externen Speichers "weggemapt" wird und somit andernfalls Programm und/oder Stack verloren gingen, was unweigerlich zum Absturz führt.

Aufgabe: Übertrage einen Datenblock aus dem Buffer BUFF in den unteren Block von Bank 0 zur Adresse 0. (Der Buffer muß natürlich auch oberhalb 8000H liegen!)

SELECT EQU OFBBDH ; BANKSELECT PORT DER KARTE
BUFF EQU 0900OH ; DATENBUFFER

ORG 8000H ; ODER EINE HÖHERE STARTADRESSE
LD (SSTACK)/SP ; SICHERE STACKPOINTER
LD SP,SSTACK ; UND RICHTE LOKALEN STACK OBERHALB 8 000H EIN

WÄHLE NUN EXTERNE BANK AN

LD BC,SELECT ; 2 BYTE PORTADRESSE FÜR BANKSELECT
LD A, 00100000B ; WÄHLE BANK 0 ENABLE RAM CARD (BIT 5=1)
OUT (C),A ; SCHREIBE IN BANKSELECT REGISTER DER KARTE

Da das BC Zweitregister immer den aktuellen Gate Array Status enthält (Besonderheit der CPC's) gestaltet sich die Aktivierung der Karte als äußerst einfach. Andererseits muß man allerdings beim Arbeiten mit den Zweitregistern der Z80 bei den CPC's eben aus diesem Grund auch etwas aufpassen, (siehe Firmwarehandbuch).

Möchte man umgekehrt die Daten wieder aus dem unteren Block von Bank 0 auslesen, so ist dies auch nicht wesentlich schwieriger, man muß jedoch immer beachten, daß bei eingeschaltetem Firmware ROM zwar immer in den RAM geschrieben, aber aus dem ROM gelesen wird. Möchte man also den RAM auslesen, so muß man zuerst den ROM abschalten. In obigem Beispiel muß man den Programmteil zwischen den beiden -.-.-. Linien beim Lesen wie folgt ersetzen:

PUSH BC ; SICHERE GATE ARRAY STATUS
SET 2 C
OUT (C),C ; SCHALTE UNTEREN ROM AB
RES 6,C ; WÄHLE UNTEREN BLOCK
SET 5,C ; SCHALTE EXTERNEN RAM EIN
OUT (C),C ;

Anmerkung: ROM abschalten und externen RAM einschalten kann im Normalfall nicht mit demselben OUT (C),C erfolgen, da die Bits 5 und 6 kein internes Gate Array Register ansprechen und deshalb u.U. das OUT vom Gate Array ignoriert werden. Also immer erst ROM und dann erst RAM Konfiguration ändern.

JETZT EXTERNER RAM EINGESCHALTET—>DATEN KÖNNEN ÜBERTRAGEN WERDEN

LD HL,0 ; POINTER ZU DEN DATEN
LD DE,BUFF ; ZIEL ADRESSE = BUFFER
LD BC,128 ; ÜBERTRAGE Z.B. 128 BYTES
LDIR  ; VERSCHIEBE BLOCK

2. Datenspeicherung in einem oberen Block (8000H...FFFFH)

Die Datenspeicherung in einem oberen Block ist der in einem unteren Block völlig analog nur müssen hier Schaltroutine und natürlich auch Stack unterhalb von 8000JH liegen. Beim Lesen der Daten aus dem Block ist auch hier wieder darauf zu achten, daß dieses Mal allerdings der obere ROM abgeschaltet ist. ( Der obere ROM wird über das 3.Bit des Gate Array Ports gesteuert. Siehe hierzu auch Firmwarehandbuch).

Wichtiger Hinweis: Selbstverständlich könnte man auch auf den Blockselect Port (=Gate Array Port 7FxxH) ausschreiben, ohne vorher auf den 2.Registersatz umzuschalten. Man muß hierbei jedoch immer im Auge behalten, daß sich hierbei der Gate Array Status ändern kann, was im Normalfall zum "Absturz" des. Systems führt. Aus demselben Grund werden in den Beispielen auch die Bit-Manipulationsbefehle der Z80 eingesetzt, weil diese die übrigen Bits des Gate Array Status unberührt lassen. Bei Bit-Manipulationen mit AND, OR, XOR etc. muß hierauf gesondert geachtet werden.

SA

★ PUBLISHER: Schneider Aktiv
★ YEAR: 1986
★ LiCENCE: LISTING
★ LANGUAGE:
★ AUTHOR(S): ???

★ AMSTRAD CPC ★ DOWNLOAD ★

Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Stack-Manipulationen mit RSX
» Applications » Fig Forth
» Applications » Dehni (Happy Computer)
» Applications » RSX Window (CPC Magazin)
» Applications » Basic Compiler (CPC Magazin)
» Applications » CHARLEYTRONIC of System-D Source Code Collection

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