CODING ★ Interrupt-Kursus für den CPC|CPC Amstrad International) ★

Interrupt-Kursus für den 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 ★ 

Einen Moment mal!

In der heutigen Folge, die auch den Abschluß unseres Kursus bildet, besprechen wir die weitergehende Programmierung der Event-Befehle und deren Anwendung. Dabei gehen wir auf wichtige Systemadressen des CPC ein.

Bevor wir auf die Programmierung des Eventblocks eingehen, wollen wir einige Einsprungadressen auflisten, ohne die eine Interrupt-Programmierung nicht möglich wäre.

CALL &BCD7 Mit diesem Call wird ein Interruptblock eines Frame Flybacks ab der Adresse im Register HL eingerichtet und der Interrupt gestartet. Die Adresse des Unterprogramms stchl dabei im Register DE, in B wird das Multifunktionsregister übergeben und in C die ROM-/RAM-Auswahl.

CALL &BCDA Dieser Call startet einen Frame-Fly-back-Interrupt, dessen Blockanfangsadresse im Register HL steht. Dabei ist zu beachten, daß dieser Block vorher schon auf andere Weise eingerichtet worden sein muß. Es genügt aber auch schon, wenn nur der allgemeine Teil des Eventblocks vorhanden ist.

CALL &BCDD Mit diesem Call wird ein Frame-Fly-Interrupt gelöscht, wobei die Anfangsadresse seines Blocks in HL angegeben wird. Der Block selbst bleibt durch diese Operation zwar erhalten, wird aber nicht mehr angesprungen. Er kann jederzeit wieder durch den Call &BCDA aktiven werden.

CALL &BCE0 Dieser Call hängt einen Fast-Ticker-Interrupt ein und startet ihn. Er ist die Entsprechung des Frame-Fly-Calls &BCD7.

CALL &BCE3 Mit diesem Interrupt startet ein schon eingerichteter Fast-Ticker-Interrupt, entsprechend Call &BCDA beim Frame Flybaek.

CALL &BCE6 Durch diesen Interrupt wird ein Fast-Ticker-Interrupt ausgeschaltet. Die Einzelheiten entsprechen dem Frame Flyback; einzige Ausnahme ist der Call zur Reaktivierung, der beim Fast Ticker Call &BCE3 ist.

CALL &BCE9 Dieser Einsprung ist nun im Vergleich zu den oberen grundverschieden. Während die Einrichteeinsprünge bei Frame Flyback und Fast Ticker jeweils den gesamten Interruptblock einrichten, wird bei diesem Call nur der spezielle Teil des Eventblocks initialisiert. Für die Praxis bedeutet das, daß der allgemeine Teil schon vorher eingerichtet werden muß (siehe dazu die übernächste Einsprungsadresse). HL enthält bei dieser Routine den Anfang des speziellen Teils. DE gibt an, nach welcher Zeit (in 1/50 Sekunden) derln-terrupt zum ersten Mal aufgerufen wird. BC schließlich gibt das Intervall an, in dem der Interrupt danach aufgerufen wird.

CALL &BCEC Mit diesem Call wird ein Ticker-Interrupt ausgehängt.

CALL &BCEF Dieser Call richtet nun den allgemeinen Teil des Eventblocks ein. Dazu wird in HL die Anfangsadresse des allgemeinen Teils angegeben, das heißt, es muß die Anzahl der speziellen Bytes zu der Anfangsadresse des gesamten Blocks addiert werden. DE gibt wieder die Adresse der Unterprogrammroutine an, B das Multifunktionsregister und C den ROM-Select. Dieser Einsprung startet natürlich keinen Interrupt.

CALL &BCF2 Dieser Call kickt einen in HL durch die Anfangsadresse gegebenen Interruptblock einmal.

CALL &BCF5 Dieser Call löscht die synchrone Pen-ding Queue.

CALL &BCF8 Mit diesem Call wird ein bestimmter Block aus der Pending Queue gelöscht (Adresse in HL).

CALL &BCFB Der Call gibt die Adressen der synchronen Events in Reihenfolge der Priorität an.

CALL &BCFE Mit diesem Call wird ein Interruptunterprogramm einmal aufgerulen, dazu steht in HL die Adresse des gemeinsamen Teils des entsprechenden Blocks.

