Das Schneider CPC Systembuch

Die Firmware des Schneider CPC

Die Basic-Vektoren

Die Abteilungen des Betriebssystems: Die Basic-Vektoren
Überblick: Die Basic-Vektoren
Die Firmware des Schneider CPC: Die Basic-Vektoren
Die Basic-Vektoren
haben, im Gegensatz zu allen anderen, Garbage Collection: ... beim CPC 664 und 6128beim CPC 464, 664 und 6128 nicht die gleiche Lage. Zu jedem Vektor sind deshalb alle drei Einsprungsstellen angegeben in der Reihenfolge 464-664-6128.

Außerdem wurden Garbage Collection: ... beim CPC 664 und 6128beim CPC 664 und 6128 die Integervektoren weggelassen, weil die entsprechenden Routinen in's Basic-ROM verlegt wurden. Hier ist dann jeweils die Routinenadresse angegeben. Bevor man diese Routinen aber aufrufen kann, muss man aber auch das Basic-ROM einblenden! Allgemein kann man sich hier eines ROM-Konfiguration: RestartsRestarts bedienen.

Einige Fließkomma-Vektoren wurden ebenfalls nicht mehr in den Basic-Jumpblock aufgenommen.

Editor

BD3A / BD5B / BD5E: EDIT

Eingabe und Ändern eines Datentypen: StringsStrings (Zeichenkette).

Eingaben:     HL zeigt auf den Puffer
Ausgaben:     CY=1  ->  o.k. (Anwender schloss mit [ENTER] ab)
              CY=0  ->  BREAK (Anwender schloss mit [ESC] ab)
Unverändert: BC,DE,HL,IX,IY

Mit Hilfe Die Basic-Vektoren: Der Editordes Editors kann ein beliebiger Text verändert oder neu eingegeben werden. Der Text wird Die Basic-Vektoren: Der Editordem Editor in einem Puffer bereitgestellt und kann bis zu 255 Zeichen lang sein. Abgeschlossen werden muss er mit einem Nullbyte. Der Puffer muss immer 256 Datentypen: Bytes
Datenbreite: Bytes
Bytes
lang sein und darf durch kein Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM verdeckt werden (er kann deshalb nie unterhalb von &4000 liegen). Soll ein Text nicht verändert, sondern ein neuer eingegeben werden, so muss man praktisch einen Real: Nullnull Zeichen langen Text 'editieren': Das erste Datentypen: Bytes
Datenbreite: Bytes
Byte
des Puffers, auf das HL zeigt, muss auf Real: NullNull gesetzt sein.

Sobald Die Basic-Vektoren: Der Editorder Editor aufgerufen wurde, gibt dieser selbst den Text ab der aktuellen Cursorposition im aktuellen Textfenster aus. Dabei benutzt er &TEXT VDU: BB5D: TXT WR CHARBB5D TXT WR CHAR. Sonderzeichen werden deshalb nie befolgt, sondern immer als Grafikzeichen ausgedruckt. Ausgenommen davon sind die Codes 0, 13 und 16, die Die Basic-Vektoren: Der Editorder Editor selbst als Steuerzeichen interpretiert. Abgesehen von CHR$(0) können aber alle Zeichen mit Hilfe des Copycursors eingegeben werden.

Die Basic-Vektoren: Der EditorDer Editor beschränkt sich auf das aktuelle Textfenster. Ist dies zu klein, den ganzen Text zu fassen, scrollt er auch selbstätig darin. Leider kann der Cpoycursor auch nur innerhalb dieses Textfensters bewegt werden.

