ASSEMBLER-KURS - Teil 1 von Hendrik Voigtländer Wie Ihr bestimmt schon bemerkt habt, habe ich den Assembler-Kurs übernommen. Da ich diesen noch einmal von vorne beginnen möchte, heißt dieser Teil auch Nr.1,und nicht, wie es eigentlich sein müßte,Nr.3. Meine Kenntnisse in Assembler sind zwar nicht profi- haft,aber für einen etwas weiter- führenden Kurs müsste es reichen. Also,ab geht er: Zuerst mal etwas zur Einführung. Was ist eigentlich das besondere an Assembler? Ganz einfach: Assembler ist eigentlich schon blanker Maschinencode, nur das uns der Assembler eine Menge Handarbeit abnimmt. So z.B. die Berechnung Weite bei Sprüngen. Kurz dazu: Sprünge, welche von einer Bedingung abhängen, werden in MC nicht mit einem Sprungziel (vergleichbar mit der Zeilennummer in BASIC) sondern mit ei- ner Sprungweite angegeben (springe zehn Bytes weiter vor). In MC diese Weite zu Fuß auszurechnen, wäre nun viel Arbeit. Das nimmt uns der Assembler ab. Dort wird, wie im BASIC, ein Sprungziel angegeben. Der wichtigste Vorteil eines Assemblers gegenüber MC ist wohl, daß man sich für die Befehle nicht Zahlen, sondern Buch- stabenfolegn, die sogenannten Mnemonics,merkt. Dazu kommt,daß von fast jedem Befehl mehrere Versionen verwendet werden, die auch einen anderen Code haben. Ein kleines Beispiel: LDA heißt LoaD Accumulator (Lade Akku- mulator mit einer Zahl). Nun kann diese Zahl unterschiedliche Quellen haben. Ich will nur einmal diese Codes aufzählen: A9 A5 B5 BD AD B9 B1 A1 Das heißt jedesmal LDA! Es ist bestimmt leicht einzusehen,daß sich Assemblerbe- fehle wesentlich leichter merken las- sen. Wer Lust und das Superhirn dazu hat, kann meinetwegen auch in Maschinensprache programmieren. Ich halte den Assembler für effektiver, auch wenn etwas mehr geschrieben werden muß. Zum Speicheraufbau möchte ich an dieser Stelle noch ein paar Worte verlieren. In Assembler ist es sehr wichtig, sich im Speicher des Rechners wie in seiner eigenen Hosentasche auszukennen. Das hat einen ganz simplen Grund. Stel- wir uns einmal vor, wir möchten im Basic die Farbeinstellungen ändern und hätten kein SETCOLOR. Ganz einfach, werden einige sagen, POKE 710,0 und die Sache ist abgeheftet. Stellen wir uns nun vor, wir würden nicht wissen, wo diese Farbregister liegen. In Assembler ist es nun so, daß fast alles mit POKE-Befehlen, Verzweigungen undSprüngen zum Betriebssystem abgewickelt wird. So lassen sich OPEN, GRAPHIC, PRINT, CLOSE usw. program- mieren, zwar mit einem höheren Schreib- aufwand, aber dafür mit viel höherer Geschwindigkeit. Außerdem sind die Programme, die dann ausgeführt werden, viel kürzer (Spei- cherplatz!). Noch etwas zur Speicher-Einteilung. Der Speicher wird wegen der Übersichtlich- keit in sogenannte Seiten zu 255 Bytes eingeteilt. Man spricht auch von einer Page. Im folgenden Memory-Map sind alle Zahlen in hexadezimaler Form angegeben. Die Umrechnung kann mit einer Tabelle oder einem gutem Taschenrechner erfol- gen. Das hexadezimale Zahlensystem hat folgenden Ursprung: Jede Speicherzelle ist ein Byte. Dieses Byte setzt sich nunaus 8 Bits zusammen (BIT: Binary Unit). Diese Bits können den Zustand 1 und 0 annehmen und sind Ziffern im Binärzah- lensystem. Fast man jeweils vier Bits zu einer Ziffer zusammen, so ergeben sich 16 Möglichkeiten. Daraus resultiert die Notwendigkeit, die 10 Ziffern des dezimalen Zahlensystem (0 bis 9) um weitere 6 zu ergänzen. Das wird mit den Buchsta-ben A-F getan (10 - 16). Dann ergibt es sich ganz logisch, daß ein Byte, das sich ja aus 8 Bits zusammensetzt, mit 2 Hex-Ziffern dargestellt wird. Damit ergibt sich ein Zahlenbereich von 0 bis 255. Um größere Zahlen darzustellen, werden zwei Bytes zusammengefaßt. Darausergibt sich dann die sogenannte 16-Bit Zahl mit einem Bereich von 0 bis ca. 64000. Übrigens werden Hexa-Zahlen mit einem $ gekennzeichnet. (also $FF = 255). PAGE 0 $0000-$00FF (Zeropage) Diese Page ist sehr wichtig, da sie für spezielle Art der Adressierung verwen- det wird. Da diese auch vom OS (Betrieb-sytem - Operating Sytem) benutzt wird, kann man sehr vieles dort benutzen. Fastjeder kennt ja die Speicherzellen für die Anfangsadresse des Bildschirmspeichers. Das ist so ein Zeropageregister. $0000-$007F Bereich, der vom Betriebs- system benutzt wird $0080-$00CA Wenn das Basic aktiv ist, greift auf diese Speicher- zellen zu.Wichtig bei Pro- grammierung von MC-Routi- für Basic. $00CB-$00D1 Hier kann man seine eige- Zeropageregister ablegen, da dieser Teil immer frei ist. $00D2-$00FF Werden die Rechen-Routinen des OS benutzt, greift das auf diesen Teil zurück. PAGE 1 $0100-$01FF (Stack) Hier legt die CPU bei Unterprogrammauf- ruf (GOSUB) die Rücksprungadressen ab. Bei der Benutzung des Stacks ist deshalbVorsicht geboten! PAGE 2 $0200-$02FF (Schattenregister) Schattenregister sind eine sehr sinn- volle Einrichtung unseres Computers. Um das Funktionsprinzip der Schattenregi- ster zu verstehen, müssen wir einen kleinen Ausflug zum Fernseher machen. Ein Fernsehbild (ein Monitorbild natür- lich auch) erscheint 50mal pro Sekunde und 50mal pro Sekunde muß der Elektro- nenstrahl von der unteren rechten Ecke wieder in die obere rechte Ecke zurück. Diesen Vorgang nennt man Vertikalausta- stung. Während dieser Vertikalaus- tastung hat der Prozessor eine Ver- schnaufpause. Leider hat er davon nicht allzu viel, dazu diesem Zeitpunkt (wenn der Elektronenstrahl ganz unten ist), ein Vertikal-Blank-Interrupt ausgelöst wird. Das ist ein Programm im OS, das so kurz ist (in der Abarbeitungszeit), daß man als User davon nichts bemerkt. Es laufen also unser Programm und der VBI gleichzeitig ab. Dieser VBI kopiert unter anderem die Schatten- in die Hardware-Register. Das hat den Zweck, daß z.B. die Farbänderungbeim POKE 710,0 (710=$02C6) erst wirklich ausgeführt werden, wenn ein neues Bild begonnen wird. Das vermeidet Bild- störungen, wenn Farbänderungen schnell hintereinander ausgeführt werden. Man kann die Schattenregister also als Zwi- schenspeicher betrachten. PAGE 3 $0300-$03FF (Ein-und Ausgabe) Der Begriff der Kanäle ist ja bestimmt jedem Basic-User bekannt. Beim Benutzen dieser Kanäle mit CLOSE, OPEN, PRINT, BGET usw. füllt das BASIC jedesmal einensogenannten Input-Output-Control- Block aus und springt dann in das Betriebssystem zur Central Input Output Routine (CIO), welche dann die eigentliche Arbeit erledigt. Welchen Sinn hat das ganze nun ? Ganz einfach, da sich das OS im ROM be- findet, können Parameter (welcher Kanal,Kommando, Filename usw.) dort nicht angegeben werden. Das muß im RAM geschehen und die Entwickler des OS haben nun die PAGE 3 dafür auserkoren. Das Ganze hat aber auch einen Vorteil: Wenn das Basic den IOCB ausfüllen und ins OS springen kann, können wir das erst recht. Damit lassen sich sehr einfach Disketten- und Bildschirm ein- und Ausgabe realisieren. Das ist aber noch nicht alles, was in der Page 3 Platz findet. Auch der Diskcontrollblock (DCB) hat in der Page 3 seinen Platz. Mit seiner Hilfe und der SIO-Routine (Seriell Input Output) kann man Sektoren einer Diskette direkt lesen und schreiben. Als letztes befindet sich in der Page 3 ein Teil des Kassetten-Puffers. Dieser kann (wenn C: nicht benutzt wird) als freier RAM genutzt werden. PAGE 4 $0400-$04FF Hier befindet sich der zweite Teil des Kassetten-Puffers und der Syntax-Stack vom BASIC. Wozu dieser da ist, weiß ich auch nicht, aber ich will ja zum Glück auch kein BASIC-Interpreter programmie- ren. PAGE 5 $0500-$05FF In der Page 5 liegt der zweite Teil des Syntaxstacks und der Eingabepuffer. Ich weiß nicht genau, ob dieser Puffer auch vom OS oder nur vom BASIC benutzt wird. (Vielleicht weiß das jemand von Euch?) PAGE 6 $0600-$06FF Die Page 6 ist normalerweise frei, außerwenn bei einem Input mehr als 128 Zeichen empfangen werden, landen diese in dem Bereich von $600-$67F. Ab $0680 ist die Page 6 immer frei, kann also für MC-Routinen o.ä. genutzt werden. Ab der Page 7 liegt das DOS (Disk Ope- rating System). Dieses erstreckt sich bis ca. $1F00. Ab dieser Adresse liegt das DUP (Disk Utillity Package - das DOS-Menue). Da dieses nur geladen wird, wenn es gebraucht wird, können ab hier unsere Programme abgelegt werden. Der freie RAM erstreckt sich bis $A000 (mit Basic) bzw. $C000 (Basic aus), aller- dings mit einer Einschränkung: Vor die- sem Bereich liegt nämlich noch der Bild-schirmspeicher und die Display- List. Die Größe dieses Bereichs hängt von der gewählten Graphicstufe ab. Man muß also aufpassen, daß sich Programm und der Bildschirmspeicher nicht überlappen, da sonst der Rechner ab- stürzen würde. Von $A000 bis $BFFF liegt, wie schon gesagt,das BASIC und von $C000 - $CFFF der erste, und von $D800-$FFFF der zweite Teil des OS. Dazwischen liegen die Hardwareregister, über die die Subprozessoren angesteuert werden (ANTIC usw. ). Das Betriebs- system kann auch abgeschaltet werden. Dann kannauf den RAM darunter zugegriffen werden. Das ist übrigens auch das Prinzip der XL-Ramdisk (16K)! Natürlich muß das OS wieder angechaltet werden, wenn es benötigt wird (CIO,SIO,Zeichensatz...). Man kann auch das OS auf den RAM kopie- ren und dann den ROM abschalten. Damit kann dann das OS verändert werden, da esja jetzt im RAM liegt. So, das soll es erst einmal für diesen Monat gewesen sein. Das nächste Mal gehtes dann um die Bedienung des ATMAS II und (vielleicht) auch schon um ein paar Befehle. Falls noch Fragen sind oder Ihr Tips oder Kritik habt, schreibt mir doch einfach mal. Tschüß ! Hendrik Meine Adresse: Hendrik Voigtländer (bei M.Laß) Hermannstraße 25 O-2500 Rostock