APPLICATIONSDIVERS ★ Eine Basic-Erweiterung für den Schneider CPC 464 ★

RSX Machine Kit (Computing Programming Using)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 ★ 

Der Schneider CPC 464 besitzt einen sehr komfortablen Basic-Interpreter mit einem riesigen Befehlsumfang. Wer jedoch in Basic maschinennah programmieren will, stößt recht bald an die Grenzen des Locomotive-Basic. Das Programm MACHINE KIT erweitert das Basic um sechs neue RSX-Befehle, die z. B. den Zugriff auf alle ROM-und RAM-Bereiche, die direkte Programmierung des Video-Chips 6845 und des Soundchips AY-3-8912 und den direkten Aufruf von Maschinenroutinen überall im Speicher gestatten. Außerdem erfahren Sie in diesem Beitrag einiges über Maschinenprogrammierung auf dem CPC 464.

Das MACHINE KIT ist selbstverständlich in Maschinensprache geschrieben. Sie geben den Basic-Loader ein. Dieser initialisiert die Befehlserweiterung mit CALL init, wobei init für die gewählte Startadresse des Programms steht, im vorliegenden Quellcode für 41783.

RSX-Befehle werden, sobald sie ins Betriebssystem integriert sind, wie Basic-Befehle verwendet und sind nur am vorangehenden senkrechten Strich (1) erkenntlich. Solange das Maschinenprogramm selbst nicht gelöscht wird, bleiben sie jederzeit verfügbar -im Direktmodus genauso wie in Programmen.

Das MACHINE KIT umfaßt folgende neue Befehle: |VIDEO.REG , Register, Wert

Hiermit können Sie die Register des Video-Chips direkt ändern. Auf diese Art können Sie ein Softscrolling programmieren oder auch z. B. mehr als 80 Zeichen pro Zeile darstellen. Tabelle 1 zeigt eine komplette Liste der Register des 6845-Videochips, hier einige Beispiele dafür:

- Die Video-Register 6 und 7 sind laut Firmware-Handbuch für die Zahl der dargestellten Bildschirmzeilen (Vertical Displayed) und den Zeitpunkt des Impulses für die vertikale Synchronisation (VSync Position) zuständig. Das heißt, daß Änderungen dieses Registerwertes das Bild auf dem Monitor verschieben. Mit folgenden zwei Befehlen können Sie so z.B. das Monitorbild erheblich vergrößern:

|VIDEO.REG,7,35:|VIDEO.REG,6,30

Sie werden bemerken, daß die obersten Zeilen auf dem Monitor am unteren Bildschirmende wieder auftauchen. Dieses Phänomen ist ganz einfach zu erklären: Um das erweiterte Bild im Speicher unterzubringen, müßte der Bildschirmspeicher größer als die üblichen 16 KByte sein. Da der Video-Chip aber nur über 14 Adreßleitungen mit dem RAM verbunden ist, wird so ein Teil des Speichers doppelt angesprochen und erscheint mehrfach auf dem Bildschirm. Falls dieser Effekt in Programmen sogar erwünscht ist, kann man sich bei entsprechender Programmierung damit die Bildschirmfläche vergrößern.

- Auch ein Softscrolling des Bildschirms ist durch Veränderung der Registerwerte möglich. Dafür zuständig ist das Video-Register 5, das hier für eigene Zwecke „mißbraucht“ wird. Schneider bezeichnet das Register als „Vertical Total Adjust“. Das Register wird normalerweise nur beim Systemstart benötigt und erlaubt einen genauen Abgleich der Bildwiederholfrequenz. Durch Veränderung des Registerwertes läßt sich das gesamte Bild punktweise nach oben oder unten schieben. Sinnvoll ist eigentlich nur die Programmierung in Maschinensprache, für Testzwecke und Versuche reicht Basic aber allemal. Mit den folgenden Befehlen können Sie den Bildschirm vierzig mal um insgesamt eine Buchstabenposition nach oben und unten schieben lassen:

FOR I=1 TO 40:FOR j=1 TO 8:|VIDEO.REG,5,j:FOR k=1 TO 20:NEXT k,j:FOR j=7 TO 2 STEP -1 :IVIDEO.REG,5j:FOR k=1 TO 20:NEXT k,j,i

|SOUND.REG,Register,Wert

Hier ist eine direkte Programmierung ungleich schwieriger als beim Video-Chip, da die vierzehn Register des AY-3-8912-Chips von General Instruments als Multifunktions-Register ausgelegt sind. Wer den Tonchip aber direkt programmiert, kann mit einer höheren Ausführungsgeschwindigkeit rechnen als bei Benutzung der diversen ROM-Routinen, da dem Computer ja ein Großteil der Rechenarbeit abgenommen wird. Die Tabelle 2 zeigt die genaue Registerbelegung, hier nur ein einfaches Beispiel: Geben Sie zuerst SOUND 1,1000,100 ein und merken Sie sich den Ton. Zum Unterschied geben Sie dann ein: SOUND: 1,1000,100:ISOUND.-REG,7,0. Wie Sie eindeutig hören können, wird der Ton mit Rauschen unterlegt. Aus der Tabelle 2 können Sie die einzelnen Funktionen des Registers 7 ersehen. Durch Setzen aller Bits auf Null werden alle Rauschgeneratoren eingeschaltet und erzeugen den merkwürdigen Ton. Mit den Bits 6 und 7 des Registers 7 hat es eine besondere Bewandtnis: Da der Tonchip einen eingebauten Parallel-Datenport besitzt, wird im CPC 464 zur Kosten- und Bauteileinsparung ein Teil der Tastatur indirekt über den Sound-Chip abgefragt! Die beiden Bits bestimmen, ob die Ports A und B (von de nen in dieser Version des Tonchips nur der A-Port benutzt werden kann!) als Ein- oder Ausgang verwendet werden sollen. Damit sollte das Bit 6 dieses Registers immer gelöscht sein, da sonst von de Tastatur wirre Tastenkombinationen angenommen und auf den Bildschirm ausgegeben werden.

|DOKE,Adresse,Wert

Dies ist das 16-Bit-Äquivalent zum POKE-Befehl, da mit DOKE zwei Bytes bequem auf einmal gePOKEt werden können. Anwendungsfälle sind z. B. zu verändernde Sprünge in Maschinenprogrammen oder Pointer des Basic-Interpreters, z. B. wenn der Basic Programmstart verschoben werden soll, um Platz für Maschinenprogramme zu schaffen. Mit dem folgenden DOKE-Befehl kann die Baud-Rate, mit der Daten zum eingebauten Cassettenrecorder übertragen werden, auf 3600 Baud eingestellt werden. Dies ist eine der höchsten gerade noch möglichen Übertragungsgeschwindigkeiten und sollte nur bei gutem Bandmaterial verwendet werden:

|DOKE,&B8D 1,7942

|ROMPEEK,Adresse, Variable

Aufgrund der Hardware-Konzeption des CPC 464 überlagert sich im Bereich &0000 bis &3FFF das Betriebssystem-ROM mit RAM und im Bereich &C000 bis &FFFF das Basic-ROM mit dem Bild schirm-RAM. Der normale PEEK-Befehl spricht immer nur der] RAM-Bereich an, ROMs zu PEEKen ist nur in Maschinensprachen möglich. Der ROMPEEK-Befehl gestattet es nun auch, dieser] Speicherbereich zu lesen. So kann z. B. in Programmen festgestellt werden, ob der benutzte Computer ein CPC 464 oder der neue CPC 664 ist. Programme, die sehr tief auf Maschinenebene hinabsteigen, können damit schon beim Programmstart feststellen, ob sie auf dem CPC 664 aufgrund des geänderten ROMs überhaupt lauffähig sind, und notfalls eine Fehlermeldung ausgeben.

