
                      ͻ
                       
                    
                     
   ͻ        ͼ
                  ۰
                  ۰
       ͼ   ۰
                                 ۰
                           ۰
                      ۰
                       ۰
                          ۰
                                        ۰ 
                                                   ۰
ͻ                              ۰
DIE WELT DES                                ۰
GESCHWINDIG-                     ۰
KEITSRAUSCHES                             
ͼ                   
   ͻ                                     
   PART III                                    
   ͼ                                     


 Liebe Zielgruppe!

 Leider hab' ich es nicht mehr geschafft, diesen Teil des ASM-Kurses recht-
 zeitig fr das letzte PLATINUM zu tippen, das Sommerloch hat auch mich ver-
 schluckt, BLOOOP.

 
 =-> Lieber Capella,

     thanx fr Deine Kritik und die Buchtips!

     Das das Erlernen von ASM auf dem C64 leichter ist, als auf dem PC, ist 
     natrlich nur meine (subjektive) Meinung, die ich keinem aufzwingen 
     wollte. Das eigentliche Programmieren (im Gegensatz zum erlernen der 
     Programmiersprache) ist auf dem PC natrlich leichter, da die Befehle 
     umfangreicher und komfortabler sind (meine Meinung), hab' ja auch vom 
     erlernen und nicht vom programmieren geschrieben.

     Das Buch PC-INTERN 3.0 kann ich auch empfehlen, es ist (wieder meine
     Meinung) das beste und umfangreichste Nachschlagewerk fr ASM-Program-
     mierer (natrlich auch fr Programmierer, die andere Sprachen verwenden 
     und sich mit der systemnahen Programmierung beschftigen). Ich hab' es 
     auch in einem lteren Platinum (damals hie es noch DiskMag) vorgestel-
     lt. Wer sich wirklich intensiver mit der ASM-Programmierung beschftigen 
     will, kommt an diesem Buch wohl kaum vorbei, es kostet ca. 100DM und ist 
     sein Geld wirklich wert (meine Meinung)!

 =-> Gru, Master YODA

 
 Zurck zum eigentlichen ASM-Kurs:

 Die Flags
 ---------

 Ein Flag gibt einen bestimmten Zustand an. Der Zustand der einzelnen Flags
 (0 oder 1) ist im sog. Statusword (ein Register des Prozessors) enthalten.

 Der Aufbau dieses Words:

 Bit 00: Carry Flag. Das Carry Flag enthlt das achte bzw. 16. Bit (wenn man
         bei Bit 0 anfngt) nach einer arithmetischen Operation z.B. einer
         Addition:

         AL=85h und AH=A2h sollen addiert werden, dazu dient der Befehl ADD.
         Format: ADD Ziel, Quelle (Ziel=Ziel+Quelle) fr Ziel und Quelle
         knnen Register, Konstanten und Speicherinhalte, auch gemischt, 
         verwandt werden (z.B. ADD AL,BL; ADD [0080h],02h; ADD AX,1234h), 
         sie mssen aber das gleiche Format, also Byte (8Bit) bzw. Word 
         (16Bit) aufweisen.

         Zurck zum Beispiel, AL und AH sollen addiert, da Ergebnis in AL 
         abgelegt werden: 

         MOV AX,A285h
         ADD AL,AH

         Das Ergebnis (127h) pat aber nicht in ein 8Bit-Register (max. Wert
         ist ja FFh), was nun? Die acht niederwertigen Bits werden in AL
         zurckgegeben und das Carry Flag gesetzt, es representiert da neunte
         Bit (bzw. das achte, wenn wir mit Bit 0 beginnen).

         Das ganze Binr, zum besseren Verstndnis.

         AL: 10000101b (A2h)   AH: 10100010b (A2h)   Carry Flag: 0
         
         nach der Addition htten wir diesen Ergebnis:

         AL: 100100111b

         dieses Ergebnis hat aber neun Bit, wird also 'aufgeteilt':

         AL: 00100111b (27h)   AH:10100010b (wird nicht verndert)  CF: 1

         Setzt man jetzt das Carry Flag (CF) und den Inhalt von AL zusammen,
         hat man das Ergebnis der Addition: 1h (CF) und 27h (AL) = 127h.

 Bit 01: nicht belegt (1)

 Bit 02: Parity Flag (PF), wird auf 1 gesetzt, wenn das Ergebnis einer 
         arithmetischen (s.o.) oder logischer (z.B. XOR) Operation eine 
         gerade Anzahl von Einsen (Binr) enthlt.

         Beispiel: MOV AX,B007h
                   ADD AL,AH

                   Ergebnis: AL = B7h = 10110111b, eine gerade Anzahl Einsen
                             --> PF = 1

         Dieses Flag wird u.a. fr Checksummen .. verwandt.

 Bit 03: nicht belegt (0)

 Bit 04: Auxiliary Carry Flag (AF), wird auf 1 gesetzt, wenn es zu einem 
         bertrag vom dritten ins vierte Bit kommt. (Fr BCD-Zahlen?)

 Bit 05: nicht belegt (0)

 Bit 06: Zero Flag (ZF), das Flag wird auf 1 gesetzt, wenn das Ergebnis der 
         arithm. oder logischen Operation Null ist.

         Beispiel: AH=18h soll von AL=18h subtrahiert werden. Dazu ein neuer
         Befehl: SUB  Format: SUB Ziel, Quelle (Ziel=Ziel-Quelle). Auch hier
         knnen Konstanten, Register und Speicherinhalte beliebig gemischt
         werden (natrlich nur Byte mit Byte und Word mit Word).

         MOV AX,1818h
         SUB AL,AH

         Das Ergebnis in AL ist 0, ZF wurde auf 1 gesetzt.

 Bit 07: Sign Flag (SF), wird bei einer arithm. oder log. Operation auf 1
         gesetzt, wenn das Ergebnis negativ ist.

         Ein Beispiel: AH=18h soll von AL=17h subtrahiert werden.

         MOV AX,1817
         SUB AL,AH

         Das Ergebins ist -1. AL=FFh (da 00h - 1h = FFh) und SF=1.

 Bit 08: Trap Flag (TF), wird auf 1 gesetzt, wenn nach JEDEM Befehl der 
         Interrupt 1 angesprungen werden soll. Fr uns nicht interessant,
         da diese Mglichkeit nur von Debuggern benutzt wird.

         Hmm, obwohl, so sinnlos ist die Funktion doch nicht, wenn man das
         Flag setzt und den Interruptvektor auf ein eigenes Proggi setzt
         (z.B. eine Schleife mit NOPs (NOP=No Operation, der Prozessor soll
         fr eine kleine Zeitspanne nichts tun)), kann man sein System ab-
         bremsen, da der Interrupt 1 ja nach jedem Befehl (!) aufgerufen 
         wird.
         So mu ein Windoofsanwender seine Kaffeepausen auch unter DOS nicht
         vermissen... Nein, eine ernsthafte Anwendung ist das abbremsen der 
         Maschine fr ltere Spiele, die auf neuen, schnelleren Compis zu
         schnell sind.

         Beim Abarbeiten des Interrupt 1 wird das Trap Flag natrlich (auto-
         matisch!) gelscht, sonst wrde sich der Interrupt nach dem aus-
         fhren seines ersten Befehls selbst ausfhren, was in einer Endlos-
         schleife enden wrde. Wenn der Interrupt 'abgearbeitet' ist, wird 
         das Trap Flag wieder auf 1 gesetzt und der nchste Befehl des 
         eigentlichen Programms ausgefhrt, danach wieder der Interrupt 1
         aufgerufen (da das Trap Flag ja gesetzt ist)...

 Bit 09: Interrupt Flag (IF), ist 1, wenn externe Interrupts akzeptiert 
         werden. Wird es auf 0 gesetzt, werden diese Interrupts unterdrckt.

 Bit 10: Direction Flag (DF), wird auf 1 gesetzt, wenn bei Stringopertionen
         (mehr dazu in einem der nchsten Teile) abwrts gezhlt werden soll.
         Soll aufwrts gezhlt werden, ist es 0, logisch, gell.

 Bit 11: Overflow Flag (OF), wird bei einem arith. 'berlauf' (die Sache
         mit dem hchstwerigen Bit, s.o.) auf 1 gesetzt.

 Bit 12: I/O Privilege Level (IOPL). Erst ab 286er, keine Ahnung, wozu dieses
         Flag gut ist.

 Bit 13: Nested Tast Flag (NT). Ab 286er. Auch hier kann ich Euch nicht 
         weiterhelfen.

 Bit 14: nicht belegt (0)

 Bit 15: Resume Flag (RF), ab 286er. Auch zu diesem Flag hab' ich keine
         Infos gefunden.

 Bit 16: ACHTUNG! Mit diesem Bit wrde ein neues Word beginnen. Deshalb ist
         das Statusword bei Prozessoren ab 386er auch kein Word (2 Bytes,
         16Bit, also Bit 0-15, sondern ein Doubleword (Doppelwort), also 
         4 Bytes)

         Virtual Mode Flag (VF) ab 386er, ist 1, wenn sich der Prozessor im
         Virtual Mode befindet (ein bestimmter Modus des Prozessors, den ich
         weder jetzt, noch spter erklren mchte, da das ganze ziehmlich
         kompliziert ist, so benutzt ihn z.B. EMM386, um EMS zur Verfgung zu
         stellen.).

 Flags hin, Flags her, wozu sind sie gut? Mit Hilfe der Flags, die auf das
 Ergebnis von arithm. oder logischen Operationen 'reagieren', lassen sich 
 verschiedene Ereignisse auslsen. Ist das Zero Flag z.B. 0, war das Er-
 gebnis einer Operation also 0, wird mit Hilfe bestimmter Sprungbefehle 
 (in einem der nchsten Platinumse) ein anderer Teil des Proggis aufgerufen.
 
 Das Ganze lt sich also mit IF-THEN in hheren Programmiersprachen ver-
 gleichen.

         
 Neue Befehle
 ------------

 Die oben genannten neuen Befehle:

 ADD - addiert Bytes oder Worte (Doublewords ab 386er)
       Format: ADD Ziel, Quelle (Ziel=Ziel+Quelle), s.o.

 SUB - subtrahiert Bytes, Worte (Doublewords ab 386er)
       Format: SUB Ziel, Quelle (Ziel=Ziel-Quelle), s.o.

 NOP - der Prozessor 'wartet' einige Taktzyklen (je nach Prozessor)
       Format: NOP

 PUSHF - sichert das Statusword (also den Zustand der Flags), indem es auf 
         dem Stack (Stapel) abgelegt wird

 PUSHFD - ab 386er, sichert das Statusdoubleword, siehe PUSHF

 POPF - holt das mit PUSHF gesicherte Statusword wieder zurck 

 POPFD - ab 386er, holt das mit PUSHFD gesicherte Statusdoubleword zurck
 
 
 Ŀ
  Wer mir eine (besser zwei) Disk(s) zusendet und das Stichwort 'Assembler'
  irgendwo auf/im Brief vermerkt, bekommt seine Disk(s) randvoll mit       
  SW/PD/FW-Tools (A86, D86...) zum Thema Assembler zurck.                 
  Bei leerer Disk gilt: Rckporto und Rckumschlag beilegen!               
 

 
 Master YODA (Manuel Mbes, Lahnstr.4, 06846 Dessau)
 
 
 NOTE: Sollte jemand Fehler in meinen Geschreibsel finden, mich loben,
       korrigieren, oder 'gar beschimpfen wollen, soll er mir seine 
       Meinung mitteilen!

  


  An Ullix, Tobi (SKY-force oder ToKle-Soft?) und den ganzen Rest


  Ich finde es gut, da im Platinum Programmierkurse angeboten werden.
  Deshalb finde ich auch, da Ullix auf jeden Fall, einen OOP-Kurs
  (komplett mit Turbo-Vision) anbieten sollte, da mich dieses Thema
  interessiert.

  Leider konnte ich im letzten Platinum von einigen angefangenen Kursen
  die Vortsetzungen nicht finden. Ich hoffe, da dies nur an der Sommer-
  loch-Ausgabe lag, und nicht daran, da diese Kurse nicht mehr lnger
  fortgesetzt werden.

  Der einzige Kurs, der im Prinzip gar nichts bringt, ist Tobis C-Kurs.
  Ich habe weder etwas gegen C, Windows oder gar Tobi, doch finde ich,
  da jemand, der kein "C fr Windows" spricht, mit diesem Kurs nichts
  anfangen kann, denn was bringt es einem schon, wenn man etwas abtippt,
  ohne den Inhalt des abgetippten erklrt zu bekommen. Es wre besser,
  wenn etwas mehr Erluterungstext und Erklrungen und dafr evtl.
  weniger Listings verwendet wrden, um einem diese Sprache nherzubringen.

  SKY-Man {SKY-Arts}

   
   

 DAS BINR-SYSTEM
 ================
 Man hrt oft, Computer wrden nur 0 und 1 verstehen, dabe fllt oft der Be-
 griff "BINAR-SYSTEM".
 Es ist wahr, der Computer versteht _eigentlich_ nur 1 und 0 bzw wahr/falsch.
 also nur zwei Zustnde. Man kann sich den Speicher (Festplatte/RAM) wie 
 kleine Schalter vorstellen die entweder an (1) oder aus sind (0).

 Wo kommen aber die Zahlen oder die Buchstaben her???
 Ganz einfach: Man fasst mehrere Schalter zusammen. Wenn man zwei Schalter
 kombiniert hat man vier verschieden Mglichkeiten, nimmt man 3 hat man schon
 8 versch. Mgl., bei 4 sind es 16, bei n Schaltern sind es 2 Mglichkeiten.
 Diese "Schalter" nennt man BITS, welche zu Gruppen mit zu acht bits zusammen-
 gefasst ein BYTE ergeben, mit welchen sich 256 (2 hoch 8) verschiedene Zu-
 stnde, Zahlen von 0 bis 255,... speichern lassen. Mit Buchstaben ist die 
 Sache ganz einfach. Man hat einfach festgelegt welche Zahl, welchen Buch-
 staben vertritt (z.B. 65 = A ). 

 Wie sind die bits organisiert???       
 Ganz einfach so wie im Dezimal-System (Wertigkeit von links nach rechts 
 ansteigend):
                                BINR
                                ======
                                   Wertigkeit:
        2 hoch 7 = 128
         2 hoch 6 =  64
          2 hoch 5 =  32
           2 hoch 4 =  16
            2 hoch 3 =   8           
             2 hoch 2 =   4          
              2 hoch 1 =   2
               2 hoch 0 =   1
       ͻ
       76543210
       ͼ
        
         zum Vergleich:              DEZIMAL
                                    ========
        10 hoch 7 = 10 000 000
         10 hoch 6 =  1 000 000
          10 hoch 5 =    100 000
           10 hoch 4 =     10 000
            10 hoch 3 =      1 000           
             10 hoch 2 =        100          
              10 hoch 1 =         10
               10 hoch 0 =          1
       ͻ
       76543210
       ͼ


 NUL
 
   

 Die Sache mit den Segmenten 
 ===========================
 Die Speicherverwaltung des 8088, 8086, 80286+ im real mode
 Wie ihr vielleicht wit, hat der 8088 bzw. der 8086 einen 20-BIT-ADRESS-
 BUS. D.h. ein PC mit einem solchen Prozessor kann maximal 2 hoch 20 Bytes
 ansprechen, was genau EIN MEGABYTE ergibt. Nun standen die Leute bei 
 Intel, die den Prozessor entwickeln sollten,  vor dem Problem, da ihr 
 netter Prozessor nur 16-Bit-Register hatten, mit denen man hchstens 
 64KB (C64 lt gren) adresssieren konnte. Nun hatten sich diese 
 klugen (?) Leute folgendes ausge dacht:
 Man benutzt einfach ZWEI REGISTER zur Adressbildung. Damit lieen sich 
 dann aber auch 2 hoch 32 byte = 4 GB adrrsieren, wenn man sie einfach 
 "zusammensetzt" (z.B. Reg1=HiByte, Reg2=loByte). Das wollte Intel aber 
 nicht, da der 8088 ja nur 1MB adressieren kann.Also haben sie sich 
 folgendes Ausgedacht:

 Absolute Adresse = Segment * 4 + Offset
 
 oder
 
     SSSS    Hexa-         SSSS SSSS SSSS SSSS 0000  Binr    SEGMENT
 +    OOOO   dezimal    +       OOOO OOOO OOOO OOOO           OFFSET
 ----------             ---------------------------             
     AAAAA                 AAAA AAAA AAAA AAAA AAAA           PYSIKALISCHE
                                                              ADRESSE
  
 Die Segmentadresse wird also um 4 Bitpositionen (=1 Hexadezimalstelle) 
 nach links verschoben, was einer Multiplikation mit 4 gleichkommt, und 
 dazu wird die Offsetadresse addiert.
 
 
 Als dann der 286er 'rauskam, standen sie aber dumm da. Denn der 286er 
 hatte einen 24bit Adressbus, mit dem man 16MB htte adressieren knnen. 
 Da er aber zu XT kompatible bleiben mute, gab man ihm  zwei Betriebsmodi:
 
 1.) Der REAL MODE: wenn man im real mode war verhielt sich der Prozessor
     wie ein schneller 8086
     
 2.) Der PROTECTED MODE: Dieser Modus ist nicht kompatibel zum real mode,
     denn hier wird eine andere Adressbildung benutzt, die auch mehr als
     1MB speicher organisieren kann. Auerdem ist hier auch Multitasking
     mglich, in dem die einzelnen Speicherbereiche der verschiedenen Pro-
     gramme voreinander geschtzt werden. Allerdings ist der protectet mode
     viel schwerer zu programmieren als der real mode, weshalb es nicht 
     sehr viele Programme gibt die ihn benutzen.
     
 NUL
     
   

                  ==================
                  =  BASIC TEIL IV =
                  ==================

  Und schon wieder dieses langweilige gelabere ber Basic oder vielleicht 
  doch interessant?
  

  Bis jetzt haben wir nur lineare Programme geschrieben, die oben anfingen 
  und unten aufhrten. Aber interresant wird es doch erst, wenn auf den 
  Programmablauf Einflu genommen werden kann. Was machen wir, wenn wir 
  ein Programm schreiben wollen, da 10 mal "HALLO" auf den Bildschirm 
  schreibt? Wir konnten

