Einfache Grafik-Demos

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

Erwartet jetzt bitte nicht zu viel, ich poste hier nur einige extrem schlichte Demos die nur als Programmierbeispiel dienen sollen.
Auch kann der Code meistens noch verbessert werden wie ich es schon teilweise in anderen Beiträgen anhand von dortigen Beispielen und Erklärungen dazu erwähnt habe.

STON1024
Dieses kleine Grafikdemo benötigt einen 80386+, eine Vesa 2-Grafikkarte und einem Monitor den man mit dem Videomode von 1024x768 betreiben kann. Der Quellcode wurde für MASM 5 entwickelt.
Es wird der Vesamode 105h für 1024x768x256 mit Bankumschaltung verwendet. Dort bewegen sich über den Bildschirm kleine weisse Pixel die am Anfang in einem Labyrinth starten.
Wenn die Pixel den Rand des Labyrinths berühren, oder den Rand des Bildschirms berühren, oder sich gegenseitig berühren, dann prallen sie ab und machen einen Richtungswechsel.
Nach und nach kommen die meisten Pixel aus dem Labyrinth heraus. (Bei mir läuft diese Anwendung auch unter Windows XP, obwohl dort im Codebereich zur Laufzeit Schreibzugriffe gemacht werden.)
Die Anwendung kann mit der Escape-Taste beendet werden. Der Quellcode und die fertige Anwendung kann man zusammen von meiner Homepage herunterladen:
http://www.alice-dsl.net/freecracmaps/Tool/STON1024.ZIP

Code: Alles auswählen

; Dieser Quellcode kann z.B. mit dem Namen "Ston1024.asm" gespeichert werden.
; Assemblieren mit: Masm Ston1024.asm
; Linken mit: Link Ston1024.obj
.MODEL SMALL
.386
          Video_Mode   =     105h      ; VESA:1024x768x256
;--------------------------------------
          Video_Seg    =   0A000h      ; Grafik-Bildschirm-Segment
;--------------------------------------
          Xmax         =     400h      ; 1024
          Ymax         =     300h      ;  768
;----------------------------------------------------------------------------
          Cr           =      0Dh      ; Carriage Return
          Lf           =      0Ah      ; Line Feed
;----------------------------------------------------------------------------
          RGB_Port     =     3C8h      ; Farb-Anteile (write)
          Rast_Port    =     3DAh      ; Raster-Strahl
;--------------------------------------
          Tast_Port    =      60h      ; Tastatur-Controler
          Cmos_Port    =      70h      ; CMOS-Baustein
;----------------------------------------------------------------------------
          Anzahl       =     0FFh      ; Anzahl der Pixel (max 0FFh)
;----------------------------------------------------------------------------
          Farbe        =      0Fh      ; Farb-Nummer: 0 bis 255
          LFarbe       =      0Ch      ; Farb-Nummer: 0 bis 255
;----------------------------------------------------------------------------
          Max_X        =     Xmax-16   ; maximale und minimale
          Max_Y        = Xmax*(Ymax-16);  X/Y Positionen,
          Min_X        =       6       ; des Bewegungs-Bereichs
          Min_Y        =  Xmax*6
;----------------------------------------------------------------------------
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
START:    mov     ax, DATEN            ; DS auf Daten-Bereich
          mov     ds, ax
;----------------------------------------------------------------------------
          call SETFREE                 ; nicht belegten Speicher freigeben
;--------------------------------------
          mov     bx, 110h / 10h       ; Länge in Paragraphen
          call GETSPACE                ; Speicher anfordern
          jc  FEHLER2                  ; zuwenig Speicher
          mov     es, ax               ; Segment Video-Mode Information
;---------------------------------------------------------------------------
          mov     ax, 4F01h            ; Modus-Spezifische Informationen holen
          mov     cx, Video_Mode
          xor     di, di               ; Ziel-Offset
          int   10h                    ; VESA-BIOS
          cmp     ax, 4Fh
          jnz FEHLER3                  ; Funktion wird nicht unterstützt
;---------------------------------------------------------------------------
          mov     eax, DWORD PTR es:[0Ch] ; Zeiger auf Bankumschaltungs-Routine
          and     eax, eax
          jz  FEHLER3                  ; Funktion wird nicht unterstützt
          mov    DWORD PTR cs:[BANK1], eax
          mov    DWORD PTR cs:[BANK2], eax
          mov    DWORD PTR cs:[BANK3], eax
;---------------------------------------------------------------------------
          mov     ax, 4F02h            ; Video-Mode einschalten
          mov     bx, Video_Mode
          int   10h
          cmp     ax, 4Fh
          jnz FEHLER3                  ; Funktion wird nicht unterstützt
;---------------------------------------------------------------------------
          cli                          ; Software-Interrupts sperren
          in      al, Cmos_Port        ; Über CMOS-Baustein NMIs sperren
          or      al, 80h              ; dazu Bit 7 setzen
          out     Cmos_Port, al
;--------------------------------------
          mov     ax, Video_Seg        ; Bildschirm-Segment
          mov     fs, ax
;---------------------------------------------------------------------------
          call PIXOFF
;---------------------------------------------------------------------------
          mov     si, OFFSET SX0       ; Zeiger auf Positions-Tabelle
;--------------------------------------
HUN:      mov     ebp, [si]            ; X-Position holen
K0:       cmp     ebp, 150
          ja  short K1
          add     ebp, 9
          jmp  short K0
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
K1:       cmp     ebp, 340
          jb  short K2
          sub     ebp, 9
          jmp  short K1
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
K2:       mov     [si], ebp
          mov     ebp, [si+4]          ; Y-Position holen
K3:       cmp     ebp, 150*Xmax
          ja  short K4
          add     ebp, 9*Xmax
          jmp  short K3
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
K4:       cmp     ebp, 320*Xmax
          jb  short K5
          sub     ebp, 9*Xmax
          jmp  short K4
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
K5:       mov     [si+4], ebp
          add     si, 0Ch
          cmp     si, Anzahl*0Ch+OFFSET SX0
          jb  HUN
;---------------------------------------------------------------------------
          mov     si, OFFSET SX0       ; Zeiger auf Positions-Tabelle
;--------------------------------------
HIN:      mov     ebp, [si]            ; X-Position holen
          add     ebp, [si+4]          ; X-Position + Y-Position
          mov     [si+8], ebp          ; Adress-Offset retten
          add     si, 0Ch
          cmp     si, Anzahl*0Ch+OFFSET SX0
          jb  HIN
;---------------------------------------------------------------------------
          mov    WORD PTR[RETTDI], 100
LI0:      mov     bp, RETTDI           ; X1-Position holen links
          mov     si, 100              ; Y1-Position holen
          mov     cx, bp               ; X2-Position holen
          mov     dx, 400              ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 107
          jnz LI0
;--------------------------------------
          mov    WORD PTR[RETTDI], 100
LI1:      mov     bp, 100              ; X1-Position holen oben
          mov     si, RETTDI           ; Y1-Position holen
          mov     cx, 400              ; X2-Position holen
          mov     dx, si               ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 107
          jnz LI1
;--------------------------------------
          mov    WORD PTR[RETTDI], 400
LI3:      mov     bp, RETTDI           ; X1-Position holen rechts
          mov     si, 100              ; Y1-Position holen
          mov     cx, bp               ; X2-Position holen
          mov     dx, 407              ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 407
          jnz LI3
;--------------------------------------
          mov    WORD PTR[RETTDI], 400
LI4:      mov     bp, 100              ; X1-Position holen unten
          mov     si, RETTDI           ; Y1-Position holen
          mov     cx, 370              ; X2-Position holen
          mov     dx, si               ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 407
          jnz LI4
;--------------------------------------
          mov    WORD PTR[RETTDI], 370
LI5:      mov     bp, RETTDI           ; X1-Position holen rechts innen
          mov     si, 130              ; Y1-Position holen
          mov     cx, bp               ; X2-Position holen
          mov     dx, 407              ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 377
          jnz LI5
;--------------------------------------
          mov    WORD PTR[RETTDI], 130
LI6:      mov     bp, 130              ; X1-Position holen oben innen
          mov     si, RETTDI           ; Y1-Position holen
          mov     cx, 370              ; X2-Position holen
          mov     dx, si               ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 137
          jnz LI6
;--------------------------------------
          mov    WORD PTR[RETTDI], 130
LI7:      mov     bp, RETTDI           ; X1-Position holen links innen
          mov     si, 130              ; Y1-Position holen
          mov     cx, bp               ; X2-Position holen
          mov     dx, 370              ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 137
          jnz LI7
;--------------------------------------
          mov    WORD PTR[RETTDI], 370
LI8:      mov     bp, 130              ; X1-Position holen unten innen
          mov     si, RETTDI           ; Y1-Position holen
          mov     cx, 346              ; X2-Position holen
          mov     dx, si               ; Y2-Position holen
          inc    WORD PTR[RETTDI]
          call LINE
          cmp    WORD PTR[RETTDI], 377
          jnz LI8
;---------------------------------------------------------------------------
          xor     bx, bx               ; VESA:Bankumschaltung (Fenster A)
;---------------------------------------------------------------------------
       DB  0EAh                        ; Prefetch-Puffer löschen:
       DW  (OFFSET BEWEGE)             ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                    ; das Kommando JMP FAR CS:BEWEGE
;---------------------------------------------------------------------------
;                        B   E   W   E   G   U   N   G
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;----------------------------------------------------------------------------
BEWEGE:   mov     si, OFFSET SX0       ; Zeiger auf Positions-Tabelle
          mov     di, OFFSET STEP0X    ; Zeiger auf Stepper-  Tabelle
;----------------------------------------------------------------------------
          mov     dx, Rast_Port        ; Port des Rasterstrahls
STRAHL:   in      al, dx               ; Bewegung mit Raster-Strahl Port:3DA
          and     al, 8                ; synchronisieren
          jz  STRAHL
;----------------------------------------------------------------------------
ALL:      mov     ebp, [si]            ; X-Position holen
          mov    DWORD PTR[RETTX], ebp
          cmp    BYTE PTR[di+S_Len], 1 ; Plus/Minus-XFlag vergleichen
          jz  short FRAGX1             ;  wenn minus, dann springen
;--------------------------------------
FRAGX0:   cmp     ebp, Max_X           ; X-Position mit max.-X vergleichen
          jb  short MAKEX0             ;  wenn kleiner, springen
          mov    BYTE PTR[di+S_Len], 1 ; Minus-XFlag setzen
MAKEX1:   sub     ebp, [di]            ; X - XStepper 
          jmp  short ALLX
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
FRAGX1:   cmp     ebp, Min_X           ; X-Position mit min.-X vergleichen
          ja  short MAKEX1             ;  wenn größer, springen
          mov    BYTE PTR[di+S_Len], 0 ; Plus-XFlag setzen
MAKEX0:   add     ebp, [di]            ; X + XStepper 
ALLX:     mov     [si], ebp            ; neue X-Position retten
;----------------------------------------------------------------------------
          mov     ecx, [si+4]          ; Y-Pos. holen
          mov    DWORD PTR[RETTY], ecx
          cmp    BYTE PTR[di+S_Len+1],1 ; Plus/Minus-YFlag vergleichen
          jz  short FRAGY1             ;  wenn minus, dann springen
;--------------------------------------
FRAGY0:   cmp     ecx, Max_Y           ; Y-Position mit max.-Y vergleichen
          jb  short MAKEY0             ;  wenn kleiner, springen
          mov    BYTE PTR[di+S_Len+1],1 ; Minus-YFlag setzen
MAKEY1:   sub     ecx, [di+4]          ; Y - XStepper 
          jmp  short ALLY
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
FRAGY1:   cmp     ecx, Min_Y           ; Y-Position mit min.-Y vergleichen
          ja  short MAKEY1             ;  wenn größer, springen
          mov    BYTE PTR[di+S_Len+1],0 ; Plus-YFlag setzen
MAKEY0:   add     ecx, [di+4]          ; Y + YStepper 
ALLY:     mov     [si+4], ecx          ; neue Y-Position retten
;----------------------------------------------------------------------------
          add     ebp, ecx             ; X-Position + Y-Position
          mov     cx, di               ; di retten
          mov     di, [si+8]           ; alten Offset zum löschen holen
          mov     dx, [si+0Ah]         ; alte Bank holen
          mov     [si+8], ebp          ; neuer Adress-Offset + Bank retten
          mov     RETTDI, di           ; alten Offset retten
          mov     RETTDX, dx           ; alte Bank retten
          cmp     dx, RETTBA           ;  dieselbe Bank ?
          jz  short NOBANK
;-------------------------------
          mov     RETTBA, dx
;---------------------------
        DB 9Ah                         ; CALL FAR: BANKSET
BANK1   DD ?                           ; Zeiger auf Bankumschaltungs-Routine
;-------------------------------
NOBANK:   mov     dx, [si+0Ah]         ; Bank holen
          mov    BYTE PTR fs:[di], 0   ; Hintergrund löschen
;----------------------------------------------------------------------------
          cmp     dx, RETTBA           ;  dieselbe Bank ?
          jz  short COLOR
;--------------------------------
          mov     RETTBA, dx
;---------------------------
        DB 9Ah                         ; CALL FAR: BANKSET
BANK2   DD ?                           ; Zeiger auf Bankumschaltungs-Routine
;--------------------------------
COLOR:    mov     di, cx               ; di wiederholen
;---------------------------------------------------------------------------
;                 Abfrage auf Kollision mit Hintergrund
;---------------------------------------------------------------------------
          cmp    BYTE PTR fs:[bp], 0   ;  Hintergrund-Kollision ?
          jz  FREWA                    ; nein, weiter
;--------------------------------------
          cmp    BYTE PTR fs:[bp+8], 0 ;  ist 8x rechts daneben etwas ?
          jz  short GX
          cmp    BYTE PTR fs:[bp-8], 0 ;  ist 8x links daneben etwas ?
          jz  short GX
;---------
          cmp    BYTE PTR[di+S_Len+1], 1 ; Richtungs-Flags Y
          jz  short GO
          cmp    BYTE PTR fs:[bp+Xmax], 0 ;  ist darunter etwas ?
          jnz short LL                    ; ja, Y-Flag umdrehen 
          jmp  short GX
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
GO:       cmp    BYTE PTR fs:[bp-Xmax], 0 ;  ist darüber etwas ?
          jz  short GX                    ; nein, weiter
LL:       xor    BYTE PTR[di+S_Len+1], 1 ; Richtungs-Flags Y umdrehen
          jmp  short RL
;------------------------------------------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
GX:       cmp    BYTE PTR[di+S_Len], 1 ; Richtungs-Flags X
          jz  short GL
          cmp    BYTE PTR fs:[bp+1], 0 ;  ist rechts daneben etwas ?
          jnz short RR                 ; ja, X-Flag umdrehen
          jmp  short RL
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
GL:       cmp    BYTE PTR fs:[bp-1], 0 ;  ist links daneben etwas ?
          jz  short RL                 ; nein, unten/oben abfragen
RR:       xor    BYTE PTR[di+S_Len], 1 ; Richtungs-Flags X umdrehen
;--------------------------------
RL:       mov     eax, DWORD PTR[RETTX] ; alte Position restaurieren
          mov     edx, DWORD PTR[RETTY]
          mov     [si], eax            ; X-Pos.
          mov     eax, DWORD PTR[RETTDI]
          mov     [si+4], edx          ; Y-Pos.
          mov     [si+8], eax          ; Adress-Offset + Bank
          jmp  short WALL              ; nochmal berechnen
;---------------------------------------------------------------------------
;                 Abfrage auf Kollision untereinander
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
FREWA:    mov     ax, si
          mov     si, OFFSET SX0       ; Zeiger auf Positions-Tabelle
          mov     di, OFFSET STEP0X    ; Zeiger auf Stepper-  Tabelle
WATCH:    cmp     si, ax
          jz  short NOCHE
          cmp     ebp, [si+8]
          jnz short NOCHE
          mov     si, ax               ; Treffer !
          xor    WORD PTR[di+S_Len], 101h ; beide Richtungen umdrehen
          mov     di, cx
          xor    WORD PTR[di+S_Len], 101h
          jmp  short WALL
;--------------------------------------
 org START + ((($-START)/16)*16) + 16
;--------------------------------------
NOCHE:    add     si, 0Ch
          add     di, 8
          cmp     si, Anzahl*0Ch+OFFSET SX0 ; Tabellen-Ende erreicht ?
          jnz WATCH
          mov     si, ax
          mov     di, cx               ; di wiederholen
;---------------------------------------------------------------------------
;              Pixel nur setzen, wenn keine Kollision.
;---------------------------------------------------------------------------
          mov    BYTE PTR fs:[bp],Farbe ; Farb-Byte zum Bildschirm
;---------------------------------------------------------------------------
WALL:     add     si, 0Ch              ; Tabellen-Zeiger erhöhen (Positions)
          add     di, 8                ; Tabellen-Zeiger erhöhen (Stepper)
          cmp     si, Anzahl*0Ch+OFFSET SX0 ; Tabellen-Ende erreicht ?
          jb  ALL                      ; sonst nächsten Punkt
;----------------------------------------------------------------------------
          in      al, Tast_Port        ; TASTE vom PORT holen
          dec     al                   ; Escape-Taste gedrückt ?
          jnz BEWEGE
