{copyright Software Labs. 1983}
{$include:'b:demos.inc'}
implementation of demosunit;

{$include:'b:slib.inc'}      {Screen control routines }
{$include:'b:glib.inc'}      {Graphics       routines }
{$debug-}

const
  msgrow = 23;	msgcol = 0;
  inforow = 22; normal = 2; intensity = 15;
  blanks = '                              ';

var
  currentpage, currentmode, lastscan : integer;  lastch : char;



{***** column - print a column of numbers for labeling color table }
procedure colnum(row, col, snum, diff, count : integer);
var lastrow : integer;
begin
  lastrow := row+count;
  while row < lastrow do begin
    locate(0, row, col);
    putchar(0,normal, 1, chr(snum+ord('0')));
    snum := snum+diff;
    row := row+1;
  end;
end;  {colnum}





{***** lstringwrite - write an lstring at the specific position }
procedure lstringwrite(page, row, col, attribute : integer;const ls:lstring);
begin
  locate( page, row, col );
  putlstring(page, attribute, ls);
end;




{***** header - print the header for color tables }
procedure header;
begin
  screen( currentmode );					{ new screen }
  lstringwrite(currentpage,24,6,intensity,'(C) Copyright software Labs 1983');
  locate(currentpage, 0,32);
  writeln('mode =',currentmode:1);
  lstringwrite(currentpage,2,0,normal,'Locate a color/attribute(0..255)');
  lstringwrite(currentpage,3,0,normal,' by its row number(the first two digits)'
		);
  lstringwrite(currentpage,4,0,normal,' and its column number(the third digit)')
end; { header }



{***** demosdecimal  display all the colors in two tables indexed by decimals}
procedure demosdecimal;
const zeroto9 = '0123456789'; col = 0; startrow = 5;
var  st[static]: array [ 0 .. 1 ] of string(10);
     row, i,lastrow,sti,color  : integer;
value
  st[0] := '**Software'; st[1] := 'Labs(C)*83';

begin
  header;
  lstringwrite(currentpage,0,0,normal,'Color Table(Decimal Index)Mode');
  { the left table color 0 - 129 }
  locate(0, startrow, col+3); putlstring(0,normal,zeroto9);
  colnum(startrow+1,col,0,0,10); colnum(startrow+1,col+1,0,1,10);
  colnum(startrow+11,col,1,0,3); colnum(startrow+11,col+1,0,1,3);
  color := 0;  sti := 1;
  for row := startrow+1 to startrow+1+12 do begin
    locate(0,row,col+3);    if sti = 0 then sti := 1 else sti := 0;
    for i := 1 to 10 do begin
	putchar(0, color, 1,st[sti][i] );
	color := color+1;
    end;
  end;

  { right part for 130-256 }
  locate(0, startrow, col+18); putlstring(0,normal,zeroto9);
  colnum(startrow+1,col+15,1,0,7); colnum(startrow+1,col+16,3,1,7);
  colnum(startrow+8,col+15,2,0,6); colnum(startrow+8,col+16,0,1,6);
  sti := 1;
  for row := startrow+1 to startrow+1+12 do begin
    locate(0,row,col+18);   if sti = 0 then sti := 1 else sti := 0;
    for i := 1 to 10 do begin
       if color < 256 then
	putchar(0, color, 1,st[sti][i]);
       color := color+1;
    end;
  end;
end; {demosdecimal }





{***** demosoctal- display all the character colors by octal indexing }
procedure demosoctal;
const  startcol = 0;

  {***** octalcolor - internal procedure for display color for one table }
  procedure octalcolor(col, snum, color : integer);
  const zeroto7 = '01234567';  startrow = 5;
  var row, i, sti : integer;
      st [static] : array[0 .. 1 ] of string(8);

  value
     st[0] := 'Software'; st[1] := 'Labs*(C)';

  begin
    locate(0, startrow, col+3); putlstring(0,normal,zeroto7);
    colnum(startrow+1,col,snum,0,8); colnum(startrow+1,col+1,0,1,8);
    colnum(startrow+9,col,snum+1,0,8); colnum(startrow+9,col+1,0,1,8);
    sti := 1;
    for row := startrow+1 to startrow+1+15 do begin
      locate(0,row,col+3); if sti = 0 then sti := 1 else sti := 0;
      for i := 1 to 8 do begin
	putchar(0, color, 1,st[sti][i] );
	color := color+1;
      end;
    end;
  end; { octalcolor }



