Metropoli BBS
VIEWER: progp052.pas MODE: TEXT (ASCII)
{***********************************************************************}
{ Fill 'display buffer' with text then display it                	}
{ in a split screen							}
{***********************************************************************}

procedure demo_split_screen;
const
MONO = 5;
VMONO = 7;

KEY_ESC = $1B;
KEY_UP = 72;
KEY_DOWN = 80;
KEY_LEFT = 75;
KEY_RIGHT = 77;
KEY_ENTER = $0D;

digits : array[0..9] of char = '0123456789';
text : string[16] = 'This is line 000';
var
split, i, line, key, size, port : integer;
c : char;
begin
	{--- Set default text mode					}
	i := get_display_type;
	if i = MONO then
		begin
		set_mode(7);
		port := $3B4;
		end
	else if i = VMONO then
		begin
		set_mode(7);
		port := $3B4;
		end
	else
		begin
		set_mode(3);
		port := $3D4;
		end;

	{--- Fill display buffer with text  ---		}
	for i := 0 to 99 do begin
		text[16] := digits[i mod 10];{ Add line number	}
		text[15] := digits[(i div 10) mod 10];
		text[14] := digits[(i div 100) mod 10];
		write_string(i, 0, seg(text),ofs(text));{ Add next line	}
	end;

	{--- Smoothly move in the split line ---		}

	size := get_scanlines div 2;	{ Get number of lines	}
	for i := get_scanlines downto size do
		split_screen(i);
        line := 0;

	{--- Use cursor keys to control the scroll ---  }
	{--- Each line of text takes 80 words so to scroll down 1 line --- }
	{--- we increment CRTC start register by 80 ---	}
	repeat
	key := integer(readkey);
	case key of
					{ Scroll up one scanline}
		KEY_UP:	if line > 0 then line := line - 1
			else line := 0;
		KEY_DOWN: line := line+1;	{ Scroll down one line }
		end;
	write_register(port,$0D);	{Select CRTC start low	}
	write_register(port+1,line*80);	{Write low }
	write_register(port,$0C);	{Select CRTC start hi	}
	write_register(port+1,(line*80) shr 8);	{Write hi }
	
	until key = KEY_ENTER;

	{ --- Reset CRTC start address to zero ---}

	write_register(port,$0D);	{Select CRTC start low	}
	write_register(port+1,0);	{Write low }
	write_register(port,$0C);	{Select CRTC start hi	}
	write_register(port+1,0);	{Write hi }

	{ --- Remove split --- }
	size := get_scanlines;
	for i := (get_scanlines div 2) to size do
		split_screen(i);

end;

[ RETURN TO DIRECTORY ]