;---------------------------------------------------------------------------
;                        P r o g r a m m  -  E n d e
;---------------------------------------------------------------------------
          in      al, Cmos_Port        ; NMIs wieder einschalten.
          and     al, 7Fh              ; Dazu Bit 7 löschen
          out     Cmos_Port, al
          sti                          ; IRQ`s wieder erlauben
;--------------------------------------
          mov     ax, 3                ; Text-Mode anschalten
          int   10h
;--------------------------------------
          mov     ah, 1                ; Tastatur-Puffer löschen
          int   16h
;----------------------------------------------------------------------------
          xor     cl, cl               ; ERRORLEVEL 0
;----------------------------------------------------------------------------
DOS:      mov     al, cl
          mov     ah, 4Ch              ; Dos-Rücksprung
          int   21h
;---------------------------------------------------------------------------
;                    F e h l e r   T e x t e   a u s g e b e n
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
FEHLER2:  mov     cl, 2                ; ERRORLEVEL 2
          mov     dx, OFFSET ERRTEX2   ; zuwenig Speicher
;--------------------------------------
FILERR:   mov     ah, 9                ; Text ausgeben
          int   21h
          jmp  short DOS
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
FEHLER3:  mov     cl, 3                ; ERRORLEVEL 3
          mov     dx, OFFSET ERRTEX3   ; Video-Mode wird nicht unterstützt
          jmp  short FILERR
;---------------------------------------------------------------------------
;                  U  N  T  E  R  -  P  R  O  G  R  A  M  M  E
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
;                     S p e i c h e r     f r e i g e b e n
;---------------------------------------------------------------------------
SETFREE:  mov     bx, ss               ; zunächst die beiden Segmentadressen
          mov     ax, es               ; voneinander abziehen. Das ergibt die
          sub     bx, ax               ; Anzahl der Paragraphen vom PSP bis
                                       ; zum Anfang des Stack
          mov     ax, sp               ; da sich der Stackpointer am Ende des
          add     ax, 0Fh              ; Stacksegments befindet, gibt sein
          shr     ax, 4                ; Inhalt die Länge des Stacks an
          add     bx, ax               ; zur bisherigen Länge hinzuaddieren
          mov     ah, 4Ah              ; ES:BX = Größe an DOS übergeben
          int   21h
          ret
;---------------------------------------------------------------------------
;                     S p e i c h e r     a n f o r d e r n
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
GETSPACE: mov     ah, 48h              ; BX = Größe in Paragraphen
          int   21h
          ret
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
LINE:     mov     bx, 4345h         ; Code für inc bx und inc bp
          sub     cx, bp            ; DELTAX=X2-X1 bilden
          jge short DELTAX_P         ; X2>X1?
          mov     bl, 4Dh           ; nein, Code für dec bp
          neg     cx                ; und DELTAX umdrehen
DELTAX_P: sub     dx, si            ; DELTAY=Y2-Y1 bilden
          jge short DELTAY_P         ; Y2>Y1?
          mov     bh, 4Bh           ; nein, Code für dec bx
          neg     dx                ; und DELTAY umdrehen
DELTAY_P: mov    WORD PTR cs:[DABGROS], bx ; Ink/Dek im Code abspeichern
          cmp     cx, dx            ; DELTAX>DELTAY?
          jge short DELTAX_G         ; ja, verzweige
          mov     bl, 90h           ; Y ist Laufvariable für X NOP eintragen
          mov     ax, dx
          mov     dx, cx
          mov     cx, ax
          jmp  short ACHSE
;------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;------------------------------------
DELTAX_G: mov     bh, 90h           ; X ist Laufvariable für Y NOP eintragen
ACHSE:    add     dx, dx            ; Ink. für Laufvariable INCB bestimmen
          mov    WORD PTR cs:[DABKLEI], bx ; im Code ablegen
          mov     ax, dx            ; nach bp übertragen
          sub     dx, cx            ; DAB bestimmen
          mov     bx, si            ; Y1 holen
          mov     di, dx            ; DAB nach di übertragen
          sub     dx, cx            ; INCA nach dx
;----------------------------------------------------------------------------
SCHLEIFE: mov     si, bx            ; Pixel-Setzer
          mov     RETTAX, ax        ; AX-Reg. retten
          shl     si, 2             ; Y * 4 als Index in der Zeilen-Tabelle
          mov     RETTDX, dx        ; DX-Reg. retten
          mov     dx, [si+2]        ; Bank holen
          mov     si, [si]          ; Zeilen-OFFSET holen
          add     si, bp            ; Y + X
          adc     dl, 0             ; Überlauf zur Bank
          cmp     dx, RETTBA        ;  dieselbe Bank ?
          jz  short NBNK
;-----------------------------------
          mov     RETTBX, bx
          mov     RETTBA, dx
          xor     bx, bx
;---------------------------
        DB 9Ah                      ; CALL FAR: BANKSET
BANK3   DD ?                        ; Zeiger auf Bankumschaltungs-Routine
;---------------------------
          mov     bx, RETTBX
;-----------------------------------
NBNK:     mov     ax, RETTAX        ; Register wiederholen
          mov     dx, RETTDX
          mov    BYTE PTR fs:[si],LFarbe ; Farb-Byte schreiben 0-255
; - - - - - - - - - - - - - - - - - -
          and     di, di            ; DAB>0?
          jge short DABGROS         ; ja, verzweige
DABKLEI:  inc     bp                ; hier wird der
          inc     bx                ; Code modifiziert
          add     di, ax            ; DAB=DAB+INCB
          dec     cx                
          jnz SCHLEIFE              ; Schleife schließen
          ret
;------------------------------------
 org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;------------------------------------
DABGROS:  inc     bp                ; hier wird der
          inc     bx                ; Code modifiziert
          add     di, dx            ; Schleife schließen
          dec     cx
          jnz SCHLEIFE              ; und weiter
          ret
;---------------------------------------------------------------------------
;              T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
PIXOFF:   xor      si, si
          xor      bx, bx
;------------------------------------
AGAIN:    mov      ax, es:[10h]
          mul      bx
          mov      [si], ax
          mov      [si+2], dx
          inc      bx
          add      si, 4
          cmp      bx, Ymax
          jb  AGAIN
          ret
;---------------------------------------------------------------------------
  CODE ends
;---------------------------------------------------------------------------
;                   D  A  T  E  N     -     B  E  R  E  I  C  H
;---------------------------------------------------------------------------
  DATEN SEGMENT use32 'DATA'
 org 0
;----------------------------------------------------------------------------
PIXTAB DD Ymax dup (0)                  ; Tabelle der Zeilen-Anfänge
;----------------------------------------------------------------------------
;                             Positions - Tabelle
;----------------------------------------------------------------------------
SX0    DD 439, 251 * XMax, ?            ; X, Y * XMax, Offset
       DD 513, 240 * XMax, ?
       DD 625,  30 * XMax, ?
       DD 733, 150 * XMax, ?
       DD 843,  12 * XMax, ?
       DD 955, 248 * XMax, ?
       DD  63, 390 * XMax, ?
       DD 177, 486 * XMax, ?
       DD 482, 573 * XMax, ?
       DD 592, 467 * XMax, ?
       DD 663, 326 * XMax, ?
       DD 711, 683 * XMax, ?
       DD 843, 536 * XMax, ?
       DD 937, 420 * XMax, ?
       DD  48, 317 * XMax, ?
       DD 156,  12 * XMax, ?

       DD 412, 231 * XMax, ?
       DD 542, 326 * XMax, ?
       DD 693, 429 * XMax, ?
       DD 771, 523 * XMax, ?
       DD 823, 685 * XMax, ?
       DD 947, 732 * XMax, ?
       DD  83, 622 * XMax, ?
       DD 126, 515 * XMax, ?
       DD 413, 422 * XMax, ?
       DD 567, 326 * XMax, ?
       DD 633, 234 * XMax, ?
       DD 742, 192 * XMax, ?
       DD 852,  70 * XMax, ?
       DD 923, 250 * XMax, ?
       DD  62, 374 * XMax, ?
       DD 470, 451 * XMax, ?

       DD 566, 433 * XMax, ?
       DD 233, 654 * XMax, ?
       DD 723, 222 * XMax, ?
       DD 926, 274 * XMax, ?
       DD 560, 557 * XMax, ?
       DD 626, 313 * XMax, ?
       DD 418, 177 * XMax, ?
       DD 757, 653 * XMax, ?
       DD 758, 170 * XMax, ?
       DD  85, 735 * XMax, ?
       DD 248, 453 * XMax, ?
       DD 463, 366 * XMax, ?
       DD 770, 632 * XMax, ?
       DD 654, 267 * XMax, ?
       DD 839, 634 * XMax, ?
       DD 545, 722 * XMax, ?

       DD 454, 734 * XMax, ?
       DD 679, 557 * XMax, ?
       DD 946, 323 * XMax, ?
       DD 238, 707 * XMax, ?
       DD  43,  34 * XMax, ?
       DD 546, 677 * XMax, ?
       DD 639, 434 * XMax, ?
       DD 475, 558 * XMax, ?
       DD 954, 654 * XMax, ?
       DD 136, 337 * XMax, ?
       DD 464, 253 * XMax, ?
       DD 577, 566 * XMax, ?
       DD 724,  43 * XMax, ?
       DD 897, 227 * XMax, ?
       DD 668, 345 * XMax, ?
       DD  88, 623 * XMax, ?

       DD 442, 332 * XMax, ?
       DD 723, 676 * XMax, ?
       DD 472, 533 * XMax, ?
       DD 154, 379 * XMax, ?
       DD 546, 123 * XMax, ?
       DD 827, 611 * XMax, ?
       DD 544, 724 * XMax, ?
       DD 359, 565 * XMax, ?
       DD 877, 546 * XMax, ?
       DD 951, 342 * XMax, ?
       DD 878, 168 * XMax, ?
       DD 632, 749 * XMax, ?
       DD 427, 536 * XMax, ?
       DD 614, 483 * XMax, ?
       DD 761, 345 * XMax, ?
       DD 723, 736 * XMax, ?

       DD 249,  36 * XMax, ?
       DD 579, 644 * XMax, ?
       DD 839, 423 * XMax, ?
       DD 438, 347 * XMax, ?
       DD 888, 248 * XMax, ?
       DD 643, 658 * XMax, ?
       DD 828, 746 * XMax, ?
       DD 583, 453 * XMax, ?
       DD 147, 288 * XMax, ?
       DD 433, 235 * XMax, ?
       DD 698, 586 * XMax, ?
       DD  53, 747 * XMax, ?
       DD 797, 573 * XMax, ?
       DD 836, 231 * XMax, ?
       DD 479, 450 * XMax, ?
       DD 243, 727 * XMax, ?

       DD 657, 265 * XMax, ?
       DD 711, 622 * XMax, ?
       DD 889, 458 * XMax, ?
       DD 558, 285 * XMax, ?
       DD 224, 737 * XMax, ?
       DD 582, 622 * XMax, ?
       DD 766, 511 * XMax, ?
       DD 814, 351 * XMax, ?
       DD 921, 275 * XMax, ?
       DD 433, 659 * XMax, ?
       DD  40, 254 * XMax, ?
       DD 496, 660 * XMax, ?
       DD  48, 438 * XMax, ?
       DD 624, 369 * XMax, ?
       DD 312, 474 * XMax, ?
       DD 667, 666 * XMax, ?

       DD 278, 753 * XMax, ?
       DD 533, 436 * XMax, ?
       DD 756, 291 * XMax, ?
       DD 890, 552 * XMax, ?
       DD 369, 711 * XMax, ?
       DD 230, 534 * XMax, ?
       DD 677, 727 * XMax, ?
       DD 819, 443 * XMax, ?
       DD 553, 399 * XMax, ?
       DD 836, 266 * XMax, ?
       DD 474, 630 * XMax, ?
       DD 797, 317 * XMax, ?
       DD 638, 569 * XMax, ?
       DD 842, 686 * XMax, ?
       DD 971,  83 * XMax, ?
       DD 599, 638 * XMax, ?

       DD 368, 767 * XMax, ?
       DD  24, 424 * XMax, ?
       DD 597, 259 * XMax, ?
       DD 865, 197 * XMax, ?
       DD 743, 270 * XMax, ?
       DD 459, 349 * XMax, ?
       DD  59, 459 * XMax, ?
       DD 427, 327 * XMax, ?
       DD 715, 715 * XMax, ?
       DD 980, 680 * XMax, ?
       DD 377, 577 * XMax, ?
       DD 845, 345 * XMax, ?
       DD 473, 173 * XMax, ?
       DD 608, 408 * XMax, ?
       DD 783, 283 * XMax, ?
       DD 825, 625 * XMax, ?

       DD 412, 512 * XMax, ?
       DD 242, 642 * XMax, ?
       DD 293, 733 * XMax, ?
       DD 571, 571 * XMax, ?
       DD 623, 323 * XMax, ?
       DD 467, 267 * XMax, ?
       DD 683, 713 * XMax, ?
       DD 826, 526 * XMax, ?
       DD 113, 413 * XMax, ?
       DD 667, 267 * XMax, ?
       DD 533, 633 * XMax, ?
       DD 648, 188 * XMax, ?
       DD 858, 458 * XMax, ?
       DD 883, 383 * XMax, ?
       DD 962, 162 * XMax, ?
       DD 770, 670 * XMax, ?

       DD 434, 634 * XMax, ?
       DD 357, 457 * XMax, ?
       DD 123, 323 * XMax, ?
       DD 777, 767 * XMax, ?
       DD 834, 634 * XMax, ?
       DD 477, 177 * XMax, ?
       DD 264, 724 * XMax, ?
       DD 458, 538 * XMax, ?
       DD 654, 144 * XMax, ?
       DD 837, 537 * XMax, ?
       DD  93, 353 * XMax, ?
       DD 776, 776 * XMax, ?
       DD 543, 243 * XMax, ?
       DD 427, 527 * XMax, ?
       DD  45, 345 * XMax, ?
       DD 523, 123 * XMax, ?

       DD 638, 558 * XMax, ?
       DD 773, 425 * XMax, ?
       DD 196, 683 * XMax, ?
       DD 443, 594 * XMax, ?
       DD 558, 643 * XMax, ?
       DD 830, 634 * XMax, ?
       DD 414, 362 * XMax, ?
       DD 331, 145 * XMax, ?
       DD 661, 232 * XMax, ?
       DD 434, 321 * XMax, ?
       DD 376, 555 * XMax, ?
       DD 598, 388 * XMax, ?
       DD 814, 645 * XMax, ?
       DD 940, 243 * XMax, ?
       DD 537, 589 * XMax, ?
       DD 375, 534 * XMax, ?

       DD 225, 457 * XMax, ?
       DD 168, 283 * XMax, ?
       DD  57, 725 * XMax, ?
       DD 296, 558 * XMax, ?
       DD 372, 335 * XMax, ?
       DD 484, 692 * XMax, ?
       DD 543, 634 * XMax, ?
       DD 639, 212 * XMax, ?
       DD 738, 166 * XMax, ?
       DD 867, 288 * XMax, ?
       DD 933, 543 * XMax, ?
       DD 696, 313 * XMax, ?
       DD 429,  64 * XMax, ?
       DD 122, 448 * XMax, ?
       DD 585, 727 * XMax, ?
       DD 745, 573 * XMax, ?

       DD 534,  34 * XMax, ?
       DD 757, 657 * XMax, ?
       DD  23, 323 * XMax, ?
       DD 777, 167 * XMax, ?
       DD 934, 634 * XMax, ?
       DD 277, 477 * XMax, ?
       DD 164, 734 * XMax, ?
       DD 558, 358 * XMax, ?
       DD 654, 454 * XMax, ?
       DD 787, 237 * XMax, ?
       DD 893, 453 * XMax, ?
       DD 476, 376 * XMax, ?
       DD 243, 543 * XMax, ?
       DD 627, 727 * XMax, ?
       DD 845, 545 * XMax, ?
       DD 923, 223 * XMax, ?

       DD 938, 258 * XMax, ?
       DD 673, 525 * XMax, ?
       DD  96, 383 * XMax, ?
       DD 143, 794 * XMax, ?
       DD 258, 643 * XMax, ?
       DD 330, 734 * XMax, ?
       DD 414, 562 * XMax, ?
       DD 531, 385 * XMax, ?
       DD 661, 132 * XMax, ?
       DD 734, 621 * XMax, ?
       DD 876, 755 * XMax, ?
       DD 998, 288 * XMax, ?
       DD 914, 645 * XMax, ?
       DD 840, 343 * XMax, ?
       DD 737, 589 * XMax, ?
       DD 675, 234 * XMax, ?

       DD 525, 257 * XMax, ?
       DD 478, 483 * XMax, ?
       DD 557, 325 * XMax, ?
       DD 696, 258 * XMax, ?
       DD 572, 535 * XMax, ?
       DD 484, 692 * XMax, ?
       DD 343, 634 * XMax, ?
       DD 239, 512 * XMax, ?
       DD 138, 266 * XMax, ?
       DD 467, 388 * XMax, ?
       DD 833, 143 * XMax, ?
       DD 696, 513 * XMax, ?
       DD 529, 674 * XMax, ?
       DD 422, 448 * XMax, ?
       DD 385, 657 * XMax, ?
       DD 245, 673 * XMax, ?
;---------------------------------------------------------------------------
;                               Stepper - Tabelle
;---------------------------------------------------------------------------
STEP0X DD 1, 1 * XMax                   ; Anzahl Pixel, der horizontalen 
       DD 1, 1 * XMax                   ; und vertikalen Bewegung(Step X,Y)
       DD 1, 3 * XMax
       DD 1, 4 * XMax
       DD 1, 1 * XMax
       DD 2, 1 * XMax
       DD 2, 2 * XMax
       DD 2, 3 * XMax
       DD 2, 4 * XMax
       DD 2, 1 * XMax
       DD 5, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 3 * XMax
       DD 3, 4 * XMax
       DD 3, 1 * XMax
       DD 4, 1 * XMax

       DD 4, 2 * XMax
       DD 4, 3 * XMax
       DD 4, 4 * XMax
       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 5 * XMax
       DD 1, 4 * XMax
       DD 1, 1 * XMax
       DD 1, 1 * XMax
       DD 2, 1 * XMax
       DD 3, 5 * XMax
       DD 4, 1 * XMax
       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 3 * XMax
       DD 1, 4 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 3 * XMax
       DD 2, 3 * XMax
       DD 2, 5 * XMax
       DD 2, 2 * XMax
       DD 2, 2 * XMax
       DD 2, 1 * XMax
       DD 3, 1 * XMax
       DD 5, 2 * XMax
       DD 3, 3 * XMax
       DD 3, 3 * XMax
       DD 4, 1 * XMax
       DD 2, 2 * XMax
       DD 4, 3 * XMax
       DD 4, 5 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 2 * XMax
       DD 1, 4 * XMax
       DD 2, 1 * XMax
       DD 2, 2 * XMax
       DD 3, 3 * XMax
       DD 2, 5 * XMax
       DD 3, 1 * XMax
       DD 3, 3 * XMax
       DD 3, 2 * XMax
       DD 3, 5 * XMax
       DD 4, 1 * XMax
       DD 5, 2 * XMax
       DD 4, 3 * XMax
       DD 1, 2 * XMax

       DD 3, 1 * XMax
       DD 1, 2 * XMax
       DD 5, 3 * XMax
       DD 2, 4 * XMax
       DD 2, 1 * XMax
       DD 2, 2 * XMax
       DD 5, 3 * XMax
       DD 2, 4 * XMax
       DD 3, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 5 * XMax
       DD 3, 4 * XMax
       DD 4, 1 * XMax
       DD 3, 2 * XMax
       DD 4, 5 * XMax
       DD 2, 2 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 5 * XMax
       DD 1, 2 * XMax
       DD 2, 1 * XMax
       DD 1, 5 * XMax
       DD 2, 3 * XMax
       DD 5, 2 * XMax
       DD 1, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 5 * XMax
       DD 1, 1 * XMax
       DD 2, 1 * XMax
       DD 3, 2 * XMax
       DD 1, 5 * XMax
       DD 1, 2 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 5 * XMax
       DD 1, 3 * XMax
       DD 3, 1 * XMax
       DD 2, 5 * XMax
       DD 2, 1 * XMax
       DD 2, 1 * XMax
       DD 5, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 3 * XMax
       DD 3, 1 * XMax
       DD 3, 5 * XMax
       DD 3, 2 * XMax
       DD 2, 3 * XMax
       DD 4, 1 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 5 * XMax
       DD 5, 4 * XMax
       DD 2, 1 * XMax
       DD 1, 1 * XMax
       DD 2, 3 * XMax
       DD 2, 5 * XMax
       DD 3, 1 * XMax
       DD 3, 2 * XMax
       DD 1, 3 * XMax
       DD 2, 5 * XMax
       DD 3, 1 * XMax
       DD 5, 2 * XMax
       DD 1, 5 * XMax
       DD 2, 1 * XMax

       DD 1, 1 * XMax
       DD 1, 1 * XMax
       DD 5, 3 * XMax
       DD 1, 2 * XMax
       DD 2, 1 * XMax
       DD 5, 2 * XMax
       DD 2, 3 * XMax
       DD 2, 5 * XMax
       DD 1, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 5 * XMax
       DD 3, 3 * XMax
       DD 1, 1 * XMax
       DD 4, 1 * XMax
       DD 5, 3 * XMax
       DD 4, 2 * XMax

       DD 3, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 3 * XMax
       DD 5, 3 * XMax
       DD 2, 1 * XMax
       DD 2, 2 * XMax
       DD 5, 3 * XMax
       DD 2, 1 * XMax
       DD 3, 1 * XMax
       DD 3, 2 * XMax
       DD 3, 5 * XMax
       DD 1, 3 * XMax
       DD 4, 1 * XMax
       DD 1, 2 * XMax
       DD 4, 1 * XMax
       DD 1, 5 * XMax

       DD 1, 1 * XMax
       DD 1, 1 * XMax
       DD 1, 3 * XMax
       DD 1, 5 * XMax
       DD 2, 1 * XMax
       DD 2, 2 * XMax
       DD 1, 1 * XMax
       DD 1, 5 * XMax
       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 3, 1 * XMax
       DD 3, 5 * XMax
       DD 4, 1 * XMax
       DD 1, 2 * XMax
       DD 5, 3 * XMax
       DD 3, 1 * XMax

       DD 1, 1 * XMax
       DD 5, 1 * XMax
       DD 3, 3 * XMax 
       DD 1, 4 * XMax
       DD 2, 3 * XMax
       DD 5, 1 * XMax
       DD 2, 3 * XMax
       DD 2, 5 * XMax
       DD 3, 1 * XMax
       DD 3, 2 * XMax
       DD 1, 5 * XMax
       DD 3, 1 * XMax
       DD 5, 3 * XMax
       DD 3, 1 * XMax
       DD 4, 3 * XMax
       DD 5, 2 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 3 * XMax
       DD 5, 4 * XMax
       DD 2, 1 * XMax
       DD 1, 1 * XMax
       DD 2, 5 * XMax
       DD 3, 4 * XMax
       DD 3, 3 * XMax
       DD 1, 2 * XMax
       DD 3, 5 * XMax
       DD 3, 4 * XMax
       DD 4, 1 * XMax
       DD 3, 5 * XMax
       DD 1, 3 * XMax
       DD 5, 4 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 5, 3 * XMax
       DD 1, 2 * XMax
       DD 2, 1 * XMax
       DD 5, 2 * XMax
       DD 2, 1 * XMax
       DD 2, 3 * XMax
       DD 5, 1 * XMax
       DD 3, 3 * XMax
       DD 3, 3 * XMax
       DD 3, 5 * XMax
       DD 2, 1 * XMax
       DD 3, 1 * XMax
       DD 2, 5 * XMax
       DD 4, 2 * XMax

       DD 1, 5 * XMax
       DD 3, 1 * XMax
       DD 1, 3 * XMax
       DD 1, 5 * XMax
       DD 2, 1 * XMax
       DD 1, 2 * XMax
       DD 2, 3 * XMax
       DD 5, 1 * XMax
       DD 3, 3 * XMax
       DD 3, 2 * XMax
       DD 5, 3 * XMax
       DD 3, 3 * XMax
       DD 1, 1 * XMax
       DD 5, 2 * XMax
       DD 2, 3 * XMax
       DD 4, 5 * XMax

       DD 1, 1 * XMax
       DD 1, 2 * XMax
       DD 1, 5 * XMax
       DD 1, 4 * XMax
       DD 2, 1 * XMax
       DD 1, 5 * XMax
       DD 2, 3 * XMax
       DD 2, 4 * XMax
       DD 3, 5 * XMax
       DD 5, 2 * XMax
       DD 3, 1 * XMax
       DD 2, 5 * XMax
       DD 3, 1 * XMax
       DD 2, 2 * XMax
       DD 1, 3 * XMax
       DD 5, 2 * XMax
;----------------------
S_Len = ($-STEP0X)
;---------------------------------------------------------------------------
;                         Tabelle der Richtungs-Flags
;---------------------------------------------------------------------------
                          ; plus(0) / minus(1) für X,Y
W0 DB (Anzahl+1)/4 DUP(0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0)
;---------------------------------------------------------------------------
RETTX  DD ?
RETTY  DD ?
RETTBA DW 0                             ; aktuelle Video-Bank
RETTAX DW ?
RETTBX DW ?
RETTDI DW ?
RETTDX DW ?
;---------------------------------------------------------------------------
ERRTEX2 DB Cr, Lf, "zuwenig Speicher frei.", Cr, Lf, "$"
ERRTEX3 DB Cr, Lf, "Der benutzte Video-Mode, wird nicht unterstützt.", Cr, Lf, "$"
  DATEN ends
;---------------------------------------------------------------------------
  STAPEL SEGMENT use16 STACK 'STACK'
        DB 10h dup (?)
  STAPEL ends
 end
Quellen:
Eine Tabelle der verwendeten x86-Opcodes findet man hier: http://ref.x86asm.net/coder32.html
MASM 5 kann man hier herunterladen: http://microprocessados.lesc.ufc.br/dow ... masm51.zip
Das Public-Dokument für Vesa findet man hier(Login erforderlich): http://www.vesa.org/Standards/free.htm
vbe3.pdf

Haftungsausschluß:
Eine Haftung für Schäden die durch die Benutzung der Demos möglicherweise auftreten können übernehme ich nicht. Die Benutzung geschieht auf eigenes Risiko. Dieses gilt auch für alle nachfolgenden Demos.

Dirk
Zuletzt geändert von freecrac am Sa 25. Sep 2010, 12:53, insgesamt 12-mal geändert.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

TRIPSTON
Dieses kleine Grafikdemo benötigt eine CPU mit MMX, eine Vesa 3-Grafikkarte und einen analogen Monitor den man mit dem Videomode von 1024x768 in 100 HZ betreiben kann und ca. 96 KHZ unterstüzt.
Eine Überprüfung ob ein verwendeter analoger CRT-Monitor das verträgt wird nicht vorgenommen. Ältere analoge Monitore könnten hierbei beschädigt werden und kaputt gehen.
Auf meinem 28" LCD wird die hohe Refreshrate ignoriert und die Anwendung wird mit 60 HZ ausgeführt. Ein Austauschen der von mir verwendeten CRTC-Tabelle durch eine mit weniger HZ Refreshrate etwa mit 85 HZ ist möglich.
Der Quellcode wurde für MASM 5 entwickelt. Es wird der Vesamode 118h für 1024x768x32Bit truecolor ohne Bankumschaltung, aber mit der Verwendung des linearen Framebuffers und einer eigenen Refreshrate von 100 HZ verwendet.
Dafür wird der Unrealmode angeschaltet. Damit der Unrealmode eingeschaltet werden kann, darf kein emm386.exe oder vergleichbare Memmorymanager in der Config.sys gestartet werden.
Ggf. solch einen Eintrag unter REM setzen. Dieses Demo zeigt ein paar Bälle die sich über den Bildschirm bewegen. Wenn die Bälle den Rand des Bildschirms berühren, dann prallen sie ab und machen einen Richtungswechsel.
Damit eine flickerfreie Bewegung ermöglicht wird verwende ich hierbei Vesa-hardware-triple-buffering. Die Anwendung kann mit der Escape-Taste beendet werden.
Den Quellcode und die fertige Anwendung kann man zusammen von meiner Homepage herunterladen:
http://www.alice-dsl.net/freecracmaps/Tool/TRIPSTON.ZIP

Code: Alles auswählen

; Dieser Quellcode kann z.B. mit dem Namen "Tripston.asm" gespeichert werden.
; Assemblieren mit: Masm Tripston.asm
; Linken mit: Link Tripston.obj
.MODEL SMALL
.386P
.387
;----------------------------------------------------------------------------------------------------------------------------------------
    Video_Mode   =       4118h  +800h  ; VESA-linear + CRTC, 16.8 Mio.Col
;--------------------------------------
    MaxX         =       1024
    MaxY         =        768
;--------------------------------------
    KreiFa       =   00FFCC00h         ; Kreis-Farbe
    Vring        =   00030400h         ; Farb-Verringerung
    Groesse      =        02Dh         ; Radius des Balles
    XPos         =     Groesse         ; Position des Balles
    YPos         =     Groesse
;--------------------------------------
    Anzahl       =         05h         ; Anzahl der Objekte (max.255)

    HFarb        =    0 ; 0100A03h         ; Hintergrund-Farbe
;--------------------------------------
    Max_X        =   (MaxX-(XPos*2))-9 ; maximale und minimale
    Max_Y        =    MaxY-(YPos*2)    ;  X/Y Positionen,
    Min_X        =         9           ; des Bewegungs-Bereichs
    Min_Y        =         9
;--------------------------------------
    IRQs_Port    =         21h         ; Port-Adresse: IRQ-Controller
    Tast_Port    =         60h         ; Port-Adresse: Tastatur-Controller
    Stat_Port    =         64h         ; Port-Adresse: Tastatur-Status
    Cmos_Port    =         70h         ; Port-Adresse: Bios-Cmos-Chip
;--------------------------------------
    Cr           =         0Dh         ; Carriage Return
    Lf           =         0Ah         ; Line Feed
;--------------------------------------
    Ausri        =         16
;----------------------------------------------------------------------------------------------------------------------------------------
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;----------------------------------------------------------------------------------------------------------------------------------------
START:    mov      eax, 1              ; request for feature flags
       DB 0Fh, 0A2h                    ; CPUID instruction
          test     edx, 00800000h      ;  is MMX feature flag(bit 23) set ?
          jz  FEHLER3                  ; NEIN, kein MMX
;----------------------------------------------------------------------------
          mov      ax, DATEN           ; ES auf Daten-Bereich
          mov      di, OFFSET VINF     ; Ziel-Offset
          mov      cx, Video_Mode
          mov      ds, ax
          mov      es, ax              ; für Vesa-Bios-Analyse
          mov      ax, 4F01h           ; Modus-Spezifische Info holen
          int    10h                   ;  VESA-BIOS ?
          cmp      ax, 4Fh
          jnz FEHLER1                  ; FEHLER:Video-Mode nicht verfügbar
          cmp     DWORD PTR[di+28h], 0 ;  linearer Bild-Offset vorhanden ?
          jz  FEHLER2                  ; FEHLER:Video-Mode nicht verfügbar
;--------------------------------------
          mov      ax, 4F0Bh           ; get/set Pixel-Clock
          xor      bl, bl              ; get
          mov      ecx, DWORD PTR[PIXCLOC]
          mov      dx, Video_Mode
          int    10h
          cmp      ax, 4Fh
          jnz FEHLER1                  ; FEHLER:Video-Mode nicht verfügbar
          mov      DWORD PTR[PIXCLOC], ecx
;--------------------------------------
          xor      eax, eax
          mov      ax, CRTC            ; horizontal Total
          xor      ebx, ebx
          mov      bx, VERTOTA         ; vertikal Total
          mul      ebx
          mov      ebx, eax
          mov      eax, ecx            ; Pixeltakt
          mov      esi, 10
          xor      edx, edx
          div      esi
          xor      edx, edx
          div      ebx
          mov      REFRATE, ax         ; RefreshRate=Pixeltakt/(HTotal*Vtotal)
;--------------------------------------
          mov      ax, 4F02h           ; Vesa-Video-Mode einschalten
          mov      bx, Video_Mode      ; mit linearen Video-Buffer
          mov      di, OFFSET CRTC     ; eigenes Video-Timing
          int    10h
          cmp      ax, 4Fh
          jnz FEHLER1                  ; FEHLER:Video-Mode nicht verfügbar
;----------------------------------------------------------------------------
          cli                          ; Software-Interrupts ausschalten
          mov      al, 2               ; IRQ 1 sperren
          out      IRQs_Port, al

          in       al, Cmos_Port       ; Über CMOS-Baustein auch
          or       al, 80h             ; den Non-Mask-Interrupt abschalten
          out      Cmos_Port, al

          call ESEG                    ; Segmente erweitern auf 4 Giga-Byte
          mov      ax, DATEN
          mov      ds, ax              ; DS wieder auf Daten-Bereich

          in       al, Cmos_Port       ; NMI's wieder einschalten
          and      al, 7Fh
          out      Cmos_Port, al
          sti                          ; Software-Interrupts einschalten
;----------------------------------------------------------------------------
          call PIXOFF                  ; Tabelle der Zeilen-Anfänge
;----------------------------------------------------------------------------
          finit
          mov     DWORD PTR[XM], XPos  ; X-Mittelpunkt
          mov     DWORD PTR[YM], YPos  ; Y-Mittelpunkt
          mov     DWORD PTR[COL], KreiFa
          mov      ecx, 1              ; Radius
RUND:     call KREIS                   ;  Wurzel-Kreis
          inc      ecx                 ; Radius erhöhen
          sub     DWORD PTR[COL], Vring ; Farbe  verringern
          cmp      ecx, Groesse
          jnz RUND
;--------------------------------------
          call TABELLE                 ; Bildschirm-Inhalt in Sprite-Tabelle
;--------------------------------------
          mov      si, OFFSET BALL     ; Zeiger auf Sprite-Tabelle
          xor      eax, eax            ; Farbe SCHWARZ
OBJLO:    mov      ebx, [si]           ; Bild-Offset aus Tabelle holen
          add      si, 8               ; Tabellen-Zeiger erhöhen
          mov      [ebx], eax          ; Farbe SCHWARZ zum Bildschirm
          cmp      si, bp              ;  Ende erreicht ?
          jb  OBJLO
;----------------------------------------------------------------------------
          mov      si, OFFSET SX0      ; Zeiger auf Positions-Tabelle
          mov      di, OFFSET STEP0X   ; Zeiger auf Stepper-  Tabelle

HIN:      mov      ebx, [si]           ; X-Position holen
          mov      eax, [di]           ; X-Stepper holen
          mov      ecx, [si+4]         ; Y-Position holen
          mov      edx, [di+4]         ; Y-Stepper holen

          shl      ebx, 2              ; X * 4 Byte (true color)
          shl      eax, 2              ; X-Stepper * 4 Byte (true color)
          mov      ecx, [ecx*4]        ; Zeile holen
          mov      edx, [edx*4]        ; Stepper-Zeile holen
          sub      ecx, DWORD PTR[PIXTAB] ; linearen Bild-Offset wieder abziehen
          sub      edx, DWORD PTR[PIXTAB] ; linearen Bild-Offset wieder abziehen

          mov      [si], ebx           ; X zurück-schreiben
          mov      [si+4], ecx         ; Y als Zeile zurück-schreiben
          add      si, 8
          mov      [di], eax           ; X-Stepper zurück-schreiben
          mov      [di+4], edx         ; Y-Step als Step-Zeile zurückschreiben
          add      di, 8
          cmp      si, Anzahl*8+OFFSET SX0
          jb  HIN
;--------------------------------------
          mov      edx, DWORD PTR[PICAKT]
;--------------------------------------
          mov      bx, OFFSET HINFAR
       DB 0Fh, 6Fh, 7                  ; MOVQ mm0, [bx]
;----------------------------------------------------------------------------
       DB  0EAh                        ; Prefetch-Puffer löschen:
       DW  (OFFSET ACTION)             ; Die folgenden Zeilen erzeugen
       DW  (SEG ACTION)                ; das Kommando JMP FAR CS:ACTION
;----------------------------------------------------------------------------------------------------------------------------------------
;                        B   E   W   E   G   U   N   G
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;---------------------------------------------------------------------------
ACTION:   mov      ebx, edx
          mov      ecx, DWORD PTR[PICLEN]
          mov      si, OFFSET SX0        ; Zeiger auf Positions-Tabelle
          mov      di, OFFSET STEP0X     ; Zeiger auf Stepper-  Tabelle
          add      ebx, DWORD PTR[PIXTAB]
          shr      ecx, 3

CLEAN:  DB 67h, 0Fh, 7Fh, 3              ; MOVQ [ebx], mm0
          add      ebx, 8
          dec      ecx
          jnz CLEAN
;----------------------------------------------------------------------------
ALL:      mov      ebx, [si]             ; X-Position holen
          cmp     BYTE PTR[di+S_Len], 1  ; Plus/Minus-XFlag vergleichen
          jz  short FRAGX1               ;  wenn minus, dann springen
;--------------------------------------
FRAGX0:   cmp      ebx, Max_X * 4        ; X-Position mit max.-X vergleichen
          jb  short MAKEX0               ;  wenn kleiner, springen
          mov     BYTE PTR[di+S_Len], 1  ; Minus-XFlag setzen
MAKEX1:   sub      ebx, [di]             ; X - XStepper 
          jmp  short ALLX
;--------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;--------------------------------------
FRAGX1:   cmp      ebx, Min_X * 4        ; X-Position mit min.-X vergleichen
          ja  short MAKEX1               ;  wenn größer, springen
          mov     BYTE PTR[di+S_Len], 0  ; Plus-XFlag setzen
MAKEX0:   add      ebx, [di]             ; X + XStepper 
ALLX:     mov      [si], ebx             ; neue X-Position retten
;----------------------------------------------------------------------------
          mov      ecx, [si+4]           ; Zeile holen
          cmp     BYTE PTR[di+S_Len+1],1 ; Plus/Minus-Zeilen-Flag vergleichen
          jz  short FRAGY1               ;  wenn minus, dann springen
;--------------------------------------
FRAGY0:   cmp      ecx, Max_Y * (MaxX*4) ; Zeile mit max. Zeile vergleichen
          jb  short MAKEY0               ;  wenn kleiner, springen
          mov     BYTE PTR[di+S_Len+1],1 ; Minus-Zeilenflag setzen
MAKEY1:   sub      ecx, [di+4]           ; Zeile - Zeilenstepper 
          jmp  short ALLY
;--------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;--------------------------------------
FRAGY1:   cmp      ecx, Min_Y * (MaxX*4) ; Zeile mit min.Zeile vergleichen
          ja  short MAKEY1               ;  wenn größer, springen
          mov     BYTE PTR[di+S_Len+1],0 ; Plus-YFlag setzen
MAKEY0:   add      ecx, [di+4]           ; Zeile + Zeilenstepper 
ALLY:     mov      [si+4], ecx           ; neue Zeile retten
;--------------------------------------
          add      si, 8                 ; Tabellen-Zeiger erhöhen (Positions)
          add      ecx, ebx              ; Zeile plus X
          mov      RETTSI, si
          mov      si, OFFSET BALL       ; Tabellen-Zeiger ANFANG
          add      ecx, edx
OBJECT:   mov      ebx, [si]             ; Sprite-Offset aus Tabelle holen
          mov      eax, [si+4]           ; Farbe  aus Tabelle holen
          add      si, 8                 ; Tabellen-Zeiger erhöhen
          mov      [ebx+ecx], eax        ; Farbe zum Bildschirm
          cmp      si, bp                ;  Ende erreicht ?
          jb  OBJECT
;--------------------------------------
          mov      si, RETTSI
          add      di, 8                 ; Tabellen-Zeiger erhöhen (Stepper)
          cmp      si, Anzahl*8+OFFSET SX0 ; Tabellen-Ende erreicht ?
          jb  ALL                        ; sonst nächsten Punkt
;----------------------------------------------------------------------------
          cmp      BYTE PTR[FLAG], 0
          jz  short ASUK
;--------------------------------------
BSUK:     mov      ecx, edx             ; Display-Start-Adress
          mov      bx, 4                ; wait until Display shedule
          mov      ax, 4F07h
          int    10h
          and      cx, cx
          jnz BSUK
;--------------------------------------
ASUK:     mov      ecx, edx             ; Display-Start-Adress
          add      edx, DWORD PTR[PICLEN] ; neue Adresse
          mov      bx, 2                ; shedule new Display-Start-Adress
          mov      ax, 4F07h
          int    10h
;---------------------------------------
          mov      BYTE PTR[FLAG], 1
          cmp      edx, DWORD PTR[PICMAX]
          jna short NODO
          xor      edx, edx
;----------------------------------------------------------------------------
NODO:     in       al, Stat_Port       ; Tastatur-Status holen
          test     al, 1
          jz  ACTION                   ; nächste Zeile
;----------------------------------------------------------------------------------------------------------------------------------------
          in       al, Tast_Port       ; Tasten-Code holen
          cli
          xor      al, al              ; IRQ 1 freigeben
          out      IRQs_Port, al
          sti

          mov      ax, 3               ; Text-Mode
          int    10h
          xor      cl, cl              ; kein Fehler

          mov      ah, 1               ; Tastatur-Puffer löschen
          int    16h
;-------------------------------------
       DB 0Fh, 0Eh                     ; 0Fh, 77h EMMS // 0Fh, 0Eh FEMMS
;-------------------------------------
DOS:      mov      al, cl              ; ERRORLEVEL holen
          mov      ah, 4Ch             ; Programm beenden
          int    21h
;----------------------------------------------------------------------------------------------------------------------------------------
;                    F e h l e r   T e x t e   a u s g e b e n
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;---------------------------------------------------------------------------
FEHLER1:  mov      cl, 1               ; ERRORLEVEL 1
          mov      dx, OFFSET ERTEX1   ; Video-Mode wird nicht unterstützt

ERROUT:   mov      ah, 9               ; Text ausgeben
          int    21h
          jmp  short DOS
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;---------------------------------------------------------------------------
FEHLER2:  mov      cl, 2               ; ERRORLEVEL 2
          mov      dx, OFFSET ERTEX2   ; kein linearen Bild-Offset
          jmp  short ERROUT
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;---------------------------------------------------------------------------
FEHLER3:  mov      cl, 3                ; ERRORLEVEL 3
          mov      dx, OFFSET ERTEX3    ; keine MMX-CPU
          jmp  short ERROUT
;----------------------------------------------------------------------------------------------------------------------------------------
;                     GDT für den Protected Mode
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/64)*64)+64    ; Code-Ausrichtung
;----------------------------------------------------------------------------
GDTZEIGER DW ?      ; Länge der GDT
          DW ?      ; Adresse low -Word:SEGMENTE
          DW ?      ; Adresse high-Word:SEGMENTE
          DW 0      ; reserviert

SEGMENTE  DW 0      ; Bits: 0-15 Seg.länge(Bit0-15)
          DW 0      ; Bits: 0-15 Basis-Adresse Deskriptor-Table
          DB 0      ; Bits:16-23 Basis-Adresse Deskriptor-Table
          DB 0      ; Bits: 0- 7 Zugriffsrechte
          DB 0      ; Bits: 0- 3 Seg.länge(Bit16-19)/Bit7:1=4KByte/0=1Byte
          DB 0      ; Bits:24-31 Basis-Adresse Deskriptor-Table

;-------------------------------------------- Selektor    Segmente
       DW 0FFFFh ; Segmentlänge   Bits: 0-15  ┬──────┬  ┬─────────┬
       DW 0      ; Adresse low    Bits: 0-15  │ 08h  │  │Code (CS)│
       DB 0      ; Adresse high   Bits:16-23  └──────┘  └─────────┘
       DB 9Ah    ; Zugriffsrechte
       DB 0      ; Seg.Länge Bits:16-19 im Bit0-3 /Bit7:1=4KByte/0=1Byte
       DB 0      ; Seg.Adresse    Bits:24-31
;--------------------------------------------------- Selektor    Segmente
       DW 0FFFFh ; Segmentlänge   Bits: 0-15  ┬──────┬  ┬──────────┬
       DW 0      ; Adresse low    Bits: 0-15  │ 10h  │  │Stack (SS)│
       DB 0      ; Adresse high   Bits:16-23  └──────┘  └──────────┘
       DB 92h    ; Zugriffsrechte
       DB 0      ; Seg.Länge Bits:16-19 im Bit0-3 /Bit7:1=4KByte/0=1Byte
       DB 0      ; Seg.Adresse    Bits:24-31
;--------------------------------------------------- Selektor    Segmente
       DW 0FFFFh ; Segmentlänge   Bits: 0-15  ┬──────┬ ┬─────────────┬
       DW 0      ; Seg.Adresse    Bits: 0-15  │  18h │ │(DS,ES,FS,GS)│
       DB 0      ; Seg.Adresse    Bits:16-23  └──────┘ └─────────────┘
       DB 92h    ; Zugriffsrechte
       DB 0FFh   ; Seg.Länge Bits:16-19 im Bit0-3//Bit7:1=4KByte/0=1Byte
       DB 0FFh   ; Seg.Adresse    Bits:24-31
;---------------------------------------------------
        SEGMENTE_END label WORD
        Gdt_Groesse equ (OFFSET SEGMENTE_END - SEGMENTE -1)
;----------------------------------------------------------------------------------------------------------------------------------------
; Setzt für das DS,ES,FS,GS-Register eine neue Segmentlänge von 00FFFFFFh.
; Dazu wird in den Protected Mode umgeschaltet.
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;----------------------------------------------------------------------------
ESEG:     xor      eax, eax
          mov      ax, cs
          mov      ds, ax
          shl      eax, 4                        ; EAX ist nun physikalische
          mov      ebx, eax                      ; Segmentstartadresse
          mov     WORD PTR[SEGMENTE+0Ah], ax     ; in den Deskriptoren
          mov     WORD PTR[SEGMENTE+12h], ax     ; für CS
          ror      eax, 10h                      ; und SS in der
          mov     BYTE PTR[SEGMENTE+0Ch], al     ; GDT abspeichern
          mov     BYTE PTR[SEGMENTE+14h], al
          xor      eax, eax                      ; EAX auf null
          mov      ax, OFFSET SEGMENTE           ; 16-Bit-Offset
          add      ebx, eax                      ; GDT-Adresse im
          mov     WORD PTR[GDTZEIGER], Gdt_Groesse ; GDT-Deskriptor
          mov     DWORD PTR[GDTZEIGER+2], ebx

          pushf                                  ; Flags retten
          lgdt    FWORD PTR[GDTZEIGER]           ; GDT laden
          mov      dx, ss                        ; SS retten
          mov      eax, cr0                      ; Steuerwort 0 nach EAX
          or       al, 1                         ; Protected Mode ein
          mov      cr0, eax                      ; im Steuerwort
                                                 ; Prefetch-Puffer löschen
          DB  0EAh                               ; die folgenden Zeilen
          DW  (OFFSET PMODE)                     ; erzeugen:
          DW  8                                  ; JMP FAR CS:PMODE
;------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;------------------------------------------------
PMODE:    mov      ax, 10h                       ; SS-Selektor auf 64
          mov      ss, ax                        ; KByte begrenzen
          mov      ax, 18h
          mov      ds, ax                        ; DS,ES,FS,GS-Selektoren
;          mov      es, ax                        ; auf 16 MByte erweitern
;          mov      fs, ax
;          mov      gs, ax

          mov      eax, cr0                      ; Steuerwort 0 nach EAX
          and      eax, not 1                    ; Protected Mode aus
          mov      cr0, eax                      ; im Steuerwort
                                                 ; Prefetch-Puffer löschen
          DB  0EAh                               ; Die folgenden Zeilen er-
          DW  (OFFSET RMODE)                     ; zeugen das Kommando
AKTSEG    DW  (SEG RMODE)                        ; JMP FAR CS:RMODE
;------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;------------------------------------------------
RMODE:    mov      ss, dx                        ; SS zurueck
          popf                                   ; Flags holen
;----------------------------------------------------------------------------
;           Schaltet   das   21. Adreßbit   des   Prozessors   ein.
;----------------------------------------------------------------------------
BIT_FREI: call W_8042            ;══>>══════════╗  Warte auf 8042
          jnz BACK               ;─>────────┐   ║ 
          mov      al, 0D1h      ;          │   ║  Kommando schreiben
          out      Stat_Port, al ;          │   ║
          call W_8042            ;   ══>>═══Ï═══╣  fertig zum Emnpfang ?
          jnz BACK               ;─>────────┤   ║
          mov      al, 0DFh      ;          │   ║  ja,Leitung 20 freischalten
          out      Tast_Port, al ;          │   ║
;-------------------------------------------│---║---------------
;           Wartet   darauf,  bis  der 8042 │   ║ bereit  ist.
;-------------------------------------------│---║---------------
W_8042:   xor      cx, cx        ;<<════════Ï═══╝
STATUS:   in       al, Stat_Port ;<────┐    │      Status lesen
          and      al, 2         ;     │    │       Puffer voll ?
          loopnz STATUS          ;─>───┘    │      bis nein oder Timeout
BACK:     ret                    ;<─────────┘
;----------------------------------------------------------------------------------------------------------------------------------------
;    Linearer  32 Bit - W U R Z E L  -  K R E I S    XM, YM, COL
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;----------------------------------------------------------------------------
KREIS:    mov      eax, ecx
          mul      eax                 ; Radius * Radius
          xor      edi, edi            ; Schleifen-Anfang
          mov      esi, eax
          xor      eax, eax

RUNDE:    mov      ebp, esi
          mul      eax                 ; X * X
          sub      ebp, eax            ; R * R - X * X
          mov     DWORD PTR[Y], ebp

          fild     Y                   ; Integer nach ST(0) laden
          fsqrt                        ; Wurzel ziehen
          fistp    Y                   ; Integer speichern und pop

          mov      ebp, DWORD PTR[Y]
          call HALB                    ; 4 Pixel setzen
          mov      eax, edi            ; X mit Y vertauschen
          mov      edi, ebp
          mov      ebp, eax            ; nächste Achse
          call HALB                    ; 4 Pixel setzen

          inc      ebp                 ; Schleifen-Zähler erhöhen
          mov      edi, ebp            ; X wieder restaurieren
          cmp      ecx, ebp            ; Radiant erreicht ?
          jnz RUNDE
          ret
;--------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;--------------------------------------
HALB:     mov      edx, DWORD PTR[XM]  ; rechts unten
          mov      ebx, DWORD PTR[YM]
          add      edx, edi            ; X-Pos
          add      ebx, ebp            ; Y-Pos
          call PIXEL
          mov      edx, DWORD PTR[XM]  ; links unten
          mov      ebx, DWORD PTR[YM]
          sub      edx, edi            ; X-Pos
          add      ebx, ebp            ; Y-Pos
          call PIXEL
          mov      edx, DWORD PTR[XM]  ; rechts oben
          mov      ebx, DWORD PTR[YM]
          add      edx, edi            ; X-Pos
          sub      ebx, ebp            ; Y-Pos
          call PIXEL
          mov      edx, DWORD PTR[XM]  ; links oben
          mov      ebx, DWORD PTR[YM]
          sub      edx, edi            ; X-Pos
          sub      ebx, ebp            ; Y-Pos

PIXEL:    shl      edx, 2              ; X mal 4 Byte (true color)
          add      edx, [ebx*4]        ; X plus Zeilen-Offset
          mov      ebx, DWORD PTR[COL]
          mov      [edx], ebx          ; Farbe zum Bild-Schirm
          mov      [edx+4], ebx        ; daneben auch
          ret
;----------------------------------------------------------------------------------------------------------------------------------------
;    Lineare  32 Bit - S p r i t e - T A B E L L E     Offset, Farbe
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;----------------------------------------------------------------------------
TABELLE:  mov      eax, DWORD PTR[XMAX]
          xor      esi, esi
          shr      eax, 2              ; X durch 4 Byte (true color)
          mov      di, OFFSET BALL     ; Tabellen-Offset
          mov      esi, [esi]          ; linearer Bild-Offset
          mul     DWORD PTR[YMAX]
          mov      ecx, eax

MAKETAB:  mov      eax, [esi]          ; Bild-Farbe holen
          and      eax, eax            ;  Inhalt leer ?
          jz  short LEER
          mov      [di], esi           ; Sprite-Offset in Tabelle retten
          mov      [di+4], eax         ; Farbe in Tabelle retten
          add      di, 8               ; Tabellen-Offset erhöhen
LEER:     add      esi, 4              ; Bild-Offset erhöhen
          dec      ecx
          jnz MAKETAB
          mov      bp, di              ; Tabellen-Ende
          ret
;----------------------------------------------------------------------------------------------------------------------------------------
;    Lineare  32 Bit - T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;----------------------------------------------------------------------------------------------------------------------------------------
 org START + ((($-START)/Ausri)*Ausri)+Ausri
;--------------------------------------
PIXOFF:   mov      si, OFFSET VINF     ; Video-Modus-Spezifische Informationen
          xor      ebx, ebx
          mov      bx, ds              ; aktuelles Daten-Segment
          mov      eax, [si+28h]       ; linearer Bild-Offset
          shl      ebx, 4              ; Daten-Segment in 32Bit-Offset wandeln
          xor      di, di
          sub      eax, ebx            ; Adresse erste Zeile (ds:Reg32)

          xor      edx, edx
          mov      dx, [si+32h]        ; Zeilen-Länge holen (Xmax*BytejePixel)
          mov      XMAX, dx

          mov      cx, [si+14h]        ; Ymax
          mov      YMAX, cx
          shl      cx, 2               ; Max_Y * 4

AGAIN:    mov      [di], eax           ; linearer Zeilen-Offset in Tabelle
          add      di, 4
          add      eax, edx            ; plus (Max_X)
          cmp      di, cx              ;  schon Tabellen-Ende(Max_Y*4) ?
          jb  AGAIN
;--------------------------------------
     ;     sub      eax, edx            ; minus (Max_X)
     ;     sub      eax, DWORD PTR[PIXTAB]
     ;     mov      DWORD PTR[PICAKT] ,eax
     ;     mov      DWORD PTR[PICLEN] ,eax
     ;     add      eax, eax
     ;     add      eax, DWORD PTR[PIXTAB]
     ;     mov      DWORD PTR[PICMAX] ,eax
          ret
;----------------------------------------------------------------------------
  CODE ends
;----------------------------------------------------------------------------------------------------------------------------------------
;                          D A T E N - B E R E I C H
;----------------------------------------------------------------------------------------------------------------------------------------
  DATEN SEGMENT use32 'DATA'           ; Daten-Ausrichtung
 org 0
;--------------------------------------
PIXTAB DD MaxY+Ausri dup (0)           ; Tabelle der Zeilen-Anfänge
;----------------------------------------------------------------------------
;                            Positions - Tabelle
;----------------------------------------------------------------------------
SX0    DD 122, 197                     ; X, Y
       DD 373, 347
       DD 493, 276
       DD 363, 143
       DD 323, 316
       DD 235, 192
       DD 273, 226
       DD 107, 226
       DD 422, 373
       DD 112, 347
       DD 133, 266
       DD 471, 343
       DD 423, 366
       DD 227, 230
       DD 143, 157
       DD 376, 322

       DD 212, 101
       DD 442, 226
       DD 293, 129
       DD 371, 123
       DD 323, 325
       DD 167, 292
       DD 223, 172
       DD 226, 145
       DD 113, 222
       DD 167, 166
       DD 133, 134
       DD 442, 292
       DD 252, 270
       DD 323, 350
       DD 262, 374
       DD 270, 151

       DD 166, 213
       DD 233, 154
       DD 123, 222
       DD 126, 274
       DD 060, 257
       DD 226, 313
       DD 418, 177
       DD 357, 153
       DD 458, 270
       DD 185, 035
       DD 248, 113
       DD 463, 366
       DD 370, 132
       DD 254, 267
       DD 239, 134
       DD 445, 262

       DD 454, 334
       DD 279, 257
       DD 146, 323
       DD 238, 267
       DD 143, 134
       DD 236, 377
       DD 139, 334
       DD 475, 258
       DD 454, 154
       DD 136, 337
       DD 484, 253
       DD 177, 266
       DD 224, 143
       DD 397, 127
       DD 448, 345
       DD 188, 123

       DD 442, 332
       DD 323, 176
       DD 472, 123
       DD 194, 379
       DD 046, 124
       DD 227, 111
       DD 144, 124
       DD 359, 165
       DD 177, 246
       DD 151, 342
       DD 178, 168
       DD 132, 149
       DD 427, 236
       DD 214, 013
       DD 361, 345
       DD 323, 176

       DD 249, 336
       DD 179, 144
       DD 439, 123
       DD 438, 347
       DD 288, 248
       DD 343, 158
       DD 228, 346
       DD 183, 253
       DD 347, 288
       DD 233, 235
       DD 198, 286
       DD 153, 147
       DD 297, 273
       DD 336, 231
       DD 479, 150
       DD 243, 287

       DD 257, 165
       DD 111, 122
       DD 389, 258
       DD 358, 285
       DD 224, 127
       DD 082, 122
       DD 266, 311
       DD 114, 351
       DD 321, 275
       DD 433, 159
       DD 240, 154
       DD 496, 160
       DD 148, 038
       DD 224, 369
       DD 312, 134
       DD 167, 126

       DD 278, 173
       DD 533, 436
       DD 356, 291
       DD 490, 352
       DD 369, 111
       DD 230, 134
       DD 477, 177
       DD 319, 443
       DD 553, 399
       DD 236, 266
       DD 474, 130
       DD 397, 127
       DD 238, 169
       DD 142, 186
       DD 171, 383
       DD 599, 138

       DD 368, 437
       DD 124, 424
       DD 597, 259
       DD 165, 197
       DD 143, 270
       DD 459, 349
       DD 159, 459
       DD 427, 427
       DD 215, 135
       DD 180, 180
       DD 377, 377
       DD 245, 145
       DD 473, 173
       DD 308, 408
       DD 483, 283
       DD 525, 125

       DD 412, 312
       DD 242, 142
       DD 293, 293
       DD 571, 371
       DD 423, 323
       DD 467, 267
       DD 183, 283
       DD 326, 126
       DD 313, 413
       DD 267, 267
       DD 533, 133
       DD 248, 188
       DD 358, 458
       DD 183, 383
       DD 162, 162
       DD 370, 170

       DD 434, 134
       DD 357, 157
       DD 123, 123
       DD 477, 167
       DD 534, 134
       DD 477, 177
       DD 264, 124
       DD 458, 138
       DD 154, 244
       DD 137, 237
       DD 193, 353
       DD 376, 276
       DD 543, 443
       DD 427, 227
       DD 145, 345
       DD 523, 123

       DD 338, 158
       DD 473, 425
       DD 196, 283
       DD 443, 394
       DD 558, 343
       DD 430, 134
       DD 414, 362
       DD 331, 185
       DD 561, 232
       DD 434, 321
       DD 376, 255
       DD 598, 388
       DD 114, 145
       DD 140, 243
       DD 537, 189
       DD 375, 434

       DD 225, 257
       DD 178, 283
       DD 157, 125
       DD 296, 158
       DD 372, 435
       DD 484, 192
       DD 543, 134
       DD 439, 212
       DD 338, 166
       DD 367, 288
       DD 133, 143
       DD 196, 313
       DD 429, 124
       DD 122, 448
       DD 585, 127
       DD 145, 173

       DD 534, 134
       DD 157, 157
       DD 323, 323
       DD 177, 167
       DD 134, 134
       DD 277, 177
       DD 164, 134
       DD 558, 358
       DD 254, 154
       DD 287, 137
       DD 493, 153
       DD 476, 376
       DD 243, 143
       DD 527, 127
       DD 445, 245
       DD 123, 223

       DD 138, 258
       DD 373, 225
       DD 396, 383
       DD 143, 194
       DD 258, 443
       DD 330, 134
       DD 414, 262
       DD 531, 185
       DD 361, 132
       DD 334, 121
       DD 476, 155
       DD 198, 288
       DD 114, 145
       DD 240, 343
       DD 137, 389
       DD 275, 134

       DD 525, 157
       DD 478, 183
       DD 557, 325
       DD 296, 258
       DD 572, 135
       DD 484, 192
       DD 343, 134
       DD 239, 212
       DD 138, 266
       DD 467, 388
       DD 233, 143
       DD 196, 313
       DD 529, 174
       DD 422, 148
       DD 385, 157
       DD 245, 173
;---------------------------------------------------------------------------
;                              Stepper - Tabelle
;---------------------------------------------------------------------------
STEP0X DD 1, 1                  ; Anzahl Pixel, der horizontalen 
       DD 1, 2                  ; und vertikalen Bewegung(Step X,Y)
       DD 2, 1 
       DD 2, 4 
       DD 3, 1 
       DD 6, 6 
       DD 7, 5 
       DD 8, 4 
       DD 9, 3
       DD 2, 8
       DD 1, 6
       DD 5, 2
       DD 1, 3 
       DD 2, 4 
       DD 3, 5 
       DD 4, 6 

       DD 8, 1 
       DD 1, 2 
       DD 8, 3 
       DD 1, 9 
       DD 9, 1 
       DD 2, 2 
       DD 2, 3 
       DD 2, 7 
       DD 6, 1 
       DD 8, 8 
       DD 3, 3 
       DD 7, 7 
       DD 4, 1 
       DD 2, 7 
       DD 4, 3 
       DD 4, 2 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 2, 3 
       DD 2, 1 
       DD 2, 2 
       DD 2, 2 
       DD 2, 1 
       DD 3, 1 
       DD 6, 2 
       DD 3, 3 
       DD 3, 3 
       DD 4, 1 
       DD 2, 2 
       DD 4, 3 
       DD 4, 6 

       DD 1, 1 
       DD 1, 2 
       DD 1, 2 
       DD 1, 4 
       DD 2, 1 
       DD 2, 2 
       DD 3, 3 
       DD 2, 4 
       DD 3, 1 
       DD 3, 3 
       DD 3, 2 
       DD 3, 1 
       DD 4, 5 
       DD 2, 2 
       DD 4, 3 
       DD 1, 2 

       DD 3, 1 
       DD 1, 2 
       DD 1, 3 
       DD 2, 4 
       DD 2, 1 
       DD 2, 2 
       DD 2, 3 
       DD 2, 4 
       DD 3, 1 
       DD 3, 2 
       DD 3, 3 
       DD 3, 4 
       DD 4, 1 
       DD 3, 2 
       DD 4, 3 
       DD 2, 2 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 1, 2 
       DD 2, 1 
       DD 1, 2 
       DD 2, 3 
       DD 2, 2 
       DD 1, 1 
       DD 3, 2 
       DD 3, 3 
       DD 1, 1 
       DD 2, 1 
       DD 3, 2 
       DD 1, 3 
       DD 1, 2 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 1, 3 
       DD 3, 1 
       DD 2, 2 
       DD 2, 1 
       DD 2, 1 
       DD 5, 1 
       DD 3, 2 
       DD 3, 3 
       DD 3, 1 
       DD 3, 1 
       DD 3, 2 
       DD 2, 3 
       DD 4, 1 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 3, 4 
       DD 2, 1 
       DD 1, 5 
       DD 2, 3 
       DD 2, 4 
       DD 3, 1 
       DD 3, 2 
       DD 1, 3 
       DD 2, 3 
       DD 3, 1 
       DD 1, 2 
       DD 1, 3 
       DD 2, 1 

       DD 1, 1 
       DD 1, 1 
       DD 1, 3 
       DD 1, 2 
       DD 2, 1 
       DD 2, 2 
       DD 2, 3 
       DD 2, 3 
       DD 1, 1 
       DD 3, 2 
       DD 3, 3 
       DD 3, 3 
       DD 1, 1 
       DD 4, 1 
       DD 4, 3 
       DD 4, 2 

       DD 3, 1 
       DD 1, 2 
       DD 1, 3 
       DD 1, 3 
       DD 2, 1 
       DD 2, 2 
       DD 5, 3 
       DD 2, 1 
       DD 3, 1 
       DD 3, 2 
       DD 3, 3 
       DD 5, 3 
       DD 4, 1 
       DD 5, 2 
       DD 4, 1 
       DD 1, 2 

       DD 1, 1 
       DD 1, 5 
       DD 1, 3 
       DD 1, 3 
       DD 2, 1 
       DD 2, 2 
       DD 5, 1 
       DD 1, 4 
       DD 1, 1 
       DD 5, 2 
       DD 3, 5 
       DD 3, 4 
       DD 4, 1 
       DD 1, 2 
       DD 4, 3 
       DD 3, 5 

       DD 1, 1 
       DD 1, 1 
       DD 3, 3 
       DD 1, 4 
       DD 2, 3 
       DD 2, 1 
       DD 2, 3 
       DD 2, 4 
       DD 3, 1 
       DD 3, 2 
       DD 5, 3 
       DD 3, 1 
       DD 1, 3 
       DD 3, 5 
       DD 4, 3 
       DD 1, 2 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 1, 4 
       DD 2, 1 
       DD 5, 1 
       DD 2, 3 
       DD 3, 4 
       DD 3, 3 
       DD 1, 2 
       DD 3, 3 
       DD 3, 4 
       DD 4, 1 
       DD 3, 2 
       DD 1, 3 
       DD 2, 4 

       DD 1, 5 
       DD 1, 2 
       DD 5, 3 
       DD 1, 2 
       DD 2, 1 
       DD 2, 2 
       DD 2, 5 
       DD 2, 3 
       DD 3, 1 
       DD 3, 3 
       DD 3, 3 
       DD 3, 1 
       DD 2, 1 
       DD 3, 5 
       DD 2, 3 
       DD 4, 2 

       DD 1, 1 
       DD 3, 1 
       DD 1, 3 
       DD 1, 3 
       DD 2, 1 
       DD 5, 2 
       DD 2, 3 
       DD 2, 1 
       DD 3, 3 
       DD 3, 2 
       DD 3, 3 
       DD 3, 3 
       DD 5, 1 
       DD 1, 2 
       DD 2, 3 
       DD 4, 2 

       DD 1, 1 
       DD 1, 2 
       DD 1, 3 
       DD 1, 4 
       DD 2, 1 
       DD 5, 2 
       DD 2, 3 
       DD 2, 4 
       DD 3, 1 
       DD 3, 2 
       DD 3, 5 
       DD 2, 1 
       DD 3, 1 
       DD 2, 2 
       DD 1, 3 
       DD 2, 2 
;----------------------
S_Len = ($-STEP0X)
;--------------------------------------
;    Tabelle der Richtungs-Flags
;--------------------------------------
W0     DB (Anzahl+1)* 8 DUP(0)         ; plus(0) / minus(1) für X,Y
;--------------------------------------
;  Sprite-Tabelle: Offset32, Farbe32
;--------------------------------------
BALL   DB 0CC00h dup (0)
;--------------------------------------
PICAKT DD MaxX*4*MaxY                  ; aktuelle Adresse
PICLEN DD MaxX*4*MaxY                  ; Bildlaenge
PICMAX DD MaxX*4*MaxY*2                ; maximale Adresse
;--------------------------------------
RETTSI DW 0, 0
;--------------------------------------
HINFAR DD HFarb, HFarb                 ; Hintergrund-Farbe
;--------------------------------------
;               K r e i s              
;--------------------------------------
Y      DD 0                            ; Doppel-Wort fÜr FPU: sqr

XM     DD 0                            ; X Position (Mittelpunkt)
YM     DD 0                            ; Y Position (Mittelpunkt)

COL    DD 0                            ; Farbe

XMAX   DW 0, 0
YMAX   DW 0, 0
;--------------------------------------
;    VESA - Video-Mode-Information
;--------------------------------------
VINF    DB 100h dup (0)
;--------------------------------------
CRTC    DW 1456                        ; horizontal Total       in Pixel
HORIANF DW 1122                        ; horizontal  Sync-Start in Pixel
HORIEND DW 216                         ; horizontal  Sync-End   in Pixel
VERTOTA DW 814                         ; vertical   Total       in Lines
VERTANF DW 768                         ; vertical    Sync-Start in Lines
VERTEND DW 42                          ; vertical    Sync-End   in Lines
DOIFLAG DB 04h                         ; Flag (interlaced,doubleScan,polarity)
PIXCLOC DD 118309000                   ; Pixel clock in hz
REFRATE DW 10000                       ; Refresh-Rate in 0.01 hz
;---------------------
        DB 40 dup (0)
;--------------------------------------
FLAG    DB 0
;--------------------------------------
;       F e h l e r - T e x t e
;--------------------------------------
ERTEX1 DB Cr, Lf, "Der benutzte Video-Mode, wird nicht unterstützt.", Cr, Lf, "$"
ERTEX2 DB Cr, Lf, "Der lineare Bild-Offset, wird nicht unterstützt.", Cr, Lf, "$"
ERTEX3 DB Cr, Lf, "Dieser Prozessor unterstützt keine MMX-Befehle.", Cr, Lf, "$"
  DATEN ends
;--------------------------------------
 STAPEL SEGMENT use16 STACK 'STACK'
       DB 10h dup (0)
 STAPEL ends
 end
Dirk
Zuletzt geändert von freecrac am Sa 25. Sep 2010, 12:49, insgesamt 1-mal geändert.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

QUAXOMAT
Dieses kleine Grafikdemo benötigt einen 80386+. Es wird der Videomode 13h mit 320x200x256 verwendet.
Der Quellcode und die fertige Anwendung und zwei zusätlich Dateien die beim Start geladen werden kann man zusammen von meiner Homepage herunterladen:
http://www.alice-dsl.net/freecracmaps/Tool/QUAXOMAT.ZIP

Code: Alles auswählen

MODEL SMALL
.386
         RGB_Write  =    3C8h        ; Port der Farb-Anteile (write)

         Xmax       =    320
         Ymax       =    200

         Max_X      =    320         ; maximale und minimale
         Min_X      =      0  
         Max_Y      =    104
         Min_Y      =      0         ; des Bewegungs-Bereichs

         Xplus      =     10

         StartSpeed =   1700

         C_step     =      7
         Step       =      1

         Quadx1     =  Ymax/4
         Quady1     =  Ymax/4
         Quadlen1   =  Quady1*2

         Quadx2     =  Quadx1*3
         Quady2     =  Quady1
         Quadlen2   =  Quady2*2

         Quadx3     =  Quadx1*3
         Quady3     =  Quadx1*3
         Quadlen3   =  Quady3+Quadx1

         Quadx4     =  Quadx1
         Quady4     =  Quadx1*3
         Quadlen4   =  Quady4+Quadx1

         Quadx5     =  Quadx1*5
         Quady5     =  Quady1
         Quadlen5   =  Quady5+Quadx1

         Quadx6     =  Quadx1*5
         Quady6     =  Quadx1*3
         Quadlen6   =  Quady6+Quadx1
;---------------------------------------------------------------------------
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;----------------------------------------------------------------------------
START:    mov      ax, DATEN
          mov      ds, ax

          call HOLPAR                ; Parameter laden
          jc  NOFIL1

          call HOLDAC                ; Farb-Block laden = 768 Byte
          jc  NOFIL0

          mov      ax, 13h           ; Graphik-Mode 320 x 200 x 256
          int   10h

          cli                        ; alle Interrupts sperren
          in       al, 70h
          or       al, 80h
          out      70h, al

          call PUTDAC                ; geladene Farbanteile zur Grafik-Karte

          call PIXOFF                ; Tabelle der Zeilen-Anfänge anlegen

          mov      si, OFFSET STSP - 1 ; geladene Parameter auswerten
          call WANDEL
          and      eax, eax
          jz  short ER0
          mov     DWORD PTR cs:[VER+2], eax

ER0:      mov      si, OFFSET DEZ
          mov      cl, (OFFSET PUFFER - OFFSET DEZ) / 4
ER1:      mov     DWORD PTR[si], 0
          dec      cl
          jnz ER1

          mov      si, OFFSET COST
          call WANDEL
          and      eax, eax
          jz  short ER2
          mov      COLSTEP, al

ER2:      mov      ax, 0A000h        ; Bildschirm-Segment
          mov      es, ax

          mov     BYTE PTR cs:[FARBE+3], 0         ; Farbe
MAIN:     mov     WORD PTR[QLEN], Quadlen6
          mov     WORD PTR [X1], Quadx6      ; X1 links 
          mov     WORD PTR [Y1], Quady6      ; Y1 oben
          mov     WORD PTR [X2], Quadx6 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady6 + 1  ; Y2 unten
          call VER

          mov     WORD PTR[QLEN], Quadlen4
          mov     WORD PTR [X1], Quadx4      ; X1 links 
          mov     WORD PTR [Y1], Quady4      ; Y1 oben
          mov     WORD PTR [X2], Quadx4 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady4 + 1  ; Y2 unten
          call VER

          mov     WORD PTR[QLEN], Quadlen3
          mov     WORD PTR [X1], Quadx3      ; X1 links 
          mov     WORD PTR [Y1], Quady3      ; Y1 oben
          mov     WORD PTR [X2], Quadx3 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady3 + 1  ; Y2 unten
          call VER

          mov     WORD PTR[QLEN], Quadlen2
          mov     WORD PTR [X1], Quadx2      ; X1 links 
          mov     WORD PTR [Y1], Quady2      ; Y1 oben
          mov     WORD PTR [X2], Quadx2 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady2 + 1  ; Y2 unten
          call VER

          mov     WORD PTR[QLEN], Quadlen5
          mov     WORD PTR [X1], Quadx5      ; X1 links 
          mov     WORD PTR [Y1], Quady5      ; Y1 oben
          mov     WORD PTR [X2], Quadx5 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady5 + 1  ; Y2 unten
          call VER

          mov     WORD PTR[QLEN], Quadlen1
          mov     WORD PTR [X1], Quadx1      ; X1 links 
          mov     WORD PTR [Y1], Quady1      ; Y1 oben
          mov     WORD PTR [X2], Quadx1 + 1  ; X2 rechts
          mov     WORD PTR [Y2], Quady1 + 1  ; Y2 unten
          call VER

          in       al, 60h           ; TASTE vom PORT holen
          dec      al                ; Escape-Taste ?
          jnz MAIN

RAUS:     in       al, 70h           ; alle Interrupts freigeben
          and      al, 7Fh
          out      70h, al
          sti

          mov      ah, 1             ; Tastatur-Puffer löschen
          int    16h

          mov      ax, 3             ; Text-Mode
          int    10h

          xor      al, al            ; kein Fehler
DOS:      mov      ah, 4Ch           ; Dos-Rücksprung, Programm-Ende
          int    21h
;---------------------------------------------------------------------------
NOFIL0:   mov      dx, OFFSET FILER0 ; Fehler-Text ausgeben
          mov      ah, 9
          int    21h
          mov      al, 1             ; ERRORLEVEL = 1
          jmp  short DOS
;------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;------------------------------------
NOFIL1:   mov      dx, OFFSET FILER1 ; Fehler-Text ausgeben
          mov      ah, 9
          int    21h
          mov      al, 2             ; ERRORLEVEL = 1
          jmp  short DOS
;---------------------------------------------------------------------------
;                         U N T E R - R O U T I N E N
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
VER:      mov      eax, StartSpeed      ; Haupt-Verzögerung/Geschwindikeit
VERZ:     dec      eax
          jnz VERZ

          mov      bp, X1 ; links Vertikal
          mov      si, Y1
          mov      cx, X1
          mov      dx, Y2
          call LINE
          mov      bp, X1 ; oben Horizontal
          mov      si, Y1
          mov      cx, X2
          mov      dx, Y1
          call LINE
          mov      bp, X2 ; rechts Vertikal
          mov      si, Y1
          mov      cx, X2
          mov      dx, Y2
          call LINE
          mov      bp, X1 ; unten Horizontal
          mov      si, Y2
          mov      cx, X2
          mov      dx, Y2
          inc      cx
          call LINE

          mov      al, COLSTEP
          add     BYTE PTR cs:[FARBE+3], al    ; Farbwert erhoehen
          
          sub     WORD PTR [X1], Step   ; X1 links 
          sub     WORD PTR [Y1], Step   ; Y1 links 
          add     WORD PTR [X2], Step   ; X2 links 
          add     WORD PTR [Y2], Step   ; Y2 links 

          mov      ax, QLEN
          cmp     WORD PTR [Y2], ax
          jb  VER
          ret
;---------------------------------------------------------------------------
;                        L i n i e n - R o u t i n e
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
LINE:     mov      bx, 4345h         ; Code für inc bx und inc bp
          sub      cx, bp            ; DELTAX=X2-X1 bilden
          jge short DELTAX_P         ; X2>X1?
          mov      bl, 4Dh           ; nein, Code für dec bp
          neg      cx                ; und DELTAX umdrehen
DELTAX_P: sub      dx, si            ; DELTAY=Y2-Y1 bilden
          jge short DELTAY_P         ; Y2>Y1?
          mov      bh, 4Bh           ; nein, Code für dec bx
          neg      dx                ; und DELTAY umdrehen
DELTAY_P: mov     WORD PTR cs:[DABGROS], bx ; Ink/Dek im Code abspeichern
          cmp      cx, dx            ; DELTAX>DELTAY?
          jge short DELTAX_G         ; ja, verzweige
          mov      bl, 90h           ; Y ist Laufvariable für X NOP eintragen
          mov      ax, dx
          mov      dx, cx
          mov      cx, ax
          jmp  short ACHSE
;------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;------------------------------------
DELTAX_G: mov      bh, 90h           ; X ist Laufvariable für Y NOP eintragen
ACHSE:    shl      dx, 1             ; Ink. für Laufvariable INCB bestimmen
          mov     WORD PTR cs:[DABKLEI], bx ; im Code ablegen
          mov      ax, dx            ; nach bp übertragen
          sub      dx, cx            ; DAB bestimmen
          mov      bx, si            ; Y1 holen
          mov      di, dx            ; DAB nach di übertragen
          sub      dx, cx            ; INCA nach dx

SCHLEIFE: mov      si, bx            ; 320 Pixel a Zeile
          mov      si, [bx+si]       ; Y-Pos. holen
          add      si, Xplus         ; für Flip-Quadrat X Plus zur Mitte
FARBE:    mov     BYTE PTR es:[si+bp], 0 ; Dummy-Byte 0-255 zum Bildschirm  

          and      di, di            ; DAB>0?
          jge short DABGROS          ; ja, verzweige
DABKLEI:  inc      bp                ; hier wird der
          inc      bx                ; Code modifiziert
          add      di, ax            ; DAB=DAB+INCB
          dec      cx                
          jnz SCHLEIFE               ; Schleife schließen
          ret
;------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;------------------------------------
DABGROS:  inc      bp                ; hier wird der
          inc      bx                ; Code modifiziert
          add      di, dx            ; Schleife schließen
          dec      cx
          jnz SCHLEIFE               ; und weiter
          ret
;---------------------------------------------------------------------------
;              T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
PIXOFF:   xor      ax, ax
          xor      di, di
AGAIN:    mov      [di], ax
          add      di, 2
          add      ax, Xmax
          cmp      di, Ymax * 2
          jb  AGAIN
          ret
;---------------------------------------------------------------------------
;       F i l e   v o m   a k t u e l l e n   L a u f w e r k   l a d e n
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
HOLDAC:   mov      dx, OFFSET DACNAM
          mov      ax, 3D00h         ; Datei oeffnen
          int    21h
          jc  short DACERR
          mov      bx, ax            ; Handle retten
          mov      dx, OFFSET DAC
          mov      cx, 300h
          mov      ah, 3Fh           ; Datei lesen u. Zeiger bewegen
          int    21h
          mov      ah, 3Eh           ; Datei schließen
          int    21h
DACERR:   ret
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
HOLPAR:   mov      dx, OFFSET PARNAM ; PAR-File laden:
          mov      ax, 3D00h         ; Datei oeffnen
          int    21h
          jc  short PARERR
          mov      bx, ax            ; Handle retten
          mov      dx, OFFSET PUFFER ; File lesen
          mov      cx, 300h
          mov      ah, 3Fh           ; Datei lesen u. Zeiger bewegen
          int    21h
          mov      ah, 3Eh           ; Datei schließen
          int    21h
PARERR:   ret
;---------------------------------------------------------------------------
;           F a r b - A n t e i l e   z u r   G r a f i k - K a r t e
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
PUTDAC:   xor      al, al
          mov      dx, RGB_Write
          mov      si, OFFSET DAC     ; Quelle
          mov      cx, 0FFh*3
          out      dx, al             ; Farb-Nr. zur VGA-Karte
          inc      dx                 ; VGA-PORT der Farb-Anteile     (data)
          rep outsb                   ; Farb-Anteile zur Grafik-Karte
          ret
;---------------------------------------------------------------------------
;   Holt dezimale ASCII-Ziffer, wandelt max. 10 Ziffern und rettet die Werte
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;---------------------------------------------------------------------------
WANDEL:   mov      cl, 0Bh           ; Anzahl Ziffern
          mov      di, OFFSET DEZ
          xor      bl, bl

HOLER:    inc      si
          dec      cl
          cmp     BYTE PTR[si], 20h
          jz  HOLER

HOLASC:   mov      al, [si]          ; ein ASCII holen
          cmp      al, 20h
          jz  short LETZ
          inc      si                ; Zeiger erhöhen
          sub      al, 30h           ; ASCII nach Integer wandeln
          inc      bl
          cmp      al, 9             ;  Wert größer als neun ?
          ja  short FEHLPAR          ; keine Ziffer = Fehler !
          mov      [di], al          ; Wert retten
          add      di, 4             ; Rett-Zeiger erhöhen
          dec      cl                ; nächsten ASCII
          jnz HOLASC                 ;  schon alle zehn ASCII's ?

LETZ:     mov      al, bl            ; Anzahl Ziffern
          mov      dh, bl            ; Anzahl Ziffern retten für addieren
          dec      al                ; -1 = Anzahl der Multiplikationen * 10
          mov      cl, al            ; Anzahl Ziffern retten
          mov      dl, al            ; Anzahl Ziffern retten
          jnz short ZUS              ; keine Multiplikationen, eine Ziffer !
          mov      al, [di-4]
          ret

ZUS:      mov      di, OFFSET DEZ

MALASC:   mov      eax, [di]         ; Wert holen
          mov      ebx, eax
          shl      eax, 3            ; Wert mal 8
          add      ebx, ebx          ; Wert mal 2
          add      eax, ebx
          dec      cl                ;  letzte Multiplikation ?
          mov      [di], eax         ; Wert retten
          jnz MALASC

          add      di, 4             ; Zeiger auf nächste Wert
          dec      dl                ; Anzahl der Ziffern verringern
          mov      cl, dl
          jnz MALASC

ZUSAM:    mov      si, OFFSET DEZ    ; alle Werte zusammen rechnen
          xor      eax, eax

PLUS:     add      eax, [si]
          add      si, 4
          dec      dh
          jnz PLUS
          ret
;---------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code Alignment
;------------------------------------
FEHLPAR:  xor      eax, eax
          ret
  CODE ends
;---------------------------------------------------------------------------
;                          D A T E N - B E R E I C H
;---------------------------------------------------------------------------
  DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
 org 0
;------------------------------------
PIXTAB    DW Ymax dup (?)            ; Tabelle der Zeilen-Anfänge

X1        DW 0                       ; Anfangs-Position X
Y1        DW 0                       ; Anfangs-Position Y
X2        DW Max_X                   ; End    -Position X
Y2        DW 0                       ; End    -Position Y

COLSTEP   DB C_step, 0
QLEN      DW Quadlen1

DEZ       DB 0,0,0,0                  ;  1. Ziffer
          DB 0,0,0,0                  ;  2. Ziffer
          DB 0,0,0,0                  ;  3. Ziffer
          DB 0,0,0,0                  ;  4. Ziffer
          DB 0,0,0,0                  ;  5. Ziffer
          DB 0,0,0,0                  ;  6. Ziffer
          DB 0,0,0,0                  ;  7. Ziffer
          DB 0,0,0,0                  ;  8. Ziffer
          DB 0,0,0,0                  ;  9. Ziffer
          DB 0,0,0,0                  ; 10. Ziffer

PUFFER    DB "┌────────────────────────────┐", 0Dh, 0Ah
          DB "│ Freie Cracker Crew Hamburg │", 0Dh, 0Ah
          DB "└────────────────────────────┘", 0Dh, 0Ah
          DB "┌────────────────────────────┐", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│     Q U A X O M A T O R    │", 0Dh, 0Ah
          DB "│    ─────────────────────   │", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│   Quax-Bubbles : Parameter │", 0Dh, 0Ah
          DB "│  ------------------------- │", 0Dh, 0Ah
          DB "│   Start-Speed  :"
STSP      DB "       1  │", 0Dh, 0Ah
          DB "│   Color-Step   :"
COST      DB "       1  │", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│ verschiedene Einstellungen │", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│    verschiedene Effekte    │", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│     Vorsicht Quax-Auge     │", 0Dh, 0Ah
          DB "│                            │", 0Dh, 0Ah
          DB "│       ┌───────────┐        │", 0Dh, 0Ah
          DB "│      ┌┘┌───┐      └┐       │", 0Dh, 0Ah
          DB "│      │ ││.┌┐│  ┌┐  │       │", 0Dh, 0Ah
          DB "│      │ ││.└┘│  └┘  │       │", 0Dh, 0Ah
          DB "│     [│ └───┘   ..  │]      │", 0Dh, 0Ah
          DB "│      │             │       │", 0Dh, 0Ah
          DB "│      │  (   /\   ) │       │", 0Dh, 0Ah
          DB "│      │      '`     │       │", 0Dh, 0Ah
          DB "│      └┐    \__/    │       │", 0Dh, 0Ah
          DB "│       └───┐    ┌───┘       │", 0Dh, 0Ah
          DB "│           └    ┘           │", 0Dh, 0Ah
          DB "└────────────────────────────┘", 0Dh, 0Ah
