This tutorial corresponds to file “C64/DemoMaker/demo_part3.ras” in the TRSE tutorials folder.
Ok, so we’ve created the skeleton of our demo, but still lack any effects. Let’s start by adding the most basic of basic effects: displaying an image. When this tutorial is done, you will have a music-playing demo that initializes and decrunches two images (all while playing music) – re-using the same scene code.
Thinking ahead, let’s decide on collecting all our resources into a TRSE Paw file. The idea is simple:
- Keep all resources packed neatly together in a part of memory that is seldom used (like $A000–$F000). Let’s call this “Packed area“
- Whenever you need to set up a scene (with either images or charsets or level data), unpack to bank1 or 2 ($4000-$A000). Let’s call this “Temporary data area“, because the data can be overwritten by the next scene.
- Keep the code below $4000, if you can’t move parts of it to a place where it won’t be overwritten.
A TRSE Paw file is a simple text file where you can add resources (images, charsets, any data) that will be packed together and included automatically into your project. Let’s decide on adding two multicolor images ( 2x data + 2x color info) and a standard character set for some nifty effects. Here’s a screenshot of the packed paw file :
- Compressed files will be packed to a “compressed/” folder within the current project
- The automatically generated .ras include file will be called “packed_resources.ras“. Remember to include this file in your main demo right after the variable declarations.
- The data will be packed to $BB73 (the reason for this address becomes evident afterwards)
- The images unpack to $6000 on bank 1, while the color data is unpacked to $4800 (before being copied to color ram later)
- Character set is located on $6800 om bank 1.
Here’s what the memory setup looks like :
Notice how all the packed data is stuffed directly right after the SID music file – which ends at $BB73. No space wasted!
We’re now ready to create our first scene, an image viewer.
Let’s create a new file in “include/scene1.ras”. In its simplest form a scene must contain two elements:
interrupt RasterScene1(); begin startirq(@useKernal); ProgressTracker(); closeIRQ(); end; procedure InitScene1(); begin end;
Now make sure that these two methods are used in the main demo ras file
procedure InitSceneRaster(); begin if (nextScene=@scene1) then RasterIRQ(RasterScene1(),0,@useKernal); end; procedure MainLoopInitScene(); begin if (nextScene=@scene1) then InitScene1(); end;
Initializing the scene
This is quite straight-forward: Set VIC data location, decrunch data, copy colors, done! We also use a little trick to be able to reuse the scene all while displaying different images:
procedure InitScene1(); begin SCREEN_BG_COL:=BLACK; SCREEN_FG_COL:=BLACK; setbank(VIC_BANK1); // Use the 3rd column of the timestamp to specify index of the packed data! i:=timeStamps[currentPart*4+2]; // Enable reading $D000-$DFFF enableallram(); // Decrunch image data to $6000 decrunchfromindex(packed_data_addresses,i); // Decrunch color data to $4800 decrunchfromindex(packed_data_addresses,i+1); // Restore memory config poke(^$01, 0,keep01); // Copy color data to bank 1 and $D800 copyimagecolordata(^$4800,1); // Enable multicolor bitmap image at location $6000 poke(VIC_DATA_LOC, 0,$18); setbitmapmode(); setmulticolormode(); end;
- Don’t turn on screen or change to bitmap graphics until the very end
- We use the 3rd column of the timeStamp array (user data #1) as the *index* of which crunched data to decrunch. Remember the image of the .paw file above? The 0th index corresponds to image1_data, index 1 is image1_color, index 2 is image2_data etc…. This way, we can reuse scene1 as a generic image displayer.
- Since our crunched data overlaps $D000-$DFFF (reserved for the VIC), we need to enable all ram before decrunching. Original memory configuration is restored afterwards (value in keep01)
- Finally, copy the color information and turn on multicolor bitmap mode with data located at $6000!
Finally, let’s set up the scene timestamps to show our two fabulous images. In the main ras file, change the timeStamps to
timeStamps: array of byte = ( @scene1, $7, 0,0, @scene1, $10,2,0 );
When running this tutorial demo (part 3), you’ll have to wonderful images that load and decrunch (at time4=$7 and $10) while the music is playing in the background.
In the next tutorial, we will be adding a character based effect as the second scene, and provide transitions to all our effects.