/******************************************************************************\
**  Chunky demo (uses Extension) for Secal                                    **
**  Requires Kickstart 2                                                      **
\******************************************************************************/


go main;


def WIDTH=96;								# MULTIPLE OF 16
def HEIGHT=48;
def DEPTH=6;


include "inc/graphics/modeid.inc";

include "ext/ext.inc";				# INTERFACE FOR EXTENSION
inclib "ext/ext.lib";					# USE EXTENSION LIB


#-------------------------------------------------------------------------------


main:
push d2\a2\a3;

x_Init;												# INITIALIZE EXTENSION
if d0 then
	x_GraphicsStart;						# START GRAPHICS SUBSYSTEM
	if d0 then
		x_Scr_Open(EXTRAHALFBRITE_KEY,WIDTH<<1,HEIGHT<<1,DEPTH,0,@scrcolors,0);
		a2:=a0;										# OPEN SCREEN (EHB)

		if a2 then
			x_Scr_AddBmp(a2);			# ADD BUFFER FOR DOUBLE BUFFERING
			if d0 then
				x_SetTaskPri(0,31);		# RAISE TASK PRIORITY

				d2:=0;
				repeat
					call frame;				# RENDER NEXT FRAME

					d2:=d2 xor 1;
					x_Scr_GetBmp(a2,d2); a3:=a0;	# A3=CURRENTLY INVISIBLE BITMAP

					x_C2P_6xy(@chunkybuf,x_bmp(a3).planes,WIDTH,HEIGHT,
										x_bmp(a3).rowwidth,x_bmp(a3).rowdiff);
										# CONVERT CHUNKY BUFFER INTO THE PLANAR BITMAP

					x_Scr_ActivateBmp(a2,d2,-1,-1);	# SWAP DISPLAY BITMAPS
				until [$dff016] and $400=0;	# DIRTY CHECK FOR RIGHT MOUSE BUTTON

				x_RevertTaskPri;		# REVERT TO PREVIOUS PRIORITY
			;
		;
	;
	x_Done;										# CLOSE EXTENSION AND CLEANUP
;

d0.l:=0;

pop d2\a2\a3;
rts;															# MAIN



scrcolors:
dc.l $000000,$130611,$250c22,$381233,$4a1744,$5d1d55,$6f2366,$81295b;
dc.l $942f51,$a63546,$b93a3b,$cb4030,$de4626,$f04c1b,$f15a26,$f36830;
dc.l $f4763a,$f68445,$f7914f,$f99f5a,$faad64,$fcbb6e,$fdc979,$ffd783;
dc.l $ffdc93,$ffe1a2,$ffe6b2,$ffebc1,$fff0d1,$fff5e0,$fffaf0,$ffffff;
											# SCREEN COLORS, RGB8 FORMAT


#-------------------------------------------------------------------------------


# THIS FUNCTION CALCULATES ONE FRAME OF THE "FIRE". FIRST THE TWO EXTRA
# LINES AT THE BOTTOM ARE FILLED WITH RANDOM COLORS. THEN THE NEW COLOR OF
# EACH PIXEL IS CALCULATED FROM THE COLORS OF 4-5 NEIGHBOURING PIXELS BELOW.


frame:
push d2\d3\d4\d5\a2\a3\a4\a5\a6;

a2:=@chunkybuf+HEIGHT*WIDTH;
for d2:=WIDTH-1 downto 0 do
	x_Rnd; [a2+]:=d0 and $1f1f+$0202;
;

a2:=@chunkybuf; d2.l:=0; a3:=0; a4:=[a2+WIDTH];
d3.l:=$3f3f3f3f; d4.l:=$01010101; a5:=$80808080; a6:=$02020202; a1:=$40404040;
d5.l:=(HEIGHT*WIDTH)>>2;

loop:
	move.l a3,d2;  move.l a4,a3;  move.l [a2+WIDTH+4],a4;
	move.l a3,d1;  add.l [a2+WIDTH*2],d1;
	move.l a3,d0;  move.b d2,d0;  ror.l 8,d0;  add.l d0,d1;
	move.l a3,d0;  lsl.l 8,d0;
	move.l a4,d7;  rol.l 8,d7;  move.b d7,d0;  add.l d0,d1;
	move.l a3,d0;  lsr.l 1,d0;  and.l d3,d0;  add.l d0,d1;
	lsr.l 2,d1;  and.l d3,d1;

	add.l a5,d1;  sub.l a6,d1;
	move.l a1,d0;  and.l d1,d0;  lsr.l 5,d0;  add.l d0,d1;
	move.l d1,d0;  lsr.l 5,d0;  and.l d4,d0;  sub.l d0,d1;
	and.l d3,d1;  move.l d1,[a2+];

	subq.l 1,d5;
	bne.b loop;

pop d2\d3\d4\d5\a2\a3\a4\a5\a6;
rts;															# FRAME


#-------------------------------------------------------------------------------


bss;

align 4;
chunkybuf: ds.b (HEIGHT+2)*WIDTH;
												# LONG ALIGNED CHUNKY BUFFER IN THE BSS SECTION,
                        # ONE BYTE FOR EACH PIXEL
code;


#-------------------------------------------------------------------------------