PRINT "HALLO"
PRINT "HALLO"
PRINT "HALLO"
PRINT "HALLO"
PRINT "HALLO"
PRINT "HALLO"
PRINT "HALLO"
..... .......


schreiben, aber was wenn das ganze 100 mal gemacht werden soll?
Ganz einfach: Wir sagen dem Computer, da er die Zeile 

PRINT "HALLO"

100 mal ausfhren soll:


FOR i = 1 TO 100 
    PRINT "HALLO"
NEXT
    

Das sagt dem PC ,da die Variable i (man kann auch jede andere Varable nehmen
zuerst den Wert 1 bekommt, dann wird "HALLO" geschrieben und wenn Basic auf 
NEXT stt, wird i um eins erhht, bis 100 erreicht ist, und es fngt wieder
von oben an. In Basic knnte man das, was passiert am besten so beschreiben:


i = 1
PRINT "HALLO"
i = i + 1
PRINT "HALLO"
i = i + 1
PRINT "HALLO"
i = i + 1
PRINT "HALLO"
i = i + 1
PRINT "HALLO"
i = i + 1
... 
bis i = 100

Natrlich luft es intern etwas anders ab, aber zur Veranschaulichung ist es 
vielleicht ganz gut so.

Ein anderes Anwendungsbeispiel wre folgendes:
Das Programm soll das Quadrat aller Zahlen von 1 bis 100 ausgeben:

CLS
FOR Basis = 1 TO 100
    PRINT "Das Quadrat von " ; i ; " ist " ; i^2

    REM          ^STRING       ^Zahl  ^String ^Zahl/math. Ausdruck

NEXT


Der Ausdruck i^2 bedeuten i hoch 2 , man knnte auch i * i schreiben.
Hier nochmal der allg. Sytax von FOR:

FOR zaehler = anfang TO ende STEP schrittweite
    anweisungen
        ...
NEXT


STEP gibt die Schrittweite der Zhlung an; dh. das, was bei jedem Durchlauf
zur Variable addiert wird. Wenn wir bei unserem Quadratzahlen-Programm 
STEP 0.1 hinzufgen, dann wird zuerst das Quadrat von 1, dann von 1,1 dann von
1,2 dann 1,3 usw. ausgegeben.

Nun zu etwas anderem:

BEDINGTE UND UNBEDINGTE SPRNGE
-------------------------------

Zuerst ein kleines Programm:

Sprungmarke:
PRINT "Endlosschleife  Abbruch mit STRG+PAUSE"
GOTO Sprungmarke

Diese Programm wiederholt den Print-befehl, bis das es durch STRG+PAUSE
abgebrochen wird.  Es passiert also folgendes:

Wenn Basic zur Sprungmarke, die mit einem DOPPELPUNKT enden mu, kommt merkt
Basic sich wo das ist. Dann werden die nachsten Befehle normal Abgearbeitet.
Wenn Basic dann ein GOTO, also einen Sprungbefehl findet, schaut es nach, wo 
dieser ist und macht dort wieder mit der Ausfhrung weiter.

PRINT "Hallo"
GOTO ENDE
PRINT " Dieser Befehl wird nie ausgefhrt werden"
PRINT " Diser auch nicht"
ENDE:
PRINT "Hier geht's weiter"

Was passiert?
Basic arbeitet den Printbefehl ab, dann trifft es auf das GOTO und sich die
Sprungmarke ENDE, und macht dann dort weiter. Die Befehle dazwischen werden 
nicht ausgefhrt.

bedingte sprnge:

dazu bitte ich euch erstmal die qbasic hilfe zu benutzten. Und zwar schaut 
ihr am besten mal im index unter IF nach.

NUL

   

              ͸
               Grafik mit 256 Farben im Modus 13h 
              ;
 
 Die Programmierung des Modus 13h mit 256 Farben und einer Auflsung von 
 320*200 pix. ist unter Basic nicht schwer.
 Initialisiert wird er mit 

 SCREEN 13

 Ein Punkt wird mit 

 PSET (X,Y),Farbe

 gesetzt und fr Linien, Kreise usw. gibt es auch schon vorgefertigte Routinen
 (siehe Handbuch).

 In Assembler oder Pascal ist das schon schwieriger. In TP gibt es inzwischen
 auch schon einen BGI-Treiber der diesen Modus untersttzt, aber dieser ist
 (meiner Meinung) zu langsam und zu umstndlich. Wie dies in C/C++ ist wei 
 ich nicht, aber ich vermute, dort wird es hnlich sein. Daher benutzt ich
 Asseblerprozeduren, die schnell und einfach (nmlich so wie ich sie will)
 sind.
 
 Nun zum Modus 13h:
 Er wird mit der Funktion 00 des VGA-BIOS initiallisiert, in Assmbler also:

 MOV AH,00   ;Die funktionsnummer nach ah
 MOV AL,13h  ;die nummer des modus nach al
 INT 10h     ;den BIOS Interrupt aufrufen
 
 
 Das Setzten von Punkten ist dann ganz einfach:
 Im VIDEORAM Segment A000h reprsentiert jedes Byte einen Bildpunkt. Das 
 Byte an A000h:0000 enthllt die Farbe des Bildpunktes (0,0), nchste Byte
 BildPkt. (1,0). Der bildpunkt (0,1) (x=0, y=1) liegt an A000h:320d bzw 
 A000h:0140h. Die Offsetadresse lt sich also fogendermaen berechnen:
 offset=320*y+x
 Eine Pascal procedure sieht dann ungefhr so aus:
 
 procedure setze_punkt_320_200(x,y:integer;farbe:byte);
 begin
      mem[$A000:320*y+x]:=farbe;
 end;
 
   
                
                TURBO PASCAL KURS II
                ====================

  Nach dem letzem einfachem Programm wollen wir diesmal eiwas auspruchsvol-
  lerer programmieren:
  
  
  program hallo_name1;
  
  uses crt;
  
  var Name             :string;   {Variable name ist ein string=zeichenkette}
      ch               :char;     {var. ch ist ein character=zeichen}
     
  begin 
      write('wie heit du? ');
      readln(name);
      writeln('hallo' , name , ' wie gehts? ');
      ch:=readkey;
  end.
  
  
  Nun  analysieren wir da Programm Zeile fr Zeile:
  
  program hallo_name1;
  Die Anweisung program (wird im engl. nur mit einem M geschrieben!) gibt 
  userem Programm einen Namen. Dieser Name mu ein gltiger bezeichner sein,
  darf daher nur Buchstaben, Zahlen und den Unterschtrich _ enthalten, mu 
  aber mit einem Buchstaben beginnen. Die program Anweisung darf weggelassen
  werden, dient also nur dem menschlichen Leser des Programms.
  
  uses crt;
  Diese Anweisung ist fr den Turbo Pascal Linker bestimmt, und sagt, da
  die Unit CRT mit eingebunden werden soll. Eine Unit enthllt weitere 
  Befehle, die sonst nicht verfgbar wren. Wir werden spter lernen wie man
  selbst Units erstellt.

  var Name             :string;   {Variable name ist ein string=zeichenkette}
      ch               :char;     {var. ch ist ein character=zeichen}
  

  Hierwerden Variablen deklaariert, anders als in Basic mssen alle Variablen
  vorher mit ihrem Typ dem Compiler angegeben werden.
  In diesem Fall ist Name eine String-variable, alo eine Zeichenkette, und ch
  ein einzelnes Zeichen. Ein Variablename m ein gltiger bezeichner sein,
  GRO/kleinschreibung wird nicht unterschieden.
  Nun die allgemeine Def. zu var:

  VAR bezeichner1, bezeichner2,...     :typ;
      be_3,...                         :typ2;
      ....
    
  zwischen var und dem Typ(String,cher,...) knnen mehrere Variablen stehen, 
  die durch kommata getrennt werden men, aber alle den selben Typ haben.
  In der nchsen Zeile knnen weiter Varablendefinitionen stehen, die alle
  durch ein Semikolon getrennt werden mssen.


  Zwischen den Schlsselwrtern begin und end. kommt das eigentliche Programm.
  Mit write wird der text "wie heit du? " ausgegeben, der Cursor bleibt aber
  in der selben Zeile.

  Mit readln(name); wird eine Eingabe von der Tastatur entgegengenommen, die
  mit Return abgeschlossen wird; diese eingabe, ein string, wird der variable
  name zugewiesen und der Cursor wird in die nchste Zeile gesetzt. Wenn man 
  dies verhindern will, mu man den befehl read benutzen.
  
  mit der Anweisung writeln('hallo' , name , ' wie gehts? '); wird zuerst der
  Text "hallo" ausgegeben, dann wird der inhalt der Variable name ausgegeben,
  und dan der text "wie gehts?" Der in hochkommas ' stehende text mu von der
  Variable mit einem Komma getrennt werden. Dies kann beliebig kombiniert 
  werden z.B.
  
  writeln (name1,name2,' hallo ','hallo',name345);
  
  Mit der Function readkey wird dem String ein Zeichen, das von der Tastatur
  eingelesen wird zugewiesen. Das dient hier um auf einen Tastendrck zu 
  warten.

  NUL
  
