include macro.inc ;Makros einbinden
.MODEL Small ;EXE
.486 ;Prozessortyp
.STACK 100h
XSize EQU 320 ;320 Pixel breit...
YSize EQU 200 ;... und 200 hoch
.DATA ;Die Daten:
include palette.dat ;Mit MakePal erstellte Palette
Msg DB 10,13,"Flammendemo",10,13,"$"
.CODE ;Der Code...
Start: CutMem ;Speicher freigeben
AllocMem 0FFFh ;und reservieren
mov es,ax ;Für später
mov fs,ax ;In FS sichern
mov ax,@data
mov ds,ax ;DS initialisieren
xor eax,eax ;EAX=0
xor di,di ;ES:DI auf Pufferanfang
mov cx,0FFF0h/4 ;Pufferlänge (Doppelworte)
rep stosd ;Puffer mit 0 überschreiben
SetVGA ;In den VGA-Modus
PalOut Palette ;Palette senden
mov bx,9433h ;Für Random
push fs
pop ds ;DS auf res. Puffer
;nun: ES auf Videospeicher und DS auf Puffer!
MainLoop:
mov si,XSize*YSize ;oben 2.Zeile anfangen
mov cx,XSize*2 ;1. u. letze Zeile nicht
FillLi: call Random ;Zufallszahl bitte
mov [si],dl ;nach DS:SI
dec si
dec cx
jnz FillLi ;Brennstoff
call MakeFire ;Verbrennen
call DrawScr ;und ausgeben
mov ah,01h
int 16h
jz MainLoop ;Wurde Taste gedrückt?
xor ah,ah
int 16h ;Welche?
cmp al,"i" ;Normale Flamme...
jne Weiter
xor bp,bp
jmp MainLoop
Weiter:
cmp al,"o" ;Große Flamme
jne Raus
mov bp,"o"
jmp MainLoop
Raus:
push ds
pop es
mov ah,49h
int 21h ;Speicher wieder freigeben
StVidMod 3 ;Normaler Videomodus
mov ax,@data
mov ds,ax
mov ah,09h
mov dx,OFFSET Msg
int 21h ;Text ausgeben
mov ah,4Ch
int 21h ;Programm beenden...
Random PROC NEAR ;Zufallsgenerator
mov ax,bx ;Faktor1 nach AX
mov dx,8405h ;Faktor2 nach DX
mul dx ;AX*DX=DX:AX
inc ax ;AX=AX+1
mov bx,ax ;AX wieder nach BX
ret ;Zurück...
ENDP
MakeFire PROC NEAR
mov si,XSize ;Oben 2. Zeile
mov cx,XSize*YSize-XSize*2
;1. und letzte Zeile nicht
FireLoop:
xor ax,ax ;AX=0
mov al,[si] ;eigentliches Pixel
add al,[si+XSize] ;+Pixel darunter
adc ah,0 ;AH+1 falls zuviel
add al,[si+1] ;+Pixel rechts daneben
adc ah,0 ;AH+1 falls zuviel
add al,[si-1] ;+Pixel links daneben
adc ah,0 ;AH+1 falls zuviel
shr ax,2 ;AX=AX/4
jz NichtSchrumpfen ;Wenn AX=0 kein DEC
cmp bp,"o" ;Wurde o gedrückt?
je NichtSchrumpfen ;Ja: Kein DEC
dec ax ;Flamme klein halten
NichtSchrumpfen:
mov [si-XSize],al ;Wert darüber platzieren
inc si ;nächstes Pixel!
dec cx ;Zähler - 1
jnz FireLoop ;Weiter...
ret ;Zurück
MakeFire ENDP
DrawScr PROC NEAR
WaitRet ;Das bekannte Makro
xor si,si ;Anfang Puffer
xor di,di ;Anfang Videospeicher
mov cx,(XSize*YSize-4*XSize)/4
rep movsd ;Alles Raus! DS:SI->ES:DI
ret ;Und zurück...
DrawScr ENDP
END Start
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|