puflen  =   ($-PUFFER)

FILER0    DB "kann Farb-Anteile nicht laden,", 0Dh, 0Ah
          DB "Datei-Name: "
DACNAM    DB "SPR.dac", 0, 0Dh, 0Ah, "$"      ; Datei-Name der Farb-Anteile

FILER1    DB "kann Parameter nicht laden,", 0Dh, 0Ah
          DB "Datei-Name: "
PARNAM    DB "QUAXOMAT.PAR", 0, 0Dh, 0Ah, "$" ; Datei-Name der Parameter

DAC       DB 300h dup (?)                ; Tabelle der Farb-Anteile: 768 Byte
  DATEN ends
;----------------------------------------------------------------------
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
 end
QUAXOMAT.PAR ist eine Konfigurationsdatei die nach dem Start geladen wird. Hier können vor dem Start die Parameter eingestellt werden.

Code: Alles auswählen

┌────────────────────────────┐
│ Freie Cracker Crew Hamburg │
└────────────────────────────┘
┌────────────────────────────┐
│                            │
│     Q U A X O M A T O R    │
│    ─────────────────────   │
│                            │
│   Quax-Bubbles : Parameter │
│  ------------------------- │
│   StartSpeed   :  6000000  │
│   Color-Step   :        3  │
│                            │
│ verschiedene Einstellungen │
│                            │
│    verschiedene Effekte    │
│                            │
│     Vorsicht Quax-Auge     │
│                            │
│       ┌───────────┐        │
│      ┌┘┌───┐      └┐       │
│      │ ││.┌┐│  ┌┐  │       │
│      │ ││.└┘│  └┘  │       │
│     [│ └───┘   ..  │]      │
│      │             │       │
│      │  (   /\   ) │       │
│      │      '`     │       │
│      └┐    \__/    │       │
│       └───┐    ┌───┘       │
│           └    ┘           │
└────────────────────────────┘
SPR.DAC ist eine Binärdatei und enthählt Farbanteile die beim Start geladen werden.

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

In diesem Beispiel geht es um den MCGA-Videomode mit 320x200x256. Ich habe dafür ein paar kleine Programme zusammengestellt mit denen man aus einer Batchdatei heraus etwas Grafik auf dem Bildschirm zaubern kann.
Auf Grund der Länge des gesamten Beitrages musste ich dieses Demo in zwei Teile aufteilen. Der zweite Teil folgt im nachfolgenden Posting.

Ich beginne mit der Batchdatei die als Beispiel für die Benutzung der folgenden Programme dient.

Code: Alles auswählen

@ECHO OFF
REM -------------------------------------------------------------------------
REM                            VIDEO-MODE SETZEN
REM -------------------------------------------------------------------------

SETMODE 19
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              TEXT AUSGEBEN
REM -------------------------------------------------------------------------
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .     Video-Mode: 320 x 200 x 256,    .
ECHO .                                     .
ECHO .                                     .
ECHO .        direkt von DOS setzen !      .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .                                     .
ECHO .          --  T A S T E  --          .
REM -------------------------------------------------------------------------
REM                          AUF TASTEN-DRUCK WARTEN
REM -------------------------------------------------------------------------

TASTWART

REM -------------------------------------------------------------------------
REM                              CURSOR SETZEN
REM -------------------------------------------------------------------------

CURSOR 0,7,0
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              TEXT AUSGEBEN
REM -------------------------------------------------------------------------
ECHO .  jetzt die Farben zusammenstellen   .
ECHO .                                     .
ECHO .          und einige PUNKTE,         .
REM -------------------------------------------------------------------------
REM                           FARB-ANTEILE SETZEN
REM -------------------------------------------------------------------------

FARBTEIL 63,63,0,0
IF ERRORLEVEL GOTO ENDE

FARBTEIL 64,0,0,63
IF ERRORLEVEL GOTO ENDE

FARBTEIL 255,00,63,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 254,00,62,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 253,00,61,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 252,00,60,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 251,00,59,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 250,00,58,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 249,00,57,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 248,00,56,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 247,00,55,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 246,00,54,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 245,00,53,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 244,00,52,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 243,00,51,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 242,00,50,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 241,00,49,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 240,00,48,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 239,00,47,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 238,00,46,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 237,00,45,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 236,00,44,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 235,00,43,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 234,00,42,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 233,00,41,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 232,00,40,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 231,00,39,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 230,00,38,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 229,00,37,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 228,00,36,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 227,00,35,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 226,00,34,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 225,00,33,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 224,00,32,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 223,00,31,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 222,00,30,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 221,00,29,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 220,00,28,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 219,00,27,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 218,00,26,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 217,00,25,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 216,00,24,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 215,00,23,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 214,00,22,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 213,00,21,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 212,00,20,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 211,00,19,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 210,00,18,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 209,00,17,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 208,00,16,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 207,00,15,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 206,00,14,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 205,00,13,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 204,00,12,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 203,00,11,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 202,00,10,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 201,00,09,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 200,00,08,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 199,00,07,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 198,00,06,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 197,00,05,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 196,00,04,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 195,00,03,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 194,00,02,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 193,00,01,00
IF ERRORLEVEL GOTO ENDE
FARBTEIL 192,00,00,00
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              PIXEL SETZEN
REM -------------------------------------------------------------------------

MCGA_PIX 160,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 161,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 162,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 163,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 164,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 165,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 166,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 167,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 168,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 169,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 170,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 171,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 172,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 173,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 174,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 175,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 176,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 177,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 178,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 179,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 180,104,63
IF ERRORLEVEL GOTO ENDE
MCGA_PIX 181,104,63
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                         AUF TASTEN-DRUCK WARTEN
REM -------------------------------------------------------------------------

TASTWART

REM -------------------------------------------------------------------------
REM                              CURSOR SETZEN
REM -------------------------------------------------------------------------

CURSOR 0,7,0
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              TEXT AUSGEBEN
REM -------------------------------------------------------------------------
ECHO .                                     .
ECHO .                                     .
ECHO .     jetzt einige Linen ziehen,      .
REM -------------------------------------------------------------------------
REM                              LINIEN ZIEHEN
REM -------------------------------------------------------------------------

MCGALINE 30,100,160,130,64
IF ERRORLEVEL GOTO ENDE
MCGALINE 160,130,290,100,64
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                         AUF TASTEN-DRUCK WARTEN
REM -------------------------------------------------------------------------

TASTWART

REM -------------------------------------------------------------------------
REM                              CURSOR SETZEN
REM -------------------------------------------------------------------------

CURSOR 0,9,0
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              TEXT AUSGEBEN
REM -------------------------------------------------------------------------
ECHO .          jetzt einen Ball,          .

REM -------------------------------------------------------------------------
REM                               BALL MALEN
REM -------------------------------------------------------------------------

MCGABALL 160,40,30,255,2
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                         AUF TASTEN-DRUCK WARTEN
REM -------------------------------------------------------------------------

TASTWART

REM -------------------------------------------------------------------------
REM                              CURSOR SETZEN
REM -------------------------------------------------------------------------

CURSOR 0,9,0
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                              TEXT AUSGEBEN
REM -------------------------------------------------------------------------
ECHO .          jetzt einen Kreis,         .
REM -------------------------------------------------------------------------
REM                               KREIS MALEN
REM -------------------------------------------------------------------------

MCGAKREI 160,160,20,14
IF ERRORLEVEL GOTO ENDE

REM -------------------------------------------------------------------------
REM                         AUF TASTEN-DRUCK WARTEN
REM -------------------------------------------------------------------------

TASTWART

REM -------------------------------------------------------------------------
REM                        GRAFIK-BILDSCHIRM L™SCHEN
REM -------------------------------------------------------------------------

MCGA_CLS

REM -------------------------------------------------------------------------
REM                            TEXT-MODE SETZEN
REM -------------------------------------------------------------------------

:ENDE

SETMODE 3

Code: Alles auswählen

;╔══════════════════════╗
;║ Videomode anschalten ║
;╚══════════════════════╝
.MODEL SMALL
.386
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h             ; Segment des PSP's ermitteln
          int   21h
          cli                         ; IRQs verbieten
          mov     ds, bx              ; PSP-Segment nach DS
          mov     si, 80h             ; Zeiger auf Parameter
          mov     al, [si]
          cmp     al, 1               ;  weniger als 1 ASCII   ?
          jb  short FEHLER1           ; zu wenig = Fehler !
          cmp     al, 4               ;  mehr    als 4 ASCII's ?
          ja  FEHLER2                 ; zu viel  = Fehler !
          add     si, 2
;────────────────────────────────────────────────────────────────────────────
          mov     ax, [si]            ; zwei ASCII's holen
          add     si, 2               ; Zeiger erhöhen
          sub     al, 30h             ; 1. ASCII nach Integer wandeln
          cmp     al, 9               ;  1. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          cmp     ah, ","             ;  schon Komma, nur eine Ziffer ?
          jz  short HUNDERT
          cmp     ah, 0Dh             ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short HUNDERT
          sub     ah, 30h             ; 2. ASCII nach Integer wandeln
          cmp     ah, 9               ;  2. Wert größer als neun ?
          ja  short FEHLER3           ; keine Ziffer = Fehler !
;-------------------------------------
          mov     bl, al              ; 1. Ziffer mal 10
          shl     al, 3               ; Wert mal 8
          add     bl, bl              ; Wert mal 2
          add     al, bl              ; Zehner          = Wert mal 10
;-------------------------------------
          xor     dh, dh
          mov     dl, [si]            ; dritten ASCII holen
          cmp     dl, ","             ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp     dl, 0Dh             ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub     dl, 30h             ; 3. ASCII nach Integer wandeln
          cmp     dl, 9               ;  3. Wert größer als neun ?
          ja  short FEHLER3           ; keine Ziffer = Fehler !
          inc     si                  ; Zeiger erhöhen
;-------------------------------------
          mov     cx, ax
          xor     ch, ch
          mov     bx, cx              ; 1. Ziffer noch einmal mal 10
          shl     cx, 3               ; Wert mal 8
          add     bx, bx              ; Wert mal 2
          add     cx, bx              ; jetzt Hunderter = Wert mal 100
;-------------------------------------
          mov     al, ah              ; 2. Ziffer mal 10
          shl     ah, 3               ; Wert mal 8
          add     al, al              ; Wert mal 2
          add     al, ah              ; jetzt Zehner    = Wert mal 10
          xor     ah, ah
          add     ax, cx              ; Zehner plus Hunderter
          add     ax, dx              ; Einer dazu
          inc     si                  ; Komma überspringen
          jmp  short HUNDERT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;-------------------------------------
ZEHNER:   add     al, ah              ; Einer/Zehner dazu
;-------------------------------------
HUNDERT:  xor     ah, ah
          int   10h                   ; Video-Mode setzen
;────────────────────────────────────────────────────────────────────────────
          xor     al, al              ; kein Fehler
;-------------------------------------
DOS:      mov     ah, 4Ch             ; Dos-Rücksprung
          sti                         ; IRQs erlauben
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1               ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;-------------------------------------
WORK:     mov     ah, 9               ; Text ausgeben
          int   21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2               ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3               ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'          ; Daten-Alignment
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║           SYNTAX:                SETMODE.exe Video-Mode  (0 bis 255)         ║"
DB "║                                                                              ║"
DB "║ Mode │ Auflösung │ Farben │ Bemerkung  Mode │ Auflösung │ Farben │ Bemerkung ║"
DB "║ ─────┼───────────┼────────┼──────────  ─────┼───────────┼────────┼────────── ║"
DB "║   0  │   40x25   │   16   │   Text      13  │  320x200  │   16   │  Grafik   ║"
DB "║   1  │   40x25   │   16   │   Text      14  │  640x200  │   16   │  Grafik   ║"
DB "║   2  │   80x25   │   16   │   Text      15  │  640x350  │  mono  │  Grafik   ║"
DB "║   3  │   80x25   │   16   │   Text      16  │  640x350  │   16   │  Grafik   ║"
DB "║   4  │  320x200  │    4   │  Grafik     17  │  640x480  │  mono  │  Grafik   ║"
DB "║   5  │  320x200  │    4   │  Grafik     18  │  640x480  │   16   │  Grafik   ║"
DB "║   6  │  640x200  │    2   │  Grafik     19  │  320x200  │  256   │  Grafik   ║"
DB "║   7  │   80x25   │  mono  │   Text                                           ║"
DB "║                                                                              ║"
DB "║                        auch alle anderen Video-Modi sind erlaubt             ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:           Freie Cracker Crew Hamburg Horn                  ║"
DB "║                                                                Version  1.0  ║"
DB "║              von:                 Dirk Wolfgang Glomp                        ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB 0Dh, 0Ah ,"$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine dezimale Ziffer = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔══════════════════════════════╗
;║ Auf einen Tastendruck warten ║
;╚══════════════════════════════╝
.MODEL SMALL
.386
.CODE
 ORG 100h
          cli
;──────────────────────────
TASTE:    in      al, 60h
          and     al, 80h
          jnz TASTE
;──────────────────────────
          sti
          mov     ah, 1
          int   16h
          mov     ah, 4Ch
          int   21h
 END

Code: Alles auswählen

;╔═══════════════════╗
;║ Den Cursor setzen ║
;╚═══════════════════╝
.MODEL SMALL
.386
;────────────────────────────────────────────────────────────────────────────
Max_Seite  =  8
Max_Zeile  = 50
Max_Spalte = 80
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     di, OFFSET SEITE
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h            ; Segment des PSP's ermitteln
          int   21h
          cli                        ; IRQs verbieten
          mov     ds, bx             ; PSP-Segment nach DS
          mov     si, 80h            ; Zeiger auf Parameter-Anzahl
          mov     al, [si]           ; Anzahl holen
          cmp     al, 6              ;  weniger als  6 ASCII's ?
          jb  short FEHLER1          ; zu wenig = Fehler !
          cmp     al, 0Dh            ;  mehr    als 13 ASCII's ?
          ja  short FEHLER2          ; zu viel  = Fehler !
          add     si, 2              ; Zeiger auf 1. Parameter
;────────────────────────────────────────────────────────────────────────────
; max. 2 Ziffer je Parameter wandeln, Daten-Byte 0 bis 99 retten
;────────────────────────────────────────────────────────────────────────────
          mov     cl, 3              ; drei Parameter