Die Basic-Vektoren: Der EditorDer Editor des Schneider CPC 664 und 6128 wurde um eine nützliche Die Fließkomma-Routinen: FunktionenFunktion erweitert: Garbage Collection: ... beim CPC 464Beim CPC 464 fällt es meist unangenehm auf, dass bei einem 'Editor: BD3A / BD5B / BD5E: EDITEDIT zeile' Die Text-VDU: Der Cursorder Cursor nicht auf dem ersten Zeichen der Basiczeile, wie von 'AUTO' her gewohnt, sondern auf dem ersten Zeichen der Zeilennummer steht. Bei CPC 664 bzw. 6128 testet Die Basic-Vektoren: Der Editorder Editor jetzt erst, ob der zu bearbeitende Text mit einer Zahl anfängt. Diese interpretiert er dann als Zeilennummer und stellt dann Die Text-VDU: Der Cursorden Cursor bereits hinter die Zahl.

Außerdem enthält Die Basic-Vektoren: Der Editorder Editor Garbage Collection: ... beim CPC 664 und 6128beim CPC 464 und 664 einen kleinen Der Linien-Algorithmus: Fehler 3Fehler. Normalerweise kann der Anwender Die Basic-Vektoren: Der Editorden Editor mit [CTRL] plus [TAB] zwischen Einfüge- und Überschreib-Modus hin- und herschalten. Ist das bearbeitete Datentypen: StringsString aber gerade leer, so funktioniert es Garbage Collection: ... beim CPC 664 und 6128beim CPC 464 und 664 nicht korrekt: Irgendwie ist Die Basic-Vektoren: Der Editorder Editor der Meinung, man habe [ENTER] (zu Insert zurückschalten) bzw. [ESC] (Insert abschalten) gedrückt und terminiert entsprechend. Dieser Der Linien-Algorithmus: Fehler 3Fehler wurde von Amstrad erst Garbage Collection: ... beim CPC 464beim CPC 6128 korrigiert.

Die Fließkomma-Routinen

Das Fließkomma-Pack im unteren Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM stellt alle gebräuchlichen Rechenfunktionen und -Die Fließkomma-Routinen: OperationenOperationen zur Verfügung. Dabei hielten sich seine Autoren (bis auf wenige Ausnahmen) sklavisch an folgende Ein- und Ausgabe-Schnittstelle:

Bevorzugter Eingabeparameter ist FLO(HL), bei den Die Fließkomma-Routinen: OperationenOperationen kommt noch FLO(DE) als zweiter Basic und Maschinencode: ParameterParameter dazu. Die Ausgabe erfolgt immer in FLO(HL), wenn das ausreicht aber auch manchmal direkt im A-Register. Der Wert des HL-Registers ändert sich nicht, d.h. die Ausgabe des Ergebnisses erfolgt in dem Fließkomma-Speicher, der das bzw. eins der beiden Argumente enthielt.

Rechenroutinen die versagen können, liefern im Carry-Flag den Fehlerstatus: Wie fast überall im Betriebssystem bedeutet CY=1, dass kein Der Linien-Algorithmus: Fehler 3Fehler vorliegt und CY=0, dass ein Der Linien-Algorithmus: Fehler 3Fehler auftrat. In letzterem Fall können die folgenden Die Z80: Wirkung der Z80-Befehle auf die FlagsFlags noch zusätzliche Informationen enthalten:

Z=1  ->  Rechnen im Binärsystem: DivisionDivision durch Real: NullNull
S=1  ->  ungültiger Basic und Maschinencode: ParameterParameter
P=1  ->  Überlauf

Die Fließkommaspeicher dürfen nicht durch ein Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM verdeckt sein. Normalerweise dürfen also unterhalb von &4000 keine Speicher liegen. Ausnahme davon sind Konstanten, die im unteren Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM (!) liegen, und auf die die FLO-Routinen zugreifen können.

Zufallsgenerator

Diese vier Routinen stellen einen komfortablen Zufallszahlengenerator dar. Als GrundlagenGrundlage dient eine 'seed' genannte, 4-Datentypen: Bytes
Datenbreite: Bytes
Byte
breite Zahl, ein sogenanntes 'long Datenbreite: Wordsword'. Die Zufallszahlen, die erzeugt werden, sind aber vom Typ 'Datentypen: RealReal', also Fließkomma, und liegen im Bereich 0 <= RND < 1.

