Metropoli BBS
VIEWER: fire!.asm MODE: TEXT (CP437)
;******************************************************************************
;******************************************************************************
;                       CODE DONE BY MAC OF PROPHECY!
; YOU CAN CONTACT ME AT: 
; BBS: DARK iLLUSiON +49-(0)89-36102651 (PROPHECY WHQ)
; FIDONET: 2:2480/826.14
;******************************************************************************
;                        THiS SOURCE CODE iS FREEWARE
;          iF YOU FiND THiS CODE USEFULL PLEASE GREET US ( PROPHECY )
;       iF YOU USE THiS IN YOUR OWN PRODUCTIONS PLEASE GiMME THE CREDiTS
;******************************************************************************
;           MY CODE iS BASED ON THE FiRE-EFFECT BY DANiEL SJOBERG
;     BECAUSE HE USED A RANDOM PROCEDURE ( MADE BY ANONYMOUS ) AND THE
;                 SiMPLE FORMULA OF JARE/VANGELiSTEAM ( TNX )
;           i REWROTE AND iMPROVED ALMOST EVERYTHiNG OF HiS CODE 
;******************************************************************************
;                 THE MEMBERSTATUS OF PROPHECY IN LATE 1994
;
;                       CYBOMAN  - MUSiC
;                       GEMiNi   - CODE
;                       HUMANOiD - MUSiC
;                       MAS      - CODE (UT)
;                       MAC      - CODE, GFX
;                       KAOS     - BBS, ORGANIZER
;******************************************************************************
;******************************************************************************

.386

_data segment use16 public 'data'

 	flames   	db 160*100 dup (0)   ;Flamemap
	banner		db 'Code done by MAC of PROPHECY in 1994!',10,13
			db 'call the DARK iLLUSiON BBS: +49-(0)89-36102651'
			db 10,13,'$'

_data ends

_code segment use16 public 'code'
assume cs:_code,ds:_data,ss:_stack

main proc near

	mov ax,_data
	mov ds,ax

	mov ax,13h 		;<- 320x200x256 gfx-mode installieren
	int 10h

	mov ax,pal		;<- feuerpalette installieren
	mov es,ax

	mov ax,1012h        
	xor bx,bx
	mov cx,255
	xor dx,dx
	int 10h

;***********************************************************
;                       Main Code
;***********************************************************

call flame			;<- flammenroutine aufrufen

mov ax,3 			;<- zurück in Textmode
int 10h			
mov ax,_data
mov ds,ax
mov dx,offset banner		;<- end banner ausgeben
mov ah,9
int 21h
mov ax,4c00h			;<- und zurück ins dos
int 21h

main endp

;************************************************************
;      Flammen Routine
;************************************************************

flame  proc   near
	mov ax,_data
	mov ds,ax
	mov es,ax

       	mov  di,99*160	  	;<- unterste zeile im feuer
	add  di,5 		;<- verschiebung der punkte, um auch rand zu
				;soften (s.u.)
       	mov  cx,6		;<- anzahl der punkte (hotspots)
hotspots:
       	push di			;<- register sichern, Random proc zerstört
       	push cx			;diese register
       	push es
       	push di
       	mov  ax,150             ;<- wert zwischen 0 und 150 für hotspot holen
       	call random		; 		       ^-breite des feuers
       	pop  di			;                 minus 2x verschiebung (s.o.)
       	add  di,ax		;<- stelle für hotspot festlegen

       	mov  ax,80              ;<- paletteneintrag für hotspot holen 
       	push di			;je höher desto heller (0-150)
       	call random
       	add  ax,70		;<- um hotspot heller zu machen 
       	pop  di			;also um werte zwischen 70 und 150 zu bekommen
       	pop  es			;sonst brennt das Feuer zu niedrig
       	pop  cx
       	mov  ah,al		;<- hotspot verdoppeln
       	mov  [di],ax            ;<- hotspot setzten (in die Flamemap)
       	pop  di
       	loop hotspots           ;<- loop um alle hotspots zu setzten   

	mov di,320+160*30       ;<- in der 31 zeile mit dem einlesen und
scanning_flames:                ;berechnen der flamme anfangen        
        xor  ax,ax
        xor  bx,bx
        mov  bl,flames[di]	;<- einen punkt einlesen
        mov  al,flames[di+160]  ;<- den unten,linken und rechten benachbarten 
        add  bx,ax		;punkt dazu addieren
        mov  al,flames[di-1]
        add  bx,ax
        mov  al,flames[di+1]
        add  bx,ax
        shr  bx,2		;<- die quersumme davon berechnen(=soften)
	jz   @@1		;<- wenn schon 0, dann schon schwarz
	dec  bx			;<- sonst um 1 dunkler machen
@@1:
       	mov  flames[di-160],bl  ;<- punkt in die Flamemap setzen und nach oben  
       	inc  di			;setzten
	cmp di,160*100 		;<- nächsten punkt berechenen 
       	jb   scanning_flames

       	mov  ax,0a000h		
       	mov  es,ax
       	mov  si,offset flames
	add  si,160*30
       	mov  di,320*60
       	mov  bx,66		;<- 96 zeilen (*2..verdopplung der pixel)
@plot_it:
       	mov  cx,160		;<- mit je 160 pixel pro zeile
@@2:
 	mov al,ds:[si]
	mov ah,al
 	mov es:[di],ax		;<- pixel 4mal setzten
 	mov es:[di+320],ax	;damit ist der pixel um 2 getreckt
	inc si
	inc di
	inc di
	loop @@2		;<- alle pixel der zeile setzten

       	add  di,640-320
       	dec  bx
	jnz  @plot_it           ;<- die restlichen zeilen setzten

	in al,60h		;<- wartet auf <esc>
	cmp al,1
	je flamme_ende		;<- dann raus

	jmp flame		;<- sonst wieder neue Flamme

flamme_ende:
	ret      

flame  endp

;************************************************************
;      Initialisiert den Zufallsgenerator
;************************************************************
RandSeed        dd       0

randomize       proc  near   
		mov      ah,2Ch
		int      21h
		mov      Word ptr cs:[RandSeed],cx
		mov      Word ptr cs:[RandSeed+2],dx
		ret
randomize       endp

;************************************************************
;      Berechnet eine Zufallszahl
;************************************************************
; In:  AX - Range
; Out: AX - Value within 0 through AX-1
;************************************************************

random          proc  near
		mov      cx,ax          ; save limit
		mov      ax,Word ptr cs:[RandSeed+2]
		mov      bx,Word ptr cs:[RandSeed]
		mov      si,ax
		mov      di,bx
		mov      dl,ah
		mov      ah,al
		mov      al,bh
		mov      bh,bl
		xor      bl,bl
		rcr      dl,1
		rcr      ax,1
		rcr      bx,1
		add      bx,di
		adc      ax,si
		add      bx,62e9h
		adc      ax,3619h
		mov      word ptr cs:[RandSeed],bx
		mov      word ptr cs:[RandSeed+2],ax
		xor      dx,dx
		div      cx
		mov      ax,dx                  ; return modulus
		ret
random          endp

_code ends

_stack segment use16 public stack 'stack'
db 100h dup (?)
_stack ends

pal segment use16 public 'data'
include palette.inc
pal ends

end main
[ RETURN TO DIRECTORY ]