home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / blckmail / bm08 / asmk3.bmt < prev    next >
Text File  |  1994-09-07  |  12KB  |  239 lines

  1.                   HEY! ICH BIN WIEDER DA, RETTE SICH WER KANN !!!!
  2.                   ────────────────────────────────────────────────
  3.  
  4.       Nachdem die ersten beiden Teile so eine Art einführenden Beitrag zu
  5.       dem Thema liefern sollten, kann man/frau ja mal mit interessanteren
  6.       Themen anfangen, wie da wäre z.B. die GRAFIK, der SOUND über den
  7.       Soundblaster usw., da gibt's wohl so schnell kein Ende, weil ja
  8.       jeder Schöne Sachen programmieren will, das ganze soll schnell
  9.       und zügig laufen, nicht flackern etc. etc.  ... o.k. die Lösungen
  10.       findet ihr zwar nicht hier, aber zumindest einige Ansätze, mit denen
  11.       ihr schon auf den richtigen Weg geführt werdet... AMEN.
  12.  
  13.       Also eine kleine Checkliste:
  14.       - der Grafikmodus 320*200 - 256 Farben / der Aufbau / => der Punkt
  15.       - die Farben und Palettenveränderungen
  16.       - das Plasma aus'm letzten Intro
  17.  
  18.       Der Grafikmodus ******************************************************
  19.       Der am weitestenverbreitete Grafikmodus für Spiele und Demos ist der
  20.       VGA-Standard-Modus $13.. eingestellt wirden der Modus, wie (fast) alle 
  21.       über den Int $10, also "mov ax,Modusnr/int 10h". => in diesem Fall:
  22.                 mov ax,13h   
  23.                 int 10h
  24.       Hier hat man den Vorteil über 256 von 2^18 Farben gebieten zu können, 
  25.       aber das war's auch schon fast an Vorteilen, die Auflösung beträgt nur 
  26.       320*200 (was natürlich den Vorteil hat, daß man ein Bild schnell auf-
  27.       gebaut hat). Die Adresse des "Bildschirms" befindet sich an dem Segment 
  28.       $A000. Die Punkte werden hier, da für jeder Punkt 8 Bit benötigt werden, 
  29.       jeder in einem eigenen Byte gespeichert, Punkt 1 an $A000:0000, Punkt 2 
  30.       an $A000:0001 usw. (in Wirklichkeit wird es anders gespeichert, aber so 
  31.       kann man auf die Pixel zugreifen). Die Reihenfolge ist von links nach 
  32.       rechts und oben nach unten (ach nee), folglich kann man einfach 
  33.       berechnen, daß jeder Punkt an der Stelle $A000:x+y*320 liegt, in 
  34.       Assembler sieht das dann so aus:
  35.            ; Die Koordinaten sind in den Registern CX/DX, die Farbe in BL
  36.            mov di,0a000h  ; <- Hier wird das Segment im ES gespeichert, damit
  37.            mov es,di      ;    man dort schreiben kann
  38.            mov ax,320     ; <- Man kann nun in AX 320 mit DX multiplizieren,
  39.            mul dx         ;         (DX wird zerstört!! 32-Bit Ergebniss!)
  40.            mov di,ax      ; <- und in einem Indexregister speichern
  41.            add di,cx      ; <- dazu kommt der X-Anteil des Punktes
  42.            mov [es:di],bl ; <- Nun nur noch die Farbe an den Punkt schreiben
  43.       Der Nachteil dieses Modus ist, daß man hier (ohne großen Aufwand zu
  44.       betreiben) nur eine Bildschirmseite hat, und folglich nichts ver-
  45.       steckt aufbauen kann...dafür müßte man das Chainen der vier Planes auf-
  46.       heben, was allerdings ein kleiner Aufwand ist, und das Setzten/Lesen
  47.       von Pixeln etwas verkompliziert, aber dazu vielleicht später etwas 
  48.       mehr...
  49.  
  50.       Die Farben *********************************************************
  51.       Klar, es gibt 256 Farben, angefangen wird natürlich mit Farbe 0, die
  52.       auch die Hintergrund-(und Rand-)farbe ist, die Standardpalette ist
  53.       aber nur in den wenigstens Fällen ausreichend und kann für jeden
  54.       beliebigen Zweck manipuliert werden. Das Verändern der Farbregister
  55.       kann über zwei verschiedene Wege erreicht werden, einmal durch den
  56.       Videointerrupt:
  57.             mov ax,1010h         ; <- Funktionsnummer: Farbenregister ändern
  58.             mov bx,Farbnummer           ; <- die Farbe
  59.             mov dh,Rotanteil (0-63)     ; <- Die Komponenten
  60.             mov ch,Grünanteil (0-63)
  61.             mov cl,Blauanteil (0-63)
  62.             int 10h                     ; Ausführen des Interrupts
  63.       Falls der Aufwand für 256 Farben (oder ein geringerer Teil) zu groß
  64.       erscheint kann man das natürlich auch durch eine andere Funktion er-
  65.       setzten, nur sollte man die Farbanteile in einer Tabelle gespeichert 
  66.       haben, jeweils den Rot-, Grün- und Blauanteil mit einem Byte:
  67.             mov ax,1012h
  68.             mov bx,Nummer der 1. zu ändernden Farbe
  69.             mov cx,Anzahl der zu ändernden Farbe
  70.             mov es,SEGMENT der Tabelle
  71.             mov dx,OFFSET der Tabelle
  72.             int 10h
  73.       Will man die Werte eines Registers auslesen, so verwendet man jeweils
  74.       die Funktionen 1015h für eine Farbe, oder 1017h um einen ganzen Block
  75.       auszulesen ... will man nun die Arbeit nicht einem Interrupt überlassen,
  76.       so kann man die ganze Sache auch persönlich in die Hand nehmen, indem
  77.       man die Ports anspricht:
  78.             mov dx,3c8h
  79.             mov al,Farbnummer
  80.             out dx,al
  81.             inc dx
  82.             mov al,Rotanteil
  83.             out dx,al
  84.             mov al,Grünanteil
  85.             out dx,al
  86.             mov al,Blauanteil                   ;   <- *
  87.             out dx,al
  88.       Bei manchen Grafikkarten entsteht hierbei ein ziemlicher Schnee auf dem
  89.       Bildschirm (z.B. bei meiner), aus welchem Grund auch immer, dann sollte 
  90.       man den horizontalen Strahlenlauf abfragen und beim Rücklauf den Blau-
  91.       wert setzten, die Zeit hierfür reicht aus, da muß man nicht bis zum 
  92.       vertikalen Strahlenrücklauf warten... Hierfür muß man an der Stelle (*)
  93.       einfach noch folgenden Source einsetzten:
  94.             mov dx,$03da      ; <- Abfragen des H-Sync
  95.             @Wait1:
  96.                in al,dx
  97.                test al,1
  98.             jnz @Wait1
  99.             @wait2:
  100.               in al,dx
  101.               test al,1
  102.             jz @wait2
  103.             mov dx,$03c9 ;<- zurücksetzten des DX-Registers, weiter mit Blau
  104.       Tja, bei manchen Karten ist es halt nötig, und bei anderen nicht, schon
  105.       ärgerlich wenn es keine reine Standards gibt, z.B. auch die hochauf-
  106.       lösenden Modi..tja... nu', falls man auf diese Weise mehrere Farben
  107.       verändern will, so muß man leider für sämtliche Farben diese Prozedur
  108.       durchlaufen ... alles hat seinen Preis.
  109.  
  110.       Das Plasma aus'm letzten Intro ***************************************
  111.       Als ich das Plasma im Intro sah war ich doch 'n bischen unglücklich...
  112.       wollte Midnight doch das Wackeln weglassen und dafür nur die Palette
  113.       rollen lassen, und es nun genau umgekehrt gemacht hat...aber damit
  114.       nun jeder selbst entscheiden kann, was man machen möchte, erkläre ich
  115.       diese relativ simple Art ein Plasma zu erzeugen:
  116.       1. Man erzeugt eine Tabelle, in der eine Sinuskurve gespeichert ist,
  117.          da das Zugreifen auf einen gespeicherten Wert wesentlich schneller 
  118.          geht, als jedesmal den Wert neu zu berechnen (verständlicherweise).
  119.       2. Man erstellt eine nette Palette, die durchgescrollt eine schöne
  120.          Farbgebung ergibt...
  121.       3. Man läßt nun jeden Punkt des Bildschirms durch einige Sinustrans-
  122.          formationen rasseln, malt ihn auf'n Schirm..
  123.       4. Man rollt die Palette, bis eine Taste gedrückt wird....
  124.       Wahlweise kann man auch eine Laufvariable einfügen, die das bestehende
  125.       Muster jeweils ein bischen verändert, in diesem Beispiel ist das
  126.       die Variable I, die abder eben entweder weggelassen werden kann, oder
  127.       einfach nur das "inc i" weglassen, und da immer nur die selben Punkte
  128.       übergemalt werden, wird keine Veränderung sichtbar...
  129.       Also, los geht's mit Schritt 1: Hmmm, eine ordentliche Sinuskurve
  130.       mit'm Assembler zu erstellen ist doch wohl etwas aufwendig, also
  131.       erstelt eine mit Pascal und speichert sie als Textfile ab, so daß
  132.       man sie im Assembler includen kann... das ist das beste, was man
  133.       in Arbeit/Ergebniss bekommen kann...
  134.       Schritt 2 ist Geschmackssache, man könnt es so anfangen, indem pal
  135.       ein Feld mit 768 Bytes ist (256*3) und dann mit
  136.                 mov di,SEG pal
  137.                 mov es,di
  138.                 mov di,OFFSET pal
  139.                 cld
  140.                 mov ax,0
  141.                 mov cx,384            
  142.                 stosw
  143.       erstmal auf Null setzt, damit man nur noch dort was eintragen muß,
  144.       wo man Farbe haben will, also:
  145.                 mov bl,0
  146.                 mov di,OFFSET pal   ; di als Zeiger auf die Palette
  147.             schleife:
  148.                 mov [di+2],bl         ; 0-63 als schwarz -> blau
  149.                 mov [di+64],bl        ; 64-127 als blau -> weiß  
  150.                 mov [di+65],bl
  151.                 mov [di+66],63
  152.                 mov [di+128],63       ; 128-191 als weiß -> blau
  153.                 sub [di+128],bl
  154.                 mov [di+129],63
  155.                 sub [di+129],bl
  156.                 mov [di+130],63
  157.                 mov [di+192],63      ; 192- als blau -> schwarz
  158.                 sub [di+192],bl
  159.  
  160.                 add di,3
  161.  
  162.                 inc bl              ; Schleife weiterrasseln
  163.                 cmp bl,64
  164.                 jne schleife
  165.       In etwa so, oder so ähnlich, natürlich muß man nachher noch die 
  166.       Palette in der Tabelle ausgeben, aber so o.s.ä. kann man einen 
  167.       einigermaßen netten Farbenverlauf hinbekommen.
  168.       Also nun zum eigentlichen Plasmamuster... zuerst brauchen wir noch 
  169.       eine Hilfsvariable im Datensegment, da wir nicht genug Register
  170.       haben... nenne mer se Y (a star was born)..
  171.   cld
  172.   mov dx,0a000h                   ; Ausgabe  in'n Screen
  173.   mov es,dx
  174.   @Start_all:
  175.     mov y,199                        ; Die Zeile
  176.     @y_schl:
  177.       mov cx,319                      ; schleifenanfang für X-Achse
  178.       xor ah,ah                       ; grafikoffsetanfang 
  179.       mov al,y
  180.       mov bx,320
  181.       mul bx
  182.       mov di,ax
  183.       mov si,OFFSET sin               ; si+bx auf richtigen eintrag 
  184.     @x_schl:
  185.       mov al,128                      ; nun folgende Sinuswerte addieren
  186.       mov bl,i                        ; sin(2*i+y)
  187.       add bl,i
  188.       add bl,y
  189.       add al,[si+bx]
  190.       mov bl,cl                       ; sin(x+i)
  191.       add bl,i
  192.       add al,[si+bx]
  193.       mov bl,y                        ; sin(2*y+4)
  194.       add bl,4
  195.       add bl,y
  196.       add al,[si+bx]
  197.        xor al,00010000b     ; optional "Schlieren" , mal die 1 ausprobieren
  198.       add bl,cl                       ;   sin(y+2*x+i)
  199.       add bl,cl
  200.       add bl,i
  201.       add al,[si+bx]
  202.         or al,1     ; <- beim Rollen kann man manchmal die 0 nicht rollen
  203.       stosb
  204.       loop @x_schl                    ; schleifenende 
  205.     dec y
  206.     jnz @y_schl
  207.       ;  inc i                        ;  <- je nach Geschmack (s.o.)
  208.     in al,$60                 ; Entweder bis Tastendruck, oder halt nur ein-
  209.     cmp al,10000000b    ; mal durchlaufen, s.o....
  210.     ja @Start_all
  211.       
  212.       Das wichtigste ist entweder das Verändern der Laufvariable, oder
  213.       das rollen der Palette, um die Veränderungen zu machen...da braucht
  214.       man nur noch die Palette folgende Prozedur durchlaufen zu lassen,
  215.       nachdem man einen Zwischen von 3 Byte (r) angelegt hat...
  216.            mov ax,SEG pal      ; Sicherheitskopie der ersten drei Byte
  217.            mov es,ax
  218.            mov di,OFFSET pal
  219.            mov si,OFFSET r
  220.            mov ax,[es:di]
  221.            mov [si],ax
  222.            mov al,[es:di+2]
  223.            mov [si+2],al
  224.            mov si,OFFSET pal   ; Rollen der Farben um eine Pos. nach unten
  225.            add si,3
  226.            cld
  227.            mov cx,765
  228.            rep movsb
  229.            mov si,OFFSET r     ; Kopieren des Anfang an das Ende
  230.            mov cx,3
  231.            rep movsb
  232.       Na schön, abgesehen davon, daß es in den diversen Teilen so einen oder
  233.       mehrere Fehler geben könnte, stimmt der Rest....ok, das war's für
  234.       dieses Mal, ich warte auf Vorschläge für'n nächsten Durchgang....
  235.  
  236.                                                         Trader
  237.  
  238.  
  239.