Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0135/comp/mmista.lst
There are no other files named mmista.lst in the archive.
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    1
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	00030	COMMENT* package for control of display terminals*; OPTIONS(/l/e);
	00060	COMMENT* Copyright (c) Swedish National Defense Research Institute*;
	00120	COMMENT COMMENT%IF SIMULATION marks places to be modified to put
	00150	vista as a subclass to simulation;
	00180	COMMENT COMMENT%IF MVISTA marks places to give simplified
	00210	minivista for use by VIDED package;
	00240	COMMENT COMMENT%IF MACRO generates MACRO-10 program code defining
	00270	global variables only;
	00300	COMMENT COMMENT%IF CALLMAC generates SIMULA code calling MACRO
	00330	versions of some procedures;
	00360	
	00900	
	00960	EXTERNAL CHARACTER PROCEDURE getch;
	00990	EXTERNAL TEXT PROCEDURE maketext;
	01110	EXTERNAL CHARACTER PROCEDURE fetchar;
	01140	EXTERNAL PROCEDURE depchar, outstring, forceout;
	01170	EXTERNAL PROCEDURE echo, abort, outchr;
	01200	EXTERNAL INTEGER PROCEDURE trmop, gettab, checkint;
	01230	EXTERNAL BOOLEAN PROCEDURE meny;
	01260	EXTERNAL TEXT PROCEDURE storbokstav, scanto;
	01290	EXTERNAL CLASS termty;
	01350	EXTERNAL PROCEDURE vtmcur, vtsynk, vtisng;
	01380	EXTERNAL PROCEDURE outche; EXTERNAL INTEGER PROCEDURE iondx;
	01680	CLASS mmista;
