CODINGSOURCES ★ Assembler-Tips ★

MOD Constant multiplication (CPC Amstrad International)Coding Sources
★ 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 ★ 

Ein “Ready to use“-Tip und Hilfe für 'Oldtimer'

Mit diesem Artikel wollen wir eigentlich zwei Fliegen mit einer Klappe schlagen. Zuerst können Sie etwas über ein Assembler- Utility lesen, das in die Sparte “Optimizing“ (das Bestreben, einen bestimmten Programmteil effektiver zu programmieren) fallt, es behandelt die Multiplikation von Konstanten in Maschinensprache. Der Rest des Artikels steht dann ganz im Zeichen von Ergänzungen, Verbesserungen und Anpassungen von vor einiger Zeit erschienenen Assembler-Routinen.

Oft ist es nötig, eine variable Zahl in einem Register mit einem festen Wert zu multiplizieren - wir nennen es der Einfachheit halber Konstanten-Multiplikation. Meist wird dabei eine Multiplikations-Routine für ZWEI variable Werte benutzt, zum Beispiel HL=DE*HL. Das ist jedoch im vorliegenden Fall wenig sinnvoll, denn dies kostet nicht nur Platz, sondern auch Zeit. Jetzt kann man es aber auch übertreiben, werden Sie sicherlich sagen. Da haben Sie auch nicht ganz unrecht, aber das Thema ist trotzdem interessant genug, um untersucht zu werden.

Wir präsentieren Ihnen hier eine Sammlung von relativ kurzen Assembler-Unterroutinen, die das Register HL mit 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16, 32, 64 oder 128 multiplizieren und das Ergebnis wieder in HL zurückgeben. Wollen Sie nun zum Beispiel HL mit 3 multiplizieren, so können Sie einfach das dazu geschriebene Modul verwenden, das sogar noch kürzer ist, als der Aufruf des allgemeinen Multiplikationsprogrammes, einschließlich dem Laden der dazu nötigen Register! Und das ist doch wohl durchaus erfreulich, oder?

Assembler-Splitter

So, und nun wollen wir noch ein paar Verbesserungen , Korrekturen und Dementi zu schon veröffentlichten “Ready to use“-Tips bringen und ein paar Fragen beantworten, die sich in bezug auf unsere Assembler-Programme ergaben:

“ent$“ — Was ist denn das?

Immer wieder tauchen Fragen auf, was es mit dem “ent $“ in den Assemblerprogrammen, die unter der Rubrik 'Ready-to-use-Tips' erscheinen, auf sich hat. Der Befehl “ent“ ist eine sogenannte Assemblerdirektive, also eine Steueranweisung an den Compiler. Diese macht im Prinzip nichts anderes, als die gegebene Adresse für den Einsprung vorzumerken. Für den GEN A-Assembler von HiSoft bedeutet das, daß die angegebene Adresse nachher intern gespeichert worden ist und Sie dann mit dem Befehl “R“ vom Editor aus das Programm probeweise starten können, “ent“ ist nicht bei jedem Assembler vorhanden. Das Zeichen “$“ heißt nur, daß für die Adresse der aktuelle Befehlszähler bei der Compilierung eingesetzt werden soll. Mit dem eigentlichen Assemblerprogramm hat dieser also nichts zu tun.

Texteingabe
Das Assemblerprogramm “Input“ aus Heft 6/87 ist - entgegen vieler anderslautender Meinungen - korrekt abgedruckt. Einen kleinen Schönheitsfehler hat es jedoch trotzdem: Im Programm ist die Zeile 1300 (ein Relikt aus der Ent-
wicklungsphase) überflüssig, sie kann ersatzlos entfernt werden.

Invert
Diese kurze Routine, die in Heft 9/87 zu finden war, kann ein ganzes Stück (um sieben Bytes) kürzer gemacht werden: Wenn man die Zeile 1170 in “ex (sp),hl“ und die Zeile 1230 in “pop hl“ ändert, kann man 1160 und 1260 streichen. Beim Programmieren ist dies nicht direkt ersichtlich, erst wenn man sich die Funktion der Routine im Nachhinein durchdenkt, fallt einem dieser nicht gerade schlimme 'Bug' auf, manchmal denkt man bei der Assemblerprogrammierung eben um die Ecke.

