C64 Programmieren in Maschinensprache

Aus C64-Wiki
Zur Navigation springenZur Suche springen


C64 Programmieren in Maschinensprache
Cover/Buchdeckel
Sprache deutsch
Autor(en) Winfried Kassera, Frank Kassera
Verlag Markt&Technik Verlag AG
Jahr 1985
ISBN ISBN 3-89090-168-9
Neupreis DM 52,00.- SFR 47,80.- ÖS 405,60.-
Datenträger Icon disk525.png
Seitenzahl 327
letzte Auflage 1., unveränderte Auflage 1985
Genre Profi / Programmierung
Information




Vorwort[Bearbeiten | Quelltext bearbeiten]

Dieses Buch ist zunächst entstanden als Sammlung von Programmierschritten in ASSEMBLER, die sich bei der Lösung von Simulationsproblemen, Bildschirmgestaltung, Textverarbeitung usw. auf COMMODORE-Geräten ergeben hatten. Wir haben dann den Themenkreis erweitert und so gut wie alle Punkte erfaßt, die für Maschinenprogramme relevant sind.

Als Schwerpunkt hat sich dabei der Einsatz der betriebsinternen ROM-Routinen herauskristallisiert, der,die Erstellung von ASSEMBLER-Programmen wesentlich vereinfacht. Denn was es schon gibt, braucht man nicht noch einmal erfinden.

Wir sagen Ihnen aber nicht nur, wo die einzelnen Einsprungadressen liegen (das tun viele Veröffentlichungen), sondern erklären auch die Zusammenhänge anhand von sehr einfachen bis sehr anspruchsvollen Beispielen. Unser Prinzip heißt hier: Vom Einfachen zum Schweren. Und damit ergibt sich ein methodisch sinnvoller und für den Leser leicht nachvollziehbarer Aufbau.

Alle vorkommenden Routinen wurden mehrfach von Frank Kassera getestet und verbessert, der zu diesem Buch auch eine Diskette für den C64 mit allen beschriebenen Programmen zusammengestellt hat.

Trotz aller Sorgfalt und Mühe, die wir uns beim Schreiben, Testen und Korrigieren gegeben haben, ist es nicht ganz auszuschließen, daß sich in den Text der eine oder andere Tipp- oder Druckfehler eingeschlichen hat, der uns trotz mehrfacher Durchsicht entgangen ist. Wir versichern Ihnen aber, daß alle vorgestellten Programme einwandfrei laufen: Nicht ein einziges wurde nur so "auf Papier" entwickelt. Sollten Sie daher auf Unstimmigkeiten stoßen, dann könnte eventuell die Unbarmherzigkeit des Druckfehlerteufels dahinterstecken. Für einen entsprechenden Hinweis - vielleicht schon mit einem Verbesserungsvorschlag - wären wir Ihnen dankbar.

Inhaltsverzeichnis (gekürzt)[Bearbeiten | Quelltext bearbeiten]

1    Zur Programmierung in ASSEMBLER ............................ 13
1.1  Warum nicht bei BASIC bleiben? ............................. 15
1.2  Hinweise zum Gebrauch des Buches ........................... 17
1.3  Schreibweisen - Vereinbarungen ............................. 20

2    Bewegte Bildschirmobjekte .................................. 23
2.1  Ein Beispiel: "Wendezeigerpinsel", ein Richtungsanzeiger ... 25
2.2  Variieren des Moduls ....................................... 34
2.3  Abweichungen für die 40/80XX -Geräte ....................... 36
2.4  Erweiterungs- und Übungsaufgaben ........................... 37

3    Erweiterung der Interrupt-Routine - ein Beispiel ........... 39
3.1  Die IR-Routine ............................................. 41
3.2  Erzeugung eines Taktes mit der IR-Routine .................. 42
3.3  Wichtige Adressen des "04-taktmodul " ...................... 42
3.4  Ablauf von "04-taktmodul" .................................. 43
3.5  ASSEMBLER- Programm "04-taktmodul" ......................... 43
3.6  Abstimmung des Taktes ...................................... 44
3.7  Eine kleine Testroutine zur Bestimmung der Taktfrequenz .... 44
3.8  Einstellen des IRQ-Vektors ................................. 45