Da es einem digitalen Automaten vom Prinzip her sehr schwer fällt, wirklich zufällige Zahlen bzw. Zahlenfolgen zu erzeugen, benutzt man auch im Schneider CPC dafür eine recht gebräuchliche Rechenvorschrift. Das hat zur Folge, dass man nach einem RANDOMIZE mit einem konstanten Initialisierungswert mit RND immer die selben Zahlenfolgen erhält. Dieser Effekt ist letztendlich aber auch sehr nützlich, wenn man in einem 'Zufallgesteuerten' Programm einem Der Linien-Algorithmus: Fehler 3Fehler auf die Spur kommen will.

BD97 / BDB8 / BDBB: FLO RANDOMIZE 0

&89656C07 -> LW(seed)

Eingaben:    keine
Ausgaben:    keine
Unverändert: AF,BC,DE,IX,IY
BD9A / BDBB / BDBE: FLO RANDOMIZE

FLO(HL) XOR &89656C07 -> LW(seed)

Eingaben:    FLO(HL) = Fließkommazahl
Ausgaben:    keine
Unverändert: C,IY,FLO(HL)
BD9D / BD7C / BD7F: FLO RND

RND -> FLO(HL)

Eingaben:    FLO(HL) = Fließkommaspeicher für die Zufallszahl
Ausgaben:    FLO(HL) = nächste Zufallszahl
Unverändert: HL,IY
BDA0 / BD88 / BD8B: FLO LAST RND

letzten RND-Wert -> FLO(HL)

Eingaben:    FLO(HL) = Fließkommaspeicher für die Zufallszahl
Ausgaben:    FLO(HL) = alte Zufallszahl
Unverändert: HL,IY

Operationen

Im folgenden die Die Fließkomma-Routinen: OperationenOperationen, die vom Fließkomma-Pack bereitgestellt werden.

Garbage Collection: ... beim CPC 664 und 6128Beim CPC 664 und 6128 wurde der Vektor für Operationen: BD5E / BD7F / BD82: FLO SUB*
Operationen: BD5B / 349A / 349A: FLO SUB
FLO SUB
ersatzlos gestrichen, aber Operationen: BD5E / BD7F / BD82: FLO SUB*
Operationen: BD5B / 349A / 349A: FLO SUB
FLO SUB
* belassen. Das ist in sofern unglücklich, als Operationen: BD5E / BD7F / BD82: FLO SUB*
Operationen: BD5B / 349A / 349A: FLO SUB
FLO SUB
den IN/OUT-Standard exakt befolgt hätte, nicht aber Operationen: BD5E / BD7F / BD82: FLO SUB*
Operationen: BD5B / 349A / 349A: FLO SUB
FLO SUB
*, wo FLO(HL) nicht mehr das 'erste' Argument ist.

Operationen: BD7C / BD9D / BDA0: FLO POTFLO POT enthält zwei kleine Der Linien-Algorithmus: Fehler 3Fehler:

0 hoch 0 wird komentarlos zu 1 evaluiert. Das ist falsch, denn 0^0 ist nicht definiert:

{Die verwendeten Abkürzungen bedeuten: x:x^0=1 | Die verwendeten Abkürzungen bedeuten: x:x<>0}  - Die verwendeten Abkürzungen bedeuten: x:x hoch 0 ist 1 für alle Die verwendeten Abkürzungen bedeuten: x:X ungleich 0 und:
{0^y=0 | y<>0}  - 0 hoch y ist 0 für alle Y außer 0.

Bei einem Überlauf wird normalerweise als 'Ergebnis' immer die größte, darstellbare Zahl vorzeichenrichtig ausgegeben. Bei einer negativen Basis und einem ganzzahligen, geraden Exponenten müsste deshalb +1.70141LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
+38 ausgegeben werden. Tatsächlich wird aber auch hier der negative Wert angezeigt:

PRINT -10 ^ +40  ->  Overflow  -1.70141LOW KERNEL JUMPBLOCK: 000E:  LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
+38

Das resultiert wahrscheinlich aus einem anderen Service, den diese Routine bereitstellt: Wird zu einer negativen Basis ein nicht ganzzahliger Exponent angegeben, quittiert Operationen: BD7C / BD9D / BDA0: FLO POTFLO POT mit M (Signum: S=1), also ungültiger Basic und Maschinencode: ParameterParameter. Die Routine bricht die Berechnung aber nicht kommentarlos ab, sondern berechnet einfach den Funktionswert zur entsprechenden, positiven Basis und gibt dem Funktionswert ein negatives Vorzeichen. Einleitung: BASIC
Anhang: Basic
BASIC
schert sich in diesem Fall nicht um die Fehlermeldung und übernimmt kommentarlos diesen Wert:

PRINT -10 ^ 3.3  ->  -1995.26231
BD58 / BD79 / BD7C: FLO ADD

FLO(HL) + FLO(DE) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL,FLO(DE)
BD5E / BD7F / BD82: FLO SUB*

FLO(DE) - FLO(HL) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL,FLO(DE)
BD5B / 349A / 349A: FLO SUB

FLO(HL) - FLO(DE) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL,FLO(DE)
BD61 / BD82 / BD85: FLO MULT

FLO(HL) * FLO(DE) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL,FLO(DE)
BD64 / BD85 / BD88: FLO DIV

FLO(HL) / FLO(DE) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf. Wenn auch Z=1 dann Rechnen im Binärsystem: DivisionDivision durch Real: NullNull
Unverändert: HL,FLO(DE)
BD7C / BD9D / BDA0: FLO POT

FLO(HL) ^ FLO(DE) -> FLO(HL)

Eingaben:    FLO(HL) und FLO(DE)
Ausgaben:    FLO(HL)
             CY=1 -> Berechnung o.k. sonst:
             S=1  -> ungültiger Basic und Maschinencode: ParameterParameter:  -Die verwendeten Abkürzungen bedeuten: x:X^(z/n)
             P=1  -> Überlauf
Unverändert: HL,FLO(DE)
BD6A / BD8B / BD8E: FLO VGL

SGN (FLO(HL)-FLO(DE)) -> Operationen: BD5B / 349A / 349A: FLO SUBA

Eingaben:    FLO(DE) und FLO(HL)
Ausgaben:    Operationen: BD5B / 349A / 349A:  FLO SUBA=-1/0/1 für FLO(HL)-FLO(DE) = negativ/Real: Nullnull/positiv
             Z=1  -> Real: NullNull
             CY=1 -> Negativ
Unverändert: BC,DE,HL,FLO(HL),FLO(DE)

Funktionen

Alle Die Fließkomma-Routinen: FunktionenFunktionen (außer Funktionen: BD6D / BD8E / BD91: FLO VZWFLO VZW) werden über Polynomentwicklungen berechnet. Das ist leider nicht besonders schnell, lässt sich meist aber nicht sinnvoll umgehen. Es ist jedoch denkbar, für die ein oder andere Routine eine eigene zu installieren. Für die Wurzel-Berechnung gibt es beispielsweise viel schnellere Näherungsverfahren. Aber auch durch geschickte Abschätzung, wieviele Summanden (Polynome) für einen speziellen Eingabeparameter wirklich notwendig sind, lassen sich die meisten Routinen noch beschleunigen. Für Grafik-Anwendungen, bei denen in aller Regel die achte Stelle hinter dem Komma nicht mehr interessiert, lässt sich die Anzahl der benötigten Polynome oft erheblich schrumpfen. Es ist also auch möglich, die Routinen auf Kosten der Rechengenauigkeit zu beschleunigen.