10 a%=0: b%=0: c%=0
20 |ROMPEEK,49153,@a%:|ROMPEEK,49154,@b%:|ROMPEEK,49155, @c%
30 IF a%=l and b%=0 and c%=0 THEN PRINT ”Ein CPC 464 also!”:END
40 PRINT "Sie benutzen einen CPC 664"

Hier müssen Sie noch einiges beachten: Die Übergabe von Daten an Maschinenprogramme geschieht mühelos, allerdings ist de umgekehrte Weg nicht ganz so einfach. Man kann mit dem Klam meraffen (ASCII-Code 64) statt einer Variablen deren Adresse in Basic-RAM übermitteln, die von Maschinenprogrammen über nommen wird. Durch direkte Veränderung der Werte an der Ziel adresse können auch aus Maschinenprogrammen heraus Basic-Variablen neue Werte zugewiesen werden. Daszu muß allerdings di Variable bereits definiert sein, z. B. a%=123, und es darf sich in de vorliegenden Version des Maschinencodes nur um Integervarin bien handeln. Die Integerdefinition kann entweder mit DEFIV geschehen oder durch ein Prozentzeichen nach dem Variablennamen.

|ROMDEEK,Adresse, Variable

Dieser Befehl ist eine Mischung des DEEK- und des ROMPEEK Befehls, denn hiermit können 16-Bit-Werte aus dem ROM gelesen werden. Somit läßt sich das Identifikationsprogramm, das als An Wendungsbeispiel des ROMPEEK-Befehls fungiert, verkürzen:

10 a%=0:b%=0
20 |ROMDEEK,49152,@a%:|ROMDEEK,49154,@b%
30 IF a%=&8001 AND b%=0 THEN PRINT "Ein CPC 464”:END
40 PRINT ”Ein CPC 664“:END

|XCALL, Adresse, ROM-Status, Akku, BC, DE, HL

Der normale CALL-Befehl zum Aufruf von Maschinenroutinen hat zwei Nachteile: Erstens können nur Routinen angesprungen werden, die im RAM stehen; und zweitens ist es nicht möglich, beim Aufruf bestimmte Werte für die Register zu übergeben. XCALL steht für Extended CALL und ermöglicht es, Programme irgendwo im ROM oder RAM, ja sogar im Floppy-ROM oder einem der 252 anschließbaren Erweiterungs-ROMs anzusprechen. Die Speicherkonfiguration wird durch das ROM-Status-Byte im XCALL-Befehl selektiert:

ROM-Status&0000-&3FFF&C000-&FFFF
252Betriebssystem-ROMBasic-ROM
253RAM-BereichBasic-ROM
254Betriebssystem-ROMRAM-Bereich
255RAM-BereichRAM-Bereich

Die übrigen Werte von 0 bis 251 erlauben die Adressierung der Zusatz-ROMs, die auf den Expansion Port aufgesteckt werden können. Bisher sind hier z. B. der Floppy-Controller sowie diverse Assembler als ROM-Packs erhältlich.

Mit dem XCALL-Befehl können aber auch vorgegebene Werte für die Hauptregister übergeben werden, nämlich der Akku und die Doppelregister BC, DE und HL. Somit haben Sie die Möglichkeit, z.B. in auszutestende Maschinenprogramme an mehren Stellen mit vorgegebenen Registerwerten einzuspringen. Eine weitere Einsatzmöglichkeit sind nützliche ROM-Routinen - wie z.B. folgende:

- |XCALL,&BB45,252,0,0,0,0 löst beim Drücken der ESCAPE-Taste einen Reset des Computers aus, was wohl hauptsächlich als Programmschutz Verwendung finden wird. Der Befehl ist aber nur in laufenden Programmen wirksam, da die Abfrage der ESC-Taste im Direktmodus anders funktioniert.

- |XCALL,&BC05,252,0,0,0,Diff ermöglicht es, die Basisadresse des Bildschirms in Abständen von zwei Bytes zu verschieben. Bei geschickter Anwendung kann damit ein Rechts/Links-Scrolling erreicht werden:

FOR i=0 TO 2048 STEP 2:CALL &BD19:|XCALL,&BC05, 252,0,0,0,i:NEXT i

