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 to scroll the screen; 04920 BOOLEAN direct_cursor_addressing; ! Move cursor that way; 04950 BOOLEAN allow_cr; ! Allow sending of 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- at ; 05310 INTEGER kthelite; ! code for elite 2500 without auto- at ; 05340 INTEGER infoton; ! code for infoton vista terminal type; 05370 INTEGER newelite; ! code for elite 1500 with auto- at ; 05400 INTEGER newkthelite; ! code for elite 1500 without auto- at ; 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