B1	01950	BEGIN
	02070	CLASS mvistax
	02250	(width, height, terminalin, terminalout, q_echoenabled,
	02280	terminaltype
	02490	,trmspeed);
	02580	INTEGER width; ! Screen width or less;
	02610	INTEGER height; ! Screen height or less;
	02670	REF (infile) terminalin; ! From the terminal, usually sysin;
	02700	REF (printfile) terminalout; ! To the terminal, usually sysout;
	02730	BOOLEAN q_echoenabled; ! TRUE = monitor echo, FALSE = program echo;
	02910	INTEGER terminaltype; ! Number of terminal type, 0 for not given;
	03060	INTEGER trmspeed;
	 3061
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    2
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	04350	VIRTUAL: PROCEDURE restore_the_whole_screen;
B2	04410	BEGIN
	04440	
	04470	
	04860	BOOLEAN scrollallow; ! Allow <LF> to scroll the screen;
	04920	BOOLEAN direct_cursor_addressing; ! Move cursor that way;
	04950	BOOLEAN allow_cr; ! Allow sending of <CR> code to the terminal;
	05100	BOOLEAN synka; ! Cursor may be at wrong place on terminal screen;
	05130	BOOLEAN unknownchar; ! Last read character was untreated char < ' ';
	05160	BOOLEAN synchronizing; ! True during "synchronize" action only;
	05190	INTEGER cpunumber; ! From monitor tables;
	05220	INTEGER vt52; ! code for DEC VT52 terminal type;
	05250	INTEGER minitec; ! code for TEC minitec terminal type;
	05280	INTEGER elite; ! code for elite 2500 with auto-<LF> at <CR>;
	05310	INTEGER kthelite; ! code for elite 2500 without auto-<LF> at <CR>;
	05340	INTEGER infoton; ! code for infoton vista terminal type;
	05370	INTEGER newelite; ! code for elite 1500 with auto-<LF> at <CR>;
	05400	INTEGER newkthelite; ! code for elite 1500 without auto-<LF> at <CR>;
	05430	INTEGER teletec; ! code for TEC teletec terminal type;
	05460	INTEGER sattelite; ! code for INFOTON vistar sattelite;
	05490	INTEGER tandberg; ! code for TANDBERG TDV 2000 terminal type;
	05520	INTEGER beehive; ! code for minibee and BEEHIVE B 100 terminals;
	05580	INTEGER cdc71310s; ! CDC 713-10 terminals, scroll mode;
	05610	INTEGER cdc71310p; ! CDC 713-10 terminals, page mode;
	05760	INTEGER elite3025; ! Datamedia Elite 3025 terminal;
	05790	INTEGER elite1521; ! Datamedia Elite 1521 terminal;
	05850	INTEGER volkerd404; ! Volker 404 terminal;
	05880	INTEGER volker414h; ! Volker 414h terminal;
	06030	INTEGER buginfoton; ! Infoton without erase line feature;
	06060	INTEGER i200; ! Infoton I 200 terminal;
	06090	INTEGER adm3a; ! ADM 3 A terminal;
	06120	INTEGER vt100; ! Digital VT 100 terminal in Vt52 mode;
	06150	INTEGER fut3; ! Reserved for future terminal models;
	06180	INTEGER fut2; ! Reserved for future terminal models;
	06210	INTEGER fut1; ! Reserved for future terminal models;
	06240	INTEGER otherdisplay; ! Unknown display terminal;
	06270	INTEGER maxterminals; ! 1 more than highest terminal type number;
	06300	INTEGER ttyform; ! tty form setting before being called;
	06450	INTEGER q_verticalpos; ! Current cursor position vertically;
	06480	INTEGER q_horizontalpos; ! Current cursor position horizontally;
	06630	INTEGER widthm1; ! One less than screen width;
	06660	INTEGER heightm1; ! One less than screen height;
	06810	INTEGER ioindex; ! comment for sysout, used by outche;
	06840	CHARACTER lowintens; ! change to low intensity on screen;
	06870	CHARACTER highintens; ! change to high intensity on screen;
	06900	CHARACTER up; ! cursor up;
	06930	CHARACTER left; ! cursor left;
	06960	CHARACTER right; ! cursor right;
	06990	CHARACTER down; ! cursor movement codes;
	07020	CHARACTER formfeed; ! ASCII character;
	07050	CHARACTER eraseline; ! Erases rest of line on some terminals;
	07080	CHARACTER delayer;
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   2-1
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	07110	CHARACTER home; ! code to move cursor to upper left screen corner;
	07140	COMMENT* ON CDC 713-10, this code moves to lower left corner*;
	07170	CHARACTER carriagereturn; ! ASCII character;
	07200	CHARACTER altmode; ! ASCII ESCAPE character, decimal 27;
	07230	CHARACTER restorechar; ! code which, when given from terminal
	07260	;! causes screen to be restored (usually = altmode);
	07290	CHARACTER linefeed; ! ASCII character;
	07320	CHARACTER verttab; ! ASCII vertical tab character;
	07350	CHARACTER null; ! ASCII character with decimal 0 value;
	07380	CHARACTER tab; ! ASCII horizontal tab (HT) character;
	07410	CHARACTER insline; ! inserts line on some terminal models;
	07440	CHARACTER delline; ! deletes line on some terminal models;
	07470	CHARACTER inschar; ! inserts character on some terminal models;
	07500	CHARACTER delchar; ! deletes character on some terminal models;
	07560	CHARACTER q_gotchar; ! Character inputted from the terminal;
	07680	CHARACTER startblink; ! Code to start blinking on terminal screen;
	07710	CHARACTER bell; ! ASCII character;
	07740	CHARACTER stopblink; ! Code to stop blinking on terminal screen;
	07770	CHARACTER fill; ! Character with decimal value 127, RUB OUT code;
	07800	CHARACTER erasescreen; ! Code to make the whole screen blank;
	07860	CHARACTER address_screen; ! Code to start direct cursor addressing;
	07890	
	07920	BOOLEAN line_erasable; ! True if eraseline is effective;
	07950	INTEGER lineinsfillers; ! Number of fillers after insert line;
	08160	BOOLEAN addaltmode; ! Terminal control codes to be preceded by ESC;
	08190	BOOLEAN upsingle; ! TRUE = no escape in front of cursor up;
	08220	BOOLEAN downsingle;
	08250	BOOLEAN leftsingle;
	08280	BOOLEAN rightsingle;
	08310	BOOLEAN homesingle;
	08340	BOOLEAN clearsingle; ! TRUE = no escape in front clear screen;
	08370	BOOLEAN linesingle; ! TRUE = no escape in front of clear line;
	08430	BOOLEAN q_display_output; ! Screen is to be output to the terminal;
	08550	BOOLEAN badscreen; ! Terminal screen may be jumbled;
	08580	BOOLEAN controlchar; ! Last input char was terminal control code;
	08610	BOOLEAN ttyqz; ! Local for QZ computer centre;
	08640	BOOLEAN ttyzq; ! Local for QZ computer centre;
	08670	
	08730	TEXT deleteline; ! Removes line, scrolls rest of screen up;
	08760	TEXT insertline; ! Adds blank line, scroll rest down;
	08790	TEXT deletechar; ! Removes char, shifts rest to the left;
	08820	TEXT eraseeol; ! Erase to end of line;
	08850	TEXT insertchar; ! insert character;
	09120	TEXT leftimage; ! Image with left code in first position;
	09390	TEXT extraparameters;
	09420	
	09540	TEXT ARRAY screen[0:height-1]; ! Internal copy of screen contents;
	 9541
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    3
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	10320	PROCEDURE echon;
B3	10350	BEGIN COMMENT to start monitor echoing of input characters;
	10380	  !z_t(1); !z_t(-2); q_echoenabled:= TRUE;
	10410	  IF q_display_output THEN echo(terminalin,4);
