DOSSEG ; Order the program to order it's segments in the ; same way that high level languages do. .MODEL SMALL ; Different models : ; Tiny : Code + Data < 64k (can be made a COM file) ; Small : Code < 64k ; Data < 64k ; Medium : Code > 64k ; Data < 64k ; Compact: Code < 64k ; Data > 64k ; Large : Code > 64k ; Data > 64k ; Huge : Arrays > 64k .286 ; Enable 286 instructions .STACK 200h .DATA ; Tells compiler that data is to follow. endmessage db "This was the Fire Effect - denthor@beastie.cs.und.ac.za$" ; This is our end message. Must be terminated with a "$" xsize = 80 ; The x-width of our screen in pixels ysize = 112 ; The y-height of our screen in pixels, plus a few extra randseed dw ? ; any number for randomness pallette db 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0,10 db 2, 0,10, 4, 0, 9, 6, 0, 9, 8, 0, 8,10, 0, 7,12, 0, 7,14, 0, 6,16, 0, 5 db 18, 0, 5,20, 0, 4,22, 0, 4,24, 0, 3,26, 0, 2,28, 0, 2,30, 0, 1,32, 0, 0 db 32, 0, 0,33, 0, 0,34, 0, 0,35, 0, 0,36, 0, 0,36, 0, 0,37, 0, 0,38, 0, 0 db 39, 0, 0,40, 0, 0,40, 0, 0,41, 0, 0,42, 0, 0,43, 0, 0,44, 0, 0,45, 0, 0 db 46, 1, 0,47, 1, 0,48, 2, 0,49, 2, 0,50, 3, 0,51, 3, 0,52, 4, 0,53, 4, 0 db 54, 5, 0,55, 5, 0,56, 6, 0,57, 6, 0,58, 7, 0,59, 7, 0,60, 8, 0,61, 8, 0 db 63, 9, 0,63, 9, 0,63,10, 0,63,10, 0,63,11, 0,63,11, 0,63,12, 0,63,12, 0 db 63,13, 0,63,13, 0,63,14, 0,63,14, 0,63,15, 0,63,15, 0,63,16, 0,63,16, 0 db 63,17, 0,63,17, 0,63,18, 0,63,18, 0,63,19, 0,63,19, 0,63,20, 0,63,20, 0 db 63,21, 0,63,21, 0,63,22, 0,63,22, 0,63,23, 0,63,24, 0,63,24, 0,63,25, 0 db 63,25, 0,63,26, 0,63,26, 0,63,27, 0,63,27, 0,63,28, 0,63,28, 0,63,29, 0 db 63,29, 0,63,30, 0,63,30, 0,63,31, 0,63,31, 0,63,32, 0,63,32, 0,63,33, 0 db 63,33, 0,63,34, 0,63,34, 0,63,35, 0,63,35, 0,63,36, 0,63,36, 0,63,37, 0 db 63,38, 0,63,38, 0,63,39, 0,63,39, 0,63,40, 0,63,40, 0,63,41, 0,63,41, 0 db 63,42, 0,63,42, 0,63,43, 0,63,43, 0,63,44, 0,63,44, 0,63,45, 0,63,45, 0 db 63,46, 0,63,46, 0,63,47, 0,63,47, 0,63,48, 0,63,48, 0,63,49, 0,63,49, 0 db 63,50, 0,63,50, 0,63,51, 0,63,52, 0,63,52, 0,63,52, 0,63,52, 0,63,52, 0 db 63,53, 0,63,53, 0,63,53, 0,63,53, 0,63,54, 0,63,54, 0,63,54, 0,63,54, 0 db 63,54, 0,63,55, 0,63,55, 0,63,55, 0,63,55, 0,63,56, 0,63,56, 0,63,56, 0 db 63,56, 0,63,57, 0,63,57, 0,63,57, 0,63,57, 0,63,57, 0,63,58, 0,63,58, 0 db 63,58, 0,63,58, 0,63,59, 0,63,59, 0,63,59, 0,63,59, 0,63,60, 0,63,60, 0 db 63,60, 0,63,60, 0,63,60, 0,63,61, 0,63,61, 0,63,61, 0,63,61, 0,63,62, 0 db 63,62, 0,63,62, 0,63,62, 0,63,63, 0,63,63, 1,63,63, 2,63,63, 3,63,63, 4 db 63,63, 5,63,63, 6,63,63, 7,63,63, 8,63,63, 9,63,63,10,63,63,10,63,63,11 db 63,63,12,63,63,13,63,63,14,63,63,15,63,63,16,63,63,17,63,63,18,63,63,19 db 63,63,20,63,63,21,63,63,21,63,63,22,63,63,23,63,63,24,63,63,25,63,63,26 db 63,63,27,63,63,28,63,63,29,63,63,30,63,63,31,63,63,31,63,63,32,63,63,33 db 63,63,34,63,63,35,63,63,36,63,63,37,63,63,38,63,63,39,63,63,40,63,63,41 db 63,63,42,63,63,42,63,63,43,63,63,44,63,63,45,63,63,46,63,63,47,63,63,48 db 63,63,49,63,63,50,63,63,51,63,63,52,63,63,52,63,63,53,63,63,54,63,63,55 db 63,63,56,63,63,57,63,63,58,63,63,59,63,63,60,63,63,61,63,63,62,63,63,63 ; Our pallette ... generated elsewhere and brought in screen db xsize*ysize dup (?) ; Virtual screen .CODE ; Tells compiler that code is to follow. Random proc near mov ax,[RandSeed] mov dx,8405h mul dx ; ax*dx with result in dx:ax inc ax mov [RandSeed],ax ret ; Return back to main section Random endp SetUpScreen proc near mov ax,0013h int 10h ; Get into 320x200x256 MCGA mode. mov ax,0a000h mov es,ax xor di,di ; ES:DI is now pointing to the top left hand of the screen cli cld mov dx,3c4h mov ax,604h ; Enter unchained mode out dx,ax mov ax,0F02h ; All planes out dx,ax xor ax,ax mov cx,32767 rep stosw ; Clear the screen mov dx,3D4h mov ax,14h ; Disable dword mode out dx,ax mov ax,0E317h ; Enable byte mode. out dx,ax out dx,ax mov ax,00409h ; Cell height out dx,ax mov si, offset [pallette] mov dx, 3c8h ; Pallette write register mov al, 0 out dx, al ; Start at color zero inc dx mov cx, 768 @PalLoop : outsb ; Write value to port; inc DI dec cx jnz @PalLoop ret SetUpScreen endp START: mov ax,@DATA mov ds,ax ; Moves the segment of the data into DS. call SetUpScreen mov randseed,1234h mov si,offset [screen] mov cx,xsize*ysize xor ax,ax rep stosb ; Clear our virtual screen. @MainLoop : ; ; This next bit puts either 0 or 255 along the very ; bottom row of our virtual screen. ; mov si,offset [screen] add si,xsize*ysize sub si,xsize ; si=ofs(screen)+xsize*ysize-xsize ie. start of last row mov cx,xsize ; loop the entire last row xor dx,dx @Newline : call random mov ds:[si],dl inc si dec cx jnz @Newline ; ; This "softens" the values in the virtual array, ; creating a fire effect. ; mov cx,xsize*ysize sub cx,xsize mov si,offset [screen] add si,xsize @FileLoop : xor ax,ax mov al,ds:[si] add al,ds:[si+1] adc ah,0 add al,ds:[si-1] adc ah,0 add al,ds:[si+xsize] adc ah,0 shr ax,2 jz @zero dec ax @Zero : ; al = ((pos)+(pos+1)+(pos-1)+(pos+80))/4 - 1 mov ds:[si-xsize],al inc si dec cx jnz @FileLoop ; ; This dumps our virtual screen to the VGA screen. ; mov dx, 3dah l1: in al, dx and al, 8h jnz l1 l2: in al, dx and al, 8h jz l2 mov cx,xsize*ysize shr cx,1 mov si,offset [screen] xor di,di rep movsw mov ah,01 int 16h ; Has a key been pressed? jz @MainLoop ; If not, carry on. mov ah,0 int 16h ;get a key, returned in AX ;this is just to clear the keyboard buffer of the key ;press. mov ax,0003h int 10h ; Get into 80x25 text mode mov dx,offset [endmessage] mov ah,09h int 21h ; Dos interrupt 21, subfunction 09 ... print string. ; DS:DX must be pointing to start of string. mov ax,4c00h ; This function exits the program int 21h ; and returns control to DOS. END START