★ APPLICATIONS ★ DIVERS ★ Eine Basic-Erweiterung für den Schneider CPC 464 ★![]() |
| RSX Machine Kit (Computing Programming Using) | Applications Divers |
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,30Sie 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,WertHier 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, VariableAufgrund 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%=0Hier 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. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ROM-Status | &0000-&3FFF | &C000-&FFFF |
| 252 | Betriebssystem-ROM | Basic-ROM |
| 253 | RAM-Bereich | Basic-ROM |
| 254 | Betriebssystem-ROM | RAM-Bereich |
| 255 | RAM-Bereich | RAM-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:
vollständige Grafikbildschirme gleichzeitig im Speicher untergebracht werden:
- |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:
- |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 | |||
| Register | Kurzbezeichnung- | Normwert | Funktion |
| &00 | Horizontal Total | 63 | 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. |
| &01 | Horiz Displayed | 40 | Zahl der tatsächlich angezeigten Zeichen pro Bildschirmzeile. |
| &02 | Horiz Sync Position | 46 | Zeitpunkt des horizontalen Sync-Impul-es. Durch Veränderung des Wertes Links/Rechts-Scrolling möglich. |
| &03 | VSync/HSync Width | 140 | Breite des Vert-Sync und Horiz-Sync-Impulses. |
| &04 | Vertical Total | 38 | Zahl der Zeilen auf dem Monitor; vgl. Erläuterungen zu R0 und R1. |
| &05 | Vert Total Adjust | 0 | Genauer Abgleich der Bildposition auf dem Monitor; durch Veränderung des Registerwerts ist ein Softscrolling nach oben oder unten möglich. |
| &06 | Vertical Displayed | 25 | Zahl der tatsächlich angezeigten Zeilen auf dem Bildschirm. Anwendungsbeispiel im Text. |
| &07 | Vert Sync Position | 30 | Zeitpunkt des vertikalen Sync-Impulses. Durch Veränderung des Wertes ist eine Bildverschiebung nach unten oder oben möglich. |
| &08 | Interlace & Skew | 0 | Die Bits 0 und 1 bestimmen, ob die Bildschirmdarstellung mit Interlace und Skew erfolgen soll. |
| &09 | Max Raster Address | 7 | Anzahl der Rasterzeilen der Zeichen auf dem Bildschirm. |
| &0A | Cursor Start Raster | - | Rasterzeile des Cursors und dessen Darstellungsmodus (blinkend, fest, Blinkgeschwindigkeit) |
| &0B | Cursor End Raster | - | Rasterzeile, auf der der Cursor endet. |
| &0C | Start Address High | - | Beginn des Bildschirmspeichers (Low). |
| &0D | Start Address Low | - | Beginn des Bildschirmspeichers (Low). |
| &0E | Cursor High | - | High-Byte der Cursor position. |
| &0F | Cursor 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 | Kurzbezeichnung | Funktion |
| R00 | Period A Low | Feinabstimmung der Periodendauer für Kanal A |
| R01 | Period A High | Grobabstimmung der Periodendauer für Kanal A |
| R02 | Period B Low | Feinabstimmung der Periodendauer für Kanal B |
| R03 | Period B High | Grobabstimmung der Periodendauer für Kanal B |
| R04 | Period C Low | Feinabstimmung der Periodendauer für Kanal C |
| R05 | Period C High | Grobabstimmung der Periodendauer für Kanal C |
| R06 | Noise Period | Periodendauer des Geräuschgenerators |
| R07 | Multi Fctn | Mehere Funktionen: - Kanal A, B und C einschalten |
| R08 | Volume A | Lautstärke von Kanal A |
| R09 | Volume B | Lautstärke von Kanal B |
| R10 | Volume C | Lautstärke von Kanal C |
| R11 | Env Period Low | Hüllkurven-Periodendauer |
| R12 | Env Period High | Hüllkurven-Periodendauer (Highbyte) |
| R13 | Env Shape | Hüllkurvenform |
| ![]() |
|