Adding a simple demo effect: Part 4

This tutorial corresponds to file “C64/DemoMaker/demo_part4.ras”  in the TRSE tutorials folder.

In this tutorial (covering demo_part4.ras), we will add simple demo effect. Actually, in order to not complicate things, the effect is the same as in the original single-file examples (tutorial_23_sqrt.ras), which calculates either “circles” or “lines” on the screen, and then simply shifts the character set in order to create the illusion of movement.

As in the previous example, we’ll start by adding “scene2” to the main file (in this case, demo_part4.ras)

RasterWait and main loop initialization

In RasterWaiter(), make sure that you point to the new scene


procedure InitSceneRaster();
begin
	if (nextScene=@scene1) then 
		RasterIRQ(RasterScene1(),0,@useKernal);
	if (nextScene=@scene2) then 
		RasterIRQ(RasterScene2(),0,@useKernal);
end;

procedure MainLoopInitScene();
begin
	if (nextScene=@scene1) then 
		InitScene1();
	if (nextScene=@scene2) then 
		InitScene2();

end;

Creating scene2

Next, let’s check out the scene 2 initialization routine:


procedure InitScene2();
begin
	SCREEN_BG_COL:=BLACK;
	SCREEN_FG_COL:=BLACK;
	setbank(VIC_BANK1);
	// Use the 3rd column of the timestamp to specify effect color
	i:=timeStamps[currentPart*4+2];
	// Use the 4th column of the timestamp to specify effect type, 0=lines  1 = circles
	o:=timeStamps[currentPart*4+3];

	clearscreen(i,^$D800);
	enableallram();
	decrunch(charset_c);
	poke(^$01, 0, keep01);
	RenderScene2Effect();
	
	setcharsetlocation($6800);
	settextmode();
	setregularcolormode();

end;

Some comments:

  • As with scene1, we need to access $D000-$DFFF to decrunch the data, so we enable all ram. Remember to restore the memory config with keep01 afterwards.
  • We use column 3 of the timeStamp array (or user data #1) to decide the color of the screen
  • Column 4 of the timeStamp array (user data #2) decides whether we calculate a screen of “lines (0)” or “circles (1)”. The actual procedure that performs this task is called RenderScene2Effect(), and is covered in tutorial 23.
  • Proceed by setting textmode and point character set pointer to $6800.

Scene2 raster

The raster interrupt of scene2 is somewhat simple:


procedure ShiftCharsetData();
begin
	memcpy(^$6800+^@scene2charval*^8, 0, ^$6800+^@scene2charval*^8+^128,8);
	memcpy(^$6800+^@scene2charval*^8+^8, 0, ^$6800+^@scene2charval*^8,^128);
end;

interrupt RasterScene2();
begin
	startirq(@useKernal);
	ProgressTracker();
	ShiftCharsetData();
	closeIRQ();
end;

The only two notable things that happen are:

  • Calling the progress tracker
  • Shifting charset with 8 bytes to create the illusion of movement (works as well with circles as with lines)

Updating timeStamp

Finally, all we need to to is update the timeStamp array;


	timeStamps: array[64] of byte = (		
           @scene1, $6, 0,0, 
           @scene2, $A, 4,0, 
           @scene1, $10,2,0
           @scene2, $14, 5,1, 

Note that we first display image 1, then display “lines (0)” with color 4 = violet, then image 2 and “circles(1)” with color 5 = green.

In the next tutorial, we will add transitions to these effects.