- |XCALL,&BC08,252,Basis,0,0,0 erlaubt die Verschiebung des Bildschirmspeichers in 16KB-Blöcken; mögliche Werte sind also &00 (Startadresse &0000), &40 (Startadresse & 4000), &80 (Startadresse &8000) oder der Standardwert &C0 für den Beginn des Bildschirmspeichers an der Adresse &C000. Zur Verwendung in Basic sind aber nur die Werte &C0 und &40 zulässig, da in allen anderen Bereichen wichtige Informationen für das Betriebssystem stehen. Beschränken Sie sich also auf einen 16K-Speicher für Ihre Basic-Programme, so können maximal zwei

vollständige Grafikbildschirme gleichzeitig im Speicher untergebracht werden:

10 MEMORY &3FFF ' Speicher für Grafik reservieren
20 MODE 1:FOR i=1 TO 25.PRINT STRING$(40,42):NEXT i
30 |XCALL,&BC08,252,&40,0,0,0
40 FOR i=0 TO 640 STEP 4:MOVE i,0:DRAW i,640:NEXT i
50 ' Bildschirme dauernd austauschen
60 FOR i=1 TO 1000:IXCALL,&BC08,252,&40,0,0,0
70 |XCALL,&BC08,252,&C0,0,0,0:NEXT i:END

- |XCALL.&BD10,252,0,0,Time1,Time2: Hiermit kann der Zeitgeber, der mit der BASIC-Funktion TIME zwar gelesen, aber nicht verändert werden kann, auch auf eine bestimmte Uhrzeit eingestellt werden - Anwendungsfall: Simulation einer Echtzeituhr. Dieser Timer ist ein 4-Byte-Zähler; dies bedeutet, daß zur Datenübergabe zwei Doppelregister benötigt werden, nämlich DE und HL. Mit dem folgenden Betriebssystem-Aufruf kann der Timer zurückgesetzt werden: |XCALL,&BD10,252,0,0,0,0:PRINT TIME

- |XCALL,&B91B,255,0,BC,DE,HL verschiebt analog zum Z80-Maschinenbefehl LDIR ganze Speicherblöcke bis zu 64 KByte im Speicher-aber immer nur im RAM. Wie beim LDIR-Befehl müssen die 16-Bit-Register BC, DE und HL mit der Blocklänge, der Quell- und der Zieladresse versorgt werden. Hiermit ist eine andere Möglichkeit gegeben, Grafikbildschirme intern abzu-speichem:

10 MODE 1:MEMORY 22999:PRINT "Bildschirmdarstellung” , , , , STRING$(40,255)
20 RANDOMIZE 0
30 MOVE 0,0:FOR i=0 TO 100:DRAW RND*640,RND*300, RND*3:NEXT i
40 FOR i=0 TO 2000:NEXT i
50 |XCALL,&B91B,255,0,16383,23000,49152
60 CLS:FOR i=0 TO 2000:NEXT i
70 |XCALL,&B91 B,255,0,16383,49152,23000
80 LOCATE 1,10

- |XCALL,&B91E,255,0,BC,DE,HL entspricht dem vorhergehenden LDIR-Aufruf, allerdings wird hier der LDIR-Befehl ausgeführt - ebenfalls mit ausgeblendeten ROMs.

- |XCALL,&CA94,253,0,0, Code,0 zeigt, daß auch Routinen im Basic-ROM aufrufbar sind. Dieser Befehl gestattet beispielsweise wie der ERROR-Befehl die Ausgabe beliebiger Fehlermeldungen: |XCALL,&CA94,253,0,0,10,0 gibt einen Fehler ”ARRAY ALREADY DIMENSIONED” aus.

Tabelle 1: Die Register des Video-Chips MOTOROLA 6845 CRTC
RegisterKurzbezeichnung-NormwertFunktion
&00Horizontal Total63

Zahl der Zeichen pro vollständige Zeile; der Wert ist etwa 1.5 mal so groß wie die tatsächliche Zahl der Zeichen pro Zeile.

