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 >
Text File  |  1998-02-03  |  7KB  |  121 lines

  1.  
  2.            RED DRAGON auf der Suche nach dem Undokumentierten
  3.            --------------------------------------------------
  4.  
  5. Jeder,  der in Assembler programmiert,  stand irgendwann schon mal vor dem
  6. Problem: Alle 8-Bit-Register voll, aber man braucht noch  unbedingt eines,
  7. um einen wichtigen Wert zu sichern oder unterzubringen.    Abhilfe schafft
  8. hier meist nur v|lliges Umstrukturieren der  Routine oder PUSHen und POPen
  9. der oder des Wertes, was meist zu neuen Komplikationen f}hrt.
  10. Also gehen wir nochmals alle Register durch:
  11.  
  12. Die Register A, B & C, D & E, H & L sind bereits restlos gef}ll⌠  (mal an-
  13. genommen).
  14. F w{re  noch da-  so'n Quatsch!  1. kein direkter Zugriff,  und 2. wird es
  15. durch verschiedene Operationen beeinflu~t.
  16. Das Refresh-Register ist ebenfalls ungeeignet, da es bei jedem Takt-Zyklus
  17. der CPU um den Wert 1 erh|ht wird.
  18. Da is doch noch so'n  I-Register }berfl}ssig,  joh, das  InterruptRegister
  19. ist schon mal ganz brauchbar, aber leider l{~t es sich nur }ber das  A-Re-
  20. gister ansprechen, aber als Sicherungs-Register f}r den Akkumulator ist es
  21. brauchbar; leider sind Befehle wiσ  LD C,I  o.{. nicht bekannt, und leider
  22. l{~t sich das Interrupt-Register  auch nicht arithmetisch  behandeln, Bit-
  23. Opperationen sind ebenfalls undenkbar.
  24. W{ren nur noch der  Stack Pointer, der  ein 16-Bit-Register darstellt, und
  25. die Index-Register IX und IY, welche ebenfall≤ 16-Bit-Register sind.
  26.  
  27. Fazit: Pumpe! Nix mehr drin! Keine M|glichkeit! Schei~ Idee!  Bl|der Arti-
  28. kel !
  29. ---   S T O P   ---
  30. Was hei~t hier STOP? Is doch so, oder gibt's da noch 'ne M|glichkeit ?
  31.  
  32. Okay, also ich denke, jeder Insider der  Programmierkunst hat schon l{ngst
  33. kapiert, worauf ich hinaus will. Es gibt da n{mlich noch eine Variante.
  34. Jedes Assemblerbuch f}r den Z80  verschweigt sie, kaum  ein Assembler kann
  35. die Befehle }bersetzen, und von den Reaktionen der Disassembler wollen wir
  36. besser gar nicht erst reden. To cut a long story short :  Die Index-Regis-
  37. ter lassen sich in jeweils  zwei 8-Bit Register zerlegen, in ein  Low- und
  38. ein High-Byte  sozusagen. Das ist  zwar schon  seit l{ngerer Zeit  bekannt
  39. (ca. '87), aber niemand schreibt mal ausf}hrlich dar}ber.
  40. Es gibt nun einen ganzen Sack voller Befehle f}r die zerlegten Register on
  41. IX und IY. Wir wollen  die zerlegten Register der  Verst{ndlichkeit halber
  42. wie folgt kennzeichnen :
  43. Das Lowbyte des IX-Registers mit IXL und das Highbyte des selben Index-Re-
  44. gisters mit IXH. Bei dem IY-Register verfahren wir genauso -  IYL und IYH.
  45. Diese Bezeichnung habe ich nicht nur der Verst{ndlichkeit  halber gew{hlt,
  46. denn einfacher w{re da sicherlich XH/XL und YH/YL, sondern vielmehr,  weil
  47. diese Mnemonics auch der Assembler aus  der CPC-AI }bersetzt ( BRDL - CPC-
  48. Assembler v4.2 '91 ).
  49.  
  50. Das Verst{ndnis der Befehle ist f}r jeden, der sich in Assembler auskennt,
  51. sehr einfach.
  52. Es stehen die selben Befehle zur Verf}gung, die auch f}r die 8-Bit Regs  H
  53. & L  zur Verf}gung stehen (bis auf zwei Ausnahmen).
  54. In CPC-Maschinensprache }bersetzen lassen sich die Befehle wie folgt :
  55. Man sucht sich den Befehl, der mit einem der zerlegten Index-Registerteile
  56. ausgef}hrt werden soll,als Befehl f}r das entsprechende Teil des Doppelre-
  57. gister HL, d.h. f}r IXH oder IYH sucht man den zutreffenden Befehl f}r das
  58. H-Register, und f}r IXL oder IYL den Befehl f}r das L-Register.
  59. Ist der  entsprechende Befehl gefunden, dann  nimmt man den  Maschinencode
  60. desselben und setzt davor das Byte, welches das zutreffende Index-Register
  61. kennzeichnet, und zwar f}r das IX-Reg. trifft das Byte &DD und f}r das IY-
  62. Reg. das Byte &FD zu.
  63. Das woll'n wir uns mal praktisch ansehen:
  64.  
  65. 1. Ich will den Befehl LD IXH,C anwenden (in das  highere Registerteil des
  66. zerlegten Index-Registers IX soll der Wert aus dem C-Register geladen wer-
  67. den).  Ich suche also den  entsprechenden Befehl mit dem  HL-Register, das
  68. ergibt nun L─ H,C. Im Maschinencode ist das &61 und da der  Befehl mit dem
  69. IXH ausgef}hrt werden soll, ergibt sich &DD &61  ( LD IYH,C w{re demzufol-
  70. ge &FD &61 ).
  71.  
  72. 2. Praktisches Beispiel :
  73. Nehmen wir den Befehl LD IYL,xx (in das 8-Bit-Register soll ein x-beliebi-
  74. ger Wert geladen werden ), d.h.
  75. LD IYL,xx = &FD, &2E, xx   (LD L,xx = &2E);
  76. der Befehl LD IXL,xx w{re dementsprechend   &DD, &2E, xx .
  77.  
  78. Aller guten Dinge sollen angeblich drei sein, na sch|n:
  79. -   SET 3,IYH = &FD, &CB, &DC   (SET 3,H = &CB, &DC).
  80.  
  81. Ich habe zwei verwandte Befehlstypen gefunden, bei denen  es nicht m|glich
  82. ist dieses Prinzip anzuwenden.
  83. Es handelt sich dabei um OUT- und IN-Befehle.  Sie sind f}r die  8-Bit-Re-
  84. gister der Index-Register nicht anwendbar !
  85. Hier nun eine Liste der anwendbaren Befehle :
  86.  
  87. ADD, ADC, AND, BIT, CP, DEC, INC, OR, RES, RL, RLC, RR, RRC, SBC, SET,SLA,
  88. SRA, SRL, SUB, XOR und nat}rlich eine Vielzahl von LD-Befehlen.
  89. Ich hoffe,  ich  habe keinen  Befehl vergessen. Jedenfalls  k|nnen aus den
  90. oben aufgez{hlten Befehlen die Befehle  f}r die 8-Bit-Register der  Index-
  91. Register gebildet werden.
  92. Diese Formel ist allgemein g}ltig :
  93. IR-Byte (IR-Byte steht f}r das Byte, welches das Index-Register kennzeich-
  94. net: &DD oder &FD), den vom HL-Register abgeleiteten Befehl   (H-Reg. ent-
  95. spricht  dem Highbyte  des Index-Registers, und das  L-Reg. entspricht dem
  96. Lowbyte des Index-Registers) (+ evtl. Wert, bei 'LD ...,Wert' z.B.)
  97.  
  98. Na, alle Klarheiten beseitigt ?
  99.  
  100. Ein Hinweis noch :
  101. Da viele Assembler die Befehle nicht  }bersetzen k|nnen (sie hei~en  nicht
  102. umsonst undokumentierte Befehle), mu~ man die Assembler sozusagen }berlis-
  103. ten. Statt INC IXL mu~ man in diesem Falle DEFB &DD und danach INC L in
  104. den Source-Code quetschen.  Das kann dann jeder halbwegs intelligente  As-
  105. sembler verstehen und }bersetzen.
  106.  
  107. Wenn man es sich mal }berlegt, so ist es doch ganz logisch, da~  jedes 16-
  108. Bit-Register am CPC ein  Doppelregister sein mu~ und man  es demzufolge in
  109. zwei 8-Bit-Register splitten kann. Der CPC ist  halt nur ein  8-Bit-Compu-
  110. ter !
  111. Vielleicht findet jemand von Euch noch ein paar Befehle, mit denen es m|g-
  112. lich wird, auch den StackPointer in zwei 8-Bitter zu zerlegen.
  113. So, das war's dann von mir  f}r diese Ausgabe  der CPC-Challenge.  In zwei
  114. Wochen geht's erst mal ab }ber'n gro~en Teich. The Twins are  traveling to
  115. America, cause of this we can't meet you on CeBIT '93, sad.
  116.  
  117. RED DRAGON
  118.  
  119. PS.:   Mich w}rden ja mal die sagenumwobenen illegalen Befehle interessie-
  120. ren, aber nicht so etwas wie IVECT oder {hnliche Verarschungen.
  121.