4    Zahlen, Variablen - Formate ................................ 49
4.1  Rechnen mit Ganzzahlen (Integer-Zahlen) .................... 51
4.2  Arbeiten mit reellen Zahlen ................................ 61
4.3  Zahlenumwandlungen ......................................... 65

5    Arithmetik mit ROM-Routinen ................................ 71
5.1  Durch 10 dividieren mit FDIV10 ............................. 74
5.2  Mit 10 multiplizieren ...................................... 75
5.3  Addieren des Werts 0.5 mit ADD0.5 .......................... 75
5.4  Addieren beliebiger Zahlen mit ADD ......................... 76
5.5  Addieren beliebiger Zahlen mit M-ADD ....................... 76
5.6  Subtrahieren mit M-SUB ..................................... 77
5.7  Vorzeichenwechsel mit FACMIN ............................... 78
5.8  Betrag einer Zahl mit FACABS ............................... 79
5.9  Multiplizieren mit M-MULT .................................. 79
5.10 Division mit M-DIV ......................................... 80
5.11 Kehrwert bilden mit M-DIV .................................. 80
5.12 Quadratwurzel ziehen mit SQRFAC ............................ 81
5.13 Potenzieren und Radizieren mit POTRAD ...................... 81
5.14 Logarithmieren mit LOGNAT .................................. 83
5.15 Exponentialrechnen mit EHOCHF .............................. 83
5.16 Erzeugen einer Zufallszahl mit ZUFALL ...................... 84
5.17 Winkelfunktionen mit SINUS, COSIN, TANG .................... 85
5.18 Umkehrung der Winkelfunktionen mit ARCTAN .................. 87
5.19 Weitere Arcusfunktionen mit ARCTAN ......................... 88
5.20 Polynomauswertung mit POLNOM ............................... 89
5.21 Wertetabellen für Funktionen mit POLNOM .................... 91
5.22 Vergleichsoperationen mit CMPFAC ........................... 94
5.23 Vorzeichenprüfung mit SGNFAC ............................... 96

6    Bildschirmoperationen ...................................... 101
6.1  Ausgabe einer Integer Zahl mit INTOUT ...................... 103
6.2  Ausgabe einer reellen Zahl mit FLPOUT ...................... 103
6.3  Ausgabe eines ASCII-Zeichens mit CHROUT (BSOUT ) ........... 104
6.4  Vorbereitete Zeichenausgaben ............................... 105
6.5  Cursorposition festlegen ................................... 105
6.6  Ausgabe eines Strings mit STROUT ........ ....... .......... 109
6.7  Umwandlung des FAC-Inhalts in einen String mit FACSTR ...... 109
6.8  Anwendung: eine PRINT USING-Routine ........................ 111
6.9  Ausgabe von Hexzahlen ...................................... 123
6.10 Bewegungssimulation - eine Kompaßanzeige ................... 124

7    Eingabe-ROM-Routinen ....................................... 135
7.1  Eingabe eines Zeichens über die Tastatur mit GETIN ......... 137
7.2  Künstlicher Cursor mit GETIN und CHROUT .................... 138
7.3  Zahleneingabe (reell) mit GETIN und STRFAC ................. 141
7.4  Eingabe mit BASIN .......................................... 143
7.5  Eingabe einer Zeile mit INLINE ............................. 145
7.6  Eingabe von Hexzahlen mit HEXINB und HEXINA ................ 148

8    Verwaltung der Variablen ................................... 151
8.1  Überblick über die BASIC-Variablen ......................... 153
8.2  Einrichten einer Variable .................................. 153

9    Variablen-Arten ............................................ 154
9.1  Struktur der Variablen ..................................... 154
9.2  Einrichten einer Variablen ................................. 154
9.3  Vereinfachungen zur Dateibehandlung ........................ 173
9.4  Behandlung von Dateien - Beispiele ......................... 174
9.5  Arbeiten mit SEQ-Dateien ................................... 175
9.6  REL-Dateien - Schreiben/ Lesen mit OUTBUS/ INBUS ........... 181
9.7  Laden eines Programmes mit LOAD und LOADXX ................. 196
9.8  Anwendung: Modul zum Nachladen von Programmen .............. 197
9.9  Modul "84-quickdirector" mit TALK, INBUS, UNTALK ........... 202
9.10 Modul "85-printdirector" ( Floppy-Drucker) ................. 208
9.11 Direktzugriffe auf Floppy: Modul "86-fastdisk " ............ 216