E3	10440	END;
	10470	
	10500	PROCEDURE echoff;
B4	10530	BEGIN COMMENT to start program echoing of input characters;
	10560	  !z_t(-1); !z_t(2); q_echoenabled:= FALSE;
	10590	  IF q_display_output THEN echo(terminalin,2);
E4	10620	END;
	10621
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    4
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	10650	PROCEDURE resume_display;
	10680	COMMENT to start displaying the picture on the terminal screen;
	10710	IF NOT q_display_output THEN
B5	10740	BEGIN !z_t(3); !z_t(-4); q_display_output:= TRUE;
	10860	  echo(terminalin,IF q_echoenabled THEN 4 ELSE 2);
E5	10890	END;
	10920	
	10950	PROCEDURE cancel_display;
	10980	COMMENT to stop displaying the picture on the terminal screen;
	11010	IF q_display_output THEN
B6	11040	BEGIN !z_t(-3); !z_t(4); COMMENT erase screen;
	11070	  IF addaltmode AND NOT homesingle THEN
	11100	  outchr(terminalout,altmode,1);
	11130	  outchr(terminalout,home,1);
	11160	  IF addaltmode AND NOT clearsingle
	11190	  THEN outchr(terminalout,altmode,1);
	11220	  outchr(terminalout,erasescreen,1); outchr(terminalout,delayer,10);
	11250	  forceout(terminalout);
	11280	  q_display_output:= FALSE;
	11310	  echo(terminalin,4);
E6	11340	END;
	11341
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    5
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	11670	CHARACTER PROCEDURE get_char_from_screen(h, v);
	11700	  COMMENT: If (h,v) indicates a position on the screen, then the
	11730	  character in that position is returned. If (h, v) indicates a
	11760	  position outside the screen, then char(0) is returned;
	11790	INTEGER h, v;
	11820	IF v >= 0 AND v <= height THEN
B7	11850	BEGIN
	11880	  get_char_from_screen:= fetchar(screen(v),h+1);
E7	11910	END;
	11911
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    6
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	11970	PROCEDURE specialtext;
	12000	COMMENT depending on terminal type, this procedure may give
	12030	text which is low intensity, inverse video or underlined. Does
	12060	not work on all terminal types;
	12090	IF lowintens NE char(0) THEN
B8	12120	BEGIN
	12150	  IF addaltmode THEN outchr(terminalout,altmode,1);
	12180	  IF terminaltype = elite3025 THEN outchr(terminalout,'O',1);
	12210	  outchr(terminalout,lowintens,1);
E8	12240	END;
	12270	
	12300	PROCEDURE normaltext;
	12330	IF highintens NE char(0) THEN
B9	12360	BEGIN
	12390	        COMMENT indicate normal text again by intensity
	12420	        shift or normal video;
	12450	  IF addaltmode THEN outchr(terminalout,altmode,1);
	12480	  IF terminaltype = elite3025 THEN outchr(terminalout,'O',1);
	12510	  outchr(terminalout,highintens,1);
	12540	  outchr(terminalout,delayer,1);
E9	12570	END;
	12600	
	12601
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    7
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	13890	PROCEDURE synchronize(hnew, vnew);
	13920	  COMMENT: If there is a risk that the program does not know where
	13950	  the cursor is on the screen, then this procedure will anyway for
	13980	  sure move the cursor to the position (hnew, vnew);
	14010	INTEGER hnew, vnew;
	14310	vtsynk(heightm1,hnew,vnew);
	14311
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    8
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	16440	PROCEDURE move_the_cursor_to(horiz, vertic);
	16470	  COMMENT: Will move the cursor to the position(horiz, vertic) on
	16500	  the screen;
	16530	INTEGER horiz, vertic;
	16590	  vtmcur(cpunumber,horiz,vertic);
	16591
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE    9
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	20550	PROCEDURE outchar(setchar);
	20580	  COMMENT  Will output the character "setchar" onto the place where
	20610	  the cursor is on the screen. Thereafter, the cursor is advanced to
	20640	  the position after the outputted character;
	20670	CHARACTER setchar;