Die Routinen Funktionen: BD7F / BDA0 / BDA3: FLO LOG NATFLO LOG NAT und Funktionen: BD82 / BDA3 / BDA6: FLO LOG DECFLO LOG DEC melden für das Argument 0 korrekt 'Overflow' und liefern den Funktionswert 0. Möglicherweise wäre hier aber ein anderer Wert wünschenswert gewesen: -88.73 oder kleiner (bei Funktionen: BD7F / BDA0 / BDA3: FLO LOG NATFLO LOG NAT). Bedingt durch die Tatsache, dass der Schneider CPC mit seinem Fließkomma-Format keine Adressierungsarten der Z80: Absolutabsolut beliebig kleinen Zahlen darstellen kann, sondern bereits etwa bei 0.3E-38 auf 0 runden muss, ergeben sich keine Funktionswerte, die kleiner als -88.73 sind. Das Argument 0 könnte also auch eine zwangsweise nach 0 gerundete, kleine Zahl sein, deren Logarithmus normalerweise noch leicht darstellbar wäre. Der Wunsch nach der 'kleinsten, sinnvollen Zahl' entspringt also der selben Logik, die nach einer Rechnen im Binärsystem: DivisionDivision durch Real: NullNull oder einem Überlauf die Möglichkeit bietet, mit der größtmöglichen Zahl weiterzurechnen.

BD6D / BD8E / BD91: FLO VZW

-1 * FLO(HL) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
Unverändert: BC,DE,HL,IY
BD79 / BD9A / BD9D: FLO SQR