begin	{ main procedure for octal indexing color table }
  header;		{ print the header }
  lstringwrite(0,0,0,normal,'Color Table (Octal index) Mode');

  { left part 0-127 }
  octalcolor(startcol,0,0);

  { right part for 128-256 }
  octalcolor(startcol+15,2,128);
  end; {demosoctal}


{***** pressclear - press to exit }
procedure pressclear;
begin
  lstringwrite(currentpage, msgrow, msgcol, intensity,'Press any key to exit');
  while not inkey( lastch, lastscan) do ; { do nothing }
  screen( currentmode );
end;



{***** demosone -display all the character colors for the current mode }
procedure demos;
var numcolumn : integer;
begin
  currentmode := screenmode(currentpage, numcolumn);
  demosoctal;			{ color indexed by octal }
  pressclear;			{ prompt 'press any key to exit' }
  demosdecimal; 		{ color indexed by decimal }
  pressclear;
end; {demos}



{***** procedure delayawhile - delay unless a key is pressed }
{ returns true if a key is pressed }
{ returns false if no key is pressed in the delay period }
function delayawhile( delay : integer): boolean;
var
  count, i, x : integer;
begin
    delayawhile := false;
    count := 0;
    while not inkey( lastch, lastscan) do { delay unless a key is pressed}
      if count >= delay then return	  { no key is pressed }
      else begin
	for i := 1 to delay do	x := 1; { delay }
	count := count +1;
      end;
    delayawhile := true;
end; { delayawhile }




{***** demosall - demo all the color text table }
procedure demosall;
var
  numcolumn,  savemode : integer;

  {**** modecolor- demostrate all the color table for all the mode }
  procedure modecolor( startmode, endmode : integer);
  var  mode, color, palettenum : integer;
  begin
    for mode :=startmode to endmode do begin {for all the screen modes}
      currentmode := mode;
      demosoctal;				    { color indexed by octal }
      lstringwrite(currentpage,msgrow,msgcol,intensity,
	 'Press any key to enter the Driver mode');
      if currentmode = 1 then
      begin		{25x40 color text mode. display all the boarder color}
	for color := 0 to 31 do begin
	  boarder( color );
	  locate(currentpage, inforow, 0);
	  write('boarder(',color:3,' ) displaying boarder color');
	  if delayawhile(delay) then return;	   { true if a key is pressed}
	end;
	lstringwrite(currentpage, inforow, 0, normal , blanks); {erase message}
      end { currentmode = 1 }
      else
       if currentmode = 4 then	{ 320x200 graphics mode. display all palettes }
       begin
	 for palettenum := 0 to 1 do
	   for color := 0 to 15 do begin
	     palette( palettenum, color);      { palette and background color}
	     locate(currentpage, inforow, 0);
	     write('palette(',palettenum:3,',',color:3,' ) displaying');
	     if delayawhile(delay) then return;
	   end;
	lstringwrite(currentpage, inforow, 0, normal , blanks); {erase message}
	end   { currentmode = 4 }
       else
	 if delayawhile(delay) then return;
      demosdecimal;		    { color indexed by decimal }
      lstringwrite(currentpage,msgrow,msgcol,intensity,
	 'Press any key to enter the Driver mode');
      if delayawhile(delay) then return;
    end; { for }
  end; { procedure modecolor }


begin  { demosall }
  { display color tables for all the modes }
  currentmode := screenmode(currentpage, numcolumn);
  savemode := currentmode;
  if currentmode = 7
  then
    modecolor( 7, 7 )	{ mode 7 to mode 7 }
  else
    modecolor(0, 6);	{ mode 0 to 6 }
  screen( savemode);	{restore screen mode }
  currentmode := screenmode( currentpage, numcolumn);
 end; { demosall }

begin
end.