B10	20700	BEGIN
B11	20730	  BEGIN
	20760	    IF setchar = fill THEN setchar:= ' ' ELSE
	20790	    IF setchar < ' ' THEN
B12	20820	    BEGIN
	20850	      IF terminaltype <= 2 THEN !infoton or vt52;
B13	20880	      BEGIN
	20910	        IF setchar NE startblink AND setchar NE stopblink
	20940	        THEN setchar:= ' ' ELSE outchr(terminalout,bell,1);
E13	20970	      END ELSE setchar:= ' ';
E12	21000	    END;
	21030	    IF q_display_output THEN outchr(terminalout,setchar,1);
	21060	    depchar(screen[q_verticalpos],q_horizontalpos+1,setchar);
E11	21090	  END;
	21120	  q_horizontalpos:= q_horizontalpos+1;
	21150	  IF q_horizontalpos = width THEN
B14	21180	  BEGIN
	21210	    synchronize(0,q_verticalpos+1);
E14	21240	  END;
E10	21270	END;
	21271
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   10
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	21900	PROCEDURE outimage;
	21930	  COMMENT: Will output any characters in the terminalout.image
	21960	  buffer and will then move the cursor to the beginning of the
	21990	  next line on the screen;
	22020	INSPECT terminalout DO
B15	22050	BEGIN
	22080	  CHARACTER lastout;
	22110	  IF q_display_output THEN
B16	22140	  BEGIN
	22170	    IF allow_cr AND terminaltype NE tandberg THEN
B17	22200	    BEGIN outchr(terminalout,carriagereturn,1);
	22230	      outchr(terminalout,linefeed,1);
E17	22260	    END ELSE
B18	22290	    BEGIN
	22320	      move_the_cursor_to(0,q_verticalpos+1);
	22350	      q_verticalpos:= q_verticalpos-1;
E18	22380	    END;
E16	22410	  END;
	22440	  IF allow_cr OR NOT q_display_output THEN
	22470	  q_verticalpos:= q_verticalpos+1;
	22500	  IF q_verticalpos >= height THEN q_verticalpos:=
	22530	  q_verticalpos-height;
	22560	  q_horizontalpos:= 0;
	22590	  forceout(terminalout);
E15	22620	END;
	22621
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   11
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	22650	PROCEDURE outtext(tt); NAME tt; TEXT tt;
	22680	COMMENT: Will output a text string onto the screen;
B19	22710	BEGIN TEXT screenpart;
	22740	  ! screenpart is part of screen to which t is to be output;
	22770	  IF tt.length+q_horizontalpos <=width THEN
B20	22800	  BEGIN
	22830	    !z_t(6);
	22860	    screenpart:- screen[q_verticalpos].
	22890	    sub(q_horizontalpos+1,tt.length);
	22920	    screenpart:= tt;
	22950	    IF q_display_output THEN
B21	22980	    BEGIN
	23010	      outstring(terminalout,screenpart);
E21	23040	    END;
	23070	    q_horizontalpos:= q_horizontalpos+tt.length;
	23220	    !z_t(-6);
E20	23250	  END;
E19	23280	END;
	23281
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   12
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	23310	PROCEDURE make_blank(size); INTEGER size;
	23340	  COMMENT will make part of the screen blank, beginning at the
	23370	  current cursor position, and continuing size characters;
B22	23400	BEGIN
	23430	  TEXT notblankpart;
	23460	  notblankpart:- screen[q_verticalpos]
	23490	  .sub(q_horizontalpos+1,size).strip;
	23520	  notblankpart:= NOTEXT;
	23550	  IF q_display_output THEN
B23	23580	  BEGIN
	23610	    IF (IF line_erasable THEN
	23640	    size + q_horizontalpos >= width ELSE FALSE) THEN
B24	23670	    BEGIN IF terminaltype = i200 THEN
B25	23700	      BEGIN IF q_horizontalpos > 0 THEN GOTO blankit;
E25	23730	      END; ! since erase line blanks the whole line;
	23760	      outstring(terminalout,eraseeol);
E24	23790	    END ELSE blankit: outchr(terminalout,' ',notblankpart.length);
E23	23820	  END;
	23850	  q_horizontalpos:= q_horizontalpos+notblankpart.length;