SQR(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> negative Zahl
Unverändert: HL
BD7F / BDA0 / BDA3: FLO LOG NAT

LOG(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> Argument <= 0
Unverändert: HL
BD82 / BDA3 / BDA6: FLO LOG DEC

LOG10(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> Argument <= 0
Unverändert: HL
BD85 / BDA6 / BDA9: FLO POT E

LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
^ FLO(HL) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL
BD88 / BDA9 / BDAC: FLO SIN

SIN(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> Argument zu groß
Unverändert: HL
BD8B / BDAC / BDAF: FLO COS

COS(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=0 -> Argument zu groß
Unverändert: HL
BD8E / BDAF / BDB2: FLO TAN

TAN(FLO(HL)) -> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
             CY=1 -> o.k. sonst:
             Z=1  -> Rechnen im Binärsystem: DivisionDivision durch Real: NullNull
             S=1  -> Argument zu groß
Unverändert: HL
BD91 / BDB2 / BDB5: FLO ARC TAN

ARCTAN(FLO(HL))-> FLO(HL)

Eingaben:    FLO(HL)
Ausgaben:    FLO(HL)
Unverändert: HL
BD55 / BD76 / BD79: FLO 10^A

FLO(HL) * 10^Operationen: BD5B / 349A / 349A: FLO SUBA -> FLO(HL)

Eingaben:    FLO(HL) und Operationen: BD5B / 349A / 349A:  FLO SUBA
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL
BD67 / ---- / ----: FLO 2^A

Nur CPC 464.

FLO(HL) * 2^Operationen: BD5B / 349A / 349A: FLO SUBA -> FLO(HL)

Eingaben:    FLO(HL) und Operationen: BD5B / 349A / 349A:  FLO SUBA
Ausgaben:    FLO(HL)
             CY=0 -> Überlauf
Unverändert: HL
BD70 / BD91 / BD94: FLO SGN

SGN(FLO(HL)) -> Operationen: BD5B / 349A / 349A: FLO SUBA

Eingaben:    FLO(HL)
Ausgaben:    Operationen: BD5B / 349A / 349A:  FLO SUBA = -1/0/1 für FLO(HL) neg/Real: Nullnull/pos
             Z=1 -> Real: NullNull
             C=1 -> Negativ
Unverändert: BC,DE,HL,IY,FLO(HL)

Sonstiges

Die Kopier-Routine für Fließkommazahlen ist mit Vorsicht zu genießen: Wie alle anderen FLO-Routinen auch, arbeitet sie nicht zwangsweise im RAM. Für den Vektor wurde von Einleitung: BASIC
Anhang: Basic
Basic
der ROM-Konfiguration: RestartsRestart 5 (FIRM MAIN FIRMWARE JUMPBLOCK: JUMPER
Die Firmware des Schneider CPC: JUMPER
JUMP
) gewählt. Wird Sonstiges: BD3D / BD5E / BD61: FLO MOVEFLO MOVE also von einem Maschinencode-Programm aufgerufen, so wird unten das Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM eingeblendet (nur für Lesezugriffe, also die Zahlenquelle interessant), ansonsten kann man von RAM ausgehen. Oft muss man aber auch eine Zahl aus dem unteren RAM-Bereich holen. Dann kann man diese Routine nicht benutzen.

BD3D / BD5E / BD61: FLO MOVE

FLO(DE) -> FLO(HL) und Operationen: BD5B / 349A / 349A: FLO SUBA:=exp.Datentypen: Bytes
Datenbreite: Bytes
byte

Eingaben:    FLO(DE) und (HL) = Fließkommaspeicher
Ausgaben:    FLO(HL)
             Operationen: BD5B / 349A / 349A:  FLO SUBA=Exponentenbyte von FLO(DE) (Charakteristik)
             CY=1
Unverändert: BC,DE,HL,IX,IY,FLO(DE)
BD76 / BD97 / BD9A: FLO PI

PI -> FLO(HL)

Eingaben:    (HL) = Fließkommaspeicher
Ausgaben:    FLO(HL)
             CY=1
Unverändert: BC,HL,IX,IY
BD73 / BD94 / BD97: FLO DEG/RAD

Operationen: BD5B / 349A / 349A: FLO SUBA=0 -> RAD A>0 -> DEG

Eingaben:    Operationen: BD5B / 349A / 349A:  FLO SUBA=0 -> Radiant
             A>0 -> Degree
Ausgaben:    keine
Unverändert: AF,BC,DE,HL,IX,IY

Die Integer-Routinen

Kleine ganze Zahlen im Bereich -2^15 bis +2^15-1 (-32768 bis +32767) werden als 'Integer' bezeichnet. Zur Darstellung negativer Zahlen wird die Komplementär-Darstellung benutzt, da dieses Amsdos: FormateFormat auch von der Die ICs im Überblick: Die CPU Z80
Das Innenleben der CPC-Rechner: Die CPU Z80
Die Anschlussbelegungen der wichtigsten ICs im CPC: Die CPU Z80
Z80
unterstützt wird.

Die Parameter: Parameter-ÜbergabeParameter-Übergabe ist ähnlich streng strukturiert wie bei den Die Basic-Vektoren: Fließkomma-RoutinenFließkomma-Routinen, nur dass HL und DE hier nicht als Zeiger auf Fließkomma-Variablen dienen, sondern diese Zahlen direkt enthalten.

Operationen mit Vorzeichen

BDAC / DD4F / DD4A: INT ADD VZ

HL + DE -> HL

Eingaben:    HL und DE
Ausgaben:    HL = HL+DE
             CY=0 -> Überlauf
Unverändert: BC,DE,IX,IY
BDAF / DD58 / DD53: INT SUB VZ

HL - DE -> HL

Eingaben:    HL und DE
Ausgaben:    HL = HL-DE
             CY=0 -> Überlauf
Unverändert: BC,DE,IX,IY
BDB2 / DD57 / DD52: INT SUB* VZ

DE - HL -> HL

Eingaben:    HL und DE
Ausgaben:    HL = DE-HL
             DE = alter Wert von HL
             CY=0 -> Überlauf
Unverändert: BC,IX,IY
BDB5 / DD60 / DD5B: INT MULT VZ

HL * DE -> HL

Eingaben:    HL und DE
Ausgaben:    HL = HL*DE
             CY=0 -> Überlauf
Unverändert: DE,IX,IY
BDB8 / DDA1 / DD9C: INT DIV VZ

HL / DE -> HL rest DE

Eingaben:    HL und DE
Ausgaben:    HL = HL\DE
             DE = ABS(HL Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:
MOD
DE) CY=0 -> Überlauf Unverändert: IX,IY
BDBB / DDA8 / DDA3: INT MOD VZ

HL / DE -> DE rest HL

Eingaben:    HL und DE
Ausgaben:    HL = HL Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:
MOD
DE DE = ABS(HL\DE) CY=0 -> Überlauf Unverändert: IX,IY
BDC4 / DE07 / DE02: INT VGL

SGN (HL-DE) -> Operationen: BD5B / 349A / 349A: FLO SUBA

Eingaben:    HL und DE
Ausgaben:    Operationen: BD5B / 349A / 349A:  FLO SUBA = -1/0/1 wenn (HL-DE) neg/Real: Nullnull/pos
             Z = 1 -> HL=DE
             CY= 1 -> HL<DE
Unverändert: BC,DE,HL,IX,IY

Funktionen mit Vorzeichen

BDC7 / DDF2 / DDED: INT VZW

-1 * HL -> HL

Eingaben:    HL
Ausgaben:    HL = -HL
              CY=0 -> Überlauf (-> HL=-2^15)
Unverändert: BC,DE,IX,IY
BDCA / DDFE / DDF9: INT SGN

SGN (HL) -> Operationen: BD5B / 349A / 349A: FLO SUBA

Eingaben:    HL
Ausgaben:    Operationen: BD5B / 349A / 349A:  FLO SUBA = -1/0/1 wenn HL neg/Real: Nullnull/pos
             Z = 1 -> HL=0
             CY= 1 -> HL<0
Unverändert: BC,DE,IX,IY

Operationen ohne Vorzeichen

Der Darstellungsbereich dieser Routinen geht von 0 bis 2^16-1 (65535). Vorsicht bei der Rechnen im Binärsystem: MultiplikationMultiplikation: Hier funktioniert das Carry-Flag mit umgekehrter Logik!

BDBE / DD77 / DD72: INT MULT

HL * DE -> HL

Eingaben:    HL und DE
Ausgaben:    HL = HL*DE
             CY=1 -> Überlauf
Unverändert: BC,DE,IX,IY
BDC1 / DDB0 / DDAB: INT DIV

HL / DE -> HL rest DE

Eingaben:    HL und DE
Ausgaben:    HL = HL\DE
             DE = HL Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1:
Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:
MOD
DE CY=0 -> Überlauf. Auch Z=1 -> Rechnen im Binärsystem: DivisionDivision durch Real: NullNull. Unverändert: BC,IX,IY

Konvertierung

Insgesamt acht verschiedene Möglichkeiten werden bereitgehalten, um zwischen Integer und Fließkomma umzurechnen. Dabei wird für Integerzahlen nicht die übliche Komplementär-Darstellung unterstuetzt, sondern nur eine getrennte Darstellung von Betrag und Vorzeichen. Für letzteres wird dabei immer Hardware-Basteleien: Das 8. Bitdas 7. Bit eines Registers (Operationen: BD5B / 349A / 349A: FLO SUBA oder LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
) benutzt.

BD46 / BD67 / BD6A: ROUND FLO TO HLA

ROUND(FLO(HL)) -> HL, Operationen: BD5B / 349A / 349A: FLO SUBA=VZ

Eingaben:    FLO(HL)
Ausgaben:    HL = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von Operationen: BD5B / 349A / 349A: FLO SUBA = Vorzeichen CY=0 -> Überlauf Unverändert: BC,DE,IY
BD40 / BD61 / BD64: KONV HLA TO FLO

HL, Operationen: BD5B / 349A / 349A: FLO SUBA=VZ -> FLO(DE)

Eingaben:    HL = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von Operationen: BD5B / 349A / 349A: FLO SUBA = Vorzeichen (DE) = Fließkommaspeicher Ausgaben: HL = alter Wert von DE FLO(HL) Unverändert: BC,IX,IY
BD43 / BD64 / BD67: KONV LW TO FLO

LW(HL), Operationen: BD5B / 349A / 349A: FLO SUBA=VZ -> FLO(HL)

Eingaben:    LW(HL) und Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von Operationen: BD5B / 349A / 349A: FLO SUBA = Vorzeichen Ausgaben: FLO(HL) Unverändert: BC,DE,HL,IY
BD49 / BD6A / BD6D: ROUND FLO TO LW

ROUND(FLO(HL)) -> LW(HL), LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=VZ

Eingaben:    FLO(HL)
Ausgaben:    LW(HL) = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen CY=0 -> Überlauf Unverändert: DE,HL,IY
BD4C / BD6D / BD70: FIX FLO TO LW

FIX(FLO(HL)) -> LW(HL), LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=VZ

Eingaben:    FLO(HL)
Ausgaben:    LW(HL) = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen Unverändert: DE,HL,IY
BD4F / BD70 / BD73: INT FLO TO LW

Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - Interrupt
Besonderheiten der Z80 im Schneider CPC: normaler Interrupt
Die Besonderheiten des FDC 765 im Schneider CPC: INT
INT
(FLO(HL)) -> LW(HL), LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=VZ

Eingaben:    FLO(HL)
Ausgaben:    LW(HL) = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen CY=0 -> Überlauf Unverändert: DE,HL,IY
BD94 / BDB5 / BDB8: KONV LW+C TO FLO

LW(HL)*256+C -> FLO(HL)

Eingaben:    LW(HL) und C
Ausgaben:    FLO(HL) = LW(HL)*256 + C
Unverändert: DE,HL,IY
BDA9 / DD3C / DD37: KONV HLB TO INT

HL, LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=VZ -> HL

Eingaben:    HL = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen Ausgaben: HL = Zahl in Komplementär-Darstellung CY=0 -> Überlauf Unverändert: BC,DE,IX,IY

Dezimalwandlung

Die folgenden Routinen werden benötigt, wenn eine Fließkomma- oder Integerzahl ausgedruckt werden soll.

BD52 / BD73 / BD76: FLO PREPARE

FLO(HL) -> Basic und Maschinencode: ParameterParameter

Eingaben:    FLO(HL)
Ausgaben:    LW(HL) = normierte Mantisse
             LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen der Mantisse D = Vorzeichen Real: Der Exponentdes Exponenten LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
= Exponent bzw. Kommaposition (je nach Darstellung) C = Anzahl der signifikanten Mantisse-Bytes (nicht Ziffern!) Unverändert: HL
BDA3 / DD2F / DD2A: INT PREPARE VZ

HL (Integer mit VZ) -> Basic und Maschinencode: ParameterParameter

Eingaben:    HL = Zahl in Komplementär-Darstellung
Ausgaben:    HL = Absolutwert
             Datenbreite: Bits
Port B - Input: &F5xx: Bit 0:
Port B - Input: &F5xx: Bit 4:
Port B - Input: &F5xx: Bit 5:
Port B - Input: &F5xx: Bit 6:
Port B - Input: &F5xx: Bit 7:
Port C - Output: &F6xx: Bit 4:
Port C - Output: &F6xx: Bit 5:
Bit
7 von LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Vorzeichen C = 2 (Anzahl signifikanter Mantissebytes) LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
= 0 (Kommaposition) Unverändert: IX,IY
BDA6 / DD35 / DD30: INT PREPARE

HL (Integer ohne VZ) -> Basic und Maschinencode: ParameterParameter

Eingaben:    HL = positive Zahl (0 ... 2^16-1)
Ausgaben:    LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= 0 (Vorzeichen = positiv) C = 2 (Anzahl signifikanter Mantissebytes) LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
= 0 (Kommaposition) Unverändert: AF,D,IX,IY

Valid HTML   Valid CSS