function terminal(ttype)
%TERMINAL Set graphics terminal type.
%
%	TERMINAL puts up a menu of graphics terminal types and prompts for
%	a choice.  It then configures MATLAB. You can also specify the
%	terminal type as the first parameter.
%	You can add any terminal settings you may need for your specific
%	emulators/terminals to this file.
%
%	The graphics terminals that are currently supported are:
%
%	tek401x - Tektronix 4010/4014
%	tek4100 - Tektronix 4100
%	tek4105 - Tektronix 4105
%	retro - retrographics card
%	sg100 - Selanar graphics 100
%	sg200 - Selanar graphics 200
%	vt240tek - VT240 & VT340 Tek mode
%	ergo - ergo terminal
%	graphon - graphon terminal
%	citoh - C.Itoh terminal
%	xtermtek - xterm, Tektronix graphics
%	wyse - Wyse WY-99GT
%	kermit - MS-DOS Kermit 2.23
%	hp2647 - Hewlett-Packard 2647
%	versa - Macintosh with VersaTerm (Tektronics 4010/4014)
%	versa4100 - Macintosh with VersaTerm (Tektronics 4100)
%	versa4105 - Color/Grayscale Macintosh with VersaTerm (Tektronics 4105)
%	hds - Human Designed Systems

%       Copyright (c) 1984-93 by The MathWorks, Inc.

if nargin == 0,
	s0 = 'Graphics Terminal Types';
	s1 = 'C.Itoh';
	s2 = 'Ergo';
	s3 = 'Graphon';
	s4 = 'HP 2647';
	s5 = 'Human Designed Systems';
	s6 = 'Kermit';
	s7 = 'Macintosh with VersaTerm (Tektronix 4010/4014)';
	s8 = 'Macintosh with VersaTerm (Tektronix 4100)';
	s9 = 'Macintosh (Color/Grayscale) with VersaTerm (Tektronix 4105)';
	s10 = 'Tektronix 4010/4014';
	s11 = 'Tektronix 4100';
	s12 = 'Tektronix 4105';
	s13 = 'More selections - - - ';
	clc
	i=menu(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);
	if i == 13
		s1 = 'VT100 with Retrographics';
		s2 = 'VT100 with Selanar 100';
		s3 = 'VT100 with Selanar 200';
		s4 = 'VT-240 & VT340 Tek mode';
		s5 = 'Wyse WY-99GT';
		s6 = 'xterm (Tektronics emulation)';
		s7 = 'Cancel';
		clc
		i = i + menu(s0,s1,s2,s3,s4,s5,s6,s7) - 1;
	end
	if i >= 19 | i <= 0
		return
	end
	ttype = i;
else
	termtab = [
		'citoh    '
		'ergo     '
		'graphon  '
		'hp2647   '
		'hds      '
		'kermit   '
		'versa    '
		'versa4100'
		'versa4105'
		'tek401x  '
		'tek4100  '
		'tek4105  '
		'retro    '
		'sg100    '
		'sg200    '
		'vt240tek '
		'wyse     '
		'xtermtek '
	];
	t = 0;
	for tt=1:18,
		l = min(length(ttype),length(termtab(tt,:)));
		if (strcmp(ttype,termtab(tt,1:l))),
			t = tt;
			break;
		end
	end
	if t == 0,
		if ~exist(ttype),
			error(['Invalid terminal type ' ttype]);
		else
			eval(ttype);
			return;
		end
	end
	ttype = t;
end


% Some control characters
esc = 27;
nl = 10;
ret = 13;
ff = 12;
alphamode = 31;
graphmode = 29;
can = 24;
ctrlc = 3;
nul = 0;

% This gets disp'ed at the end after the settings are done
% to initialize certain terminal characteristics right away.
% See Tektronix 4105 below for an example of why you'd want to use this.
init_str = [];


if (ttype == 1),
% C. Itoh
	showgraph = [esc '[H' esc '[2J' esc '1' esc '*'];
	hidegraph = [esc ff esc '8' esc '2' esc '[A'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 2),
% Ergo
	showgraph = [esc '[H' esc '[2J' esc '1' esc '*'];
	hidegraph = [esc ff esc '8' esc '0' esc '2'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 3),
% Graphon
	showgraph = [esc '[H' esc '[2J' esc '1'];
	hidegraph = [esc ff esc '8' esc '2'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 4),
% HP2647
	showgraph = [esc '[H' esc '[2J' esc '&s1p0Q' nul];
	hidegraph = [esc ff esc '8' esc '&s0p0Q' nul esc '*dT'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 5),
% HDS
	showgraph = setstr(graphmode);
	hidegraph = [can esc '[A'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 6),
% Kermit
	showgraph = [esc '[?38h'];
	hidegraph = [esc '[?38l'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 7),
% Versaterm (Tektronix 4010/4014)
	showgraph = [esc '%!8' esc ff graphmode];
	hidegraph = [esc '2'];
	screendepth = 1;
	onewindow = 'no';
	tp = 'tek401x';