E22	23880	END;
	23881
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   13
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	37170	PROCEDURE home_the_cursor;
	37200	  COMMENT: Will move the cursor to the position (0,0),
	37230	  the upper left corner of the screen;
B26	37260	BEGIN
	37290	  IF q_display_output THEN
B27	37320	  BEGIN
	37350	    IF addaltmode AND NOT homesingle THEN
	37380	    outchr(terminalout,altmode,1) ELSE
	37410	    outchr(terminalout,home,1);
	37440	    outchr(terminalout,home,1);
	37470	    IF terminaltype = cdc71310s THEN outchr(terminalout,up,heightm1);
E27	37500	  END;
	37530	  q_verticalpos:= q_horizontalpos:= 0;
E26	37560	END;
	37561
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   14
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	37590	PROCEDURE blank_the_screen;
	37620	COMMENT: Will make the whole screen blank.;
B28	37650	BEGIN
	37680	  INTEGER h, v;
	37710	  FOR v:= 0 STEP 1 UNTIL heightm1 DO
	37740	  screen[v]:= NOTEXT;
	37770	  IF q_display_output THEN
B29	37800	  BEGIN
	37830	    home_the_cursor;
	37860	    IF addaltmode AND NOT clearsingle
	37890	    THEN outchr(terminalout,altmode,1);
	37920	    outchr(terminalout,erasescreen,1); outchr(terminalout,delayer,10);
	37950	    home_the_cursor;
	37980	    echo(terminalin,IF q_echoenabled THEN 4 ELSE 2);
E29	38010	  END;
E28	38040	END;
	38041
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   15
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	38070	COMMENT Execution of the CLASS VISTA starts here with initialization
	38100	of local variables;
	38400	trmop(8r2017,terminalout,0); !.TTY FILL 0, please monitor no fill
	38430	 chars;
	38460	allow_cr:= TRUE; infoton:= 1; vt52:= 2;
	38490	minitec:= 3; elite:= 4; kthelite:= 5;
	38520	newelite:= 6; newkthelite:= 7; teletec:= 8;
	38550	sattelite:= 9; tandberg:= 10; beehive:= 11; cdc71310s:= 12;
	38580	cdc71310p:= 13; elite3025:= 14; elite1521:= 15;
	38610	volkerd404:= 16; volker414h:= 17; buginfoton:= 18;
	38640	i200:= 19; adm3a:= 20; vt100:= 21;
	38670	
	38700	cpunumber:= gettab(8r11,8r20); ! Get CPU number from monitor tables;
	38730	IF cpunumber = 1215 !QZ computer centre in Stockholm; THEN
B30	38760	BEGIN
	38790	  ttyqz:= trmop(8r1777,terminalout,1) = 1 !.TTY QZ = TRUE;;
	38820	  ttyzq:= trmop(8r1776,terminalout,1) = 1 !.TTY ZQ = TRUE;;
E30	38850	END;
	38880	IF trmspeed <= 0 THEN
B31	38910	BEGIN
	38940	  trmspeed:= trmop(8r1031,terminalout,0);
	38970	  trmspeed:= IF trmspeed = 1 THEN 50 ELSE IF trmspeed = 2 THEN
	39000	  75 ELSE IF trmspeed = 3 THEN 110 ELSE IF trmspeed = 4 THEN 135
	39030	  ELSE IF trmspeed = 5 THEN 150 ELSE IF trmspeed = 6 THEN 200
	39060	  ELSE IF trmspeed = 7 THEN 300 ELSE IF trmspeed = 8 THEN 600
	39090	  ELSE IF trmspeed = 9 THEN 1200 ELSE IF trmspeed = 9 THEN 1800
	39120	  ELSE IF trmspeed = 10 THEN 1800 ELSE IF trmspeed = 11 THEN 2400
	39150	  ELSE IF trmspeed = 12 THEN 4800 ELSE IF trmspeed = 13 THEN 9600
	39180	  ELSE 2400;
E31	39210	END;
	39240	
	39270	lineinsfillers:= trmspeed*trmspeed*0.0000011464+trmspeed*0.0040327
	39300	-2.548; IF lineinsfillers < 0 THEN lineinsfillers:= 0;
	39330	
	39360	ioindex:= iondx(terminalout);
	39390	IF terminalout.image.length < width THEN terminalout.image:-
	39420	blanks(width);
	39450	IF terminalin.image.length < width THEN terminalin.image:-
	39480	blanks(width);
	39510	restorechar:= altmode:= char(27); linefeed:= char(10);
	39540	bell:= char(7); verttab:= char(11); null:= char(0);
	39570	delayer:=
	39600	fill:= char(127); tab:= char(9); carriagereturn:= char(13);
	39630	formfeed:= char(12); ttyform:= -1;
	39631
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   16
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	40200	INSPECT terminalout DO INSPECT terminalin DO
B32	40230	BEGIN CHARACTER c; TEXT typec; BOOLEAN tmpfound;
	40260	  IF FALSE THEN bad:
B33	40290	  BEGIN
	40320	    outtext("I cannot cope with your terminal specification."
	40350	    ); outimage; terminaltype:= 0;
E33	40380	  END;
	40381
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   17
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	41760	  zeroterminal: IF terminaltype = 0 OR
	41790	  terminaltype = otherdisplay THEN
B34	41820	  BEGIN
	41850	    terminaltype:= otherdisplay;
	41880	    outtext(
	41910	    "Push the following keys in sequence on your terminal:"
	41940	    ); outimage;
	41970	    outtext(
	42000	    "Cursor down, cursor up, cursor right, cursor left,");
	42030	    outimage;
	42060	    outtext("cursor home, erase screen, carriage return.");
	42090	    outimage;
	42120	    extraparameters:- blanks(20);
	42150	    loop:
	42210	    c:= getch;
	42330	    IF c NE carriagereturn THEN
B35	42360	    BEGIN extraparameters.putchar(c); GOTO loop;
E35	42390	    END;
	42420	    extraparameters:-
	42450	    extraparameters.sub(1,extraparameters.pos-1);
	42510	    c:= getch;
	42630	    IF extraparameters = NOTEXT THEN GOTO bad;
	42660	    terminaltype:= maxterminals-1;
E34	42690	  END;
	42691
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   18
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	42720	  IF terminaltype = maxterminals-1
	42750	  AND extraparameters =/= NOTEXT THEN
B36	42780	  BEGIN
	42810	    CHARACTER PROCEDURE find(single);
	42840	    NAME single; BOOLEAN single;
B37	42870	    BEGIN IF NOT extraparameters.more THEN GOTO bad;
	42900	      c:= extraparameters.getchar;
	42930	      IF c = altmode THEN
B38	42960	      BEGIN addaltmode:= TRUE;
	42990	        IF NOT extraparameters.more THEN GOTO bad;
	43020	        c:= extraparameters.getchar;
E38	43050	      END ELSE single:= TRUE;
	43080	      find:= c;
E37	43110	    END;
	43140	    extraparameters.setpos(1);
	43170	    down:= find(downsingle); up:= find(upsingle); right:=
	43200	    find(rightsingle); left:= find(leftsingle); home:=
	43230	    find(homesingle); erasescreen:= find(clearsingle);
E36	43260	  END ELSE
	43261
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   19
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	43290	  IF terminaltype = infoton OR terminaltype = sattelite
	43320	  OR terminaltype = buginfoton THEN
B39	43350	  BEGIN COMMENT Infoton Vista Standard or VISTAR Sattelite;
	43380	    IF terminaltype EQ buginfoton THEN
	43410	    terminaltype:= infoton ELSE
B40	43440	    BEGIN line_erasable:= TRUE; eraseline:= char(11);
E40	43470	    END;
	43500	    IF terminaltype = infoton THEN
B41	43530	    BEGIN
	43560	      startblink:= char(31); stopblink:= char(15);
E41	43590	    END ELSE startblink:= stopblink:= ' ';
	43620	    up:= char(28); down:= char(29); right:= char(25);
	43650	    left:= char(26); home:= char(8); erasescreen:= char(12);
E39	43680	  END ELSE IF terminaltype = vt52 OR terminaltype = vt100 THEN
B42	43710	  BEGIN COMMENT VT52;
	43740	    IF terminaltypet= vt100 THEN
B43	43770	    BEGIN COMMENT set terminal to VT52 mode;
	43800	      outchr(terminalout,altmode,1);
	43830	      forceout(sysout); outche(ioindex,char(91));
	43860	      outchr(terminalout,'?',1);
	43890	      outchr(terminalout,'2',1);
	43920	      outchr(terminalout,'l',1);
E43	43950	    END;
	43980	    eraseline:= 'K'; address_screen:= 'Y';
	44010	    line_erasable:= direct_cursor_addressing:= addaltmode:= TRUE;
	44040	    up:= 'A'; down:= 'B'; right:= 'C'; left:= 'D';
	44070	    home:= 'H'; erasescreen:= 'J';