CALL &BD01 Dieser Call schließt die Ausführung des Calls &BCFE ab, HL ist dabei gleich. Das Zählregister im Eventblock wird um eins erniedrigt.

CALL &BD04/CALL &BD07 Diese beiden Calls entsprechen den BASIC-Befehlen DI und EI.

CALL &BD0A Durch disen Call wird die Interrupt-Ausführung unterbrochen. Der Eventblock wird zwar noch angesprungen, jedoch nicht mehr gekickt. Wenn der Zähler wieder auf null gesetzt wird, wird der Block wieder bedingungslos gekickt.

Keine Einsprungadresse im eigentlichen Sinne, aber eine dennoch nützliche Adresse ist &B939 (beim CPC-464) oder &B941 (beim CPC-664/6128). Sie wird von allen Hardware-Interrupts angesprungen und ermöglicht es somit, alle Interrupts zu sperren. Dazu muß man nur nach &B939 beziehungsweise &B941 ein &c9 (RET) zu poken. So kann man eine geringe, unter Umständen aber recht hilfreiche Geschwindigkeitserhöhung erreichen. Um die Interrupts wieder anlaufen zu lassen, muß man nur die Adresse mit ihrem ursprünglichen Wert wieder laden. An dieser Stelle noch ein Hinweis: Auch von OUT-Befehlen kann ein Interrupt beeinflußt werden. Die OUTs &BC00,5 und &BD00,20 beeinflussen beispielsweise nach ihrer Eingabe im BASIC den Bildrücklauf und auch die Ausführungsgeschwindigkeit von Interrupts.

Event block-Programmierung

Nun kommen wir endlich zur praktischen Programmierung des Eventblocks. Dazu zeigen wir anhand eines Assemblerlistings die einfachste Methode, einen Ticker-Interrupt einzurichten:

ORG &4000:
Progranmaresse
LD hl,&5006:
Adresse des gemeinsamen Teils (die vorigen 6 Bytes beim Ticker (beziehungsweise 2 bei den anderen Interrupts) müssen frei ge lassen werden
LD de,&4500:
Adresse des Unterprogramms
LD b, &a6:
Multifunktionsregister setzen
LD c,&00:
ROM-Auswahl setzen
CALL &bcef:
gemeinsamen Teil einrichten
LD de,&0010:
1. Aufruf festlegen
LD bc,&0022:
Aufrufsintervall setzen
LD hl,&5000:
Anfang des gesamten Blocks im Speicher
CALL &bce9:
Einrichten des speziellen Teils und Starten des Interrupts (Ticker)
RET:
Return

Bei diesem Einrichten des Eventblocks muß jetzt vor allem noch die Interrupt-Routine ab der angegebenen Adresse (hier hexadezimal &4500) in den Speicher gebracht werden, die vom Computer ausgeführt werden soll. Zur Eventblock-Programmierung sind noch folgende Dinge zu erwähnen: Zum einen ist es wichtig zu beachten, daß, um den gemeinsamen Teil einzurichten (CALL &bcef), die anzugebende Adresse sich aus Anfangsadresse des gesamten Blocks und der Anzahl der vom speziellen Teil benötigten Bytes zusammensetzt, also entweder zwei oder sechs Bytes noch hinzugezählt werden. Zum anderen ist es ratsam. ein und denselben Block nicht mehrmals nacheinander aufzurufen, ohne ihn vorher auszuschalten, da es sonst zu Fehlverkettungen kommen kann.

Praxisanwendung in Assembler

Damit alle vorherigen Ausführungen nicht bloß als theoretisches Gerüst im Raum stehenbleiben, werden wir im folgenden für jeden der Maschinensprache-Interrupts eine praktische Anwendung als Beispiel und Hilfe für eigene Programme vorstellen.

Frame Flyback

Das Beispielprogramm bewegt einen rechteckigen Sprite am oberen Bildschirmrand. Eine richtige Figur haben wir aus Platzgründen vernachlässigt, da es bei den Beispielen nur um das Prinzip geht.

Der Sprite wird jede 1/50 Sekunde um ein Byte versetzt dargestellt. Diese Darstellungsform liegt genau synchronisiert zum Bildrücklauf des Monitors, deshalb ist sie völlig flimmerfrei. Wenn die Sprites aber größer werden, können sie, wenn sie sich im oberen Bildschirmbereich befinden, unsauber und verzogen wirken, in Teilen sogar verschwinden, und das,-obwohl die Zeit, die zum Hinmalen benötigt wird, unter der Bildrücklauffrequenz liegt. Zum eigenen Ausprobieren muß die Adresse &4070 mit dem Wert 17 geladen werden, viel größere Werte sollten nicht gewählt werden, da sonst der Sprite nicht mehr im Bildrücklauf bewegt werden kann. Oben angeführtes Phänomen ist damit zu erklären, daß der Elektronenstrahl den Inhalt des Bildschirmspeichers schneller darstellt, als dieser durch Poken verändert werden kann. So kommt es dazu, daß der Elektronenstrahl das Umladen des Speichers überholt. So wird ein Teil des neu umgeladenen Sprites, der andere Teil des noch nicht umgeladenen dargestellt. Wird der Bildschirm nun aber durch das Bewegen des Cursors “hardwaremäßig“ gescrollt und so der Sprite nach unten verschoben, ist wieder genug Zeit vorhanden, um die Informationen des Sprites vor dem Elektronenstrahl vollständig im Bildschirmspeicher zu verschieben.

Fast Ticker

Im folgenden zeigen wir Ihnen die Anwendung des sehr schnellen Fast-Ticker-Interrupts. Dieser ist mit 1/300 Sekunde Aufrufzeit sechsmal schneller als der Bildrücklauf. Dieses macht man sich zunutze, um während des Bildrücklaufs Änderungen des Modus oder der zur Verfügung stehenden Farben vorzunehmen.

Den Farben (Inks) von 0 bis 26 sind folgende Werte (hexadezimal) in selbiger Reihenfolge für die Out-Befehle zugeordnet:

54,44,55.5c,58,5d,4c,45,4d,56,46, 57,5e,40,5f,4e,47,4f,52,42,53,5a,59, 5b, 4a,43,4B

Also, zum Beispiel aus Ink 6 wird der Wert &4c. Auf ähnliche Weise ist auch ein Mode-Splitting zu realisieren. Dazu muß man nur das vorherige Unterprogramm “SPLIT“ durch die gleich folgende Version ersetzen. Das Unterprogramm “SETZEN“ sowie die zwei Farbtabellen sind dann nicht mehr nötig.

Bei diesem Beispiel ist der Bildschirm zweigeteilt; theoretisch ist es aber sogar möglich, bis zu sechs Modus- beziehungsweise Farbzonen einzurichten. In der Praxis ergibt sich dabei das Problem, daß bei sechs Teilbereichen zu viel Zeit verbraucht wird. So kann kaum noch ein vernünftiges Programm parallel laufen. Besonders wichtig ist es, Splitprogramme während Aktionen, die die Interrupts beeinflussen, zum Beispiel Diskettenoperationen, abzuschalten, da sonst Koordinationsprobleme mit dem Bildrücklauf auftreten können.

Ticker

Das Beispielprogramm, mit dem wir diese Serie beenden wollen, ist eine in-terruptgesteuerte Uhr, die parallel zur BASIC-Programmen läuft.

Diese Uhr ist nur als eine Art Grundgerüst anzusehen und muß deshalb den jeweiligen Gegebenheiten noch angepaßt werden. Wir hoffen, wir haben mit dieser Serie dem User die grundlegende Struktur von Interrupts nähergebracht.

Außerdem hoffen wir, daß wir Ihnen für die eigene Anwendung einige Hilfestellungen und Anregungen gegeben haben.

Jens Buri & Matthias Wittern/cd , CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1990
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: ???
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1990
★ AUTHORS: Jens Buri , Matthias Wittern

 

Page précédente : Interrupt-Kursus für den CPC v2
★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» CPC-Interruptkurs  v3    (CPC  Amstrad  International)    LISTING    GERMANDATE: 2020-05-27
DL: 126
TYPE: PDF
SiZE: 929Ko
NOTE: 4 pages/PDFlib v1.6

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

Lien(s):
» Coding Src's » Pointers - Windows System
» Coding » Clefs1 14 - Logiciel Interne Generalites
» Coding » Clefs1 20 Logiciel Interne Table Sonore
» Coding » Clefs2 09 - Logiciel Interne Table Var Systeme
» Coding » 2/1 - Architecture interne
» Coding » Fdc - 08 - Test Interrupt (SOS Programmeurs)
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 111 millisecondes et consultée 593 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.