elseif (ttype == 8),
% Versaterm (Tektronix 4100)
	showgraph = [esc '%!0' graphmode];
	hidegraph = [esc '%!2'];
	init_str = [esc '%!0' esc 'TF43000' esc 'LI133' esc 'KA0' esc 'LV0'];
	init_str = [init_str esc 'RW `` @8co?_' nl esc 'RA!  ' esc 'MC'];
	screendepth = 1;
	onewindow = 'no';
	tp = 'tek410x';

elseif (ttype == 9),
% Versaterm (Tektronix 4105 color)
	showgraph = [esc '%!0' graphmode];
	hidegraph = [esc '%!2'];
	init_str = [esc '%!0' esc 'TF43000' esc 'LI133' esc 'KA0' esc 'LV0'];
	init_str = [init_str esc 'RW `` @8co?_' nl esc 'RA!  ' esc 'MC'];
	screendepth = 3;
	onewindow = 'no';
	tp = 'tek410x';

elseif (ttype == 10),
% Tektronix 4010/4014
	showgraph = setstr([esc ff]);
	hidegraph = [esc ff esc '8' nl];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 11),
% Tektronix 4100
	showgraph = [esc '%!0' esc 'KA0' esc 'LV0'];
	hidegraph = [alphamode esc 'LV1' esc 'KA1' esc '%!1'];
	init_str = [esc '%!0' esc 'TF43000' esc 'LI133'];
	init_str = [init_str esc 'RW `` @@' nl];
	init_str = [init_str esc 'RA1' esc 'MC' esc 'MN' esc 'MR'];
	init_str = [init_str esc 'LLA>' esc 'LM0' esc 'LBA>' esc '%!1'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek410x';


elseif (ttype == 12),
% Tektronix 4105

% showgraph selects TEK mode, disables the dialog area and makes it invisible
	showgraph = [esc '%!0' esc 'KA0' esc 'LV0'];

% hidegraph selects ALPHA mode, enables the dialog area and makes it visible
% then selects ANSI mode
	hidegraph = [alphamode esc 'LV1' esc 'KA1' esc '%!1'];

% init_str is used to set the following defaults:
%   dialog area colormap's index 3 to (0,0,0) (HSV)
%   window size to the factory default
%   view attributes (background color) for the screen to 0 (factory default)
%   graphtext size to the factory default
%   graphtext character path to the factory default
%   graphtext rotation to the factory default
%   dialog area number of lines to 30
%   dialog area writing mode to REPLACE mode
%   dialog area buffer size to 30 lines
	init_str = [esc '%!0' esc 'TF43000' esc 'LI133'];
	init_str = [init_str esc 'RW `` @@' nl];
	init_str = [init_str esc 'RA1' esc 'MC' esc 'MN' esc 'MR'];
	init_str = [init_str esc 'LBA>' esc 'LLA>' esc 'LM0' esc '%!1'];

% there are 8 colors (tek4105 is a 3-bit machine)
	screendepth = 3;

% tek4105 only has one window
	onewindow = 'yes';
	tp = 'tek410x';

elseif (ttype == 13),
% Retrographics
	showgraph = [esc '[H' esc '[2J' esc ff graphmode];
	hidegraph = [esc ff esc '8' can esc '[A' nl];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 14),
% Selanar 100
	showgraph = [esc '[H' esc '[2J' esc '1' esc '*'];
	hidegraph = [esc ff esc '8' esc '2' esc '[A'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 15),
% Selanar 200
	showgraph = [esc '[H' esc '[2J' esc '1' esc '~6T'];
	hidegraph = [esc ff esc '8' esc '~1T' esc '[A'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 16),
% VT240 Tektronix mode
	showgraph = [esc '[H' esc '[2J' esc '[?38h' esc ff graphmode];
	hidegraph = [esc ff esc '8' ret esc '[?38l' nl];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 17),
% WYSE
	showgraph = [esc '[?38h'];
	hidegraph = [esc '[?38l' esc '[61"p' esc '[A' esc '[41' esc '[?7h'];
	screendepth = 1;
	onewindow = 'yes';
	tp = 'tek401x';

elseif (ttype == 18),
% Xterm Tektronix mode
	showgraph = [esc '[?38h' esc ff];
	hidegraph = setstr([esc ctrlc]);
	screendepth = 1;
	onewindow = 'no';
	tp = 'tek401x';

else
	error ('Invalid terminal type');
end


% Check to see if the terminal protocol is already set.
% If it is already set and what it's currently set to is not what we want
% the user will have to exit MATLAB to change it.
currtp = get(0,'TerminalProtocol');
if ~strcmp(currtp,'none') & ~strcmp(currtp,tp),
	error(['Terminal protocol is already set to ' currtp '.' nl 'In order to switch you must exit MATLAB.']);
end

% Set the other root terminal properties now
set(0,'TerminalShowGraphCommand',showgraph);
set(0,'TerminalHideGraphCommand',hidegraph);
set(0,'ScreenDepth',screendepth);
set(0,'TerminalOneWindow',onewindow);
if ~strcmp(currtp,tp),
	set(0,'TerminalProtocol',tp);
end
disp(init_str);
