home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings / listing2a.s < prev    next >
Text File  |  1977-12-31  |  19KB  |  390 lines

  1.  
  2. ; Listing2a.s - Dieses Programm registriert im Byte "Zaehler", wie
  3. ; oft die  rechte  Maustaste  gedrückt wurde, oder, besser noch, wie lange
  4. ; sie gedrückt wurde, denn wenn sie gedrückt bleibt, zählt der Zähler
  5. ; trotzdem weiter, um auszusteigen linke Maustaste
  6.  
  7. Anfang:
  8.     btst    #2,$dff016    ; POTINP - rechte Maustaste gedrückt?
  9.     beq.s    Dazu        ; Wenn ja, springe zu Dazu
  10.     btst    #6,$bfe001    ; Linke Maustaste gedrückt?
  11.     bne.s    Anfang        ; Wenn nicht, springe zu Anfang zurück
  12.     rts            ; Wenn hingegen ja, dann steige aus!
  13.  
  14. Dazu:
  15.     move.b    Zaehler,$dff180 ; Gib den Wert von Zaehler in Farbe 0
  16.                 ; (COLOR0)
  17.     addq.b    #1,Zaehler    ; Inkrementiere Zaehler um 1 (zählt 1 dazu)
  18.     bra.s    Anfang        ; Springe (immer) zu Anfang zurück
  19.  
  20. Zaehler:
  21.     dc.b    0        ; Dieses Byte ist unser Zähler
  22.  
  23.     END            ; Mit END wird das Ende des Listings
  24.                 ; markiert, alles, was folgt, wird vom
  25.                 ; Assembler nicht mehre interpretiert
  26.  
  27. Bemerke: POTINP ist der Name des Registers $dff016. Der (großgeschriebene)
  28.          Name  nach dem Strichpunkt  bezieht  sich immer  auf ein $dffxxx-
  29.          Register.
  30.  
  31. In diesem Beispielprogramm erkennt man die Verwendung der Label sei es als
  32. Kennzeichnung  von  Befehlen  (bne.s Anfang, bra.s Anfang...), wie auch um
  33. Bytes  anzusprechen  (addq.b  #1,Zaehler).  Es  besteht  kein  Unterschied
  34. zwischen  der  Label Anfang und der Label Zaehler: beides sind Label, also
  35. NAMEN, DIE EINEN BESTIMMTEN PUNKT IM SPEICHER MARKIEREN,  OB  ES  NUN  EIN
  36. BYTE ODER EINE REIHE VON BEFEHLEN ODER SONST ETWAS IST. DAMIT KANN MAN DIE
  37. BEFEHLE UNTER DEM LABEL AUSFÜHREN ODER AUCH NUR DAS BYTE  NACH  DEM  LABEL
  38. VERÄNDERN.  Ich habe bemerkt, daß es vielen Schwierigkeiten bereitet, sich
  39. mit dieser Logik vertraut zu machen. Machen wir einige  Beispiele  um  die
  40. Rolle  der  Labels  genauer  zu verstehen: stellt euch vor, ihr habt einen
  41. kleinen Schrebergarten, der eingezäunt ist, und in dessen  Mitte  verläuft
  42. ein   kleiner  Weg.  Nachdem  ihr  ihn  umgegraben  habt,  beschließt  ihr
  43. Erdbeeren, Kohl, Rüben und Petersilie zu pflanzen, also teilt ihr  ihn  in
  44. vier gleich große Rechtecke ein und streut den Samen aus. Um zu wissen, wo
  45. das  verschiedenen  Grünzeug  wächst,  verwendet   man   meistens   solche
  46. Plastiktäfelchen  mit  einem  Spitz  unten  dran,  auf  dem  ein  Foto der
  47. Erdbeere/Kohl... ist. Man steckt sie dann  in  die  Erde,  ihr  kennt  die
  48. Dinger   doch..?   Also  pflanzen  wir  sie:  Auf  einem  Täfelchen  steht
  49. ERDBEEREN:, auf dem anderen KOHL:, dem nächsten RUEBEN:  und  dem  letzten
  50. PETERSILIE:.  Wir  haben  die  Etiketten  so in die Erde gesteckt, daß sie
  51. jeweils den ANFANG des abgebildeten Gemüses markieren, und somit  zugleich
  52. das ENDE des vorherigen.
  53.  
  54. ERDBEEREN:          KOHL:            RUEBEN:         PETERSILIE:
  55.    \/                \/                \/                \/
  56.     ..................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-_-_-_-_-_-_-_
  57.  
  58.  
  59. Wenn wir die "...." als Erdbeeren ansehen, den Kohl als "oooo", die  Rüben
  60. als  "^^^^" und die Petersilie als "-_-_", dann wird ein "BNE KOHL" soviel
  61. bedeuten wie "GEHE ZUR ETIKETTE KOHL:", und nicht "renn´ mitten  ins  Beet
  62. hinein",  oder  "gehe  in  Richtung  KOHL:".  Einzi  und  allein "GEHE ZUM
  63. TÄFELCHEN MIT DER AUFSCHRIFT KOHL: UND  FÜHRE  DIE  BEFEHLE,  DIE  FOLGEN,
  64. AUS",  in  diesem  Fall werden wir die "oooo" ausführen. Wenn das Label so
  65. verwendet wird:
  66.  
  67.     addq.b    #1,RUEBEN
  68.  
  69. Da tun wir nichts anderes als einen Samen im ersten Byte nach der Etikette
  70. dazuzufügen,  es  ändert  aber  nicht  seine  Funktion!  Es bedeutet nicht
  71. Inhalte oder andere komische Dinge!!! Es markiert  immer  einen  Punkt  im
  72. Speicher, also des Listings, das in unserem Fall der Anfang der Rüben ist.
  73. Probieren wir mal, ein MOVE.B ERDBEEREN,RUEBEN zu machen:
  74.  
  75. ERDBEEREN:          KOHL:            RUEBEN:         PETERSILIE:
  76.    \/                \/                \/                \/
  77.     ..................oooooooooooooooooo.^^^^^^^^^^^^^^^^^-_-_-_-_-_-_-_-_-_
  78.  
  79.     |                                   |
  80.      \------->--------->-------->------>
  81.  
  82. Wie ihr seht, ist ein ".", also das Byte nach ERDBEEREN:,  ins  Byte  nach
  83. RUEBEN: kopiert worden. Versuchen wir nun ein MOVE.W KOHL,ERDBEEREN
  84.  
  85. ERDBEEREN:          KOHL:            RUEBEN:         PETERSILIE:
  86.    \/                \/                \/                \/
  87.     oo................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-_-_-_-_-_-_-_
  88.  
  89.     ||                ||
  90.      \<----<----<-----/
  91.  
  92. Wir haben die ersten zwei "oo", die  sich  nach  KOHL:  befanden,  in  die
  93. ersten zwei Bytes nahc ERDBEEREN: kopiert.
  94.  
  95. Wenn  man  einen  Punkt  zwischen  zwei Labels lesen/scheiben möchte, dann
  96. brauchtr man nur ein weiteres hinzufügen: um 4 Bytes Kohl  mitten  in  die
  97. Rüben  zu  geben, werden wir in der Mitte der Rüben ein neues Label namens
  98. RUE2: pflanzen, und danach ein MOVE.L KOHL,RUE2
  99.  
  100. Vorher:
  101.  
  102. ERDBEEREN:          KOHL:            RUEBEN:  RUE2:  PETERSILIE:
  103.    \/                \/                \/      \/        \/
  104.     ..................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-_-_-_-_-_-_-_ 
  105.  
  106. Nachher:
  107.  
  108. ERDBEEREN:          KOHL:            RUEBEN:  RUE2:  PETERSILIE:
  109.    \/                \/                \/      \/        \/
  110.     ..................oooooooooooooooooo^^^^^^^^oooo^^^^^^-_-_-_-_-_-_-_-_-_
  111.                       ||||                      ||||
  112.                        \\\\ ---->---->----->-- ////
  113.  
  114. Wir haben die ersten 4 Bytes von KOHL: in die ersten 4  Bytes  nach  RUE2:
  115. kopiet. Das .L bedeutet eben 4 Bytes...
  116.  
  117. Es  funktioniert  auf  die  gleiche Art und Weise, als wenn man die realen
  118. Adressen  verwenden  würde,  wie   schon   in   LEKTION1   erklärt   (WORT
  119. PEDAL>PORTAL),  nur  daß  anstatt  mit den Adressen, bei denen jeder Samen
  120. eine eigene hat,  mit  Etiketten,  also  Labels,  gearbeitet  wird.  Unter
  121. Verwendung der Adressen:
  122.  
  123. ERDBEEREN:          KOHL:            RUEBEN:         PETERSILIE:
  124.    \/                \/                \/                \/
  125.     ..................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-_-_-_-_-_-_-_ 
  126.     123456789012345678901234567890123456789012345678901234567890123456789012
  127.              111111111122222222223333333333444444444455555555556666666666777
  128.  
  129. Wenn man mit Adressen arbeitet, kann man 4 Bytes von jeder Stelle an jede
  130. Stelle kopieren, z.B. von Stelle 25 zu Stelle 60: Move.L 25,60
  131.  
  132. ERDBEEREN:          KOHL:            RUEBEN:         PETERSILIE:
  133.    \/                \/                \/                \/
  134.     ..................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-oooo_-_-_-_-_
  135.     123456789012345678901234567890123456789012345678901234567890123456789012
  136.              111111111122222222223333333333444444444455555555556666666666777
  137.                             ||||                               ||||
  138.                              \\\\ --->---->---->---->--->---> ////
  139.  
  140. Die gleiche Operation läßt sich aber auch durchführen, indem man ein Label
  141. an Position 25 und eines an Position 60 gibt:
  142.  
  143.                          Label1:                            Label2:
  144.                            \/                                 \/
  145.     ..................oooooooooooooooooo^^^^^^^^^^^^^^^^^^-_-_-oooo_-_-_-_-_
  146.                             ||||                               ||||
  147.                              \\\\ --->---->---->---->--->---> ////
  148.  
  149. Wieso man Labels den Adressen  vorgezogen  hat?  GANZ  EINFACH!  Wenn  wir
  150. Adressen  verwendet  hätten,  und  zwischen  dem  Kohl und den Rüben etwas
  151. eingefügt hätten, dann wäre die Adresse nicht mehr 60 gewesen, aber irgend
  152. eine  andere  Zahl,  z.B.  80,  und wir hätten alle Adressen ändern müßen,
  153. indem wir sie "nach vorne" schieben, um das Stück  reinzupassen.  Mit  den
  154. Labels  hingegen  macht  uns ein Stück mehr oder weniger dazwischen nichts
  155. aus, da der Assembler erst beim Assemblieren die realen Adressen zuteilt.
  156.  
  157. Probiert dieses Programm auszuführen, das erste Mal ohne den Mausknopf  zu
  158. drücken,  nur  die  linke  Taste  zum  Aussteigen: das Byte ZAEHLER ist in
  159. diesem Fall 0 geblieben, wie man einfach mit  dem  Befehl  M  sehen  kann.
  160. Dieser  Befehl  zeigt die effektiven Werte in den Speicherzellen byteweise
  161. an. Aufgerufen wird er z.B. mit M  $50000  oder  M  Label:  wir  werden  M
  162. Zaehler  tippen,  und  0  erhalten,  gefolgt  von  anderen Zahlen, die die
  163. folgenden Bytes darstellen, uns aber nicht interessieren. Um  im  Speicher
  164. voran  zu  kommen,  drückt  öfters RETURN, um auszusteigen, ESC. Die Bytes
  165. werden natürlich in Hexadezimal angezeigt. Assembliert von neuem mit A und
  166. drückt  diesmal einige Male die rechte Maustaste, bevor ihr aussteigt (mit
  167. der linken Taste): wenn ihr jetzt M Zaehler eingebt, werdet ihr eine  Zahl
  168. verschieden von 0 erhalten, der der Anzahl der Zyklen entspricht, in denen
  169. die Maustaste gedrückt war. Diese Zyklen werden vom Prozessor sehr schnell
  170. ausgeführt,  und  auch wenn ihr nur einen Augenblick lang die rechte Taste
  171. drückt, werdet ihr  eine  Zaahl  größer  als  eins  erhalten.  Es  ist  zu
  172. beachten,  daß  der  Zähler  ein Byte groß ist, also einen Maximalwert von
  173. $FF, also 255 oder %11111111 erreichen kann, danach startet er wieder  von
  174. 0  (wenn  man  mit  dem  dazuzählen  fortfährt).  $FF+1=0,  $ff+2=1... Die
  175. Evolution  dieses  Programmes  gegenüber  dem  vorherigen  ist  die  etwas
  176. komplexere  Struktur  der  bedingten  Sprünge, und ich rate euch, ja nicht
  177. fortzufahren, bis ihr das nicht verstanden habt! Weiters wird ein Byte als
  178. Variable   verwendet.   Diese   Byte,  Zaehler  genannt,  wird  nicht  nur
  179. beschrieben, sondern auch gelesen, um dessen Wert in das Register $dff180,
  180. Color0, einzutragen. Jetzt beginnt man zu verstehen, wie es einem Programm
  181. möglich ist, verschiedene Werte zu speichern, die  von  Nutzen  sind,  wie
  182. etwa  die  Leben  von  Player1,  seine  energie,  seine  Punkte,  etc. Die
  183. Verwendung von Labels ist dem Programmierer nützlich, das Programm  selbst
  184. aber,  einmal  assembliert,  wird nur eine Serie von Bytes werden, die der
  185. 68000er lesen kann. Sie werden als Befehle  interpretiert,  die  sich  auf
  186. eine  direkte  Adresse beziehen: um das bestätigt zu bekommen, assembliert
  187. das Programm und macht ein D Anfang... So wird das Programm sichtbat,  wie
  188. es  in  Wirklichkeit  ist:  an  Stelle der Label finden wir die EFFEKTIVEN
  189. Adressen. Die erste Zahlenkolonne links sind die realen Adressen, die  wir
  190. gerade  lesen,  die zweite Kolonne zeigt die Befehle in ihrer REALEN Form,
  191. also eine reine Bytesequenz (z.B. wird die erste Zeile BTST #2,$dff016  im
  192. Speicher  so  aussehen:  0839000200dff016, wobei $0839 BTST bedeutet, 0002
  193. ist das #2, 00dff016 ist die angesprochene Adresse),  die  dritte  Kolonne
  194. ist  die disassemblierte Form der Befehle. Das ist genau das Gegenteil des
  195. Assemblierens: hier werden  die  Bytes  in  Befehle  wie  Add,  Move  u.ä.
  196. umgewandelt.  Um  zu Beweisen, daß die Befehle ganz bestimmte Zahlenfolgen
  197. werden, tauscht die erste Zeile folgendermaßen aus:
  198.  
  199.     btst    #2,$dff016    ; POTINP - rechte Maustaste gedrückt?
  200.  
  201. Ersetzen durch:
  202.  
  203.     dc.l    $08390002,$00dff016  
  204.  
  205. oder:
  206.  
  207.     dc.w    $0839,$0002,$00df,$f016
  208.  
  209. oder:
  210.  
  211.     dc.b    $08,$39,$00,$02,$00,$df,$f0,$16  
  212.  
  213.  
  214. In allen Fällen ist das Resultat 0839000200dff016  im  Speicher,  was  vom
  215. 68000  als  "btst  #2,$dff016"  interpretiert  wird,  also  "ist Bit 2 von
  216. $dff016 Null?".
  217.  
  218. Wenn die Variabel ein Word anstatt  ein  Byte  wäre,  würde  das  Programm
  219. folgendermaßen aussehen:
  220.  
  221. Anfang:
  222.     btst    #2,$dff016    ; POTINP - rechte Maustaste gedrückt?
  223.     beq.s    Dazu        ; Wenn ja, springe zu Dazu
  224.     btst    #6,$bfe001    ; Linke Maustaste gedrückt?
  225.     bne.s    Anfang        ; Wenn nicht, springe zu Anfang zurück
  226.     rts            ; Wenn hingegen ja, dann steige aus!
  227.  
  228. Dazu:
  229.     move.w    Zaehler,$dff180 ; Farbe 0 - Ein .W beim move verwenden!
  230.                 ; (COLOR0)
  231.     addq.w    #1,Zaehler    ; ADDQ.W statt ADDQ.b!!!
  232.     bra.s    Anfang        ; Springe (immer) zu Anfang zurück
  233.  
  234. Zaehler:
  235.     dc.w    0        ; Dieses Byte ist unser Zähler
  236.  
  237.  
  238. Da der Zähler nun ein Word groß ist, kann er maximal 65535 enthalten,  das
  239. entspricht $FFFF oder %1111111111111111.
  240.  
  241. Wenn  wir  ein Longword als Zaehler verwenden würden, dann hätte $FFFFFFFF
  242. Platz, also ein paar Miliarden, bevor er wieder auf 0 springen  würde.  Es
  243. ist  aber aufzupassen, denn das höchstwertigste Bit (also das 31. im Falle
  244. eines Longword) wird als Vorzeichen verwendet: probiert ein ?0FFFFFFF, ihr
  245. werdet  268 Millionen und ein paar zerquetschte erhalten, und in Binärform
  246. sind die vier höchsten Bit (also die ersten vier nach dem %)  auf  0.  Die
  247. höchste Zahl die man erreichen kann, ist $7FFFFFFF, oder binär:
  248.  
  249.     ;10987654321098765432109876543210    ; Bitzahl von 0 bis 31
  250.     %01111111111111111111111111111111
  251.  
  252. Das Bit Nr. 31 (was das zweiundreisigste wäre, es zählt aber auch di NULL)
  253. ist  auf 0, während alle anderen auf 1 sind. Wenn man nun ein ?$7FFFFFFF+1
  254. macht, erhält man -2 Milliarden und Etwas, und destomehr  man  die  Ziffer
  255. erhöht,  desto  mehr  nähert man sich der 0, in der Tat erhält man mit ?-1
  256. $FFFFFFFF, mit $-2 = $FFFFFFE.
  257.  
  258. Dieses System des höchsten Bits, das als Vorzeichen wirkt, kann  auch  für
  259. Bytes  und  Words  gelten:  ein  MOVE.B  #-1,$50000  kann  auch als MOVE.B
  260. #FF,$50000  geschrieben  werden.  Das  größtmögliche   Byte   würde   also
  261. %01111111,   also   $7F->   127,   für   das   Word   gilt   das  gleiche,
  262. %0111111111111111 -> $7FFF, also 32767. Aber es hängt davon  ab,  wie  man
  263. das  Programm  schreibt,  ob  man nun die Zahlen als positive und negative
  264. ansieht oder absolut.
  265.  
  266. Probiert, das Listing so abzuändern, daß Zaehler: ein Word wird, wie  oben
  267. beschrieben:  ihr  könnt  die Editorfunktionen des ASMONE "AUSCHNEIDEN und
  268. EINFÜGEN" verwenden. Damit könnt ihr ein  Stück  Text  "ausschneiden"  und
  269. irgendwo  anders  "aufkleben", also "einfügen". Dafür verwendet die Tasten
  270. Amiga_rechts+b  um  den  Anfang  des  Blockes  zu   markieren,   den   ihr
  271. ausschneiden   wollt;  in  diesem  Fall  wählt  den  Teil  am  Anfang  des
  272. modifizierten Listings aus, gleich nach dem "...folgendermaßen aussehen:".
  273. Positioniert   den   Cursor   eben  über  der  Label  Anfang:  und  drückt
  274. Amiga_rechts+b.  Nun  könnt  ihr  den  Block  auswählen,  der  in  negativ
  275. erscheinen  wird,  indme  ihr  einfach mit den Pfeiltasten rauf und runter
  276. fahrt. Unter dem dc.w 0 angekommen, drückt Amiga+c, und  das  Stück  Text,
  277. das  nun  das  Listing  beinhaltet,  wandert in den Speicher. Nun geht zum
  278. Anfang des Listings, durch Pfeil_rauf+SHIFT, und drückt Amiga+i... Wie von
  279. Zauberhand  erscheint  eine  Kopie  des  Textes, den ihr vorhin ausgewählt
  280. habt. Nun müßt ihr nur noch ein  END  unter  dem  dc.w  0  setzen,  einige
  281. Leerzeichen vom limken Rand entfernt, besser noch ein TAB, um das orginale
  282. Listing auszuschließen, das ja noch den Zaehler:  mit  dem  Byte  enthält.
  283. Assembliert und Jumpt (startet es...).
  284.  
  285. P.S: Ignoriert die Zahlen, die nach jeden "J" auftauchen, einfach.
  286.      Sie werden später erklärt.
  287.  
  288. Sofort werdet ihr einen  Unterschied  beim  Aufleuchten  des  Bildschirmes
  289. feststellen,  wenn  ihr  die rechte Maustaste drückt; macht ein M Zaehler,
  290. und kontrolliert den Inhalt. Jetzt ist es ein Word, also werden jetzt  die
  291. ersten  zwei Zahlen gültig sein, also die ersten zwei Bytes. Wenn z.B. ein
  292. 00 30 erscheint, dann wird das bedeuten, daß das ADDQ.W #1,Zaehler $30 Mal
  293. ausgeführt worden ist, also 48 Mal (in Dezimal). Bei einem 02 5e $25e mal,
  294. das entspricht (?$25e) 606 Mal.
  295.  
  296. Wenn ihr keine Experten im "Ausschneiden und Einfügen" (Cut & Paste) seid,
  297. dann  übt  ein  bißchen,  indem  ihr Textteile von einem Punkt zum anderen
  298. kopiert. Beachtet auch, daß wenn ein mit Amiga_rechts+b ausgewählter  Text
  299. anstatt mit Amiga_c mit Amiga_x traktiert wird, gelöscht wird, mit Amiga_i
  300. aber  irgendwo  anders  eingefügt  werden  kann.  Ich   versichere   euch,
  301. programmieren  ist  das reinste Ausschneiden und Einfügen, da dieser Trick
  302. dir das Neuschreiben von ähnlichen Programmteilen erspart, die nur kopiert
  303. und leicht verändert werden müßen.
  304.  
  305. Auch  mit den Binärzahlen sollte man sich vertraut machen, denn auch viele
  306. Hardware-Register sind BITMAPPED, d.h. jedes Bit hat eine Bedeutung.  Hier
  307. eine Tabelle, um den Unterschied klarzumachen:
  308.  
  309.  
  310.  
  311. Hexadezimal    Binär     Dezimal
  312.     0      %00000    0
  313.     1      %00001    1
  314.     2      %00010    2
  315.     3      %00011    3
  316.     4      %00100    4
  317.     5      %00101    5
  318.     6      %00110    6
  319.     7      %00111    7
  320.     8      %01000    8
  321.     9      %01001    9
  322.        $A      %01010    10
  323.        $B      %01011    11
  324.        $C      %01100    12
  325.        $D      %01101    13
  326.        $E      %01110    14
  327.        $F      %01111    15
  328.       $10      %10000    16
  329.       $11      %10001    17
  330.       $12      %10010    18
  331.       ...       ...      ...
  332.  
  333. Wie ihr seht, folgt das Binärsystem einer einfachen Logik,  die  die  Zahl
  334. mit  einsen  füllt, bis sie zu einer 11, 111, 1111 etc. gekommen ist: nach
  335. einem %011 kommt es zu einem %100, nach einem %0111 zu einem  %1000,  nach
  336. einem  %01111  zu  einem  %10000 usw. Ich erinnere euch, daß Hexzahlen von
  337. einem $-Zeiche vorangegangen werden, die  Binärzahlen  von  einem  %.  Die
  338. Zahlen  in Dezimalformat hingegen stehen ohne nicht vorne dran. Wenn wir 9
  339. oder $9 schreiben,  meinen  wir  immer  9,  aber  es  besteht  ein  großer
  340. Unterschied  zwischen  $10  und 10!!! Denn 10 ist 10, $10 in Hex ist 16 in
  341. Dezimal! Einfacher ausgedrückt, nach dem 9 ändert ein $ mehr oder weiniger
  342. alles.  Man muß die Zahlen nicht im Kopf konvertieren können, dafür gibt´s
  343. ja den "?"-Befehl im ASMONE, der das REsultat  in  jedem  Format  ausgibt,
  344. Dezimal,  Hexadezimal,  Binär und ASCII, also in Form von Charaktern. Denn
  345. Charakter wie "abcd.."  sind  nichts  anderes  als  Bytes,  die  nach  dem
  346. ASCII-Standart  zugewiesen  sind.  So ist ein "a"=$61, während ein "A" ein
  347. $41 ist. Es ist leicht mit einem ?"a" oder einem ?$61 in der Kommandozeile
  348. nachgewiesen.
  349.  
  350. Bemerke:  Das  .s  am BNE bedeutet SHORT, also Kurz (equivalent zu .b), im
  351. Gegenteil zu .w, wenn das Label "weit" weg ist. Probiert einfach immer ein
  352. .s  zu setzen, und wenn das Label nach dem beq oder bne... zu weit weg ist
  353. (mehr als 127 Byte), dann korrigiert es der Assembler mit .w  automatisch.
  354. Um das zu testen, probiert folgende Änderung:
  355.  
  356.  
  357. Anfang:
  358.     btst    #2,$dff016    ; POTINP - rechte Maustaste gedrückt?
  359.     beq.s    Dazu        ; Wenn ja, springe zu Dazu
  360.     btst    #6,$bfe001    ; Linke Maustaste gedrückt?
  361.     bne.s    Anfang        ; Wenn nicht, springe zu Anfang zurück
  362.     rts            ; Wenn hingegen ja, dann steige aus!
  363.  
  364.     dcb.b    200,0    ; Dieser Befehl wird später erklärt, hier
  365.             ; werden einfach 200 bytes $00 im Speicher
  366.             ; zwischen dem RTS und der Label Dazu: eingefügt,
  367.             ; um die Distanz zu vergrößern.
  368.  
  369. Dazu:
  370.     move.b    Zaehler,$dff180    ; Gib den Wert von Zaehler in Farbe 0
  371.                 ; (COLOR0)
  372.     addq.b    #1,Zaehler    ; Inkrementiere Zaehler um 1 (zählt 1 dazu)
  373.     bra.s    Anfang        ; Springe (immer) zu Anfang zurück
  374.  
  375. Zaehler:
  376.     dc.b    0        ; Dieses Byte ist unser Zähler
  377.  
  378.  
  379. Beim Assemblieren werdet ihr bemerken, daß der  Assembler  ein  FORCED  TO
  380. WORD SIZE meldet. Das bedeutet, er hat das bne.s zu einem bne.w gezwungen,
  381. weil die aufgerufene Routine zu weit weg war. Ich rate euch, immer ein  .s
  382. nach  einem  BRS,  BNE,  BRA,  BEQ  und ähnlichem zu setzen, wenn es nicht
  383. stimmt, korrigiert es ja der Assembler. Man kann auch immer ein .w setzen,
  384. aber  die  .s sind schneller und verbrauchen weniger Bytes im Speicher. Um
  385. das Konzept der Label  nochmal  aufzugreifen:  das  dcb.b  200,0  ist  ein
  386. Paradebeispiel  dafür,  wie nützlich die Label sind, die uns davor bewahrt
  387. haben, die nachfolgenden Adressen alle neuzuschreiben, indem man sie  alle
  388. um 200 Bytes aufstocken hätte müßen.
  389.  
  390.