;------------------------------------
HOLWERT:  mov     ax, [si]           ; zwei ASCII's holen
          sub     al, 30h            ; 1. ASCII nach Integer wandeln
          cmp     al, 9              ;  1. Wert größer als neun ?
          ja  short FEHLER3          ; keine Ziffer = Fehler !
          add     si, 2              ; Zeiger erhöhen
          cmp     ah, 0Dh            ;  Parameter-Ende erreicht ?
          jz  short ANTEIL
          cmp     ah, ","            ;  nur eine Ziffer ?
          jz  short ANTEIL
          sub     ah, 30h            ; 2. ASCII nach Integer wandeln
          cmp     ah, 9              ;  2. Wert größer als neun ?
          ja  short FEHLER3          ; keine Ziffer = Fehler !
;------------------------------------
          mov     bl, al             ; nach zweistelligen Integer wandeln
          shl     al, 3              ; Wert mal 8
          add     bl, bl             ; Wert mal 2
          add     al, bl             ;            = Wert mal 10
          add     al, ah             ; Einer dazu
          inc     si                 ; Komma überspringen
;------------------------------------
ANTEIL:   mov     es:[di], al        ; Wert retten
          inc     di
          dec     cl
          jnz HOLWERT
;----------------------------------------------------------------------------
          mov     ax, DATEN
          mov     ds, ax
;------------------------------------
          mov     bh, SEITE
          cmp     bh, Max_Seite
          ja  short FEHLER4          ; Wert zu hoch = Fehler !
          mov     dh, Zeile
          cmp     dh, Max_Zeile
          ja  short FEHLER5          ; Wert zu hoch = Fehler !
          mov     dl, Spalte
          cmp     dl, Max_Spalte
          ja  short FEHLER6          ; Wert zu hoch = Fehler !
          mov     ah, 2              ; Cursor setzen
          int   10h
;────────────────────────────────────────────────────────────────────────────
          xor     al, al             ; kein Fehler
;------------------------------------
DOS:      mov     ah, 4Ch            ; Dos-Rücksprung
          sti                        ; IRQs erlauben
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1              ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;------------------------------------
WORK:     mov     ah, 9              ; Text ausgeben
          int   21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2              ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3              ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov     al, 4              ; ERRORLEVEL = 4
          mov     dx, OFFSET ERRCO4
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov     al, 5              ; ERRORLEVEL = 5
          mov     dx, OFFSET ERRCO5
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov     al, 6              ; ERRORLEVEL = 6
          mov     dx, OFFSET ERRCO6
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'         ; Daten-Alignment
;----------------------------------------------------------------------------
SEITE     DB ?
ZEILE     DB ?
SPALTE    DB ?
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║           SYNTAX:            CURSOR.exe Seite,Zeile,Spalte                   ║"
DB "║                                                                              ║"
DB "║                                  Seite :   0   bis    8                      ║"
DB "║                                                                              ║"
DB "║                                  Zeile :   1   bis   50                      ║"
DB "║     Version  1.0                                                             ║"
DB "║                                  Spalte:   1   bis   80                      ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:           Freie Cracker Crew Hamburg Horn                  ║"
DB "║                                                                              ║"
DB "║              von:                 Dirk Wolfgang Glomp                        ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB 0Dh, 0Ah ,"$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   Seite zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Zeile zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   Spalte zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔════════════════════════════════════════════╗
;║ Farbanteile für eine von 255 Farben setzen ║
;╚════════════════════════════════════════════╝
.MODEL SMALL
.386
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     di, OFFSET FARBE
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h            ; Segment des PSP's ermitteln
          int   21h
          cli                        ; IRQs verbieten
          mov     ds, bx             ; PSP-Segment nach DS
          mov     si, 80h            ; Zeiger auf Parameter-Anzahl
          mov     al, [si]           ; Anzahl holen
          cmp     al, 7              ;  weniger als  7 ASCII's ?
          jb  FEHLER1                ; zu wenig = Fehler !
          cmp     al, 0Dh            ;  mehr    als 13 ASCII's ?
          ja  FEHLER2                ; zu viel  = Fehler !
          add     si, 2              ; Zeiger auf 1. Parameter
;────────────────────────────────────────────────────────────────────────────
          mov     ax, [si]           ; zwei ASCII's holen
          sub     al, 30h            ; 1. ASCII nach Integer wandeln
          add     si, 2              ; Zeiger erhöhen
          cmp     al, 9              ;  1. Wert größer als neun ?
          ja  FEHLER3                ; keine Ziffer = Fehler !
          cmp     ah, ","            ;  schon Komma, nur eine Ziffer ?
          jz  short EINER 
          cmp     ah, 0Dh            ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short EINER  
          sub     ah, 30h            ; 2. ASCII nach Integer wandeln
          cmp     ah, 9              ;  2. Wert größer als neun ?
          ja  FEHLER3                ; keine Ziffer = Fehler !
          mov     bl, al             ; 1. Ziffer mal 10
          shl     al, 3              ; Wert mal 8
          xor     dh, dh
          add     bl, bl             ; Wert mal 2
          mov     dl, [si]           ; dritten ASCII holen
          add     al, bl             ; Zehner          = Wert mal 10
          cmp     dl, ","            ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp     dl, 0Dh            ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub     dl, 30h            ; 3. ASCII nach Integer wandeln
          cmp     dl, 9              ;  3. Wert größer als neun ?
          ja  FEHLER3                ; keine Ziffer = Fehler !
          mov     cx, ax
          inc     si                 ; Zeiger erhöhen
          xor     ch, ch
          mov     bx, cx             ; 1. Ziffer noch einmal mal 10
          shl     cx, 3              ; Wert mal 8
          add     bx, bx             ; Wert mal 2
          mov     al, ah             ; 2. Ziffer mal 10
          add     cx, bx             ; jetzt Hunderter = Wert mal 100
          shl     ah, 3              ; Wert mal 8
          add     al, al             ; Wert mal 2
          add     al, ah             ; jetzt Zehner    = Wert mal 10
          xor     ah, ah           
          add     ax, cx             ; Zehner plus Hunderter
          inc     si                 ; Komma überspringen
          add     ax, dx             ; Einer dazu
          jmp  short HUNDERT
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
ZEHNER:   add     al, ah             ; Einer/Zehner dazu
          inc     si                 ; Komma überspringen
EINER:    xor     ah, ah
HUNDERT:  mov     es:[di], al        ; Wert retten
          inc     di                 ; Zeiger erhöhen
;----------------------------------------------------------------------------
          mov     cl, 3              ; drei Farb-Anteil-Parameter
HOLWERT:  mov     ax, [si]           ; zwei ASCII's holen
          sub     al, 30h            ; 1. ASCII nach Integer wandeln
          cmp     al, 9              ;  1. Wert größer als neun ?
          ja  FEHLER3                ; keine Ziffer = Fehler !
          add     si, 2              ; Zeiger erhöhen
          cmp     ah, 0Dh            ;  Parameter-Ende erreicht ?
          jz  short ANTEIL
          cmp     ah, ","            ;  nur eine Ziffer ?
          jz  short ANTEIL
          sub     ah, 30h            ; 2. ASCII nach Integer wandeln
          cmp     ah, 9              ;  2. Wert größer als neun ?
          ja  short FEHLER3          ; keine Ziffer = Fehler !
;------------------------------------
          mov     bl, al             ; nach zweistelligen Integer wandeln
          shl     al, 3              ; Wert mal 8
          add     bl, bl             ; Wert mal 2
          add     al, bl             ;            = Wert mal 10
          add     al, ah             ; Einer dazu
          inc     si                 ; Komma ueberspringen
;------------------------------------
ANTEIL:   mov     es:[di], al        ; Wert retten
          inc     di
          dec     cl
          jnz HOLWERT
;----------------------------------------------------------------------------
          mov     ax, DATEN
          mov     ds, ax
;------------------------------------
          mov     si, OFFSET FARBE   ; Zeiger auf Farbe
          cmp    BYTE PTR[si+1], 3Fh
          ja  short FEHLER4          ; Rot-Anteil  zu groß = Fehler !
          cmp    BYTE PTR[si+2], 3Fh
          ja  short FEHLER5          ; Grün-Anteil zu groß = Fehler !
          cmp    BYTE PTR[si+3], 3Fh
          ja  short FEHLER6          ; Blau-Anteil zu groß = Fehler !
;------------------------------------
          mov     dx, 3C8h           ; EGA-Farb-Register
          mov     al, [si]           ; Farb-Nr. holen
          out     dx, al             ; und setzen
          inc     dx
          mov     al, [si+1]         ; Rot-Anteil holen
          out     dx, al             ; und setzen
          mov     al, [si+2]         ; Grün-Anteil holen
          out     dx, al             ; und setzen
          mov     al, [si+3]         ; Blau-Anteil holen
          out     dx, al             ; und setzen
;────────────────────────────────────────────────────────────────────────────
          xor     al, al             ; kein Fehler
DOS:      mov     ah, 4Ch            ; Dos-Rücksprung
          sti                        ; IRQs erlauben
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1              ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;------------------------------------
WORK:     mov     ah, 9              ; Text ausgeben
          int   21h
          jmp  short DOS
;-----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2              ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;-----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3              ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;-----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov     al, 4              ; ERRORLEVEL = 4
          mov     dx, OFFSET ERRCO4
          jmp  short WORK
;-----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov     al, 5              ; ERRORLEVEL = 5
          mov     dx, OFFSET ERRCO5
          jmp  short WORK
;-----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov     al, 6              ; ERRORLEVEL = 6
          mov     dx, OFFSET ERRCO6
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16  ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'         ; Daten-Alignment
;----------------------------------------------------------------------------
FARBE     DB ?, ?, ?, ?
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║     SYNTAX:    FARBTEIL.exe Farb-Nummer,Rot-Anteil,Grün-Anteil,Blau-Anteil   ║"
DB "║     ──────                                                                   ║"
DB "║                4 Parameter; Leerzeichen hinter Kommas, sind nicht erlaubt !  ║"
DB "║                                                                              ║"
DB "║                                                         Farb-Nr.│ Farb-Name  ║"
DB "║   FARBANTEILE     1. Farb-Nummer:  von  0  bis  255     ────────┼──────────  ║"
DB "║   ───────────                                               0   │  schwarz   ║"
DB "║     SETZEN        2. Rot- Anteil:  von  0  bis   63         1   │  blau      ║"
DB "║     ──────                                                  2   │  grün      ║"
DB "║      RGB          3. Grün-Anteil:  von  0  bis   63         3   │  cyan      ║"
DB "║      ───                                                    4   │  rot       ║"
DB "║                   4. Blau-Anteil:  von  0  bis   63         5   │  magenta   ║"
DB "║   Version   1.0                                             6   │  braun     ║"
DB "║  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _          7   │  weiß      ║"
DB "║                                                                              ║"
DB "║  (C) Copyright:    Freie Cracker Crew Hamburg Horn       für Text und Grafik ║"
DB "║                                                                              ║"
DB "║            von:           Dirk Wolfgang Glomp             Farben 16 oder 256 ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB 0Dh, 0Ah ,"$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   Rot-Anteil  zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Grün-Anteil zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   Blau-Anteil zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔══════════════════════════════════════╗
;║ Einen Pixel im MCGA-Videomode setzen ║
;╚══════════════════════════════════════╝
.MODEL SMALL
.386
;────────────────────────────────────────────────────────────────────────────
                Z  =  320             ; Länge einer Bildschirm-Zeile
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     di, OFFSET PIXEL
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h             ; Segment des PSP's ermitteln
          int   21h
          cli                         ; IRQs verbieten
          mov     ds, bx              ; PSP-Segment nach DS
          mov     si, 80h             ; Zeiger auf Parameter
          mov     al, [si]
          cmp     al, 5               ;  weniger als  5 ASCII's ?
          jb  FEHLER1                 ; zu wenig = Fehler !
          cmp     al, 0Ch             ;  mehr    als 12 ASCII's ?
          ja  FEHLER2                 ; zu viel  = Fehler !
          add     si, 2
;────────────────────────────────────────────────────────────────────────────
          mov     bp, 3               ; drei Parameter
;-------------------------------------
HOLWERT:  mov     ax, [si]            ; zwei ASCII's holen
          add     si, 2               ; Zeiger erhöhen
          sub     al, 30h             ; 1. ASCII nach Integer wandeln
          cmp     al, 9               ;  1. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          cmp     ah, ","             ;  schon Komma, nur eine Ziffer ?
          jz  short EINER
          cmp     ah, 0Dh             ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short EINER
          sub     ah, 30h             ; 2. ASCII nach Integer wandeln
          cmp     ah, 9               ;  2. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
;-------------------------------------
          mov     bl, al              ; 1. Ziffer mal 10
          shl     al, 3               ; Wert mal 8
          add     bl, bl              ; Wert mal 2
          add     al, bl              ; Zehner          = Wert mal 10
;-------------------------------------
          xor     dx, dx
          mov     dl, [si]            ; dritten ASCII holen
          cmp     dl, ","             ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp     dl, 0Dh             ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub     dl, 30h             ; 3. ASCII nach Integer wandeln
          cmp     dl, 9               ;  3. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          inc     si                  ; Zeiger erhöhen
;-------------------------------------
          mov     cx, ax
          xor     ch, ch
          mov     bx, cx              ; 1. Ziffer noch einmal mal 10
          shl     cx, 3               ; Wert mal 8
          add     bx, bx              ; Wert mal 2
          add     cx, bx              ; jetzt Hunderter = Wert mal 100
;-------------------------------------
          mov     al, ah              ; 2. Ziffer mal 10
          shl     ah, 3               ; Wert mal 8
          add     al, al              ; Wert mal 2
          add     al, ah              ; jetzt Zehner    = Wert mal 10
          xor     ah, ah
          add     ax, cx              ; Zehner plus Hunderter
          add     ax, dx              ; Einer dazu
          inc     si                  ; Komma überspringen
          jmp  short HUNDERT
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
ZEHNER:   add     al, ah              ; Einer/Zehner dazu
          inc     si                  ; Komma überspringen
;-------------------------------------
EINER:    xor     ah, ah
HUNDERT:  mov     es:[di], ax         ; Wert retten
          add     di, 2               ; Zeiger erhöhen
          dec     bp
          jnz HOLWERT
;----------------------------------------------------------------------------
          mov     ax, DATEN           ; Daten-Segment
          mov     bx, 0A000h          ; Grafik-Bildschirm-Segment
          mov     ds, ax
          mov     fs, bx
;-------------------------------------
          mov     si, OFFSET PIXEL
          mov     di, [si]            ; X-Position holen
          cmp     di, 319
          ja  short FEHLER4           ; Wert zu groß = Fehler !
          mov     bx, [si+2]          ; Y-Position holen
          cmp     bx, 199
          ja  short FEHLER5           ; Wert zu groß = Fehler !
          mov     cx, [si+4]          ; Farbe      holen
          cmp     cx, 255
          ja  short FEHLER6           ; Wert zu groß = Fehler !
;-------------------------------------
          add     bx, bx                 ; Y holen und verdoppeln = Zeiger
          mov     bx, [bx]               ; Zeile aus Zeilen-Tabelle holen
          mov    BYTE PTR fs:[bx+di], cl ; plus X = Farbe 0-255 zum Bildschirm
;────────────────────────────────────────────────────────────────────────────
          xor     al, al              ; kein Fehler
;-------------------------------------
DOS:      mov     ah, 4Ch             ; Dos-Rücksprung
          sti                         ; IRQs erlauben
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1               ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;-------------------------------------
WORK:     mov     ah, 9               ; Text ausgeben
          int   21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2               ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3               ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov     al, 4               ; ERRORLEVEL = 4
          mov     dx, OFFSET ERRCO4
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov     al, 5               ; ERRORLEVEL = 5
          mov     dx, OFFSET ERRCO5
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov     al, 6               ; ERRORLEVEL = 6
          mov     dx, OFFSET ERRCO6
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'          ; Daten-Alignment
;----------------------------------------------------------------------------
PIXTAB    DW 000h*Z, 001h*Z, 002h*Z, 003h*Z, 004h*Z, 005h*Z, 006h*Z, 007h*Z
          DW 008h*Z, 009h*Z, 00Ah*Z, 00Bh*Z, 00Ch*Z, 00Dh*Z, 00Eh*Z, 00Fh*Z
          DW 010h*Z, 011h*Z, 012h*Z, 013h*Z, 014h*Z, 015h*Z, 016h*Z, 017h*Z
          DW 018h*Z, 019h*Z, 01Ah*Z, 01Bh*Z, 01Ch*Z, 01Dh*Z, 01Eh*Z, 01Fh*Z
          DW 020h*Z, 021h*Z, 022h*Z, 023h*Z, 024h*Z, 025h*Z, 026h*Z, 027h*Z
          DW 028h*Z, 029h*Z, 02Ah*Z, 02Bh*Z, 02Ch*Z, 02Dh*Z, 02Eh*Z, 02Fh*Z
          DW 030h*Z, 031h*Z, 032h*Z, 033h*Z, 034h*Z, 035h*Z, 036h*Z, 037h*Z
          DW 038h*Z, 039h*Z, 03Ah*Z, 03Bh*Z, 03Ch*Z, 03Dh*Z, 03Eh*Z, 03Fh*Z
          DW 040h*Z, 041h*Z, 042h*Z, 043h*Z, 044h*Z, 045h*Z, 046h*Z, 047h*Z
          DW 048h*Z, 049h*Z, 04Ah*Z, 04Bh*Z, 04Ch*Z, 04Dh*Z, 04Eh*Z, 04Fh*Z
          DW 050h*Z, 051h*Z, 052h*Z, 053h*Z, 054h*Z, 055h*Z, 056h*Z, 057h*Z
          DW 058h*Z, 059h*Z, 05Ah*Z, 05Bh*Z, 05Ch*Z, 05Dh*Z, 05Eh*Z, 05Fh*Z
          DW 060h*Z, 061h*Z, 062h*Z, 063h*Z, 064h*Z, 065h*Z, 066h*Z, 067h*Z
          DW 068h*Z, 069h*Z, 06Ah*Z, 06Bh*Z, 06Ch*Z, 06Dh*Z, 06Eh*Z, 06Fh*Z
          DW 070h*Z, 071h*Z, 072h*Z, 073h*Z, 074h*Z, 075h*Z, 076h*Z, 077h*Z
          DW 078h*Z, 079h*Z, 07Ah*Z, 07Bh*Z, 07Ch*Z, 07Dh*Z, 07Eh*Z, 07Fh*Z
          DW 080h*Z, 081h*Z, 082h*Z, 083h*Z, 084h*Z, 085h*Z, 086h*Z, 087h*Z
          DW 088h*Z, 089h*Z, 08Ah*Z, 08Bh*Z, 08Ch*Z, 08Dh*Z, 08Eh*Z, 08Fh*Z
          DW 090h*Z, 091h*Z, 092h*Z, 093h*Z, 094h*Z, 095h*Z, 096h*Z, 097h*Z
          DW 098h*Z, 099h*Z, 09Ah*Z, 09Bh*Z, 09Ch*Z, 09Dh*Z, 09Eh*Z, 09Fh*Z
          DW 0A0h*Z, 0A1h*Z, 0A2h*Z, 0A3h*Z, 0A4h*Z, 0A5h*Z, 0A6h*Z, 0A7h*Z
          DW 0A8h*Z, 0A9h*Z, 0AAh*Z, 0ABh*Z, 0ACh*Z, 0ADh*Z, 0AEh*Z, 0AFh*Z
          DW 0B0h*Z, 0B1h*Z, 0B2h*Z, 0B3h*Z, 0B4h*Z, 0B5h*Z, 0B6h*Z, 0B7h*Z
          DW 0B8h*Z, 0B9h*Z, 0BAh*Z, 0BBh*Z, 0BCh*Z, 0BDh*Z, 0BEh*Z, 0BFh*Z
          DW 0C0h*Z, 0C1h*Z, 0C2h*Z, 0C3h*Z, 0C4h*Z, 0C5h*Z, 0C6h*Z, 0C7h*Z
;----------------------------------------------------------------------------
PIXEL     DW 0, 0, 0                  ; X,Y,Farbe
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║           SYNTAX:       MCGA_PIX.exe X-Position,Y-Position,Farbe             ║"
DB "║                                                                              ║"
DB "║ ┌────────────────────┐       X-Position:  von  0  bis  319                   ║"
DB "║ │    PIXEL-SETZER    │                                                       ║"
DB "║ │                    │       Y-Position:  von  0  bis  199                   ║"
DB "║ │ für GRAFIK-MODE: 19│                                        Version  1.0   ║"
DB "║ └────────────────────┘       Farbe:       von  0  bis  255    ────────────   ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:           Freie Cracker Crew Hamburg Horn                  ║"
DB "║                                                                              ║"
DB "║              von:                 Dirk Wolfgang Glomp                        ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB 0Dh, 0Ah ,"$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   X-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Y-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   Farb-Wert zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end
Die nächsten Programme folgen im nachfolgenden Posting, da sonst die maximale Anzahl der zu verwendenden Zeichen überschritten wird.

Dirk
Zuletzt geändert von freecrac am Sa 25. Sep 2010, 13:08, insgesamt 10-mal geändert.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

Dies ist der zweite Teil der Demos für den MCGA-Videomode.

Code: Alles auswählen

;╔════════════════════════════════════════════╗
;║ Eine Linie für den MCGA-Videomode zeichnen ║
;╚════════════════════════════════════════════╝
.MODEL SMALL
.386
;────────────────────────────────────────────────────────────────────────────
                Z  =  320             ; Länge einer Bildschirm-Zeile
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov      ax, DATEN
          mov      ds, ax
          mov      es, ax
          mov      di, OFFSET X1      ; Offset der zu rettenden Werte
;────────────────────────────────────────────────────────────────────────────
          mov      ah, 62h            ; Segment des PSP's ermitteln
          int    21h
          cli                         ; IRQs verbieten
          mov      si, 80h            ; Zeiger auf Parameter
          mov      ds, bx             ; PSP-Segment nach DS
          mov      al, [si]
          cmp      al, 9              ;  weniger als  5 ASCII's ?
          jb  FEHLER1                 ; zu wenig = Fehler !
          cmp      al, 14h            ;  mehr    als 20 ASCII's ?
          ja  FEHLER2                 ; zu viel  = Fehler !
          add      si, 2
;────────────────────────────────────────────────────────────────────────────
; Holt ASCII-Ziffer bis zum Komma, wandelt max. 3 Ziffern und rettet Word-Wert
;────────────────────────────────────────────────────────────────────────────
          mov      bp, 5              ; fünf Parameter
;-------------------------------------
HOLWERT:  mov      ax, [si]           ; zwei ASCII's holen
          sub      al, 30h            ; 1. ASCII nach Integer wandeln
          add      si, 2              ; Zeiger erhöhen
          cmp      al, 9              ;  1. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          cmp      ah, ","            ;  schon Komma, nur eine Ziffer ?
          jz  short EINER
          cmp      ah, 0Dh            ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short EINER
          sub      ah, 30h            ; 2. ASCII nach Integer wandeln
          cmp      ah, 9              ;  2. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov      bl, al             ; 1. Ziffer mal 10
          shl      al, 3              ; Wert mal 8
          xor      dh, dh
          add      bl, bl             ; Wert mal 2
          mov      dl, [si]           ; dritten ASCII holen
          add      al, bl             ; Zehner          = Wert mal 10
          cmp      dl, ","            ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp      dl, 0Dh            ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub      dl, 30h            ; 3. ASCII nach Integer wandeln
          cmp      dl, 9              ;  3. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov      cx, ax
          inc      si                 ; Zeiger erhöhen
          xor      ch, ch
          mov      bx, cx             ; 1. Ziffer noch einmal mal 10
          shl      cx, 3              ; Wert mal 8
          add      bx, bx             ; Wert mal 2
          mov      al, ah             ; 2. Ziffer mal 10
          add      cx, bx             ; jetzt Hunderter = Wert mal 100
          shl      ah, 3              ; Wert mal 8
          add      al, al             ; Wert mal 2
          add      al, ah             ; jetzt Zehner    = Wert mal 10
          xor      ah, ah
          add      ax, cx             ; Zehner plus Hunderter
          inc      si                 ; Komma überspringen
          add      ax, dx             ; Einer dazu
          jmp  short HUNDERT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;-------------------------------------
ZEHNER:   add      al, ah             ; Einer/Zehner dazu
          inc      si                 ; Komma überspringen
EINER:    xor      ah, ah
HUNDERT:  mov      es:[di], ax        ; Wert retten
          add      di, 2              ; Zeiger erhöhen
          dec      bp
          jnz HOLWERT
;----------------------------------------------------------------------------
          mov      ax, DATEN
          mov      bx, 0A000h         ; Grafik-Bildschirm-Segment
          mov      ds, ax
          mov      es, bx
;-------------------------------------
          mov      bx, X1             ; X1-Position holen
          mov      si, Y1             ; Y1-Position holen
          mov      cx, X2             ; X2-Position holen
          mov      di, Y2             ; Y2-Position holen
          mov      ax, FA             ; Farbe       holen
          cmp      bx, 319
          ja  FEHLER4                 ;  Wert zu groß = Fehler !
          cmp      si, 199
          ja  FEHLER5                 ;  Wert zu groß = Fehler !
          cmp      cx, 319
          ja  FEHLER6                 ;  Wert zu groß = Fehler !
          cmp      di, 199
          ja  FEHLER7                 ;  Wert zu groß = Fehler !
          cmp      ax, 255
          ja  FEHLER8                 ;  Wert zu groß = Fehler !
          mov     BYTE PTR cs:[FARBE+3], al ;Farbe in den Pixelsetzer schreiben
;────────────────────────────────────────────────────────────────────────────
;    Anfangspunkt: BX, SI   Endpunkt: CX, DI   Segment: FS
;────────────────────────────────────────────────────────────────────────────
          mov      ax, 4043h          ; Code für: INC AX // INC BX
          mov      dx, di             ; Y2 laden
          sub      cx, bx             ; DELTAX=X2-X1
          jge short DAX               ; X2>X1?
          mov      al, 4Bh            ; nein, Code für DEC BX
          neg      cx                 ; und DELTAX umdrehen
DAX:      sub      dx, si             ; DELTAY=Y2-Y1 bilden
          jge short DAY               ; Y2>Y1?
          mov      ah, 48h            ; nein, Code für DEC AX
          neg      dx                 ; und DELTAY umdrehen
DAY:      mov     WORD PTR cs:[G], ax ; Ink/Dek im Code abspeichern
          cmp      cx, dx             ; DELTAX>DELTAY?
          jge short DAB               ; ja, verzweige
          mov      al, 90h            ; Y ist Laufvariable
          mov      bp, dx             ; DELTAX und DELTAY tauschen
          mov      dx, cx
          mov      cx, bp
          jmp  short ACHS             ; und weitermachen
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
DAB:      mov      ah, 90h            ; X ist Laufvariable
ACHS:     add      dx, dx             ; INCB bestimmen
          mov     WORD PTR cs:[K], ax ; Ink. für Laufvariable im Code ablegen
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          mov      ax, si             ; Y1
          mov      di, dx             ; DAB nach BX übertragen
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
SCHLEIF:  mov      si, [eax*2]        ; ax = Y   bx = X
FARBE:    mov     BYTE PTR es:[bx+si], 0
;-------------------------------------
          and      di, di             ; DAB>0?
          jge short G                 ; ja, verzweige
K:        inc      bx                 ; hier wird der
          inc      ax                 ; Code modifiziert
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz SCHLEIF                 ; Schleife schließen
;----------------------------------------------------------------------------
          mov      ax, 4C00h          ; Dos-Rücksprung, kein Fehler
          sti                         ; IRQS erlauben
          int    21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
G:        inc      bx                 ; hier wird der
          inc      ax                 ; Code modifiziert
          add      di, dx             ; Schleife schließen
          dec      cx
          jnz SCHLEIF                 ; und weiter
;----------------------------------------------------------------------------
          xor      al, al             ; kein Fehler
;-------------------------------------
DOS:      mov      ah, 4Ch            ; Dos-Rücksprung
          sti                         ; IRQs erlauben
          int    21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov      al, 1              ; ERRORLEVEL = 1
          mov      dx, OFFSET ERRCO1
;-------------------------------------
WORK:     mov      ah, 9              ; Text ausgeben
          int    21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov      al, 2              ; ERRORLEVEL = 2
          mov      dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov      al, 3              ; ERRORLEVEL = 3
          mov      dx, OFFSET ERRCO3
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov      al, 4              ; ERRORLEVEL = 4
          mov      dx, OFFSET ERRCO4
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov      al, 5              ; ERRORLEVEL = 5
          mov      dx, OFFSET ERRCO5
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov      al, 6              ; ERRORLEVEL = 6
          mov      dx, OFFSET ERRCO6
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER7:  call BASIS
          mov      al, 7              ; ERRORLEVEL = 7
          mov      dx, OFFSET ERRCO7
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER8:  call BASIS
          mov      al, 8              ; ERRORLEVEL = 8
          mov      dx, OFFSET ERRCO8
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov      ax, DATEN
          mov      ds, ax
          mov      ah, 9
          mov      dx, OFFSET SYNTAX
          int    21h
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'          ; Daten-Alignment
;----------------------------------------------------------------------------
PIXTAB    DW 000h*Z, 001h*Z, 002h*Z, 003h*Z, 004h*Z, 005h*Z, 006h*Z, 007h*Z
          DW 008h*Z, 009h*Z, 00Ah*Z, 00Bh*Z, 00Ch*Z, 00Dh*Z, 00Eh*Z, 00Fh*Z
          DW 010h*Z, 011h*Z, 012h*Z, 013h*Z, 014h*Z, 015h*Z, 016h*Z, 017h*Z
          DW 018h*Z, 019h*Z, 01Ah*Z, 01Bh*Z, 01Ch*Z, 01Dh*Z, 01Eh*Z, 01Fh*Z
          DW 020h*Z, 021h*Z, 022h*Z, 023h*Z, 024h*Z, 025h*Z, 026h*Z, 027h*Z
          DW 028h*Z, 029h*Z, 02Ah*Z, 02Bh*Z, 02Ch*Z, 02Dh*Z, 02Eh*Z, 02Fh*Z
          DW 030h*Z, 031h*Z, 032h*Z, 033h*Z, 034h*Z, 035h*Z, 036h*Z, 037h*Z
          DW 038h*Z, 039h*Z, 03Ah*Z, 03Bh*Z, 03Ch*Z, 03Dh*Z, 03Eh*Z, 03Fh*Z
          DW 040h*Z, 041h*Z, 042h*Z, 043h*Z, 044h*Z, 045h*Z, 046h*Z, 047h*Z
          DW 048h*Z, 049h*Z, 04Ah*Z, 04Bh*Z, 04Ch*Z, 04Dh*Z, 04Eh*Z, 04Fh*Z
          DW 050h*Z, 051h*Z, 052h*Z, 053h*Z, 054h*Z, 055h*Z, 056h*Z, 057h*Z
          DW 058h*Z, 059h*Z, 05Ah*Z, 05Bh*Z, 05Ch*Z, 05Dh*Z, 05Eh*Z, 05Fh*Z
          DW 060h*Z, 061h*Z, 062h*Z, 063h*Z, 064h*Z, 065h*Z, 066h*Z, 067h*Z
          DW 068h*Z, 069h*Z, 06Ah*Z, 06Bh*Z, 06Ch*Z, 06Dh*Z, 06Eh*Z, 06Fh*Z
          DW 070h*Z, 071h*Z, 072h*Z, 073h*Z, 074h*Z, 075h*Z, 076h*Z, 077h*Z
          DW 078h*Z, 079h*Z, 07Ah*Z, 07Bh*Z, 07Ch*Z, 07Dh*Z, 07Eh*Z, 07Fh*Z
          DW 080h*Z, 081h*Z, 082h*Z, 083h*Z, 084h*Z, 085h*Z, 086h*Z, 087h*Z
          DW 088h*Z, 089h*Z, 08Ah*Z, 08Bh*Z, 08Ch*Z, 08Dh*Z, 08Eh*Z, 08Fh*Z
          DW 090h*Z, 091h*Z, 092h*Z, 093h*Z, 094h*Z, 095h*Z, 096h*Z, 097h*Z
          DW 098h*Z, 099h*Z, 09Ah*Z, 09Bh*Z, 09Ch*Z, 09Dh*Z, 09Eh*Z, 09Fh*Z
          DW 0A0h*Z, 0A1h*Z, 0A2h*Z, 0A3h*Z, 0A4h*Z, 0A5h*Z, 0A6h*Z, 0A7h*Z
          DW 0A8h*Z, 0A9h*Z, 0AAh*Z, 0ABh*Z, 0ACh*Z, 0ADh*Z, 0AEh*Z, 0AFh*Z
          DW 0B0h*Z, 0B1h*Z, 0B2h*Z, 0B3h*Z, 0B4h*Z, 0B5h*Z, 0B6h*Z, 0B7h*Z
          DW 0B8h*Z, 0B9h*Z, 0BAh*Z, 0BBh*Z, 0BCh*Z, 0BDh*Z, 0BEh*Z, 0BFh*Z
          DW 0C0h*Z, 0C1h*Z, 0C2h*Z, 0C3h*Z, 0C4h*Z, 0C5h*Z, 0C6h*Z, 0C7h*Z
;----------------------------------------------------------------------------
X1        DW 0                        ; Anfangs-Position X
Y1        DW 0                        ; Anfangs-Position Y
X2        DW 0                        ; End    -Position X
Y2        DW 0                        ; End    -Position Y
FA        DW 0                        ; Farbe
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║           SYNTAX:       MCGALINE.exe X-Anfang,Y-Anfang,X-Ende,Y-Ende,Farbe   ║"
DB "║                                                                              ║"
DB "║ ┌────────────────────┐         X-Positionen:  von  0  bis  319               ║"
DB "║ │        LINIEN      │                                             benutze   ║"
DB "║ │                    │         Y-Positionen:  von  0  bis  199               ║"
DB "║ │ für GRAFIK-MODE: 19│                                           5 Parameter ║"
DB "║ └────────────────────┘         Farbe:         von  0  bis  255               ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:              Freie Cracker Crew Hamburg Horn               ║"
DB "║                                                                 Version  2.0 ║"
DB "║              von:                    Dirk Wolfgang Glomp        ──────────── ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB "$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   X-Anfang zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Y-Anfang zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   X-Ende zu hoch = Fehler !"
          DB 7, "$"
ERRCO7    DB "                   Y-Ende zu hoch = Fehler !"
          DB 7, "$"
ERRCO8    DB "                   Farb-Nr. zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔════════════════════╗
;║ Einen Ball zeichen ║
;╚════════════════════╝
.MODEL SMALL
.386P
.387
;────────────────────────────────────────────────────────────────────────────
                Z  =  320             ; Länge einer Bildschirm-Zeile
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;---------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     di, OFFSET XM       ; Offset der zu rettenden Werte
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h             ; Segment des PSP's ermitteln
          int   21h
          cli                         ; IRQs verbieten
          mov     ds, bx              ; PSP-Segment nach DS
          mov     si, 80h             ; Zeiger auf Parameter
          mov     al, [si]
          cmp     al, 9               ;  weniger als  5 ASCII's ?
          jb  FEHLER1                 ; zu wenig = Fehler !
          cmp     al, 14h             ;  mehr    als 20 ASCII's ?
          ja  FEHLER2                 ; zu viel  = Fehler !
          add     si, 2
;────────────────────────────────────────────────────────────────────────────
; Holt ASCII-Ziffer bis zum Komma, wandelt max. 3 Ziffern und rettet Word-Wert
;────────────────────────────────────────────────────────────────────────────
          mov     bp, 5               ; fünf Parameter
;-------------------------------------
HOLWERT:  mov     ax, [si]            ; zwei ASCII's holen
          sub     al, 30h             ; 1. ASCII nach Integer wandeln
          add     si, 2               ; Zeiger erhöhen
          cmp     al, 9               ;  1. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          cmp     ah, ","             ;  schon Komma, nur eine Ziffer ?
          jz  short EINER
          cmp     ah, 0Dh             ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short EINER
          sub     ah, 30h             ; 2. ASCII nach Integer wandeln
          cmp     ah, 9               ;  2. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov     bl, al              ; 1. Ziffer mal 10
          shl     al, 3               ; Wert mal 8
          xor     dh, dh
          add     bl, bl              ; Wert mal 2
          mov     dl, [si]            ; dritten ASCII holen
          add     al, bl              ; Zehner          = Wert mal 10
          cmp     dl, ","             ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp     dl, 0Dh             ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub     dl, 30h             ; 3. ASCII nach Integer wandeln
          cmp     dl, 9               ;  3. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov     cx, ax
          inc     si                  ; Zeiger erhöhen
          xor     ch, ch
          mov     bx, cx              ; 1. Ziffer noch einmal mal 10
          shl     cx, 3               ; Wert mal 8
          add     bx, bx              ; Wert mal 2
          mov     al, ah              ; 2. Ziffer mal 10
          add     cx, bx              ; jetzt Hunderter = Wert mal 100
          shl     ah, 3               ; Wert mal 8
          add     al, al              ; Wert mal 2
          add     al, ah              ; jetzt Zehner    = Wert mal 10
          xor     ah, ah
          add     ax, cx              ; Zehner plus Hunderter
          inc     si                  ; Komma überspringen
          add     ax, dx              ; Einer dazu
          jmp  short HUNDERT
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
ZEHNER:   add     al, ah              ; Einer/Zehner dazu
          inc     si                  ; Komma überspringen
EINER:    xor     ah, ah
HUNDERT:  mov     es:[di], ax         ; Wert retten
          add     di, 2               ; Zeiger erhöhen
          dec     bp
          jnz HOLWERT
;────────────────────────────────────────────────────────────────────────────
          mov     ax, DATEN
          mov     bx, 0A000h          ; Grafik-Bildschirm-Segment
          mov     ds, ax
          mov     fs, bx
;-------------------------------------
          cmp     XM, 319             ; X-Mittelpunkt
          ja  FEHLER4                 ;  Wert zu groß = Fehler !
          cmp     YM, 199             ; Y-Mittelpunkt
          ja  FEHLER5                 ;  Wert zu groß = Fehler !
          mov     ax, RADIUS          ; Radius holen
          cmp     ax, 255             ;  Wert zu groß = Fehler !
          ja  FEHLER6
          mov     cx, FARBE           ; Farbe holen
          cmp     cx, 255             ;  Wert zu groß = Fehler !
          ja  FEHLER7
          mov     bx, DUNKEL          ; Farb-Verringerung holen
          cmp     bx, 255
          ja  FEHLER8                 ;  Wert zu groß = Fehler !
;────────────────────────────────────────────────────────────────────────────
          mov     ch, cl
          mov     bh, bl
          mov     si, XM
          mov     di, YM
          mov    WORD PTR cs:[COLOR+3], cx  ; Start-Farbe
          mov    WORD PTR cs:[DARK+5], bx   ; Farb-Verringerung
          mov    BYTE PTR cs:[RAD+2], al    ; max. Radius
          mov     dr0, si
          mov     dr1, di
;────────────────────────────────────────────────────────────────────────────
;                       B A L L  -  R O U T I N E
;────────────────────────────────────────────────────────────────────────────
          mov     cx, 1               ; Radius
