program Scroller;
var
	scrollVal : byte=0;
	textPointer : ^byte;
	text : cstring = ("                                        ",
					"THIS IS A SAMPLE SCROLLER TEXT",
					 "                                        ");
	const kernal : byte = 0;
	
// Position of scroller
	const ypos : byte = 16;
// Position of scroller raster line
	const yposRaster:byte=$A0;


/*
  The following method just copes the current contents of textPointer to screenmemory
*/
procedure PrintText();
begin
	moveto(0,ypos,hi(#screen_char_loc));
	memcpy(textPointer, 0, screenmemory, screen_width-1);
end;

/*
 	The following method decreases the scroll value. If the value is zero, then
 	the scroll value is reset to 7, the text pointer is increased and a new
 	text is printed to the screen. 
*/
procedure UpdateScrollAndText();
begin
	// Scroll has looped 8 pixels
	if (scrollVal=0) then 
	begin
		// Reset scroll value
		scrollVal:=7; 
		// Increase text pointer
		textPointer+=1;
		// Reset scroller text if string termination "0" is encountered
		if (textPointer[39]=0) then textPointer:=#text;
		// Print new string to the screen
		PrintText();			
	end
	else dec(scrollVal);
end;


// Forward declare "Bottom"

interrupt Bottom();


interrupt Top();
begin
	StartIRQ(kernal);
	screen_bg_col:=red;
	screen_fg_col:=red;
	scrollx(0); // make sure that everythingin the "TOP" layer doesn't scroll
	RasterIRQ(Bottom(),yposRaster,kernal); // bottom os referenced here, so it needs to be forward declared
	// Update text and etc from the "Top" layer
	UpdateScrollAndText();		
	CloseIRQ();
end;



interrupt Bottom();
begin
	StartIRQ(kernal);
	// Wait(3) makes sure that we set the background color when the raster is outside the screen,
	// removing any artifacts
	wait(3);
	screen_bg_col:=black;
	screen_fg_col:=black;
	// Scroll here!
	Scrollx(scrollVal);
	
	RasterIRQ(Top(),$00,kernal);
	CloseIRQ();
end;
/*
	Initializes the screen etc
*/
procedure InitScreen();
begin
	// Clear screen with spaces
	ClearScreen(key_space,screen_char_loc);
	// Fill the upper screen color ram with black
	fill(screen_col_loc,black,0);	
	// Fill the scroll area with light red
	fill(screen_col_loc+ypos*screen_width,light_red,0);	
	
	// Print some static text
	moveto(6,2,hi(screen_char_loc));
	printstring("THIS TEXT IS STATIONARY",0,40);
	
	// Removes the 0th and 39th column on the screen, enabling the "smooth" transition at 
	// the edges. 
	Hideborderx(1);
end;

begin
	InitScreen();
	// Let the text pointer point to the actual text
	textPointer:=#text;
	// Start the raster chain!
	setmemoryconfig(0,1,1,1,0);
	StartRasterChain(Top(), 0,kernal);
	Loop(); 
end.
