home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
robot-pd
/
19304.ZIP
/
19304A.DSK
/
cc.n67
< prev
next >
Wrap
Text File
|
1998-02-03
|
7KB
|
121 lines
RED DRAGON auf der Suche nach dem Undokumentierten
--------------------------------------------------
Jeder, der in Assembler programmiert, stand irgendwann schon mal vor dem
Problem: Alle 8-Bit-Register voll, aber man braucht noch unbedingt eines,
um einen wichtigen Wert zu sichern oder unterzubringen. Abhilfe schafft
hier meist nur v|lliges Umstrukturieren der Routine oder PUSHen und POPen
der oder des Wertes, was meist zu neuen Komplikationen f}hrt.
Also gehen wir nochmals alle Register durch:
Die Register A, B & C, D & E, H & L sind bereits restlos gef}ll⌠ (mal an-
genommen).
F w{re noch da- so'n Quatsch! 1. kein direkter Zugriff, und 2. wird es
durch verschiedene Operationen beeinflu~t.
Das Refresh-Register ist ebenfalls ungeeignet, da es bei jedem Takt-Zyklus
der CPU um den Wert 1 erh|ht wird.
Da is doch noch so'n I-Register }berfl}ssig, joh, das InterruptRegister
ist schon mal ganz brauchbar, aber leider l{~t es sich nur }ber das A-Re-
gister ansprechen, aber als Sicherungs-Register f}r den Akkumulator ist es
brauchbar; leider sind Befehle wiσ LD C,I o.{. nicht bekannt, und leider
l{~t sich das Interrupt-Register auch nicht arithmetisch behandeln, Bit-
Opperationen sind ebenfalls undenkbar.
W{ren nur noch der Stack Pointer, der ein 16-Bit-Register darstellt, und
die Index-Register IX und IY, welche ebenfall≤ 16-Bit-Register sind.
Fazit: Pumpe! Nix mehr drin! Keine M|glichkeit! Schei~ Idee! Bl|der Arti-
kel !
--- S T O P ---
Was hei~t hier STOP? Is doch so, oder gibt's da noch 'ne M|glichkeit ?
Okay, also ich denke, jeder Insider der Programmierkunst hat schon l{ngst
kapiert, worauf ich hinaus will. Es gibt da n{mlich noch eine Variante.
Jedes Assemblerbuch f}r den Z80 verschweigt sie, kaum ein Assembler kann
die Befehle }bersetzen, und von den Reaktionen der Disassembler wollen wir
besser gar nicht erst reden. To cut a long story short : Die Index-Regis-
ter lassen sich in jeweils zwei 8-Bit Register zerlegen, in ein Low- und
ein High-Byte sozusagen. Das ist zwar schon seit l{ngerer Zeit bekannt
(ca. '87), aber niemand schreibt mal ausf}hrlich dar}ber.
Es gibt nun einen ganzen Sack voller Befehle f}r die zerlegten Register on
IX und IY. Wir wollen die zerlegten Register der Verst{ndlichkeit halber
wie folgt kennzeichnen :
Das Lowbyte des IX-Registers mit IXL und das Highbyte des selben Index-Re-
gisters mit IXH. Bei dem IY-Register verfahren wir genauso - IYL und IYH.
Diese Bezeichnung habe ich nicht nur der Verst{ndlichkeit halber gew{hlt,
denn einfacher w{re da sicherlich XH/XL und YH/YL, sondern vielmehr, weil
diese Mnemonics auch der Assembler aus der CPC-AI }bersetzt ( BRDL - CPC-
Assembler v4.2 '91 ).
Das Verst{ndnis der Befehle ist f}r jeden, der sich in Assembler auskennt,
sehr einfach.
Es stehen die selben Befehle zur Verf}gung, die auch f}r die 8-Bit Regs H
& L zur Verf}gung stehen (bis auf zwei Ausnahmen).
In CPC-Maschinensprache }bersetzen lassen sich die Befehle wie folgt :
Man sucht sich den Befehl, der mit einem der zerlegten Index-Registerteile
ausgef}hrt werden soll,als Befehl f}r das entsprechende Teil des Doppelre-
gister HL, d.h. f}r IXH oder IYH sucht man den zutreffenden Befehl f}r das
H-Register, und f}r IXL oder IYL den Befehl f}r das L-Register.
Ist der entsprechende Befehl gefunden, dann nimmt man den Maschinencode
desselben und setzt davor das Byte, welches das zutreffende Index-Register
kennzeichnet, und zwar f}r das IX-Reg. trifft das Byte &DD und f}r das IY-
Reg. das Byte &FD zu.
Das woll'n wir uns mal praktisch ansehen:
1. Ich will den Befehl LD IXH,C anwenden (in das highere Registerteil des
zerlegten Index-Registers IX soll der Wert aus dem C-Register geladen wer-
den). Ich suche also den entsprechenden Befehl mit dem HL-Register, das
ergibt nun L─ H,C. Im Maschinencode ist das &61 und da der Befehl mit dem
IXH ausgef}hrt werden soll, ergibt sich &DD &61 ( LD IYH,C w{re demzufol-
ge &FD &61 ).
2. Praktisches Beispiel :
Nehmen wir den Befehl LD IYL,xx (in das 8-Bit-Register soll ein x-beliebi-
ger Wert geladen werden ), d.h.
LD IYL,xx = &FD, &2E, xx (LD L,xx = &2E);
der Befehl LD IXL,xx w{re dementsprechend &DD, &2E, xx .
Aller guten Dinge sollen angeblich drei sein, na sch|n:
- SET 3,IYH = &FD, &CB, &DC (SET 3,H = &CB, &DC).
Ich habe zwei verwandte Befehlstypen gefunden, bei denen es nicht m|glich
ist dieses Prinzip anzuwenden.
Es handelt sich dabei um OUT- und IN-Befehle. Sie sind f}r die 8-Bit-Re-
gister der Index-Register nicht anwendbar !
Hier nun eine Liste der anwendbaren Befehle :
ADD, ADC, AND, BIT, CP, DEC, INC, OR, RES, RL, RLC, RR, RRC, SBC, SET,SLA,
SRA, SRL, SUB, XOR und nat}rlich eine Vielzahl von LD-Befehlen.
Ich hoffe, ich habe keinen Befehl vergessen. Jedenfalls k|nnen aus den
oben aufgez{hlten Befehlen die Befehle f}r die 8-Bit-Register der Index-
Register gebildet werden.
Diese Formel ist allgemein g}ltig :
IR-Byte (IR-Byte steht f}r das Byte, welches das Index-Register kennzeich-
net: &DD oder &FD), den vom HL-Register abgeleiteten Befehl (H-Reg. ent-
spricht dem Highbyte des Index-Registers, und das L-Reg. entspricht dem
Lowbyte des Index-Registers) (+ evtl. Wert, bei 'LD ...,Wert' z.B.)
Na, alle Klarheiten beseitigt ?
Ein Hinweis noch :
Da viele Assembler die Befehle nicht }bersetzen k|nnen (sie hei~en nicht
umsonst undokumentierte Befehle), mu~ man die Assembler sozusagen }berlis-
ten. Statt INC IXL mu~ man in diesem Falle DEFB &DD und danach INC L in
den Source-Code quetschen. Das kann dann jeder halbwegs intelligente As-
sembler verstehen und }bersetzen.
Wenn man es sich mal }berlegt, so ist es doch ganz logisch, da~ jedes 16-
Bit-Register am CPC ein Doppelregister sein mu~ und man es demzufolge in
zwei 8-Bit-Register splitten kann. Der CPC ist halt nur ein 8-Bit-Compu-
ter !
Vielleicht findet jemand von Euch noch ein paar Befehle, mit denen es m|g-
lich wird, auch den StackPointer in zwei 8-Bitter zu zerlegen.
So, das war's dann von mir f}r diese Ausgabe der CPC-Challenge. In zwei
Wochen geht's erst mal ab }ber'n gro~en Teich. The Twins are traveling to
America, cause of this we can't meet you on CeBIT '93, sad.
RED DRAGON
PS.: Mich w}rden ja mal die sagenumwobenen illegalen Befehle interessie-
ren, aber nicht so etwas wie IVECT oder {hnliche Verarschungen.