;------------------
BALL:     xor     di, di              ; Schleifen-Anfang
;------------------
KREIS:    mov     ax, cx
          xor     dx, dx
          mul     ax                  ; Radius * Radius
          xor     dx, dx
          mov     Y, ax
          mov     ax, di
          mul     ax                  ; X * X
          sub     Y, ax               ; R * R - X * X
;------------------
          fild    Y                   ; Integer nach ST(0) laden
          fsqrt                       ; Wurzel ziehen
          fistp  DWORD PTR[Y]         ; Ergebnis (Integer) speichern und pop
          inc     di                  ; Schleifen-Zaehler erhoehen
          mov     ax, Y
;------------------
          call HALB                   ; 4 Pixel setzen
          mov     bx, ax
          mov     ax, di              ; X mit Y vertauschen, naechste Achse
          mov     di, bx
          call HALB                   ; 4 Pixel setzen
          mov     di, ax              ; X wieder restaurieren
          cmp     cx, di              ; 360° erreicht ?
          jnz KREIS
;------------------
          inc     cl                         ; Radius erhoehen naechsten Kreis
DARK:     sub    WORD PTR cs:[COLOR+3], 101h ; Dummy-WORD, Farb-Verringerung
RAD:      cmp     cl, 2                      ; Dummy-BYTE, muss gesetzt werden
          jnz BALL
;────────────────────────────────────────────────────────────────────────────
          xor     al, al              ; kein Fehler
DOS:      mov     ah, 4Ch             ; Dos-Rücksprung
          sti                         ; IRQs erlauben
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1               ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;-------------------------------------
WORK:     mov     ah, 9               ; Text ausgeben
          int   21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2               ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3               ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov     al, 4               ; ERRORLEVEL = 4
          mov     dx, OFFSET ERRCO4
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov     al, 5               ; ERRORLEVEL = 5
          mov     dx, OFFSET ERRCO5
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov     al, 6               ; ERRORLEVEL = 6
          mov     dx, OFFSET ERRCO6
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER7:  call BASIS
          mov     al, 7               ; ERRORLEVEL = 7
          mov     dx, OFFSET ERRCO7
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER8:  call BASIS
          mov     al, 8               ; ERRORLEVEL = 8
          mov     dx, OFFSET ERRCO8
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
HALB:     mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          add     bx, ax              
          add     si, di              
          sub     bx, 3
          call  PIXEL                 ; unten rechts
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          add     bx, ax              
          sub     si, di
          sub     bx, 3
          call  PIXEL                 ; unten links
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          sub     bx, ax
          add     si, di              
          add     bx, 2
          call  PIXEL                 ; oben rechts
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          sub     bx, ax
          sub     si, di
          add     bx, 2               ; oben links
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PIXEL:    add     bx, bx              ; Y holen
          mov     bx, [bx]            ; Zeile aus Zeilen-Tabelle
COLOR:    mov    WORD PTR fs:[bx+si], 0 ;(Farb-Dummy)zwei Pixel schreiben
          ret
;---------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'          ; Daten-Alignment
;---------------------------------------------------------------------------
PIXTAB    DW 000h*Z, 001h*Z, 002h*Z, 003h*Z, 004h*Z, 005h*Z, 006h*Z, 007h*Z
          DW 008h*Z, 009h*Z, 00Ah*Z, 00Bh*Z, 00Ch*Z, 00Dh*Z, 00Eh*Z, 00Fh*Z
          DW 010h*Z, 011h*Z, 012h*Z, 013h*Z, 014h*Z, 015h*Z, 016h*Z, 017h*Z
          DW 018h*Z, 019h*Z, 01Ah*Z, 01Bh*Z, 01Ch*Z, 01Dh*Z, 01Eh*Z, 01Fh*Z
          DW 020h*Z, 021h*Z, 022h*Z, 023h*Z, 024h*Z, 025h*Z, 026h*Z, 027h*Z
          DW 028h*Z, 029h*Z, 02Ah*Z, 02Bh*Z, 02Ch*Z, 02Dh*Z, 02Eh*Z, 02Fh*Z
          DW 030h*Z, 031h*Z, 032h*Z, 033h*Z, 034h*Z, 035h*Z, 036h*Z, 037h*Z
          DW 038h*Z, 039h*Z, 03Ah*Z, 03Bh*Z, 03Ch*Z, 03Dh*Z, 03Eh*Z, 03Fh*Z
          DW 040h*Z, 041h*Z, 042h*Z, 043h*Z, 044h*Z, 045h*Z, 046h*Z, 047h*Z
          DW 048h*Z, 049h*Z, 04Ah*Z, 04Bh*Z, 04Ch*Z, 04Dh*Z, 04Eh*Z, 04Fh*Z
          DW 050h*Z, 051h*Z, 052h*Z, 053h*Z, 054h*Z, 055h*Z, 056h*Z, 057h*Z
          DW 058h*Z, 059h*Z, 05Ah*Z, 05Bh*Z, 05Ch*Z, 05Dh*Z, 05Eh*Z, 05Fh*Z
          DW 060h*Z, 061h*Z, 062h*Z, 063h*Z, 064h*Z, 065h*Z, 066h*Z, 067h*Z
          DW 068h*Z, 069h*Z, 06Ah*Z, 06Bh*Z, 06Ch*Z, 06Dh*Z, 06Eh*Z, 06Fh*Z
          DW 070h*Z, 071h*Z, 072h*Z, 073h*Z, 074h*Z, 075h*Z, 076h*Z, 077h*Z
          DW 078h*Z, 079h*Z, 07Ah*Z, 07Bh*Z, 07Ch*Z, 07Dh*Z, 07Eh*Z, 07Fh*Z
          DW 080h*Z, 081h*Z, 082h*Z, 083h*Z, 084h*Z, 085h*Z, 086h*Z, 087h*Z
          DW 088h*Z, 089h*Z, 08Ah*Z, 08Bh*Z, 08Ch*Z, 08Dh*Z, 08Eh*Z, 08Fh*Z
          DW 090h*Z, 091h*Z, 092h*Z, 093h*Z, 094h*Z, 095h*Z, 096h*Z, 097h*Z
          DW 098h*Z, 099h*Z, 09Ah*Z, 09Bh*Z, 09Ch*Z, 09Dh*Z, 09Eh*Z, 09Fh*Z
          DW 0A0h*Z, 0A1h*Z, 0A2h*Z, 0A3h*Z, 0A4h*Z, 0A5h*Z, 0A6h*Z, 0A7h*Z
          DW 0A8h*Z, 0A9h*Z, 0AAh*Z, 0ABh*Z, 0ACh*Z, 0ADh*Z, 0AEh*Z, 0AFh*Z
          DW 0B0h*Z, 0B1h*Z, 0B2h*Z, 0B3h*Z, 0B4h*Z, 0B5h*Z, 0B6h*Z, 0B7h*Z
          DW 0B8h*Z, 0B9h*Z, 0BAh*Z, 0BBh*Z, 0BCh*Z, 0BDh*Z, 0BEh*Z, 0BFh*Z
          DW 0C0h*Z, 0C1h*Z, 0C2h*Z, 0C3h*Z, 0C4h*Z, 0C5h*Z, 0C6h*Z, 0C7h*Z
;-------------------------------------
Y         DW ?, ?                     ; FPU 32 Bit-Zugriff
XM        DW ?                        ; X-Kreis-Mittelpunkt
YM        DW ?                        ; Y-Kreis-Mittelpunkt
RADIUS    DW ?                        ; Radius
FARBE     DW ?                        ; Farbe
DUNKEL    DW ?                        ; Farb-Verringerung
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║ SYNTAX:  MCGABALL X-Mittelpunkt,Y-Mittelpunkt,Radius,Farbe,Farbverringerung  ║"
DB "║                                                                              ║"
DB "║ ┌────────────────────┐        X-Mittelpunkt    :  von  0  bis  319           ║"
DB "║ │        BALL        │                                                       ║"
DB "║ │                    │        Y-Mittelpunkt    :  von  0  bis  199           ║"
DB "║ │ für GRAFIK-MODE: 19│                                                       ║"
DB "║ └────────────────────┘        Radius           :  von  0  bis  255           ║"
DB "║                                                                              ║"
DB "║      5 Parameter              Farbe            :  von  0  bis  255           ║"
DB "║                                                                              ║"
DB "║     Version  1.0              Farb-Verringerung:  von  0  bis  255           ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:                Freie Cracker Crew Hamburg Horn             ║"
DB "║                                                                              ║"
DB "║              von:                      Dirk Wolfgang Glomp                   ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB "$"
;----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   X-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Y-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   Radius zu hoch = Fehler !"
          DB 7, "$"
ERRCO7    DB "                   Farb-Nr. zu hoch = Fehler !"
          DB 7, "$"
ERRCO8    DB "                   Farb-Verringerung zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔══════════════════════╗
;║ Einen Kreis zeichnen ║
;╚══════════════════════╝
.MODEL SMALL
.386P
.387
;────────────────────────────────────────────────────────────────────────────
                Z  =  320             ; Länge einer Bildschirm-Zeile
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;----------------------------------------------------------------------------
START:    mov     ax, DATEN
          mov     ds, ax
          mov     di, OFFSET XM       ; Offset der zu rettenden Werte
          mov     es, ax
;────────────────────────────────────────────────────────────────────────────
          mov     ah, 62h             ; Segment des PSP's ermitteln
          int   21h
          cli                         ; IRQs verbieten
          mov     ds, bx              ; PSP-Segment nach DS
          mov     si, 80h             ; Zeiger auf Parameter
          mov     al, [si]
          cmp     al, 9               ;  weniger als  5 ASCII's ?
          jb  FEHLER1                 ; zu wenig = Fehler !
          cmp     al, 14h             ;  mehr    als 20 ASCII's ?
          ja  FEHLER2                 ; zu viel  = Fehler !
          add     si, 2
;────────────────────────────────────────────────────────────────────────────
; Holt ASCII-Ziffer bis zum Komma, wandelt max. 3 Ziffern und rettet Word-Wert
;────────────────────────────────────────────────────────────────────────────
          mov     bp, 4               ; fünf Parameter
;-------------------------------------
HOLWERT:  mov     ax, [si]            ; zwei ASCII's holen
          sub     al, 30h             ; 1. ASCII nach Integer wandeln
          add     si, 2               ; Zeiger erhöhen
          cmp     al, 9               ;  1. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          cmp     ah, ","             ;  schon Komma, nur eine Ziffer ?
          jz  short EINER
          cmp     ah, 0Dh             ;  schon Param.-Ende, nur eine Ziffer ?
          jz  short EINER
          sub     ah, 30h             ; 2. ASCII nach Integer wandeln
          cmp     ah, 9               ;  2. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov     bl, al              ; 1. Ziffer mal 10
          shl     al, 3               ; Wert mal 8
          xor     dh, dh
          add     bl, bl              ; Wert mal 2
          mov     dl, [si]            ; dritten ASCII holen
          add     al, bl              ; Zehner          = Wert mal 10
          cmp     dl, ","             ;  schon Komma, nur zwei Ziffern ?
          jz  short ZEHNER
          cmp     dl, 0Dh             ;  schon Param.-Ende, nur zwei Ziffern ?
          jz  short ZEHNER
          sub     dl, 30h             ; 3. ASCII nach Integer wandeln
          cmp     dl, 9               ;  3. Wert größer als neun ?
          ja  FEHLER3                 ; keine Ziffer = Fehler !
          mov     cx, ax
          inc     si                  ; Zeiger erhöhen
          xor     ch, ch
          mov     bx, cx              ; 1. Ziffer noch einmal mal 10
          shl     cx, 3               ; Wert mal 8
          add     bx, bx              ; Wert mal 2
          mov     al, ah              ; 2. Ziffer mal 10
          add     cx, bx              ; jetzt Hunderter = Wert mal 100
          shl     ah, 3               ; Wert mal 8
          add     al, al              ; Wert mal 2
          add     al, ah              ; jetzt Zehner    = Wert mal 10
          xor     ah, ah
          add     ax, cx              ; Zehner plus Hunderter
          inc     si                  ; Komma überspringen
          add     ax, dx              ; Einer dazu
          jmp  short HUNDERT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;-------------------------------------
ZEHNER:   add     al, ah              ; Einer/Zehner dazu
          inc     si                  ; Komma überspringen
EINER:    xor     ah, ah
HUNDERT:  mov     es:[di], ax         ; Wert retten
          add     di, 2               ; Zeiger erhöhen
          dec     bp
          jnz HOLWERT
;────────────────────────────────────────────────────────────────────────────
          mov     ax, DATEN
          mov     bx, 0A000h          ; Grafik-Bildschirm-Segment
          mov     ds, ax
          mov     fs, bx
;-------------------------------------
          cmp     XM, 319             ; X-Mittelpunkt
          ja  FEHLER4                 ;  Wert zu groß = Fehler !
          cmp     YM, 199             ; Y-Mittelpunkt
          ja  FEHLER5                 ;  Wert zu groß = Fehler !
          mov     cx, RADIUS          ; Radius holen
          cmp     cx, 255             ;  Wert zu groß = Fehler !
          ja  FEHLER6
          mov     bx, FARBE           ; Farbe holen
          cmp     bx, 255             ;  Wert zu groß = Fehler !
          ja  FEHLER7
;────────────────────────────────────────────────────────────────────────────
          mov     bh, bl
          mov     si, XM
          mov     di, YM
          mov    WORD PTR cs:[COLOR+3], bx  ; Farbe
          mov     dr0, si
          mov     dr1, di
;────────────────────────────────────────────────────────────────────────────
;                      K r e i s  -  R O U T I N E
;────────────────────────────────────────────────────────────────────────────
          xor     di, di              ; Schleifen-Anfang
;-------------------------------------
RUNDE:    mov     ax, cx
          xor     dx, dx
          mul     ax                  ; Radius * Radius
          xor     dx, dx
          mov     bp, ax
          mov     ax, di
          mov     Y, bp
          mul     ax                  ; X * X
          sub     Y, ax               ; R * R - X * X
;------------------
          fild    Y                   ; Integer nach ST(0) laden
          fsqrt                       ; Wurzel ziehen
          fistp  DWORD PTR[Y]         ; Ergebnis (Integer) speichern und pop
          inc     di                  ; Schleifen-Zähler erhöhen
          mov     ax, Y
;------------------
          call HALB                   ; 4 Pixel setzen
          mov     bx, ax
          mov     ax, di              ; X mit Y vertauschen, nächste Achse
          mov     di, bx
          call HALB                   ; 4 Pixel setzen
          mov     di, ax              ; X wieder restaurieren
          cmp     di, cx              ; Radiant erreicht ?
          jnz RUNDE
;────────────────────────────────────────────────────────────────────────────
          xor     al, al              ; kein Fehler
DOS:      mov     ah, 4Ch             ; Dos-Rücksprung
          sti
          int   21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER1:  call BASIS
          mov     al, 1               ; ERRORLEVEL = 1
          mov     dx, OFFSET ERRCO1
;-------------------------------------
WORK:     mov     ah, 9               ; Text ausgeben
          int   21h
          jmp  short DOS
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER2:  call BASIS
          mov     al, 2               ; ERRORLEVEL = 2
          mov     dx, OFFSET ERRCO2
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER3:  call BASIS
          mov     al, 3               ; ERRORLEVEL = 3
          mov     dx, OFFSET ERRCO3
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER4:  call BASIS
          mov     al, 4               ; ERRORLEVEL = 4
          mov     dx, OFFSET ERRCO4
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER5:  call BASIS
          mov     al, 5               ; ERRORLEVEL = 5
          mov     dx, OFFSET ERRCO5
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER6:  call BASIS
          mov     al, 6               ; ERRORLEVEL = 6
          mov     dx, OFFSET ERRCO6
          jmp  short WORK
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
FEHLER7:  call BASIS
          mov     al, 7               ; ERRORLEVEL = 7
          mov     dx, OFFSET ERRCO7
          jmp  short WORK
;────────────────────────────────────────────────────────────────────────────
;                        U n t e r  -  P r o g r a m m e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
BASIS:    mov     ax, DATEN
          mov     ds, ax
          mov     dx, OFFSET SYNTAX
          mov     ah, 9
          int   21h
          ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Alignment
;----------------------------------------------------------------------------
HALB:     mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          add     bx, ax              
          add     si, di              
          sub     bx, 3
          call  PIXEL                 ; unten rechts
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          add     bx, ax              
          sub     si, di
          sub     bx, 3
          call  PIXEL                 ; unten links
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          sub     bx, ax
          add     si, di              
          add     bx, 2
          call  PIXEL                 ; oben rechts
;-------------------------------------
          mov     bx, dr1             ; Y-Mittelpunkt
          mov     si, dr0             ; X-Mittelpunkt
          sub     bx, ax
          sub     si, di
          add     bx, 2               ; oben links
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PIXEL:    add     bx, bx              ; Y holen
          mov     bx, [bx]            ; Zeile aus Zeilen-Tabelle
COLOR:    mov    WORD PTR fs:[bx+si], 0 ; (Farb-Dummy) zwei Pixel schreiben
          ret
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                          D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'          ; Daten-Alignment
;----------------------------------------------------------------------------
PIXTAB    DW 000h*Z, 001h*Z, 002h*Z, 003h*Z, 004h*Z, 005h*Z, 006h*Z, 007h*Z
          DW 008h*Z, 009h*Z, 00Ah*Z, 00Bh*Z, 00Ch*Z, 00Dh*Z, 00Eh*Z, 00Fh*Z
          DW 010h*Z, 011h*Z, 012h*Z, 013h*Z, 014h*Z, 015h*Z, 016h*Z, 017h*Z
          DW 018h*Z, 019h*Z, 01Ah*Z, 01Bh*Z, 01Ch*Z, 01Dh*Z, 01Eh*Z, 01Fh*Z
          DW 020h*Z, 021h*Z, 022h*Z, 023h*Z, 024h*Z, 025h*Z, 026h*Z, 027h*Z
          DW 028h*Z, 029h*Z, 02Ah*Z, 02Bh*Z, 02Ch*Z, 02Dh*Z, 02Eh*Z, 02Fh*Z
          DW 030h*Z, 031h*Z, 032h*Z, 033h*Z, 034h*Z, 035h*Z, 036h*Z, 037h*Z
          DW 038h*Z, 039h*Z, 03Ah*Z, 03Bh*Z, 03Ch*Z, 03Dh*Z, 03Eh*Z, 03Fh*Z
          DW 040h*Z, 041h*Z, 042h*Z, 043h*Z, 044h*Z, 045h*Z, 046h*Z, 047h*Z
          DW 048h*Z, 049h*Z, 04Ah*Z, 04Bh*Z, 04Ch*Z, 04Dh*Z, 04Eh*Z, 04Fh*Z
          DW 050h*Z, 051h*Z, 052h*Z, 053h*Z, 054h*Z, 055h*Z, 056h*Z, 057h*Z
          DW 058h*Z, 059h*Z, 05Ah*Z, 05Bh*Z, 05Ch*Z, 05Dh*Z, 05Eh*Z, 05Fh*Z
          DW 060h*Z, 061h*Z, 062h*Z, 063h*Z, 064h*Z, 065h*Z, 066h*Z, 067h*Z
          DW 068h*Z, 069h*Z, 06Ah*Z, 06Bh*Z, 06Ch*Z, 06Dh*Z, 06Eh*Z, 06Fh*Z
          DW 070h*Z, 071h*Z, 072h*Z, 073h*Z, 074h*Z, 075h*Z, 076h*Z, 077h*Z
          DW 078h*Z, 079h*Z, 07Ah*Z, 07Bh*Z, 07Ch*Z, 07Dh*Z, 07Eh*Z, 07Fh*Z
          DW 080h*Z, 081h*Z, 082h*Z, 083h*Z, 084h*Z, 085h*Z, 086h*Z, 087h*Z
          DW 088h*Z, 089h*Z, 08Ah*Z, 08Bh*Z, 08Ch*Z, 08Dh*Z, 08Eh*Z, 08Fh*Z
          DW 090h*Z, 091h*Z, 092h*Z, 093h*Z, 094h*Z, 095h*Z, 096h*Z, 097h*Z
          DW 098h*Z, 099h*Z, 09Ah*Z, 09Bh*Z, 09Ch*Z, 09Dh*Z, 09Eh*Z, 09Fh*Z
          DW 0A0h*Z, 0A1h*Z, 0A2h*Z, 0A3h*Z, 0A4h*Z, 0A5h*Z, 0A6h*Z, 0A7h*Z
          DW 0A8h*Z, 0A9h*Z, 0AAh*Z, 0ABh*Z, 0ACh*Z, 0ADh*Z, 0AEh*Z, 0AFh*Z
          DW 0B0h*Z, 0B1h*Z, 0B2h*Z, 0B3h*Z, 0B4h*Z, 0B5h*Z, 0B6h*Z, 0B7h*Z
          DW 0B8h*Z, 0B9h*Z, 0BAh*Z, 0BBh*Z, 0BCh*Z, 0BDh*Z, 0BEh*Z, 0BFh*Z
          DW 0C0h*Z, 0C1h*Z, 0C2h*Z, 0C3h*Z, 0C4h*Z, 0C5h*Z, 0C6h*Z, 0C7h*Z
;----------------------------------------------------------------------------
XM        DW ?                        ; X-Kreis-Mittelpunkt
YM        DW ?                        ; Y-Kreis-Mittelpunkt
RADIUS    DW ?                        ; Radius
FARBE     DW ?                        ; Farbe
Y         DW ?, ?                     ; FPU 32 Bit-Zugriff
;----------------------------------------------------------------------------
SYNTAX    DB 0Dh, 0Ah
DB "╔══════════════════════════════════════════════════════════════════════════════╗"
DB "║                                                                              ║"
DB "║           SYNTAX:  MCGAKREI.exe X-Mittelpunkt,Y-Mittelpunkt,Radius,Farbe     ║"
DB "║                                                                              ║"
DB "║ ┌────────────────────┐      X-Mittelpunkt    :  von  0  bis  319             ║"
DB "║ │        KREIS       │                                                       ║"
DB "║ │                    │      Y-Mittelpunkt    :  von  0  bis  199             ║"
DB "║ │ für GRAFIK-MODE: 19│                                                       ║"
DB "║ └────────────────────┘      Radius           :  von  0  bis  255             ║"
DB "║                                                                              ║"
DB "║      4 Parameter            Farbe            :  von  0  bis  255             ║"
DB "║                                                                              ║"
DB "║    (C) Copyright:              Freie Cracker Crew Hamburg Horn               ║"
DB "║                                                                  Version 1.0 ║"
DB "║              von:                    Dirk Wolfgang Glomp                     ║"
DB "║                                                                              ║"
DB "╚══════════════════════════════════════════════════════════════════════════════╝"
DB "$"
;-----------------------------------------------------------------------------
ERRCO1    DB "                   zu wenige Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO2    DB "                   zu viele Parameter angegeben = Fehler !"
          DB 7, "$"
ERRCO3    DB "                   keine Ziffer = Fehler !"
          DB 7, "$"
ERRCO4    DB "                   X-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO5    DB "                   Y-Wert zu hoch = Fehler !"
          DB 7, "$"
ERRCO6    DB "                   Radius zu hoch = Fehler !"
          DB 7, "$"
ERRCO7    DB "                   Farb-Nr. zu hoch = Fehler !"
          DB 7, "$"
;----------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
          DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔════════════════════════════════════════════╗
;║ Den Bildbereich des MCGA-Videomode löschen ║
;╚════════════════════════════════════════════╝
.MODEL SMALL
.386
.CODE
 ORG 100h
          cli
          mov     ax, 0A000h          ; Grafik-Bildschirm-Segment
          mov     cx, 64000 / 4
          xor     di, di
          mov     es, ax
          xor     eax, eax
          rep stosd                   ; Bildschirm löschen
          mov     ah, 4Ch
          sti
          int   21h
 END
Alle ausführbaren Programme aus diesem zweiteiligen MCGA-Beitrag und den jeweiligen Quellcode dafür kann man zusammen von meiner Homepage herunterladen: http://www.alice-dsl.net/freecracmaps/Tool/MCGATOOL.ZIP

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Einfache Grafik-Demos

Beitrag von freecrac »

QUIX - 96
Dieses Demo zeigt die Verwendung verschiedener Videomodi mit 16 Farben auf einer ET4000-Grafikkarte.
Dabei werden farbige Linien gezeichnet die sich über den Bildschirm bewegen und Interferenzmuster bilden.
Die gesamte Anwendung und den kompletten Quellcode dazu kann man von meiner Homepage herunterladen: http://www.alice-dsl.net/freecracmaps/Tool/Quix96.zip

Code: Alles auswählen

; ╔═══════════════════════╗
; ║ Q  U  I  X   -   9  6 ║
; ╚═══════════════════════╝
 title QUIX-96
.model small
.386

; An dieser Stelle befindet sich in der originalen Quelldatei die verwendeten Opcodes bzw. die verwendeten Menmonics.
;  Leider konnte ich trotz dem Löschen einiger Zeilen nicht die maximale Anzahl der möglichen Zeichen eines Postings unterschreiten.
; So habe ich mich dafür entschieden nur Teile des Datenbereiches hier zu posten und alles andere zu löschen, damit man einen ersten Eindruck bekommt.
; 
; Den gesamten Inhalt dieser Quelldatei kann man herunterladen und sich dann anschauen.

BOX0    DB  "┌─────────────┐┌──────────────────────┐┌─────────────────┬─────┬───┬────┬────┐"
        DB  "│  D a t e i  ││ Richtung  der Linien ││     Parameter   │Farbe│rot│grün│blau│"
        DB  "└─────────────┘└──────────────────────┘├─────────────────┴───┬─┼───┼────┼────┤"
        DB  "┌─────────────┐  ┌────────────────────┐│ Richtung: X1 =      │0│   │    │    │"
        DB  "│ M a t r i x │  │ Abstand der Linien ││           X2 =      │1│   │    │    │"
        DB  "└─────────────┘  └────────────────────┘│           Y1 =      │2│   │    │    │"
        DB  "┌─────────────┐   ┌───────────────────┐│           Y2 =      │3│   │    │    │"
        DB  "│ F a r b e n │   │ Anzahl der Linien ││ Matrix:             │4│   │    │    │"
        DB  "└─────────────┘   └───────────────────┘│                     │5│   │    │    │"
        DB  "┌─────────────┐    ┌──────────────────┐│ Abstand: Step X1:   │6│   │    │    │"
        DB  "│  H i l f e  │    │ Start   Position ││          Step X2:   │7│   │    │    │"
        DB  "└─────────────┘    └──────────────────┘│          Step Y1:   │8│   │    │    │"
        DB  "┌─────────────────┐┌──────────────────┐│          Step Y2:   │9│   │    │    │"
        DB  "│                 ││ Fenster  Groesse ││                     │A│   │    │    │"
        DB  "│      Start      │└──────────────────┘│ Linien:       h     │B│   │    │    │"
        DB  "│                 │┌──────────────────┐│                     │C│   │    │    │"
        DB  "├─────────────────┤│ Achsen  Spiegeln ││ Start:   X1 =     h │D│   │    │    │"
        DB  "│                 │└──────────────────┘│          X2 =     h │E│   │    │    │"
        DB  "│      Ende.      │┌──────────────────┐│          Y1 =     h │F│   │    │    │"
        DB  "│                 ││ Pixel      Modus ││          Y2 =     h └─┴───┴────┴────┤"
        DB  "└─────────────────┘└──────────────────┘└─────────────────────────────────────┘"
box0len     =  ($-BOX0)/15h
BOX1    DB  "┌─────────────┐"
        DB  "│  D a t e i  │"
        DB  "├─────────────┤"
        DB  "│  Laden      │"
        DB  "│  Speichern  │"
        DB  "└─────────────┘"
box1len     =  ($-BOX1)/6
BOX1A   DB  "┌──────────────────────────────┐"
        DB  "│           L A D E N          │"
        DB  "├──────────────────────────────┤"
        DB  "│ Alles  (*.par/ *.pal/ *.dac) │"
        DB  "│ Quix - Parameter    Quix.par │"
        DB  "│ Quix - Palette      Quix.pal │"
        DB  "│ Quix - Farbanteile  Quix.dac │"
        DB  "└──────────────────────────────┘"
box1alen     =  ($-BOX1A)/8
BOX1B   DB  "┌──────────────────────────────┐"
        DB  "│       S p e i c h e r n      │"
        DB  "├──────────────────────────────┤"
        DB  "│ Alles  (*.par/ *.pal/ *.dac) │"
        DB  "│ Quix - Parameter    Quix.par │"
        DB  "│ Quix - Palette      Quix.pal │"
        DB  "│ Quix - Farbanteile  Quix.dac │"
        DB  "└──────────────────────────────┘"
box1blen     =  ($-BOX1B)/8
BOX1C   DB  " ╔═════════════════════════════════════╗ "
        DB  " ║                ┌──────────────┐     ║ "
        DB  " ║    Dateiname:  │              │     ║ "
        DB  " ║                └──────────────┘     ║ "
        DB  " ║                                     ║ "
        DB  " ║                                     ║ "
        DB  " ║                                     ║ "
        DB  " ║       Dateien        Verz./Laufw.   ║ "
        DB  " ║  ┌──────────────┐ ┌──────────────┐  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  │              │ │              │  ║ "
        DB  " ║  └──────────────┘ └──────────────┘  ║ "
        DB  " ╚═════════════════════════════════════╝ "
box1clen     =  ($-BOX1C)/14h
BOX2    DB  "┌─────────────┐"
        DB  "│ M a t r i x │"
        DB  "├─────────────┤"
        DB  "│  320 x  200 │"
        DB  "│  640 x  200 │"
        DB  "│  640 x  350 │"
        DB  "│  640 x  480 │"
        DB  "│  800 x  600 │"
        DB  "│ 1024 x  786 │"
        DB  "│ 1280 x 1024 │"
        DB  "└─────────────┘"
box2len     =  ($-BOX2)/0Bh
BOX3    DB  "┌────────────────────┐"
        DB  "│     F a r b e n    │"
        DB  "├────────────────────┤"
        DB  "│ Farb  -Nummer:   h │"
        DB  "│ Paletten-Wert:   h │"
        DB  "│ Rot   -Anteil:   h │"
        DB  "│ Grün  -Anteil:   h │"
        DB  "│ Blau  -Anteil:   h │"
        DB  "└────────────────────┘"
box3len     =  ($-BOX3)/9
BOX5    DB  "┌──────────────────────┐"
        DB  "│ Richtung  der Linien │"
        DB  "├──────────────────────┤"
        DB  "│  X1 Richtung = Plus  │"
        DB  "│  X2 Richtung = Minus │"
        DB  "│  Y1 Richtung =       │"
        DB  "│  Y2 Richtung =       │"
        DB  "└──────────────────────┘"
box5len     =  ($-BOX5)/8
BOX6    DB  "┌────────────────────┐"
        DB  "│ Abstand der Linien │"
        DB  "├────────────────────┤"
        DB  "│   X1.Pos  =        │"
        DB  "│   X2.Pos  =        │"
        DB  "│   Y1.Pos  =        │"
        DB  "│   Y2.Pos  =        │"
        DB  "└────────────────────┘"
box6len     =  ($-BOX6)/8
BOX7    DB  "┌───────────────────┐"
        DB  "│ Anzahl der Linien │"
        DB  "├───────────────────┤"
        DB  "│  Linien  =     h  │"
        DB  "└───────────────────┘"
box7len     =  ($-BOX7)/5
BOX8    DB  "┌──────────────────┐"
        DB  "│ Start   Position │"
        DB  "├──────────────────┤"
        DB  "│   X1  =      h   │"
        DB  "│   X2  =      h   │"
        DB  "│   Y1  =      h   │"
        DB  "│   Y2  =      h   │"
        DB  "└──────────────────┘"
box8len     =  ($-BOX8)/8
BOX9    DB  "┌──────────────────┐"
        DB  "│ Fenster  Groesse │"
        DB  "├──────────────────┤"
        DB  "│ Max.X  =      h  │"
        DB  "│ Min.X  =      h  │"
        DB  "│ Max.Y  =      h  │"
        DB  "│ Min.Y  =      h  │"
        DB  "└──────────────────┘"
box9len     =  ($-BOX9)/8
BOX10   DB  "┌──────────────────┐"
        DB  "│ Achsen  Spiegeln │"
        DB  "├──────────────────┤"
        DB  "│ 1'er nur setzen  │"
        DB  "│ 2'er X   spiegeln│"
        DB  "│ 2'er   Y spiegeln│"
        DB  "│ 4'er X/Y spiegeln│"
        DB  "│16'er X/Y spiegeln│"
        DB  "└──────────────────┘"
box10len     =  ($-BOX10)/9
BOX11   DB  "┌──────────────────┐"
        DB  "│ Pixel      Modus │"
        DB  "├──────────────────┤"
        DB  "│  absolut setzen  │"
        DB  "│ Xor -verknuepfen │"
        DB  "└──────────────────┘"
box11len     =  ($-BOX11)/6
BOX12   DB  "┌──────────────────┬───────────────────────────────────────────────────────────┐"
        DB  "│ Tastaturbelegung:│                                                           │"
        DB  "├──────────────────┘        Auswahl-Menue                                      │"
        DB  "│                          ───────────────                                     │"
        DB  "│              COURSOR-TASTEN    =   in die naechste Box wechseln              │"
        DB  "│                                                                              │"
        DB  "│              SPACE             =   Box  AUF- / ZU -klappen                   │"
        DB  "│                                                                              │"
        DB  "│              COURSOR  down     =   bewegt Eingabezeile runter                │"
        DB  "│                                                                              │"
        DB  "│              COURSOR  up       =   bewegt Eingabezeile rauf                  │"
        DB  "│                                                                              │"
        DB  "│              COURSOR  right    =   Wert erhoehen                             │"
        DB  "│                                                                              │"
        DB  "│              COURSOR  left     =   Wert verringern                           │"
        DB  "│                                                                              │"
        DB  "│              F1                =   zeigt den Hilfs-Text:  >> QUIX - DOC <<   │"
        DB  "│                                                                              │"
        DB  "│              ESCAPE            =   Programm abbrechen (ohne Speichern)       │"
        DB  "│                                                                              │"
        DB  "│              RETURN/ENTER      =   Quix mit momentaner Einstellung starten   │"
        DB  "│                                                                              │"
        DB  "│   Quix:      irgendeine Taste  =   zurueck zum Auswahl-Menue                 │"
        DB  "│  ───────                                                                     │"
        DB  "└──────────────────────────────────────────────────────────────────────────────┘"
box12len     =  ($-BOX12)/19h
BOX13   DB  "┌──────────┬────────────"
        DB  "│ Paletten │   Farben   "
        DB  "├───────┬──┼──────────┬─"
JOX     DB  "│       │  │ schwarz  │0"
        DB  "│       │  │ blau     │1"
        DB  "│       │  │ grün     │2"
        DB  "│       │  │ cyan     │3"
        DB  "│       │  │ rot      │4"
        DB  "│       │  │ magenta  │5"
        DB  "│       │  │ braun    │6"
        DB  "│       │  │ hellgrau │7"
        DB  "│       │  │ grau     │8"
        DB  "│       │  │ hellblau │9"
        DB  "│       │  │ hellgrün │A"
        DB  "│       │  │ hellcyan │B"
        DB  "│       │  │ hellrot  │C"
        DB  "│       │  │ pink     │D"
        DB  "│       │  │ gelb     │E"
        DB  "│       │  │ weiß     │F"
        DB  "├───────┴──┴──────────┴─"
box13len     =  ($-BOX13)/14h
joxlen       =  ($-JOX)/11h
;  Q U I X  -  P A R A M E T E R
 even
STEPX1  DW 2     ; Schrittweite X1
STEPX2  DW 3     ; Schrittweite X2
STEPY1  DW 2     ; Schrittweite Y1
STEPY2  DW 3     ; Schrittweite Y2
L_ANZ   DW 0080h ;      (Wert/2)     =  Anzahl Linien
X1      DW 0130h ; X1.Pos. \
X2      DW 0110h ; X2.Pos.  \    =  1.Start   /
Y1      DW 0030h ; Y1.Pos.  /                /   Linie
Y2      DW 0180h ; Y2.Pos. /
BX1     DW 0130h ;  X1 Retter
BX2     DW 0110h ;  X2 Retter
BY1     DW 0030h ;  Y1 Retter
BY2     DW 0180h ;  Y2 Retter
XD      DW 0     ;  dx = (X2 - X1)    oder    dx = (X1 - X2)
YD      DW 0     ;  dy = (Y2 - Y1)    oder    dy = (Y1 - Y2)
ZX      DW 0    
ZY      DW 0 
RA_X1   DB 0     ; X1 Randflag: Xmax. - 8 / Xmin. + 8
RA_X2   DB 0     ; X2 Randflag: Xmax. - 8 / Xmin. + 8
RA_Y1   DB 0     ; Y1 Randflag: Ymax. - 8 / Ymin. + 8
RA_Y2   DB 0     ; Y2 Randflag: Ymax. - 8 / Ymin. + 8
RB_X1   DB 0     ; Rettspeicher fuer Richtungen
RB_X2   DB 0
RB_Y1   DB 0 
RB_Y2   DB 0
PM      DB ?     ; Pixel-Modus: XOR verknuepfen / absolut setzen
 even
PS      DW ?     ; (Wert * 8) =  maximale  X.Pos. /Byte pro Zeile
ZEUG    DD ?     ; Verzögerungs  Index
FARBE   DB ?     ; Farb-Retter
 even
ACHSADR DW ?
QFLAG_0 DB ?
QFLAG_1 DB 0
XMAX    DW ?     ; Wert =  maximale  X.Pos.
YMAX    DW ?     ; Wert =  maximale  Y.Pos.
XMIN    DW 0
YMIN    DW 0
XMAX8   DW ?
YMAX8   DW ?
XMIN8   DW ?
YMIN8   DW ?
XHALF   DW ?
YHALF   DW ?
MAXTAB  DW 140h,0C8h,280h,0C8h,280h,15Eh,280h,1E0h,320h,258h,400h,300h,500h,400h
;-------------------------------------------------
 even
PARNAM  DB "QUIX.PAR", 0 ; File-Name des Parameter-Files
PUFFER  DB "┌────────────────────────────┐", 0Dh, 0Ah
        DB "│ Freie Cracker Crew Hamburg │", 0Dh, 0Ah
        DB "└────────────────────────────┘", 0Dh, 0Ah
        DB "┌────────────────────────────┐", 0Dh, 0Ah
        DB "│  ┌───┐         ┌─┐         │", 0Dh, 0Ah
        DB "│ ┌┘███└┐ ┌─┐ ┌─┐│█│┌─┐  ┌─┐ │", 0Dh, 0Ah
        DB "│ │█┌─┐█│ │█│ │█│├─┤│█└┐┌┘█│ │", 0Dh, 0Ah
        DB "│ │█│ │█│ │█│ │█││█│└┐█└┘█┌┘ │", 0Dh, 0Ah
        DB "│ │█├─┘█│ │█│ │█││█│ ├ ██ ┤  │", 0Dh, 0Ah
        DB "│ │█ ███└┐│█└─┘█││█│┌┘█┌┐█└┐ │", 0Dh, 0Ah
        DB "│ └┐███ █│└┐███┌┘│█││█┌┘└┐█│ │", 0Dh, 0Ah
        DB "│  └───┴─┘ └───┘ └─┘└─┘  └─┘ │", 0Dh, 0Ah
        DB "└────────────────────────────┘", 0Dh, 0Ah
        DB "┌────────────────────────────┐", 0Dh, 0Ah
        DB "│Matrix           : " 
