{***********************************************************************}
{ 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;