home *** CD-ROM | disk | FTP | other *** search
/ Commodore Disc 53 / Commodore_Disc_53_19xx_-_de.d64 / lektion6 < prev    next >
Text File  |  2022-10-26  |  5KB  |  101 lines

  1. /* Lektion6
  2.  
  3. Arithmetik und Logik
  4.  
  5. Die Rechenoperationen in CP sind weniger zum Programmieren von Rechenprogrammen gedacht. Fuer Berechnungen von Datenadressen reichen positive ganze Zahlen von 0 bis 0xffff (65535) vollkommen aus, sowie die Grundrechenarten +, -, *, / und %. Der Operator % bedeutet keine Prozentrechnung, sondern eine Division, die den uebrigbleibenden Rest als Ergebnis liefert. Es gibt keine Punkt- vor Strichrechnung. Alle Operationen werden der Reihe nach ausgefuehrt. Bevor der Rechenbefehl erfolgt, muessen sich die Daten bereits in den Registern befinden.
  6.  
  7. Register
  8. --------
  9. CP besitzt zur Wertaufnahme zwei Register. Betrachten wir uns einmal die Berechnung a=5+3. In CP wuerde dieses lauten:
  10.  
  11. 5 3 + a =
  12.  
  13. Werte werden an das Hauptregister HR uebergeben. Der Wert 5 wandert also in HR. Damit nicht genug, bei der Wertaufnahme wird ausserdem zuvor der fruehere Inhalt von HR an das Nebenregister NR weitergegeben. Nach 5 3 befindet sich 5 in NR und 3 in HR. Arithmetische und logische Befehle, die zwei Werte verknuepfen, legen das Ergebnis in HR ab. Nach 5 3 + befindet sich das Ergebnis 8 in HR. Der neue Wert a schiebt die 8 in NR weiter und legt die Adresse der Variablen a in HR ab. Was die Zuweisung '=' bewirkt, wurde erst teilweise besprochen. Sie uebergibt naemlich nicht nur den Inhalt von NR an die in HR enthaltene Adresse, sondern schiebt zusaetzlich den Inhalt von NR danach wieder in HR zurueck. Dadurch sind auch Mehrfachzuweisungen und Zwischenspeicherungen moeglich:
  14.  
  15. 5 a = b =
  16.  
  17. Dies entspricht in BASIC a=5:b=a.
  18.  
  19. Nur maximal zwei Werte koennen von den Registern aufgenommen werden. Nach 1 2 3 befindet sich der Wert 2 in NR und 3 in HR, der Wert 1 ist nicht mehr vorhanden. Operationen wie a=5+3*4 sind, soll die Reihenfolge nicht veraendert werden, mit Hilfe von Klammern moeglich:
  20.  
  21. 5 ( 3 4 * ) + a =
  22.  
  23. Durch die oeffnende Klammer wird HR auf einen Stapel gesichert. Die schliessende Klammer holt den gesicherten Wert vom Stapel zurueck, legt ihn allerdings nicht in HR sondern in NR ab, woraufhin die Verknuepfung + so erfolgen kann, als waere zur 5 lediglich ein neuer Wert 12 hinzugekommen. Es koennen ohne weiteres mehrere klammern geschachtelt werden. Aus Klammern darf nicht einfach mit go oder return herausgesprungen werden. Sov viele Klammern wie geoeffnet wurden, muessen auch wieder geschlossen werden, sonst kommt es unweigerlich zum Programmabsturz.
  24.  
  25. Manchmal moechte man auch gerne noch den Inhalt von NR verwenden, an den so einfach nicht ranzukommen ist, oder die Registerinhalte vertauschen. Hierfuer gibt es den Befehl swap:
  26.  
  27. 5 a =
  28. a 5 swap =
  29.  
  30. Eine Funktion kann durch Vertauschung mittels swap einen Wert in einer durch NR uebergebenen Adresse speichern. Von besonderer Bedeutung ist swap fuer Vergleiche mit nachfolgenden Verzweigungen. Verknuepfungsbefehle ausser / und % lassen naemlich den Inhalt von NR unveraendert, sodass dieser wieder in HR zurueckgeholt werden kann.
  31.  
  32. Logische Befehle
  33. ----------------
  34. Logische Verknuepfungen sind and, or und xor. Die ersten beiden sind auch von BASIC her bekannt, da sie fuer logische Aussagen von Bedeutung sind. Sie lassen sich aber auch zur Bitmanipulation einsetzen. Der Befehl xor, fuer den es beim BASIC des C128 die eor-Funktion gibt, ist dann wahr, wenn genau eine von zwei Aussagen wahr ist. Waehrend bei Bitmanipulationen and zum Nullsetzen und or zum Einssetzen dient, koennen durch xor Bits invertiert werden.
  35.  
  36. Vergleiche
  37. ----------
  38. Besonders wichtig fuer die Programmlogik sind Vergleiche. Die Vergleichsbefehle lauten ==, <>, <, >, <= und >=.
  39. Auffallend sind die zwei Gleichheitszeichen beim Gleichheitsoperator. Schliesslich muss dieser ja von der Zuweisung '=' unterschieden werden. Als Ergebnis wird eine Null bei Nichtzutreffen erhalten, der Wert 0xffff beim Zutreffen. Da Vergleichsbefehle NR nicht beeinflussen, laesst sich durch swap oft die Verwendung einer Variablen sparen:
  40.  
  41. getc '1' == if lab1
  42. swap '2' == if lab2
  43. swap '3' == if lab3
  44.  
  45. Weitere Operatoren
  46. ------------------
  47. Einige Operatoren verknuepfen nicht zwei Werte, sondern veraendern nur einen, naemlich den in HR.
  48.  
  49. >>  entspricht 2 /
  50. <<  entspricht 2 *
  51. not entspricht 0xffff xor
  52. neg entspricht not 1 + ( bzw. 0 swap -)
  53. abs entspricht neg fuer Werte groesser gleich 0x8000. Ansonsten bleibt HR unveraendert.
  54.  
  55. Diese Befehle sparen nicht nur Schreibarbeit, sondern auch Klammern:
  56.  
  57. 3 ( 5 2 * ) + a =
  58. 3 5 << + a =
  59.  
  60. Zuweisungsoperationen
  61. ---------------------
  62. Befehle, die Operationen mit Zuweisungen kombinieren, tragen zu Schnelligkeit und Kuerze bei:
  63.  
  64. a ] 2 + a =
  65.  
  66. Dieses laesst sich kuerzer ausdruecken durch:
  67.  
  68. 2 a +=
  69.  
  70. Es gibt die Befehle +=, -=, /=, %=, or=, and=, xor=, <<= und >>=. Die Kennung 'by' davor gibt an, dass eine Bytezuweisung erfolgen soll.
  71.  
  72. Ein kurzes Beispiel, das den wichtigen Vergleichsbefehl == und swap benuetzt, nimmt Ihre Eingaben an und schreibt sie auf den Bildschirm, bis Sie die Returntaste druecken.
  73. */
  74.  
  75.  
  76. def cls 147 putc;
  77.  
  78. void putc( )
  79. begin
  80.   ac by = 0xffd2 sys
  81. bend
  82.  
  83. char getc( )
  84. begin
  85.   0xffe4 sys ac by ]
  86. bend
  87.  
  88. char key( )
  89. begin
  90. : next getc nif next
  91. bend
  92.  
  93. main()
  94. begin
  95.   cls go rd
  96. : wr swap putc
  97. : rd key '/n' == nif wr
  98. bend
  99.  
  100. /* Weiter mit lektion7 */
  101.