MATRIX  DB "1280x1024│", 0Dh, 0Ah
        DB "│Anzahl der Linien: " ; ASCII-Puffer fuer Parameter retten 
LANZ    DB "0033h    │", 0Dh, 0Ah ; ──────────────────────────────────
        DB "│Abstand  X1      : "
STX1    DB "4        │", 0Dh, 0Ah ; Parameter werden geholt wenn,
        DB "│Abstand  X2      : " 
STX2    DB "4        │", 0Dh, 0Ah ; das ASCII-File: "QUIX.PAR" im
        DB "│Abstand  Y1      : " 
STY1    DB "8        │", 0Dh, 0Ah ; aktuellen Verzeichnis existiert !
        DB "│Abstand  Y2      : " 
STY2    DB "8        │", 0Dh, 0Ah
        DB "│Richtung    X1   : " ; Beim Verlassen des Programms, werden die
RICX1   DB "Plus     │", 0Dh, 0Ah
        DB "│Richtung    X2   : " ; zuletzt eingestellten Parameter wieder
RICX2   DB "Minus    │", 0Dh, 0Ah
        DB "│Richtung    Y1   : " ; zurueckgeschrieben, oder ein neues
RICY1   DB "Plus     │", 0Dh, 0Ah
        DB "│Richtung    Y2   : " ; ASCII-File: "QUIX.PAR", wird
RICY2   DB "Minus    │", 0Dh, 0Ah
        DB "│Start Position X1: " ; im aktuellen Verzeichnis angelegt !
PX1     DB "002Fh    │", 0Dh, 0Ah
        DB "│Start Position X2: " 
PX2     DB "002Fh    │", 0Dh, 0Ah
        DB "│Start Position Y1: " 
PY1     DB "002Fh    │", 0Dh, 0Ah
        DB "│Start Position Y2: " 
PY2     DB "002Fh    │", 0Dh, 0Ah
        DB "└────────────────────────────┘", 0Dh, 0Ah
        DB "┌────────────┐", 0Dh, 0Ah
        DB "│"                      ; Hier werden die Box-Flags gespeichert
 even
FLAGS   DW 2020h,2020h,2020h,2020h,2020h,2020h
        DB "│", 0Dh, 0Ah
        DB "└────────────┘", 0Dh, 0Ah
puflen  =   ($-PUFFER)
;-------------------------------------------------
 even
LFW     DB  "0ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; alle Laufwerks-Buchstaben
LAUF    DB  2                             ; Dos-Laufwerk setzen dl=Laufwerk
NAM     DB  "*.PAR", 0                    ; hier Files-Maske "*.EXT"
 even
DTA     DW  0080h                         ; Offset der DTA
;-------------------------------------------------
PFAD    DB  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 64 Bytes
        DB  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        DB  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        DB  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;-------------------------------------------------
PUFNAM  DB "QUIXLOGO.TXT",0 ; File-Name des Intros
FLAG    DB  0
MIN     DB  0FFh
;---------------------------------------------------
 even
DOCNAM  DB "QUIX.DOC", 0    ; File-Name des Docs
 even
ZANZ    DW  ?               ; Anzahl der Zeilen
ZOFF    DW  ?               ; Start-Offset der Zeilen-Tabelle (hinter PUFFER)
HELP    DB  0               ; Ausgabe-Flag flip(UP/DOWN)
 even
USEG    DW  1E9Ch, 0BBE8h   ; [Offset/Segment] fuer scroll up
DSEG    DW  00A0h, 0BBE8h   ; [Offset/Segment] fuer scroll down
DOCPUF  DB  ?               ; Puffer des Files
;──────────────────────────────────────────────────────────────────
 even
TUB     DB ?   ; Tabelle der Namens-Eintraege
   org 3000h
 even
RX1     DW ?   ;┌──────────────┐
   org 6000h   ;│ Rettspeicher │
RX2     DW ?   ;└──────────────┘
TUBS    DB ?   ; Tabelle der sortierten Namens-Eintraege
   org 9000h
RY1     DW ?   ; fuer Linien die nach jedem Durchlauf
   org 0C000h
RY2     DW ?   ; wieder geloescht werden muessen !
   org 0FF5Fh
.stack 0A0h
  end
Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Einfache Grafik-Demos

Beitrag von freecrac »

Pentagramm
In diesem Demo dreht sich ein Pentagramm und der Bild-Hintergrund dreht sich entgegengesetzt.
Dafür wird der MCGA-Mode 320 x 200 x 256 verwendet.
http://www.alice-dsl.net/freecracmaps/Tool/PENTAGRA.zip

Code: Alles auswählen

.MODEL SMALL                          ; Programm möglichst klein halten
.386                                  ; 32-Bit Prozessor und Protect-Mode
.387                                  ; Fließpunkt/-komma (Co-Prozessor)
         Anzahl     =       05h       ; Anzahl der Objekte

         Groesse    =       11h       ; max. Radius des Balles
         Vring      =     0202h       ; Farb-Verringerung

         XPos       =   Groesse       ; Position des Balles
         YPos       =   Groesse       ; fÜr Sprite Tabelle anlegen

         Mi_RX      =   Groesse-9     ; minimaler Radius
         Mi_RY      =   Groesse-9

         X_Rad      =       58h       ; Start-Radien max.: 9Ch
         Y_Rad      =       53h       ;              max.: 60h

         Za1        = ((Y_Rad/(Groesse+4))*3)+1 ; Verzögerung Sprite groß/klein

         Endtab     =      900
         Grad       =      720
         Scale      =        4

         Step_0     =        1        ; Dreh-Bewegung
         Step_1     =        2
         Step_2     =        3
         Step_3     =        4
         Step_4     =        6
         Step_5     =        9
         Step_6     =       13

         DrePo1     =       0Ch       ; Position der Bewegungs-Änderung
         DrePo2     =       12h
         DrePo3     =       1Ch
         DrePo4     =       28h
         DrePo5     =       34h
         DrePo6     =       40h

         Cr         =       0Dh       ; Cariages Return
         Lf         =       0Ah       ; Line Feed

         Lin_farb   =       70h       ; Linien-Farbe

         Max_X      =      320        ; maximale X-Position
         Max_Y      =      200        ; maximale Y-Position

         Video_Seg  =    0A000h       ; Bildschirm-Segment

         Video_Mode =       13h       ; Graphik-Mode 320 x 200 x 256

         RGB_Read   =      3C7h       ; Port-Adresse der Farb-Anteile (Read)
         RGB_Writ   =      3C8h       ; Port-Adresse der Farb-Anteile (Write)
         RGB_Data   =      3C9h       ; Port-Adresse der Farb-Anteile (Write)

         Rast_Port  =      3DAh       ; Port-Adresse des Rasterstrahls

         Stat_Port  =       64h       ; Port-Adresse des Tastatur-Status
         Tast_Port  =       60h       ; Port-Adresse des Tastatur-Controllers

         IRQs_Port  =       21h       ; Port-Adresse: IRQ-Controller

         Faerb1     =        1        ; Sterne
         Rot1       =       28h
         Gruen1     =       00h
         Blau1      =       3Fh

         Faerb2     =        2        ; Außsen-Ringe
         Rot2       =       2Fh
         Gruen2     =       0Dh
         Blau2      =       00h

         Faerb3     =        3        ; Text: Dirk
         Rot3       =       34h
         Gruen3     =       34h
         Blau3      =       00h

         Faerb4     =        4        ; innen-Ringe
         Rot4       =       3Fh
         Gruen4     =       1Fh
         Blau4      =       00h

         Faerb5     =        5        ; Reklame-Sprite-Rahmen
         Rot5       =       2Fh
         Gruen5     =        0h
         Blau5      =       18h

         Faerb6     =        6        ; Reklame-Sprite-Text
         Rot6       =        0h
         Gruen6     =       33h
         Blau6      =       3Fh

         Dirk_Pos   =  ((Max_Y/4)*Max_X)+(Max_X*7)+85 ; Sprite-Position

         FPos       = Max_X*(Max_Y/6) ; Start-Offset Bild

         Veclen     =      303        ; Länge der Richtungs-Datei

         Reklen     =    18272        ; Länge des Reklame-Sprites

         MinRekPos  =       23                         ; minimale  Position
         RekPos     =  (Max_X*(Max_Y/4))+(Max_X*04)+23 ; Start/End Position
         MaxRekPos  =  (Max_X*(Max_Y/4))+(Max_X*61)+23 ; maximale  Position

         RekSpeed   =       80h       ; Stepper der Bewegungs-Einengung
         RecBew     =    Max_X*3

         VerzDimm   =     3D80h       ; Verzögerung vor dem Dimmen
         Dimm_Time  =      170h       ; Verzögerung während des Dimmens

         DGlen      =     34508
         DG_Pos     =  (Max_Y/2)+(Max_X/2)+13

  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
START:    mov      ax, DATEN
          mov      ds, ax

          call SETFREE                ; Rest des Speichers freigeben

          mov      bx, 3100h          ; 196 KB anfordern/reservieren
          call GETSPACE
          jc  FEHL1                   ; FEHLER = zuwenig freier Speicher 

          mov      fs, ax
          mov      BILSEG, ax         ; Bild-Segment
          mov      es, ax

          add      ax, 1000h
          mov      PICSEG, ax         ; Segment des Fraktal-Bildes

          add      ax, 1000h
          mov      DGSEG, ax          ; Segment des Foto:Dirk

          add      ax, 1000h
          mov      SINSEG, ax         ; Segment der Sinus-Tabelle (Fließkomma)
          mov      gs, ax

          mov      dx, OFFSET SINNAM  ; Sinus-Tabelle laden
          call OPEN
          jc  FEHL2                   ; FEHLER = Datei nich gefunden !
          xor      dx, dx             ; Anfang des Segments Offset 0
          mov      cx, (Endtab+Grad)*8 ; 4 Byte je Sin./Cos.-Wert (Fließkomma)
          mov      ds, SINSEG
          call READ
          mov      ax, DATEN
          mov      ds, ax
          call CLOSE

          mov      dx, OFFSET SPRNA2  ; Sprite laden
          call OPEN
          jc  FEHL3                   ; FEHLER = Datei nich gefunden !
          xor      dx, dx
          mov      cx, DGlen
          mov      ds, DGSEG
          call READ
          mov      ax, DATEN
          mov      ds, ax
          call CLOSE

          mov      dx, OFFSET DACNAM  ; Farbanteile laden
          call OPEN
          jc  FEHL4                   ; FEHLER = Datei nich gefunden !
          mov      dx, OFFSET OBJTAB
          mov      cx, 300h
          call READ
          call CLOSE

          mov      dx, OFFSET SPRNAM  ; Sprite laden
          call OPEN
          jc  FEHL5                   ; FEHLER = Datei nich gefunden !
          mov      dx, OFFSET SPRTAB
          mov      cx, 0C80h
          call READ
          call CLOSE

          mov      dx, OFFSET PICNAM  ; Fraktal-Bild laden
          call OPEN
          jc  FEHL6                   ; FEHLER = Datei nich gefunden !
          xor      dx, dx             ; Anfang des Segments Offset 0
          mov      cx, Max_X * Max_Y
          mov      ds, PICSEG
          call READ
          mov      ax, DATEN
          mov      ds, ax
          call CLOSE

          mov      dx, OFFSET VECNAM  ; Bewegungs-Richtungen laden
          call OPEN
          jc  FEHL7                   ; FEHLER = Datei nich gefunden !
          mov      dx, OFFSET VECTAB
          mov      cx, Veclen
          call READ
          call CLOSE

          mov      dx, OFFSET REKNAM  ; Sprite-Tabelle laden
          call OPEN
          jc  FEHL8                   ; FEHLER = Datei nich gefunden !
          mov      dx, OFFSET REKTAB
          mov      cx, Reklen
          call READ
          call CLOSE

          mov      ax, Video_Mode     ; Graphik-Mode einschalten
          int    10h

          finit                       ; Coprozessor initialisieren
          cli                         ; Software-Interrupts ausschalten
          mov      al, 2              ; IRQ 1 sperren
          out      IRQs_Port, al
          sti

          mov      es, PICSEG
          mov      ds, PICSEG

          xor      si, si             ; Fraktal umfärben, Farben verringern
RBI:      cmp     BYTE PTR[si], 80h
          jb  short TFV
          sub     BYTE PTR[si], 80h
TFV:      cmp     BYTE PTR[si], 70h
          ja  short TFF
          cmp     BYTE PTR[si], 60h
          jb  short TFF
          sub     BYTE PTR[si], 20h
TFF:      cmp     BYTE PTR[si], 10h
          ja  short EFV
          add     BYTE PTR[si], 10h
EFV:      inc      si
          cmp      si, Max_X*Max_Y
          jb  RBI

          mov      cx, (0FFFFh-(Max_X*Max_Y))/4
          xor      si, si
          mov      di, Max_X*Max_Y
          rep movsd

          mov      ax, DATEN
          mov      ds, ax
          mov      es, BILSEG

          call PIXOFF                 ; Tabelle der Zeilen-Anfänge anlegen

          call MAKDAC                 ; Farb-Anteile erstellen/setzen

; F A R B - B A L L   i n   T A B E L L E

          call CLS                    ; Bild-Segment löschen

          mov     WORD PTR[RAID], 1   ; Radius
          mov     WORD PTR cs:[COLOR+3], 3F3Fh ; Farbe
          mov      bx, OFFSET OBJPOS  ; bx = Tabellen-Ende
          mov      di, OFFSET OBJTAB  ; di = Tabellen-Offset
          mov      POSZEI, bx
          mov      OBJZEI, di

BALL:     mov      cx, RAID
          call KREIS                  ; Wurzel-Kreis
          inc     WORD PTR[RAID]      ; Radius erhöhen
          sub     WORD PTR cs:[COLOR+3], Vring ; Farbe  verringern

          call TABELLE

          cmp     WORD PTR[RAID], Groesse
          jb  BALL

          sub     WORD PTR[POSZEI], 2

; O b j e k t e  a u f  G r a d e  v e r t e i l e n
TABL:     xor      ax, ax
          mov      si, OFFSET POSIT
TABLE:    add      ax, (Grad/Anzahl)*Scale
          cmp      ax, Grad*Scale
          jb  short KLEI
          sub      ax, Grad*Scale
KLEI:     mov      [si+2], ax
          add      si, 0Ch
          cmp      si, OFFSET POSIT + Anzahl*0Ch
          jb  TABLE

          mov      fs, PICSEG         ; Sprites setzen

          mov      bx, Dirk_Pos
          mov      si, OFFSET SPRTAB  ; Zeiger auf Sprite-Tabelle
          call OBJEC0

          mov      bx, DG_Pos
          xor      si, si             ; Zeiger auf Sprite-Tabelle
          mov      ds, DGSEG
          call OBJEC3
          mov      ax, DATEN
          mov      ds, ax

          mov      fs, BILSEG

          mov      ah, Faerb1         ; Farb-Anteile setzen
          mov      bl, Rot1
          mov      bh, Gruen1
          mov      cl, Blau1
          call WRITDAC

          mov      ah, Faerb2
          mov      bl, Rot2
          mov      bh, Gruen2
          mov      cl, Blau2
          call WRITDAC

          mov      ah, Faerb3
          mov      bl, Rot3
          mov      bh, Gruen3
          mov      cl, Blau3
          call WRITDAC

          mov      ah, Faerb4
          mov      bl, Rot4
          mov      bh, Gruen4
          mov      cl, Blau4
          call WRITDAC

          mov      ah, Faerb4
          mov      bl, Rot4
          mov      bh, Gruen4
          mov      cl, Blau4
          call WRITDAC

          mov      ah, Faerb5
          mov      bl, Rot5
          mov      bh, Gruen5
          mov      cl, Blau5
          call WRITDAC

          mov      ah, Faerb6
          mov      bl, Rot6
          mov      bh, Gruen6
          mov      cl, Blau6
          call WRITDAC

          xor      ebx, ebx
          xor      esi, esi
          fild     YM
          fild     XM
       DB  0EAh                       ; Prefetch-Puffer löschen:
       DW  (OFFSET ACTION)            ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                   ; das Kommando JMP FAR CS:ACTION

;             B e r e c h n u n g s  ---  S c h l e i f e:     S T A R T
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung

ACTION:   mov      si, OFFSET POSIT

ALLE:     mov      di, [si+2]         ; Grad holen
          mov      ax, [si+8]         ; Y-Radius holen
          mov      bx, POSZEI

          cmp      ax, DrePo1
          ja  short RF0
          add      di, Scale*Step_6   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF0:      cmp      ax, DrePo2
          ja  short RF1
          add      di, Scale*Step_5   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF1:      cmp      ax, DrePo3
          ja  short RF2
          add      di, Scale*Step_4   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF2:      cmp      ax, DrePo4
          ja  short RF3
          add      di, Scale*Step_3   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF3:      cmp      ax, DrePo5
          ja  short RF4
          add      di, Scale*Step_2   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF4:      cmp      ax, DrePo6
          ja  short RF5
          add      di, Scale*Step_1   ; Grad erhöhen
          jmp  short JKL
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RF5:      add      di, Scale*Step_0   ; Grad erhöhen

JKL:      mov      bp, [bx]           ; Sprite-Ende
          cmp      di, Grad*Scale
          jb  short WINK1
          xor      di, di
;-------------------------------------
WINK1:    fld     DWORD PTR gs:[di]   ; Sinus holen
          mov      [si+2], di         ; neuen Grad speichern
          fimul   DWORD PTR[si+8]     ; mal Radius
          add      si, 0Ch            ; Tabellen-Zeiger erhöhen
          fadd     st, st(2)          ; plus Y-Mittelpunkt
          fistp    Y                  ; Y speichern
          mov      RETTSI, si         ; SI retten (Sprite/Linie)

          fld     DWORD PTR gs:[di+Grad]; Cos. holen (Sinus um 90° gedreht)
          mov      bx, Y              ; Y holen (Sprite)
          fimul   DWORD PTR[si-8]     ; mal Radius
          fadd     st, st(1)          ; plus X-Mittelpunkt
          mov      bx, [ebx*2]        ; Zeilen-Offset holen (Sprite)
          fistp    X                  ; X speichern
          mov      si, OFFSET OBJTAB  ; Zeiger auf Sprite-Tabelle
          add      bx, X              ; plus X (Sprite)

;                   S p r i t e   z u m   B i l d
OBJECT:   mov      di, [si]           ; Offset aus Tabelle holen
          mov      al, [si+2]         ; Byte   aus Tabelle holen
          add      si, 4              ; Tabellen-Zeiger erhöhen
          mov      fs:[di+bx], al     ; Tabellen-Farb-Byte zum Bild-Segment
          cmp      si, bp             ;  Ende erreicht ?
          jnz OBJECT

;                     L i n i e n   z u m   B i l d
;    Anfangspunkt: BX, SI   Endpunkt: CX, DI   Segment: FS
          mov      eax, DWORD PTR[RTX2]
          mov      bx, X              ; X1-Position
          mov     DWORD PTR[RTX3], eax
          mov      si, Y              ; Y1-Position
          mov      eax, DWORD PTR[RTX1]
          add      bx, Groesse
          mov     DWORD PTR[RTX2], eax
          add      si, Groesse
          xor      eax, eax
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          mov      RTX1, bx           ; X1-Position retten
          mov      RTY1, si           ; Y1-Position retten
          mov      ax, LCOL
          call LINE

          sub     WORD PTR[LCOL], 0A0Ah
          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          dec      bx
          dec      si
          dec      cx
          dec      di
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          inc      bx
          inc      si
          inc      cx
          inc      di
          mov      ax, LCOL
          call LINE
          add     WORD PTR[LCOL], 0A0Ah

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          inc      bx
          dec      si
          inc      cx
          dec      di
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          inc      bx
          dec      si
          inc      cx
          dec      di
          mov      ax, LCOL
          call LINE
          mov      si, RETTSI
          cmp     BYTE PTR[si-4], (X_Rad+(X_Rad/3))/4
          jb  RADIUS

          sub     WORD PTR[LCOL], 0D0Dh
          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          sub      bx, 2
          sub      si, 2
          sub      cx, 2
          sub      di, 2
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 2
          add      si, 2
          add      cx, 2
          add      di, 2
          mov      ax, LCOL
          call LINE
          add     WORD PTR[LCOL], 0D0Dh

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 2
          sub      si, 2
          add      cx, 2
          sub      di, 2
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 2
          sub      si, 2
          add      cx, 2
          sub      di, 2
          mov      ax, LCOL
          call LINE
          mov      si, RETTSI
          cmp     BYTE PTR[si-4], (X_Rad+(X_Rad/2))/3
          jb  RADIUS

          sub     WORD PTR[LCOL], 1010h
          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          sub      bx, 3
          sub      si, 3
          sub      cx, 3
          sub      di, 3
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 3
          add      si, 3
          add      cx, 3
          add      di, 3
          mov      ax, LCOL
          call LINE
          add     WORD PTR[LCOL], 1010h

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 3
          sub      si, 3
          add      cx, 3
          sub      di, 3
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 3
          sub      si, 3
          add      cx, 3
          sub      di, 3
          mov      ax, LCOL
          call LINE
          mov      si, RETTSI
          cmp     BYTE PTR[si-4], (X_Rad+(X_Rad/2))/2
          jb  RADIUS

          sub     WORD PTR[LCOL], 1313h
          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          sub      bx, 4
          sub      si, 4
          sub      cx, 4
          sub      di, 4
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 4
          add      si, 4
          add      cx, 4
          add      di, 4
          mov      ax, LCOL
          call LINE
          add     WORD PTR[LCOL], 1313h

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 4
          sub      si, 4
          add      cx, 4
          sub      di, 4
          mov      ax, LCOL
          call LINE

          mov      bx, RTX1           ; X1-Position holen
          mov      si, RTY1           ; Y1-Position holen
          mov      cx, RTX3           ; X2-Position holen
          mov      di, RTY3           ; Y2-Position holen
          add      bx, 4
          sub      si, 4
          add      cx, 4
          sub      di, 4
          mov      ax, LCOL
          call LINE

;   R a d i u s   v e r ä n d e r n
RADIUS:   mov      si, RETTSI
          cmp     BYTE PTR[SWAP0], 0
          jz  short NORADUM

          mov      cl, [si-0Ch]       ; Richtungs-Flags holen
          mov      bx, [si-8]         ; X-Radius holen
          mov      ax, [si-4]         ; Y-Radius holen

          and      cl, cl
          jz  short GTG

          dec      ax
          dec      bx
          cmp      ax, Mi_RY
          ja  short FDF
          xor      cl, cl
          jmp  short FDF
;-------------------------------------
 org START + ((($-START)/16)*16)+16
;-------------------------------------
GTG:      inc      ax
          inc      bx
          cmp      ax, Y_Rad
          jb  short FDF
          mov      cl, 1

FDF:      mov      [si-8], bx         ; X-Radius speichern
          mov      [si-4], ax         ; Y-Radius speichern
          mov      [si-0Ch], cl       ; Richtungs-Flags speichern

NORADUM:  cmp      si, OFFSET POSIT + Anzahl*0Ch
          jb  ALLE

;            B i l d - S e g m e n t   z u m   B i l d s c h i r m
          mov      ds, BILSEG         ; Bild zum Bildschirm
          mov      ax, Video_Seg
          xor      di, di
          xor      si, si
          mov      cx, (Max_X*Max_Y)/4
          mov      es, ax

          mov      dx, Rast_Port      ; Port des Rasterstrahls
          cli
RAST:     in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jnz RAST
RASTER:   in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jz  RASTER

          rep movsd                   ; jetzt copieren
          sti

;  F r a k t a l - B i l d  z u m  B i l d - S e g m e n t  c o p i e r e n 
          mov      ax, DATEN
          xor      di, di             ; Ziel-Offset
          mov      ds, ax
          mov      si, PICOFF         ; Quell-Offset holen
          mov      bx, VECOFF         ; Zeiger von der Richtungs-Tabelle holen
          mov      es, BILSEG         ; Ziel-Segment
          inc     WORD PTR[VECOFF]    ; Zeiger von Richtungs-Tabelle erhöhen
          mov      bp, si             ; Quell-Offset holen
          cmp      bx, Veclen + OFFSET VECTAB ; Limmit des Zeigers erreicht ?
          jb  short BGE
          mov     WORD PTR[VECOFF], OFFSET VECTAB ; auf Anfang der Richt.-Tab.
BGE:      mov      cx, (Max_X*Max_Y)/2 ; max. Menge durch Anzahl der Bytes
          shr      bp, 1              ; Menge durch Anzahl der Bytes teilen
          mov      dl, [bx]           ; Richtung holen
          mov      bx, Max_X
          mov      ds, PICSEG         ; Quell-Segment
          sub      cx, bp             ; Menge der Teil-Zeile berechnen
          mov      ax, si             ; Quell-Offset retten
          rep movsw                   ; bis Quell-Tabellen-Ende copieren
          test     ax, 1              ;  1 Byte noch über ?
          jnz short NLP
          mov      cx, 1
          rep movsb                   ; 1 Byte copieren

NLP:      and      bp, bp
          jz  short N0REST            ; kein Rest übrig
          xor      si, si             ; Quell-Offset-Anfang
          mov      cx, bp             ; Rest-Menge holen
          rep movsw                   ; Rest der Teil-Zeile copieren

N0REST:   mov      cx, DATEN          ; Bild-Offset verschieben
          mov      si, Max_X * Max_Y
          mov      ds, cx
          cmp      dl, 3
          jb  short HORI
          jz  short UNTEN

          add      ax, bx             ; nach oben
          cmp      ax, si
          jb  short STC1
          sub      ax, si
          jmp  short STC1
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
UNTEN:    sub      ax, bx             ; nach unten
          cmp      ax, si
          jbe short STC1
          add      ax, si
          jmp  short STC1
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
HORI:     cmp      dl, 2
          jz  short RECHTS

          inc      ax                 ; nach links
          and      bp, bp
          jnz short STC1
          sub      ax, bx             ; Max_X abziehen
          jmp  short STC1
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
RECHTS:   dec      ax                 ; nach rechts
          and      bp, bp
          jnz short STC1
          add      ax, bx             ; Max_X zuzählen
;-------------------------------------
STC1:     dec     BYTE PTR[SWAP1]     ; Countdown: Sprite größer/kleiner
          mov      PICOFF, ax         ; neuen Bild-Offset speichern

;    S p r i t e   v e r k l e i n e r n   /   v e r g r ö ß e r n
          cmp     BYTE PTR[SWAP1], 0  ;  Zähler schon null ?
          jnz short NOSPBE
          mov     BYTE PTR[SWAP1], Za1

          cmp     BYTE PTR[SWAP2], 1  ;  Sprite-Flag = größer ?
          jz  short BIF

          sub     WORD PTR[POSZEI], 2 ; Sprite verkleinern
          cmp     WORD PTR[POSZEI], OFFSET OBJPOS
          jnz short NOSPBE            ;  schon null ?
          mov     BYTE PTR[SWAP2], 1  ; Sprite-Flag = größer !
          jmp  short NOSPBE 
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
BIF:      add     WORD PTR[POSZEI], 2 ; Sprite vergrößern
          cmp     WORD PTR[POSZEI], OFFSET OBJPOS + ((Groesse-2)*2)
          jnz short NOSPBE            ;  schon maximal ?
          mov     BYTE PTR[SWAP2], 0  ; Sprite-Flag = kleiner !

NOSPBE:   in       al, Stat_Port      ; Status holen
          xor     BYTE PTR[SWAP0], 0FFh ; Countdown: Radius

          test     al, 1              ; liegt Byte im Puffer
          jz  ACTION                  ; nein, . . . . . . . . . . W E I T E R
          in       al, Tast_Port      ; Tasten-Code holen
          dec      al                 ;  Escape-Taste ?
          jnz ACTION                  ; nein, . . . . . . . . . . W E I T E R

;             B e r e c h n u n g s  ---  S c h l e i f e:     E  N  D  E
          fstp     st
          fstp     st

;                            E n d - S e q u e n z
          mov      bp, OFFSET REKTAB + Reklen
          mov      bx, Rekpos
          mov     BYTE PTR[SWAP3], 1
          mov      dx, Rast_Port      ; Port des Rasterstrahls

ANASTA:   mov      cx, (Max_X*Max_Y)/4 ; Bild-Segment löschen
          xor      eax, eax
          xor      di, di
          mov      es, BILSEG
          rep stosd

;                        S p r i t e   z u m   B i l d
          mov      si, OFFSET REKTAB

OBJEC2:   mov      al, [si+2]         ; Byte   aus Tabelle holen
          mov      di, [si]           ; Offset aus Tabelle holen
          inc      al
          cmp      al, 20h
          jnz short G9
          mov      al, 5
G9:       cmp      al, 96h
          jnz short GZ
          mov      al, 6
GZ:       add      si, 4              ; Tabellen-Zeiger erhöhen
          mov      fs:[di+bx], al     ; Tabellen-Farb-Byte zum Bild-Segment
          cmp      si, bp             ;  Ende erreicht ?
          jnz OBJEC2

;            B i l d - S e g m e n t   z u m   B i l d s c h i r m
          mov      ax, Video_Seg
          mov      ds, BILSEG         ; Bild zum Bildschirm
          xor      di, di
          xor      si, si
          mov      cx, (Max_X*Max_Y)/4
          mov      es, ax

RASTE1:   in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jz  RASTE1

          rep movsd                   ; jetzt copieren

          mov      ax, DATEN
          mov      ds, ax
          cmp     BYTE PTR[SWAP3], 0
          jnz short PLUS

          sub      bx, RecBew
          cmp      bx, MIREK
          ja  short EIGE
          mov     BYTE PTR[SWAP3], 1
          jmp  short EIGE
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
PLUS:     add      bx, RecBew
          cmp      bx, MAREK
          jb  short EIGE
          mov     BYTE PTR[SWAP3], 0

EIGE:     add     WORD PTR[MIREK], RekSpeed
          sub     WORD PTR[MAREK], RekSpeed
          cmp     WORD PTR[MIREK], RekPos
          ja  short SOFT

          in       al, Stat_Port      ; Status holen
          test     al, 1              ; liegt Byte im Puffer
          jz  ANASTA
          in       al, Tast_Port      ; Tasten-Code holen
          dec      al                 ;  Escape-Taste ?
          jnz ANASTA
          jmp  BACK

 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;---------------------------------------------------------------------------
SOFT:     mov      dx, Rast_Port      ; Port des Rasterstrahls

          mov      ebp, VerzDimm
RASTE3:   in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jz  RASTE3
          dec      ebp
          jnz RASTE3

          mov      cl, 3Fh

DIMM:     mov      dx, RGB_Read
          mov      al, Faerb5
          out      dx, al
          mov      dx, RGB_Data
          in       al, dx
          mov      ah, al
          in       al, dx
          mov      bl, al
          in       al, dx
          mov      bh, al
          and      ah, ah
          jz  short IXE
          dec      ah
IXE:      and      bl, bl
          jz  short IXU
          dec      bl
IXU:      and      bh, bh
          jz  short IXO
          dec      bh
IXO:      mov      dx, RGB_Writ
          mov      al, Faerb5
          out      dx, al
          mov      dx, RGB_Data
          mov      al, ah
          out      dx, al
          mov      al, bl
          out      dx, al
          mov      al, bh
          out      dx, al

          mov      dx, RGB_Read
          mov      al, Faerb6
          out      dx, al
          mov      dx, RGB_Data
          in       al, dx
          mov      ah, al
          in       al, dx
          mov      bl, al
          in       al, dx
          mov      bh, al
          and      ah, ah
          jz  short OXE
          dec      ah
OXE:      and      bl, bl
          jz  short OXU
          dec      bl
OXU:      and      bh, bh
          jz  short OXO
          dec      bh
OXO:      mov      dx, RGB_Writ
          mov      al, Faerb6
          out      dx, al
          mov      dx, RGB_Data
          mov      al, ah
          out      dx, al
          mov      al, bl
          out      dx, al
          mov      al, bh
          out      dx, al

          mov      bp, Dimm_Time
          mov      dx, Rast_Port      ; Port des Rasterstrahls
RASTE2:   in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jz  RASTE2
          dec      bp
          jnz RASTE2

          dec      cl
          jnz DIMM

;   P r o g r a m m  -  E n d e
BACK:     cli
          xor      al, al             ; IRQ 1 freigeben
          out      IRQs_Port, al
          sti

          mov      ax, 3              ; Text-Mode anschalten
          int    10h

          mov      ah, 1              ; Tastatur-Puffer löschen
          int    16h

          xor      al, al
DOS:      mov      ah, 4Ch
          int    21h                  ; DOS-Rücksprung

 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
FEHL1:    mov      dx, OFFSET ERTEX1
          mov      al, 1

TOUT:     mov      ah, 9
          int    21h
          jmp  short DOS
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL2:    mov      dx, OFFSET ERTEX2
          mov      al, 2
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL3:    mov      dx, OFFSET ERTEX3
          mov      al, 3
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL4:    mov      dx, OFFSET ERTEX4
          mov      al, 4
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL5:    mov      dx, OFFSET ERTEX5
          mov      al, 5
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL6:    mov      dx, OFFSET ERTEX6
          mov      al, 6
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL7:    mov      dx, OFFSET ERTEX7
          mov      al, 7
          jmp  short TOUT
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
FEHL8:    mov      dx, OFFSET ERTEX8
          mov      al, 8
          jmp  short TOUT

;                    U  N  T  E  R  -  R  O  U  T  I  N  E  N
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
WRITDAC:  mov      dx, RGB_Writ
          mov      al, ah
          out      dx, al
          inc      dx
          mov      al, bl
          out      dx, al
          mov      al, bh
          out      dx, al
          mov      al, cl
          out      dx, al
          ret

;                   S p r i t e   z u m   B i l d
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
OBJEC0:   mov      al, [si+2]         ; Byte   aus Tabelle holen
          mov      di, [si]           ; Offset aus Tabelle holen
          cmp      al, 1Fh
          jnz short G1
          mov      al, 1
G1:       cmp      al, 9Bh
          jnz short G2
          mov      al, 2
G2:       cmp      al, 0AFh
          jnz short G3
          mov      al, 3
G3:       cmp      al, 0BBh
          jnz short G4
          mov      al, 4
G4:       add      si, 4              ; Tabellen-Zeiger erhöhen
          mov      fs:[di+bx], al     ; Tabellen-Farb-Byte zum Bild-Segment
          cmp      si, OFFSET SPRTAB + 0C80h ;  Ende erreicht ?
          jnz OBJEC0
          ret

OBJEC3:   mov      al, [si+2]         ; Byte   aus Tabelle holen
          mov      di, [si]           ; Offset aus Tabelle holen
          add      si, 4              ; Tabellen-Zeiger erhöhen
          mov      fs:[di+bx], al     ; Tabellen-Farb-Byte zum Bild-Segment
          cmp      si, DGlen          ;  Ende erreicht ?
          jnz OBJEC3
          ret

;                  F a r b - A n t e i l e   e r s t e l l e n
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
MAKDAC:   mov      di, OFFSET OBJTAB  ; Farb-Anteil-Block
          xor      al, al             ; rot
          xor      ah, ah             ; grün
          xor      bl, bl             ; blau

TDAC1:    mov      [di], al
          inc      di
          mov      [di], ah
          inc      di
          mov      [di], bl
          inc      al                 ; rot
          inc      di
          cmp      al, 40h
          jnz TDAC1
;-------------------------------------
          xor      al, al             ; rot
          xor      ah, ah             ; grün
          mov      bl, 0Ah            ; blau

TDAC2:    mov      [di], al
          inc      di
          mov      [di], ah
          inc      di
          mov      [di], bl
          inc      bl                 ; blau
          jp  short EEF
          inc      ah
EEF:      inc      di
          cmp      bl, 40h
          jnz TDAC2

;           F a r b - A n t e i l e   z u r   G r a f i k - K a r t e
          xor      al, al
          mov      dx, RGB_Writ       ; VGA-PORT der Farb-Anteile
          mov      si, OFFSET OBJTAB
          mov      cx, 0FFh*3
          out      dx, al             ; Farb-Nr. zur VGA-Karte
          inc      dx
          rep outsb
          ret

;                          W U R Z E L  -  K R E I S
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
KREIS:    mov      ax, cx
          mul      ax                 ; Radius * Radius
          xor      di, di             ; Schleifen-Anfang
          mov      si, ax
          xor      ax, ax

RUNDE:    mov      bp, si
          mul      ax                 ; X * X
          sub      bp, ax             ; R * R - X * X
          mov      Y, bp

          fild     Y                  ; Integer nach ST(0) laden
          fsqrt                       ; Wurzel ziehen
          fistp    Y                  ; Integer speichern und pop

          mov      bp, Y
          call HALB                   ; 4 Pixel setzen
          mov      ax, di             ; X mit Y vertauschen
          mov      di, bp
          mov      bp, ax             ; nächste Achse
          call HALB                   ; 4 Pixel setzen

          inc      bp                 ; Schleifen-Zähler erhöhen
          mov      di, bp             ; X wieder restaurieren
          cmp      cx, bp             ; Radiant erreicht ?
          jnz RUNDE
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
HALB:     mov      dx, YPos           ; rechts unten
          mov      bx, XPos
          add      dx, bp             ; Y-Pos
          add      bx, di             ; X-Pos
          call PIXEL
          mov      dx, YPos           ; links unten
          mov      bx, XPos
          add      dx, bp             ; Y-Pos
          sub      bx, di             ; X-Pos
          call PIXEL
          mov      dx, YPos           ; rechts oben
          mov      bx, XPos
          sub      dx, bp             ; Y-Pos
          add      bx, di             ; X-Pos
          inc      dx
          call PIXEL
          mov      dx, YPos           ; links oben
          mov      bx, XPos
          sub      dx, bp             ; Y-Pos
          sub      bx, di             ; X-Pos
          inc      dx

PIXEL:    add      bx, [edx*2]        ; Offset aus Zeilen-Tabelle holen
COLOR:    mov     WORD PTR fs:[bx], 0 ; Dummy-Farbe (0-255/0-255) zum Bild-Segment
          ret

;                  S P R I T E  - T A B E L L E   A N L E G E N
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
TABELLE:  mov      di, OBJZEI
          xor      si, si             ;    si = Bild-Offset
SPRITAB:  mov      al, fs:[si]        ; Bild-Byte holen
          and      al, al             ;  Inhalt leer ?
          jz  short EMPTI
          mov      [di], si           ; Bild-Offset in Tabelle retten
          mov      [di+2], al         ; Bild-Byte in Tabelle retten
          add      di, 4              ;  Tabellen-Offset erhöhen
EMPTI:    inc      si                 ;  Bild-Offset erhöhen
          jnz SPRITAB

          mov      ax, di
          mov      bx, POSZEI
          sub      ax, 4
          mov      OBJZEI, di
          mov      [bx], ax           ; Länge für Bewegungs-Routine
          add     WORD PTR[POSZEI], 2
          jmp  short CLS

 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