E42	44100	  END ELSE IF terminaltype = minitec OR terminaltype = teletec
	44130	  THEN
B44	44160	  BEGIN COMMENT minitec 2402 or teletec;
	44190	    IF terminaltype = minitec THEN
B45	44220	    BEGIN
	44250	      address_screen:= 'F';
	44280	      startblink:= char(16r42); stopblink:= char(16r53);
	44310	      erasescreen:= char(28);
E45	44340	    END ELSE erasescreen:= char(12);
	44370	    up:= char(11); down:= char(10); right:= char(31);
	44400	    left:= char(8); home:= char(30);
E44	44430	  END ELSE IF terminaltype = elite OR terminaltype = kthelite
	44460	  THEN
B46	44490	  BEGIN
B47	44520	    BEGIN
	44715	      line_erasable:= TRUE; eraseline:= char(23);
	44730	      address_screen:= formfeed; direct_cursor_addressing:= TRUE;
E47	44760	    END;
	44790	    up:= char(26); down:= char(10);
	44820	    right:= char(28); left:= char(8);
	44850	    home:= char(2); erasescreen:= char(31);
	44880	    startblink:= char(14);
	44910	    stopblink:= ' '; !in reality = home;
E46	44940	  END ELSE IF terminaltype = newelite OR terminaltype =
	44970	  newkthelite OR terminaltype = elite1521 THEN
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE  19-1
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

B48	45000	  BEGIN
	45030	    IF terminaltype = elite1521 THEN
B49	45060	    BEGIN lowintens:= char(4); highintens:= char(24);
E49	45090	    END;
	45120	    address_screen:= char(30); direct_cursor_addressing:= TRUE;
	45150	    up:= char(31); down:= char(10);
	45180	    right:= char(28); left:= char(8);
	45210	    home:= char(25); erasescreen:= char(12);
	45240	    startblink:= char(14);
	45270	    stopblink:= ' '; !in reality = home;
	45300	    line_erasable:= TRUE; eraseline:= char(29);
E48	45330	  END ELSE IF terminaltype = tandberg THEN
B50	45360	  BEGIN
	45390	    highintens:= char(15);
	45420	    lowintens:= char(14);
	45540	    tab:= char(30);
	45570	    up:= char(28); down:= char(11); left:= char(8);
	45600	    right:= char(9);
	45630	    home:= char(29); erasescreen:= char(25);
E50	45660	  END ELSE IF terminaltype = beehive THEN
B51	45690	  BEGIN
	45720	    addaltmode:= TRUE;
	45750	    up:= 'A'; down:= 'B'; left:= 'D'; right:= 'C';
	45780	    home:= 'H'; erasescreen:= 'E';
	45810	    startblink:= 'l'; stopblink:= 'm';
	45840	    address_screen:= 'F'; direct_cursor_addressing:= TRUE;
E51	45870	  END ELSE IF terminaltype = cdc71310s OR
	45900	  terminaltype = cdc71310p THEN
B52	45930	  BEGIN
	45960	    up:= char(26); down:= linefeed;
	45990	    left:= char(8); right:= char(21);
	46020	    startblink:= char(14); stopblink:= char(15);
	46050	    home:= char(25); ! lower left corner for cdc71310s;
	46080	    erasescreen:= char(24);
	46110	    delayer:= char(0);
E52	46140	  END ELSE IF terminaltype = elite3025 THEN
B53	46170	  BEGIN
	46200	    highintens:= char(48); lowintens:= char(49);
	46230	    startblink:= char(16r34); stopblink:= char(16r30);
	46260	    line_erasable:= TRUE;
	46290	    addaltmode:= leftsingle:= downsingle:= TRUE;
	46320	    up:= 'A'; down:= linefeed; right:= 'C';
	46350	    left:= char(8); home:= 'H';
	46380	    erasescreen:= 'J'; eraseline:= 'K';
	46410	    deleteline:- maketext(fill,6+trmspeed*0.013);
	46440	    deleteline.putchar(altmode); deleteline.putchar('P');
	46470	    deleteline.putchar(altmode); deleteline.putchar(up);
	46500	    deleteline.putchar(altmode); deleteline.putchar('Q');
	46530	    insertline:- copy(deleteline); insertline.setpos(3);
	46560	    insertline.putchar(fill); insertline.putchar(down);
	46590	    deletechar:- copy(insertline.sub(1,6+trmspeed*0.0006));
	46620	    deletechar.setpos(4); deletechar.putchar(left);
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE  19-2
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	46650	    insertchar:- copy(deleteline.sub(1,deletechar.length));
	46680	    insertchar.setpos(4); insertchar.putchar(right);
	46710	    address_screen:= 'Y'; direct_cursor_addressing:= TRUE;