10    Maschinenmodu1e in BASIC-Programmen ....................... 223
10.1  Übernahme von BASIC-Parametern ............................ 225
10.2  Zeichen aus dem BASIC-Text holen mit CHRGET und CHRGOT .... 226
10.3  Byte- Auswertung mit GETBYT und VALBYT .................... 228
10.4  Eine Anwendung: PRINT AT - Routine mit Fehlermeldung ...... 233
10.5  Zu den Fehlermeldungen .................................... 235
10.6  Zur Schreibweise der BASIC-Befehle ........................ 236
10.7  Auswertung mit VAREAL ..................................... 238
10.8  Auswertung mit VALKLA ..................................... 239
10.9  Auswertung von Integerzahlen mit VALINT und INTADR ........ 239
10.10 Auswertung mit VALPAR, VALSTR, PARFLG und TYPFLG .......... 241
10.11 Übernahme einer BASIC-Variablen mit GETVAR ................ 243
10.12 Ein vielseitiges Modul: "98-onstring" ..................... 244
10.13 "99- onstring" für 40/8oXX- Geräte ........................ 250
10.14 Verknüpfen von Modulen - zwei Anwendungen ................. 254
10.15 Modulverknüpfung mit einer Sprung leiste .................. 258

11    Diverse ROM-Hilfen-Anwendungen ............................ 265
11.1  BASIC-Start vom Maschinenprogramm aus mit RUN ............. 267
11.2  Warmstart mit MGOTO ab einer bestimmten Zeilennummer ...... 267
11.3  Startadresse einer BASIC-Zeile suchen mit BLINAD .......... 270
11.4  Umschalten von Text- auf Graphikmodus ..................... 270
11.5  Abfrage der STOP-Taste mit STOPRY und STOPO ............... 272
11.6  Sprung in den READY-Modus mit MREADY ...................... 272
11.7  Verschieben von RAM - Bereichen mit TRABLO ................ 272
11.8  Abspeichern eines Datenbereichs mit MSAVE ................. 274
11.9  Laden eines Programms mit veränderter Startadresse ........ 275
11.10 Speichern eines Datenblocks mit variabler Anfangsadresse .. 279

12    ASSEMBLER-Kurzschule ...................................... 283
12.1  Die Register des 65XX-Prozessors .......................... 285
12.2  Das Prozessor Statusregister P ............................ 285
12.3  Beeinflussung der Flags durch Befehle ..................... 285
12.4  Der Befehlssatz in ASSEMBLER .............................. 286

13 ROM-Routinen - thematisch, mit Kurzbeschreibung .............. 297
14 ROM-Routinen - alphabetisch .................................. 313
15 Wichtige Adressen - alphabetisch ............................. 319
16 Stichwortverzeichnis ......................................... 325
17 Übersicht weiterer Markt&Technik-Bücher ...................... 328

Leseprobe[Bearbeiten | Quelltext bearbeiten]

Seite 83, (5.14 Logarithmieren mit LOGNAT)

Alle Logarithmen beziehen sich hier auf die Basis e. Wir rechnen also mit dem Logarithmus naturalis.

Vorbedingung

Der Numerus kann erzeugt werden oder im RAM oder ROM stehen.

Ablauf
01 Erzeugen der Zahl 1000 im FAC1
02 Aufruf von LOGNAT
03 Ablegen von In(1000) ab (16515)
...
ASSEMBLER-Beispiel "34-log nat" (C64)
01 lda #3
   ldy #232   ; Zahl 1000 nach
   jsr 45969  ; FAC1 mit INTFLP
02 jsr 47594  ; LOGNAT bildet Logarithmus von 1000 
03 ldx #131
   ldy #64    ; ab (16515)
   jsr 48087  ; mit FACMEM das Eregebnis ablegen