CLS:      mov      cx, 4000h 
          xor      di, di
          xor      eax, eax
          rep stosd
          ret

;                            D a t e i - F u n k t i o n e n
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
OPEN:     mov      ax, 3D00h          ; Datei öffnen (OPEN)
          int    21h
          mov      bx, ax             ; Handle retten
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16
;-------------------------------------
READ:     mov      ah, 3Fh            ; Datei lesen u. Zeiger bewegen (READ)
          int    21h
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16
;-------------------------------------
CLOSE:    mov      ah, 3Eh            ; Datei schließen (CLOSE)
          int    21h
          ret

;           S p e i c h e r    a n f o r d e r n / f r e i g e b e n
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
GETSPACE: mov      ah, 48h
          int    21h
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
SETFREE:  mov      bx, ss             ; zunächst die beiden Segmentadressen
          mov      ax, es             ; voneinander abziehen. Das ergibt die
          sub      bx, ax             ; Anzahl der Paragraphen vom PSP bis
                                      ; zum Anfang des Stack
          mov      ax, sp             ; da sich der Stackpointer am Ende des
          add      ax, 0Fh            ; Stacksegments befindet, gibt sein
          shr      ax, 4              ; Inhalt die Länge des Stacks an
          add      bx, ax             ; zur bisherigen Länge hinzuaddieren
          mov      ah, 4Ah            ; neue Größe an das DOS übergeben
          int    21h
          ret

;  L I N I E  Anfangspunkt: BX, SI  Endpunkt: CX, DI  Segment: FS  Farbe: AL
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
LINE:     mov      dx, di             ; Y2 laden
          sub      cx, bx             ; DELTAX=X2-X1
          jl  short T0                ; X2>X1?
          add      bx, [esi*2]
          nop
          nop
          sub      dx, si             ; DELTAY=Y2-Y1 bilden
          jl  T1                      ; Y2>Y1?
          mov      si, Max_X + 1
          nop
          nop
          nop
          nop
          nop
          cmp      cx, dx             ; DELTAX>DELTAY?
          jl  T2                      ; ja, verzweige
          add      dx, dx             ; INCB bestimmen
          nop
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          nop
          mov      di, dx             ; DAB nach DI übertragen
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
M00:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M01               ; ja, verzweige
          inc      bx                 ; naechste Spalte
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz M00
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M01:      add      bx, si             ; naechste Zeile und naechste Spalte
          add      di, dx
          dec      cx
          jnz M00
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T0:       neg      cx                 ; DELTAX umdrehen
          add      bx, [esi*2]
          sub      dx, si             ; DELTAY=Y2-Y1 bilden
          mov      si, Max_X + 1
          jl  short T01               ; Y2>Y1?
          nop
          nop
          mov      si, Max_X - 1
          cmp      cx, dx             ; DELTAX>DELTAY?
          jl  short T21               ; ja, verzweige
          add      dx, dx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      di, dx             ; DAB nach DI übertragen
          nop
          nop
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
M02:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M03               ; ja, verzweige
          dec      bx
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz M02
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M03:      add      bx, si             ; naechste Zeile und naechste Spalte
          add      di, dx
          dec      cx
          jnz M02
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T21:      add      cx, cx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, cx             ; INCB nach BP übertragen
          sub      cx, dx             ; DAB bestimmen
          nop
          mov      di, cx             ; DAB nach DI übertragen
          sub      cx, dx             ; INCA nach CX
;-------------------------------------
M04:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M05               ; ja, verzweige
          add      bx, Max_X
          add      di, bp             ; DAB=DAB+INCB
          dec      dx
          jnz M04
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M05:      add      bx, si
          add      di, cx
          dec      dx
          jnz M04
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T01:      neg      dx                 ; DELTAY umdrehen
          cmp      cx, dx             ; DELTAX>DELTAY?
          jl  short T22               ; ja, verzweige
          add      dx, dx             ; INCB bestimmen
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          mov      di, dx             ; DAB nach DI übertragen
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
M06:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M07               ; ja, verzweige
          dec      bx
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz M06
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M07:      sub      bx, si
          add      di, dx
          dec      cx
          jnz M06
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T22:      add      cx, cx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, cx             ; INCB nach BP übertragen
          sub      cx, dx             ; DAB bestimmen
          nop
          mov      di, cx             ; DAB nach DI übertragen
          sub      cx, dx             ; INCA nach CX
;-------------------------------------
M08:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M09               ; ja, verzweige
          sub      bx, Max_X
          add      di, bp             ; DAB=DAB+INCB
          dec      dx
          jnz M08
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M09:      sub      bx, si
          add      di, cx
          dec      dx
          jnz M08
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T1:       neg      dx                 ; und DELTAY umdrehen
          mov      si, Max_X - 1
          nop
          nop
          nop
          nop
          cmp      cx, dx             ; DELTAX>DELTAY?
          jl  short T12               ; ja, verzweige
          add      dx, dx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          nop
          nop
          nop
          nop
          mov      di, dx             ; DAB nach DI übertragen
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
M10:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M11               ; ja, verzweige
          inc      bx
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz M10
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M11:      sub      bx, si
          add      di, dx
          dec      cx
          jnz M10
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T12:      add      cx, cx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, cx             ; INCB nach BP übertragen
          sub      cx, dx             ; DAB bestimmen
          nop
          mov      di, cx             ; DAB nach DI übertragen
          sub      cx, dx             ; INCA nach DX
;-------------------------------------
M12:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M13               ; ja, verzweige
          sub      bx, Max_X
          add      di, bp             ; DAB=DAB+INCB
          dec      dx
          jnz M12
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M13:      sub      bx, si
          add      di, cx
          dec      dx
          jnz M12
          ret
;----------------------------------------------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
T2:       add      cx, cx             ; INCB bestimmen
          nop
          nop
          nop
          nop
          nop
          mov      bp, cx             ; INCB nach BP übertragen
          sub      cx, dx             ; DAB bestimmen
          nop
          mov      di, cx             ; DAB nach DI übertragen
          sub      cx, dx             ; INCA nach CX
;-------------------------------------
M14:      mov      fs:[bx], ax

          and      di, di             ; DAB>0?
          jge short M15               ; ja, verzweige
          add      bx, Max_X
          add      di, bp             ; DAB=DAB+INCB
          dec      dx
          jnz M14
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
M15:      add      bx, si
          add      di, cx
          dec      dx
          jnz M14
          ret

;              T a b e l l e   d e r   Z e i l e n - A n f ä n g e
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;---------------------------------------------------------------------------
PIXOFF:   xor      ax, ax
          xor      di, di
AGAIN:    mov      [di], ax
          add      di, 2
          add      ax, Max_X
          cmp      di, Max_Y * 2
          jb  AGAIN
          ret
  CODE ends
;---------------------------------------------------------------------------
  DATEN SEGMENT use32 'DATA'          ; Daten-Ausrichtung
 org 0
;-------------------------------------
PIXTAB DW Max_Y   dup (0)             ; Tabelle der Zeilen-Anfänge

POSIT  DW Anzahl  dup (0,0,X_Rad,0,Y_Rad,0) ; Flag(X-Rad),Flag(Y-Rad)
       DW 0, 0                              ; ,Grad,X-Radius,Y-Radius

OBJTAB DW 1000h   dup (0)             ; Sprite-Tabelle Ball
OBJZEI DW ?, 0                        ; aktueller Zeiger der Sprite-Tabelle
OBJPOS DW Groesse dup (0)             ; Tabelle der Endpos. des Sprite (Größe)
POSZEI DW ?, 0                        ; aktueller Zeiger der End-Tabelle
       DW 0

SPRTAB DW 0C80h   dup (0)             ; Sprite-Tabelle Dirk

VECOFF DW OFFSET VECTAB               ; Start-Offset Vectab (s.u)
VECTAB DB Veclen  dup (1)             ; Tabelle: Richtungen der Bidbewegung
       DB 0, 0, 0

XM     DW Max_X / 2-Groesse, 0        ; X-Mittelpunkt
YM     DW Max_Y / 2-Groesse, 0        ; Y-Mittelpunkt

RTX1   DW Max_X/2
RTY1   DW Max_Y/2
RTX2   DW Max_X/2
RTY2   DW Max_Y/2
RTX3   DW Max_X/2
RTY3   DW Max_Y/2

RETTSI DW ?, 0

RAID   DW 1, 0                        ; Kreis-Radius
X      DW ?, 0                        ; Kreis-X-Position
Y      DW ?, 0                        ; Kreis-Y-Position

SWAP0  DB 0                           ; Countdown: Radius
SWAP1  DB Za1                         ; Countdown: Sprite größer/kleiner
SWAP2  DB 0                           ; Flag: Sprite = größer/kleiner
SWAP3  DB 0                           ; Flag: End-Sequenz Rand-Begrenzung

PICOFF DW FPos, ?                     ; aktueller Offset des Fraktal-Bildes

BILSEG DW ?                           ; Segment des Bildes
PICSEG DW ?                           ; Segment des Fraktal-Bildes
SINSEG DW ?                           ; Segment der Sinus-Tabelle
DGSEG  DW ?                           ; Segment der Sinus-Tabelle

LCOL   DW Lin_farb + (Lin_farb*256), ?

MAREK  DW MaxRekPos                   ; max. Position des Sprite-Reklame

MIREK  DW MinRekPos                   ; min. Position des Sprite-Reklame

REKTAB DB Reklen  dup (0)             ; Sprite-Tabelle Reklame

ERTEX1 DB Cr, Lf, "Zuwenig Speicher = F E H L E R  ! (min. 200 Kilobyte)", Cr, Lf, "$"

ERTEX2 DB Cr, Lf, "Kann Sinus-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
SINNAM DB "Sinus.tab", 0, Cr, Lf, "$"

ERTEX3 DB Cr, Lf, "Kann Sprite-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
SPRNA2 DB "DG_320.spr", 0, Cr, Lf, "$"

ERTEX4 DB Cr, Lf, "Kann Farbanteile nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
DACNAM DB "DG_320.dac", 0, Cr, Lf, "$"

ERTEX5 DB Cr, Lf, "Kann Sprite-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
SPRNAM DB "Label.spr", 0, Cr, Lf, "$"

ERTEX6 DB Cr, Lf, "Kann Fraktal-Bild nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
;PICNAM DB "1ad.fpi", 0, Cr, Lf, "$"
PICNAM DB "frak_506.fpi", 0, Cr, Lf, "$"

ERTEX7 DB Cr, Lf, "Kann Richtungs-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
VECNAM DB "Vector.tab", 0, Cr, Lf, "$"

ERTEX8 DB Cr, Lf, "Kann Sprite-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
REKNAM DB "Reklame.spr", 0, Cr, Lf, "$"
  DATEN ends
;-------------------------------------
  STAPEL SEGMENT use16 STACK 'STACK'
       DB 10h dup (?)
  STAPEL ends
 end
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Einfache Grafik-Demos

Beitrag von freecrac »

Copper-Balken
In diesem Demo wandern 2 farbige Copperbalken über den Textbildschirmhintergrund.
http://www.alice-dsl.net/freecracmaps/Tool/COPPER2.zip

Code: Alles auswählen

;╔═══════════════════════════════════════════════════════════════════════════╗
;║   Zeichnet 2 Copperbalken an Positionen y_pos1 (rot) und y_pos2 (gruen)   ║
;║    overlay_maske: 0ff00h : Copper 2 im Vordergrund                        ║
;║                   000ffh : Copper 1 im Vordergrund                        ║
;║                   00000h : Durchdringung beider Copper                    ║
;╚═══════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL                          ; Programm möglichst klein halten
.386                                  ; 32-Bit Prozessor
;────────────────────────────────────────────────────────────────────────────
       IRQs_Port =    21h             ; Port-Adresse des IRQ-Controllers
       Stat_Port =    64h             ; Port-Adresse des Tastatur-Status
       Tast_Port =    60h             ; Port-Adresse des Tastatur-Controllers
;-------------------------------------
       RGB_Port  =   3C8h             ; Port-Adresse der Farb-Anteile (write)
       RGBDat    =   3C9h             ; Port-Adresse der Farb-Anteile (data)
       Rast_Port =   3DAh             ; Port-Adresse des Input Status Reg. 1
;-------------------------------------
       Hoehe     =    88              ; Gesamthöhe (breite) je Copper (88)
       Ymax      =   150              ; max. Y-Position (150)
       Flag      = 000FFh             ; Vordergrund-Maske (00FF)
       Speed     =     2              ; Anzahl Zeilen der Bewegung (2)
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;────────────────────────────────────────────────────────────────────────────
START:    cli
          mov      al, 2              ; IRQ 1 sperren
          out      IRQs_Port, al
          sti
          mov      ax, DATEN
          mov      bp, Flag           ; Vordergrund-Maske
          mov      ds, ax
          xor      si, si             ; Start am oberen Bildschirm (y1)
          mov      RETTSP, sp
;-------------------------------------
       DB  0EAh                       ; Prefetch-Puffer löschen:
       DW  (OFFSET BEGINN)            ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                   ; das Kommando JMP FAR CS:BEGINN
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
BEGINN:   add      si, YDIR           ; Bewegung + Richtung = Position
          mov      di, Ymax           ; Bewegungs-Bereich (unten)
          jz  short SWAP              ; wenn oben,Richtung und Maske umdrehen
          cmp      si, di             ; Rand-Abfrage
          jb  short COPPER            ; Balken erzeugen

SWAP:     xor      bp, 0FFFFh         ; jew. anderen Copper in Vordergrund
          neg      YDIR               ; Richtung umkehren

COPPER:   sub      di, si             ; y2 = Ymax-y1 (unten)
;----------------------------------------------------------------------------
          mov      ax, si             ; y1
          cmp      si, di             ; maximale y-Koordinate bestimmen
          ja  short AX_HI
          mov      ax, di

AX_HI:    add      ax, Hoehe          ;Höhe drauf
          mov      cx, 1              ;Zeilenzähler mit 1 starten
          mov      sp, ax             ;maximale Zeile, die beachtet werden muß
;-------------------------------------
          mov      dx, Rast_Port      ;Input Status Register 1 selektieren
IN_REA:   in       al, dx             ;auf Display warten
          test     al, 8
          jnz IN_REA
IN_DIA:   in       al, dx             ;Warten auf (Horizontal-) Retrace
          test     al, 8
          jz  IN_DIA
;-------------------------------------
NEXT_LI:  mov      bx, cx             ;Farbe 1 berechnen
          mov      ax, cx             ;Farbe 2 berechnen
          sub      bx, si             ;Position relativ zum Copperstart holen
          sub      ax, di             ;Position relativ berechnen

          cmp      bx, Hoehe/2 -1     ;schon 2. Hälfte ?
          jle short COP1_OK
          sub      bx, Hoehe -1       ;dann bx:=127-bx
          neg      bx

COP1_OK:  cmp      ax, Hoehe/2 -1     ;2. Hälfte
          jle short COP1_UP
          sub      ax, Hoehe -1       ;dann ax:=127-ax
          neg      ax

COP1_UP:  or       bx, bx
          jns short COP2_UP           ;positiv, dann Farbe
          xor      bl, bl

COP2_UP:  or       ax, ax             ;positiv, dann Farbe
          jns short COP2_OK
          xor      al, al

COP2_OK:  mov      bh, al             ;bl hat jetzt Farbe Copper 1 / bh Copper 2
          inc      cx                 ;Zeilenzähler hochzählen
          mov      ax, bx             ;Overlay berechnen
          and      ax, bp             ;Copper 1 oder 2 ausmaskieren
          or       al, al             ;Copper 1 Vorrang
          je  short COP1_HI
          xor      bh, bh             ;dann Copper 2 löschen

COP1_HI:  or       ah, ah             ;Copper 2 Vorrang
          je  short COP2_HIN
          xor      bl, bl             ;dann Copper 1 löschen

COP2_HIN: xor      al, al             ;Farbe 0 im DAC selektieren
          mov      dx, RGB_Port
          out      dx, al

          or       bl, bl             ;wenn Copper 1 schwarz -> lassen
          je  short BL_0
          add      bl, (128-Hoehe)/2  ;sonst aufhellen, um Maximalhelligkeit

BL_0:     or       bh, bh             ;zu erreichen
          je  short BH_0              ;für Copper 2 das Gleiche
          add      bh, (128-Hoehe)/2
;-------------------------------------
;jetzt auf horizontalen Retrace warten und Copper aktivieren
;-------------------------------------
BH_0:     cli
          mov      dx, Rast_Port      ;Input Status Register 1 selektieren
IN_RET:   in       al, dx             ;auf Display warten
          test     al, 1
          jne IN_RET
IN_DIS:   in       al, dx             ;Warten auf (Horizontal-) Retrace
          test     al, 1
          je  IN_DIS
;-------------------------------------
          mov      al, bl             ;Farbe 1 laden
          mov      dx, RGBDat         ;und setzen
          out      dx, al             ;Rot-Anteile für Copper 1 setzen
          mov      al, bh
          out      dx, al             ;Gruen-Anteile für Copper 2 setzen
          xor      al, al
          out      dx, al
          cmp      cx, sp             ;letzte Zeile erzeugt ?
          jnz NEXT_LI
;-------------------------------------
          mov      dx, Rast_Port      ;ja -> beenden
WAIT_H:   in       al, dx             ;vor dem Abschalten, unbedingt auf Retrace
          test     al, 1              ;warten, sonst Flimmern in letzter Zeile
          je  WAIT_H
;-------------------------------------
          xor      al, al             ;Farbe 0 im DAC selektieren
          mov      dx, RGB_Port
          out      dx, al
          inc      dx                 ;alle auf 0 setzen: schwarz
          out      dx, al
          out      dx, al
          out      dx, al
          sti
;----------------------------------------------------------------------------
          in       al, Stat_Port      ; Tastatur-Status holen
          test     al, 1              ;  Taste im Ausgabe-Puffer ?
          jz  BEGINN
          in       al, Tast_Port      ; Tasten-Code holen
          test     al, 80h
          jnz BEGINN
;────────────────────────────────────────────────────────────────────────────
          cli
          xor      al, al             ; IRQ 1 freigeben
          out      IRQs_Port, al
          sti
          mov      sp, RETTSP
;-------------------------------------
          mov      ah, 1              ; Tastatur-Puffer löschen
          int    16h
;-------------------------------------
          mov      ah, 4Ch            ; Dos-Rücksprung, Programm-Ende
          int    21h
;---------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                       D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'
 org 0
;---------------------------------------------------------------------------
YDIR   DW Speed                       ; Bewegung zunächst nach unten
RETTSP DW ?
;---------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
       DB 10h dup (?)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Einfache Grafik-Demos

Beitrag von freecrac »

Zoom-Fraktale
In diesem MCGA-Demo werden Fraktale berechnet und dabei immer tiefer hineingezoomt, bzw. wieder herausgezoomt.
http://www.alice-dsl.net/freecracmaps/Tool/SUPERFRA.zip

Code: Alles auswählen

;╔═══════════════════════════════════════════════════════════════════════════╗
;║                  E c h t - Z e i t  -  Z o o m - F r a k t a l e          ║
;║                ───────────────────────────────────────────────────        ║
;║  (C) Copyright:         Freie Cracker Crew Hamburg Horn                   ║
;║       Fractale:         MCGA,VGA,SVGA:  320 x 200 x 256                   ║
;║            von:               Dirk Wolfgang Glomp                         ║
;║            und:                  Herbert Athmer                           ║
;╚═══════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL                           ; Programm möglichst klein halten
.386P                                  ; 32-Bit Prozessor und Protect-Mode
.387                                   ; Fließpunkt/-komma (Co-Prozessor)
;──────────────────────────────────────
       TPos       = 1000000000         ; Teiler

       Zoom       =      20000

       Pos_Y1     =  765290000 + Zoom  ; Start-Positionen
       Pos_Y2     =  765289950 - Zoom
       Pos_X1     =   99981950 - Zoom
       Pos_X2     =   99982000 + Zoom

       Step       =       Zoom/230

       Iter       =       3000         ; Iteration

       Max_X      =        320
       Max_Y      =        200

       Pic_Len    = (Max_X*Max_Y)/4
       Pic_Par    = ((Max_X*Max_Y)/16)+16 ; Anzahl Paragraphen anfordern

       Video_Seg  =      0A000h        ; Bildschirm-Segment

       Tast_Port  =         60h        ; Port-Adresse des Tastatur-Controllers
       Cmos_Port  =         70h        ; Port-Adresse des CMOS-Chips (NMI)
       Status_1   =        3DAh        ; Port des Rasterstrahls
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;────────────────────────────────────────────────────────────────────────────
START:    mov      ax, DATEN
	  mov      ds, ax              ; Daten-Segment

	  call SETFREE                 ; Speicher freigeben

	  mov      bx, Pic_Par         ; Anzahl in Paragraphen
	  call GETSPACE                ; Speicher anfordern
	  mov      fs, ax
	  mov      BILSEG+2, ax        ; Segment retten

	  mov      ax, 13h             ; Grafik-Mode: 320 x 200 x 256 Farben
	  int    10h

	  finit                        ; Floating-Point-Unit initialisieren
	  cli                          ; alle Interrupts sperren
	  in       al, Cmos_Port
	  or       al, 80h
	  out      Cmos_Port, al

	  call MAKDAC                  ; Farb-Anteile erstellen/setzen

	  call PIXOFF                  ; Offset-Tabelle der Zeilen-Anfänge

	  fild     VIER
	  fstp     st(7)               ; 4.0

	  mov      ax, Video_Seg
	  mov      es, ax

	  mov     DWORD PTR[Z], TPos
	  mov     DWORD PTR[A], Pos_Y1
	  mov     DWORD PTR[B], Pos_Y2
	  mov     DWORD PTR[C], Pos_X1
	  mov     DWORD PTR[D], Pos_X2
	  mov      bp, Max_X
;--------------------------------------
       DB  0EAh                        ; Prefetch-Puffer löschen:
       DW  (OFFSET GO)                 ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                    ; das Kommando JMP FAR CS:GO
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;---------------------------------------------------------------------------
GO:       fild     A
	  mov      dx, Max_Y*2
	  fidiv    Z
	  xor      si, si              ; erste Zeile
	  fchs
	  fstp     A1
		   
	  fild     B
	  fidiv    Z
	  fchs
	  fstp     B1
		   
	  fild     C
	  fidiv    Z
	  fstp     C1
		   
	  fild     D
	  fidiv    Z
	  fstp     D1

	  sub     DWORD PTR[A], Step
	  add     DWORD PTR[B], Step
	  add     DWORD PTR[C], Step
	  sub     DWORD PTR[D], Step

	  fld      D1
	  fsub     C1
	  fidiv    YMAX
	  fstp     G                   ; G = (D-C)/YMAX

	  fld      B1
	  fsub     A1
	  fidiv    XMAX
	  fstp     F                   ; F = (B-A)/XMAX

ZEILE:    mov      bx, [si]            ; Offset aus Zeilen-Tabelle holen
	  mov      di, -1              ; erste Spalte

SPALTE:   fld      G                   ; Fraktal-Berechnung
	  xor      cx, cx
	  fimul    Y
	  fadd     C1
	  fst      st(1)               ; K = G * Y + C
	  fstp     st(2)               ; J = K

	  fld      F
	  fimul    X
	  fadd     A1
	  fst      st(3)               ; I = F * X + A
	  fstp     st(4)               ; H = I

	  inc      di                  ; nächste Spalte

	  fld      st(2-1)
	  fmul     st, st(2)
	  fstp     st(5)               ; L = J * J

	  fld      st(4-1)
	  fmul     st, st(4)
	  fstp     st(6)               ; M = H * H

FRAK1:    cmp      cx, Iter            ; Iteration
	  ja  short PIXEL

	  fld      st(4-1)
	  fadd     st, st(4)
	  fmul     st, st(2)
	  fadd     st, st(1)
	  fstp     st(2)              ; J = 2 * H * J + K

	  fld      st(6-1)
	  fsub     st, st(5)
	  fadd     st, st(3)
	  fstp     st(4)               ; H = M - L + I

	  fld      st(2-1)
	  fmul     st, st(2)
	  fstp     st(5)               ; L = J * J

	  fld      st(4-1)
	  fmul     st, st(4)
	  fst      st(6)               ; M = H * H

	  fadd     st, st(5)           ; M + L
	  fcomp    st(7)
	  fstsw    ax

	  inc      cx
	  test     ah, 1
	  jnz FRAK1

PIXEL:    mov      fs:[bx+di], cl      ; Farbe (0-255) zum Bild-Segment

	  inc     WORD PTR[X]
	  cmp      di, bp
	  jb  SPALTE

	  add      si, 2               ; nächste Zeile
	  in       al, Tast_Port       ; Tasten-Code holen
	  inc     WORD PTR[Y]
	  mov     WORD PTR[X], 0
	  dec      al                  ;  Escape-Taste gedrückt ?
	  jz  short RAUS

	  cmp      si, dx
	  jb  ZEILE
;---------------------------------------------------------------------------
;            B i l d - S e g m e n t   z u m   B i l d s c h i r m
;---------------------------------------------------------------------------
	  xor      di, di
	  mov      cx, Pic_Len
	  mov      dx, Status_1        ; Port des Rasterstrahls
	  lds      si, BILSEG

RASTER:   in       al, dx              ; Bewegung mit Raster-Strahl
	  and      al, 8               ; (Port:3DA) synchronisieren
	  jz  RASTER

	  rep movsd                    ; jetzt copieren

	  mov      ax, DATEN
	  mov      ds, ax

	  in       al, Tast_Port       ; Tasten-Code holen
	  mov     WORD PTR[Y], 0
	  dec      al                  ;  Escape-Taste gedrückt ?
	  jnz GO
;---------------------------------------------------------------------------
RAUS:     in       al, Cmos_Port       ; alle Interrupts freigeben
	  and      al, 7Fh
	  out      Cmos_Port, al
	  sti

	  mov      ax, 3               ; Text-Mode
	  int    10h

	  mov      ah, 1               ; Tastatur-Puffer löschen
	  int    16h

	  xor      al, al              ; kein Fehler
	  mov      ah, 4Ch             ; Dos-Rücksprung, Programm-Ende
	  int    21h
;────────────────────────────────────────────────────────────────────────────
;                      U N T E R - R O U T I N E N
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;────────────────────────────────────────────────────────────────────────────
;           S p e i c h e r    a n f o r d e r n / f r e i g e b e n
;────────────────────────────────────────────────────────────────────────────
GETSPACE: mov      ah, 48h             ; bx = Wert in Paragraphen
	  int    21h
	  ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Alignment
;----------------------------------------------------------------------------
SETFREE:  mov      bx, ss              ; zunächst die beiden Segmentadressen
	  mov      ax, es              ; voneinander abziehen. Das ergibt die
	  sub      bx, ax              ; Anzahl der Paragraphen vom PSP bis
				       ; zum Anfang des Stack
	  mov      ax, sp              ; da sich der Stackpointer am Ende des
	  add      ax, 0Fh             ; Stacksegments befindet, gibt sein
	  shr      ax, 4               ; Inhalt die Länge des Stacks an
	  add      bx, ax              ; zur bisherigen Länge hinzuaddieren
	  mov      ah, 4Ah             ; neue Größe an das DOS übergeben
	  int    21h
	  ret
;────────────────────────────────────────────────────────────────────────────
;              F a r b - A n t e i l e   e r s t e l l e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Alignment
;----------------------------------------------------------------------------
MAKDAC:   mov      ds, BILSEG+2
	  xor      di, di              ; Farb-Anteil-Block
	  mov      al, 10h             ; rot
	  mov      ah, 8               ; grün
	  xor      bl, bl              ; blau

TDAC1:    mov      [di], al
	  inc      di
	  mov      [di], ah
	  inc      di
	  mov      [di], bl
	  inc      al                  ; rot
	  inc      di
	  cmp      al, 40h
	  jnz TDAC1
;--------------------------------------
	  mov      al, 14h             ; rot
	  xor      ah, ah              ; grün
	  xor      bl, bl              ; blau
;---------------------------
TDAC2:    mov      [di], al
	  inc      di
	  mov      [di], ah
	  inc      di
	  mov      [di], bl
	  inc      di
	  jp  short DA2
	  inc      bl                  ; blau
DA2:      cmp      bl, 20h
	  jnz TDAC2
;--------------------------------------
	  mov      al, 10h             ; rot
	  xor      ah, ah              ; grün
	  xor      bl, bl              ; blau
;---------------------------
TDAC3:    mov      [di], al
	  inc      di
	  mov      [di], ah
	  inc      di
	  mov      [di], bl
	  add      ax, 101h            ; rot/grün
	  inc      di
	  cmp      al, 40h
	  jnz TDAC3
;--------------------------------------
	  mov      al, 16h             ; rot
	  xor      ah, ah              ; grün
	  mov      bl, 16h             ; blau
;---------------------------
TDAC4:    mov      [di], al
	  inc      di
	  mov      [di], ah
	  inc      di
	  mov      [di], bl
	  inc      di
	  jp  short DA4
	  inc      ah                  ; grün
DA4:      cmp      ah, 20h
	  jnz TDAC4
;────────────────────────────────────────────────────────────────────────────
;           F a r b - A n t e i l e   z u r   G r a f i k - K a r t e
;────────────────────────────────────────────────────────────────────────────
	  xor      al, al
	  mov      dx, 3C8h            ; VGA-PORT der Farb-Anteile (write)
	  xor      si, si
	  mov      cx, 0FFh*3
	  out      dx, al              ; Farb-Nr. zur VGA-Karte
	  inc      dx
	  rep outsb
	  mov      ax, DATEN
	  mov      ds, ax
	  ret
;────────────────────────────────────────────────────────────────────────────
;      T a b e l l e   d e r   Z e i l e n - A n f ä n g e   a n l e g e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Alignment
;----------------------------------------------------------------------------
PIXOFF:   xor      ax, ax              ; Offset der 1.Zeile
	  xor      di, di              ; Tabellen-Anfang (PIXTAB)
AGAIN:    mov      [di], ax            ; Offset zur Daten-Tabelle
	  add      di, 2               ; Tabellen-Zeiger erhöhen
	  add      ax, Max_X           ; Offset um eine Zeile erhöhen
	  cmp      di, Max_Y * 2       ;  schon alle Zeilen ?
	  jb  AGAIN
	  ret
;---------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                   D  A  T  E  N  -  B  E  R  E  I  C  H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'           ; Daten-Alignment
 org 0
;--------------------------------------
; T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;--------------------------------------
PIXTAB DW Max_Y dup (0)                ; Offsets der Bildschirmzeilen

A      DD 0
A1     DD 0
B      DD 0
B1     DD 0
C      DD 0
C1     DD 0
D      DD 0
D1     DD 0

G      DD 0
F      DD 0
Z      DD 0

X      DW 0, 0
Y      DW 0, 0

XMAX   DD Max_X
YMAX   DD Max_Y

BILSEG DW 0, 0

VIER   DD 4
;---------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
       DB 10h dup (0)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Einfache Grafik-Demos

Beitrag von freecrac »

Würfel
In diesem Demo dreht sich ein Würfel. Dieses Demo verwendet den MCGA-Mode.
http://www.alice-dsl.net/freecracmaps/Tool/WUERFEL.zip

Code: Alles auswählen

.MODEL SMALL                          ; Programm möglichst klein halten
.386P                                 ; 32-Bit Prozessor und Protect-Mode
.387                                  ; Fließpunkt/-komma (Co-Prozessor)
;────────────────────────────────────────────────────────────────────────────
       Tast_Port  =      60h          ; Port-Adresse des Tastatur-Controllers
       Stat_Port  =      64h          ; Port-Adresse des Tastatur-Status
;-------------------------------------
       Cmos_Port  =      70h          ; Port-Adresse des CMOS-Chips (NMI)
;-------------------------------------
       Rast_Port  =     3DAh          ; Port-Adresse des Rasterstrahls
       RGB_Port   =     3C8h          ; Port-Adresse der Farb-Anteile (write)
;----------------------------------------------------------------------------
       Video_Seg  =   0A000h          ; Bildschirm-Segment
;-------------------------------------
       Video_Mode =      13h          ; Graphik-Mode 320 x 200 x 256
;-------------------------------------
       Xmax       =     320
       Ymax       =     200
;----------------------------------------------------------------------------
       Texanz     =       4           ; Anzahl der Texturen (max.= 6)
;-------------------------------------
       XTex       =      64           ; Textur X-max.
       YTex       =      48           ; Textur Y-max.
;----------------------------------------------------------------------------
       Dist_X     =    XTex/2
       Dist_Y     =    XTex/2
       Dist_Z     =    YTex
;-------------------------------------
       Mit_X      =       0
       Mit_Y      =      30
;----------------------------------------------------------------------------
       Cr         =      0Dh          ; Cariages Return
       Lf         =      0Ah          ; Line Feed
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
;---------------------------------------------------------------------------
 org 100h
;────────────────────────────────────────────────────────────────────────────
START:    call DATSEG
;-------------------------------------
          call SETFREE                ; Rest des Speichers freigeben
          mov      bx, ((Xmax*Ymax)+(XTex*YTex*(Texanz+1)))/16
          call GETSPACE
          jc  FEHL1                   ; FEHLER = zuwenig freier Speicher
          mov      BILSEG, ax         ; Bild-Segment
          mov      fs, ax
;----------------------
          add      ax, ((Xmax*Ymax)+(XTex*YTex))/16
          mov      TEXSEG, ax
          mov      gs, ax
;-------------------------------------
          mov      dx, OFFSET DAC1    ; Farb-Anteile laden
          call OPEN
          jc  NODAC
          mov      cx, 768
          xor      dx, dx
          mov      ds, BILSEG
          call READ
;----------------------
          mov      dx, OFFSET TEX1    ; Textur laden
          call OPEN
          jc  NOTEX1
          mov      cx, XTex*YTex
          xor      dx, dx
          mov      ds, TEXSEG
          call READ
;----------------------
          mov      dx, OFFSET TEX2
          call OPEN
          jc  NOTEX2
          mov      cx, XTex*YTex
          mov      dx, XTex*YTex
          mov      ds, TEXSEG
          call READ
;----------------------
          mov      dx, OFFSET TEX3
          call OPEN
          jc  NOTEX3
          mov      cx, XTex*YTex
          mov      dx, XTex*YTex*2
          mov      ds, TEXSEG
          call READ
;----------------------
          mov      dx, OFFSET TEX4
          call OPEN
          jc  NOTEX4
          mov      cx, XTex*YTex
          mov      dx, XTex*YTex*3
          mov      ds, TEXSEG
          call READ
;----------------------
;          mov      dx, OFFSET TEX5
;          call OPEN
;          jc  NOTEX5
;          mov      cx, XTex*YTex
;          mov      dx, XTex*YTex*4
;          mov      ds, TEXSEG
;          call READ
;----------------------
;          mov      dx, OFFSET TEX6
;          call OPEN
;          jc  NOTEX6
;          mov      cx, XTex*YTex
;          mov      dx, XTex*YTex*5
;          mov      ds, TEXSEG
;          call READ
;-------------------------------------
          mov      ax, Video_Mode     ; Graphik-Mode einschalten
          int    10h
;-------------------------------------
          cli                         ; alle Interrupts sperren
          in       al, Cmos_Port
          or       al, 80h
          out      Cmos_Port, al
          finit                       ; Co-Prozessor initialisieren
;-------------------------------------
          call PIXOFF                 ; Zeilen-Tabelle anlegen
;-------------------------------------
          call PUTDAC                 ; Farb-Anteile setzen
;--------------------------------------------------------------------------
          fild     WSIN
          fidiv    TEILER
          fstp     WSIN               ; sin(.09)
;-------------------------------------
          fild     WCOS
          fidiv    TEILER
          fstp     WCOS               ; cos(.09)
;---------------------------------------------------------------------------
       DB  0EAh                       ; Prefetch-Puffer löschen:
       DW  (OFFSET BEGINN)            ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                   ; das Kommando JMP FAR CS:BEGINN
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;---------------------------------------------------------------------------
BEGINN:   call CLS                    ; Bild-Segment löschen
;---------------------------------------------------------------------------
          mov     WORD PTR[O1], 0     ; beide Flags löschen
;--------------------------------
          cmp     WORD PTR[A1], -Dist_X
          jl  short P2
          cmp     WORD PTR[B1], Dist_X
          jg  short P2
;-------------------------
          mov     BYTE PTR[O1], 1
          mov     WORD PTR[TEXOFF], 0 +XTex