E53	46740	  END ELSE
	46770	  IF terminaltype = i200 THEN
B54	46800	  BEGIN
	46830	    home:= char(26); up:= char(28); down:= char(29);
	46860	    left:= char(8); right:= char(25);
	46890	    erasescreen:= formfeed;
	46920	    ! note eraseline always blanks the whole line;
	46950	    line_erasable:= TRUE; eraseline:= char(11);
	46980	    address_screen:= char(23); direct_cursor_addressing:= TRUE;
E54	47010	  END ELSE IF terminaltype = adm3a THEN
B55	47040	  BEGIN
	47070	    down:= char(10); up:= char(11); right:= char(12);
	47100	    left:= char(8); home:= char(30); erasescreen:= char(26);
E55	47130	  END ELSE
	47160	  IF terminaltype = volkerd404 THEN
B56	47190	  BEGIN
	47220	    home:= char(25); up:= char(26); down:= linefeed; left:= char(8);
	47250	    right:= char(21); eraseline:= char(22); erasescreen:= char(24);
	47280	    address_screen:= char(16);
	47310	    direct_cursor_addressing:= line_erasable := TRUE;
E56	47340	  END ELSE IF terminaltype = volker414h THEN
B57	47370	  BEGIN
	47400	    highintens:= char(31); lowintens:= char(25);
	47430	    up:= char(12); down:= char(11); left:= char(8); right:= char(16);
	47460	    eraseline:= char(15); erasescreen:= char(28);
	47490	    address_screen:= char(17); home:= char(18);
	47520	    direct_cursor_addressing:=
	47550	    line_erasable:= leftsingle:=
	47580	    rightsingle:= addaltmode:= TRUE;
	47610	    delline:= char(19); insline:= char(26);
	47640	    insertline:- maketext(fill,lineinsfillers+2);
	47670	    insertline.putchar(altmode); insertline.putchar(insline);
	47700	    deleteline:- copy(insertline);
	47730	    deleteline.setpos(2); deleteline.putchar(delline);
	47760	    delchar:= '3'; inschar:= ':';
	47790	    deletechar:- maketext(fill,lineinsfillers//2+2);
	47820	    deletechar.putchar(altmode); deletechar.putchar(delchar);
	47850	    insertchar:- copy(deletechar); insertchar.setpos(2);
	47880	    insertchar.putchar(inschar);
E57	47910	  END ELSE GOTO bad;
	47940	
	47970	  IF line_erasable THEN
B58	48000	  BEGIN
	48030	    eraseeol:- maketext(fill,2+lineinsfillers//28);
	48060	    IF addaltmode AND NOT linesingle THEN eraseeol.putchar(altmode);
	48090	    eraseeol.putchar(eraseline);
E58	48120	  END;
	48780	
	48810	  q_display_output:= TRUE;
DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE  19-3
DSK:MMISTA.SIM	  15-MAR-1979  14:24	

	48930	  leftimage:- blanks(terminalin.length);
	48960	  depchar(leftimage,1,left);
	48990	  terminalout.linesperpage(-1);
	49020	  trmop(8r2010,terminalout,1); ! .TTY NO CRLF;
	49050	  widthm1:= width-1; heightm1:= height-1;
	49080	  FOR q_verticalpos:= heightm1 STEP -1 UNTIL 0 DO
	49110	  screen[q_verticalpos]:- blanks(width);
	49230	  blank_the_screen;
E32	49260	END;
E2	49320	END OF CLASS mvistax;
E1	49380	END;


SWITCHES CHANGED FROM DEFAULT:

  -A NO CHECK OF ARRAY INDEX
  -D NO SYMBOL TABLE GENERATED FOR DEBUG
   E EXTERNAL CLASS/PROCEDURE
  -I NO LINENUMBER TABLE GENERATED
  -Q NO CHECK OF QUALIFICATION

NO ERRORS DETECTED

DECsystem-20 SIMULA  %4A(310)               25-JAN-1981  18:36				 PAGE   20
DSK:MMISTA.SIM	  15-MAR-1979  14:24		LINE NUMBER TABLE

    0	000074
    0	000075
    0	003174
    0	003201