04 jsr 43708
   rts        ; Bildschirmausgabe mit FLPOUT : 6.90775528

(Seite 41: Kapitel "3 Erweiterung der Interrupt-Routine - ein Beispiel-"

3.1 Die IR-Routine

Die CBM-Rechner unterbrechen 60 mal in der Sekunde alle Programmläufe, um wichtige ROM-Routinen auszuführen, die einen geregelten Computerbetrieb gewährleisten. So wird z.B. die Tastatur abgefragt, die Uhr nachgestellt usw. Voraussetzung für die Aktivität dieser betriebsinternen Routine ist, daß der sog. IRQ-Vektor auf den Anfang der IR-Routine zeigt.

Dies ist ein Zeiger in der Zeropage, der folgende Adressen (LO/HI) hat:

 Label      C64                             40/80XX
 IRQVEC     <788/789>=59953                 <144/145>=58453
            <$0314/0315>=$ea3l              <$90/91>=$e455
            Zeiger mit Inhalt auf den Standard-Interrupt
 
 IRQVEC LO  <788>=49                        <144>=85
            <$0314>=$31                     <$90>=$55
            LO des IRQ-Vektors
 IRQVEC HI  <789>=234                       <145>=228
            <$0315>=$ea                     <$91>=$e4
            HI des IRQ-Vektors

Erläuterungen dazu:
IRQVEC ist ein Pointer, der auf die Einsprungadresse für den Standard-Interrupt zeigt. Beim C64 z.B. beginnt diese Routine ab (59953). Das ist in LO/HI zerlegt eben 49/234. Der IRQ-Vektor muß also in (788) den Wert 49 und in (789) den Wert 234 enthalten, dann wird automatisch der normale Interrupt durchgeführt.

Verstellt man diesen Zeiger um 3 Adressen nach oben - das wäre beim C64 also (59956) - dann wird die STOP-Tastenabfrage übergangen. Das bedeutet, daß man ein Programm, das mit diesem Interrupt lauft, nicht mehr über die STOP-Taste abbrechen kann.

3.2 Erzeugung eines Taktes mit der IRQ-Abfrage

Zielsetzung:
Wir wollen in einem bestimmten Rhythmus ein Programm durchlaufen.Oder anders ausgedrückt: In einem vorgegebenen Takt sollen bestimmte Abläufe (z.B. Standortbestimmungen, Anzeigen usw.) ausgeführt werden.

Für unser folgendes Beispiel nehmen wir uns vor, daß alle 0,25s ein Flag gesetzt wird, an Hand dessen ein Programm selbst "entscheiden" kann, ob es starten soll oder nicht.

Dadurch lassen sich z.B. Bewegungsabläufe in kleine Schritte zerlegen, so daß man jederzeit die Position o.ä. mitrechnen kann. Es läßt sich somit eine Digitalisierung erzielen, die bei fast allen unregelmäßigen Vorgängen zur Analysierung der Einzelfaktoren erforderlich ist.

Nennen wir das dafür zuständige Programm "04-taktmodul".

3.3 Wichtige Adressen von "04-taktmodul"

  • Wir lassen die Interrupt-Erweiterung bei (17000) beginnen.
  • Als Flag verwenden wir die Adresse (1010).

Wir vereinbaren, daß wir (1010) mit 1 belegen, wenn eine Zeit von 0,25s verstrichen ist. Läuft auf Grund dieses Flags ein Programm an, muB dieses Programm selbst dafür sorgen, daß (1010) wieder auf O zurückgesetzt ist.

(Voraussetzung für die Einhaltung eines gleichmäßigen Takts ist dann, daß das dadurch gestartete Programm auch bei allen möglichen Verzweigungen nie länger als 0,25s für einen Durchlauf benötigt.)

Die Warteschleife lassen wir wieder über einen Zähler laufen, für den wir die Adressen (1011/1012) als LO/HI bereitstellen. Damit haben wir wieder die Möglichkeit, unsere Taktfrequenz in einem relativ großen Bereich vorzuwählen.

3.4 Ablauf von "04-taktmodul"
Ol: Warteschleife

  • Erhöhen des Zählers in (1011/1012).
  • Abfrage, ob der gewünschte Wert erreicht ist.

02: Taktflag

  • Setzen des Taktflags (1010) auf 1, wenn die vorgegebene Zeit erreicht ist.

03: Abschluß

  • Weitersprung zur betriebsinternen IR-Routine.

3.5 ASSSEMBLER-Programm für "04-taktmodul"(C64):
Ol:Warteschleife:

 17000 inc 1011             ; Zähler LO erhöhen
 17003 bne 17008            ; ungleich 0 ===> weiter
 17005 inc 1012             ; sonst Zähler HI erhöhen
 17008 1da 1012             ; Zähler HI...
 17011 cmp #0               ; ...mit O vergleichen (Beispiel!)
 17013 bne 17037            ; ungleich O ===> weiter
 17015 Ida 1011             ; Zähler LO...
 17018 cmp #15              ; mit 15 vergleichen (Beispiel für 0,25s)
 17020 bne 17037            ; nicht erreicht ===> weiter
 17022 nop

02: Taktflag:

 17023 Ida #1               ; Flag
 17025 sta 1010             ; in (1010) auf 1 setzen
 17028 lda #0               ; Zähler
 17030 sta 1011             ; ...LO
 17033 sta 1012             ; ...und HI zurücksetzen

Teil 3:

 17036 jmp 59953            ; Sprung zur CBM-IR-Routine

Wir erhalten einen 0,25s-Takt, wenn wir mit dieser Schleife warten, bis der Zähler in (1011/1012) auf 0/15 steht. Das läßt sich durch das angekündigte Testprogramm überprüfen.

Ein genaueres Intervall für exakte Rechenroutinen können wir auch mit Hilfe der Stoppuhr ermitteln. Im Normalfall genügt aber eine Genauigkeit von 1/60 Sekunde.

3.6 Abstimmung des Taktes
Die Warteschleife (sie entspricht der des vorhergehenden Moduls) muß immer individuell abgestimmt werden. Das geschieht mit Hilfe des Zählers in (1011/1012).

Wann eine Zeit von 0,25s erreicht ist, wird durch ein kleines Testprogramm ermittelt.

Für diesen Minitest lassen wir uns immer dann, wenn das Intervall abgeschlossen ist, ein beliebiges Zeichen auf dem Bildschirm ausgeben und setzen danach sofort unseren Zähler und das flag auf 0.

3.7 Eine kleine Testroutine für die Bestimmung der Taktfrequenz
Das folgende Programm (ab 17100) fragt zunächst eine Taste ab, mit deren Hilfe wir den Testlauf abbrechen können. Danach wird zu Beginn eines jeden Taktes der Inhalt der Adresse (165) auf dem Bildschirm ausgegeben. Die Bildschirmadresse wird jeweils durch das (X)-Register indiziert und vor jeder neuen Ausgabe inkrementiert (um eins erhöht), so daß wir also maximal 256 hintereinan der liegende gleiche Zeichen zu sehen bekommen.

Dann fängt alles wieder an derselben Anfangsposition an. Damit sich das vom Vorhergehenden unterscheidet, wechseln wir einfach den Bildschirmcode, indem wir ihn ebenfalls um 1 erhöhen, wenn die Schleife wieder von vorn beginnt. Auf diese Weise läßt sich durch Mit- oder Abzählen der ausgedruckten Zeichen eine durchschnittliche Taktfrequenz mit guter Genauigkeit bestimmen.

Nach jeder Bildschirmausgabe muß das Taktflag zurückgesetzt werden. Danach erfolgt wieder der Sprung an die Warteschleife für das Taktflag.

Das Takt-Testprogramm "test/takt" (C64)

 17100 lda 203
 17102 cmp #60            ; Stoptaste (Leertaste) gedrückt?
 17104 bne 17108          ; nein ===> weiter
 17106 rts                ; Ja ===> Rücksprung
 17107 nop
 17108 Ida 1010
 17111 beq 17100          ; Flag 0 ===> warten
 17113 inx                ; Flag gesetzt ---> Zähler erhöhen
 17114 bne 17118          ; 255 überschritten? nein ===> weiter
 17116 inc 165            ; sonst Zeichencode erhöhen
 17118 l1da 165           ; Zeichencode laden
 17120 sta 1024,x         ; und auf Bildschirm ausgeben
 17123 1da #0
 17125 sta 1010           ; Flag auf 0
 17128 beq 17100          ; und Sprung an den Anfang der Schleife

Wenn sie das Programm "O04-taktmodul!" noch im Speicher haben, sollten Sie es jetzt zusammen mit diesem "test/takt" abspeichern. Nennen wir es einfach "05-takt". Es läßt sich auf diese Weise später bequem - auch von BASIC aus - mit einem einzigen LOAD-Befehl einladen.

Lauffähig ist es allerdings noch nicht, da wir den Taktgeber, der ja im Programm "O4-taktmodul" steckt, noch nicht aktiviert haben. Er muß jetzt erst in die Interrupt-Routine integriert werden. Es bringt also im Moment noch gar nichts, wenn Sie bei (17000) oder (17100) starten. Gleich im nächsten Abschnitt packen wir dieses Problem an.

3.8 Einstellen des IRQ-Vektors Die Interrupt-Routine muB nun unser "04-taktmodul" durchlaufen. Das lMÄäßt sich dadurch erreichen, daß wir den vorhin besprochenen IRQ-Zeiger auf die Anfangsadresse dieses Programms einstellen.

17000 hat zerlegt in LO/HI die Werte 104/66. Setzen wir die nun in die Adressen des IRQ-Zeigers IRQ-LO und IRQ-HI, dann wird die Interrupt-Routine brav bei (17000) beginnen. Allerdings hat die ganze Sachen noch einen kleinen Haken, der sich aber schnell geradeklopfen läßt:
Der IRQ-Zeiger läßt sich nicht durch einfaches "poken" der Zeropage-Adressen ändern, weil ja während dieser Durchführung auch der Interrupt ausgeführt wird. Er kann deshalb auch zwischen das Einstellen von LO und HI des Zeigers fallen und schon stürzt der Rechner ins Leere, weil er einen Interrupt-Einsprung durchführt, aus dem er in der Regel nicht mehr herauskommt.

Wer den Befehl DOKE besitzt, umgeht diese Schwierigkeit und kann den IRQ-Zeiger z.B. mit DOKE1l44,17000 auf (17000) einstellen. Ansonsten muß vor einer Veränderung des Vektors, die sowohl das LO- als das HI-Byte betrifft, das "Interrupt-Disable-Flag" mit SEI gesetzt werden. Der Interrupt bleibt also aus, der Zeiger kann in Ruhe verändert werden. Anschließend setzt man dieses Flag wieder mit CLI zurück und ermöglicht damit den Einsprung in die Adresse, auf die der Vektor IRQVEC zeigt.

Das folgende kleine Proaramm - der Wichtigkeit halber auch gleich für die "großen" Geräte gelistet - stellt den IRQ-Vektor ein.

ASSEMBLER-Beispiel "06-irqvec17000"

   C64                           40/80XX 
   - 24500 sei                   sei         ; I-Flag setzen
   - 24501 1da #104              lda #104    ; LO
     24503 sta 788               sta 144     ; nach IRQVEC LO
     24505 lda #66               lda #66     ; HI
     24507 sta 789               sta 145     ; nach IRQVEC HI
   - 24509 cli                   cli         ; I-Flag löschen
   - 24510 jmp 17100             jmp 17100   ; zu "test-takt"

Jetzt können Sie das Programm gleich mit SYS 24500 starten. Sie müssen aber das Programm "O5-takt" noch im Speicher belassen haben.

Zunächst wird der IRQ-Vektor verstellt und dann zum Programm "test-takt" verzweigt.

Ab sofort wird ca.60 mal pro Sekunde das Programm "04-taktmodul" (17000) angesprungen, und der Zähler wird solange inkrementiert, bis er die eingestellte Zahl erreicht hat.

Unabhängig davon läuft das Testprogramm "test-takt" ab 17100 solange auf der Stelle, bis das Taktflag gesetzt ist. Erst wenn hier eine 1 vorliegt, erfolgt eine Zeichenausgabe auf dem Schirm.

Nun können Sie die Anzahl der gesetzten Zeichen und die dazu benötigte Zeit feststellen und Sie erhalten Ihre Taktfrequenz. Verändern Sie mit POKE 17019,XX einmal Ihren Zähler, dann werden Sie bald merken, daß Sie mit XX=15 recht gut einen 0,25s-Takt er- halten.

Anmerkung:
Daß wir die Taktfrequenz von BASIC aus überprüfen, hat seinen Grund darin, daß einige Assembler ebenfalls die Adressen des IRQ- Zeigers verwenden, so daß eine Veränderung nicht ratsam ist.

Zusammenfassung:
Die Interrupt- Erweiterung ist nun so aufgebaut, daß Sie den Zähler beliebig einstellen können zwischen ca. 1/60 Sekunde und ca. 18 Minuten. Jeder weitere Ausbau dieser Routine führt allerdings dazu, daß etwas mehr Zeit zur Ausführung benötigt wird, aber in Maschinensprache haben wir noch einige Reserven.

Die ganze Geschichte mit dem Taktgeber hat auch ihren Bezug zum vorhergehenden Kapitel, wo wir einen Wendezeiger simuliert haben. Wir sind nämlich jetzt (fast) in der Lage, mit Hilfe dieses Geräts die Richtung anzugeben, in die wir uns "bewegen". Wenn wir den Ausschlag des "Pinsels" aus dem Programm "Ol-pinsel" in regelmäßigen kurzen Abständen untersuchen, dann läßt sich daraus eine Richtungsänderung berechnen.

Voraussetzung dazu ist aber, daß wir sehr schnell rechnen können. Und das wiederum erfordert den Einsatz von Maschinenprogrammen. In den nächsten beiden Kapiteln Nr.4 und Nr.5 werden wir uns ausführlich mit der Arithmetik befassen. Sie ist einer der Schwerpunkte in dieser Schrift.

Doch vorher sollten Sie sich zunächst einmal an einer der folgenden Übungen versuchen.

Zwischendurch muß immer wieder betont werden, daß das bloße Durchlesen von bereits fertigen oder schon besprochenen Programmen nicht allzu viel Lerneffekt mit sich bringt.

Mehr als in anderen Bereichen gilt hier das alte Prinzip: Probieren - wobei damit immer systematisches Probieren, nicht aber Herumprobieren gemeint ist - geht über (oder zumindest neben) Studieren.

Aufgaben:
Erweitern Sie die Interrupt-Routine, um die Tastatur abzufragen und z.B. beim Drücken der Taste "0" sofort ein Flag zu setzen, das aber nach 5 Sekunden wieder gelöscht wird.

Erweitern Sie die Interrupt-Routine, um die Eingaben des Joysticks abzufragen und in der richtigen Reihenfolge in einem bestimmten Adressbereich bereitzustellen (Pufferproblem!).

Meinung[Bearbeiten | Quelltext bearbeiten]

Werner: "Die Lesbarkeit der Assembler-Listings leidet enorm unter der dezimale Schreibweise. Diese schwere Kost ist, wenn überhaupt, nur für Profis zu empfehlen."

Bamse: "Die Autoren beginnen das Buch mit einer glatten Fehlentscheidung: Dezimal statt Hexadezimal. Dadurch werden u.a. die Lo/Hi-Byte Übergaben (gerade für Anfänger) unnötig kompliziert / wenig nachvollziehbar. Dazu wirkt das ganze Buch sehr trocken & mathematisch, und dient wohl höchstens dem Profi als Nachschlagewerk für mathematische Formeln (vielmehr steht eh nicht drin). Obwohl das Buch wie ein Schulbuch wirkt schult es leider überhaupt nicht. Fazit: Nicht zu empfehlen - stattdessen den Buchtitel mal googlen und über die Initiative zum ´Zurück-an-den-Autor-senden´ lachen..."

Weblinks[Bearbeiten | Quelltext bearbeiten]