Noch faster...
Natürlich war die in Heft 11/87 vorgestellte 16-Bit-Schleifenkonstruktion bei weitem noch nicht die schnellste: Löschen Sie die Zeilen 1120 und 1180 und ändern Sie 1170 in “jp m,exit“. Jetzt braucht das Modul vier Bytes weniger. Schon besser!

Erweiterter “erweiterter Zeichensatz“
Eine weitere Option, nämlich

B6=064= Inverted


erhält man durch folgende Änderungen beziehungsweise Erweiterungen des CHAR-Assemblerprogrammes (Heft 8/87):
Änderung von Zeile 1790 in

jr z,invers


sowie eine Einfügung ab Zeile 1821 (GENA mit 11821,1):

invers: bit 6 ,a
jr z ,expand
ld hl,matrix
ld b ,8
invert: ld a,(hl)
cpl
ld (hl) ,a
inc hl
djnz invert
ld a ,(type)

Noch'n Byte
Im Heft 9/87 (“VAL in Assembler“) können Sie “Id c,0“ (Zeile 1210) in diesem speziellen Fall durch “Id c,a“ ersetzen.

Für CPC 664-Besitzer
Bei den Assembler-Freunden mit CPC 664 haben wir noch Abbitte zu leisten, bei einigen Programmen wurden Systemadressen nur für CPC464 und CPC6128 angegeben. Aber wir geloben Besserung. Fangen wir gleich damit an: Wenn die Systemadressen in der hier aufgeführten Tabelle nicht auftauchen, können Sie tatsächlich, wie dokumentiert, die CPC 6128-Systemadresse nehmen.
Heft Artikel 464: 664:

08/87 Variable Chars # 12D3 # 12D0
-.- #1334 #1331
-.- # HOC #1406
02/88 TXTWR FAST CHAR #07C6 #07B0
-.- #0DB7 #0DB9
-.- #0E24 #0E26


Und in dem Artikel über die Integerarithmetik wurden gar alle 664-Adressen im BasicROM vergessen. Peinlich, peinlich! Hier sind sie:
Zweierkomplement-Zahl für Dezimalumwandlung nach signed Binary, Wandlungsparams : #DD2F
Dezimalwandlungs-Parameter fiir positive Integerzahl holen: #DD3F
Signed Binary nach Zweierkomplement wandeln : #DD3C

HL=HL+DE: #DD4F
HL=DE-HL : #DD57
HL=HL-DE: #DD58
HL=HL*DE: *DD60


Vorzeichen des Ergebnisses bestimmen : #DD6C
Vorzeichenlose Multiplikation mit HL=HL*DE: #DD77

HL=HL DIV DE : #DDA1
HL=HL MOD DE : # DDA8


Division : #DDB0
Vorzeichenlose Division : #DDB3

HL=ABS(HL): #DDEF
HL=-HL: #DDF2
A=SGN(HL) : #DDFE


Vergleich per HL-DE: #DE07
Das war's für dieses Mal. In diesem Sinne: “Gut By(t)e!“

(Eckehart Röscheisen /cd), CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1988
★ LANGUAGE:
★ LiCENCE: ???
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1988
★ AUTHOR: Eckehart Röscheisen
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» MOD  Constant  multiplication    (CPC  Amstrad  International)    GERMANDATE: 2021-08-11
DL: 188
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

» MOD  Constant  multiplication    (CPC  Amstrad  International)    LISTING    GERMANDATE: 2021-08-11
DL: 202
TYPE: text
SiZE: 3Ko
NOTE:

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

Lien(s):
» Coding Src's » Sound - Les 4 Saisons
» Coding Src's » Schola (Schneider Aktiv)
» Coding Src's » Excat
» Coding Src's » Dessinez vos sons
» Coding Src's » Borde Multicolor (Amstrad Personal)
» Coding Src's » 3D Maze (Amstrad Games Book) / Laberinto en 3D (El Libro Gigante de los Juegos para AMSTRAD)
Je participe au site:
» 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 365 millisecondes et consultée 765 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.