&01Horiz Displayed40Zahl der tatsächlich angezeigten Zeichen pro Bildschirmzeile.
&02Horiz Sync Position46Zeitpunkt des horizontalen Sync-Impul-es. Durch Veränderung des Wertes Links/Rechts-Scrolling möglich.
&03VSync/HSync Width140Breite des Vert-Sync  und Horiz-Sync-Impulses.
&04Vertical Total38Zahl der Zeilen auf dem Monitor; vgl. Erläuterungen zu R0 und R1.
&05Vert Total Adjust0Genauer Abgleich der Bildposition auf dem Monitor; durch Veränderung des Registerwerts ist ein Softscrolling nach oben oder unten möglich.
&06Vertical Displayed25

Zahl der tatsächlich angezeigten Zeilen auf dem Bildschirm. Anwendungsbeispiel im Text.

&07Vert Sync Position30Zeitpunkt des vertikalen Sync-Impulses. Durch Veränderung des Wertes ist eine Bildverschiebung nach unten oder oben möglich.
&08Interlace & Skew0

Die Bits 0 und 1 bestimmen, ob die Bildschirmdarstellung mit Interlace und Skew erfolgen soll.

&09Max Raster Address7

Anzahl der Rasterzeilen der Zeichen auf dem Bildschirm.

&0ACursor Start Raster-

Rasterzeile des Cursors und dessen Darstellungsmodus (blinkend, fest, Blinkgeschwindigkeit)

&0BCursor End Raster-Rasterzeile, auf der der Cursor endet.
&0CStart Address High-

Beginn des Bildschirmspeichers (Low).

&0DStart Address Low-Beginn des Bildschirmspeichers (Low).
&0ECursor High-High-Byte der Cursor position.
&0FCursor Low-

Low-Byte der Cursor-position.

Es gibt noch zwei weitere Register, die derzeit von der Schneider-Software nicht verwendet werden: POS STROBE und LIGHT PEN.

Tabelle 2: Die Register des Sound-Chips GENERAL INSTRUMENTS AY-3-8912
Register KurzbezeichnungFunktion
R00Period A LowFeinabstimmung der Periodendauer für Kanal A
R01Period A High

Grobabstimmung der Periodendauer für Kanal A

R02Period B Low

Feinabstimmung der Periodendauer für Kanal B

R03Period B HighGrobabstimmung der Periodendauer für Kanal B
R04Period C LowFeinabstimmung der Periodendauer für Kanal C
R05Period C HighGrobabstimmung der Periodendauer für Kanal C
R06Noise Period

Periodendauer des Geräuschgenerators

R07Multi Fctn

Mehere Funktionen:

- Kanal A, B und C einschalten
- Rauschen zu Kanal A, B und C
- Port A als Ein- oder Ausgang

R08Volume ALautstärke von Kanal A
R09Volume BLautstärke von Kanal B
R10Volume CLautstärke von Kanal C
R11Env Period LowHüllkurven-Periodendauer
R12Env Period High

Hüllkurven-Periodendauer (Highbyte)

R13Env Shape

Hüllkurvenform

Martin Kotulla , CPU

★ PUBLISHER: Computing Programming Using
★ YEAR: 1985
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ AUTHOR: Martin KOTULLA



★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-Machine  Kit    (Computing  Programming  Using)    GERMAN    LISTINGDATE: 2025-08-27
DL: 44
TYPE: PDF
SiZE: 2041Ko
NOTE: Supplied by archive.org ; 6 pages/PDFlib v1.6

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

Lien(s):
» Applications » Graphic - Draw Really Fast Circles On Your Amstrad (Popular Computing Weekly)
» Applications » RSX Circle (Schneider Aktiv)
» Applications » Jetzt geht's rund (CIRCLE Basic-Routine)
» Applications » Toolkit
» Applications » Circle (Popular Computing Weekly)
» Applications » RSX - Circle (Computing With the Amstrad)
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, 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.732-desktop/c
Page créée en 362 millisecondes et consultée 160 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.