P1:       mov      bx, C1             ; X1-Position
          mov      si, C2             ; Y1-Position
          mov      cx, D1             ; Y2-Position
          mov      di, D2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (c1, c2 - 80)-(d1, d2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P1
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
P2:       cmp     WORD PTR[A1], Dist_X
          jg  short P4
          cmp     WORD PTR[B1], -Dist_X
          jl  short P4
;-------------------------
          mov     BYTE PTR[O2], 1
          mov     WORD PTR[TEXOFF], XTex*YTex +XTex
P3:       mov      bx, A1             ; X1-Position
          mov      si, A2             ; Y1-Position
          mov      cx, B1             ; Y2-Position
          mov      di, B2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (a1, a2 - 80)-(b1, b2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P3
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
P4:       cmp     WORD PTR[A1], 0
          jg  short P7A
;-------------------------
          mov     WORD PTR[TEXOFF], XTex*YTex*2 +XTex
P5:       mov      bx, B1             ; X1-Position
          mov      si, B2             ; Y1-Position
          mov      cx, C1             ; Y2-Position
          mov      di, C2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (b1, b2 - 80)-(c1, c2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P5
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
          mov     WORD PTR[TEXOFF], XTex*YTex*3 +XTex
P6:       mov      bx, D1             ; X1-Position
          mov      si, D2             ; Y1-Position
          mov      cx, A1             ; Y2-Position
          mov      di, A2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (d1, d2 - 80)-(a1, a2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P6
          mov     WORD PTR[ZAEHL], Dist_Z
          jmp  short P9
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
P7A:      mov     WORD PTR[TEXOFF], XTex*YTex*3 +XTex
P7:       mov      bx, D1             ; X1-Position
          mov      si, D2             ; Y1-Position
          mov      cx, A1             ; Y2-Position
          mov      di, A2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (d1, d2 - 80)-(a1, a2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P7
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
          mov     WORD PTR[TEXOFF], XTex*YTex*2 +XTex
P8:       mov      bx, B1             ; X1-Position
          mov      si, B2             ; Y1-Position
          mov      cx, C1             ; Y2-Position
          mov      di, C2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (b1, b2 - 80)-(c1, c2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz P8
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
P9:       cmp     BYTE PTR[O1], 1
          jz  short PB
;-------------------------
          mov     WORD PTR[TEXOFF], 0 +XTex
PA:       mov      bx, C1             ; X1-Position
          mov      si, C2             ; Y1-Position
          mov      cx, D1             ; Y2-Position
          mov      di, D2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (c1, c2 - 80)-(d1, d2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz PA
          mov     WORD PTR[ZAEHL], Dist_Z
;-------------------------------------
PB:       cmp     BYTE PTR[O2], 1
          jz  short PD
;-------------------------
          mov     WORD PTR[TEXOFF], XTex*YTex +XTex
PC:       mov      bx, A1             ; X1-Position
          mov      si, A2             ; Y1-Position
          mov      cx, B1             ; Y2-Position
          mov      di, B2             ; Y2-Position
          sub      si, ZAEHL
          sub      di, ZAEHL
          call TEXLINE                ; (a1, a2 - 80)-(b1, b2 - 80)
          dec     WORD PTR[ZAEHL]
          jnz PC
          mov     WORD PTR[ZAEHL], Dist_Z
;----------------------------------------------------------------------------
PD:       mov     ax, DATEN
          mov     si, OFFSET A1
          mov     di, OFFSET K1
          mov     cx, 32/4
          mov     es, ax
          rep movsd
;-------------------------------------
          fld     WSIN     ; st(3)
          fld     WCOS     ; st(2)
          fild    K2       ; st(1)
          fild    K1       ; st
          fmul    st, st(2)
          fstp    st(4)
          fmul    st, st(3-1)
          fadd    st, st(4-1)
          fistp   A1                  ; a1 = k1 * COS(w) + k2 * SIN(w)
;-------------------------------------
          fild    K2
          fild    K1
          fchs
          fmul    st, st(3)
          fstp    st(4)
          fmul    st, st(2-1)
          fadd    st, st(4-1)
          fistp   A2                  ; a2 = -k1 * SIN(w) + k2 * COS(w)
;-------------------------------------
          fild    L2
          fild    L1
          fmul    st, st(2)
          fstp    st(4)
          fmul    st, st(3-1)
          fadd    st, st(4-1)
          fistp   B1                  ; b1 = l1 * COS(w) + l2 * SIN(w)
;-------------------------------------
          fild    L2
          fild    L1
          fchs
          fmul    st, st(3)
          fstp    st(4)
          fmul    st, st(2-1)
          fadd    st, st(4-1)
          fistp   B2                  ; b2 = -l1 * SIN(w) + l2 * COS(w)
;-------------------------------------
          fild    M2
          fild    M1
          fmul    st, st(2)
          fstp    st(4)
          fmul    st, st(3-1)
          fadd    st, st(4-1)
          fistp   C1                  ; c1 = m1 * COS(w) + m2 * SIN(w)
;-------------------------------------
          fild    M2
          fild    M1
          fchs
          fmul    st, st(3)
          fstp    st(4)
          fmul    st, st(2-1)
          fadd    st, st(4-1)
          fistp   C2                  ; c2 = -m1 * SIN(w) + m2 * COS(w)
;-------------------------------------
          fild    N2
          fild    N1
          fmul    st, st(2)
          fstp    st(4)
          fmul    st, st(3-1)
          fadd    st, st(4-1)
          fistp   D1                  ; d1 = n1 * COS(w) + n2 * SIN(w)
;-------------------------------------
          fild    N2
          fild    N1
          fchs
          fmul    st, st(3)
          fstp    st(4)
          fmul    st, st(2-1)
          fadd    st, st(4-1)
          fistp   D2                  ; d2 = -n1 * SIN(w) + n2 * COS(w)
          fstp    st(1)
          fstp    st(1)               ; Stack leeren, sonst Fehler
;----------------------------------------------------------------------------
          call COPY                   ; Bild zum Bildschirm copieren
;----------------------------------------------------------------------------
          in       al, Stat_Port      ; Tastatur-Status holen
          test     al, 1              ;   liegt Taste im Ausgabe-Puffer ?
          jz  BEGINN
;-------------------------------------
TASTE:    in       al, Tast_Port      ; Tasten-Code holen
          cmp      al, 1              ;   Escape-Taste gedrückt ?
          jz  short HOME
          cmp      al, 39h            ;  space ?
          jnz TASTE
          jmp  BEGINN
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
HOME:     in       al, Cmos_Port      ; alle Interrupts freigeben
          and      al, 7Fh
          out      Cmos_Port, al
          sti
;-------------------------------------
          mov      ax, 3              ; Text-Mode einschalten
          int    10h
;-------------------------------------
          mov      ah, 1              ; Tastatur-Puffer löschen
          int    16h
;-------------------------------------
          xor      al, al             ; kein Fehler
DOS:      mov      ah, 4Ch            ; Dos-Rücksprung, Programm-Ende
          int    21h
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
FEHL1:    mov      al, 1              ; Errorlevel 1
          mov      dx, OFFSET ERTEX1  ; Fehler-Text ausgeben
;-------------------------------------
ERRHOME:  mov      ah, 9
          int    21h
          jmp  short DOS
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
NODAC:    mov      al, 2              ; Errorlevel 2
          mov      dx, OFFSET ERTEX2  ; Fehler-Text ausgeben
          jmp  short ERRHOME
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
NOTEX1:   mov      al, 3              ; Errorlevel 3
          mov      dx, OFFSET ERTEX3  ; Fehler-Text ausgeben
          jmp  short ERRHOME
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
NOTEX2:   mov      al, 4              ; Errorlevel 4
          mov      dx, OFFSET ERTEX4  ; Fehler-Text ausgeben
          jmp  short ERRHOME
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
NOTEX3:   mov      al, 5              ; Errorlevel 5
          mov      dx, OFFSET ERTEX5  ; Fehler-Text ausgeben
          jmp  short ERRHOME
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
NOTEX4:   mov      al, 6              ; Errorlevel 6
          mov      dx, OFFSET ERTEX6  ; Fehler-Text ausgeben
          jmp  short ERRHOME
;-------------------------------------
; org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
;NOTEX5:   mov      al, 7              ; Errorlevel 7
;          mov      dx, OFFSET ERTEX7  ; Fehler-Text ausgeben
;          jmp  short ERRHOME
;-------------------------------------
; org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
;NOTEX6:   mov      al, 8              ; Errorlevel 8
;          mov      dx, OFFSET ERTEX8  ; Fehler-Text ausgeben
;          jmp  short ERRHOME
;────────────────────────────────────────────────────────────────────────────
;                      U N T E R - R O U T I N E N
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;────────────────────────────────────────────────────────────────────────────
;    Anfangspunkt: BX, SI   Endpunkt: CX, DI   Segment: FS
;────────────────────────────────────────────────────────────────────────────
TEXLINE:  add      bx, Xmax/2+Mit_X
          add      si, Ymax/2+Mit_Y
          add      cx, Xmax/2+Mit_X
          add      di, Ymax/2+Mit_Y
;-------------------------------------
          cmp      bx, Xmax           ; Begrenzungs-Abfrage der Bild-Matrix
          jae LEND
          cmp      si, Ymax
          jae LEND
          cmp      cx, Xmax
          jae LEND
          cmp      di, Ymax
          jae LEND
;-------------------------------------
          mov      ax, 4043h          ; Code für: INC AX // INC BX
          mov      dx, di             ; Y2 laden
          sub      cx, bx             ; DELTAX=X2-X1
          jge short DAX               ; X2>X1?
          mov      al, 4Bh            ; nein, Code für DEC BX
          neg      cx                 ; und DELTAX umdrehen
DAX:      sub      dx, si             ; DELTAY=Y2-Y1 bilden
          jge short DAY               ; Y2>Y1?
          mov      ah, 48h            ; nein, Code für DEC AX
          neg      dx                 ; und DELTAY umdrehen
DAY:      mov     WORD PTR cs:[G], ax ; Ink/Dek im Code abspeichern
          cmp      cx, dx             ; DELTAX>DELTAY?
          jge short DAB               ; ja, verzweige
          mov      al, 90h            ; Y ist Laufvariable
          mov      bp, dx             ; DELTAX und DELTAY tauschen
          mov      dx, cx
          mov      cx, bp
          jmp  short ACHS             ; und weitermachen
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
DAB:      mov      ah, 90h            ; X ist Laufvariable
ACHS:     add      dx, dx             ; INCB bestimmen
          mov     WORD PTR cs:[K], ax ; Ink. für Laufvariable im Code ablegen
          mov      bp, dx             ; INCB nach BP übertragen
          sub      dx, cx             ; DAB bestimmen
          mov      ax, si             ; Y1
          mov      di, dx             ; DAB nach BX übertragen
          sub      dx, cx             ; INCA nach DX
;-------------------------------------
SCHLEIF:  mov      si, [eax*2]        ; ax = Y   bx = X
;---------------------
          mov      RETTBP, bp
          mov      RETTAX, ax
          mov      bp, TEXOFF         ; Textur-Offset holen
          inc     WORD PTR[TEXOFF]    ; Textur-Offset erhöhen
          mov      al, gs:[bp]        ; Textur-Byte holen
          inc     WORD PTR[TEXZAE]    ; Textur-Spalte erhöhen
          mov      bp, RETTBP
;---------------------
PIXEL:    mov     BYTE PTR fs:[si+bx], al ; Farb-Punkt setzen !
          mov      ax, RETTAX
;-------------------------------------
          and      di, di             ; DAB>0?
          jge short G                 ; ja, verzweige
K:        inc      bx                 ; hier wird der
          inc      ax                 ; Code modifiziert
          add      di, bp             ; DAB=DAB+INCB
          dec      cx
          jnz SCHLEIF                 ; Schleife schließen
;---------------------
          mov      ax, XTex           ; Offset auf nächste Textur-Zeile
          sub      ax, TEXZAE
          mov     WORD PTR[TEXZAE], 0
          add      TEXOFF, ax
;---------------------
LEND:     ret                         ; Programm beenden
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
G:        inc      bx                 ; hier wird der
          inc      ax                 ; Code modifiziert
          add      di, dx             ; Schleife schließen
          dec      cx
          jnz SCHLEIF                 ; und weiter
;---------------------
          mov      ax, XTex           ; Offset auf nächste Textur-Zeile
          sub      ax, TEXZAE
          mov     WORD PTR[TEXZAE], 0
          add      TEXOFF, ax
;---------------------
          ret                         ; Programm beenden
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
CLS:      mov      cx, (Xmax*Ymax)/4  ; Bild-Segment löschen
          mov      es, BILSEG
          xor      di, di
          xor      eax, eax
          rep stosd
          ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
COPY:     mov      ax, Video_Seg      ; Bildschirm-Segment
          mov      dx, Rast_Port      ; Port des Rasterstrahls
          mov      ds, BILSEG         ; Bild-Segment
          xor      di, di
          xor      si, si
          mov      cx, (Xmax*Ymax)/4
          mov      es, ax
;-------------------------------------
          mov      bp, 200h
RASTER:   in       al, dx             ; Bewegung mit Raster-Strahl
          and      al, 8              ; (Port:3DA) synchronisieren
          jz  RASTER
          dec      bp
          jnz RASTER
;-------------------------------------
          rep movsd                   ; jetzt copieren
;-------------------------------------
DATSEG:   mov      ax, DATEN
          mov      ds, ax
          ret
;────────────────────────────────────────────────────────────────────────────
;                D o s  -  D a t e i   -   F u n k t i o n e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16
;----------------------------------------------------------------------------
OPEN:     mov      ax, 3D00h          ; Datei öffnen                  (OPEN)
          int    21h
          mov      bx, ax             ; Handle retten
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
READ:     mov      ah, 3Fh            ; Datei lesen u. Zeiger bewegen (READ)
          int    21h
          mov      ah, 3Eh            ; Datei schließen               (CLOSE)
          int    21h
          jmp  short DATSEG
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;---------------------------------------------------------------------------
PUTDAC:   mov      ds, BILSEG         ; Farb-Anteile setzen
          mov      al, 1
          mov      dx, RGB_Port
          xor      si, si             ; Quelle
          mov      cx, 0FEh*3
          out      dx, al             ; Farb-Nr. zur VGA-Karte
          inc      dx                 ; VGA-PORT der Farb-Anteile     (data)
          rep outsb                   ; Farb-Anteile zur Grafik-Karte
          jmp  short DATSEG
;────────────────────────────────────────────────────────────────────────────
;           S p e i c h e r    a n f o r d e r n / f r e i g e b e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;----------------------------------------------------------------------------
GETSPACE: mov      ah, 48h
          int    21h
          ret
;-------------------------------------
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;-------------------------------------
SETFREE:  mov      bx, ss             ; zunächst die beiden Segmentadressen
          mov      ax, es             ; voneinander abziehen. Das ergibt die
          sub      bx, ax             ; Anzahl der Paragraphen vom PSP bis
                                      ; zum Anfang des Stack
          mov      ax, sp             ; da sich der Stackpointer am Ende des
          add      ax, 0Fh            ; Stacksegments befindet, gibt sein
          shr      ax, 4              ; Inhalt die Länge des Stacks an
          add      bx, ax             ; zur bisherigen Länge hinzuaddieren
          mov      ah, 4Ah            ; neue Größe an das DOS übergeben
          int    21h
          ret
;────────────────────────────────────────────────────────────────────────────
;              T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16   ; Code-Ausrichtung
;---------------------------------------------------------------------------
PIXOFF:   xor      ax, ax
          xor      di, di
;-------------------------------------
AGAIN:    mov      [di], ax
          add      di, 2
          add      ax, Xmax
          cmp      di, Ymax * 2
          jb  AGAIN
          ret
;---------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                        D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'
 org 0
;---------------------------------------------------------------------------
PIXTAB DW Ymax dup (0)                ; Offset-Tabelle der Zeilen-Anfänge
;---------------------------------------------------------------------------
BILSEG DW ?                           ; Bild-Segment, wird angefordert
TEXSEG DW ?                           ; Textur-Segment, wird angefordert
;---------------------------------------------------------------------------
TEILER DD 1000000000
WSIN   DD 089878549                   ; sin(.09)
WCOS   DD 995952733                   ; cos(.09)
;-------------------------------------
A1     DW -Dist_X, 0
A2     DW -Dist_Y, 0
B1     DW Dist_X, 0
B2     DW -Dist_Y, 0
C1     DW Dist_X, 0
C2     DW Dist_Y, 0
D1     DW -Dist_X, 0
D2     DW Dist_Y, 0
;-------------------------------------
K1     DW 0, 0
K2     DW 0, 0
L1     DW 0, 0
L2     DW 0, 0
M1     DW 0, 0
M2     DW 0, 0
N1     DW 0, 0
N2     DW 0, 0
;-------------------------------------
ZAEHL  DW Dist_Z
O1     DB 0
O2     DB 0
;-------------------------------------
TEXOFF DW 0
TEXZAE DW 0
RETTAX DW ?
RETTBP DW ?
;---------------------------------------------------------------------------
ERTEX1 DB Cr, Lf
       DB "Zuwenig Speicher = F E H L E R  ! (min. 82 Kilobyte)"
       DB Cr, Lf, "$"
;-------------------------------------
ERTEX2 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
DAC1   DB "F2AK_320.dac", 0
       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
ERTEX3 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
TEX1   DB "F2AK_320.tex", 0
       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
ERTEX4 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
TEX2   DB "F6AK_320.tex", 0
       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
ERTEX5 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
TEX3   DB "F7AK_320.tex", 0
       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
ERTEX6 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
TEX4   DB "F8AK_320.tex", 0
       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
;ERTEX7 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
;TEX5   DB "F9AK_320.tex", 0
;       DB "nicht laden !", Cr, Lf, "$"
;-------------------------------------
;ERTEX8 DB Cr, Lf, "F E H L E R  =  Kann Datei: "
;TEX6   DB "FAAK_320.tex", 0
;       DB "nicht laden !", Cr, Lf, "$"
;---------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
;---------------------------------------------------------------------------
       DB 10h dup (?)
;---------------------------------------------------------------------------
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Einfache Grafik-Demos

Beitrag von freecrac »

Rundschrift
In diesem Demo wird gezeigt wie man eigene Zeichen gestalten kann und wie man damit eine Rundschrift erzeugt.
Das Demo verwendet den Vesamode 103 mit Bankumschaltung und der Auflösung 800x600, kann aber auch geändert werden auf 640x480, oder auf 1025x768.
Bei mir flackert allerdings der obere Bildschirmbereich, da der Bildaufbau zu lange dauert.
http://www.alice-dsl.net/freecracmaps/Tool/Rund.zip

Code: Alles auswählen

.MODEL SMALL                           ; Programm möglichst klein halten
.386                                   ; 32-Bit Prozessor
;──────────────────────────────────────
       Tast_Port  =      60h           ; Port: Tastatur-Controllers
       Stat_Port  =      64h           ; Port: Tastatur-Status
       IRQs_Port  =      21h           ; Port: IRQ-Controllers
       Rast_Port  =     3DAh           ; Port-Adresse des Rasterstrahls

       Video_Mode =     103h   ; VESA:101h,103h,105h;640x480,800x600,1024x768

       Video_Seg  =   0A000h           ; Grafik-Bildschirm-Segment

       Max_X      =     800
       Max_Y      =     600

       Cr         =      0Dh           ; Carriage Return
       Lf         =      0Ah           ; Line Feed
;--------------------------------------
       Zeile      =      16            ; HORIZONTAL-TEXT
       Spalte     =     100
       Abstand    =      24            ; Buchstaben-Abstand
       Color      =      11
;--------------------------------------
       Scale      =       2
       Gradmax    =     360 * Scale    ; KREIS-TEXT
       Sinlen     = (Gradmax+(Gradmax/4))*4 ; Länge der Sinus-Tabelle
       Texthoehe  =   Max_Y  / 2       ; Mittelpunkt
       Textbreite =   Max_X  / 2       ; Mittelpunkt
       Farbe      =      15
       SchriGro   =       1            ; Schrift-Größe
       Winkel     =      30            ; Start-Winkel
       Radius     =     215            ; max. Radius
       Radmin     =      90            ; min. Radius
       Abstand2   =     -10            ; Buchstaben-Abstand
       Radstep    =       1            ; Radius verkleinern/vergrößern
       Drehspeed  =       1
;──────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;──────────────────────────────────────
START:    mov     ax, DATEN            ; DS auf Daten-Bereich
	  mov     ds, ax
	  mov     es, ax
;--------------------------------------
	  mov     dx, OFFSET SINNAM    ; Sinus-Tabelle laden
	  call OPEN
	  jc  FEHLER2                  ; FEHLER = Datei nich gefunden !
	  mov     dx, OFFSET SINTAB    ; Anfang der Sinus-Tabelle
	  mov     cx, Sinlen
	  call READ
	  call CLOSE
;--------------------------------------
	  mov     ax, 4F01h            ; Modus-Spezifische Informationen holen
	  mov     cx, Video_Mode
	  mov     di, OFFSET VINF      ; es:di = Ziel-Offset
	  int   10h                    ; VESA-BIOS
	  cmp     ax, 4Fh
	  jnz FEHLER                   ; Funktion wird nicht unterstützt
;--------------------------------------
	  mov     eax, DWORD PTR[di+0Ch] ; Zeiger auf Bankumschaltungs-Routine
	  and     eax, eax
	  jz  FEHLER                   ; Funktion wird nicht unterstützt
	  mov    DWORD PTR cs:[BANKSET], eax
	  mov    DWORD PTR cs:[BANKSE1], eax
;--------------------------------------
	  mov     ax, 4F02h            ; Video-Mode einschalten
	  mov     bx, Video_Mode
	  int   10h
	  cmp     ax, 4Fh
	  jnz FEHLER                   ; Funktion wird nicht unterstützt
;--------------------------------------
	  cli
	  mov     al, 2                ; IRQ 1 sperren (Tastatur)
	  out     IRQs_Port, al
	  sti
;--------------------------------------
	  call PIXOFF                  ; Tabelle der Zeilen-Anfänge anlegen
	  mov     ax, Video_Seg        ; Bildschirm-Segment
	  mov     fs, ax
;--------------------------------------
	  xor     ebx, ebx
	  xor     bp, bp
;--------------------------------------
  ;        call HOROUT                  ; horizontale Textausgabe
;--------------------------------------
	  xor     ch, ch
;--------------------------------------
       DB  0EAh                        ; Prefetch-Puffer löschen:
       DW  (OFFSET BEGINN)             ; Die folgenden Zeilen erzeugen
       DW  SEG CODE                    ; das Kommando JMP FAR CS:BEGINN
;--------------------------------------
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;──────────────────────────────────────
BEGINN:   cli
          mov      dx, Rast_Port       ; Port des Rasterstrahls
RETRACE:  in       al, dx              ;auf Display warten
          and      al, 8
          jnz RETRACE

DISPLAY:  in       al, dx              ;Warten auf (Horizontal-) Retrace
          and      al, 8
          jz  DISPLAY
          sti

	  xor     cl, cl               ; Hintergrund-Farbe
	  call TEXOUT
	  mov     ax, W2
	  mov     W, ax

;       and      ch, ch
;       jnz short BIG
;       sub     WORD PTR[R], Radstep
;       cmp     WORD PTR[R], Radmin
;       ja  short TMT
;       inc      ch
;       jmp  short TMT
;;--------------------------------------
; org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;;--------------------------------------
;BIG:   add     WORD PTR[R], Radstep
;       cmp     WORD PTR[R], Radius
;       jb  short TMT
;       dec      ch
;TMT:

	  mov     cl, Farbe            ; Text-Farbe
	  call TEXOUT
	  mov     ax, W2
	  mov     W, ax

          sub    WORD PTR[W2], Drehspeed
          jnc short STATUS
          mov    WORD PTR[W2], (Gradmax - Drehspeed) + 1
;--------------------------------------
STATUS:   in      al, Stat_Port        ; Tastatur-Status holen
	  test    al, 1
	  jz  BEGINN
;──────────────────────────────────────
	  in      al, Tast_Port        ; Tasten-Code holen
	  cli
	  xor     al, al               ; IRQ 1 freigeben
	  out     IRQs_Port, al
	  sti
;--------------------------------------
	  mov     ah, 1                ; Tastatur-Puffer löschen
	  int   16h
;--------------------------------------
	  mov     ax, 3                ; Text-Mode
	  int   10h
;--------------------------------------
	  xor     cl, cl               ; ERRORLEVEL 0
;--------------------------------------
DOS:      mov     al, cl
	  mov     ah, 4Ch              ; Dos-Rücksprung
	  int   21h
;────────────────────────────────────────────────────────────────────────────
;                    F e h l e r   T e x t e   a u s g e b e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
FEHLER:   mov     cl, 1                ; ERRORLEVEL 1
	  mov     dx, OFFSET ERR       ; Video-Mode wird nicht unterstützt
;--------------------------------------
ERROUT:   mov     ah, 9                ; Text ausgeben
	  int   21h
	  jmp  short DOS
;──────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
FEHLER2:  mov     cl, 2
	  mov     dx, OFFSET ERTEXT
	  jmp  short ERROUT
;────────────────────────────────────────────────────────────────────────────
;                  U  N  T  E  R  -  P  R  O  G  R  A  M  M  E
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
HOROUT:   mov     si, OFFSET T1        ; horizontale Textausgabe
	  xor     cx, cx
LOOK:     mov     al, [si]
	  inc     si
	  and     al, al
	  jz  short MEHR
;--------------------------------------
	  mov     ax, cx               ; Zähler holen
	  mov     bx, Zeile            ; Zeile holen 
	  mov     dx, cx               ; Zähler holen
	  shr     ax, 4                ; Zähler durch 16 = Bild-Zeile
	  mov     di, Spalte           ; Spalte holen
	  add     bx, ax               ; Zeile plus Bild-Zeile = Y
	  shl     ax, 4                ; Bild-Zeile mal 16
	  add     di, ZUSATZ           ; Spalte plus Buchstaben-X-Position
	  sub     dx, ax               ; Zähler - Bild-Zeile = Spalte
	  add     di, dx               ; Spalte plus Bild-Spalte = X
;-------------------------------
	  mov     dx, [ebx*4+2]        ; Bank holen
	  add     di, [ebx*4]          ; Zeilen-Offset plus X
	  cmp     bp, dx               ;  dieselbe Bank ?
	  jz  short NOBANK
;-------------------------------
	  xor     bx, bx               ; VESA:Bankumschaltung (Fenster A)
	  mov     bp, dx               ; Bank retten
;-------------------------------
	DB 9Ah                         ; CALL FAR: BANKSET
BANKSET DD ?                           ; Zeiger auf Bankumschaltungs-Routine
;-------------------------------
NOBANK:   mov    BYTE PTR fs:[di], Color ; Farb-Byte schreiben 0-255
;--------------------------------------
MEHR:     inc     cl
	  jnz LOOK
	  add    WORD PTR[ZUSATZ], Abstand
	  cmp    WORD PTR[ZUSATZ], Abstand*Buchmax
	  jnz LOOK
	  ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
TEXOUT:   mov     si, OFFSET T1
NEBUCH:   mov    WORD PTR[X], 0        ; FOR X = 0 TO 6

NESPA:    mov    WORD PTR[Y], 0        ; FOR Y = 1 TO 14

LOOKDOT:  cmp    BYTE PTR[si], 0
	  jz  short NODOT
;--------------------------------------
	  call SCHREIB
;--------------------------------------
NODOT:    inc    WORD PTR[Y]
	  add     si, Spaltmax
	  cmp    WORD PTR[Y], Zeilmax
	  jnz LOOKDOT                  ; nächste Spalte

	  inc    WORD PTR[X]
	  sub     si, (Spaltmax*Zeilmax) -1
	  cmp    WORD PTR[X], Spaltmax
	  jnz NESPA                    ; nächste Zeile

	  add     si, Spaltmax*(Zeilmax-1)
          sub    WORD PTR[W], Abstand2 * Scale ; W = W - A

	  cmp    WORD PTR[W], Gradmax  ; noch innerhalb der Sinus-Tabelle ?
	  jb  short KLWINK
	  sub    WORD PTR[W], Gradmax

KLWINK:   cmp     si, OFFSET T1+LettMax
	  jb  NEBUCH                   ; nächster Buchstabe
	  ret
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
SCHREIB:  mov    WORD PTR[X1], 1       ; FOR X1 = 1 TO G
;--------------------------------------
NEXX1:    mov    WORD PTR[Y1], 1       ; FOR Y1 = 1 TO G
;--------------------------------------
NEXY1:    mov     ebx, SchriGro
          mov     eax, DWORD PTR[X]
          mov     edi, DWORD PTR[X1]
          mul     ebx
          sub     edi, eax
          mov    DWORD PTR[X2], edi    ; X1 - X * G
;------------------------
          mov     ax, Y
          mov     di, Y1
          mul     bx
;------------------------
          mov     bx, W                ; Winkel holen
;------------------------
          sub     di, ax
          add     di, R
          mov     Y2, di               ; (Y1 - Y * G) + R
;--------------------------------------
          mov     eax, DWORD PTR[ebx*4+OFFSET SINTAB]
          mul    DWORD PTR[Y2]
          shr     eax, 10h
          mov     di, ax               ; Y2 * SIN(P * W)

          mov     eax, DWORD PTR[ebx*4+OFFSET SINTAB+Gradmax]
          mul    DWORD PTR[X2]
          shr     eax, 10h
          sub     ax, di               ; - Y2 * SIN(P * W)
          mov     XS, ax               ; X2 * COS(P * W) - Y2 * SIN(P * W)
;------------------------
          mov     eax, DWORD PTR[ebx*4+OFFSET SINTAB]
          mul    DWORD PTR[X2]
          shr     eax, 10h
          mov     di, ax               ; X2 * SIN(P * W)

          mov     eax, DWORD PTR[ebx*4+OFFSET SINTAB+Gradmax]
          mul    DWORD PTR[Y2]
          shr     eax, 10h
          add     ax, di               ; X2 * SIN(P * W) + Y2 * COS(P * W)
;--------------------------------------
          mov     bx, ax               ; Y holen
	  mov     di, XS               ; X holen
	  add     bx, Texthoehe
	  add     di, Textbreite
	  cmp     bx, Max_Y-1
	  jnb short NOPIX
	  cmp     di, Max_X-1
	  jnb short NOPIX

	  mov     dx, [ebx*4+2]        ; Bank holen
	  add     di, [ebx*4]          ; Zeilen-Offset plus X
	  cmp     bp, dx               ;  dieselbe Bank ?
	  jz  short NOBAN1
;-------------------------------
	  xor     bx, bx               ; VESA:Bankumschaltung (Fenster A)
	  mov     bp, dx               ; Bank retten
;-----------------------
	DB 9Ah                         ; CALL FAR: BANKSET
BANKSE1 DD ?                           ; Zeiger auf Bankumschaltungs-Routine
;-------------------------------
NOBAN1:   mov     fs:[di], cl          ; Farb-Byte schreiben 0-255
;--------------------------------------
NOPIX:    inc    WORD PTR[Y1]
	  cmp    WORD PTR[Y1], SchriGro+1
	  jnz NEXY1
	  inc    WORD PTR[X1]
	  cmp    WORD PTR[X1], SchriGro+1
	  jnz NEXX1
	  ret
;────────────────────────────────────────────────────────────────────────────
;                    D a t e i - F u n k t i o n e n
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
OPEN:     mov     ax, 3D00h            ; Datei öffnen (OPEN)
	  int   21h
	  mov     bx, ax               ; Datei-Handle retten
	  ret
;--------------------------------------
 org START + ((($-START)/16)*16)+16
;--------------------------------------
READ:     mov     ah, 3Fh              ; Datei lesen u. Zeiger bewegen (READ)
	  int   21h
	  ret
;--------------------------------------
 org START + ((($-START)/16)*16)+16
;--------------------------------------
CLOSE:    mov     ah, 3Eh              ; Datei schließen (CLOSE)
	  int   21h
	  ret
;────────────────────────────────────────────────────────────────────────────
;              T a b e l l e   d e r   Z e i l e n - A n f ä n g e
;────────────────────────────────────────────────────────────────────────────
 org START + ((($-START)/16)*16)+16    ; Code-Ausrichtung
;--------------------------------------
PIXOFF:   mov     bx, OFFSET VINF+10h  ; Vesa-Info
	  xor     di, di               ; Tabellen-Zeiger
          mov     cx, [bx]             ; Anzahl Bytes der Rasterzeile
	  xor     bx, bx               ; Zeile
;--------------------------------------
AGAIN:    mov     ax, cx               ; Rasterlänge holen
	  mul     bx                   ; Zeile mal Rasterlänge
	  mov     [di], ax             ; Zeilen-Offset in Tabelle ablegen
	  mov     [di+2], dx           ; 64Kb-Bank     in Tabelle ablegen
	  inc     bx                   ; Zeile erhöhen
	  add     di, 4                ; Tabellen-Zeiger erhöhen
	  cmp     bx, Max_Y            ; schon letzte Zeile ?
	  jb  AGAIN                    ; weiter wenn kleiner
	  ret
;--------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
;                       D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'
 org 0
;--------------------------------------
PIXTAB DD Max_Y  dup (41414141h)       ; Tab. der Zeilen-Anfänge(Offset,Bank)
;--------------------------------------
VINF   DB 100h   dup (42h)             ; Vesa-Modus-Speziefische Informationen
;--------------------------------------
SINTAB DB Sinlen dup (43h)             ; Sinus-Tabelle
;--------------------------------------
T1  DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;****************│
;------------------------
Spaltmax = ($-T1)
;------------------------
    DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;****************│
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; ***************│
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1 ; ***          **│
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ; ***            │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ; ***            │
    DB 0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0 ; ***     **     │
    DB 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0 ; **********     │
    DB 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0 ; **********     │
    DB 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0 ; **********     │
    DB 0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0 ; ***     **     │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ; ***            │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ; ***            │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ; ***            │
    DB 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;*****           │
    DB 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;*****           │
;------------------------
Zeilmax = ($-T1)/Spaltmax
;-------------------------------------- ────────────────┤
T2  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T3  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 ;       **       │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0 ;   ****  ****   │
    DB 0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0 ;   ***    ***   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0 ;   ****   ***   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T4  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0 ;     *****      │
    DB 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0 ;     *****      │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0 ;      ***       │
    DB 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0 ;     *****      │
    DB 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0 ;     *****      │
;-------------------------------------- ────────────────┤
T5  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 ;       **       │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0 ;   ****  ****   │
    DB 0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0 ;   ***    ***   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0 ;   ****   ***   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T6  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T7  DB 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ;      *****     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0 ; *****     **** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1 ; ***         ***│
    DB 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ;****            │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ;****            │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1 ; ***         ***│
    DB 0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0 ; *****     **** │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ;      *****     │
;-------------------------------------- ────────────────┤
T8  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T9  DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 ;   **           │
    DB 0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0 ;   ********     │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0 ;   ***********  │
    DB 0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0 ;   **      ***  │
    DB 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0 ;          ****  │
    DB 0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0 ;      ********  │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0 ;    **********  │
    DB 0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0 ;   *****   ***  │
    DB 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
    DB 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0 ;   ************ │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0 ;    *********** │
;-------------------------------------- ────────────────┤
T10 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0 ;     ********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ;  ***********   │
    DB 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0 ;  ****          │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0 ;  ****          │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ;  ***********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0 ;     ********   │
;-------------------------------------- ────────────────┤
T11 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0 ;  *****         │
    DB 0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,0 ;  *****   ****  │
    DB 0,0,0,1,1,1,0,0,0,1,1,1,1,1,0,0 ;   ***   *****  │
    DB 0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0 ;   ***  ***     │
    DB 0,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0 ;   *** ***      │
    DB 0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0 ;   ******       │
    DB 0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0 ;   ******       │
    DB 0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0 ;   *******      │
    DB 0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0 ;   ***  ***     │
    DB 0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0 ;   ***   ***    │
    DB 0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,0 ;  *****  *****  │
    DB 0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,0 ;  *****  *****  │
;-------------------------------------- ────────────────┤
T12 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 ;       **       │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0 ;   ****  ****   │
    DB 0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0 ;   ***    ***   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0 ;   ****   ***   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T13 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T14 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T15 DB 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ;      *****     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0 ; *****     **** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1 ; ***         ***│
    DB 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ;****            │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ;***             │
    DB 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ;****            │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1 ; ***         ***│
    DB 0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0 ; *****     **** │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ;      *****     │
;-------------------------------------- ────────────────┤
T16 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T17 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 ;       **       │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0 ;   ****  ****   │
    DB 0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0 ;   ***    ***   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 ;   ***          │
    DB 0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0 ;   ****   ***   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0 ;    ********    │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T18 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;***          ***│
    DB 1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1 ;***    **    ***│
    DB 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1 ;***   ****   ***│
    DB 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1 ;***   ****   ***│
    DB 1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1 ;***  **  **  ***│
    DB 0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0 ; *** **  ** *** │
    DB 0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0 ; *** **  ** *** │
    DB 0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0 ; *** **  ** *** │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
;-------------------------------------- ────────────────┤
T19 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T20 DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; ************** │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; ************** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
;-------------------------------------- ────────────────┤
T21 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 ;   **           │
    DB 0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0 ;   ********     │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0 ;   ***********  │
    DB 0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0 ;   **      ***  │
    DB 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0 ;          ****  │
    DB 0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0 ;      ********  │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0 ;    **********  │
    DB 0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0 ;   *****   ***  │
    DB 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
    DB 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0 ;   ***     ***  │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0 ;   ************ │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0 ;    *********** │
;-------------------------------------- ────────────────┤
T22 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0 ; *****    ***** │
    DB 1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1 ;******    ******│
    DB 1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1 ;*** ***  *** ***│
    DB 1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1 ;***  **  **  ***│
    DB 1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1 ;***  ******  ***│
    DB 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1 ;***   ****   ***│
    DB 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1 ;***   ****   ***│
    DB 1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1 ;***    **    ***│
    DB 1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1 ;***    **    ***│
    DB 1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1 ;***    **    ***│
;-------------------------------------- ────────────────┤
T23 DB 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 ; *****          │
    DB 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 ; *****          │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ;  ***           │
    DB 0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,0 ;  *** ******    │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ;  ***********   │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ; *************  │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; ************   │
;-------------------------------------- ────────────────┤
T24 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1 ;*****      *****│
    DB 1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1 ;*****      *****│
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0 ; ****      **** │
    DB 0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0 ; *****    ***** │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T25 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T26 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;    ********    │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;   **********   │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │ 
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0 ;   ***********  │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0 ;    **********  │
    DB 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 ;           ***  │
    DB 0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0 ; ***       ***  │
    DB 0,1,1,1,1,0,0,0,0,0,1,1,1,1,0,0 ; ****     ****  │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ;  ***********   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0 ;   *********    │
;-------------------------------------- ────────────────┤
T27 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T28 DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; ************** │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; ************** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0 ; ***        *** │
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
    DB 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1 ;****        ****│
;-------------------------------------- ────────────────┤
T29 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0 ; ****      **** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0 ; ***        *** │
    DB 0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0 ; ****      **** │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
;-------------------------------------- ────────────────┤
T30 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0 ;   ****    **   │
    DB 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 ;   **********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0 ;    *********   │
    DB 0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0 ;    ***    **   │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 ;    ***         │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
    DB 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 ;   *****        │
;-------------------------------------- ────────────────┤
T31 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ; **             │
    DB 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0 ; **********     │
    DB 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; ************   │
    DB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ;  ************  │
    DB 0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0 ;  ***     ****  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0 ;  ***      ***  │
    DB 0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0 ; *****    ***** │
    DB 0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0 ; *****    ***** │
;-------------------------------------- ────────────────┤
T32 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T33 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;                │
;-------------------------------------- ────────────────┤
T34 DB 1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1 ;*      **      *│
    DB 1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1 ;**     **     **│
    DB 0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0 ; *   ******   * │
    DB 0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0 ; **  ******  ** │
    DB 0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0 ; **    **    ** │
    DB 0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0 ; **    **    ** │
    DB 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0 ;  *          *  │
    DB 0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0 ;   ***    ***   │
    DB 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0 ;      ****      │
    DB 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0 ;     ******     │
    DB 0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0 ;    **    **    │
    DB 0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0 ;   **      **   │
    DB 0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0 ;   **      **   │
    DB 0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0 ;   **      **   │
    DB 0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0 ;    **    **    │
    DB 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0 ;  ****    ****  │
;------------------------
LettMax = ($-T1)                       ; Anzahl Bytes
Buchmax = LettMax/(Spaltmax*Zeilmax)   ; Anzahl Buchstaben
;--------------------------------------
ZUSATZ DW 0, 0                         ; Buchstaben-Abstand (horizontal-Text)

R   DW Radius, 0                       ; Radius
W   DW Winkel, 0                       ; aktueller Ausgabe-Winkel
W2  DW Winkel+1, 0                     ; Bewegungs-Winkel

X   DW Spalte, 0
Y   DW Zeile, 0
X1  DW 0, 0
Y1  DW 0, 0
X2  DW 0, 0
Y2  DW 0, 0
XS  DW 0, 0                            ; Pixel X
;--------------------------------------
ERTEXT DB Cr, Lf, "Kann Sinus-Tabelle nicht laden = F E H L E R  !", Cr, Lf
       DB "Programm-Name: "
SINNAM DB "Sin1Int.tab", 0, Cr, Lf, "$"

ERR DB Cr, Lf
    DB "     - FEHLER -=========- FEHLER -=========- FEHLER -=========- FEHLER -"
    DB Cr, Lf
    DB "  Benutzte VESA-Funktion, wird von der Hardware/Software, nicht unterstützt."
    DB Cr, Lf
    DB "    -=========- FEHLER -=========- FEHLER -=========- FEHLER -=========-"
    DB Cr, Lf, 7, "$"
;--------------------------------------
  DATEN ends
;──────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
    DB 10h dup (44h)
  STAPEL ends
;──────────────────────────────────────
 end
Antworten