Swedish National Defense Research Institute FOA Report Department of Planning and Operations Research C10045-M3(E5) S-10450 Stockholm July 1978 DECsystem-10 SIMULA Language Handbook Part III ============================================== (The DECsystem-10 SIMULA Utility Program Library) BY Stefan Arnborg, Lars Enderin, Mats Ohlin, Stephan Oldgren and Jacob Palme. ABSTRACT The DECsystem-10 SIMULA Language Handbook contains the information necessary for an applications programmer who intends to use SIMULA on a DECsystem-10 computer. Part I describes the SIMULA programming language. Part II contains special information for DECsystem-10. Part III describes the utility program library, which includes: > The SAFEIO package for safe conversational terminal interface. > Utility routines for inserting a help facility into the conversational terminal communication, where the appropriate help message at each point in the program can be selected from a file containing several messages. > Routines for accessing date, time etc. > Routines to allow writing real-time programs in SIMULA (e.g. programs which can communicate simultaneously with more than one user terminal.) These routines do not work with DECsystem-20. > Routines for binary (un-formatted) I/O. > Routines for record-oriented I/O. > Routines for file handling. > A utility package of routines for character string (TEXT) handling, with routines for searching, splitting, concatenating, hashing etc. > Routines for in-core sorting and summation. This document reflects the software as of version 4 of the DECsystem-10 SIMULA system. Last update 1978-05-23. DECsystem-10 SIMULA Language Handbook, part III Page 2 SEARCH KEY Computer, Programming, Programming Language, SIMULA, DECsystem-10, Digital Equipment, Algol 60, Fortran, Program library, file handling, input/output, conversational programming, real time, error handling, string handling, character handling, text handling, sorting. CONDITIONS OF RELEASE The information in this document is subject to change without notice. The Swedish National Defence Research Institute assumes no responsibility for any errors that may appear in this document, in the programs described therein or in the SIMULA system itself. No promise is made to implement any of these programs, especially not those marked "NOT READY". This document and the software described in it is furnished to the user for use on a DECsystem-10 computer system and may be copied only for use on such systems, except as may otherwise be provided in writing by the Swedish National Defence Research Institute. ACKNOWLEDGEMENT Part of section 4.1 has been adapted from the similar text for the IBM 360/370 SIMULA System, written by Karel Babcicky at the Norwegian Computing Center. Copyright 1976, 1977 by The Swedish National Defense Research Institute and (partly) The Norwegian Computing Center. SOME OF THE PROCEDURES ARE NOT YET WRITTEN This preliminary version of part III of the handbook includes some procedures which have not yet been implemented. Their descriptions are only proposals. Some of these procedures may eventually be implemented in a different fashion, if at all. These procedures are marked [NOT READY] in section 0.2 but they are not always marked [NOT READY] in the following chapters. Always refer to section 0.2 to check if a procedure is available. DECsystem-10 SIMULA Language Handbook, part III Page 3 TABLE OF CONTENTS 0. INTRODUCTION 0.1 HOW TO GET ACCESS TO THE LIBRARY 0.2 SUMMARY LIST OF ROUTINES 1. UTILITY PACKAGES 1.1 APPLICATION PACKAGES 1.2 DEMONSTRATION PROGRAMS 2. SIMULA SOURCE PROGRAM CONVERSION PROGRAMS 3. DIRECTFILE HANDLING PROGRAMS 4. PROCEDURES NOT WRITEABLE IN SIMULA 4.1 TIME AND DATE 4.2 BASIC ASSEMBLY PROCEDURES FOR REAL TIME 4.3 INPUT/OUTPUT 4.3.1 ASCII-FORMATTED I/O 4.3.2 UNFORMATTED (BINARY) I/O 4.3.3 FILE HANDLING 4.4 CONTROLLED ERROR HANDLING 4.5 SCHEDULING AND JOB CONTROL 4.6 MEMORY HANDLING [These facilities are not yet ready.] 4.6.1 PRIMARY MEMORY HANDLING 4.6.2 VIRTUAL MEMORY HANDLING (OR OVERLAY FACILITY) 4.7 ENVIRONMENT ENQUIRY 4.8 PACKING INTO PARTS OF WORDS DECsystem-10 SIMULA Language Handbook, part III Page 4 4.8.1 PACK AND UNPACK, PARAMETERS 4.8.2 PACK AND UNPACK, ERROR HANDLING 4.8.3 PACK AND UNPACK, METHODS OF PACKING 4.8.4 PACK AND UNPACK, METHODS OF UNPACKING 4.8.5 PACK AND UNPACK, EXAMPLES 4.9 MIN AND MAX 5. ROUTINES WRITEABLE IN SIMULA. 5.1 PARTITIONING OF TEXTS 5.2 SEARCHING AND TESTING OF TEXTS 5.3 OPERATIONS ON TEXTS 5.4 INPUT/OUTPUT 5.5 SORTING AND SUMMATION ETC. 5.6 RANDOM NUMBER GENERATION ETC. 5.7 SIMULA VERSIONS OF SYSTEM CLASSES 6. SWEDISH LANGUAGE TEXT HANDLING AND INPUT/OUTPUT 7. UTILITIES SPECIFIC TO DECSYSTEM-10 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES APPENDIX B - CONTROLLED ERROR HANDLING APPENDIX C - INDEX DECsystem-10 SIMULA Language Handbook, part III Page 5 0. INTRODUCTION ------------ The intention is to include in this document descriptions of utility programs, classes and procedures of general interest to users of SIMULA on the DECsystem-10. Examples: > Programs for editing and generating SIMULA source programs. > Useful program packages written in SIMULA such as data base packages, graphic packages, conversational I/O packages. > Useful MACRO 10 programs to be called from SIMULA, e.g. for object and binary I/O, access to monitor facilities like the clock. The programs described here will be distributed to DECsystem-10 users through the DECUS library, either as separate programs or on the SIMULA distribution tape. Anyone who has submitted a program to the DECUS library, such that the program is also suitable for inclusion in the SIMULA program library, is invited to send us a copy of the program and its documentation. If we accept the program, we will include its description in future editions of this handbook. Contributions in the form of procedures and classes of general interest are also welcome, preferably in machine-readable form with full documentation. We may modify the code to better fit the rest of the system, if you allow us to do so. We cannot promise to include your contributions, however. 0.1 HOW TO GET ACCESS TO THE LIBRARY Most of the procedures and classes described in this document are available in the library files LIBSIM.ATR and LIBSIM.REL. These files should normally be available on the SYS: area on your computer, but you can also keep them on your own disk area. Main programs to be executed directly are available as separate .SAV (.EXE) files, not in the LIBSIM files. Library procedures will be available to your program if you declare them as external at the beginning of your program, e.g: EXTERNAL CLASS safeio; EXTERNAL INTEGER PROCEDURE hash; You need not mention any explicit filename if you are using LIBSIM on the SYS area or on your own area. An external declaration in a separately compiled segment (module) must DECsystem-10 SIMULA Language Handbook, part III Page 6 be repeated in all dependent modules including the main program. Please note that when you use modules in LIBSIM that are coded in SIMULA you will sometimes have to explicitly declare other LIBSIM routines. The compiler will duly tell the user which declarations are missing. If you want to use other libraries, see the DECsystem-10 SIMULA Language Handbook part II chapter 7.1.1. Normally, when you load your programs with the LOAD, EXECUTE or DEBUG commands of DECsystem-10, you need not mention the names of any separately compiled classes or procedures. Just write: .EXECUTE myprog if your program has the name myprog. Any external classes or procedures declared as such inside myprog will automatically be loaded. If you cannot find the necessary .SIM, .REL, .ATR, .HLP, .MAN or .DOC files on the SYS:, HLP: or DOC: areas on your computer, they may still be found on the SIMULA distribution tape. REL and ATR files for separately compiled procedures or classes can be found in the library LIBSIM (.ATR and .REL) on the SYS: area. For procedures written in MACRO-10, there is usually no separate .SIM specification file. Instead, the .MAC file is written such that when you compile it with the SIMULA compiler, the necessary .ATR file is produced. In addition to the utilities listed below, a SIMULA programmer has access to a number of built-in standard procedures. These are described in appendix B to the DECsystem-10 SIMULA Language Handbook part I. The procedures, classes and main programs listed below are described in this document. DECsystem-10 SIMULA Language Handbook, part III Page 7 0.2 SUMMARY LIST OF ROUTINES 0.2 SUMMARY LIST OF ROUTINES The first column for each program indicates type of result for function procedures, K for separately compiled classes, M for main programs (not in LIBSIM). The following letters indicate parameter types. Letter codes in this list: ..=repetition of parameter, R=REAL, L=LONG REAL, I=INTEGER, C=CHARACTER, T=TEXT, X=REF, B=BOOLEAN, G=LABEL, a=ARRAY, P=PROCEDURE, K=CLASS, M=MAIN PROGRAM. An asterisk (*) indicates efficient, MACRO-10 coded procedure. 1. UTILITY PACKAGES 1.1 APPLICATION PACKAGES K T,T SAFEIO Safe conversational terminal I/O. See SAFEIO.HLP and SAFEIO.MAN K T SAFEI SAFEIO without file handling facilities K SAFMIN Small, simplified version of SAFEI K T,T SIMEIO Same as SAFEIO but prefixed with SIMULATION K T SIMEI Same as SAFEI but prefixed with SIMULATION K SIMMIN Same as SAFMIN but prefixed with SIMULATION K SIMDBM CODASYL DBTG type DBMS system. Consists of the external classes SIMDBM (DBMMIN), DBMSET and the main programs DBDUMP, DBLOAD, DBSORT, FETCH, HMAKE, TRANSF, LOAD, DIRED, SPEC, PREP and PREP2 K I,I STORE Simple text-oriented DBMS K SELECT Boolean condition searching TEXT or FILE K I,I,I GPSSS GPSS-like queue simulation package K I,I,I,C,I GPSSST GPSSS with more automatic trace facilities K FIGURE Plot package for Tektronix plotter. GRAPHI, COSYS, COSYSF and RUBOUT are also part of this package. See FIGURE.HLP K I,I,X,B,I VISTA Full control of alphanumeric display screen, e.g. to produce moving pictures K I,I,X,B,I FORM Form fill in data entry, subclass of VISTA DECsystem-10 SIMULA Language Handbook, part III Page 8 0.2 SUMMARY LIST OF ROUTINES P I,I,I,T GETVIS Terminal type input for VISTA K T DAHELP Gives user help message when running SIMULA program. Uses direct-access file to store help messages. See DAHELP.HLP B T,T,I,I SQHELP Gives user help message when running SIMULA program. Uses sequential file to store help messages 1.2 DEMONSTRATION PROGRAMS M (Not listed here) 2. SIMULA SOURCE CODE CONVERSION PROGRAMS [These are main programs, and thus not placed in LIBSIM] M SIMED Prettyprinting, cleaner layout, indentation of BEGIN-END, no semantic change of program M SIMSTR [NOT READY] Automatic structure abstract of source program M SIMEXP Combines separately compiled modules into one module M SIMIBM Conversion to IBM Simula M IBMSIM Conversion from IBM Simula M CDCSIM Conversion from CDC Simula M FQCRED Adds frequency count statements to a SIMULA program M FQCLST Edits SIMULA source program with frequency measurements 3. DIRECTFILE HANDLING PROGRAMS M DIRED Edits a directfile M MAKEDF Converts sequential files to directfiles and vice versa M FETCH General-purpose SIMDBM Data Base Manipulator M MAKHLP Creates help file for use with DAHELP 4. PROCEDURES NOT WRITEABLE IN SIMULA DECsystem-10 SIMULA Language Handbook, part III Page 9 0.2 SUMMARY LIST OF ROUTINES 4.1 TIME AND DATE T TODAY(*) Gives TEXT with date: yyyy-mm-dd I DAYNO Number of this day in current year T DAYTIME(*) Gives TEXT with hh:mm:ss R CLOCKTIME(*) Gives REAL with time of day in seconds R CPTIME(*) Gives LONG REAL with CPU time in seconds ? ? TIMELIMIT [NOT READY] Sets time limit for current execution 4.2 REAL TIME B X INPUTCHECK(*) Anything to read on file X? P R SLEEP(*) Delays execution for R real seconds I Xa,R INPUTWAIT(*) Sleeps until anything to read K REALTIME Scheduler for terminal processes 4.3 INPUT/OUTPUT I X LINECOUNT(*) Returns LINESPERPAGE setting I X FILENAME(*) Gives TEXT with FILE object generation parameter C GETCH(*) Inputs character, will not wait for carriage return (input from controlling terminal only) B R TTYCHECK(*) Checks if a character has been typed in at the controlling terminal P X,C,I OUTCHR(*) Outputs character bypassing image P X FORCEOUT(*) Terminal output buffer to terminal C X INSINGLECHAR(*) Inputs character, does not wait for carriage return (Input from disk or controlling TTY) C X INSNGL(*) As INSINGLECHAR, but line mode (waits for break character) P ILRCPa.. READ(*) Reads many values in standard format P ILRCTPa.. WRITE(*) Writes many values in standard format I X,RLICBTXa.. OUTPUT(*) Binary output I X,RLICBTXa.. INPUT(*) Binary input I RLICBTXa.. PUTSIZE(*) How much will OUTPUT write? B X,I BYPASS(*) [NOT READY] Bypass I characters in a file B X,LRIC LOOK(*) [NOT READY] Binary one-word lookahead in input B T SCRATCHFILE(*) Deletes file on secondary storage X T FINDINFILE(*) NEW INFILE, but no error if file is not available X T,B FINDDIRECTFILE(*) NEW DIRECTFILE, NONE if not available for requested access X T FINDOUTFILE(*) NEW OUTFILE, NONE if write protected DECsystem-10 SIMULA Language Handbook, part III Page 10 0.2 SUMMARY LIST OF ROUTINES X T FINDPRINTFILE(*) NEW PRINTFILE, NONE if write protected I X LASTLOC(*) Highest written line in a DIRECTFILE I X MAXLOC(*) [NOT READY] Highest writeable line in a DIRECTFILE P X CLOSEOPEN(*) [NOT READY] Close and immediately open a file B X DOTYPEOUT(*) Resets CTRL-O bit to resume terminal output. TRUE if file is a terminal and the operation was successful. 4.4 CONTROLLED ERROR HANDLING P B ENTERDEBUG(*) Transfers to SIMULA debugging system P T ABORT(*) User program generated error interrupt P I FORSIM(*) Traps I/O calls from FORTRAN external procedures 4.5 SCHEDULING AND JOB CONTROL P B SUBMIT(*) [NOT READY] Enter file into input batch stream P T,I RUN(*) Runs a new program under current job I T,B SAVE(*) Saves current main memory on a file P T RESTORE(*) Resumes execution from save file P I FREEZE(*) Exits to monitor, ready for SAVE P I EXIT(*) Exits directly to monitor (I=0), after closing files (I=1), to SIMDDT (I=2). 4.6.1 PRIMARY MEMORY HANDLING I I FREEBITS(*) [NOT READY] Forces garbage collection, return maximal free area size 4.6.2 VIRTUAL MEMORY CONTROL B I COREGUIDE(*) [NOT READY] Sets physical guideline B I CORELIMIT(*) [NOT READY] Sets physical limit P XP.. SWAP(*) [NOT READY] Swaps out given module from main store DECsystem-10 SIMULA Language Handbook, part III Page 11 0.2 SUMMARY LIST OF ROUTINES 4.7 ENVIRONMENT ENQUIRY I MAXINT(*) Returns largest positive INTEGER R MAXREAL(*) Returns largest positive REAL R MINREAL(*) [NOT READY] Returns smallest positive REAL L LR,LR APPROX(*) [NOT READY] Returns integer value corresponding to numbers of bits differing in two arguments T IMPLEMENTATION(*) [NOT READY] CPU manufacturer and model T LOGINFO(*) [NOT READY] User and job id I a DIMENSIONS(*) [NOT READY] Number of dimensions (subscripts) of ARRAYs 4.8 PACKING INTO PARTS OF WORDS(*) B IRLa,I,IRLCBTa,I,.. PACK Packs many variables of varying type B IRLa,I,IRLCBTa,I,.. UNPACK Reverse of pack 4.9 MIN AND MAX I I1,I2 IMAX(*) Max(I1,I2) I I1,I2 IMIN(*) Min(I1,I2) R R1,R2 RMAX(*) Max(R1,R2) R R1,R2 RMIN(*) Min(R1,R2) L L1,L2 LMAX(*) Max(L1,L2) L L1,L2 LMIN(*) Min(L1,L2) 5. PROCEDURES WRITEABLE IN SIMULA 5.1 PARTITIONING OF TEXTS T T REST(*) Subtext after POS T T FRONT(*) Subtext before POS T T,I FROM(*) Subtext after pos=I in T T T,I UPTO(*) Subtext before pos=I in T T T FRONTSTRIP(*) Subtext without leading blanks T T GETITEM(*) Subtext = next identifier, number or delimiter after POS T X INITEM(*) GETITEM on INFILE [NOT READY FOR DIRECTFILES] or DIRECTFILE C T,I FETCHAR(*) Returns T.Sub(I,1).Getchar, null if I out of range P T,I,C DEPCHAR(*) T.Sub(I,1).Putchar(C), no action if out of range. T T,I1,I2 TSUB(*) T.Sub(I1,I2), NOTEXT where Sub gives error DECsystem-10 SIMULA Language Handbook, part III Page 12 0.2 SUMMARY LIST OF ROUTINES 5.2 SEARCHING AND TESTING OF TEXTS T T,C SCANTO(*) Next occurrence of C in T T C SKIP(*) Skips string of characters = C from T.Pos B T1,T2 FRONTCOMPARE(*) Does rest of T1 begin with subtext = T2? B T1,T2 UPCOMPARE(*) Same as FRONTCOMPARE, but upper and lower case letters are regarded as equal I T1,T2 SEARCH(*) Finds first subtext = T2 from T1.Pos I T GETTYPE [NOT READY] Does a TEXT contain REAL, INTEGER, IDENTIFIER or what ITEM? I T CHECKREAL(*) Checks if GETREAL can be performed I T CHECKINT(*) Checks if GETINT can be performed I T CHECKFRAC(*) Checks if GETFRAC can be performed I T,I HASH Computes hash value from text in interval [0:I-1] C T1,T2 FINDTRIGGER(*) Next occurrence of any character of T2 in T1 B T,I,Ta,I MENU Searches for unambiguous text in a text array B T,Ta,I,I,I LOOKUP Performs binary search in sorted text array 5.3 OPERATIONS ON TEXTS T T,T CONC2(*) Concatenation of TEXTs, two parms T T.. CONC(*) Concatenation of variable no. of TEXTs B T1,T2 PUTTEXT(*) Copies value of T2 starting at T1.Pos T T UPCASE(*) Converts to upper case T T LOWCASE(*) Converts to lower case T C,I MAKETEXT(*) NEW text, all I characters equal to C T T,C COMPRESS(*) Removes given character from text I T STARTPOS(*) Returns starting position for a (sub)text B T1,T2,T3 CHANGE Replaces first substring of T1 = T2, if any, with T3. Search starts at T1.Pos L T SCANREAL(*) GETREAL, safe from bad data, starts at T.Pos I T SCANINT(*) GETINT, safe from bad data, starts at T.Pos I T SCANFRAC(*) GETFRAC, safe from bad data, starts at T.Pos I T,Ra,I GETARRAY [NOT READY] Reads from a text real values into a REAL ARRAY I T,Ia,I GETINTARRAY [NOT READY] Ditto INTEGER ARRAY I T,Ra,I GETLONGARRAY [NOT READY] Ditto LONG REAL ARRAY T T,R,C,I PUTTIME Edits a number in TIME format DECsystem-10 SIMULA Language Handbook, part III Page 13 0.2 SUMMARY LIST OF ROUTINES T T,R PUTFLOAT Edits a number using minimum no. of characters T I,I RADIX Edits 2nd parm to an item in 1st parm base. I I,T GETRADIX Deedits an item(T) in base I to an integer value. P T,T,T,T SPLIT Splits a text at given delimiter string I T,T,Ta,I SPLITA Splits a text and stores the parts in a text array I T,C,Ta,I SPLITC Same as SPLITA but with character delimiter I T,I,Ta,Ta SCAN Identifies keywords in a command string. I T,I,Ta,Ta SSCAN Version of SCAN used by GETVIS. K I DECOM (Subclass to SAFMIN) Interprets input command of the format outfil.ext/switch1/switch2... =infil.ext/switch3/switch4... I Ta ARRLGD(*) Total length of texts in Ta + number of elements. Used in SIMDBM. P Ta,T,C ARRTXT(*) Put all texts of Ta in T, with delimiter = C. Used in SIMDBM. 5.4 INPUT/OUTPUT C X LOOKAHEAD(*) Next non-blank character readable by INCHAR P T,X OUTLINE(*) [NOT READY] Output TEXT on new line(s), TEXT may be longer than image P T,X BREAKOUTLINE(*) [NOT READY] Output TEXT on same line, TEXT may be longer than image T T,X INLINE Types out a prompting question and copies an infile image (stripped) T T,T,T,B,T,T REQUEST Sophisticated INLINE with input check, help etc. P X,R,C,I OUTTIME Prints simulated time in hh:mm:ss.cc format P .. HISTP Prints histogram of Ia on file X 5.5 SORTING AND SUMMATION ETC. I R ILOG Returns integer part of 10LOG(Abs(R))+1; if R = 0 return 0. I.e. Number of integer digits if Abs(R) >= 1 else number of leading zeros after decimal point I Ia,I ISUM Returns sum of an integer array L La,I LSUM Returns sum of long real array (almost) preserving precision DECsystem-10 SIMULA Language Handbook, part III Page 14 0.2 SUMMARY LIST OF ROUTINES R Ra,I RSUM Returns sum of real array R R,R,Ra,I SIGMA2 Returns variance, mean value of a real array P R,R,I,R SIGMEAN Returns current variance and mean value including new observation P "x"a,I SORTxy Sorts a given array in ascending or descending order. x = T(ext), R(eal), I(nteger) or L(ong real) y = A(scending), D(escending) order P Ia,I1,I2,I3 SORTDN Sorts slice Ia[1:2,I1:I1-1+N] with respect to either or both integers in each row. R R,R,I SCALESTEP Adjusts approx. max and min for diagram design B Ia,I,I,I,B IASHIFT(*) Moves part of an integer array leftward. 5.6 RANDOM NUMBER GENERATION ETC. P Ia,I,I,I SCRAMBLE Random permutation of array C Ia,N PERGEN Systematic generation of permutations R R,R RANDOM(*) Random generator of random number series start numbers I UNIQUE Unique number to be used e.g. as start random number (seed) I I1,I2 NEXTRANDOM(*) Returns the I1:th successor to random seed I2 5.7 SIMULA VERSIONS OF SYSTEM CLASSES K ZIMSET SIMULA tracing version of SIMSET K ZIMULATION SIMULA tracing version of SIMULATION 6. SWEDISH LANGUAGE TEXT PROCESSING AND INPUT/OUTPUT B C BOKSTAV(*) Swedish version of Letter T X INORD(*) Swedish version of INITEM T T LITENBOKSTAV(*) Swedish version of LOWCASE B T,I,Ta,I MENY Swedish version of MENU T T STORBOKSTAV(*) Swedish version of UPCASE T T TAGORD(*) Swedish version of GETITEM I T TAGTYP [NOT READY] Swedish version of GETTYPE DECsystem-10 SIMULA Language Handbook, part III Page 15 0.2 SUMMARY LIST OF ROUTINES 7. UTILITIES SPECIFIC TO DECSYSTEM-10 I I1,I2 ADJPTR(*) Byte pointer I1 adjusted by I2 bytes I I1,I2 ANDINT(*) Bitwise AND function K ATRSTR ATR file structure I I1,I2,I3 BITFIELD(*) Returns a bit field within I1 starting at bit I2 (0-35) with length Abs(I3) (1-36) (I3 negative gives sign extension) B I1,I2 BITGET(*) BITGET:=I1.bit(36-I2)=1 P I1,I2,B BITPUT(*) I1.bit(36-I2):=IF B THEN 1 ELSE 0 I I1,I2,I3 BOOLFUNC(*) One (0<=I1<=15) of 16 Boolean functions of I2,I3 (bitwise, like ANDINT). For any valid I1, BOOLFUNC(I1,5,3)=I1. B T,T CALLMIC Uses MIC to perform other tasks and optionally return T T,T CHECKEXTENSION Adds default extension if file spec contains no dot and is not just of the form DEV: I I1,I2,I3,I4 DEPBYTE(*) I=I2 with byte at bit I3 of length I4 replaced by I1. P X,I ECHO(*) Suppresses monitor echoing of terminal input I X,T FILCOP(*) Efficient copying of disk files. Also copies creation date and version. K FILED Reads and writes DEC 10 line numbered files T X,I FILSPC Returns file specification string for file X in format controlled by value of I. I I FLOKUP(*) Look up file specified by FILOP. and LOOKUP blocks. I I1,I2 GETTAB(*) Returns item I1 in monitor table I2 T I IDRX50(*) Interprets a 36-bit word as a "RADIX50" symbol (code bits and 6-character identifier) T I1,I2 IDSIXBIT(*) ASCII representation of up to 12 character identifier given in I1 and I2 in SIXBIT (DEC 64-character code) I R INTREA(*) "Retype" R as integer (same 36-bit pattern) I X JOBSTATUS(*) Get JOBSTS word for PTY or TTY (subjob control) I I1,I2 LOADBYTE(*) Get any byte in readable core. I I LOADWORD(*) Get word at address (I) - any readable word. I I1,I2,I3 MATCH6(*) SIXBIT match of I1 to I2 according to wildcard mask I3. DECsystem-10 SIMULA Language Handbook, part III Page 16 0.2 SUMMARY LIST OF ROUTINES B NUMBERED(*) Did last inimage get a line-numbered line? T T,I OCTAL(*) Octal representation of I, using T as work area. I X,R PTYCHECK(*) Any PTY (Infile X) activity in R seconds? X X PTYFIL(*) PTY Outfile companion to PTY Infile X. I X PTYINIMAGE(*) Get line of input from PTY Infile X. Result shows how line ended. I T,I RDX50 Converts I,T to "RADIX50" R I REAINT(*) "Retype" I as real (same 36-bit pattern) B X/T,T[,B] RENAME(*) Renames or deletes first arg (file ref/spec) to second arg (file spec). B RESCAN(*) Makes invoking monitor command readable by invoked program M SIMATR Displays the information in an ATR file I T SIXBIT(*) First 6 characters in T converted to sixbit word. I I1,I2,I3 STOREBYTE(*) Stores the byte I1 using byte pointer I2, modified (I3) bytes. I I1,I2 STOREWORD(*) Store I1 at (I2) (abs memory address). I I SXRX50 RADIX50 to SIXBIT. T T,B TMPIN(*) Reads a "TMPCOR" core file into a new text object, and deletes the file if B is TRUE. T T TMPNAM(*) Creates a temporary file name like "021PIP.TMP" B T1,T2 TMPOUT(*) Writes a "TMPCOR" core file from T2. Returns TRUE if successful. I I,X,I TRMOP(*) Modifies monitor-terminal interface I I TTYLINE Gives network node and line for tty number I T I1,I2 TTYNUMBER TTY number for node I1 line I2 in network I I1,I2,B,I3 XCALLI(*) Execute CALLI AC1,(I2). AC1=I1. Return (I3) if CALLI does not skip and B is TRUE, otherwise return new value of AC1. I T,I1,I2 WILDSIX(*) SIXBIT translation of T, recording wildcards (? or *) in I1. DECsystem-10 SIMULA Language Handbook, part III Page 17 1. UTILITY PACKAGES 1. UTILITY PACKAGES -------------------- 1.1 APPLICATION PACKAGES **** SAFEIO is a package to enable a safe question-and-answer dialogue with a conversational terminal. The programs in the package allow you to ask the user for variables of various SIMULA types. The user answers are checked for correct type and for acceptance according to criteria specified by the programmer. Help and error messages are given. The package protects from error interrupts in programs which may receive faulty input data from the user. The user may save his input in a log file. This file can later be used as input instead of the terminal. Other files may also be used as input, intermixed with terminal input. SAFEIO is distributed as the files SAFEIO.SIM, SAFMIN.SIM, SIMEIO.SIM, SIMMIN.SIM, SAFEIO.RNM, SAFEIO.MAN, SAFEIO.NEW, SAFMIN.HLP, SAFEIO.ENG, SAFEIO.SWE and SAFEIO.HLP. Written by Mats Ohlin, Swedish National Defense Research Institute. The SAFEIO system offers the following facilities in a single procedure call : 1. Issue a prompting question to the user. 2. Store the input in a simple variable. 3. Optionally accept default answers (equal to CR). 4. Check the syntax of the input. 5. Issue an appropriate message if the input is invalid. 6. Issue an explanatory message if the user responds with anything starting with a question mark '?'. 7. Allow the user to substitute terminal input for disk file input. This may be done at any time a question is to be answered. 8. Allow the user to save all accepted program input on a disk file. This file may be used as an input file in a subsequent run. Correspondence between saved and current question will be checked (option by default). It is assumed that the user type only one item on each input DECsystem-10 SIMULA Language Handbook, part III Page 18 1. UTILITY PACKAGES line. A question to the user is defined by the call: REQUEST("prompting question", default, ***input(variable,validity), " error message if not valid", helpproc_expression); The parameter default is usually a text (constant) containing a default answer value. There is a SAFEIO attribute NODEFAULT which can be used if default answers should be prohibited. *** may be replaced by INT,REAL,LONGREAL,BOOL or TEXT. For the BOOLINPUT procedure there is only one argument though, the receiving variable. VALIDITY is usually a Boolean expression involving VARIABLE but may also be a call of a Boolean procedure if more complicated validity checking is necessary. If the SAFFEIO attribute CHECKVALIDITY is set to FALSE, no validity checking (i.e. no evaluation of the 2nd parameter to the ***input procedure) will occur, thus speeding up SAFEIO execution. Note, however, that this will endanger the security of your program. The error message is printed if VALIDITY becomes FALSE. The prompting question will then be repeated. HELPPROC_EXPRESSION will be evaluated each time the user types in an answer beginning with a question mark '?'. The SAFEIO Boolean procedure HELP (with one text parameter = the help text) may be used for displaying a text on the user's terminal. If no special information should be issued the SAFEIO procedure NOHELP may be used. (The message - "There is no help in this case." will be issued.) An example: BEGIN EXTERNAL REF (Infile) PROCEDURE findinfile; EXTERNAL REF (Outfile) PROCEDURE findoutfile; EXTERNAL TEXT PROCEDURE conc,upcase,frontstrip, rest,checkextension; EXTERNAL CHARACTER PROCEDURE fetchar,findtrigger; EXTERNAL LONG REAL PROCEDURE scanreal; EXTERNAL INTEGER PROCEDURE checkreal,checkint, DECsystem-10 SIMULA Language Handbook, part III Page 19 1. UTILITY PACKAGES scanint,ilog; EXTERNAL BOOLEAN PROCEDURE menu; EXTERNAL CLASS safeio; safeio(.., <"English" or "Swedish">..) ! Use "English" if you want English texts. Use "Swedish" if you want Swedish texts. ; BEGIN INTEGER i; REAL x; LONG REAL y; TEXT t; BOOLEAN b; TEXT ARRAY table[1:4]; request("Enter integer:","14", intinput(i,irange(i,1,20)), outofirange(i,1,20), help("...info issued at '?'..")); ! The default value is 14. Only positive numbers ! are allowed.; ! Note the use of the procedures IRANGE(i,low,high) ! and OUTOFIRANGE(i,low,high). ! See also Summary Chapter 5 in SAFEIO.MAN.; request("Enter real item:",nodefault, realinput(x,TRUE),"",nohelp); ! Default answer not allowed. Any legal real item ! is accepted since validity is TRUE. ! No help information available.; request("Enter long real value:","E1", longrealinput(y,y NE 0), "? Must not be zero.",nohelp); ! Default value is 10 = E1; request("Enter yes or no:",nodefault, boolinput(b),"",nohelp); ! Note that procedure boolinput has only one ! parameter.; table[1]:- Copy("START"); table[2]:- Copy("END"); table[3]:- Copy("GO"); table[4]:- Copy("GOTO"); request("Enter command:",nodefault, textinput(t,menu(t,i,table,4)), DECsystem-10 SIMULA Language Handbook, part III Page 20 1. UTILITY PACKAGES commandmessage(index),commandhelp(table,4)); ! The user may use an abbreviated form when no ! ambiguity exists. ! (Exact matches are always considered correct.) ! The variable i will return the table index. ! The length of the table (4) must also be supplied. ! Note that the table must contain upper case ! letters only. ! The procedure MENU resides in LIBSIM and checks ! for correspondence between T and TABLE.; ! The text procedure COMMANDMESSAGE will tell the ! user if his (illegal) command was either ! Unknown or Ambiguous. ! A simple text request: ; request("Enter A or B:","A", textinput(t,t = "A" OR t = "B" OR t = "a" OR t = "b"), "? Answer A or B.",nohelp); ! The user may define his own boolean procedure for ! input validation if more complicated tests are ! necessary.; GO TO start; ! Will restart from SAFEIO prefix; ! START is a SAFEIO label located ! just in front of INNER.; ! If the label EOF exists, ! End-of-file on SYSIN (=^Z) ! will jump to this label. If EOF does not not exist ! in the user program, the SAFEIO block will ! terminate through an internal SAFEIO jump. ! NOTE! Once Sysin.Endfile is TRUE, there can be no ! more input on Sysin! This mechanism will only ! work for blocks prefixed by SAFEIO ! (i.e. NOT when using NEW SAFEI(O)).; END of SAFEIO block; END of program; On receiving any SAFEIO question on the terminal the user may input one of the SAFEIO commands: ? to get help information. DECsystem-10 SIMULA Language Handbook, part III Page 21 1. UTILITY PACKAGES ! FOLLOWED by: * to change the switch: Display-prompting-question. / to change the switch: Display-default-value. = to change the switch: Display-input (+ the *- and /-switches). [ to change the switch: Trace (file messages). + to close and reopen current recording file in append mode. ; to treat the line as a comment. % to call special procedure. & followed by input to override validity test. FIL.EXT to open new recording file. Default extension =.saf > to close current recording file. ? to print this text. Anything else following ! will cause current question to be displayed. The != command will always change the values of the switches Display-prompting-question and Display-default-value to the same value as the switch Display-input. Note that the !& facility may be switched off by calling the procedure NOOVERRIDE. The !% facility gives the programmer the possibility to declare his own procedure SPECIAL (with exactly that name and without parameters) which will be called when the user responds with !%. It is possible to interpret the information following the !% in the procedure, thereby expanding the power of the SAFEIO - ! commands. See SAFEIO.MAN for further information on SAFEIO attributes. If you are using SAFEIO via INSPECT it is not meaningful to specify any initial recording file, since it will be closed immediately. This is because the INNER in SAFEIO will be passed. In order to close all possible open SAFEIO files, end the connection block with a call of the SAFEIO procedure closefiles. I.e. : BEGIN EXTERNAL declarations.....; DECsystem-10 SIMULA Language Handbook, part III Page 22 1. UTILITY PACKAGES .... INSPECT NEW SAFEIO("","") DO ! Default language is English ; BEGIN .... using SAFEIO ...... closefiles; END; END program By substituting the class SAFEI for SAFEIO (with the language parameter only) the facilities numbered 1 to 6 will still be present while the file handling facilities will absent. The class SAFEI requires about 2/5 as much core as SAFEIO. By substituting SAFMIN still more SAFEIO facilities are excluded. See SAFMIN.HLP. The size of SAFMIN is about 1/2 that of SAFEI. The three classes SIMMIN, SIMEI and SIMEIO are identical in all respects to SAFMIN, SAFEI and SAFEIO respectively except that they are prefixed with SIMULATION. **** SIMDBM Data Base Management System. SIMBDM is a data base handling system based on the ideas in the CODASYL DBTG proposal, but written entirely in SIMULA for use by SIMULA programs. Facilities exist for defining SCHEMAs (Data Base Structure Descriptions) and storing them in the data base, for accessing the SCHEMA from the SIMULA program and for accessing data using the SCHEMA. Data base fields of type TEXT or ARRAY have indefinite length. New fields can be added to existing records. Memory need not be reserved for the largest instance of each record type. Data base records are mapped onto CLASS instances in core. A SIMULA program can access and use the SCHEMA, which allows writing "data-independent" programs in SIMULA. Restrictions: No built-in facilities exist for privacy constraints or for solving multi-terminal access conflicts. Written by Kalle Maekilae, Swedish National Defense Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 23 1. UTILITY PACKAGES FILES ON THE DISTRIBUTION TAPE FOR SIMDBM: SIMDBM.DOC briefly describes the other files of the system. External classes for use with SIMULA application programs using SIMDBM: DBMMIN.SIM, SIMDBM.SIM, DBMSET.SIM. (.ATR and .REL files for these are part of SYS:LIBSIM). Documentation: SIMDBM.DOC, SIMDBM.RNO, SIMDBM.HLP, NEWDBM.RNO. General purpose program (FETCH) for conversational queries to data bases: FETCH1.SIM, FETCH2.SIM, FETCH.SIM, FETCH.RNO, HMESS.DMP, FETCH.EXE, DBLOAD.SIM, DBDUMP.SIM. Loading of SIMDBM-data bases from a sequential file: LOAD.SIM, LOAD.HLP, DBLOAD.SIM, DBDUMP.SIM. Text editing of SIMULA direct access files from a terminal: DIRED.SIM, DIRED.HLP. Entering a SCHEMA (Data Base Structure Specification) into a data base: SPEC.SIM, SPEC.EXE. Preprocessor, producing SIMULA procedures for loading records from a SIMDBM data base: PREP2.SIM. Preprocessor, producing SIMULA class with internal representation of records from a SIMDBM data base: PREP1.SIM. **** STORE is a simple text oriented data base handler providing two main procedures PUTMESSAGE and GETMESSAGE. PUTMESSAGE stores a message under a key in a direct access file, and GETMESSAGE returns the message stored under a given key. Both key and message can be text strings of arbitrary length. STORE is distributed as the files STORE.SIM, STORE.RNO, STORE.HLP and STOREU.SIM. STORE.RNO is STORE.HLP in RUNOFF format. STOREU.SIM is an application example which also uses the SAFEIO package. Written by Jacob Palme, Swedish National Defence Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 24 1. UTILITY PACKAGES **** SELECT is a SIMULA class to facilitate searching of TEXT strings or files applying Boolean conditions like "(SIMULA+ALGOL)&(DEC+DIGITAL)" The Boolean condition is first translated into a formula tree. This formula tree can then be applied to any number of TEXTs, and TRUE will be returned for those TEXTs containing words satisfying the Boolean condition. Files: SELECT.SIM, SELECT.RNH and SELECT.HLP. In LIBSIM, SELECT.REL and SELECT.ATR can be available. Written by Jacob Palme, Swedish National Defence Research Institute. **** GPSSS is a package which converts SIMULA (by additions within the language) into a programming language very similar to GPSS. GPSS is a well-known system for simulating systems of queues and work stations and objects moving from work station to work station. GPSSS provides the same facilities in SIMULA, including the built-in standard statistics, in a way which is very similar to GPSS. The advantage with using GPSSS may be that you can easier go outside the GPSS boundaries, since SIMULA is a much more general-purpose language. GPSSS may also be useful for introducing SIMULA to people who know GPSS. GPSSS was originally written by Professor Jean G. Vaucher at the Universit'e de Montr'eal, and was converted to DECsystem-10 by Joakim Bose. GPSSST is an extended version of GPSSS with much more tracing facilities. Further information, see GPSSS.MAN. GPSSS is distributed on the SIMULA distribution tape in the following files: GPSSS.SIM, GPSSST.SIM, GPSSS.ATR, GPSSST.ATR, GPSSS.REL, GPSSST.REL. An english-language manual is available in the files GPSSS.RNM, GPSSS.MAN. The tape also includes IBM SIMULA versions as GPSSS.IBM and GPSSST.IBM. A swedish language version of the manual is included as the files GPSSWE.RNM and GPSSWE.MAN. DECsystem-10 SIMULA Language Handbook, part III Page 25 1. UTILITY PACKAGES **** FIGURE is a basic graphic package for handling TEKTRONIX graphic terminals in SIMULA. FIGURE is described in the help file FIGURE.HLP. Written by Aake Blomberg, Swedish National Defence Research Institute. **** VISTA is a package to get full control of an alphanumerical display terminal. You can move the cursor freely around the screen, and produce programs for e.g.: > Moving pictures, > Continuously changing tables, > Form-fill-in method of data entry with immediate validity checking of each field, > Table-fill-in method of data entry with immediate validity checking of each field. VISTA will not work on all kinds of alpahnumeric display terminals. At the time of this writing, the package works on the following terminal types: Infoton VISTA, VISTAR SATTELITE and I 200, DEC VT52, TEC MINITEC and TELE-TEC, BEEHIVE B100, MINIBEE, TANDBERG TDV 2000, Datamedia ELITE 1520 , 2520, 3025, CDC 713-10, Volker 404. Work is going on to modify it for other terminals. In many cases, the user can in a simple way describe a new kind of terminal by a few keystrokes when running the package. See the VISTA.MAN handbook for current information on which terminals can be handled by the package. VISTA.PAP contains a textual description of what can be done with the VISTA package, VISTA.MAN(VISTA.RNM) contains a programmers manual to the package. Files: VISTA.SIM, FORM.SIM, CAT.SIM, SHIP.SIM, QSIM.SIM, VIDED.SIM, TERMTY.SIM, GETVIS.SIM, VIDED.MAN, VIDED.HLP, FORMT.SIM, VISTA.RNM, VISTA.RNH, VISTA.PAP. Written by Jacob Palme, Swedish National Defence Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 26 1. UTILITY PACKAGES **** FORM package for formula input using VISTA, see above. **** GETVIS procedure for finding out what kind of terminal the user has from SWITCH.INI, TMP:TRM, command line or user input, before calling VISTA; see above. **** DAHELP The DAHELP class may be used in order to save core in application programs when the HELP text segments are very long and/or numerous. If you prepare a number of sequential files with names equal to the respective keywords, the MAKHLP program may be used in order to create a DAHELP direct access file. This file could then be used by the DAHELP class in order to display any of the included (sub)files on the terminal (i.e. Sysout). It is also possible to make DAHELP list all entries (keywords) in the DAHELP file. Written by Mats Ohlin, Swedish National Defense Research Institute. Files: DAHELP.SIM, DAHELP.HLP, and in LIBSIM DAHELP.ATR, DAHELP.REL. **** SQHELP is a program to simplify the provision of a help facility in a conversational program, where different parts of the help file may be printed via different help requests in the program. SQHELP makes a sequential search of the help file, and displays all pages containing a certain word. Compared to DAHELP, this has the following advantages and disadvantages: > The help file can be a sequential file, readable also via the monitor HELP command and requiring less core than direct access files. > The user can supply key words to guide the help file search. > Much slower than DAHELP, not suitable for very large help files. > The search is governed by words contained in the help file text, not by the title of the help file segments. Files: SQHELP.SIM, SQHELP.RNH and SQHELP.HLP. LIBSIM can contain SQHELP.ATR and SQHELP.REL. DECsystem-10 SIMULA Language Handbook, part III Page 27 1. UTILITY PACKAGES Written by Jacob Palme and Mats Ohlin, Swedish National Defence Research Institute. 1.2 DEMONSTRATION PROGRAMS The save set SIMDEM on the SIMULA distribution tape contains some simple SIMULA programs which can be used to demonstrate the ideas of the SIMULA programming language. (Written by Jacob Palme.) The programs are: QASETE, which is a very simple question-answering system accepting statements like "BOOK IS DOCUMENT. DOCUMENT IS OBJECT." and being able to answer questions like "IS BOOK OBJECT?". STAT1E, which is a very simple simulation program of the transport operation between a harbour, a store and a factory. The simulation program lacks all tracing and result output. STAT2E is the same simulation program as in STAT1E, but with tracing and result output added without obscuring the logic of the simulation program. The intention is to illustrate the power of the SIMULA language for this kind of structured programming. DDTDEM which is a simple program to demonstrate SIMDDT. STAT1E can also be used to demonstrate SIMDDT. CAT, SHIP and QSIM are simple demonstrations of simulations using the VISTA package for "moving pictures" on alphanumeric display terminals. CAT is a cat-and-mouse game on the screen, SHIP a troup transport simulation, QSIM a simulation of a doctor's waiting room. FORMT and TABLE are simple demonstrations of the form methods for data collection, based on the VISTA package. DECsystem-10 SIMULA Language Handbook, part III Page 28 2. SIMULA SOURCE PROGRAM CONVERSION PROGRAMS 2. SIMULA SOURCE PROGRAM CONVERSION PROGRAMS --------------------------------------------- **** SIMED converts SIMULA source programs to a more readable format. The block structure is indicated by indentation and reserved words are (optionally) capitalized to distinguish them from other identifiers. SIMED is described further in the DECsystem-10 SIMULA Language Handbook Part II Appendix L. SIMED is distributed as four files, SIMED.SIM, SIMED.HLP and SIMED.EXE. Written by Mats Ohlin, Swedish National Defence Research Institute. **** SIMSTR [NOT READY] Documents a SIMULA program by extracting only structural lines from the program. **** IBMSIM converts SIMULA source programs from IBM 360/370 to DECsystem-10. The program is described in Appendix M.1 of the DECsystem-10 SIMULA Language Handbook Part II. IBMSIM is distributed as three files, IBMSIM.SIM, IBMSIM.HLP and IBMSIM.EXE. Written by Mats Ohlin, Swedish National Defence Research Institute. **** SIMIBM converts SIMULA source programs from DECsystem-10 to IBM 360/370. The program is described in Appendix M.2 of the DECsystem-10 SIMULA Language Handbook Part II. SIMIBM is distributed as three files, SIMIBM.SIM, SIMIBM.HLP and SIMIBM.EXE. Written by Mats Ohlin, Swedish National Defence Research Institute. **** CDCSIM converts SIMULA source programs from CDC to DECsystem-10. The program is described in Appendix M.3 of the DECsystem-10 SIMULA Language Handbook Part II. CDCSIM is distributed as two files, CDCSIM.SIM and CDCSIM.EXE. Originally produced at the Norwegian Computing Center, modified by Lars Enderin and Jacob Palme at the Swedish National Defence Research Institute. **** SIMEXP merges a SIMULA source program and the external modules it refers to into a single segment. This is sometimes necessary when moving SIMULA programs from the DECsystem-10 to other computers. SIMEXP is described in SIMEXP.HLP and distributed as SIMEXP.SIM and SIMEXP.EXE . Written by Sten Perers, Swedish National Defence Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 29 2. SIMULA SOURCE PROGRAM CONVERSION PROGRAMS **** FQC measures the frequency with which the statements in a SIMULA program are executed. FQC is described in Appendix J in the DECsystem-10 SIMULA Language Handbook Part II. FQC is distributed as FQCRED.SIM, FQCRED.EXE, FQCLST.SIM, FQCLST.EXE, FQC.HLP. Written by Stefan Arnborg, modified by Dag Gruneau and Mats Ohlin, Swedish National Defence Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 30 3. DIRECTFILE HANDLING PROGRAMS 3. DIRECTFILE HANDLING PROGRAMS -------------------------------- **** DIRED program A general editor for DIRECTFILEs. Files: DIRED.SIM, DIRED.SAV, DIRED.HLP. Written by Kalle Maekilae, Swedish National Defense Research Institute. **** MAKEDF program Converts a sequential file into a DIRECTFILE and vice versa. If the sequential file is line numbered, the line numbers are used as locations for the DIRECTFILE. Files on the distribution tape: MAKEDF.SIM, MAKEDF.EXE, MAKEDF.HLP. Written by Jacob Palme, Swedish National Defense Research Institute. **** FETCH program FETCH is part of the SIMDBM package. FETCH allows you to access the data base directly from a terminal, without running any programs. Changes to the SCHEMA must however be made with the program SPEC. See further the SIMDBM documentation. Written by: Kalle Maekilae, Swedish National Defense Research Institute. **** MAKHLP program The MAKHLP program modifies or creates a DAHELP Direct Access Help file by appending named sequential file references. MAKHLP can not delete any parts of the Direct Access file. For such purposes - reconstruct the file from scratch or use the DIRED program to patch up the file according to DAHELP format (imagesize:73). See DAHELP.HLP for more information. Files on the distribution tape: MAKHLP.SAV, MAKHLP.SIM, MAKHLP.HLP. DECsystem-10 SIMULA Language Handbook, part III Page 31 4. PROCEDURES NOT WRITEABLE IN SIMULA 4. PROCEDURES NOT WRITEABLE IN SIMULA ---------------------------------- NOTE: Some of these routines are not yet written. See the list in chapter 0.2, which indicates which routines are ready. The source code for these routines can usually be found in the large files LIBSM1.PAC and LIBSM2.PAC. Unpack the individual files with the program FILPAC.SAV. FILPAC places the unpacked files on DSKD. If you want the files on another file structure, say DSKB, do .ASSIGN DSKB DSKD before running FILPAC. 4.1 TIME AND DATE **** TEXT PROCEDURE TODAY Returns a reference to a text object of length 10 with contents: "yyyy-mm-nn" where yyyy is year, mm is month(in digits 01-12), nn is day (in digits 01-31). This is the internationally standardized format for dates. **** INTEGER PROCEDURE dayno Integer procedure DAYNO returns the ordinal day number in current year. EXTERNAL PROCEDURE required: TEXT PROCEDURE today; BEGIN INTEGER day,month,year; TEXT t; t:- today; month:= t.Sub(6,2).Getint; day:= 30*(month-1) + (4*month-7)//6; IF month > 4 THEN day:= day - 1 ELSE IF month = 2 THEN day:= day + 1; IF month > 2 THEN BEGIN year:= t.Getint; day:= IF Mod(year,400) = 0 THEN day - 1 ELSE day - Sign(Mod(year,4)); END After February; dayno:= day + t.Sub(9,2).Getint; END of dayno; DECsystem-10 SIMULA Language Handbook, part III Page 32 4.1 TIME AND DATE **** TEXT PROCEDURE DAYTIME Returns a reference to a new text object of length 8 with contents: "hh:mm:ss" where hh is hours mm is minutes ss is seconds. at the time of the call. This is the internationally standardized format for writing time-of-day. **** PROCEDURE TIMELIMIT(maxtime); REAL maxtime; The execution will be interrupted when the allotted time is up. The parameter is the time limit in seconds. If the argument is non-positive, the effect will be as if TIMELIMIT was never called. **** REAL PROCEDURE CPTIME Returns total CPU time spent since the beginning of the SIMULA program execution, expressed in seconds. **** REAL PROCEDURE CLOCKTIME Returned value is time of day in seconds, i.e. the absolute difference between the results of two successive calls is the time which elapsed between the calls (except when passing midnight). DECsystem-10 SIMULA Language Handbook, part III Page 33 4.2 REAL-TIME FOR MULTI-TERMINAL SIMULTANEOUS I/O. 4.2 REAL-TIME FOR MULTI-TERMINAL SIMULTANEOUS I/O. NOTE These procedures will usually not work on the DECsystem-20 under the TOPS-20 monitor. The goal of this is to allow one program to talk simultaneously to several conversational terminals and other on-going processes (jobs) in the computer. A break in one such dialouge should not inhibit the conversation with the other terminals and processes. Chapter 4.2.1 below describes three simple assembly procedures which you can use if you want to write your own scheduling of the parallel processes for handling the external devices. Chapter 4.2.2 and appendix A describe a simple scheduler for realtime applications written in SIMULA. The scheduler allows you to use SIMULA processes, one for each external device. 4.2.1 BASIC ASSEMBLY PROCEDURES FOR REAL TIME **** BOOLEAN PROCEDURE INPUTCHECK(inputfile); REF (infile) inputfile; The parameter infile is connected to an external device or another job process. INPUTCHECK will return TRUE if an INIMAGE can be made on the INFILE without delay, that is if data for the INIMAGE is already available. If the external device has no pending input, INPUTCHECK will return FALSE. INPUTCHECK will also return FALSE if the parameter is NONE, refers to a closed file or refers to a file where ENDFILE is TRUE. Supported devices are those which can be used from SIMULA. DSK is regarded to be ready for input without delay. (WARNING: INPUTCHECK may not work when heavy transmission of data is going on to the same terminal. In that case, use of the TTYCHECK procedure may be a better alternative.) TTY and PTY are the primary devices considered. See PTYCHECK etc in section 7 of this handbook. NOTE: Will not work on DECsystem-20! DECsystem-10 SIMULA Language Handbook, part III Page 34 4.2 REAL-TIME FOR MULTI-TERMINAL SIMULTANEOUS I/O. **** PROCEDURE SLEEP(sleepsec); REAL sleepsec; This procedure takes one parameter of type REAL and will stop the execution for a real time interval of at least this duration. Resolution is 0.001 on a DECsystem-10. A special version is needed on the DECsystem-20 (uses DISMS JSYS). **** INTEGER PROCEDURE INPUTWAIT(filearray,maxtime); REF (infile) ARRAY filearray; REAL maxtime; NOTE: This procedure will not work on DECsystem-20! This procedure stops the executing SIMULA program until INPUTCHECK would be TRUE for at least one of the parameter files, or until MAXTIME seconds have elapsed. MAXTIME = 0 indicates no time limit on the wait. Some of the array elements may be NONE. Whenever INPUTCHECK would be TRUE for one of these files, execution of the SIMULA program continues. If INPUTCHECK is already TRUE for one of the files when INPUTWAIT is called, then INPUTWAIT will return immediately to the calling program. The procedure returns an integer which is the index of a file in the parameter array from which input has been received, not necessarily the first one if input has been received from more than one of the input files. INPUTWAIT disregards those array elements which are NONE or which refer to closed files, and files with ENDFILE = TRUE. If all the array elements are disregarded in this way, then inputwait does not stop execution but returns an integer which is 1 less than the lower bound of the parameter array. If the wait was interrupted becuse of the time limit maxtime, then an integer which is 2 less than the lower bound of the parameter array is returned. Special feature: If the first file to wake up the program is a PTY file, and it has no output ready (ready for Inimage), but it can accept input (i.e. output on the corresponding Outfile), the returned value is the array index as above + 2^18. DECsystem-10 SIMULA Language Handbook, part III Page 35 4.2 REAL-TIME FOR MULTI-TERMINAL SIMULTANEOUS I/O. 4.2.2 REALTIME - A SCHEDULER FOR TERMINAL PROCESSES REALTIME is a separately compiled CLASS written in SIMULA as a subclass to SIMULATION. REALTIME is based on the idea that you have one SIMULA process connected to each conversational terminal. The processes can then execute in parallel, and the SIMULATION scheduler is used to distribute the execution between the terminals. The CLASS REALTIME is not only useful for simulation programs, it can also be used for other real time applications. A full description is included in appendix A. REALTIME will not work on DECsystem-20. 4.3 INPUT/OUTPUT 4.3.1 ASCII-FORMATTED I/O **** INTEGER PROCEDURE linecount(pf); REF (Printfile) pf; The parameter should be a reference to an open printfile object. Result: Returns the value of the LINESPERPAGE attribute of the printfile. **** TEXT PROCEDURE filename(x); REF (FILE) x; The parameter should be a simple valid reference to an object of an I/O class. Returns a reference to a text object whose value is equal to the NAME parameter of the FILE object. The resulting text value may or may not be stripped of blanks before return. **** CHARACTER PROCEDURE insinglechar(inf); REF (Infile) inf; The parameter should be a reference to an infile object using a terminal or a disk file. Returns next input character from the infile (after last INIMAGE) without waiting for break character. Succeeding INIMAGE will begin reading after the last character which has been input with INSINGLECHAR. Restriction: With the current release of DECsystem-10 DECsystem-10 SIMULA Language Handbook, part III Page 36 4.3.1 ASCII-FORMATTED I/O SIMULA, INSINGLECHAR only works on the controlling terminal or a disk file. **** CHARACTER PROCEDURE insngl(inf); REF (Infile) inf; The parameter should be a reference to an infile object using a terminal or a disk file. Returns next input character from the infile (after last INIMAGE). Unlike INSINGLECHAR, it works in line mode (waits for break character). Succeeding INIMAGE will begin reading after the last character which has been input with INSNGL. **** CHARACTER PROCEDURE getch GETCH is similar to INSINGLECHAR (see above) but has no parameter and always takes input from the conversational terminal controlling the current job. **** BOOLEAN PROCEDURE ttycheck(timelimit); REAL timelimit; TTYCHECK waits for an input character from the terminal and returns with the value TRUE if a character is typed in before TIMELIMIT seconds have elapsed, otherwise false. TIMELIMIT should not be greater than about 60 seconds. If TIMELIMIT is exactly zero, TTYCHECK waits indefinitely for input. TTYCHECK does NOT read the input, only checks for it. GETCH can be used to read the actual character when TTYCHECK returns TRUE. Ordinary SIMULA input procedures can also be used provided a line is typed in. **** PROCEDURE outchr(ofile,c,n); REF(Outfile)ofile; CHARACTER c; INTEGER n; Outputs n identical ASCII characters to the file, which is normally a terminal. Ofile.Image is not affected. If n<=0, no character is output, otherwise the character c is output n times. The buffer is used directly. Note: Use "forceout" before terminal input after the use of "outchr". Warning: ofile must be open, otherwise outchr will loop! DECsystem-10 SIMULA Language Handbook, part III Page 37 4.3.1 ASCII-FORMATTED I/O **** PROCEDURE outstring(ofile,t); REF(Outfile) ofile; TEXT t; Copies the text T directly to the output buffer bypassing Image. T is not changed. No output is forced. Output will appear when (Break)Outimage or FORCEOUT is called. ofile == NONE is treated as Sysout. Note: Use "forceout" before terminal input after the use of "outstring". **** PROCEDURE forceout(ofile); REF(Outfile)ofile; Ensures that all previous output to the TTY made with OUTCHR or OUTSTRING reaches the TTY. Use FORCEOUT before inputting anything from the terminal, to ensure that previous output reaches the terminal. FORCEOUT checks if there is any unwritten output in the buffer, so you can call it with little cost before every input operation. A procedure similar to FORCEOUT, but much slower, could be written in SIMULA: BEGIN TEXT imagecopy; imagecopy:- ofile.image; ofile.image:- NOTEXT; ofile.breakoutimage; ofile.image:- imagecopy; END; **** PROCEDURE read(..) Any parameters of type integer, (long) real or character. A reference type parameter, if used, must be a reference to an object of class infile or directfile. A parameter may be an array identifier of suitable type. New values for the actual parameters are obtained one by one from the current input file (initially SYSIN). If a parameter is an array identifier, new values are read and assigned for all elements of the array. A parameter which is a reference to an open infile or directfile causes all successive read operations (in the parameter list) to be applied to this file. DECsystem-10 SIMULA Language Handbook, part III Page 38 4.3.1 ASCII-FORMATTED I/O **** PROCEDURE write(..) Any parameters of type integer, (long) real, character or text. Constants and arrays are also allowed. A reference type parameter, if used, must be a simple reference to an object of class outfile, printfile or directfile. Values of actual parameters are output one by one on the current output file (initially SYSOUT). The output formats for the respective values are this machine plus 1 INTEGER i outint(i,n) where n is the number of digits printed for the largest possible integer on this machine plus 1 REAL x print x in flexible format according to: if x = 0 then outfix(x,0,w) else if abs(x) >= 10^d then outreal(x,d,w) else if abs(x) >= 10^(-e) then outfix(x,d-ilog(x)+(if abs(x) >= 1 then 0 else -1),w) else outreal(x,d,w); where d is number of significant digits, e is number of positions required for the exponent part and w := e + d + 2 (sign and dot positions). LONG REAL z same as for real but for long real significance CHARACTER c outchar(c) TEXT t outtext(t) If the actual parameter is an array identifier, the values of all its elements are output. A parameter which is a reference to an open printfile, outfile or directfile, causes all successive output operations to be applied to this file. Each call on WRITE ends with a call on OUTIMAGE which also is called implicitly if the image is filled before all parameters are processed. The final OUTIMAGE concerns every file mentioned; thus OUTIMAGE (for the previous file) is called when a new file reference is given as well as at the end of the parameter list. DECsystem-10 SIMULA Language Handbook, part III Page 39 4.3.2 UNFORMATTED (BINARY) I/O. 4.3.2 UNFORMATTED (BINARY) I/O. *********************** WARNING ************************** * Use of the procedures described in this section may make * * your programs difficult to move to another SIMULA system.* ************************************************************ Unformatted I/O is a tricky problem because we have many diverse requirements to put together, if possible, in one construct. > Very fast and efficient input and output of much data. > Simple input and output procedures, taking whole texts, arrays, or objects at a time. > General purpose input and output procedures, to be able to read and write easily any kind of file, e.g. a file containing line numbered lines, an object program file, a file which was produced by FORTRAN binary output, a disk directory file etc. etc. Two procedures INPUT and OUTPUT have been written. The first parameter to INPUT is a reference to an object of the CLASS infile or directfile, the first argument to OUTPUT is a reference to an object of the CLASS outfile or directfile. Both these procedures can take any number of additional parameters of any SIMULA type except label, switch or procedure. The action of OUTPUT is: **** INTEGER PROCEDURE OUTPUT OUTPUT returns the number of characters (over)written in the file. (Including any output produced which is not directly related to the parameters, e.g. null characters, null words etc. IF OUTPUT is made on a DIRECTFILE, it may be important for the user to know how many lines on the file that are covered by one or several calls to OUTPUT. He can do this by dividing the sum of the INTEGERs returned from OUTPUT with (image.length+2) of the directfile. Such a program will be machine-independent since OUTPUT returns number of characters. For parameters of type INTEGER, [LONG]REAL or BOOLEAN: the value of the parameter is output in such a way that it can be read by a FORTRAN program. One word (36 bits on the DECsystem-10) is output. Two words (72 bits) are output for LONG REALs. DECsystem-10 SIMULA Language Handbook, part III Page 40 4.3.2 UNFORMATTED (BINARY) I/O. For parameter of type CHARACTER: The internal value is output. SIMULA systems which pack CHARACTERs in words will output only the character byte, systems which store CHARACTERs in full words will output the full word. For parameters of type TEXT: First the LENGTH of the TEXT is output in the same way as if it had been given as an explicit INTEGER parameter to OUTPUT. Then the characters of the text value are output in internal implementation dependent format (ASCII-7-bit code packed 5 characters to a word on the DECsystem-10). If the characters are packed (as they are on the DECsystem-10) and the last output word is not full, then it is filled with NULL characters. The output TEXT value may n o t be preceded by NULL characters to permit faster output of subtexts. NOTEXT is output as only the integer LENGTH(=0), and nothing more. All characters which can be created with the procedure CHAR can be part of a TEXT which is written by OUTPUT and read by INPUT, and they should all be returned unchanged after OUTPUT and a corresponding INPUT. Note that for subtexts, only the subtext part of the value is output. If several texts have a common part, the value is still output completely for each text. For parameters of kind ARRAY: Each element of the ARRAY is output just as if it had been a non-array parameter to OUTPUT. (Even for REF-arrays.) The dimensions and bounds of the ARRAY are not output. For parameters of type REF: All value attributes of the referred object except REF and REF-array attributes are output just as if these attributes had been parameters to OUTPUT. REF or REF ARRAY attributes are not output at all. OUTPUT may, in an implementation dependent way, output other descriptive data about the structure of the CLASS to ensure correct input by INPUT as described below. If the argument to OUTPUT has the value NONE, then some kind of indication about this is output. The order in which the attributes are output is implementation dependent, and not necessarily the same as the order in which they are declared in the SIMULA source program. Important: If the parameter to OUTPUT is qualified by a SUPERCLASS (an outer class) of the actual object to which it DECsystem-10 SIMULA Language Handbook, part III Page 41 4.3.2 UNFORMATTED (BINARY) I/O. refers, then only attributes of the SUPERCLASS are output. **** INTEGER PROCEDURE INPUT INPUT works analogously with OUTPUT so that anything written with OUTPUT can be read with INPUT. The INTEGER value returned by INPUT is the number of characters read (see OUTPUT). If all the data required could not be read because of end of file, the negated number of characters that were read is returned. A call to INPUT when ENDFILE is already TRUE causes an error interrupt. For TEXT parameters, INPUT allocates a new TEXT of appropriate length using BLANKS and reads the string into the new TEXT. POS of the new text is set to 1. For ARRAY parameters: INPUT works just as if INPUT had been called once for each item in the array. For REF parameters: INPUT may do a certain amount of implementation dependent checking for agreement between the data in the file and the structure of the class to which the REF parameter refers. Those attributes of the CLASS which were output with OUTPUT will then be read in. TEXTs will be allocated with POS = 1 and LENGTH as from the file. INPUT will only work correctly for REF parameters if the data at that place in the file was previously written via a REF parameter to OUTPUT in a SIMULA program, and if the qualification of CLASS object which was output and the qualification of the parameter which is input from the same place in the file agree in the following respects: 1. The order and type of all attributes which are output and later input agree. 2. An attribute which was a parameter to the CLASS in OUTPUT must also be a parameter in INPUT. 3. If the CLASS has superclasses, then the attributes must be distributed between the subclasses in the same way. 4. The number and bounds of the dimensions of ARRAY attributes must agree. 5. If the argument to OUTPUT had the value NONE, then the corresponding argument to INPUT must also have the value NONE. DECsystem-10 SIMULA Language Handbook, part III Page 42 4.3.2 UNFORMATTED (BINARY) I/O. However, even if the requirements above are not fulfilled, INPUT is still protected from changing any data in core except attributes of the CLASS of type INTEGER, REAL, LONG REAL, CHARACTER or TEXT, which are accessible to the programmer. The following characteristics need n o t agree between the CLASS in INPUT and the CLASS in OUTPUT: 1. The SIMULA source program identifier names of the attributes. 2. Number, type, qualification etc. of attributes which were not output with OUTPUT (e.g. REF or PROCEDURE attributes). 3. The executable code in the CLASS. 4. The structure of such subclasses which were not output with OUTPUT because of the qualification of the REF parameter to OUTPUT. Note that the data OUTPUT with an OUTPUT statements does not constitute any "logical block". It is therefore possible to output certain data with "OUTPUT(file,a,b);" and then input the data with "INPUT(file,a); INPUT(file,b);". The organisation of files produced by OUTPUT and read by INPUT should, if reasonably possible, be such that FORTRAN programs on the same computer can read and write such files. **** INTEGER PROCEDURE PUTSIZE To help the programmer avoid overwriting previous information in a directfile there is an auxiliary INTEGER PROCEDURE PUTSIZE with the same kind of parameters as OUTPUT, except for the first parameter (giving the output file) which need not be given to PUTSIZE. PUTSIZE will return the same integer as would be returned by OUTPUT if called with an identical parameter list. **** BOOLEAN PROCEDURE BYPASS BOOLEAN PROCEDURE BYPASS(fileref,x) will move the internal buffer pointer x characters. X may be negative if fileref is a directfile. If end of file is encountered for an infile, BYPASS should return TRUE the first time; if called again a run time error should occur. The first parameter may refer to any kind of file except a printfile. DECsystem-10 SIMULA Language Handbook, part III Page 43 4.3.2 UNFORMATTED (BINARY) I/O. There is a further BOOLEAN PROCEDURE LOOK which takes two parameters, the first a reference to an infile object, the second of type INTEGER, [LONG] REAL or CHARACTER. LOOK examines the next word in the input buffer without reading it. Array parameters are not allowed. Should return TRUE if end of file is encountered; run time error for the next call. LOOK might for example be used to check if a line is line numbered before reading the line. COMBINING OUTPUT AND INPUT WITH INIMAGE AND OUTIMAGE. Future versions of DECsystem-10 SIMULA may, because of standardization work with other SIMULA systems, forbid the combination of OUTIMAGE and INIMAGE with OUTPUT and INPUT on the same file. The user is strongly recommended not to use such a combination. At your own risk, OUTPUT and INPUT can be combined with OUTIMAGE and INIMAGE on the same file. The file may be padded with NULLs after OUTIMAGE to a word boundary before the data written by OUTPUT. OUTPUT and INPUT do not work through the IMAGE of the file, which is thus not touched in any way. For DIRECTFILES, OUTPUT and INPUT will not change the value of LOC. The first OUTPUT or INPUT after an INIMAGE, OUTIMAGE or LOCATE will start at the indicated location. Successive OUTPUTs or INPUTs will start at the place in the file where the previous OUTPUT or INPUT stopped. A call to LOCATE preceding OUTPUT or INPUT will cause the OUTPUT/INPUT operation to start at the indicated position. Note that this means that an OUTIMAGE immediately after an OUTPUT may overwrite what was output with the OUTPUT. (Since LOC was not changed). OUTPUT may overwrite several lines in the directfile. OUTPUT and INPUT are allowed on INFILEs, OUTFILEs and DIRECTFILEs but not on PRINTFILEs. WARNING!!!! The procedures above have not been approved by the SIMULA DEVELOPMENT GROUP. If your programs rely on them, they may be difficult to transfer to SIMULA systems on other computers than the DECsystem-10. This is especially true if you combine OUTIMAGE and INIMAGE with OUTPUT and INPUT on the same file. DECsystem-10 SIMULA Language Handbook, part III Page 44 4.3.3 FILE HANDLING 4.3.3 FILE HANDLING **** REF (infile) PROCEDURE FINDINFILE(filespec); VALUE filespec; TEXT filespec; **** REF (directfile) PROCEDURE FINDDIRECTFILE(filespec,update); VALUE filespec, update; TEXT filespec; BOOLEAN update; **** REF (outfile) PROCEDURE FINDOUTFILE(filespec); VALUE filespec; **** REF (printfile) PROCEDURE FINDPRINTFILE(filespec); VALUE filespec; The four procedures findinfile, finddirectfile, findoutfile and findprintfile are rather similar to the statements NEW infile, NEW directfile, NEW outfile, NEW printfile. The difference is that the value NONE is returned, if such a file cannot be opened. For directfiles, if the input parameter update is TRUE, NONE is also returned if such a file cannot be opened for output. Reasons why a file cannot be opened may be: > That an infile does not exist. > That the file exists, but the file protection system of the computer does not allow opening. > For a directfile with update=TRUE or for an outfile: That you cannot open the file because someone else is updating it. If possible, the indicated file is reserved for the user so that "a:- finddirectfile(....,TRUE); a.open;" will not fail because someone else opens the file between the two procedure calls in the example. Example of use: FOR D:- finddirectfile("....",TRUE) WHILE D == NONE DO sleep(10); Will sleep until the directfile is updateable. **** BOOLEAN PROCEDURE SCRATCHFILE(filespec); VALUE filespec; TEXT filespec; If the file indicated by filespec exists and the program is allowed to delete (scratch) it, the file is deleted (scratched). The result is TRUE if a file could be deleted, FALSE if no file could be deleted. Delete (scratch) implies DECsystem-10 SIMULA Language Handbook, part III Page 45 4.3.3 FILE HANDLING removing the file so that it becomes inaccessible to this and other programs on the computer. File specifications of the form TMP:xxx are also acceptable and refer to incore files handled by the TMPCOR UUO on the DEC-system-10. **** PROCEDURE CLOSEOPEN(f); REF (file) f; Closes and opens a file again. If the file is an infile, this will mean that input will start from the beginning of the file. If it is an out(print)file, then - if it was defined with /ACCESS:APPEND, the result up to point of calling CLOSEOPEN, will be secured against system break-down, else - the old information will be lost at next close. INSPECT f DO BEGIN TEXT t; t:- image; close; open(t); END; **** BOOLEAN PROCEDURE DOTYPEOUT(tty); REF (outfile) tty; IF tty == conversational terminal AND the computer can restart typeout to the terminal THEN restart this typeout, beginning with the next outimage or breakoutimage, return TRUE; COMMENT on the DECsystem-10, the CTRL-O bit is reset; **** INTEGER PROCEDURE LASTLOC(df); REF (directfile) df; Lastloc returns the highest location of any image which has been written in the directfile during this or any previous use of the file. Returns -1 when the directfile is not open. **** INTEGER PROCEDURE MAXLOC(df); REF (directfile) df; Maxloc returns the largest integer such that "locate(maxloc); outimage;" will not cause any error interrupt of the program. DECsystem-10 SIMULA Language Handbook, part III Page 46 4.4 CONTROLLED ERROR HANDLING. 4.4 CONTROLLED ERROR HANDLING. See also the procedures SCANREAL, SCANINT and SCANFRAC in chapter 5 of this handbook for control of bad data errors. A proposal for advanced integrated error handling is described in appendix B. It is not implemented and no promise is made to ever do that. **** PROCEDURE enterdebug(maycontinue); BOOLEAN maycontinue; The debugging system is entered. If maycontinue is TRUE, execution of the SIMULA program is allowed to resume after the debugging session. **** PROCEDURE abort(message); VALUE message; TEXT message; BEGIN IF message =/= NOTEXT THEN BEGIN outimage; outtext("EXECUTION TERMINATED " "DUE TO CALL OF ERROR PROCEDURE"); outimage; outtext("MESSAGE: "); outtext(message); outimage; END; enterdebug(FALSE); END; **** PROCEDURE forsim(n); INTEGER n; FORTRAN subroutines called from SIMULA are not allowed to do I/O or otherwise access the FORTRAN high segment, since SIMULA requires the SIMULA high segment. If you want to use a FORTRAN subroutine which uses facilities in the FORTRAN high segment, you can load your program with the FORSIM procedure. References from FORTRAN subroutines to the FORTRAN high segment will then be trapped by FORSIM. Note however that FORSIM does not perform any actual I/O, so the I/O in FORTRAN subroutines will become dummy statements. FORSIM may also be called from FORTRAN with no parameter. If n=0, any attempt at I/O in a FORTRAN routine is trapped and a message is written the first time, but execution continues. DECsystem-10 SIMULA Language Handbook, part III Page 47 4.4 CONTROLLED ERROR HANDLING. If n>0, execution continues n-1 times, and then the message is typed followed by an error entry into SIMDDT. If n<0, execution continues, and no message is typed. 4.5 SCHEDULING AND JOB CONTROL **** PROCEDURE run(filespec,entrypoint); VALUE filespec; TEXT filespec; INTEGER entrypoint; FILESPEC is a text expression specifying a file containing an executable program. RUN will transfer control to the program specified without closing files. If the program is not found in the user area, and device and ppn were not given, SYS: is tried as device. On failure, RUN aborts via HALT. NOTE: If the RUN procedure is loaded in the high segment, it will be wiped out. Thus only one attempt can be made. ENTRYPOINT is an integer in the range [1,16], which specifies where the program should be started. ENTRYPOINT = 1 is the normal value and specifies the standard entry point which is used when the program is executed via a monitor RUN command or the sequence GET, START. The value 2 corresponds to the secondary entry of standard CUSP's like PIP, COMPIL, MACRO, LINK, SIMULA. When started in this way, the CUSP will try to read a temporary command file, which may be in core as a so-called TMPCOR file with a three-character name, e.g. PIP or SIM. If the CUSP does not find the relevant TMPCOR file, it will look for a disk file with a name of the form jjjppp.TMP, where jjj is the decimal job number with leading zeros if necessary, and ppp is the three-character name. Examples: 007PIP.TMP, 129SIM.TMP. Filenames with the required format can be generated by the procedure TMPNAM. Normally, a CUSP command file contains several lines specifying output and input files. The last line can be a file specification for an executable program, followed by "!", e.g. a LOAD or EXECUTE command will generate a command file to the compiler whose last line is "LINK!" specifying that LINK-10 should get control at its secondary entry point. DECsystem-10 SIMULA Language Handbook, part III Page 48 4.5 SCHEDULING AND JOB CONTROL Command files may thus be generated in a SIMULA programs, and by using SAVE and RUN together, control may be automatically regained after executing another program. Example: A SIMULA program could first save itself by calling the procedure SAVE (see below), then generate a command file to PIP, then call PIP with the procedure RUN, then via ! in the PIP command file cause PIP to return control to the saved SIMULA program. **** BOOLEAN PROCEDURE submit Parameters: One text reference or text constant. Result: The parameter is a file reference with the same format as the text parameter to the class INFILE. The file, if found, is put into the input batch stream on the computer. Returns TRUE if this could be done, FALSE otherwise. The current job continues, independent of the new file in the batch stream. **** INTEGER PROCEDURE save(filespec,continueonerror); VALUE filespec; TEXT filespec; BOOLEAN continueonerror; The PROCEDURE save forces a garbage collection and then outputs all dynamic memory to the file described by filespec. The default file extension is .SAV, which is supplied if no extension appears in filespec. If filespec==NOTEXT, FREEZE (see below) is called from SAVE. The second parameter, CONTINUEONERROR, is TRUE if error messages from SAVE should be suppressed. Failure will be indicated by the returned value, see below. If CONTINUEONERROR is FALSE, the run time system may issue error messages and demand user response. This may eventually lead to successful completion if the user elects to proceed after dealing with the error messages. Save returns a value which indicates program status on continuation. The possible values for the returned value (S) are: S<0: Some error occurred, e.g. the file specified may be protected. The program may try to recover by giving another file specification and calling SAVE again. S=0: The program was continued directly, save was successful. This value is also returned if RESTORE was called, see below. DECsystem-10 SIMULA Language Handbook, part III Page 49 4.5 SCHEDULING AND JOB CONTROL 1<=S<=16: The program was restarted via the RUN procedure or an equivalent command or code sequence. The normal value 1 is assumed when the saved file is executed by a RUN monitor command or by the RUN procedure with second parameter = 1. Values 2-16 occur if the second parameter to the RUN procedure is 2-16. **** PROCEDURE restore(filespec); VALUE filespec; TEXT filespec; The procedure RESTORE restores dynamic memory to the contents of the file indicated by filespec. Execution is then resumed following the point where SAVE (or FREEZE) was called to create the file indicated by filespec. SAVE is ignored and a warning message is issued when any file except sysin or sysout is open. **** WARNING **** Sysin and sysout should both be the user terminal, since they will be read and written from the start when restarting, unless sysout is written in append mode (switch /ACCESS:APPEND). Sysin and sysout can also refer to the .CTL and .LOG file of a batch job. The SAVE-RESTORE facility is intended primarily for applications with a fairly time-consuming build-up phase, such as a large simulation, where one wants to explore different continuations from the same branching point. Together with the RUN procedure, which works like an extended RESTORE, one can build a "program system" consisting of many segments controlled almost fully by one or several SIMULA programs. See further the RUN procedure (above). **** PROCEDURE freeze(returncode); NAME returncode; INTEGER returncode; FREEZE is a simpler and smaller version of SAVE. The parameter RETURNCODE assumes the same values as SAVE. The files of the program are handled as in SAVE. FREEZE does not itself write a save file but exits to monitor level, where the user can issue a SAVE command with an appropriate file name. Execution can be continued by a START command, which will give a returned value = 1 in RETURNCODE. (START can also be given with a non-zero argument, but this is tricky and not generally recommended, since it is impossible to guard against wild results). The saved file can be handled as explained above. If no save file is wanted, the user simply issues a CONTINUE command, giving the result RETURNCODE = 0, and execution continues. DECsystem-10 SIMULA Language Handbook, part III Page 50 4.5 SCHEDULING AND JOB CONTROL **** PROCEDURE exit(n); INTEGER n; EXIT(0) terminates the program immediately, exactly as if the user had typed CONTROL-C (twice). Useful if you want your program to terminate with some short message like "Thank you." instead of the standard message "End of execution...". Note that you have to close your files (except TTY files) explicitly, since no checking of open files will occur. EXIT(0) is therefore also useful where the program is to terminate without closing all files - not invoking the standard SIMDDT action. Note that if EXIT(0) is called just before last END, CONTINUE will cause the standard termination message "End of execution.." to appear. One additional CONTINUE will invoke SIMDDT as usual. EXIT(1) will terminate execution just as if the final END of the program had been passed. The standard message will appear. EXIT(2) will invoke SIMDDT in debug mode, and the user is free to do anything SIMDDT permits, including issuing the EXIT command to terminate execution. C.f. procedure ENTERDEBUG. Other values of n are reserved for possible extensions. DECsystem-10 SIMULA Language Handbook, part III Page 51 4.6 MEMORY HANDLING 4.6 MEMORY HANDLING [Not ready] This section concerns procedures which are not implemented with the current release of DECsystem-10 SIMULA. We may perhaps never implement them. 4.6.1 PRIMARY MEMORY HANDLING EXTERNAL INTEGER PROCEDURE freebits Parameters: One integer parameter. Negative parameter means no garbage collection, zero or positive parameters means garbage collection. If the parameter is positive, then it indicates the amount of core (in bits) that will be assigned to the job after the forced garbage collection, to be used up before the next automatic garbage collection. If the parameter is too large, no error is caused, the system will then wait as long as technically possible before the next garbage collection. If the parameter is zero the allocation will follow the default procedure. For systems with fixed core size, positive and zero parameter will probably be equivalent. Result: Forces a garbage collection for non-negative parameter. Returns the integer value in bits of the amount of more memory that this program can allocate without causing an error interrupt. For a virtual memory machine, the returned value is virtual core. If the parameter is negative, then the returned value is as said above minus present amount of garbage. DECsystem-10 SIMULA Language Handbook, part III Page 52 4.6.2 VIRTUAL MEMORY HANDLING (OR OVERLAY FACILITY) 4.6.2 VIRTUAL MEMORY HANDLING This might use the overlay mechanism built into the DECsystem-10 linking loader. Overlay might be between separately compiled segments in SIMULA. Problems may occur with unique-numbered entry-points and with the debugging system? If overlay is considered, overlaying of SIMDDT with some other system functions should also be considered at the same time. Implementing overlay into the DECsystem-10 SIMULA system will give many technical difficulties with the debugging system, prototypes etc. and should perhaps therefore have low priority, especially if the virtual memory system could be used instead. A way of making the virtual memory system on the DECsystem-10 work as an overlay system, with high efficiency, is to make a small change to the page fault handler allowing a user program to ask for certain pages to be swapped out. We could then add to the SIMULA system a **** PROCEDURE swap, with one or more parameters which are either EXTERNAL PROCEDUREs, or REF-s qualified by EXTERNAL CLASSes. SWAP will swap out all pages containing only object code for the parameter PROCEDUREs and CLASSes. Note that the REF-parameters to SWAP may have the value NONE and still cause swapping out of object code. Prefixing classes are not swapped out if not explicitly indicated. Example of use: BEGIN EXTERNAL PROCEDURE p; EXTERNAL CLASS a, b, c; EXTERNAL PROCEDURE swap; COMMENT a is prefix to b, b is prefix to c; REF (a) pa; REF(b) pb; REF(c) pc; swap(p,pb,pc); COMMENT will swap out the object code of p, b and c, but not the object code of a; END; At the same time, we should perhaps add procedures to SIMULA to be able to set the physical core limit and the physical guideline from a SIMULA program. **** BOOLEAN PROCEDURE corelimit(i); INTEGER i; COMMENT sets PHYSICAL CORE LIMIT. The parameter "i" is limit in bits. To get limit in pages, multiply by 36*512 (if wordsize is 36 bits and pagesize is 512 words). E.G. CORELIMIT(50*36*512) will set a limit of 50 pages. Returns TRUE if setting was successful; DECsystem-10 SIMULA Language Handbook, part III Page 53 4.6.2 VIRTUAL MEMORY HANDLING (OR OVERLAY FACILITY) ? Perhaps the parameter should be given in number of pages, not in number of bits???? **** BOOLEAN PROCEDURE COREGUIDE(i); INTEGER i; COMMENT same for setting physical guideline; 4.7 ENVIRONMENT ENQUIRY **** INTEGER PROCEDURE maxint The largest positive integer number. **** LONG REAL PROCEDURE maxreal The largest positive long real number. **** LONG REAL PROCEDURE minreal The smallest normalized positive real number. **** INTEGER PROCEDURE approx(a,b); [LONG] REAL a,b; COMMENT Returns number of bits differing, or, if overflow, - maxint; **** INTEGER PROCEDURE DIMENSIONS Parameters: One of kind ARRAY. Result: Number of dimensions (subscripts) of the ARRAY. **** TEXT PROCEDURE IMPLEMENTATION Parameters: none Result: Returning a text reference to a text object with the value "DEC-10 KI" ("IBM 370/145", "UNIVAC 1110", etc). The exact wording of this text is decided by each implementation, but the first word should indicate manufacturer, the following type and model if possible. The procedure may optionally return the version of the SIMULA system e.g. "IBM 370/145 VERSION 3.03". A list of what the returned reference should begin with for some wellknown computers: "IBM 360", "IBM 370", "UNIVAC 11", "DEC-10", "CDC CYBER", "CII", "ICL SYSTEM-4", etc. DECsystem-10 SIMULA Language Handbook, part III Page 54 4.7 ENVIRONMENT ENQUIRY **** TEXT PROCEDURE LOGINFO Parameters: none Result: Returns a text reference, machine-dependent, with the information customarily given at LOGIN or in a JOB card. (Monitor version, Project number, programmer number, external job number, internal job number, priorities, protection privilegies etc.) 4.8 PACKING INTO PARTS OF WORDS By Stephan Oldgren, ENEA Data AB This chapter describes two general-purpose and machine-independent packing procedures. They will make it easier to produce programs which can be moved to other computers than the DECsystem-10. Chapter 7 below describes more efficient, less general-purpose and more machine-dependent packing procedures. **** BOOLEAN PROCEDURE PACK and **** BOOLEAN PROCEDURE UNPACK are two external MACRO-10 procedures which pack and unpack data in parts of words. 4.8.1 PACK and UNPACK, PARAMETERS In the most simple case the procedures can be called with four parameters as follows: Parameter kinds for procedure PACK: Parameter 1: The area into which data are to be packed. This parameter can be of type INTEGER, REAL, LONG REAL or BOOLEAN and of kind SIMPLE or ARRAY. The procedure will check that the bounds of this area are not exceeded. Parameter 2: A non-negative INTEGER which specifies the number of bits to be bypassed at the beginning of the area specified in parameter 1, before start of packing. The purpose of this is to allow partial packing and unpacking. Parameter 3: The data to be packed. This parameter can be DECsystem-10 SIMULA Language Handbook, part III Page 55 4.8 PACKING INTO PARTS OF WORDS of type INTEGER, REAL, LONG REAL, CHARACTER, BOOLEAN or TEXT and of kind SIMPLE or ARRAY. Observe that TEXT variables should not be NOTEXT. Parameter 4: An INTEGER indicating the size in number of bits of the packed field. If parameter 3 is an array parameter 4 is the size for one element of the array . The value of this parameter must be as follows: Type of less than greater than parameter 3 or equal or equal INTEGER WORD LENGTH 2 REAL - " - 10 CHARACTER - " - 7 BOOLEAN - " - 1 LONG REAL DOUBLE WORD LENGTH 10 TEXT 7 6 The procedure will also accept any even number of parameters up to thirty. Then parameters 5,7 etc. are of the same kind as parameter 3 and parameters 6,8 etc. are of the same kind as parameter 4. The procedure UNPACK takes the same parameters as procedure PACK and works conversely. All packing and unpacking is done independently of word boundaries. If for example parameter 2 is 70 and parameter 4 is 6, then the data will be packed into a 6-bit area consisting of the last two bits in the second word of parameter 3, and the first four bits of the third word. 4.8.2 PACK and UNPACK, ERROR HANDLING The program will be interrupted if the number of parameters is less than four or not even. Before the interrupt, the following messages is written: "PARAMETER IS MISSING IN PROCEDURE" "? ERROR IN JOB ...." "ZYQ214 ERROR IN UTILITY PROCEDURE" Control is transferred to SIMDDT. DECsystem-10 SIMULA Language Handbook, part III Page 56 4.8.1 PACK and UNPACK, PARAMETERS In the following cases the BOOLEAN procedure PACK will return the value FALSE: a) Parameters are of illegal type or kind. b) Bounds of area specified in Parameter 1 are exceeded. c) TEXT variable is NOTEXT. d) Parameter 4(,6 etc) has illegal value. e) Truncated bits of an INTEGER variable are significant (ie. contain ones if positive variable or zeroes if negative variable). The procedure UNPACK will return FALSE in the same cases. 4.8.3 PACK and UNPACK, METHODS OF PACKING INTEGERs and BOOLEANs are packed by deleting bits after the sign bit at the start of the word to be packed. CHARACTERs are packed by deleting the necessary bits in the left part of the word to be packed. REALs and LONG REALs are packed by deleting as many bits as necessary at the low order end of the (single or double) word to be packed. TEXTs are packed by conversion of the characters from ASCII-7 to SIXBIT if the parameter for size of the packed field is 6. If the parameter is 7 , each character is transferred without conversion. LENGTH and POS are not packed implicity. 4.8.4 PACK and UNPACK, METHODS OF UNPACKING INTEGERs and BOOLEANs are unpacked by copying the sign bit into the previously deleted bits. CHARACTERs are unpacked by returning previously deleted bits as zeroes. REALs and LONG REALs are unpacked by filling up the previously deleted bits with zeroes. TEXTs are unpacked by conversion of the characters from SIXBIT to ASCII-7 if the parameter for size of the packed field is 6. If the parameter is 7, each character is transferred without conversion. The LENGTH of the TEXT indicates the number of characters to unpack. DECsystem-10 SIMULA Language Handbook, part III Page 57 4.8.5 PACK and UNPACK, EXAMPLES 4.8.5 PACK and UNPACK, EXAMPLES Example of SIMULA main program: BEGIN EXTERNAL BOOLEAN PROCEDURE pack,unpack; BEGIN ARRAY pool[1:100]; INTEGER i,j; TEXT t,s; ! check integer; i:=-5; Outint(i,2); Outimage; pack(pool,0,i,5); unpack(pool,0,j,5); Outint(j,2); Outimage; ! check text; t:- Copy("*?AZz"); s:- Blanks(5); Outtext(t); Outimage; pack(pool,30,t,6); unpack(pool,30,s,6); Outtext(s); Outimage; ! check illegal; pack(pool,0,t); END; END of program Example of output from execution of the program above: -5 -5 *?AZz *?AZZ PARAMETER IS MISSING IN PACK PROCEDURE ? ERROR IN JOB 15 AT PACK O 002314 ZYQ214 ERROR IN UTILITY PROCEDURE * DECsystem-10 SIMULA Language Handbook, part III Page 58 4.9 MIN AND MAX 4.9 MIN AND MAX These procedures are efficient - almost no overhead. **** INTEGER PROCEDURE imax(x,y); INTEGER x,y; rmax:=IF x>y THEN x ELSE y; **** INTEGER PROCEDURE imin(x,y); INTEGER x,y; imin:=IF xy THEN x ELSE y; **** REAL PROCEDURE rmin(x,y); REAL x,y; rmin:=IF xy THEN x ELSE y; **** LONG REAL PROCEDURE lmin(x,y); LONG REAL x,y; lmin:=IF x 0 THEN upto:- IF i > t.Length THEN t ELSE t.Sub(1,i-1); DECsystem-10 SIMULA Language Handbook, part III Page 60 5.1 PARTITIONING OF TEXTS **** TEXT PROCEDURE frontstrip(t); TEXT t; Returns a reference to the longest subtext of T starting with the first non-blank character. BEGIN t.Setpos(1); WHILE t.More DO IF t.Getchar NE ' ' THEN BEGIN frontstrip:- t.Sub(t.pos-1,t.Length-t.pos+2); t.Setpos(0); END; END; **** CHARACTER PROCEDURE fetchar(t,p); TEXT t; INTEGER p; Returns the P:th character from T. IF p >= 1 AND p <= t.length THEN fetchar:= t.Sub(p,1).Getchar; **** PROCEDURE depchar(t,p,c); TEXT t; INTEGER p; CHARACTER c; Deposits the character C in the text T at position P. If P is out of range, no action will be taken; IF p >= 1 AND p <= t.Length THEN t.Sub(p,1).Putchar(c); **** TEXT PROCEDURE tsub(t,p,l); TEXT t; INTEGER p,l; TSUB acts like text attribute Sub. In cases where t.Sub(p,l) would have caused a run time error, NOTEXT is returned. IF p >= 1 AND l >= 0 AND p+l <= t.Length + 1 THEN tsub:- t.Sub(p,l); **** TEXT PROCEDURE getitem(tt); NAME tt; TEXT tt; First any blanks or tabs after POS in the text are skipped. Then the procedure reads an item. By an item is meant either an identifier (a letter followed by letters, digits) or a number (a series of digits which may contain one dot) or any other character except blank. The input text "IF CAR.WHEEL_SIZE > 13.5" will thus by successive calls to GETITEM give: IF/CAR/./WHEEL/_/SIZE/>/13.5 The result is a reference to a subtext (not a copy) of the DECsystem-10 SIMULA Language Handbook, part III Page 61 5.1 PARTITIONING OF TEXTS text passed as a parameter, or NOTEXT if there are only blanks left or pos > length. Notes: 1. The position of the parameter starts from current pos. 2. Preceding blanks or tabs (if any) are skipped. 3. The resulting position indicator setting is that following the last character of the matched word; IF tt =/= NOTEXT THEN BEGIN CHARACTER window; INTEGER startpos; TEXT t; CHARACTER PROCEDURE Getchar; IF t.more THEN Getchar:= window:= t.Getchar ELSE GOTO out; BOOLEAN PROCEDURE idchar(c); CHARACTER c; idchar:= letter(c) OR digit(c); t:- tt; t.Setpos(tt.Pos); startpos:= t.length+1; Getchar; WHILE window = ' ' OR window = Char(9) DO Getchar; startpos:= t.Pos-1; IF NOT letter(window) THEN BEGIN IF digit(window) THEN WHILE digit(Getchar) DO; IF window = '.' THEN WHILE digit(Getchar) DO; END ELSE WHILE idchar(Getchar) DO; IF t.Pos > startpos + 1 THEN t.Setpos(t.Pos-1); out: getitem:- t.Sub(startpos,t.Pos-startpos); tt.Setpos(t.Pos); END; NOTE The procedures INITEM, LOOKAHEAD, OUTLINE, BREAKOUTLINE, INLINE all have a file reference parameter. It may not be omitted - but may be NONE, in which case SYSIN or SYSOUT are assumed as appropriate. **** TEXT PROCEDURE initem(fileref); REF(infile COMMENT or directfile;) fileref; Same as GETITEM for files. LASTITEM is called before reading an item. NOTEXT is returned if only blanks or tabs are left in the file or if ENDFILE is TRUE. Note that since the ITEM-s are not copied, a call on INITEM may cause inimage and thus destroy previously located items, if they DECsystem-10 SIMULA Language Handbook, part III Page 62 5.1 PARTITIONING OF TEXTS have not been copied by the program. INSPECT fileref DO initem:- IF lastitem THEN NOTEXT ELSE getitem(image); 5.2 SEARCHING AND TESTING OF TEXTS **** TEXT PROCEDURE scanto(tt,c); NAME tt; VALUE c; TEXT tt; CHARACTER c; SCANTO will scan from pos in TT until the next occurrence of the character C. Pos of TT will be placed after the character found, and the subtext from previous pos up to but not including the found character will be returned as result (not copied). If no C is found, the rest of the text is returned. BEGIN TEXT t; INTEGER p; t:- tt; p:= t.pos; WHILE t.more DO IF t.getchar = c THEN BEGIN scanto:- t.sub(p,t.pos-p-1); GOTO out; END; scanto:- from(t,p); out: tt.setpos(t.pos); END of scanto; **** CHARACTER PROCEDURE findtrigger(master,triggers); NAME master; TEXT master,triggers; Starting from current MASTER.POS, find first occurrence of any of the characters in TRIGGERS. BEGIN CHARACTER c; TEXT t; t:- master; WHILE t.More DO BEGIN c:= t.Getchar; triggers.Setpos(1); IF scanto(triggers,c) =/= triggers THEN BEGIN !C found in triggers; findtrigger:= c; GO TO out; END END loop; out: master.Setpos(t.Pos); END of findtrigger; DECsystem-10 SIMULA Language Handbook, part III Page 63 5.2 SEARCHING AND TESTING OF TEXTS **** TEXT PROCEDURE skip(tt,c); NAME tt; TEXT tt; CHARACTER c; Skip will skip all characters C in the text T starting from T.POS. IF the next character (at T.POS) is not equal to C, T.POS will remain unaltered, otherwise it will be situated at the first character not equal to C. Skip will also return the subtext rest of t. ; BEGIN TEXT t; t:- tt; WHILE t.More DO IF t.Getchar NE c THEN BEGIN t.Setpos(t.Pos-1); skip:- t.Sub(t.Pos,t.Length-t.Pos+1); GO TO out END; out: tt.Setpos(t.Pos) END of skip; **** BOOLEAN PROCEDURE frontcompare(string, config); VALUE config; TEXT string, config; Starting at current pos, does STRING begin with a substring equal to CONFIG? IF string.Length - string.pos + 1 >= config.Length THEN frontcompare:= string.Sub(string.pos,config.Length) = config; **** BOOLEAN PROCEDURE upcompare Upcompare is similar to frontcompare except that a match is found also when the character in the first parameter string is a lower case letter and the other character is upper case of the same letter. **** INTEGER PROCEDURE search(master, config); TEXT master, config; Returns pos of 1st character of the first substring equal to config, starting at the current Pos of MASTER. If no such subtext exists, then the result is MASTER.Length+1. BEGIN WHILE master.Length - master.Pos + 1 >= config.Length DO IF master.Sub(master.Pos,config.Length) = config THEN GO TO out ELSE master.Setpos(master.Pos+1); master.Setpos(0); out: search:= master.Pos; END of search; DECsystem-10 SIMULA Language Handbook, part III Page 64 5.2 SEARCHING AND TESTING OF TEXTS **** INTEGER PROCEDURE checkint(t); NAME t; TEXT t; CHECKINT analyses the text t from t.pos and on. If a getint operation from this position is legal the returned value is +1. If it would give an error - then if the remaining text string is blank, the result is 0, otherwise -1. Pos is placed after a legal item (+1), after the first non-blank illegal character (-1) or after the text if the rest is empty (0). C.f. SCANINT. Maxintegerlength and Maxfloatinteger are implementation dependent. See also procedure GETTYPE below. IF t.Strip.Length < t.Pos THEN t.Setpos(0) ELSE BEGIN TEXT u; CHARACTER c; INTEGER p; LONG REAL x; c:= ' '; u:- t; WHILE (c = ' ' OR c= Char(9)) AND u.More DO c:= u.Getchar; IF c = ' ' OR c = Char(9) THEN !checkint:= 0; ELSE IF c = '+' OR c = '-' THEN BEGIN c:= ' '; WHILE c = ' ' AND u.More DO c:= u.Getchar; IF Digit(c) THEN BEGIN trymoredigits: WHILE c = '0' AND u.More DO c:= u.Getchar; p:= u.Pos - 1; WHILE Digit(c) AND u.More DO c:= u.Getchar; p:= (IF NOT Digit(c) THEN u.Pos-1 ELSE u.Pos) - p; IF p <= maxintegerlength - 1 THEN checkint:= 1 ELSE IF p > maxintegerlength + 1 THEN checkint:= -1 ELSE BEGIN x:= u.Sub(IF NOT Digit(c) THEN u.Pos-p-1 ELSE u.Pos-p,p).Getreal; checkint:= IF Abs(x) <= maxfloatinteger THEN 1 ELSE -1 END maxinteger digits; IF NOT Digit(c) THEN u.Setpos(u.Pos-1); END digits ELSE GO TO error END sign ELSE IF Digit(c) THEN GO TO trymoredigits ELSE BEGIN error: checkint:= -1 END; t.Setpos(u.Pos) END of checkint; **** INTEGER PROCEDURE checkreal(t); NAME t; TEXT t; CHECKREAL analyses the text t from t.pos and on. If a getreal operation from this position is legal the returned value is +1. If it would give an error - then if the remaining text string is blank, the result is 0, otherwise DECsystem-10 SIMULA Language Handbook, part III Page 65 5.2 SEARCHING AND TESTING OF TEXTS -1. Pos is placed after a legal item (+1), after the first non-blank illegal character (-1) or after the text if the rest is empty (0). C.f. SCANREAL. Ln10, Lowtencharacter, Lnmaxreal, Maxdigits are implementation dependent. See also procedure GETTYPE below. IF t.Strip.Length < t.Pos THEN t.Setpos(0) ELSE BEGIN TEXT u; CHARACTER c; INTEGER expitem,p,p2; LONG REAL decitem; PROCEDURE skip; BEGIN c:= ' '; WHILE (c = Char(9) OR c = ' ') AND u.More DO c:= u.Getchar END of skip; decitem:= 1.0&&0; u:- t; skip; p:= u.Pos - 1; IF c = ' ' OR c = Char(9) THEN !checkreal:= 0; ELSE IF c = lowtencharacter THEN BEGIN testexp: skip; p:= u.Pos - 1; IF c = '+' OR c = '-' THEN BEGIN c:= ' '; WHILE c = ' ' AND u.More DO c:= u.Getchar END; IF Digit(c) THEN BEGIN WHILE Digit(c) AND u.More DO c:= u.Getchar; p2:= IF NOT Digit(c) THEN u.Pos - 1 ELSE u.Pos; u.Setpos(p); IF checkint(u) = 1 THEN expitem:= u.Sub(p, p2-p).Getint ELSE GO TO error; u.Setpos(p2+1); IF decitem = 0 THEN checkreal:= 1 ELSE IF Ln(Abs(decitem)) + expitem*ln10 < lnmaxreal THEN checkreal:= 1 ELSE GO TO error END digit in exponent ELSE GO TO error END exponent ELSE IF Digit(c) THEN BEGIN testdigits: p:= u.Pos - 1; WHILE Digit(c) AND u.More DO c:= u.Getchar; p2:= IF NOT Digit(c) THEN u.Pos - 1 ELSE u.Pos; IF p2 - p > maxdigits - 1 THEN GO TO error; IF c = lowtencharacter THEN BEGIN realpart: decitem:= u.Sub(p,p2-p).Getreal; GO TO testexp END ELSE IF c = '.' THEN BEGIN testfrac: IF u.More THEN c:= u.Getchar; IF NOT Digit(c) THEN GO TO error; WHILE Digit(c) AND u.More DO c:= u.Getchar; p2:= IF NOT Digit(c) THEN u.Pos - 1 ELSE u.Pos; IF c = lowtencharacter THEN GO TO realpart END fraction; IF NOT Digit(c) THEN u.Setpos(u.Pos-1); checkreal:= 1 END digit ELSE IF c = '.' THEN GO TO testfrac ELSE DECsystem-10 SIMULA Language Handbook, part III Page 66 5.2 SEARCHING AND TESTING OF TEXTS IF c = '+' OR c = '-' THEN BEGIN c:= ' '; WHILE c = ' ' AND u.More DO c:= u.Getchar; GO TO IF c = lowtencharacter THEN testexp ELSE IF Digit(c) THEN testdigits ELSE IF c = '.' THEN testfrac ELSE error; END sign ELSE BEGIN error: checkreal:= -1 END; t.Setpos(u.Pos) END of checkreal; **** INTEGER PROCEDURE CHECKFRAC Same as checkint/checkreal for grouped items. **** INTEGER PROCEDURE gettype(paratext); NAME paratext; TEXT paratext; Investigate the subtext of the parameter without leading blanks. Will return: 1 If the next item is readable by GETREAL and contains a dot and/or a lowtencharacter, else 2 If the next item is readable by GETINT, else 3 If the next item begins with a letter, else 4 If the next item is not NOTEXT, else 5 If the next item is NOTEXT(i.e. if the parameter to gettype is either NOTEXT or a wholly blank TEXT); This procedure cannot be coded fully machine-independent, since the maximal size of integers and reals vary with the machine; **** INTEGER PROCEDURE hash(t,n); VALUE t; TEXT t; INTEGER n; Returns a hash coded value of T in the interval [0:N-1]. It is recommended to choose n as a prime number. BEGIN TEXT tstrip; INTEGER a; tstrip:-frontstrip(t.Strip); IF tstrip == NOTEXT then hash:= Mod(t.Length,n) ELSE BEGIN a:= Rank(tstrip.Getchar); if tstrip.Length > 3 then BEGIN a:= a + 8*Rank(tstrip.Getchar); a:= a +64*Rank(tstrip.Getchar); END; tstrip.Setpos(tstrip.Length); a:= a + 512*Rank(tstrip.Getchar) + t.Length; hash:= Mod(a,n); END; DECsystem-10 SIMULA Language Handbook, part III Page 67 5.2 SEARCHING AND TESTING OF TEXTS END of hash; **** BOOLEAN PROCEDURE menu(t,i,table,n); NAME i; TEXT t; TEXT ARRAY table; INTEGER i,n; The MENU procedure is designed to be used for validity checks in MENU-like command requests. [See chapter 7 - MENY for command handling in Swedish.] The MENU procedure will check for nonambiguous correspondence between T and an element from the text array TABLE. (Note that an exact match will always be accepted, even if it is a substring of another table element.) The table must contain upper case letters only with no trailing blanks. The input may have lower case letters. If no match is found, I will return 0. If T is ambiguous, I returns -1, otherwise the table matching index will be returned. An example: ! BEGIN TEXT ARRAY menutable[1:5]; ! INTEGER index; ! BOOLEAN ok; ! TEXT t; ! menutable[1]:- Copy("STOP"); ! menutable[2]:- Copy("START"); ! menutable[3]:- Copy("END"); ! menutable[4]:- Copy("ENDURE"); ! menutable[5]:- Copy("EXIT"); ! t:- <... input ...>; ! ok:= menu(t,index,menutable,5); ! OK will become TRUE if T is equal to START (INDEX = 2) start (INDEX = 2) Sta (INDEX = 2) sto (INDEX = 1) enD (INDEX = 3) endure (INDEX = 4) endu (INDEX = 4) and FALSE for ST (INDEX = -1) x (INDEX = 0) e (INDEX = -1) en (INDEX = -1) EXTERNAL Procedures required: TEXT PROCEDURE upcase; BEGIN TEXT u; INTEGER j,k,hit; DECsystem-10 SIMULA Language Handbook, part III Page 68 5.2 SEARCHING AND TESTING OF TEXTS ! Checking the array index bounds: ; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; u:- table[1]; u:- table[n];; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; u:- upcase(t.Strip); FOR j:= 1 STEP 1 UNTIL n DO IF u = table[j] THEN BEGIN hit:= 1; k:= j; GO TO ready END ELSE IF u.Length < table[j].Length THEN BEGIN IF u = table[j].Sub(1,u.Length) THEN BEGIN k:= j; hit:= hit + 1 END END; ready: menu:= hit = 1; i:= IF hit = 1 THEN k ELSE Sign(-hit) END of menu; **** BOOLEAN PROCEDURE lookup(t,ta,low,high,i); NAME i; TEXT t; TEXT ARRAY ta; INTEGER low,high,i; Procedure LOOKUP will perform a binary search for T in the text array TA within the interval [LOW,HIGH]. The text array contents must be sorted in ASCENDING order! (I.e. TA[J] < TA[J+1]. Use procedure SORTTA for sorting if necessary.) If the text is found in TA the matching index I will be returned (for which TA[I] = T) and LOOKUP will return TRUE. If the text is NOT found LOOKUP will return FALSE and I will be either in the range [LOW,HIGH-1] in case TA[I] > T > TA[I+1] or else I = HIGH if T > TA[HIGH] or I = LOW-1 IF T < TA[LOW]. Author: Mats Ohlin, FOA 1, S-104 50 STOCKHOLM 80, SWEDEN. IF low <= high THEN BEGIN INTEGER j; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; IF ta[low] < t AND t < ta[high] THEN BEGIN ; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; FOR j:= (low+high)//2 WHILE high > low + 1 DO IF ta[j] > t THEN high:= j ELSE IF ta[j] < t THEN low:= j ELSE BEGIN lookup:= TRUE; GO TO out END DECsystem-10 SIMULA Language Handbook, part III Page 69 5.2 SEARCHING AND TESTING OF TEXTS END inside range ELSE IF ta[low] = t THEN BEGIN lookup:= TRUE; j:= low END ELSE IF ta[high] = t THEN BEGIN lookup:= TRUE; j:= high END ELSE IF ta[low] > t THEN j:= low - 1 ELSE IF ta[high] < t THEN j:= high; out: i:= j END of lookup; 5.3 OPERATIONS ON TEXTS **** LONG REAL PROCEDURE scanreal(t); NAME t; TEXT t; Scanreal is similar to GETREAL, but the handling of ERROR conditions due to bad data is different. Scanreal returns the value of the next real item in the text T. T.Pos will only be moved if deediting was successful. BEGIN TEXT s; INTEGER p; p:= t.Pos; s:- rest(t); scanreal:= s.Getreal; ! *** If this goes wrong, return -MAXREAL ELSE t.Setpos(p+s.Pos-1); END of scanreal; **** INTEGER PROCEDURE scanint(t); NAME t; TEXT t; Scanint is similar to GETINT, but the handling of error conditions due to bad data is different. Scanint returns the value of the next integer item in the text T. T.Pos will only be moved if deediting was successful. BEGIN TEXT s; INTEGER p; p:= t.Pos; s:- rest(t); scanint:= s.Getint; ! *** If this goes wrong, return -MAXINT-1 ELSE t.Setpos(p+s.Pos-1) END of scanint; DECsystem-10 SIMULA Language Handbook, part III Page 70 5.3 OPERATIONS ON TEXTS **** INTEGER PROCEDURE scanfrac Same as scanint/scanreal for grouped items. **** TEXT PROCEDURE conc(t,...); TEXT t,...; Text concatenation procedure. Variable number of TEXT parameters. Since the number of parameters is variable, CONC can NOT be written in SIMULA. The parameters are handled as if transferred in reference mode, although constants are allowed. **** TEXT PROCEDURE conc2(t1,t2); VALUE t1, t2; TEXT t1, t2; T1 and T2 are handled as if transferred by reference (text descriptors are copied) although constants are allowed. BEGIN TEXT c; c:- blanks(t1.Length+t2.Length); c.Sub(1,t1.Length):= t1; c.Sub(1+t1.Length,t2.Length):= t2; conc2:- c; END; **** BOOLEAN PROCEDURE puttext(oldstring, newstring); NAME oldstring; VALUE newstring; TEXT oldstring, newstring; Puts the short word newstring into the long string oldstring. Newstring is OUTPUT after POS in oldstring, and POS of oldstring is moved after the end of the new word. Returns FALSE if there was not room for the new string. BEGIN TEXT s; s:- oldstring; IF s.Pos+newstring.length-1 <= s.length THEN BEGIN puttext:= true; s.Sub(s.Pos,newstring.length):= newstring; s.Setpos(s.Pos+newstring.length); END; oldstring.Setpos(s.Pos); END; DECsystem-10 SIMULA Language Handbook, part III Page 71 5.3 OPERATIONS ON TEXTS **** TEXT PROCEDURE upcase(t); TEXT t; Will convert all lower case letters within T to the corresponding upper case letter. No copying of the text. Only English alphabet letters (for which the procedure "letter" returns TRUE) are converted. IF t =/= NOTEXT THEN BEGIN CHARACTER c; INTEGER shift; shift:= rank('a') - rank('A'); t.Setpos(1); WHILE t.more DO BEGIN c:= t.Getchar; IF letter(c) AND c >= 'a' AND c <= 'z' THEN BEGIN c:= char(rank(c) - shift); t.Setpos(t.Pos-1); t.Putchar(c); END; END; t.Setpos(1); upcase:- t; END; **** TEXT PROCEDURE lowcase(t); TEXT t; LOWCASE is the opposite of UPCASE. Defined via simple modifications of the UPCASE procedure definition. Just exchange 'a' with 'A' and 'z' with 'Z'. **** TEXT PROCEDURE maketext(c,n); CHARACTER c; INTEGER n; Returns a new text of length N filled with character C. IF n > 0 THEN BEGIN TEXT t; t:- blanks(n); WHILE t.More DO t.putchar(c); t.Setpos(1); maketext:- t; END; **** TEXT PROCEDURE compress(t,c); TEXT t; CHARACTER c; COMPRESS returns NOTEXT (if T contains no other characters than a number of characters = C), or a reference to an initial subtext of T (altered) which contains all characters of T not = C. The part of T after this subtext is unchanged. Example: t1:-Copy("AxBxCxDx"); t2:-compress(t1,'x'); gives t1="ABCDCxDx", t2==t1.Sub(1,4), t2="ABCD". BEGIN TEXT s; CHARACTER cc; DECsystem-10 SIMULA Language Handbook, part III Page 72 5.3 OPERATIONS ON TEXTS t.Setpos(1); s:- t; WHILE t.More DO BEGIN cc:= t.Getchar; IF cc NE c THEN s.Putchar(cc); END; compress:- front(s) END of compress; **** INTEGER PROCEDURE startpos(t); TEXT t; Procedure STARTPOS returns the starting position of the (sub)text T within T.Main. Thus if T is a main text (T == T.Main) the result is 1. If T == NOTEXT, 0 is returned. Efficient MACRO-10 coded routine. IF t =/= NOTEXT THEN BEGIN TEXT s; INTEGER p; s:- t.Main; IF s == t THEN startpos:= 1 ELSE BEGIN WHILE s.More DO BEGIN p:= search(s,t); IF s.Sub(p,t.Length) == t THEN BEGIN startpos:= p; GO TO out END; s.Setpos(p+1); END loop END not main text; out: END of startpos; **** PROCEDURE split(t,t1,delimiter,t2); NAME t1,t2; TEXT t,t1,delimiter,t2; EXTERNAL Procedures required: TEXT PROCEDURE front,rest. INTEGER PROCEDURE search; This procedure splits the text T into two halves - the first part T1 denoting the part of T up to the text DELIMITER - and the second part T2 denoting the part of T following the DELIMITER. Thus T1 + DELIMITER + T2 = T. However, if no DELIMITER is found, T1 will return a reference to the whole of T, while T2 will return NOTEXT. Note - if the delimiter is just one character long, procedure SCANTO is recommended for efficiency reasons. BEGIN TEXT s1; t.Setpos(1); t.setpos(search(t,delimiter)); s1:- front(t); t.Setpos(t.pos+delimiter.Length); t2:- rest(t); t1:- s1 END of split; DECsystem-10 SIMULA Language Handbook, part III Page 73 5.3 OPERATIONS ON TEXTS *** INTEGER PROCEDURE splita(t,del,ta,n); TEXT t,del; TEXT ARRAY ta; INTEGER n; This procedure splits the text T into parts separated by the text delimiter DEL and makes the elements of TA[1:N] denote the different parts of T (without DEL). The returned value SPLITA is the number of parts found. However, if more than N parts are found, the value -1 is returned. Note that if DEL is just one character, procedure SPLITC is recommended. SPLITC is roughly twice as efficient as SPLITA. Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM 80, SWEDEN. EXTERNAL PROCEDURE required: INTEGER PROCEDURE search; BEGIN INTEGER i,p; OPTIONS(/A); ta[1]:- ta[n];; ! Check array bounds; OPTIONS(/-A); t.Setpos(1); FOR i:= i+1 WHILE t.More DO IF i>n THEN BEGIN splita:= -1; GOTO exit END ELSE BEGIN p:= t.Pos; t.Setpos(search(t,del)); ta[i]:- t.Sub(p,t.Pos-p); t.Setpos(t.Pos+del.Length); END; splita:= i-1; FOR i:= i STEP 1 UNTIL n DO ta[i]:- NOTEXT; exit: END of splita; **** INTEGER PROCEDURE splitc(t,del,ta,n); TEXT t; CHARACTER del; TEXT ARRAY ta; INTEGER n; This procedure splits the text T into parts separated by the character delimiter DEL and makes the elements of TA[1:N] denote the different parts of T (without DEL). The returned value SPLITC is the number of parts found. However, if more than N parts are found, the value -1 is returned. Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM 80, SWEDEN. EXTERNAL PROCEDURE required: TEXT PROCEDURE scanto; BEGIN INTEGER i; OPTIONS(/A); ta[1]:- ta[n];; ! Check array bounds; OPTIONS(/-A); t.Setpos(1); FOR i:= i+1 WHILE t.More DO DECsystem-10 SIMULA Language Handbook, part III Page 74 5.3 OPERATIONS ON TEXTS IF i>n THEN BEGIN splitc:= -1; GOTO exit END ELSE ta[i]:- scanto(t,del); splitc:= i-1; FOR i:= i STEP 1 UNTIL n DO ta[i]:- NOTEXT; exit: END of splitc; **** BOOLEAN PROCEDURE change(master,oldt,newt); NAME master; TEXT master,oldt,newt; EXTERNAL Procedures required: TEXT PROCEDURE conc,from,front. INTEGER PROCEDURE search. Change will change the subtext OLDT in MASTER - if found when searching from MASTER.POS and on - to NEWT. If OLDT.Length >= NEWT.Length then MASTER will denote (a subtext of) the original MASTER text, otherwise MASTER will denote a new text object. Changing all occurrences of OLDT to NEWT may be done with the following procedure; ! PROCEDURE edit(master,oldt,newt); ! NAME master; ! TEXT master,oldt,newt; ! BEGIN TEXT local; ! local:- master; ! WHILE local.More DO change(local,oldt,newt); ! master:- local ! END of edit; BEGIN TEXT local; INTEGER p; local:- master; p:= search(local,oldt); IF p <= local.Length THEN BEGIN change:= TRUE; IF oldt.Length >= newt.Length THEN BEGIN local.Sub(p,newt.Length):= newt; IF oldt.Length > newt.Length THEN BEGIN from(local,p+newt.Length):= from(local,p+oldt.Length); local:- local.Sub(1, local.Length-oldt.Length+newt.Length) END END ELSE local:- conc(front(local),newt,from(local,p+oldt.Length)); local.Setpos(p+newt.Length); master:- local END ELSE master.Setpos(0); END of change; DECsystem-10 SIMULA Language Handbook, part III Page 75 5.3 OPERATIONS ON TEXTS **** TEXT PROCEDURE puttime(field,time,unit,secdec); TEXT field; REAL time; CHARACTER unit; INTEGER secdec; Puttime edits a REAL variable representing a TIME value left justified into the text FIELD in seconds if UNIT = 'S' minutes if UNIT = 'M' hours if UNIT = 'H' days if UNIT = 'D' Else Putreal editing will be used. The FIELD must have a minimum length of 12 if secdec < 0 15 if secdec = 0 16+secdec if secdec > 0 Format: [-]dddD hh:mm[.ss[.xxx...]] where ddd is number of days (Blanked if day < 1) hh is number of hours mm is number of minutes ss is number of seconds (only if SECDEC >= 0) xxx is fraction of second with SECDEC digits PUTTIME also returns a reference to parameter FIELD. Thus it can be used as parameter to Outtext - i.e. Outtext(puttime(field,Time,'H',-1); or editing Image directly - puttime(Image.Sub(Pos,17),Time,'H',-1); C.f. procedure OUTTIME. EXTERNAL PROCEDURE required: TEXT PROCEDURE putfloat; IF field.Length >= (IF secdec < 0 THEN 12 ELSE IF secdec = 0 THEN 15 ELSE secdec+16) THEN BEGIN INTEGER days,hours,m,powersec; REAL seconds; PROCEDURE fixedit(x,w); REAL x; INTEGER w; BEGIN field.Sub(field.Pos,w).Putfix(x,secdec); field.Setpos(field.Pos+w); END of fixedit; PROCEDURE intedit(i,w); INTEGER i,w; BEGIN field.Sub(field.Pos,w).Putint(i); IF field.Getchar = ' ' THEN BEGIN field.Setpos(field.Pos-1); field.Putchar('0'); END; field.Setpos(field.Pos-1+w); DECsystem-10 SIMULA Language Handbook, part III Page 76 5.3 OPERATIONS ON TEXTS END of intedit; BOOLEAN PROCEDURE adjusted; BEGIN IF m = 60 THEN BEGIN adjusted:= TRUE; hours:= hours + 1; m:= 0; IF hours = 24 THEN BEGIN days:= days + 1; hours:= 0 END END; field.Sub(2,6):= " D "; field.Setpos(5); IF days < 1 THEN field.Putchar(' ') ELSE IF days < 10 THEN BEGIN field.Setpos(4); field.Putchar(Char(days+Rank('0'))); END ELSE IF days < 100 THEN BEGIN field.Setpos(3); intedit(days,2) END ELSE IF days < 1000 THEN BEGIN field.Setpos(2); intedit(days,3) END ELSE IF days <= 9999 AND days >= -999 THEN BEGIN field.Setpos(1); intedit(days,4) END ELSE field.Sub(1,4):= "****"; field.Setpos(8); intedit(hours,2); field.Putchar(':'); END of adjust; powersec:= 1; FOR m:= 1 step 1 UNTIL secdec DO powersec:= powersec*10; IF unit = 'D' THEN time:= 1440*time ELSE IF unit = 'H' THEN time:= 60*time ELSE IF unit = 'M' THEN ELSE IF unit = 'S' THEN time:= time/60 ELSE BEGIN putfloat(field,time); GO TO stop END; field.Setpos(1); field.Putchar(IF time < 0 THEN '-' ELSE ' '); time:= Abs(time); IF time > 34 359 738 367 THEN GO TO error; m:= Entier(time); seconds:= 60*(time - m); hours:= m//60; m:= Mod(m,60); days:= hours//24; hours:= Mod(hours,24); IF secdec >= 0 THEN BEGIN IF Entier(seconds*powersec+0.5) = 60*powersec THEN DECsystem-10 SIMULA Language Handbook, part III Page 77 5.3 OPERATIONS ON TEXTS BEGIN m:= m + 1; seconds:= 0 END; adjusted; intedit(m,2); field.Putchar('.'); IF seconds < 9.5 THEN BEGIN field.Putchar('0'); fixedit(seconds, IF secdec = 0 THEN 1 ELSE secdec+2) END ELSE fixedit(seconds,IF secdec = 0 THEN 2 ELSE secdec+3); END ELSE BEGIN time:= m + seconds/60; m:= time; IF adjusted THEN time:= 0; IF time < 9.5 THEN field.Putchar('0'); secdec:= 0; fixedit(time,IF time < 9.5 THEN 1 ELSE 2) END; stop: field.Setpos(1); puttime:- field END of puttime OK ELSE error: BEGIN field.Setpos(1); puttime:- putfloat(field,time); END of puttime error; **** TEXT PROCEDURE putfloat(t,x); TEXT t; REAL x; PROCEDURE PUTFLOAT edits a number X into the text T (right justified). Insignificant trailing zeros in fractions are removed. Representation errors (of type 98.9999999) are corrected. If fixed point format cannot be used (displaying significant digits), floating point format is used instead. The output will depend on the length of the text T. A value in the range [8,16] is recommended. PUTFLOAT also returns a reference to the text parameter. TEXT PROCEDURE putfloat(t,x); TEXT t; REAL x; BEGIN INTEGER w; w:= t.Length; t:= NOTEXT; IF w = 0 THEN ! NOTEXT !; ELSE IF x = 0 THEN t.Sub(w,1).Putchar('0') ELSE BEGIN REAL saved; BOOLEAN negative; INTEGER d,i,pow,j; negative:= x < 0; d:= 8; ! No. of sign. digits; saved:= x; x:= Abs(x); IF x >= &8 OR x < &-7 THEN realedit: DECsystem-10 SIMULA Language Handbook, part III Page 78 5.3 OPERATIONS ON TEXTS BEGIN pow:= 0; WHILE x >= 10 DO BEGIN x:= x*0.1; pow:= pow + 1 END; WHILE x < 1 DO BEGIN x:= x*10; pow:= pow - 1 END; ! Calculate length for exp part; j:= IF pow >= 10 THEN 3 ELSE IF pow >= 0 THEN 2 ELSE IF pow >= -9 THEN 3 ELSE 4; i:= w - j; IF i > (IF negative THEN 1 ELSE 0) THEN BEGIN CHARACTER low10; TEXT temp; putfloat(t.Sub(1,i),x*sign(saved)); t.Setpos(1); IF t.Getchar = '*' THEN GO TO realcase; temp:- blanks(4); temp.putreal(1,0); temp.Setpos(1); low10:= temp.getchar; t.Setpos(1); WHILE t.Pos <= i DO IF t.Getchar = low10 THEN GO TO realcase; t.Putchar(low10); t.Sub(i+2,j-1).Putint(pow); END ELSE realcase: BEGIN i:= w - (IF negative THEN 6 ELSE 5); IF i < 0 THEN i:= 0; IF d > i THEN d:= i; t.Putreal(saved,d) END putreal case END realedit block ELSE BEGIN INTEGER pow_d,pow_di,n1,m,di,ix; pow:= 1; pow_di:= pow_d:= 100 000 000; ! = 10**d; ! Scale x to [0.1,1-eps] ; WHILE x >= 1.0 DO BEGIN x:= x*0.1; IF pow_di = 1 THEN GO TO realedit; pow_di:= pow_di//10; i:= i - 1 END; WHILE x < 0.1 DO BEGIN x:= x*10; pow:= pow*10; i:= i + 1 END; di:= d + i; IF di < 0 THEN BEGIN d:= -i; di:= 0 END; ix:= x*pow_d; ! IX now integer with full prec; ! Fix 9999.... problem; j:= Mod(ix,100); DECsystem-10 SIMULA Language Handbook, part III Page 79 5.3 OPERATIONS ON TEXTS IF j >= 90 THEN ix:= ix + 100 - j ELSE IF j <= 10 THEN ix:= ix - j; n1:= ix//pow_di//pow; ! = Integer Part; ! Calculate j = no. of chars before dec. point; m:= n1; j:= IF negative THEN 2 ELSE 1; WHILE m >= 10 DO BEGIN m:= m//10; j:= j + 1 END loop; ix:= ix -(n1*pow_di)*pow; ! ix = fraction ; IF ix NE 0 THEN ! Remove trailing zeros in IX; WHILE Mod(ix,10) = 0 DO BEGIN ix:= ix//10; di:= di-1 END mod loop; IF j + (di+1)*Sign(ix) > w THEN GO TO realedit; IF negative THEN n1:= -n1; IF ix = 0 THEN t.Putint(n1) ELSE BEGIN j:= w-di; IF negative AND n1 = 0 THEN t.Sub(j-2,2):= "-0" ELSE t.Sub(1,j-1).Putint(n1); t.Setpos(j); t.Putchar('.'); t.Sub(t.Pos,di).Putint(ix); ! Fill in zeros; WHILE ix > 0 DO BEGIN ix:= ix//10; di:= di - 1 END loop; t.Setpos(j+1); FOR j:= 1 STEP 1 UNTIL di DO t.Putchar('0'); END fraction present END w > 0 END x not = 0; putfloat:- t END of putfloat; **** INTEGER PROCEDURE scan(command,n,arg,key,defaultkey); TEXT command; INTEGER n; TEXT ARRAY arg,key; INTEGER defaultkey; Integer procedure SCAN will identify specified KEYs in a COMMAND text string. SCAN performs - in order - DECsystem-10 SIMULA Language Handbook, part III Page 80 5.3 OPERATIONS ON TEXTS 1. Does COMPRESS and UPCASE on the COMMAND string 2. If the parm. DEFAULTKEY belongs to [1:N] and COMMAND string does not start with the text KEY[DEFAULTKEY] then that key will be assumed present in front of COMMAND. 3. Locates (in order 1 to N) possible occurrences of the texts defined in text array KEY[1:N]. 4. Makes ARG[x] :- whatever follows KEY[x] up to next KEY. If the KEY is just present, but with no text following then Blanks(1) is returned. Nonpresent KEY is indicated with ARG[x] == NOTEXT. 5. SCAN returns index for multiple used key in command string. Thus, normally SCAN should return zero, indicating no multiple used key. Note that the contents of KEY must have Upper case letters only. An example: ! BEGIN ! EXTERNAL TEXT PROCEDURE conc,upcase,compress, ! rest,inline,checkextension; ! EXTERNAL CHARACTER PROCEDURE findtrigger; ! EXTERNAL INTEGER PROCEDURE search,scanint,scan; ! EXTERNAL REF (Infile) PROCEDURE findinfile; ! EXTERNAL REF (Outfile) PROCEDURE findoutfile; ! ! TEXT ARRAY key,arg,default[1:6]; ! TEXT command,infilename,outfilename; ! INTEGER avalue,index; ! BOOLEAN na,nb; ! REF (Infile) inf; ! REF (Outfile) outf; ! ! key[1]:- Copy("/DEFAULT:/A:/NA/NB/N="); ! ! Save some space with this trick!; ! key[2]:- key[1].Sub(10,3); !/A: ; ! key[3]:- key[1].Sub(13,3); !/NA ; ! key[4]:- key[1].Sub(16,3); !/NB ; ! ! This keyword (5) must come after /NA and /NB ! ! else it will swamp those keys (if present); ! key[5]:- key[1].Sub(19,2); !/N ; ! key[6]:- key[1].Sub(21,1); != ; ! key[1]:- key[1].Sub(1,9); !/DEFAULT: ; ! ! start: ! FOR index:= scan(inline("*",Sysin),6,arg,key,1) ! WHILE index NE 0 DO ! BEGIN Outtext("? Keyword:"); ! Outtext(key[index]); ! Outtext(" used more than once."); ! Outtext(" Please try again."); ! Outimage; DECsystem-10 SIMULA Language Handbook, part III Page 81 5.3 OPERATIONS ON TEXTS ! END loop; ! ! ! Analyze result:; ! ! Assume the user entered: abc=def/A:12/N ; ! ! The result will then be: ! ! arg[1] = "ABC" ! ! arg[2] = "12" ! ! arg[3] == NOTEXT ! ! arg[4] == NOTEXT ! ! arg[5] = " " ! ! arg[6] = "DEF" ! ; ! ! ! Test file information; ! ! Default inputname is outputname; ! IF arg[6] == NOTEXT THEN arg[6]:- arg[1]; ! infilename:- arg[6]; ! ! ! We also demonstrate a way of checking ! ! entered file specifications; ! IF infilename NE "TTY:" THEN ! BEGIN ! infilename:- ! checkextension(infilename,".EXT"); ! FOR inf:- findinfile(infilename) WHILE ! inf == NONE DO ! BEGIN Outtext("? Cannot find Infile:"); ! Outtext(infilename); ! Outimage; ! infilename:- ! inline("Enter name of infile:",Sysin); ! infilename:- ! checkextension(infilename,".EXT"); ! END loop; ! END not TTY ELSE ! inf:- Sysin; ! ! outfilename:- arg[1]; ! IF outfilename NE "TTY:" THEN ! BEGIN ! outfilename:- ! checkextension(outfilename,".EXT"); ! FOR outf:- ! findoutfile(outfilename) WHILE outf == ! NONE DO ! BEGIN ! Outtext("? Cannot create Outfile:"); ! Outtext(outfilename); ! Outimage; ! outfilename:- ! inline("Enter name of outfile:",Sysin); ! outfilename:- ! checkextension(outfilename,".EXT"); ! END loop ! END ELSE outf:- Sysout; ! DECsystem-10 SIMULA Language Handbook, part III Page 82 5.3 OPERATIONS ON TEXTS ! ! Check value switch /A: ; ! IF arg[2] == NOTEXT THEN ! BEGIN !.... Set default value arg[2]:- ... ; ! END; ! avalue:= scanint(arg[2]); ! ! Assume range [1,99]; ! ! Check result, Pos = 1 is unsuccessful ! deediting, More indicates ! ! superfluous information in value; ! IF avalue < 0 OR avalue > 99 OR arg[2].Pos = 1 ! OR arg[2].More THEN ! BEGIN Outtext("? Illegal /A: value:"); ! Outtext(arg[2]); ! Outimage; ! GO TO start; ! END; ! ! ! Assume /N short for /NA ; ! IF arg[3] == NOTEXT THEN arg[3]:- arg[5]; ! na:= arg[3] =/= NOTEXT; ! ! More strict: IF arg[3] = " " THEN na:= TRUE ! ELSE Error; ! ! Error would indicate the string ! "/NAxxx/...."; ! ! nb:= arg[4] =/= NOTEXT; ! ! !....; ! ! END of program EXTERNAL Procedures required: TEXT PROCEDURE conc,upcase,compress; INTEGER PROCEDURE search; IF n < 1 THEN BEGIN IF Pos > 1 THEN Outimage; Outtext("%SCAN - Illegal parm! N < 1."); Outimage END ELSE BEGIN INTEGER ARRAY keypos[1:n]; INTEGER i,j,posmin,keyposi; OPTIONS(/A); arg[1]:- arg[n]; key[1]:- key[1]; key[n]:- key[n];; OPTIONS(/-A); command:- compress(command,' '); upcase(command); IF defaultkey > 0 AND defaultkey <= n THEN BEGIN IF (IF command.Length < key[defaultkey].Length THEN TRUE ELSE command.Sub(1,key[defaultkey].Length) NE key[defaultkey] ) THEN command:- conc(key[defaultkey],command); END default key ELSE command:- Copy(command); DECsystem-10 SIMULA Language Handbook, part III Page 83 5.3 OPERATIONS ON TEXTS FOR i:= 1 STEP 1 UNTIL n DO BEGIN command.Setpos(1); j:= search(command,key[i]); IF j <= command.Length THEN BEGIN command.Sub(j,key[i].Length):= NOTEXT; keypos[i]:= j; command.Setpos(j+key[i].Length); IF search(command,key[i]) <= command.Length THEN BEGIN scan:= i; GO TO exit; END mult key; END key found END i loop; FOR i:= 1 STEP 1 UNTIL n DO IF keypos[i] > 0 THEN BEGIN keyposi:= keypos[i]; ! Search smallest keypos[j] > keypos[i]; posmin:= command.Length + 1; FOR j:= 1 STEP 1 UNTIL n DO IF keypos[j] > keyposi THEN BEGIN IF keypos[j] < posmin THEN posmin:= keypos[j]; END j loop; j:= keyposi + key[i].Length; arg[i]:- IF posmin = j THEN Blanks(1) ELSE command.Sub(j,posmin-j); END keypos[i] > 0 ELSE arg[i]:- NOTEXT; exit: END of scan; **** SSCAN is a version of SCAN used by GETVIS (see chapter 1). SSCAN accepts swedish letters and does not zero the "arg" array for unused switches. **** DECOM is a package to simplify the writing of SIMULA programs which accept input in the conventional DEC-10 format: OUTFIL.EXT/SWITCH1/SWITCH2...=INFIL.EXT/SWITCH3... DECOM is a subclass of SAFMIN (See SAFEIO). Files: DECOM.SIM and DECOM.HLP. DECOM.ATR and DECOM.REL are included in LIBSIM. Written by Jacob Palme and Mats Ohlin, Swedish National Defense Research Institute. DECsystem-10 SIMULA Language Handbook, part III Page 84 5.3 OPERATIONS ON TEXTS **** TEXT PROCEDURE radix(base,i); INTEGER base,i; TEXT PROCEDURE RADIX returns a text containing the representation of input I in radix BASE. BASE may be negative but not -1 or zero. Resulting text will never contain blanks. If BASE = 16 then sequence 0123456789ABCDEF will be used, otherwise if BASE > 10 then the sequence 0123456789(10)(11)(12)... will be used. C.f. INTEGER PROCEDURE GETRADIX Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM, SWEDEN. Date: 76-12-10 IF i = 0 THEN radix:- Copy("0") ELSE IF base = 0 OR base = -1 OR base = 1 THEN radix:- Copy("*") ELSE BEGIN INTEGER j,ndig,abase; BOOLEAN neg; TEXT t; REF (dig) xdig; CLASS dig(c); CHARACTER c; BEGIN REF (dig) next; next:- xdig; xdig:- THIS dig; ndig:= ndig + 1; END dig; abase:= base*Sign(base); IF base > 0 THEN neg:= i < 0; IF neg THEN i:= -i; WHILE i NE 0 DO BEGIN j:= Mod(i,base); IF j < 0 THEN BEGIN j:= j - base; i:= i + base END; ! 48 = '0' 55 + 10 = 'A' ; IF j <= 9 THEN NEW dig(Char(j+48)) ELSE IF abase = 16 THEN NEW dig(Char(j+55)) ELSE BEGIN NEW dig(')'); WHILE j NE 0 DO BEGIN NEW dig(Char(Mod(j,10)+48)); j:= j//10 END; NEW dig('('); END unusual base; i:= i//base; END loop; IF neg THEN NEW dig('-'); t:- Blanks(ndig); WHILE xdig =/= NONE DO BEGIN t.Putchar(xdig.c); xdig:- xdig.next END; t.Setpos(1); radix:- t END of radix; DECsystem-10 SIMULA Language Handbook, part III Page 85 5.3 OPERATIONS ON TEXTS **** INTEGER PROCEDURE getradix(base,t); INTEGER base; TEXT t; INTEGER PROCEDURE GETRADIX converts a text T containing an item in base BASE to the corresponding base-10 integer. If BASE <= 10 only the characters 012...(BASE-1) may be used. If BASE = 16 or -16 then the char:s 0..9 A..F may be used. For all other bases the sequence should be written: 01...9(10)(11)(12).... Note that texts containing illegal characters will always be (somehow) interpreted. C.f. TEXT PROCEDURE RADIX. Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM, SWEDEN. Date: 76-12-10 EXTERNAL Procedures required: CHARACTER PROCEDURE fetchar; TEXT PROCEDURE from; IF t = "0" THEN error: getradix:= 0 ELSE IF base > 1 OR base < -1 THEN BEGIN INTEGER sum,b,i,flag; CHARACTER c; BOOLEAN neg,signflag; ! Skip leading blanks and sign; FOR c:= fetchar(t,1) WHILE c = ' ' OR c = '+' OR c = '-' DO BEGIN t:- from(t,2); IF c = '-' OR c = '+' THEN BEGIN neg:= c = '-'; IF signflag THEN GO TO error; signflag:= TRUE; END sign; END c loop; ! Check first char; IF (IF c = '(' OR Digit(c) THEN TRUE ELSE 'A' <= c AND c <= 'F' AND (base = 16 OR base = -16) ) THEN BEGIN ! See how long the item is; t.Setpos(1); WHILE t.More DO BEGIN c:= t.Getchar; IF Digit(c) THEN !ok; ELSE IF c = '(' THEN flag:= flag + 1 ELSE IF c = ')' THEN flag:= flag - 1 ELSE IF 'A' <= c AND c <= 'F' AND (base = 16 OR base = -16) THEN ! OK; ELSE GO TO endoft; IF flag < 0 THEN GO TO endoft ELSE IF flag > 1 THEN DECsystem-10 SIMULA Language Handbook, part III Page 86 5.3 OPERATIONS ON TEXTS BEGIN t.Setpos(t.Pos-2); GO TO endoft END; END more loop; endoft: IF t.More THEN t:- t.Sub(1,t.Pos-1); ! Start summation; b:= 1; FOR i:= t.Length STEP -1 UNTIL 1 DO BEGIN c:= fetchar(t,i); IF c NE ')' THEN sum:= sum + b*(Rank(c)-(IF Letter(c) THEN 55 ELSE 48)) ELSE BEGIN i:= i - 2; FOR c:= fetchar(t,i) WHILE c NE '(' AND i > 1 DO i:= i - 1; IF i > 0 THEN sum:= sum + b*from(t,i+1).Getint; END (..) ; IF i > 1 THEN b:= b*base; END i loop; getradix:= sum*(IF neg THEN -1 ELSE 1) END starts with ( or Digit END of getradix; **** INTEGER PROCEDURE arrlgd(ta); TEXT ARRAY ta; Computes the sum of the lengths of all text array elements in TA, plus 1 for each element in the array, allowing for a delimiter after each element. To be used for computing the length of the second parameter to ARRTXT (see below). Part of the SIMDBM system. **** PROCEDURE arrtxt(ta,t,c); TEXT ARRAY ta; TEXT t; CHARACTER c; Copies the contents of all elements of TA to T. The character C is placed after each copied text. Example: TA[1:4] contains "ABC", "X", "123456", "FINISH". T:- Blanks(ARRLGD(TA)); ARRTXT(TA,T,',') will make T = "ABC,X,123456,FINISH,". Used in the SIMDBM system. DECsystem-10 SIMULA Language Handbook, part III Page 87 5.4 INPUT/OUTPUT 5.4 INPUT/OUTPUT **** CHARACTER PROCEDURE lookahead(fileref); REF(Infile COMMENT or Directfile;) fileref; Returns the next non-blank character value which would have been the result of inchar. IF lastitem THEN result will be blank; INSPECT fileref DO BEGIN IF lastitem THEN lookahead:= ' ' ELSE BEGIN lookahead:= inchar; setpos(pos-1); END; END; **** PROCEDURE outline(t,out_file); VALUE t; TEXT t; REF (outfile) out_file; OUTLINE will output the argument text as one or more lines on the output device. Protected against errors when the parameter text is longer than the image. INSPECT out_file DO BEGIN WHILE t.length > length DO BEGIN outtext(t.sub(1,length)); t:- t.sub(length+1,t.length-length); outimage; END; outtext(t); outimage; END; **** PROCEDURE breakoutline(t,out_file); VALUE t; TEXT t; REF (outfile) out_file; Same as OUTLINE, but does not output any new line indication ( on ASCII terminals) before and after the text. INSPECT out_file DO BEGIN WHILE t.length > length DO BEGIN breakoutimage; outtext(t.sub(1,length)); t:- t.sub(length+1,t.length-length); END; outtext(t); breakoutimage; END; DECsystem-10 SIMULA Language Handbook, part III Page 88 5.4 INPUT/OUTPUT **** TEXT PROCEDURE inline(question,inf); NAME question; TEXT question; REF (infile) inf; Returns a stripped copy of a new INF input line after displaying QUESTION on Sysout. INSPECT (IF inf == NONE THEN Sysin ELSE inf) DO BEGIN Sysout.Outtext(question); Sysout.Breakoutimage; Inimage; inline:- Copy(Image.Strip); Setpos(0); END; **** TEXT PROCEDURE request (prompt,default,result,valid,errmessage,help); NAME prompt,default,result,valid,errmessage,help; TEXT prompt,default,result,errmessage,help; BOOLEAN valid; Procedure REQUEST may be used when putting simple questions to an interactive user. The PROMPTing question and the DEFAULT value will be displayed on the user's terminal (SYSOUT). The Stripped input line from the terminal (SYSIN) is stored in RESULT. If then the NAME parameter VALID is TRUE the result is accepted and (also) returned through REQUEST. Otherwise the ERRMESSAGE is displayed followed by a new PROMPTing question. If the user enters an empty answer - i.e. presses the return key - the DEFAULT answer will be used. (This may be prohibited by using an illegal answer for default.) If the user enters a question mark '?', the text HELP will be printed. Since it is a NAME parameter, actual parameter may be a text procedure call with the possible side effect of displaying additional help text. Since it may be difficult the remember the different parameters - learn the following sentence: Please ( P for Prompt) Don't (D for Default) Risk (R for Result) Villainous (V for Valid) Entries (E for Errmessage) Here (H for Help). Example: !BEGIN EXTERNAL TEXT PROCEDURE conc,request,rest; ! EXTERNAL REF (Infile) PROCEDURE findinfile; ! EXTERNAL INTEGER PROCEDURE checkreal; ! ! TEXT u; REAL x; ! ! request("File:",NOTEXT,u, ! findinfile(u)=/=NONE,conc("? Can't find:",u), ! "Enter valid file spec for input file."); ! ! x:= ! request("Enter x:","2.5",u, ! checkreal(u) = 1 AND rest(u).Strip == NOTEXT, DECsystem-10 SIMULA Language Handbook, part III Page 89 5.4 INPUT/OUTPUT ! "?Illegal real item.","Enter valid real item").Getreal; ! !END ! For more frequent applications it is recommended to use ! a special validity testing Boolean procedure with the ! side-effect of saving (the finally correct) result. ! I.e. ! EXTERNAL TEXT PROCEDURE rest,request; ! EXTERNAL LONG REAL PROCEDURE scanreal; ! ! BOOLEAN PROCEDURE testreal(u,x); ! NAME x; TEXT u; REAL x; ! BEGIN INTEGER p; ! p:= u.Pos; x:= scanreal(u); ! testreal:= IF u.Pos > p THEN rest(u).Strip == NOTEXT ! ELSE FALSE; ! END of testreal; ! ! request("Enter x:","2.5",u,testreal(u,x), ! "?Illegal real item.","Enter valid real item"); TEXT PROCEDURE request (prompt,default,result,valid,errmessage,help); NAME prompt,default,result,valid,errmessage,help; TEXT prompt,default,result,errmessage,help; BOOLEAN valid; BEGIN TEXT t; GO TO start; WHILE NOT valid DO BEGIN Outtext(errmessage); Outimage; start: Outtext(prompt); IF default =/= NOTEXT THEN BEGIN Outchar('/'); Outtext(default); Outchar('/'); Outchar(':') END; Breakoutimage; Inimage; t:- Copy(Sysin.Image.Strip); Sysin.Setpos(0); IF t == NOTEXT THEN result:- Copy(default) ELSE IF t.Getchar = '?' THEN BEGIN Outtext(help); Outimage; GO TO start END ELSE BEGIN t.Setpos(1); result:- t END; END loop; request:- result END of request; DECsystem-10 SIMULA Language Handbook, part III Page 90 5.4 INPUT/OUTPUT **** PROCEDURE outtime(file,time,unit,secdec,fieldwidth); REAL time; CHARACTER unit; INTEGER secdec,fieldwidth; REF (Outfile) file; Prints the variable TIME on the outfile FILE according to PUTTIME format. C.f. procedure PUTTIME. EXTERNAL PROCEDURES required: TEXT PROCEDURE putfloat, puttime; **** PROCEDURE histp(a,lowerbound,upperbound,yscale, max,min,brick,xlabels,title,pf); NAME title,xlabels; VALUE brick; INTEGER ARRAY a; INTEGER lowerbound,upperbound,yscale,max,min; TEXT brick,xlabels,title; REF (Outfile) pf; Procedure HISTP prints a histogram of the INTEGER ARRAY A [LOWERBOUND:UPPERBOUND] on file PF. YSCALE is the increment for the y axis (Integer > 0). MAX is the maximum y value displayed (INTEGER). MIN is the minimum y value displayed (INTEGER). BRICK is a text which will be used when printing histogram "piles" (TEXT by VALUE). XLABELS is a text that will be printed at the bottom of the histogram. If XLABELS == NOTEXT the indices LOWERBOUND and UPPERBOUND will be printed. The start of the text will be at the first "brick" character of the first "pile". TITLE is a text that will be printed at the top of the histogram. PF is the output file. If PF is a PRINTFILE, HISTP will start by calling EJECT(1). Please note the following HISTP properties: 1. If MAX < MIN, the MAX and MIN values will be adjusted if necessary (individually!). Thus, if MAX = -1 and MIN = 0 an array A with only positive elements will be presented in a histogram with y axis range [0:max of A]. 2. If (resulting) MIN is zero, this level will be indicated by the x axis (----). 3. If BRICK starts with a blank, a single space between "piles" will be printed. 4. IF PF == NONE, Sysout will be used. 5. IF the range [LOWERBOUND:UPPERBOUND] in combination with DECsystem-10 SIMULA Language Handbook, part III Page 91 5.4 INPUT/OUTPUT actual BRICK.LENGTH cannot be printed on one page regarding current PF.Length, then the rest (the rightmost part) of the histogram will be printed on a subsequent page. An example: Input: A[0:6]:= 5 -3 -1 0 3 4 2 YSCALE:= 1 MAX:= -10 MIN:= 10 BRICK:= " ***" XLABELS:= " A B C D E F G" TITLE:= "Test example - histogram print" PF:- NONE will produce the following output on SYSOUT: Test example - histogram print 5 ! *** ! *** *** ! *** *** *** ! *** *** *** *** 1 ! *** *** *** *** !---------------------------- ! *** *** ! *** -3 ! *** --+---+---+---+---+---+---+- A B C D E F G IF lowerbound > upperbound THEN BEGIN Outtext("?HISTP Illegal Array Bounds"); Outimage END ELSE IF yscale <= 0 THEN BEGIN Outtext("?HISTP Non-positive Y-scale element"); Outimage END ELSE BEGIN INTEGER i,up,newupperbound,h2, tempmax,tempmin,width,negscale; TEXT axis; width:= brick.Length; axis:- Blanks(width); WHILE axis.More DO axis.Putchar('-'); IF pf == NONE THEN pf:- Sysout; IF max < min THEN BEGIN tempmin:= tempmax:= a[lowerbound]; FOR i:= lowerbound+1 STEP 1 UNTIL upperbound DO IF a[i] > tempmax THEN tempmax:= a[i] ELSE DECsystem-10 SIMULA Language Handbook, part III Page 92 5.4 INPUT/OUTPUT IF a[i] < tempmin THEN tempmin:= a[i]; IF max < tempmax THEN max:= tempmax; IF min > tempmin THEN min:= tempmin; END loop setting max and min; h2:= (max+min)//2; IF (upperbound - lowerbound + 1)*width + 15 > pf.Length THEN BEGIN newupperbound:= upperbound; upperbound:= (pf.Length-15)//width + lowerbound - 1 END ELSE newupperbound:= lowerbound - 1; ! That was checking histogram width; INSPECT pf WHEN Printfile DO BEGIN Eject(1); Setpos(14); Outtext(title); Outimage; Eject(Line+2) END WHEN Outfile DO BEGIN Setpos(14); Outtext(title); Outimage; Outimage END; up:= ((h2-min)//yscale)*yscale + min; IF up < h2 THEN up:= up + yscale; h2:= up; up:= ((max-min)//yscale)*yscale + min; IF up < max THEN up:= up + yscale; pf.Outint(up,12); pf.Outtext(" !"); negscale:= - yscale; FOR up:= up STEP negscale UNTIL min DO IF NOT (up = min AND min = 0) THEN BEGIN IF up = h2 OR up = min THEN BEGIN pf.Setpos(1); pf.Outint(up,12); pf.Outtext(" !") END ELSE BEGIN pf.Setpos(14); pf.Outchar('!') END; IF up NE 0 THEN BEGIN FOR i:= lowerbound STEP 1 UNTIL upperbound DO IF a[i] = up THEN pf.Outtext(brick) ELSE IF a[i] > up EQV up >= 0 THEN pf.Outtext(brick) ELSE pf.Setpos(pf.Pos+width); END ne 0 ELSE IF min < 0 THEN BEGIN pf.Setpos(14); pf.Outchar('!'); FOR i:= lowerbound STEP 1 UNTIL upperbound DO pf.Outtext(axis); END zero axis; pf.Outimage DECsystem-10 SIMULA Language Handbook, part III Page 93 5.4 INPUT/OUTPUT END print loop; pf.Setpos(15); FOR i:= lowerbound STEP 1 UNTIL upperbound DO pf.Outtext(axis); i:= (upperbound-lowerbound)*width+15+width//2; IF width > 1 THEN BEGIN FOR h2:= 15+width//2 STEP width UNTIL i DO BEGIN pf.Setpos(h2); pf.Outchar('+') END; END; pf.Outimage; IF xlabels == NOTEXT THEN BEGIN pf.Outint(lowerbound,15+width//2); IF i > pf.Length THEN i:= pf.Length - 4; pf.Setpos(i-4); pf.Outint(upperbound,5); END ELSE BEGIN pf.Setpos(15); pf.Outtext(xlabels) END; pf.Outimage; IF newupperbound >= upperbound THEN histp(a,upperbound+1,newupperbound,yscale,max,min, brick,xlabels,title,pf); END of histp; DECsystem-10 SIMULA Language Handbook, part III Page 94 5.5 SORTING AND SUMMATION ETC. 5.5 SORTING AND SUMMATION ETC. **** INTEGER PROCEDURE ilog(x); REAL x; ilog:= IF x = 0 THEN 0 ELSE Entier(Ln(Abs(x))/2.30258 509517)+1; **** INTEGER PROCEDURE isum(ia,n); INTEGER ARRAY ia; INTEGER n; Procedure ISUM calculates the sum of the integer array IA: IA[1] + ... + IA[N]. BEGIN INTEGER i,s; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; s:= ia[1]; ia[n]:= ia[n];; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; FOR i:= 2 STEP 1 UNTIL n DO s:= s + ia[i]; isum:= s END of isum; **** REAL PROCEDURE rsum(a,n); ARRAY a; INTEGER n; Procedure RSUM calculates the sum of the array A: A[1] + ... + A[N]. BEGIN INTEGER i; REAL s; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; s:= a[1]; a[n]:= a[n];; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; FOR i:= 2 STEP 1 UNTIL n DO s:= s + a[i]; rsum:= s END of rsum; **** LONG REAL PROCEDURE lsum(la,n); LONG REAL ARRAY la; INTEGER n; Procedure LSUM calculates the sum of the long real array LA, LA[1] + ... + LA[N] (almost) preserving precision. Thus if LA[1] = E30, LA[2] = 1 and LA[3] = -E30 the sum will be correctly calculated to 1. EXTERNAL Procedure required: INTEGER PROCEDURE intrea; BEGIN INTEGER i,icell,high,low; LONG REAL s; DECsystem-10 SIMULA Language Handbook, part III Page 95 5.5 SORTING AND SUMMATION ETC. LONG REAL ARRAY cell[0:63]; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; la[n]:= la[n]; icell:= intrea(la[1])//8R4000000000;; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; IF icell < 0 THEN icell:= -icell; high:= low:= icell; cell[icell]:= la[1]; FOR i:= 2 STEP 1 UNTIL n DO BEGIN icell:= intrea(la[i])//8R4000000000; ! Store LA[I] in CELL [ Abs(exp-part of LA[I]) ]; ! Thus E+MM and -E+MM will be accumulated in the ! same cell; IF icell < 0 THEN icell:= -icell; IF icell > high THEN high:= icell ELSE IF icell < low THEN low:= icell; cell[icell]:= cell[icell] + la[i]; END loop; ! Sum starting with small values; FOR i:= low STEP 1 UNTIL high DO s:= s + cell[i]; lsum:= s END of lsum; **** REAL PROCEDURE sigma2(mean,sum,a,n); NAME mean,sum; REAL mean,sum; ARRAY a; INTEGER n; Real procedure SIGMA2 calculates the variance, mean value and sum of a REAL ARRAY A, from A[1] to A[N]. Array A must be declared before calling SIGMA2 and have a lower bound <= 1 and a upper bound >= N. Results are returned in - SIGMA2 Variance MEAN Mean value SUM Sum IF n > 0 THEN BEGIN REAL s,s2,x; INTEGER i; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; s:= a[1]; a[n]:= a[n];; OPTIONS(/-A); COMMENT NO ARRAY BOUND CHECKING; s2:= s^2; FOR i:= 2 STEP 1 UNTIL n DO BEGIN x:= a[i]; s:= s + x; s2:= s2 + x^2; END; x:= 1/n; DECsystem-10 SIMULA Language Handbook, part III Page 96 5.5 SORTING AND SUMMATION ETC. sigma2:= (s2 - s^2*x)*x; mean:= s*x; sum:= s; END of sigma2; **** PROCEDURE sigmean(sigma2,mean,k,xk1); NAME sigma2,mean,k; REAL sigma2,mean,xk1; INTEGER k; Procedure SIGMEAN calculates new sigma2 (variance) and mean value for a statistical material where the following properties are known - Old variance SIGMA2 Old mean value MEAN Number of observations made before K Value of new observation XK1 At return the following values are available - New variance SIGMA2 New mean value MEAN Number of observations (=K+1) K An example: ! BEGIN ! EXTERNAL PROCEDURE sigmean; ! REAL sigma2,mean; ! INTEGER k; ! .... ! k:= 0; ! mean:= sigma2:= 0; ! ... ! WHILE ... DO ! BEGIN ! ... x:= ; ! sigmean(sigma2,mean,k,x); ! END loop; ! ... Note that some precision will be lost using SIGMEAN, compared with the result of calculating the variance and mean value from all the observations. However, since SIGMEAN calculates the variance and mean value recursively, there is no need to save all the earlier observations in an array. BEGIN REAL oldsigma2,oldmean,ik1,z; INTEGER oldk,k1; oldsigma2:= sigma2; oldmean:= mean; oldk:= k; k:= k1:= oldk + 1; ik1:= 1.0/k1; z:= (oldmean-xk1)*ik1; DECsystem-10 SIMULA Language Handbook, part III Page 97 5.5 SORTING AND SUMMATION ETC. mean:= xk1 + oldk*z; sigma2:= oldk*(oldsigma2*ik1 + z^2); END of sigmean; The sorting procedures SORTTA, SORTTD, SORTIA, SORTID, SORTRA, SORTRD, SORTLA, SORTLD may be coded as one external assembly module accepting any kind of TEXT, [LONG] REAL or INTEGER one-dimensional array. **** PROCEDURE sortta (arr,n); TEXT ARRAY arr; INTEGER n; Procedure SORTTA will sort the contents of the TEXT array in ASCENDING order. Author: Algorithm 271 CACM 11-65, 5-66. Modified by: Mats Ohlin, FOA 1, S-104 50 STOCKHOLM 80, SWEDEN. BEGIN INTEGER i,k,q,m,p; TEXT t,x; INTEGER ARRAY ut,lz [1:Ln(Abs(n)+2)/0.69314718]; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; IF arr[1] > arr[n] THEN BEGIN ; OPTIONS(/-A); t:- arr[1]; arr[1]:- arr[n]; arr[n]:- t END test and swap; i:= m := 1; WHILE m > 0 DO BEGIN IF n-i > 1 THEN BEGIN p:= (n+i)//2; t:- arr[p]; arr[p]:- arr[i]; q:= n; k:= i; FOR k:= k+1 WHILE k <= q DO BEGIN IF arr[k] > t THEN BEGIN WHILE q >= k DO BEGIN IF arr[q] < t THEN BEGIN x:- arr[k]; arr[k]:- arr[q]; arr[q]:- x; q:= q-1; GO TO l; END; q:= q-1; END Q; END; l: END K; arr[i]:- arr[q]; DECsystem-10 SIMULA Language Handbook, part III Page 98 5.5 SORTING AND SUMMATION ETC. arr[q]:- t; IF 2*q>i+n THEN BEGIN lz[m]:= i; ut[m]:= q-1; i:= q+1; END ELSE BEGIN lz[m]:= q+1; ut[m]:= n; n:= q-1; END; m:= m+1; END ELSE BEGIN IF ( IF i < n THEN arr[i] > arr[n] ELSE FALSE ) THEN BEGIN x:- arr[i]; arr[i]:- arr[n]; arr[n]:- x END; m:= m-1; IF m > 0 THEN BEGIN i:= lz[m]; n:= ut[m] END; END END m > 0 loop; END SORTTEXT IN ASCENDING ORDER; **** PROCEDURE sorttd (arr,n); TEXT ARRAY arr; INTEGER n; Procedure SORTTD will sort the contents of the TEXT array in DESCENDING order. Author: Algorithm 271 CACM 11-65, 5-66. Modified by: Mats Ohlin, FOA 1, S-104 50 STOCKHOM 80, SWEDEN. Date: 75-09-19 ; BEGIN INTEGER i,k,q,m,p; TEXT t,x; INTEGER ARRAY ut,lz [1:Ln(Abs(n)+2)/0.69314718]; OPTIONS(/A); COMMENT START ARRAY BOUND CHECKING; IF arr[1] < arr[n] THEN BEGIN ; OPTIONS(/-A); t:- arr[1]; arr[1]:- arr[n]; arr[n]:- t END test and swap; i:= m := 1; WHILE m > 0 DO BEGIN IF n-i > 1 THEN BEGIN p:= (n+i)//2; t:- arr[p]; arr[p]:- arr[i]; q:= n; k:= i; FOR k:= k+1 WHILE k <= q DO BEGIN IF arr[k] < t THEN DECsystem-10 SIMULA Language Handbook, part III Page 99 5.5 SORTING AND SUMMATION ETC. BEGIN WHILE q >= k DO BEGIN IF arr[q] > t THEN BEGIN x:- arr[k]; arr[k]:- arr[q]; arr[q]:- x; q:= q-1; GO TO l; END; q:= q-1; END Q; END; l: END K; arr[i]:- arr[q]; arr[q]:- t; IF 2*q>i+n THEN BEGIN lz[m]:= i; ut[m]:= q-1; i:= q+1; END ELSE BEGIN lz[m]:= q+1; ut[m]:= n; n:= q-1; END; m:= m+1; END ELSE BEGIN IF ( IF i < n THEN arr[i] < arr[n] ELSE FALSE ) THEN BEGIN x:- arr[i]; arr[i]:- arr[n]; arr[n]:- x END; m:= m-1; IF m > 0 THEN BEGIN i:= lz[m]; n:= ut[m] END; END END m > 0 loop; END SORTTEXT IN DESCENDING ORDER; **** PROCEDURE sortdn(arr,i1,n,key); INTEGER ARRAY arr; INTEGER i1,n,key; SORTDN sorts (a section of) the 2-dimensional array ARR[2,nmax]. The segment ARR[*,I1] to ARR[*,N] is sorted according to KEY in ascending order. KEY determines which column to regard as primary sorting key, and whether to sort also on the secondary key, thus: KEY = 0: Sort first on ARR[1,*], then ARR[2,*]. KEY = 1: Only sort on ARR[1,*]. KEY = 2: Reverse of KEY = 1. KEY = 3: Reverse of KEY = 0. KEY < 0 or KEY > 3: as KEY = 0. DECsystem-10 SIMULA Language Handbook, part III Page 100 5.5 SORTING AND SUMMATION ETC. ARR[1,i] and ARR[2,i] are always moved as a unit (2 words). SORTDN is a modification of SORTIA (q.v.), which is a modification by Mats Ohlin, FOA, of Algorithm 271 CACM 11-65, 5-66. The SORTDN modification was made by Lars Enderin, FOA, for the purpose of sorting UFD and SFD directory files under TOPS-10. **** REAL PROCEDURE scalestep(pmax,pmin,ptics); NAME pmax,pmin,ptics; REAL pmax,pmin; INTEGER ptics; Procedure SCALESTEP calculates values suitable for axis design. PMAX is input max (rough) value and at return increased justified max value. PMIN ditto decreased min value. PTICS is number of increments along axis (Result parm.) SCALESTEP is size of axis increment. REAL PROCEDURE scalestep(pmax,pmin,ptics); NAME pmax,pmin,ptics; REAL pmax,pmin; INTEGER ptics; BEGIN REAL max,min,width,d; INTEGER n0,n1,pow; max:= pmax; min:= pmin; width:= Abs(max - min); IF width NE 0 THEN BEGIN WHILE width > 10 DO BEGIN width:= width*0.1; pow:= pow + 1 END; WHILE width <= 1 DO BEGIN width:= width*10; pow:= pow - 1 END; ! Normalize width ; IF width NE Entier(width) THEN width:= IF width > 8 THEN 10 ELSE IF width > 1.5 THEN Entier(width+1) ELSE IF width > 1.25 THEN 1.5 ELSE 1.25; ! Calculate normalized increment ; d:= IF width >= 8.0 THEN 2 ELSE IF width > 3.5 THEN 1 ELSE IF width > 1.6 THEN 0.5 ELSE 0.25; ! Now scale normalized increment d ; WHILE pow > 0 DO BEGIN d:= d*10; pow:= pow - 1 END; WHILE pow < 0 DO BEGIN d:= d*0.1; pow:= pow + 1 END; ! Calculate number of increments ; n1:= Entier(max/d); IF n1*d < max THEN n1:= n1 + 1; n0:= Entier(min/d); ptics:= n1 - n0; pmax:= n1*d; pmin:= n0*d; scalestep:= d; END width NE 0; DECsystem-10 SIMULA Language Handbook, part III Page 101 5.5 SORTING AND SUMMATION ETC. END of scalestep; **** BOOLEAN PROCEDURE iashift(a,destindex,fromindex,length,zero); INTEGER ARRAY a; INTEGER destindex,fromindex,length; BOOLEAN zero; IASHIFT moves LENGTH elements of the INTEGER ARRAY A, starting at FROMINDEX, to DESTINDEX. FROMINDEX must be >= DESTINDEX. If ZERO is TRUE, then remaining elements to the right of DESTINDEX+LENGTH-1 will be zeroed. Thus, IASHIFT(A,1,1,0,TRUE) will make all elements in the array A[1:xx] zero. IASHIFT will return TRUE if the operation was successful - illegal parameters will cause IASHIFT to return FALSE. Assuming accessibility of the lower and upper bounds of the array the code would be: IF destindex >= a.lower AND destindex <= a.upper AND fromindex >= destindex AND fromindex+length <= a.upper+1 THEN BEGIN INTEGER i; IF destindex NE fromindex THEN FOR i:= 1 STEP 1 UNTIL length DO BEGIN a[destindex]:= a[fromindex]; destindex:= destindex + 1; fromindex:= fromindex + 1; END i loop ELSE destindex:= destindex + 1; IF zero THEN ! Zero the rest of a. ! Destindex now = next after last moved element; FOR i:= destindex STEP 1 UNTIL a.upper DO a[i]:= 0; iashift:= TRUE END of iashift; **** INTEGER PROCEDURE imax(i1,i2); INTEGER i1,i2; COMMENT IMAX will replace the calling code by inline code; imax:= IF i1 > i2 THEN i1 ELSE i2; **** INTEGER PROCEDURE imin(i1,i2); INTEGER i1,i2; COMMENT IMIN will replace the calling code by inline code; imin:= IF i1 < i2 THEN i1 ELSE i2; DECsystem-10 SIMULA Language Handbook, part III Page 102 5.6 RANDOM NUMBER GENERATION ETC. 5.6 RANDOM NUMBER GENERATION ETC. **** PROCEDURE SCRAMBLE(ia,bottom,top,u); NAME u; INTEGER ARRAY ia; INTEGER bottom, top, u; The INTEGER ARRAY ia is permuted randomly in the interval bottom, top. The parameter u is the random number seed. **** CLASS PERGEN(a,n); INTEGER ARRAY a; INTEGER n; CLASS PERGEN generates all the possible permutations of the contents in INTEGER ARRAY a[1:N], one at a time. Use: REF (pergen) pg; pg:- NEW pergen(a,n); WHILE pg.cycles < 2 DO BEGIN Call(pg); ! use new permutation END; Note that N Must be >= 2. Also observe that permutations are generated systematically and that the order will be REVERSED when one N! cycle is completed. Thus for N = 2 then result will be (if A[1]=1, A[2]=2 initially): (1 2) (2 1) (2 1) (1 2) (1 2) (2 1) etc. The permutations will be generated in such manner that the last elements of A will change most slowly. The attribute CYCLES will indicate to which cycle the NEXT permutation will belong (after next Call that is). Ref:"Generation of permutation sequences", A.D. Woodall, The Computer Journal vol 20, No 4 1977 p 346. Modified by: Mats Ohlin, FOA, Stockholm, Sweden. For random permutations see procedure SCRAMBLE. External procedure required: IMAX CLASS pergen(a,n); INTEGER ARRAY a; INTEGER n; BEGIN INTEGER p,mp,swpt,i,w,cycles; INTEGER ARRAY m,km[2:imax(3,n)], ret[2:imax(2,n)]; IF n < 2 THEN BEGIN Outtext("%PERGEN - 2nd parm N must be >= 2"); Outimage; END ELSE BEGIN OPTIONS(/A); a[1]:= a[1]; a[n]:= a[n]; km[n]:= ret[n]:= km[2]:= ret[2];; OPTIONS(/-A); DECsystem-10 SIMULA Language Handbook, part III Page 103 5.6 RANDOM NUMBER GENERATION ETC. FOR i:= 4 STEP 2 UNTIL n DO BEGIN p:= i-1; km[i]:= p; km[p]:= 2-i; END i loop; GO TO run; start: Detach; run: cycles:= cycles + 1; FOR i:= 2 STEP 1 UNTIL n DO ret[i]:= i+1; FOR i:= 4 STEP 2 UNTIL n DO BEGIN m[i]:= i-1; m[i-1]:= 2-i END i loop; IF Mod(n,2) NE 0 THEN m[n]:= 1-n; loop: p:= ret[2]; IF p > 3 THEN ret[2]:= 3; Detach; w:= a[1]; a[1]:= a[2]; a[2]:= w; IF p > n THEN GO TO start; mp:= m[p]; IF mp < 0 THEN BEGIN swpt:= 1; mp:= mp+1 END ELSE BEGIN swpt:= mp; mp:= mp-1 END; IF mp = 0 THEN BEGIN m[p]:= km[p]; ret[p-1]:= ret[p]; ret[p]:= p+1 END ELSE m[p]:= mp; Detach; w:= a[p]; a[p]:= a[swpt]; a[swpt]:= w; GO TO loop; END n >= 2 END of pergen; **** REAL PROCEDURE RANDOM(a,b); REAL a,b; Returns an uniformly distributed value in the interval (a,b) (c.f. FORTRAN routine random). **** INTEGER PROCEDURE UNIQUE UNIQUE will return increasing integer numbers. The returned value will increase with one each jiffy (1/50 or 1/60 second). The returned value is a number in which bits 1-11 contain the day number since 1977-01-01 (mod 4096) and bits 12-35 contain time of day in jiffies. The sequence will restart (from zero) every 4096th day (11 years and 81 days). DECsystem-10 SIMULA Language Handbook, part III Page 104 5.6 RANDOM NUMBER GENERATION ETC. EXTERNAL PROCEDURE required: INTEGER PROCEDURE gettab; BEGIN ! Take daynumber after 1977-01-01, put it into bits 0-11 ! and add no. of jiffies (always < 2^23); ! 262144 = 2^18 8388608 = 2^23; unique:= Mod(gettab(9,43)//262144-43144,4096)*8388608 + gettab(9,8); END of unique; **** INTEGER PROCEDURE nextrandom(n,u); INTEGER n,u; Returns the N:th successor to U in the random number sequence used by the random generator in the DECsystem-10 SIMULA system. N may be negative. (Ref: SIMULA Newsletter Vol 5(2), may 1977) DECsystem-10 SIMULA Language Handbook, part III Page 105 5.7 SIMULA VERSIONS OF SYSTEM CLASSES 5.7 SIMULA VERSIONS OF SYSTEM CLASSES **** ZIMSET and ZIMULATION ZIMSET and ZIMULATION are two SIMULA classes which include simple tracing facilities. They may be used for educational as well as debugging purposes. For complete documentation, see FOA Report C10055-M3(E5), October 1976, distributed as ZIMULA.MAN. A small example: BEGIN EXTERNAL PROCEDURE abort; EXTERNAL TEXT PROCEDURE upcase, conc, puttime, putfloat, today, daytime; EXTERNAL CLASS zimset,zimulation; zimulation BEGIN process CLASS a; Passivate; traceon("Trace.Log","*"); ! Start trace on TRACE.LOG; setparms('M',0); ! Time format: Minutes, no decimal seconds; activat(NEW a,"DELAY",5,NONE); ! ACTIVATE NEW a DELAY 5; activat(NEW a,"AT",8,NONE); ! ACTIVATE NEW a AT 8; hold(2); sqslist; reactivat(current,"AT",10,NONE); ! REACTIVATE Current AT 10; prior_:= TRUE; activat(NEW a,"AFTER",0,NEW a); ! ACTIVATE NEW a AFTER NEW a PRIOR; END zimulation END of program will produce the following output on TRACE.LOG: *** Trace generated 1976-10-13 at 12:20:35 *** Trace Codes: All 00:00.00 ( 2) will be Delayed to 00:05.00 ( 3) will be ACT. AT 00:08.00 Main Program Held 00:02.00 to 00:02.00 :---- Scheduled Processes ---- : Evtime Title : 00:02.00 Main Program DECsystem-10 SIMULA Language Handbook, part III Page 106 5.7 SIMULA VERSIONS OF SYSTEM CLASSES : 00:05.00 ( 2) : 00:08.00 ( 3) :---- End of SQS List -------- 00:02.00 Main Program will be ACT. AT 00:10.00 Main Program was REACT. from 00:02.00 00:05.00 ( 2) Passivated 00:08.00 ( 3) Passivated ? 00:10.00 ( 4) Pass. due to ACT. AFTER Idle ( 5) DECsystem-10 SIMULA Language Handbook, part III Page 107 6. SWEDISH LANGUAGE TEXT HANDLING AND INPUT/OUTPUT 6. SWEDISH LANGUAGE TEXT HANDLING AND INPUT/OUTPUT ----------------------------------------------- NOTE: Some of these routines are not yet written. See the list in chapter 0.2, which indicates which routines are not available. The difference between English and Swedish text handling is that the national Swedish letters $(=AA), #(=AE), @(=OE) (in lower case }(=aa), {(=ae), `(=oe)) are regarded as letters. In addition, underline (_) is regarded as part of an identifier (like a digit in this context). This table gives the names of Swedish procedures corresponding to English procedure described above. ENGLISH SWEDISH **** LETTER BOKSTAV **** LOWCASE LITENBOKSTAV **** MENU MENY **** UPCASE STORBOKSTAV **** GETITEM TAGORD **** INITEM INORD **** GETTYPE TAGTYP DECsystem-10 SIMULA Language Handbook, part III Page 108 7. UTILITIES SPECIFIC TO DECSYSTEM-10 7. UTILITIES SPECIFIC TO DECSYSTEM-10 ---------------------------------- The utilities in this section are intended for specialized use. If you want to write portable programs, you should avoid them, since special hardware or software features are explicitly used, e.g. a 36-bit word is assumed. **** INTEGER PROCEDURE absadr; Takes a variable of any type as parameter. Illegal parameters will give a returned value = 0. - If the variable is a SIMPLE variable (not an array) of type INTEGER, REAL, LONG REAL, CHARACTER or BOOLEAN, the address of the first word of the value is returned. - If it is a REF variable, a copy of the value is returned, i e the address of the object or the value of NONE (an illegal address). - ABSADR of a TEXT variable returns a standard byte pointer to the character BEFORE the first character (7-bit byte) of the text value. If t="ABC", LOADBYTE(ABSADR(t),1)=Rank('A'). See LOADBYTE, STOREBYTE, ADJPTR. - ABSADR of an ARRAY is the address of the array object. See [LH2] appendix B for the format of class instances (objects) and arrays. This procedure is intended for highly implementation- and machine-dependent applications. Be very careful not to cause a garbage collection between computation of an absolute address and its use! **** INTEGER PROCEDURE adjptr(bp,n); INTEGER bp,n; Adjusts the standard byte pointer BP by N bytes using the ADJBP instruction (KL-10/20 processors only, not KA-10 or KI-10). See hardware documentation. **** INTEGER PROCEDURE andint(x,y); INTEGER x,y; Performs bitwise AND function of X,Y. Example: ANDINT(2R1010111,2R1001110)=2R1000110. DECsystem-10 SIMULA Language Handbook, part III Page 109 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** CLASS atrstr; ATRSTR implements a data structure and procedures which map the structure of an attribute file for an external class or procedure. A structure is set up by calling the load procedures of the various component classes, taking information from an ATR file. If the file is a library file, the modules can be found and mapped one after the other. Subclasses of ATRSTR can be used e.g. to display the structure as pseudo-SIMULA code (see SIMATR). **** INTEGER PROCEDURE bitfield(w,firstbit,len); INTEGER w,firstbit,len; Returns the byte of word W starting at FIRSTBIT, (0 <= FIRSTBIT <= 35) of length L bits, where L=Abs(LEN). L>=0 AND L<36 AND FIRSTBIT+L<=36 must hold. Special option: If LEN < 0, the first bit is regarded as a sign bit and extended. Examples: Assume w = 8r123456 701234. Then bitfield(w,9,12) = 8r4567, and bitfield(w,9,-12)=8r777777 774567. The prefix 8r means octal radix. **** BOOLEAN PROCEDURE bitget(w,n); INTEGER w,n; TRUE if bit 36-n in w is 1; **** PROCEDURE bitput(w,n,b); INTEGER w,n; BOOLEAN b; Bit 36-n of w := IF b THEN 1 ELSE 0; DECsystem-10 SIMULA Language Handbook, part III Page 110 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE boolfunc(f,x,y); INTEGER f,x,y; Computes one of the 16 possible Boolean functions of two variables. The operation is performed on corresponding bits in X and Y. The function is defined by F (0<=F<=15, taken modulo 16 if not in range). The following functions are defined: F x 0101 y 0011 ----------------------------------- 0 0000 FALSE 1 0001 x AND y 2 0010 (NOT x) AND y 3 0011 y 4 0100 x AND (NOT y) 5 0101 x XOR y 6 0110 x OR y 7 0111 x OR y 8 1000 NOT (x OR y) "NOR" 9 1001 x EQV y 10 1010 NOT x 11 1011 x IMP y (NOT x OR y) 12 1100 x OR (NOT y) 13 1101 NOT (x OR y) 14 1110 NOT (x AND y) "NAND" 15 1111 TRUE ----------------------------------- Example: BOOLFUNC(4,5,3)=4 (actually, BOOLFUNC(n,5,3)=n always). **** INTEGER PROCEDURE callmic(micfile,savfile); VALUE micfile,savfile; TEXT micfile,savfile; PROCEDURE CALLMIC will enable the SIMULA programmer to do almost anything from his (her) SIMULA program. The use of this procedure depends on the existence of the Hatfield MIC system residing on the SYS: area. The procedure CALLMIC is used in the following manner - The user first creates a file MIC.TMP containing ordinary DEC-10 commands like .DELETE *.BAK .RUN ABC .COJOB=A.MIC parm1 .DO ABCMIC etc. The call CALLMIC("MIC.TMP","SAV.TMP"); will then use MIC.TMP for a MIC run. DECsystem-10 SIMULA Language Handbook, part III Page 111 7. UTILITIES SPECIFIC TO DECSYSTEM-10 The files MICFILE,SAVFILE will - if possible - be deleted at return. If the file name for the MIC file contains a protection code with 1st digit equal to 2 (i.e. "MIC.TMP<277>"), then the MIC execution will be silent. Note, however, that CALLMIC will be unable to delete the file afterwards. (The message "? MACRO FILE NOT FOUND." will follow at the end of the SIMULA program. Please ignore that message.) Alternatively the user may start the MIC file with: .SILENCE If the 2nd parameter =/= NOTEXT the MIC session will end by returning to the point of CALLMIC call: CALLMIC will save current program in file SAVFILE and end the MIC session with .RUN "SAVFILE". Otherwise, if SAVFILE == NOTEXT, no return to the calling program will occur. !!!! The same restrictions as for SAVE are valid. Thus: !!!! Only Sysin and Sysout may be open. !!!! Sysin and Sysout must be the user's TTY. Note that you may close Outfiles before calling CALLMIC and then open again with "file.ext/access:append". Infiles are more difficult to handle - you may keep count of how many lines you have read before closing and then read past the part already read after opening again. Directfiles give no problems here of course - just save current Location, close and open again after return from CALLMIC. A small user example: !BEGIN ! EXTERNAL PROCEDURE run; ! EXTERNAL BOOLEAN PROCEDURE scratchfile,tmpout; ! EXTERNAL INTEGER PROCEDURE save,callmic; ! EXTERNAL TEXT PROCEDURE inline,conc,tmpnam; ! INTEGER rc; ! TEXT micfile,savfile; ! micfile:- inline("Mic file name:",Sysin); ! IF micfile == NOTEXT THEN micfile:- Copy("Mic.tmp"); ! savfile:- inline("Sav file:",Sysin); ! Outtext("End with extra CR"); ! Outimage; ! INSPECT NEW Outfile(micfile) DO ! BEGIN ! Open(Sysin.Image); ! ! Note the neat way of copying input lines ! ! from Sysin to MICFILE.; DECsystem-10 SIMULA Language Handbook, part III Page 112 7. UTILITIES SPECIFIC TO DECSYSTEM-10 ! WHILE inline("Command:",Sysin).Strip =/= NOTEXT DO ! Outimage; ! Close ! END micfile creation; ! rc:= callmic(micfile,savfile); ! Outtext("Return code:"); ! Outint(rc,5); ! Outimage; !END of program EXTERNAL PROCEDURES required: BOOLEAN PROCEDURE scratchfile; PROCEDURE run; INTEGER PROCEDURE save; TEXT PROCEDURE tmpnam,conc,tmpout; IF micfile =/= NOTEXT THEN BEGIN INTEGER returncode; TEXT cmdfile; tmpout("MIC",conc("/",micfile)); IF savfile =/= NOTEXT THEN BEGIN INSPECT NEW Outfile(conc(micfile,"/ACCESS:APPEND")) DO BEGIN Open(Blanks(40)); Outtext(".REVIVE .RUN "); Outtext(savfile); Close END add sav file name; returncode:= save(savfile,TRUE); IF returncode = 0 THEN run("SYS:MIC",2) ELSE IF returncode < 0 THEN BEGIN Outtext("? Save failed with filename:"); Outtext(savfile); Outimage END ELSE scratchfile(savfile); END savfile =/= notext ELSE run("SYS:MIC",2); scratchfile(micfile); scratchfile(tmpnam("MIC")); scratchfile(cmdfile); stop: callmic:= returncode; END of callmic; DECsystem-10 SIMULA Language Handbook, part III Page 113 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** TEXT PROCEDURE checkextension(t,defaultextension); VALUE defaultextension; TEXT t,defaultextension; CHECKEXTENSION may be used to add a default extension to file specifications not containing a dot ('.'). I.e. ! T:- Copy("A");! T:- checkextension(T,".SIM"); ! will give T the value "A.SIM", while ! T:- Copy("A.");! T:- checkextension(T,".SIM"); ! will leave T unaltered. ! T:- Copy("LPT:");! T:- checkextension(T,".SIM"); ! will leave T unaltered. ! T:- Copy("LPT: A");! T:- checkextension(T,".SIM"); ! will give T the value "LPT: A.SIM". ; EXTERNAL PROCEDURES required: CHARACTER PROCEDURE findtrigger; TEXT PROCEDURE conc,rest; IF t =/= NOTEXT THEN BEGIN t.Setpos(1); IF findtrigger(t,Copy(":")) NE ':' OR rest(t).Strip =/= NOTEXT THEN BEGIN t.Setpos(1); IF findtrigger(t,Copy(".")) NE '.' THEN t:- conc(t,defaultextension) ELSE t.Setpos(1); END; checkextension:- t END of checkextension; **** INTEGER PROCEDURE depbyte(val,w,firstbit,len); INTEGER val,w,firstbit,len; Returns the value of W with the modification: The byte starting at FIRSTBIT (0-35) of length LEN bits is replaced by VAL. LEN>=0 AND LEN<=36 AND FIRSTBIT+LEN<=36 must hold. Note: The last LEN bits of VAL will be used, the other bits will be ignored. **** CLASS dirhnd DIRHND contains data structures which can be loaded with information from TOPS-10 directory files (UFD and SFD files). The procedure LOADSELECTEDFILENAMES can be used to read this information, selecting certain file names according to a wild card pattern (see MATCH6, WILDSIX). LOADSELECTEDFILENAMES is an attribute of CLASS DIRECTORYPATH, which is declared inside DIRHND and contains information defining the directory file. The directory information is placed in objects of class DIRECTORYBLOCK, DECsystem-10 SIMULA Language Handbook, part III Page 114 7. UTILITIES SPECIFIC TO DECSYSTEM-10 which are reached via objects of FILENAMELIST class SIXBITFILENAMELIST. DIRHND is only rudimentary at present and CANNOT BE USED on DECsystem-20 (TOPS-20). **** PROCEDURE echo(fileref,mode); REF(Infile)fileref; INTEGER mode; Provided fileref refers to a TTY file, different values of mode have the following effects: mode=0 resets the mode to normal. mode=1 sets special editor mode. mode=2 suppresses echoing on the terminal completely. mode=4 causes all characters to echo exactly as typed. Combinations are possible where meaningful, i e 5=4+1. No effect on other files. **** INTEGER PROCEDURE filcopy(source,dest); REF(Infile)source; TEXT dest; Copies the SOURCE file to the (new) file specified by the text DEST, which is a normal DECsystem-10 (or -20) file specification acceptable to the SIMULA run time system. A NEW Outfile(dest) is created, and the contents of source are copied to the new file buffer by buffer (using TOPS-10 I/O, thus the PA1050 compatibility must be used under TOPS-20). !!! ONLY DISK FILES are handled !!! FILCOPY copies the file without changing the creation date as ordinary SIMULA code would do, and does it rather efficiently without using Image. The disk space allocation is taken from the source file lookup data, minimizing fragmentation. If a long file is copied, it may be useful to allocate more than 2 standard buffers for each file (/BUFFERS switch). FILCOPY returns -1 on success, 0 otherwise (or 2 if one of the files is not a disk file). DECsystem-10 SIMULA Language Handbook, part III Page 115 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE flokup(f); INTEGER f; F contains the address of a control block suitable for the FILOP. UUO (See Monitor Calls). The .FOLEB field must contain a pointer to a lookup block (ordinary 4-word block or an extended lookup block). FLOKUP looks up the file given by the lookup block and also determines the exact path of the file (placed in the PATH. block pointed to by the .FOPAT field). On entry, the FILOP. block must contain i/o channel number in .FOFNC(F), SIXBIT device name in .FODEV(F), i/o mode in .FOIOS(F), addresses of PATH. and lookup blocks in .FOPAT(F), .FOLEB(F). The lookup block must contain information (path, filename and extension in sixbit) for finding the file. If the file can be found, the value of FLOKUP=F and the various blocks are updated, otherwise the value FLOKUP=0 is returned. WARNING: FLOKUP should only be used in special cases when the ordinary SIMULA i/o procedures are inadequate. **** TEXT PROCEDURE filspc(fileref,format); REF(FILE)fileref; INTEGER format; Returns a string specifying a file: in TOPS-10: dev:file.ext[path] in TOPS-20: str:file.ext;Pnnnnnn FORMAT is an integer which specifies the fields to be included in the resulting string. FORMAT is basically treated as a packed integer array, where most elements are 3 bits wide. Each 3-bit integer controls one field of the output string. The value of a controlling integer can be: 0: Suppress the field. 1: Always output the field. 2: Suppress the field if it is the system default. The following octal values would be used to always output the corresponding fields: 8R 100000 000000 (2^33) Output DEVICE (File structure) 8R 010000 000000 (2^30) Directory name in TOPS-20, ppn (+SFD) path in TOPS-10 8R 001000 000000 (2^27) File name (value=2 illegal) 8R 000100 000000 (2^24) File type (extension) (value=2 illegal) 8R 000010 000000 (2^21) File generation number (not implemented) 8R 000001 000000 (2^18) Protection 8R 000000 040000 (2^14, one bit) Temporary file (only in TOPS-20) The remaining field control bits used are: 8R 000000 000001 (2^0) Punctuate All Fields, e g DEV:NAME.EXT[p,pn,sfd1,sfd2] The format is adapted from the control word for the JFNS JSYS in TOPS-20 (see the Monitor DECsystem-10 SIMULA Language Handbook, part III Page 116 7. UTILITIES SPECIFIC TO DECSYSTEM-10 Calls manual for TOPS-20) to make it easy to modify when and if full TOPS-20 support will be included in the SIMULA system. FORMAT=0 or omitted is equivalent to 8R 221110 000001 - dev:name.ext[proj,prog,sfd1,...] (TOPS-10) dev:name.typ.gen;T (TOPS-20) with dev: omitted if it is DSK, omitted if it is the connected directory, [proj,...] omitted if it is the default path. Requires the external module FILEST (entry .FILST). **** INTEGER PROCEDURE gettab(table,index); INTEGER table,index; Executes GETTAB ac, where ac is [index,,table]. See Monitor Calls Manual. **** TEXT PROCEDURE idrx50(w); INTEGER w; Converts bits 4-35 of W to a RADIX50 identifier text (Length=6). Bits 0-3 are 1) stored in idrx50.Main.Sub(1,1) directly, 2) Converted to octal (after appending 2 zero bits to the right) in idrx50.Main.Sub(2,3), where the last char is blank. The following relation holds: idrx50.Main.Sub(5,6) == idrx50. Example: Octal 123456701234 is converted to "?10 OQ5H%3", where ? stands for Char(8r10//4) = Char(2) (=^B). **** TEXT PROCEDURE idsixbit(id6a,id6b); INTEGER id6a,id6b; Converts the two words id6a,id6b to a 12-character text (ASCII). The result is Strip of this identifier. If only 6 or fewer characters are relevant, use zero as second parameter. DECsystem-10 SIMULA Language Handbook, part III Page 117 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE intrea(x); REAL x; Provides type conversion REAL to INTEGER. The real x is interpreted as an integer quantity with the same bit pattern. Use with care - highly machine dependent! **** INTEGER PROCEDURE jobstatus(f); REF(Infile)f; Returns the job status for a TTY or PTY associated with the file object F. See PTYCHECK for interpretation of the value returned. **** INTEGER PROCEDURE loadbyte(bp,incr); INTEGER bp,incr; Load a byte via the standard byte pointer BP, modified INCR bytes. If INCR < 0 or INCR > 1, the ADJBP instruction, which is not implemented on KA-10 or KI-10 processors, is used. Example: If t:-Copy("ABCDEFGH"), LOADBYTE(ABSADR(t),5) = Rank('F'). LOADBYTE(8R222215 000001,0) gives the address of the prototype of the current "main" block, i.e. the prefixed block, class object, procedure instance or unreduced block which is innermost in the operating chain. The byte pointer is POINT 18,1(15),18. **** WARNING: To be used with caution. Highly machine- and implementation dependent. See STOREBYTE, STOREWORD. **** INTEGER PROCEDURE loadword(adr); INTEGER adr; Returns the 36-bit word at address ADR, if valid, otherwise gives "Illegal memory reference" (possibly "Object NONE"). **** WARNING: To be used with caution. Highly machine- and implementation dependent. See STOREWORD. **** INTEGER PROCEDURE match6(id1,id2,mask); INTEGER id1,id2,mask; ID1 (without wild card characters '?' or '*') is tested against ID2 with MASK showing wild card positions in ID2 if any. The result is 1 for an exact match, -1 for a wildcard match, 0 for no match. ID1 and ID2 are in SIXBIT code. The wildcard character '?' matches any character. '*' is equivalent to 6 or less '?' characters: "*" => "??????", "AB*" => "AB????". The wildcard MASK has octal 77 for each DECsystem-10 SIMULA Language Handbook, part III Page 118 7. UTILITIES SPECIFIC TO DECSYSTEM-10 '?' in ID2, zeros in the other positions. See WILDSIX. **** BOOLEAN PROCEDURE numbered The BOOLEAN PROCEDURE numbered should always be called immediately after inimage. It will return TRUE if the last input line was numbered. The internal flag will be reset by numbered and may be changed by each inimage, even on other files. For output of line-numbered files, see the information in the DECsystem-10 SIMULA Language Handbook part II about the file creation switch /NUMBERED. **** TEXT PROCEDURE octal(t,n); TEXT t; INTEGER n; Returns an octal representation (digits 0-7) of the bit pattern in N. T is used as workspace. If T.Length < 12, only the low-order part of N is converted (truncated to the left). OCTAL.Length = Min(12,T.Length). OCTAL.Main == T.Main. OCTAL.Pos points to the first non-zero digit. Example: t:-Blanks(10); OCTAL(t,-345)="7777777247"; OCTAL(345)="0000000531", Pos=8, thus REST(OCTAL(...))="531". CONTROLLING SUBJOBS (PTY HANDLING) Sometimes it is useful to be able to control a subjob from a SIMULA program. The subjob can do some tasks in parallel with the controlling job or perform some services which could not be handled by the controlling job without interrupting it, perhaps with loss of data and time. A subjob is controlled by means of a PTY (pseudo-teletype), which is implemented by monitor software to act as controlling terminal for the subjob. A PTY is handled like a terminal using buffered i/o. The following procedures are coded to aid handling of PTY's in a SIMULA program: - PTYFIL defines an Outfile object to be used for sending commands to the subjob. The output from the subjob goes to the Infile object which is a parameter to PTYFIL. - PTYINIMAGE is used to get the output from the subjob. The ordinary Inimage procedure for Infiles cannot be used because it would loop when there is no input available, or when the job output does not end with a break character. - PTYCHECK can be used to wait until the subjob becomes interactive, i.e. has output available or can accept input. - JOBSTATUS can be used to check the status of the subjob without waiting. - INPUTWAIT can be used to wait for activity on PTY's as well as TTY's. DECsystem-10 SIMULA Language Handbook, part III Page 119 7. UTILITIES SPECIFIC TO DECSYSTEM-10 - Actions to control a subjob: 1) Creation of a NEW Infile("PTY:xxx") (specific PTY if desired). 2) ptyout:-PTYFIL(ptyin), where ptyin is the Infile above. 3) ptyin.Open(Blanks(Sysin.Length)) for example. ptyout.Open(Blanks(Sysout.Length)). 4) Ordinary Outfile operations (Outchar, Outtext, Outimage, Breakoutimage) are used for sending commands to the subjob. Note that no password is required if you LOGIN on the same ppn as the main job. Check if the job can accept commands (JOBSTATUS, PTYCHECK, INPUTWAIT) before sending any. 5) Check for job output by PTYCHECK, JOBSTATUS, INPUTWAIT and use PTYINIMAGE to read the output. 6) Before closing the two PTY files, log out the job, otherwise it will become detached when the channel is RELEASEd. The ordinary SIMULA Close procedure has been modified to work with PTY. ****WARNING**** PTY handling has not been extensively checked. Proper operation is not guaranteed! See Monitor Calls for details of PTY handling. Additional functions may be implemented by the XCALLI procedure, see below. **** INTEGER PROCEDURE ptycheck(ptyin,timelimit); REF(Infile)ptyin; REAL timelimit; Returns job status (according to JOBSTS UUO) if PTY can accept input or has output within the time limit, otherwise zero. Interpretation of returned value: JB.UJA 8R400000 000000 (negative) Job number is assigned. JB.ULI 8R200000 000000 Job is logged in. JB.UML 8R100000 000000 TTY is at monitor level. JB.UOA 8R040000 000000 TTY output is available. JB.UDI 8R020000 000000 TTY at user level in input wait, or at monitor level and can accept a command. JB.UJC 8R010000 000000 JACCT is set. In particular, ^C^C will not work. JB.UJN 8R000000 777777 Job number or zero. If 0 3 and <= 8R74. EXTERNAL procedures required: INTEGER PROCEDURE absadr, storebyte; INTEGER PROCEDURE bitfield; ; TEXT t; INTEGER i,j; CHARACTER c; t:- IF id.Length > 6 THEN id.Sub(1,6) ELSE id; WHILE t.More DO BEGIN c:= t.Getchar; i:= i * 8R50; IF Letter(c) THEN BEGIN i:= i + Rank(c) - 8R66; IF c >= 'a' THEN i:= i - 8R40; END ELSE IF Digit (c) THEN i:= i + Rank(c) - 8R57 ELSE IF c = '.' THEN i:= i + 8R45 ELSE IF c = '$' THEN i:= i + 8R46 ELSE IF c = '%' THEN i:= i + 8R47 ELSE IF NOT c = ' ' THEN GOTO out; END; FOR j:= t.Length - 5 STEP 1 UNTIL 0 DO i:= i * 8R50; IF NOT code = 0 THEN BEGIN code:= bitfield(code,30,4); storebyte(code,8R400400000000 + absadr(i),0); END; rdx50:= i; out: END rdx50; DECsystem-10 SIMULA Language Handbook, part III Page 122 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE reaint(x); REAL x; Provides type conversion INTEGER to REAL. The integer x is interpreted as an real quantity with the same bit pattern. Use with care - highly machine dependent! **** BOOLEAN PROCEDURE rescan; A SIMULA program is normally started by some monitor command. RESCAN backs up the TTY input buffer, if possible, so that the invoking command can be reread. If the command line can be reread, RESCAN returns TRUE, else FALSE. The next input (of a line or a character) from the controlling TTY (normally SYSIN) will return the command line which started the SIMULA program, e g: RUN prog- The monitor command scanner allows command lines which contain extra information not expected by the monitor itself. The extra information should be preceded by a character which is not in the command syntax, like '-', '('. RESCAN must be called BEFORE the first input from the terminal. If RESCAN is to be used, file specifications cannot be taken from the terminal. Any error dialogue before RESCAN is called will render it useless. Also, you cannot expect RESCAN to work if you start the program directly after loading by an EXECUTE or DEBUG command. If you do not have the program in executable form, you should use LOAD, then START . Programs using RESCAN should always provide an alternative way of getting the information. Example (from SIMED): EXTERNAL BOOLEAN PROCEDURE rescan; EXTERNAL TEXT PROCEDURE scanto,rest,inline; TEXT initcommand,t; IF rescan THEN BEGIN Inimage; t:-Sysin.Image.Strip; IF t=/=NOTEXT THEN t:-Copy(t); scanto(t,'-'); ! t.Pos after '-' or at end of command line; initcommand:- rest(t); END scanning command line; ... TEXT command; command:- IF initcommand =/= NOTEXT THEN initcommand ELSE inline("*",Sysin); ... The command R SIMED-X.SIM[100,101] will yield initcommand = "X.SIM[100,101]", and just R SIMED will yield initcommand == NOTEXT, causing a DECsystem-10 SIMULA Language Handbook, part III Page 123 7. UTILITIES SPECIFIC TO DECSYSTEM-10 prompting "*" to be output to show that a command is expected. **** SIMATR PROGRAM Displays ATR file information. This improved version is written in SIMULA. It displays the SIMULA skeleton of the separately compiled module together with unique entry names (also for other required external modules). The external classes DIRHND and ATRSTR are required to load SIMATR, a well as a number of external (LIBSIM) procedures. **** INTEGER PROCEDURE sixbit(t); TEXT t; Converts at most 6 characters from the ASCII text T to SIXBIT, i.e. the code used in the TOPS-10 monitor for names of devices, files, commands. Each character in SIXBIT is 6 bits, thus only 64 different characters can be represented, half as many as in ASCII. Lowercase letters are treated as upper case, and control characters (Char(0) - Char(31)) cannot be represented. SIXBIT translates the first 6 characters of T to sixbit code by subtracting 32 from each character value < 96 and 64 from the others. Negative values are made zero (space in sixbit code). The result is an integer, left justified, which could be used as a sixbit quantity e.g. with some XCALLI functions. The inverse function is IDSIXBIT, q.v. See also OCTAL for a way of representing bit patterns as text strings. **** INTEGER PROCEDURE sxrx50(w); INTEGER w; Converts bits 4-35 of W to a RADIX50 identifier expressed in SIXBIT code (Length=6). Example: Octal 123456701234 is converted to SIXBIT "OQ5H%3". Bits 0-3 are ignored. ****INTEGER PROCEDURE storebyte(b,bp,incr); INTEGER b,bp,incr; Using the byte pointer BP (careful if index and indirection fields are not zero) store the byte B (last bits according to byte size) by a DPB or IDPB instruction. If INCR=0 use DPB, if =1 use IDPB, otherwise modify by ADJBP (only possible on KL-10/20 systems). See LOADBYTE. DECsystem-10 SIMULA Language Handbook, part III Page 124 7. UTILITIES SPECIFIC TO DECSYSTEM-10 ****INTEGER PROCEDURE storeword(w,adr); INTEGER w,adr; Stores the 36-bit word W at address (ADR) in core. For convenience, the result of the function is the stored value. Note that indirect addressing is used, which means that the effective address is modified by any index register specified in bits 14-17 and indirection will be used if bit 13 is 1. This is dangerous since you cannot control the contents of ac's in general. Use this procedure ONLY if you know EXACTLY what you are doing! LOADWORD is the complement of STOREWORD. **** TEXT PROCEDURE tmpin(nam,delete); VALUE nam; TEXT nam; BOOLEAN delete; Uses the TMPCOR UUO to read the core file NAM into a new text object. If a core file is not found, a file with name "TMPNAM(NAM)" (see below) is tried instead (read in dump mode if found). If DELETE is TRUE, the file is deleted after reading. Returns NOTEXT if the file was not found, Blanks(1) if found but empty. In the latter case Pos=2 also, otherwise 1. Information to be read by TMPIN may be created using TMPOUT (see below). **** TEXT PROCEDURE tmpnam(nam); VALUE nam; TEXT nam; TMPNAM takes one parameter NAM. The parameter may be a text constant, variable or expression whose first three characters (or fewer than 3 if NAM.Length is less) are used when forming a temporary file name which is the value of TMPNAM. The name has the form "jjjnam.TMP", where jjj is the current job number in decimal notation, and nam are the first three or fewer characters of the parameter. File names of this form are used for command files to standard CUSP's, such as SIMULA, PIP, LINK-10 and should also be useful for internal scratch files in a SIMULA program. See the RUN procedure for examples. DECsystem-10 SIMULA Language Handbook, part III Page 125 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** BOOLEAN PROCEDURE tmpout(nam,txt); NAME nam; TEXT nam,txt; Uses the TMPCOR UUO to write the core file NAM from TXT. If TMPCOR fails, a real file named "TMPNAM(NAM)" (see TMPNAM procedure) is opened instead, and TXT is written in dump mode. Returns FALSE if the file could not be written, TRUE on success. No carriage return-line feed will be supplied - must be in TXT if needed. The text should start and end on a word boundary. **** INTEGER PROCEDURE trmop(funcod, iox, val); INTEGER funcod, val; REF (Outfile) iox; TRMOP allows the SIMULA program to test and change the values of certain status items associated with a terminal connected to the SIMULA program via a file object. The program can thus achieve the equivalents of the monitor commands .TTY NO ECHO, .TTY LC etc. FUNCOD is the four-digit octal code for the function to be performed. A first digit = 0 signifies a special function (usually a generalization of the TTCALL UUO for the job-controlling terminal). If the first digit is 1, a read function is performed, i. e. the current value of the field is returned as function value. If the first digit is 2, the corresponding value is set to the value given by VAL, and the old value is returned as function value. The effect of other values of the first digit is installation dependent. If the requested function cannot be performed, the value of the TRMOP function is -1. IOX is an outfile referring to the TTY involved. IOX==NONE refers to the terminal controlling the job. VAL is the new value for the status item. Redundant except for set function (FUNCOD=8R2xxx). TRMOP returns the old value of the status item when relevant. DECsystem-10 SIMULA Language Handbook, part III Page 126 7. UTILITIES SPECIFIC TO DECSYSTEM-10 Special case: for FUNCOD = 1 or 2, a skip return is mapped as the function value 1, non-skip return as 0. Example I: "TRMOP(8R1003,sysout,0)" returns 1 if the previous setting was "TTY NO LC", returns 0 if the previous setting was "TTY LC". (TTY NO LC means that the monitor converts all lower case letters to upper case in transmissions from the conversational terminal.) Example II: "TRMOP(8R2003,sysout,1)" is equivalent to the monitor command "TTY NO LC". All the status items which can be interrogated or set by TRMOP are listed in the DECsystem-10 Software Notebooks, "DECsystem-10 monitor calls", (DEC-10-OMCMA-B-D), Section 11.2.4. Here is an excerpt of the most useful items: FUNCOD value 8R1003 1 = NO LC (lower case) 8R1005 0 = NO TAB (tabs converted to multiple spaces) 8R1006 0 = NO FORM 8R1007 1 = NO ECHO (printable characters not echoed) 8R1010 1 = NO CRLF (monitor inserts no extra CR-LFs) 8R1011 Horizontal position of carriage 8R1012 Carriage width (TTY WIDTH) = Create at given position in line 8R1013 1 = NO GAG (accepts external messages) 8R1017 TTY FILL (filler class index, governs number of fill chars after FF and CR) 8R1024 Number of lines output on this page 8R1026 0 = ASCII codes 175 and 176 converted to altmode 8R1035 Create at first space after given position in line DECsystem-10 SIMULA Language Handbook, part III Page 127 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE ttyline(ttyn); TEXT ttyn; ! Required external procedures: ; EXTERNAL INTEGER PROCEDURE xcalli, sixbit; EXTERNAL TEXT PROCEDURE scanto, idsixbit; BEGIN ! Accepts tty name or number (octal format). ! Returns node*218+line if network is in effect, ! just line no if not, or zero on error. ; CHARACTER c; TEXT t; INTEGER sixname, n; t:- ttyn; IF t =/= NOTEXT THEN BEGIN c:= t.Getchar; IF Letter(c) THEN BEGIN sixname:= sixbit(t); sixname:= xcalli(8R64,sixname,TRUE,0); ! DEVNAM; t:- idsixbit(sixname,0); IF t.Sub(1,3) NE "TTY" THEN GOTO error; ttyn:- t.Strip; END letter ELSE IF Digit(c) THEN BEGIN ttyn:- Copy("TTY "); ttyn.Setpos(4); GOTO pc; WHILE t.More AND ttyn.More DO BEGIN c:= t.Getchar; pc: ttyn.Putchar(c); END; END digit; ttyn.Setpos(1); ttyline:= xcalli(8R165,sixbit(ttyn),TRUE,0); ! GTNTN.; END; error: ; END; DECsystem-10 SIMULA Language Handbook, part III Page 128 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** TEXT PROCEDURE ttynumber(node,lineno); ! Required external procedures: ; EXTERNAL INTEGER PROCEDURE xcalli; EXTERNAL TEXT PROCEDURE idsixbit; INTEGER node, lineno; BEGIN ! Returns TTY number as octal ASCII text. ! Also returns full TTY device name as ttynumber.Main ! Example: TTY75: ttynumber = "75". ! ttynumber.Main = "TTY75:". Thus ttynumber.Main can be used directly ! as file specification for the TTY. ; INTEGER sixname; sixname:= xcalli(8R166,node*8R1000000+lineno,TRUE,0); ! GTXTN.; IF sixname NE 0 THEN BEGIN TEXT t; t:- idsixbit(sixname,0); t:- t.Main.Sub(1,t.Length+1); t.Setpos(t.Length); t.Putchar(':'); ttynumber:- t.Sub(4,t.Length-4); END; END; FILED - FOR INPUTTING AND OUTPUTTING DEC-10/20 TEXT FILES: By Jacob Palme, Swedish National Defense Research Institute, S-104 50 Stockholm 80, Sweden. This program contains a class FILED (which can be separately compiled) to input and output DEC-10/20 ASCII-7-formatted text files in SIMULA. The program can handle both unnumbered and line numbered text files. For numbered files, the program will ensure that the output file has the line number format required by other DEC-10/20 text handling programs like SOS. Lines without line numbers will be numbered. The good facilities for text handling make SIMULA a useful language for text handling programs like editors, programming language translators, compilers, pre-compilers etc. However, reading and writing text files on the DEC-10, especially line numbered files, is rather tricky in SIMULA. By using this program, you avoid those problems. The program can be found in a file with the name FILED.SIM on the SIMULA distribution tape. At the QZ computing center, you may find the file FILED.SIM on DSKE:[13,134]. DECsystem-10 SIMULA Language Handbook, part III Page 129 7. UTILITIES SPECIFIC TO DECSYSTEM-10 **** INTEGER PROCEDURE xcalli(n,arg,errnoskip,errvalue); INTEGER n,arg,errvalue; BOOLEAN errnoskip; Executes CALLI AC1,N - where AC1 is loaded from ARG. ERRVALUE is returned if the CALLI does not skip, and ERRNOSKIP is TRUE. See the Monitor Calls manual for CALLI UUO functions. In TOPS-10, most of the monitor interface is handled by CALLI. Examples: XCALLI(8R30,0,FALSE,0)=job number, XCALLI(8R24,0,FALSE,0)=ppn (proj*2^18+prog), XCALLI(8R31,10,FALSE,0) will cause job to SLEEP 10 seconds, XCALLI(8R41,m*2^18+n,TRUE,0) will perform GETTAB(m,n) and return value of item or zero on failure. For more esoteric functions, you may have to provide an argument list pointed to by ABSADR(first word of list). Example: INTEGER rundev,runfile,runext,run3,runppn,runarg; rundev:=SIXBIT("SYS"); runfil:=SIXBIT("SIMULA"); XCALLI(8R35,ABSADR(rundev),TRUE,0); EXIT(0); Will start SIMULA in command mode or exit to monitor on failure. XCALLI should be used with great caution. It is provided as a convenience where safer methods of achieving the desired results are too cumbersome or impossible. By using XCALLI, you may not need to write a MACRO-10 procedure for a very small task, and experimenting is easier. Be very careful not to cause any garbage collection between computation of an absolute address and its use! **** INTEGER PROCEDURE wildsix(id,mask,k); NAME mask; INTEGER mask, k; TEXT id; Convert at most K (K <= 6) characters from ID to SIXBIT, taking special notice of "wild cards" as follows: If a '?' is found, the corresponding position in MASK (byte size 6) will be made = 8R77. If an asterisk ('*') is found, the rest of the characters up to number K (1<=K<=6) will be treated as '?'. The result is the SIXBIT code of ID (initial K characters). See PROCEDURE SIXBIT. Example: ID="AB??", K=6 will give wildsix=8R414237370000, MASK=8R000077770000. DECsystem-10 SIMULA Language Handbook, part III Page 130 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES (The programs described in this appendix do not work on a DECsystem-20 at the time when this is written, April 1977.) CONTENTS A.1 REALTIME - A SCHEDULER FOR TERMINAL PROCESSES A.2 PROCEDURES WAITFORINPUT, INPUTCHECK AND HOLD(0). A.3 PROCEDURES CLOCKTIME, SYNCHRONIZE AND DESYNCHRONIZE. A.4 STRUCTURE OF THE CLASS REALTIME A.5 APPLICATION EXAMPLES. A.5.1.1 SIMULTANEOUS, UNINTERFERED DIALOGUE BETWEEN THE COMPUTER AND SEVERAL REAL TERMINALS A.5.1.2 A COMPLETE PROGRAM USING THE CLASS REALTIME. A.5.2 DATA BASE SYSTEM, SEVERAL TERMINALS A.5.3 LIMITED RESPONSE TIME FOR THE TERMINAL OPERATOR. A.5.4 A CONVERSATIONAL TIME-SHARING SYSTEM. A.5.5 COORDINATED CONTROL OF SIMULTANEOUS REAL PROCESSES. A.5.6 SIMULTANEOUS DIALOGUE AND EXECUTION. DECsystem-10 SIMULA Language Handbook, part III Page 131 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES This documentation is based on FOA P Report C 8394 (June 1974): "Making SIMULA into a Programming Language for Real Time" by Jacob Palme. (Published in Management Informatics, Vol. 4, No. 4, August 1975, pp. 129-138.) The simplest kind of real time application is the execution of a conversational program running under a time-sharing system with one external user talking to the program through a terminal such as a display unit or a typewriter terminal. This simple interaction can already be easily programmed in SIMULA. The time-sharing operating system will handle all the real time problems for the SIMULA program. But as soon as we want more than one real process to communicate simultaneously with the SIMULA program, more advanced real time capabilities are required. Examples: - We may want to write a simulation program which communicates with real components, e.g. human participants. - We want to let several users from separate terminals simultaneously access a data base, both fetching and storing information in it. One master program has to coordinate the data base accesses so that two users do not simultaneously try to update the same record. We might want to write this program in SIMULA. DECsystem-10 SIMULA Language Handbook, part III Page 132 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES A.1.3 Procedures WAITFORINPUT, INPUTCHECK and HOLD(0). The execution of a SIMULA process is only interrupted where explicit statements like "HOLD" or "PASSIVATE" cause control to transfer from the process to the scheduler. A common error when programming real time programs is that one parallel process uses partly updated data, produced by another parallel process. For small in-core updates, a programmer in SIMULA can avoid this error by only putting statements like "HOLD" and "PASSIVATE" at places in the source program where data updates are complete. For more complex updates, a special process can be written to access the critical data, and other processes requesting updates can be queued to the special process. When a SIMULA process executes a statement like "HOLD" or "PASSIVATE", then control goes to the SIMULA scheduler, which then transfers control to another process. "HOLD(A)" stops execution of the current process but asks the SIMULA scheduler to restart it after A time units. If A is zero, then the current process is stopped and placed at the end of a queue of currently active processes. If a number of processes successively make "HOLD(0.0)" they will thus get access to the CPU in a round robin fashion. A SIMULA programmer can thus ensure fast response to external interrupts by not doing too much computations between successive "HOLDS". "PASSIVATE" stops the current process indefinitely, it must be activated again from some other process. Processes waiting for external interrupts are put into a special queue with the procedure call "WAITFORINPUT". The "SIMULATION CLASS REALTIME" contains a special version of "HOLD" and an alternative version of "PASSIVATE" called "TERMINAL_PASSIVATE" and these procedures first scan this special queue to see if data has arrived from the input device associated with the terminal processes. If a process is found for which data has arrived on the associated input device, then the SIMULA scheduler activates this process immediately. The event created by the first external interrupt found is thus placed in front of other currently active processes in the sequencing set. This, however, is not done at the time of the interrupt, the placing is done at the time of the next activation of the scheduler after the interrupt. DECsystem-10 SIMULA Language Handbook, part III Page 133 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES Inside a terminalprocess, a call "WAITFORINPUT" will thus tell the system to make this process passive, but to reactivate it as soon as new data has arrived on the input device associated with the process. A new BOOLEAN standard procedure INPUTCHECK is also introduced. INPUTCHECK is TRUE if and only if data is available (i.e. has arrived from the terminal device) for reading with INIMAGE. A.3 Procedures CLOCKTIME, SYNCHRONIZE and DESYNCHRONIZE. For real time applications, we may also want to synchronize simulated time with real time. For this there are three new standard procedures: REAL PROCEDURE clocktime; COMMENT gives time in seconds since the beginning of the current day; PROCEDURE synchronize(timeunit); REAL timeunit; COMMENT this procedure starts synchronization of real and simulated time; PROCEDURE desynchronize; COMMENT and this stops synchronization; Of course perfect synchronization of real and simulated time is not possible since the speed of the computer itself is not infinite. The package tries to synchronize, and never allows simulated time to become more than a fraction of a second greater than real time. Synchronization consumes some additional cpu time. If the scheduler finds that the next process to be scheduled has a too large simulated time, then the SIMULA scheduler lets the SIMULA program go to sleep for the necessary time interval. Any interrupts caused by input will however start the SIMULA program again. The parameter "timeunit" to the procedure "synchronize" is there since the time unit may not be the same in the simulation as in the real world. "timeunit" is the size of the simulation time unit in seconds. Thus, if simulated time is measured in seconds, "timeunit" should be 1.0. If simulated time is measured in hours, "timeunit" should be 60*60. DECsystem-10 SIMULA Language Handbook, part III Page 134 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES A.4 Structure of the class REALTIME OPTIONS(/E); EXTERNAL BOOLEAN PROCEDURE inputcheck; EXTERNAL PROCEDURE sleep, abort; EXTERNAL INTEGER PROCEDURE inputwait; EXTERNAL REAL PROCEDURE clocktime; simulation CLASS realtime; NOT HIDDEN PROTECTED synchronize, desynchronize, terminal_passivate, hold, terminalprocess; NOT HIDDEN process, current, time, passivate, wait, main, linkage, link, head; BEGIN PROCEDURE synchronize(timeunit); REAL timeunit; COMMENT this procedure starts synchronization of real and simulated time; BEGIN ... END; PROCEDURE desynchronize; COMMENT This procedure ends synchronization of real and simulated time; BEGIN ... END; PROCEDURE terminal_passivate; COMMENT special version of passivate for a terminalprocess; BEGIN ... END; PROCEDURE wait(q); REF (head) q; COMMENT special version of wait for a terminalprocess; BEGIN ... END; PROCEDURE hold(delaytime); REAL delaytime; COMMENT special version of hold for terminalprocesses. hold(0.0) gives round robin process scheduling; BEGIN ... END; process CLASS terminalprocess(fromterminal); REF (infile) fromterminal; NOT HIDDEN PROTECTED fromterminal, waitforinput; NOT HIDDEN evtime, nextev, into; BEGIN PROCEDURE waitforinput; COMMENT this process waits until inimage is possible to make for some file in the input_array; BEGIN ... END; END of terminalprocess; DECsystem-10 SIMULA Language Handbook, part III Page 135 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES END of class realtime; A.5 Application examples. In this section you can see how the new concepts can be used. Some examples will be given of real time programs written in SIMULA using the new concepts. The programs are not always complete. Three dots indicate places where something has been left out. A.5.1.1 Simultaneous, uninterfered dialogue between the computer and several real terminals. One master terminal reads file specifications for the other terminals and starts up one copy of the SIMULA CLASS "terminal" for each of the other terminals. Each of these "terminalprocesses" will open the connection to its real terminal, and then go into a loop of (a) waiting for input and (b) producing answers. Each of these terminal loops will go on independently of the other, and the SIMULA scheduler will distribute control between the "terminalprocesses". terminalprocess CLASS terminal(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN PROCEDURE open_terminal_connections; ... PROCEDURE read_the_input_and_produce_an_answer; ... WHILE TRUE DO BEGIN waitforinput; read_the_input_and_produce_an_answer; END; END; END; DECsystem-10 SIMULA Language Handbook, part III Page 136 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES ACTIVATE NEW terminal(sysin,sysout); ACTIVATE NEW terminal(NEW infile("TTY2:"), NEW outfile("TTY2:")); ACTIVATE NEW terminal..... .... passivate; A.5.1.2 A complete program using the CLASS REALTIME. Here follows a complete, small program using the CLASS REALTIME. At each terminal, the program returns the input received at that terminal. If the input at a terminal is a legal TTY device specification, that terminal is connected to the program. BEGIN EXTERNAL BOOLEAN PROCEDURE inputcheck; EXTERNAL PROCEDURE sleep, abort; EXTERNAL INTEGER PROCEDURE inputwait; EXTERNAL REAL PROCEDURE clocktime; EXTERNAL CLASS realtime; EXTERNAL REF (infile) PROCEDURE findinfile; EXTERNAL REF (outfile) PROCEDURE findoutfile; DECsystem-10 SIMULA Language Handbook, part III Page 137 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES realtime BEGIN terminalprocess CLASS terminal(toterminal); REF (outfile) toterminal; BEGIN TEXT stripimage; INSPECT fromterminal DO INSPECT toterminal DO WHILE fromterminal.image.sub(1,2) NE "/*" DO BEGIN waitforinput; inimage; stripimage:- fromterminal.image.strip; IF stripimage =/= NOTEXT THEN BEGIN IF stripimage.sub(stripimage.length,1) = ":" THEN BEGIN COMMENT Connect another terminal; IF connect(stripimage) THEN outtext("NEW LINE OPEN. ") ELSE outtext("NOT ABLE TO OPEN THAT LINE. "); END; END; outtext("I received: '"); outtext(stripimage); outtext("'"); outimage; END; toterminal.close; fromterminal.close; END; BOOLEAN PROCEDURE connect(filespec); VALUE filespec; TEXT filespec; INSPECT findinfile(filespec) DO BEGIN open(blanks(80)); INSPECT findoutfile(filespec) DO BEGIN open(blanks(80)); connect:= TRUE; outtext( "THIS TERMINAL IS NOW CONNECTED!"); outimage; ACTIVATE NEW terminal (THIS infile, THIS outfile); END OTHERWISE close; END; DECsystem-10 SIMULA Language Handbook, part III Page 138 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES ACTIVATE NEW terminal(sysin, sysout); passivate; END of realtime prefixed block; END of the whole program; A.5.2 Data base system, several terminals use the same data base. This is a very simple example of a data base system with several conversational terminals which independently put requests (questions or updates) to a data base. The actual data base accesses must be done for only one request at a time to avoid errors when one terminal tries to read what another terminal is updating. The SIMULA program contains one process for each terminal and one process for the data base. The terminal processes wait for input from their respective terminals. When a data base request has been received, the terminal process is put into a queue of data base requests. The data base process takes one terminal process at a time from this queue and processes the data base request. Thereafter, the data base process ACTIVATEs the terminal process again. When ACTIVATEd, this terminal process writes the answer to its terminal and waits for new requests from it. DECsystem-10 SIMULA Language Handbook, part III Page 139 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES realtime BEGIN REF (head) request_queue; REF (data_base) the_data_base; terminalprocess CLASS terminal(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN PROCEDURE open_terminal_line; ... PROCEDURE read_and_prepare_data_base_request; ... PROCEDURE write_the_answer_to_the_request; ... WHILE TRUE DO BEGIN waitforinput; read_and_prepare_data_base_request; ACTIVATE the_data_base DELAY 0; wait(request_queue); write_the_answer_to_the_request; END; END; END; process CLASS data_base; BEGIN INSPECT NEW directfile(data_base_file_specifications) DO BEGIN PROCEDURE open_data_base_file; ... PROCEDURE put_the_request_to_the_data_base; ... open_data_base_file; WHILE TRUE DO INSPECT request_queue.first WHEN terminal DO BEGIN out; COMMENT to remove the terminal from the request queue; put_the_request_to_the_data_base; ACTIVATE THIS terminal; END OTHERWISE passivate; END; END; DECsystem-10 SIMULA Language Handbook, part III Page 140 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES A.5.3 Limited response time for the terminal operator. This is a very simple example of a program which is coordinated with the time in the real world. A question is given to a terminal operator and the program waits for an answer. The program should take different action depending on whether the answer is received within 60 seconds or not. To do this, the new standard procedure SYNCHRONIZE is used to synchronize real time with the simulated time in SIMULA. terminalprocess CLASS terminal(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN REAL questiontime; PROCEDURE write_question_to_the_terminal; ... PROCEDURE process_fast_answer; ... PROCEDURE process_slow_answer; ... synchronize(1.0); write_question_to_the_terminal; questiontime:= time; waitforinput; IF time - questiontime < 60.0 THEN process_fast_answer ELSE process_slow_answer; END; END; A.5.4 A conversational time-sharing system. The conversational time-sharing system in this example could be an interpreter for a language like APL or FOCAL or AID. Highest priority is given to those input commands which are to be performed directly. Lower priority is given to input commands requesting the execution of a stored program. When several stored programs are in execution at the same time, CPU power is distributed between them in a round robin fashion letting each program perform one statement in the stored program before continuing to the next program. DECsystem-10 SIMULA Language Handbook, part III Page 141 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES terminalprocess CLASS terminal(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN PROCEDURE open_terminal_connections; ... PROCEDURE read_the_input_and_produce_an_answer; BEGIN BOOLEAN more_statements, execute_command; PROCEDURE read_and_interpret_an_input_line; ... PROCEDURE execute_the_next_stored_program_statement; ... PROCEDURE perform_the_command_from_the_input_line; ... read_and_interpret_an_input_line; IF NOT execute_command THEN perform_the_command_from_the_input_line ELSE WHILE more_statements DO BEGIN HOLD(0); COMMENT to transfer control to another process; execute_the_next_stored_program_statement; END; END; WHILE TRUE DO BEGIN waitforinput; read_the_input_and_produce_an_answer; END; END; END; DECsystem-10 SIMULA Language Handbook, part III Page 142 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES A.5.5 Coordinated control of simultaneous real processes. When a real time computer program communicates with several simultaneous processes in the real world, the computer program may want to control itself or the real-world processes depending on the results in the various processes. Example 1: A simulation program may want to continue the simulation when all the terminals have replied to certain questions. Example 2: A process control program may monitor several real-world processes, and initiate other real-world actions when previous processes are ready. This is similar to PERT-networks in planning, where certain actions must wait for other actions to finish. To illustrate this, a simple example assumes a robot with three arms. A process "put nail in board" is initiated. This process initiates three simultaneous processes, the first arm gets a hammer, the second arm gets a nail, and the third arm gets a board. When all these three processes are finished, the hammer is used to push the nail into the board. In other languages, special constructs like "fork" and "join" are used to create parallel processes and then continue when all the processes are ready. But the same thing is very simple to program in SIMULA, and in SIMULA we do not have to wait until a process is completely finished, we can also easily start a later process when still running processes have reached certain states. DECsystem-10 SIMULA Language Handbook, part III Page 143 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES terminalprocess CLASS arm(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN TEXT order; BOOLEAN ready; REF (process) master; PROCEDURE perform_order; ... WHILE TRUE DO BEGIN terminal_passivate; ready:= FALSE; perform_order; ready:= TRUE; ACTIVATE master DELAY 0; END; END; END; process CLASS put_nail_in_board(arm1, arm2, arm3); REF (arm) arm1, arm2, arm3; BEGIN arm1.order:- copy("find hammer"); arm1.master:- current; arm2.order:- copy("find nail"); arm2.master:- current; arm3.order:- copy("find board"); arm3.master:- current; ACTIVATE arm1 DELAY 0; ACTIVATE arm2 DELAY 0; ACTIVATE arm3 DELAY 0; terminal_passivate; WHILE NOT (arm1.ready AND arm2.ready AND arm3.ready) DO terminal_passivate; arm1.order:- copy("swing hammer"); ACTIVATE arm1 DELAY 0; ... END; A.5.6 Simultaneous dialogue and execution. On many occasions, you may want a program to execute and talk to the user at the same time. You may for example want to allow the user to ask the computer how far the execution has reached. This is especially useful for time-consuming executions, where the user may get impatient and may want to know if the delay is caused by machine error, erroneous data to the program, by a heavy load on the machine or just by a time-consuming execution in general. One can then write a program with two processes, one process for talking to the user and another process for the time-consuming execution. DECsystem-10 SIMULA Language Handbook, part III Page 144 APPENDIX A - REALTIME - A SCHEDULER FOR TERMINAL PROCESSES terminalprocess CLASS userdialogue(toterminal); REF (outfile) toterminal; BEGIN INSPECT fromterminal DO INSPECT toterminal DO BEGIN ACTIVATE NEW cpuactivity DELAY 0; WHILE TRUE DO BEGIN outline("CPU activity has begun. If you want to"); outline("know what is happening, then type"); outline("""?"" on your terminal"); waitforinput; inimage; tell_the_user_what_is_happening; END; END; END; DECsystem-10 SIMULA Language Handbook, part III Page 145 APPENDIX B - CONTROLLED ERROR HANDLING APPENDIX B - CONTROLLED ERROR HANDLING By Stefan Arnborg August 1975, Modified October 1975 CONTENTS B.1 PROBLEM B.2 SOLUTIONS B.3 CHOICE OF SOLUTION FOR SIMULA B.4 PROPOSAL B.5 DISCUSSION The procedures MASKERROR, SENSEERROR, JUMPERROR and RESETERROR described below have not yet been implemented, and no promise is made about if or when to do so. B.1 Problem. Dependable software must be prepared to detect and diagnose errors in input data. For complex problems error handling will take a significant part of the programming effort. Programmed error handling is a means to achieve error handling without having to reprogram in SIMULA checks actually made by the programming system and the hardware. The absence of this facility has been used as one argument for using PL/1 rather than SIMULA at FOA. B.2 Solutions. Programmed error handling in other programming systems and environments usually falls in one of three classes: A Implicit action. In CDC Algol an error may cause a jump to a preset label. In the Knuth proposal for I/O in Algol 60, errors may cause predefined procedures to be called. In PL/1 an error may cause a previously set ON-unit to be activated. DECsystem-10 SIMULA Language Handbook, part III Page 146 APPENDIX B - CONTROLLED ERROR HANDLING B Error returns. The READ/WRITE statements of many FORTRAN implementations permit error and end-of-file exit labels to be passed as parameters. Many general-purpose algorithms in ACM collected algorithms have parameters returning error codes or error exit label parameters. C Raising flags. In the CODASYL DBMS proposal, an error condition raises flags that can be inspected by the program. B.3 Choice of solution for SIMULA. The following requirements on a solution are rather obvious: i) Existing programs should not be affected unless the user wants to take advantage of the facility. ii) It must be easily implemented on existing systems. iii) It must be well defined and easy to use. iv) It must be compatible with the overall language philosophy. v) In particular, it must be as implementation independent as possible. Method A seems to satisfy i) and v) but contradicts the other requirements. In particular, it requires much programming effort (at least in the IBM 360 and DEC 10 implementations) to be able to enter a user program point from anywhere in the run-time system. However, an implicit jump is easier to implement than an implicit procedure call. It has the slight drawback that it is difficult to know where the error occurred and to proceed after corrections, because bookkeeping operations like e.g. file positioning may get out of phase. It is also not agreed that implicit actions are consistent with good programming methodology. Method B contradicts i) or ii) and iv) depending on whether the additional parameters are made compulsory or optional. Moreover, it takes care only of errors in system procedures. DECsystem-10 SIMULA Language Handbook, part III Page 147 APPENDIX B - CONTROLLED ERROR HANDLING Method C complies with all requirements to a reasonable degree. However, it requires a program to continue after an error has occurred and this continued execution will maybe not be entirely implementation independent. It can be seen as a method to achieve an orderly failure rather than a means to implement a complicated polyalgorithm. It is easy to implement recovery procedures of differing levels of detail as in the example: BEGIN initialize_sequence_of_batches; WHILE more_batches DO BEGIN process_batch: WHILE more_records DO BEGIN process_record: WHILE more_fields DO BEGIN process_field; recovery1; END; recovery2; END; recovery3; END; END; At each of the recovery points it is possible to prevent upward updates from an erroneous field, record or batch. B.4 Proposal. It is suggested that the following text be inserted into the SDG publications: "Programmed Error Handling. The programmed error handling facilities of SIMULA make it possible to achieve, in a SIMULA program, an orderly handling of certain errors occurring during execution as a result of incorrect or unexpected inputs to the program. Errors are classified into the following categories: DECsystem-10 SIMULA Language Handbook, part III Page 148 APPENDIX B - CONTROLLED ERROR HANDLING 1 Underflow in floating point computation 2 Overflow in computation or division by zero 3 I/O transmission error 4 End of file error 5 Edit overflow 6 Incorrect text contents for de-editing procedure 7 Array index out of range 8 Incorrect parameter to mathematical function 9 Time limit - as defined by a previous call to TIMELIMIT - exceeded. 10 All the errors listed above. 999999 Remaining errors that can be intercepted in an implementation. The errors above are not all errors that can result from incorrect data but only those that will occur as a direct and immediate consequence of invalid data. Second order errors result from following an incorrect path of the program because of invalid data: those errors are not handled. The following system procedures are available for error handling: [Addition by Jacob Palme 1976-03] Possibly we could allow an implementation to add an implementation dependent number of extra error codes, between 11 and 999998. The error code 999999 would then be equivalent to all such error codes, which means that programs using only error codes 1-8 will still be machine independent and programs using error codes 9, 10 and 999999 will be reasonably machine independent, while programs using extra error codes between 11 and 999998 will at their own risk be machine dependent. **** PROCEDURE MASKERROR(CODE,COUNT); INTEGER CODE,COUNT; Execution of MASKERROR permits COUNT errors of category CODE to occur without intervention by the run time system. The effect of continuing after an error is dependent on the kind of error: (On certain computers, the architecture may make these default effects impossible. If so, they may do otherwise.) 1. Result of operation is zero. 2. Result of operation is zero. DECsystem-10 SIMULA Language Handbook, part III Page 149 APPENDIX B - CONTROLLED ERROR HANDLING 3. The image fetched will contain the record as transmitted, if possible. Otherwise a blank image will be fetched. 4. The image will be set to blanks. ENDFILE will still be TRUE if sensed. 5. The field of the operation will contain asterisks. 6. The result will be zero. 7. The first acceptable index (i e the lower bound) will be used. Note that on some implementations the first ELEMENT (lower bound everywhere!) may have to be used. 8. The result of the function will be zero. 9. No action, job continues. 11-999999. Implementation dependent. A new call to MASKERROR resets the previous error count (as returned by SENSEERROR). If an implementation enters dialog or debug mode in case of an error of a category mentioned above, this facility will be suppressed by a call to MASKERROR for the category. When the program starts, categories 1 and 5 are automatically masked by the SIMULA system with a large value on COUNT. **** PROCEDURE JUMPERROR(CODE,L); INTEGER CODE; LABEL L; Execution of JUMPERROR directs the run time system to make an implicit jump to L if an error of category CODE occurs. The sequence of operations is interrupted so that no effect of the illegal operation remains when L is entered, nor will it be possible to find out exactly which operation caused the error, except indirectly from the contents of program variables. The label L must be in the outermost block of the main program (recovery for the otherwise possible ILLEGAL GOTO may be very difficult or impossible to implement). From this follows that JUMPERROR cannot be called in a separately compiled module. A call to jumperror for other labels than in the outermost block should cause an error interrupt. Both MASKERROR and JUMPERROR can be called for an error DECsystem-10 SIMULA Language Handbook, part III Page 150 APPENDIX B - CONTROLLED ERROR HANDLING category, but the last call has effect. Dialogue and debug mode recoveries are suppressed by JUMPERROR as by MASKERROR. **** PROCEDURE RESETERROR(CODE); INTEGER CODE; Execution of RESETERROR inhibits the effect of previous calls to MASKERROR or JUMPERROR for the category CODE. Subsequent errors are intercepted and diagnosed. **** INTEGER PROCEDURE SENSEERROR(CODE); INTEGER CODE; A call to SENSEERROR returns the number of errors of category CODE that have occurred. If CODE is zero, the total number of errors is returned. SENSEERROR does not reset the error counts. B.5 Discussion. This proposal was modified at in October 75 after the SDG meeting. The proposal can be modified in several areas to accomplish a different balance between implementability and implementation independence: The error categories can be made finer or coarser, in particular the existence of categories 11-999999 is debatable; Default settings can be altered; One may redefine results of undefined operations; One may specify the error categories by reference to the sections in the Common Base or Algol report where the error is described; It is possible to use different system procedures instead of having the non-natural assignment of codes to error categories; These questions are best solved (if the proposal is accepted) in the Simula Development Group. DECsystem-10 SIMULA Language Handbook, part III Page 151 APPENDIX C - INDEX APPENDIX C - INDEX ------------------ ABORT EXTERNAL PROCEDURE . . . 46 ABSADR EXTERNAL INTEGER PROCEDURE, address of a variable 108 Access protection . . . . . . . 138 Access to memory without checking, LOADBYTE 117 Access to memory without checking, LOADWORD 117 Access to memory without checking, STOREBYTE 123 Access to memory without checking, STOREWORD 124 Address of a variable, absolute 108 ADJPTR EXTERNAL INTEGER PROCEDURE (adjust byte pointer) 108 ADVANCE of magtapes . . . . . . 44 Alphanumerical display terminal 25 ALTMODE TTY bit setting from a SIMULA program 125 ANDINT procedure (bitwise AND between 36-bit words) 108 APPROX EXTERNAL INTEGER PROCEURE 53 Arnborg, Stefan . . . . . . . . 145 Array index range error . . . . 148 ARRLGD EXTERNAL INTEGER PROCEDURE 86 ARRTXT EXTERNAL PROCEDURE . . . 86 ASCII to SIXBIT conversion, SIXBIT procedure 123 ASCII to SIXBIT conversion, WILDSIX procedure 129 ATR file structure, SIMATR program 123 ATRSTR EXTERNAL CLASS, attribute file structure 109 Attribute file structure, ATRSTR class 109 Attribute file structure, display by SIMATR program 123 BACKSPACE of magtapes . . . . . 44 Binary input/output . . . . . . 38 Binary to octal conversion, OCTAL procedure 118 Bit manipulation, ANDINT procedure 108 Bit manipulation, BITGET procedure 109 Bit manipulation, BITPUT procedure 109 Bit manipulation, BOOLFUNC procedure 110 Bit manipulation, DEPBYTE procededure 113 Bit manipulation, INTREA procedure 117 Bit manipulation, LOADBYTE . . 117 Bit manipulation, REAINT procedure 122 Bit manipulation, STOREBYTE . . 123 BITFIELD EXTERNAL INTEGER PROCEDURE 109 BITGET EXTERNAL INTEGER PROCEDURE 109 BITPUT EXTERNAL INTEGER PROCEDURE 109 Blanks, removal of . . . . . . 60 BOKSTAV EXTERNAL BOOLEAN PROCEDURE 107 BOOLEAN data stored as bit strings 109 BOOLFUNC EXTERNAL INTEGER PROCEDURE 110 BREAKOUTLINE EXTERNAL PROCEDURE 87 BYPASS EXTERNAL BOOLEAN PROCEDURE 42 Byte handling, BITFIELD procedure 109 Byte handling, DEPBYTE procedure 113 Byte handling, STOREBYTE . . . 123 Byte manipulation, LOADBYTE procedure 117 Byte pointer manipulation, ADJPTR procedure 108 CALLI UUO executed directly from SIMULA, XCALLI procedure 129 CALLMIC EXTERNAL INTEGER PROCEDURE 110 CAT demo program, cat and mouse game 27 CDCSIM Conversion Program . . . 28 CHANGE EXTERNAL BOOLEAN PROCEDURE 74 Change partial word, DEPBYTE procedure 113 Character byte pointer manipulation 108 Character format transformation from ASCII to SIXBIT 116 Character input, echo control of 114 CHARACTER output, direct . . . 36 CHECKEXTENSION EXTERNAL TEXT PROCEDURE 113 CHECKFRAC EXTERNAL INTEGER PROCEDURE 66 Checking of terminal input data 17 CHECKINT EXTERNAL INTEGER PROCEDURE 64 CHECKREAL EXTERNAL INTEGER PROCEDURE 64 CLOCKTIME EXTERNAL REAL PROCEDURE 32 CLOSEOPEN EXTERNAL PROCEDURE . 45 Codasyl-type Data Base Management 22 Command input to SIMULA programs, RESCAN procedure 122 Command interpreter (DEC-10 style), DECOM 83 Command line scan, SCAN procedure 79 Communication between programs, TMPIN procedure 124 Communication between programs, TMPOUT procedure 125 Communication with monitor, XCALLI (CALLI UUO) 129 COMPRESS EXTERNAL TEXT PROCEDURE 71 CONC EXTERNAL TEXT PROCEDURE . 70 CONC2 EXTERNAL TEXT PROCEDURE . 70 Conditions of release . . . . . 2 CONTROL-C, simulated from program 50 CONTROLLED ERROR HANDLING. . . 46 Conversational I/O . . . . . . 17 Conversational system . . . . . 140 Conversational terminal . . . . 135 Conversion from ASCII to SIXBIT, SIXBIT procedure 123 Conversion from ASCII to SIXBIT, WILDSIX procedure 129 Conversion from binary to octal, OCTAL procedure 118 Conversion from RADIX50 to ASCII, IDRX50 procedure 116 Conversion from SIXBIT to ASCII, IDSIXBIT procedure 116 Conversion programs . . . . . . 28 Copying of disk files, FILCOPY procedure 114 Copyright of the SIMULA system 2 COREGUIDE EXTERNAL BOOLEAN PROCEDURE 53 CORELIMIT EXTERNAL BOOLEAN PROCEDURE 52 COSYS, part of FIGURE . . . . . 7 COSYSF, part of FIGURE . . . . 7 CP(U)TIME EXTERNAL REAL PROCEDURE 32 CRLF TTY bit setting from a SIMULA program 125 CTRL-C, simulated from program 50 CTRL-O bit resetting . . . . . 45 DAHELP EXTERNAL CLASS . . . . . 26 Data base handling . . . . . . 23 Data Base Management . . . . . 22 Data collection, form method . 27 Data entry by form fill in . . 26 Data transmission errors . . . 146 DATE . . . . . . . . . . . . . 31 DAYNO EXTERNAL INTEGER PROCEDURE 31 DAYTIME EXTERNAL TEXT PROCEDURE 32 DBMMIN, part of SIMDBM system . 23 DBMS error condition . . . . . 146 DBMSET, part of SIMDBM system . 23 DDTDEM SIMDDT demo program . . 27 De-editing procedure error . . 148 DEC-style command interpreter, DECOM 83 DECOM EXTERNAL CLASS, see also SCAN 83 Deleting a file, RENAME procedure 120 Deleting files . . . . . . . . 44 Demo programs . . . . . . . . . 27 Demonstration programs . . . . 27 DEPBYTE EXTERNAL PROCEDURE . . 113 DEPCHAR EXTERNAL PROCEDURE . . 60 Desynchronize . . . . . . . . . 133 Dialogue I/O . . . . . . . . . 17 DIMENSIONS EXTERNAL INTEGER PROCEDURE 53 Direct access files, application package with 23 Direct access files, text editing of 23 Direct Access Help files . . . 26 DIRECTFILE binary I/O . . . . . 42 DIRECTFILE HANDLING PROGRAMS . 30 Directfile text editing - DIRED 30 DIRECTFILE to seqeuential file conversion 30 Directory sorting, SORTDN procedure 99 DIRED Direct file editor . . . 23 DIRED program . . . . . . . . . 30 DIRHND EXTERNAL CLASS . . . . . 113 DIRSEQ program . . . . . . . . 30 Disk-to-disk copy, FILCOPY procedure 114 Display terminal . . . . . . . 25 Division by zero error . . . . 148 DOTYPEOUT EXTERNAL BOOLEAN PROCEDURE 45 ECHO EXTERNAL PROCEDURE . . . . 114 ECHO TTY bit setting from a SIMULA program 125 Edit overflow error . . . . . . 148 Editing of SIMULA direct access files 23 ENTERDEBUG EXTERNAL PROCEDURE . 46 Entry of data by form fill in . 26 ENVIRONMENT ENQUIRY . . . . . . 53 Error flags . . . . . . . . . . 146 ERROR INTERRUPT ROUTINES . . . 46 Error recovery . . . . . . . . 147 EXIT EXTERNAL PROCEDURE . . . . 50 EXIT, immediate, from execution 50 Extracting a field from a 36-bit word, BITFIELD procedure 109 FETCH.SIM part of SIMDBM . . . 23 FETCHAR EXTERNAL CHARACTER PROCEDURE 60 FIGURE graphic package . . . . 25 FILCOPY EXTERNAL INTEGER PROCEDURE 114 File conversion, to and from directfile 30 File directory handling, DIRHND class 113 FILE HANDLING . . . . . . . . . 44 File lookup, FLOKUP procedure . 115 File renaming or deletion, RENAME procedure 120 File specification string, FILSPC procedure 115 FILENAME EXTERNAL TEXT PROCEDURE 35 FILL TTY bit setting from a SIMULA program 125 FILSPC EXTERNAL TEXT PROCEDURE 115 FINDDIRECTFILE EXTERNAL REF (DIRECTFILE) PROCEDURE 44 FINDINFILE EXTERNAL REF (INFILE) PROCEDURE 44 FINDOUTFILE EXTERNAL REF (OUTFILE) PROCEDURE 44 FINDPRINTFILE EXTERNAL REF (PRINTFILE) PROCEDURE 44 FINDTRIGGER EXTERNAL CHARACTER PROCEDURE 62 Flags, marking errors . . . . . 146 Floating point error . . . . . 148 FLOKUP EXTERNAL INTEGER PROCEDURE 115 FORCEOUT EXTERNAL PROCEDURE . . 37 Form fill in data entry . . . . 26 FORM form fill in data entry package 26 Form method of data collection 27 FORM package, test programs . . 27 FORM TTY bit setting from a SIMULA program 125 FORSIM EXTERNAL PROCEDURE . . . 46 FORTRAN programming language . 146 FQC Program measurement system 29 FREEBITS EXTERNAL INTEGER PROCEDURE 51 FREEZE EXTERNAL PROCEDURE . . . 49 FROM EXTERNAL TEXT PROCEDURE . 59 FRONT EXTERNAL TEXT PROCEDURE . 59 FRONTCOMPARE EXTERNAL BOOLEAN PROCEDURE 63 FRONTSTRIP EXTERNAL TEXT PROCEDURE 60 GAG TTY bit setting from a SIMULA program 125 Game of cat and mouse . . . . . 27 Garbage collection . . . . . . 51 General Purpose System Simulator (GPSS) in SIMULA 24 GETCH EXTERNAL CHARACTER PROCEDURE 36 GETITEM EXTERNAL TEXT PROCEDURE 60 GETRADIX EXTERNAL INTEGER PROCEDURE 85 GETTAB EXTERNAL PROCEDURE . . . 116 Getting information from another program, TMPIN procedure 124 GETTYPE EXTERNAL INTEGER PROCEDURE 66 GETVIS terminal type enquirer . 26 GPSSS system written in SIMULA 24 GRAPHI, part of FIGURE . . . . 7 Graphic package for tektronix terminals 25 HASH EXTERNAL INTEGER PROCEDURE 66 Help facility in user programs 17 HELP facility, package for providing of 26 Hibernate . . . . . . . . . . . 133 HISTP EXTERNAL PROCEDURE . . . 90 I/O transmission error . . . . 148 IASHIFT EXTERNAL BOOLEAN PROCEDURE 101 IBMSIM Conversion Program . . . 28 IDRX50 EXTERNAL TEXT PROCEDURE 116 IDSIXBIT EXTERNAL TEXT PROCEDURE 116 ILOG EXTERNAL INTEGER PROCEDURE 94 IMAX EXTERNAL INTEGER PROCEDURE 58, 101 IMIN EXTERNAL INTEGER PROCEDURE 58, 101 IMPLEMENTATION EXTERNAL TEXT PROCEDURE 53 Information Retrieval . . . . . 24 INITEM EXTERNAL TEXT PROCEDURE 61 INLINE EXTERNAL TEXT PROCEDURE 88 INORD EXTERNAL TEXT PROCEDURE . 107 Input data checking . . . . . . 17 INPUT EXTERNAL INTEGER PROCEDURE 39, 41 Input of characters from terminal, control of echoing 114 Input of data by form fill in . 26 Input-Output errors . . . . . . 146 INPUT/OUTPUT . . . . . . . . . 35, 87 INPUTCHECK EXTERNAL BOOLEAN PROCEDURE 33 INPUTWAIT EXTERNAL INTEGER PROCEDURE 34 INSINGLECHAR EXTERNAL CHARACTER PROCEDURE 35 INSNGL EXTERNAL CHARACTER PROCEDURE 36 INTEGER to REAL conversion, REAINT procedure 122 Intra-job communication, TMPIN procedure 124 Intra-job communication, TMPOUT procedure 125 INTREA EXTERNAL PROCEDURE . . . 117 ISUM EXTERNAL INTEGER PROCEDURE 94 Job control . . . . . . . . . . 118 Job control, JOBSTATUS procedure 117 Job control, PTYCHECK procedure 119 Job control, PTYFIL procedure . 120 Job control, PTYINIMAGE procedure 120 JOBSTATUS EXTERNAL INTEGER PROCEDURE 117 JUMPERROR procedure . . . . . . 149 LASTLOC EXTERNAL INTEGER PROCEDURE 45 Line-numbered file, input of . 118 LINECOUNT EXTERNAL INTEGER PROCEDURE 35 LITENBOKSTAV EXTERNAL TEXT PROCEDURE 107 LMAX EXTERNAL LONG REAL PROCEDURE 58 LMIN EXTERNAL LONG REAL PROCEDURE 58 LOAD.SIM part of SIMDBM . . . . 23 LOADBYTE EXTERNAL INTEGER PROCEDURE 117 LOADWORD EXTERNAL INTEGER PROCEDURE 117 LOGININFORMATION EXTERNAL TEXT PROCEDURE 54 LOOK EXTERNAL BOOLEAN PROCEDURE 43 LOOKAHEAD EXTERNAL CHARACTER PROCEDURE 87 LOOKUP EXTERNAL BOOLEAN PROCEDURE 68 LOOKUP of files . . . . . . . . 44 LOWCASE EXTERNAL TEXT PROCEDURE 71 LSUM EXTERNAL LONG REAL PROCEDURE 94 MAKEDF program . . . . . . . . 30 MAKETEXT EXTERNAL TEXT PROCEDURE 71 MAKHLP PROGRAM generating DAHELP files 30 MASKERROR procedure . . . . . . 148 MATCH6 EXTERNAL INTEGER PROCEDURE 117 Mathematical function error . . 148 Max and min, IMAX procedure . . 58 Max and min, IMIN procedure . . 58 Max and min, LMAX procedure . . 58 Max and min, LMIN procedure . . 58 Max and min, RMAX procedure . . 58 Max and min, RMIN procedure . . 58 MAXINT EXTERNAL INTEGER PROCEDURE 53 MAXLOC EXTERNAL INTEGER PROCEDURE 45 MAXREAL EXTERNAL LONG REAL PROCEDURE. 53 Memory access without SIMULA checks, LOADBYTE 117 Memory access without SIMULA checks, LOADWORD 117 Memory access without SIMULA checks, STOREBYTE 123 Memory access without SIMULA checks, STOREWORD 124 MEMORY HANDLING . . . . . . . . 51 MENU EXTERNAL BOOLEAN PROCEDURE 67 MENY EXTERNAL BOOLEAN PROCEDURE 107 MIC control from a SIMULA program, CALLMIC procedure 110 MIN AND MAX . . . . . . . . . . 58 Min and max, IMAX procedure . . 58 Min and max, IMIN procedure . . 58 Min and max, LMAX procedure . . 58 Min and max, LMIN procedure . . 58 Min and max, RMAX procedure . . 58 Min and max, RMIN procedure . . 58 MINREAL EXTERNAL LONG REAL PROCEDURE 53 Monitor calls from SIMULA, XCALLI procedure 129 Monitor tables, GETTAB procedure 116 Monitoring . . . . . . . . . . 143 Multi-terminal . . . . . . . . 138 Network, TTYLINE procedure . . 127 Network, TTYNUMBER procedure . 128 NEXTRANDOM EXTERNAL PROCEDURE . 104 NO (FORM, CRLF, GAG, TAB etc.) TTY bit setting 125 Number on input line . . . . . 118 NUMBERED EXTERNAL BOOLEAN PROCEDURE 118 Object input/output . . . . . . 38 OCTAL EXTERNAL TEXT PROCEDURE . 118 ON condition in PL/1 . . . . . 145 OPERATIONS ON TEXTS . . . . . . 69 OUTCHR EXTERNAL PROCEDURE . . . 36 OUTLINE EXTERNAL PROCEDURE . . 87 OUTPUT EXTERNAL INTEGER PROCEDURE 39 Output of CHARACTER immediately 36 Output of TEXT immediately . . 37 Output, forced, to the TTY . . 37 OUTSTRING EXTERNAL PROCEDURE . 37 OUTTIME EXTERNAL PROCEDURE . . 90 Overflow error . . . . . . . . 148 PACK EXTERNAL BOOLEAN PROCEDURE 54 PACKING INTO PARTS OF WORDS . . 54 Parallel processes in the real world 142 PARTITIONING OF TEXTS . . . . . 59 PERGEN EXTERNAL CLASS . . . . . 102 Picture processing . . . . . . 25 PL/1 programming language . . . 145 PREP1.SIM part of SIMDBM . . . 23 Preprocessor in SIMDBM producing SIMULA classes 23 PRIMARY MEMORY HANDLING . . . . 51 Process control . . . . . . . . 142 Program measurement system FQC 29 PTY handling . . . . . . . . . 118 PTY handling, JOBSTATUS procedure 117 PTY handling, PTYCHECK procedure 119 PTY handling, PTYFIL procedure 120 PTY handling, PTYINIMAGE procedure 120 PTYCHECK EXTERNAL INTEGER PROCEDURE 119 PTYFIL EXTERNAL INTEGER PROCEDURE 120 PTYINIMAGE EXTERNAL INTEGER PROCEDURE 120 PUTFLOAT EXTERNAL TEXT PROCEDURE 77 PUTSIZE EXTERNAL INTEGER PROCEDURE 42 PUTTEXT EXTERNAL BOOLEAN PROCEDURE 70 PUTTIME EXTERNAL TEXT PROCEDURE 75 QASETE question-answering demo program 27 QSIM demo program, doctor's waiting room 27 Question-answering demo program 27 QUEUE system simulation using GPSSS 24 RADIX EXTERNAL TEXT PROCEDURE . 84 Radix50 conversion, RDX50 procedure 121 RADIX50 to ASCII conversion, IDRX50 procedure 116 RADIX50 to SIXBIT code, SXRX50 procedure 123 RANDOM EXTERNAL REAL PROCEDURE 103 RANDOM NUMBER GENERATION ETC. . 102 Range error for array index . . 148 RDX50 EXTERNAL PROCEDURE . . . 121 Reaction time . . . . . . . . . 140 READ errors . . . . . . . . . . 146 READ EXTERNAL PROCEDURE . . . . 37 REAINT EXTERNAL PROCEDURE . . . 122 REAL to INTEGER conversion, INTREA procedure 117 REAL-TIME FOR MULTI-TERMINAL SIMULTANEOUS I/O. 32 REALTIME EXTERNAL SIMULATION CLASS 130 Receiving information from another program, TMPIN procedure 124 Record input/output . . . . . . 38 Recovery after error . . . . . 145 REL file information, RDX50 procedure 121 Release version . . . . . . . . 1 RENAME EXTERNAL INTEGER PROCEDURE 120 Renaming a file, RENAME procedure 120 REQUEST EXTERNAL TEXT PROCEDURE 88 RESCAN EXTERNAL BOOLEAN PROCEDURE 122 Reseterror procedure . . . . . 150 Responsibility for errors . . . 2 REST EXTERNAL TEXT PROCEDURE . 59 RESTORE EXTERNAL PROCEDURE . . 49 REWIND of magtapes . . . . . . 44 RMAX EXTERNAL REAL PROCEDURE . 58 RMIN EXTERNAL REAL PROCEDURE . 58 ROUTINES WRITEABLE IN SIMULA. . 59 RSUM EXTERNAL REAL PROCEDURE . 94 RUBOUT, part of FIGURE . . . . 7 RUN EXTERNAL PROCEDURE . . . . 47 SAFEI EXTERNAL CLASS . . . . . 22 SAFEIO conversational i/o package 17 SAFEIO EXTERNAL CLASS . . . . . 17 SAFMIN EXTERNAL CLASS . . . . . 22 SAVE EXTERNAL INTEGER PROCEDURE 48 SCALESTEP EXTERNAL REAL PROCEDURE 100 SCAN EXTERNAL INTEGER PROCEDURE, see also DECOM 79 SCANFRAC EXTERNAL INTEGER PROCEDURE 70 SCANINT EXTERNAL INTEGER PROCEDURE 69 SCANREAL EXTERNAL LONG REAL PROCEDURE 69 SCANTO EXTERNAL TEXT PROCEDURE 62 SCHEDULING AND JOB CONTROL . . 47 SCHEMA, entering into a data base 23 SCRAMBLE EXTERNAL PROCEDURE . . 102 SCRATCHFILE EXTERNAL BOOLEAN PROCEDURE 44 Scratching a file, RENAME procedure 120 Scratching files . . . . . . . 44 SEARCH EXTERNAL INTEGER PROCEDURE 63 Search with Boolean condition . 24 SEARCHING AND TESTING OF TEXTS 62 Segmentation into overlayed core code segments 52 SELECT EXTERNAL CLASS . . . . . 24 Semaphore . . . . . . . . . . . 142 Sending information to another program, TMPOUT procedure 125 SENSEERROR procedure . . . . . 150 Sequentail file to DIRECTFILE conversion 30 SET TTY performed from a SIMULA program 125 SFD sorting, SORTDN procedure . 99 SFD-file handling . . . . . . . 113 SHIP demo program, troup transport simulation 27 SIGMA2 EXTERNAL REAL PROCEDURE 95 SIGMEAN EXTERNAL PROCEDURE . . 96 SIMATR program for displaying attribute files 123 SIMDBM data base query system . 23 SIMDBM files on the distribution tape 23 SIMDBM system . . . . . . . . . 22 SIMDBM, ARRLGD utility procedure 86 SIMDBM, ARRTXT utility procedure 86 SIMDBM, class DBMMIN . . . . . 23 SIMDBM, class FETCH.SIM . . . . 23 SIMDBM, routine LOAD.SIM . . . 23 SIMDBM, routine PREP1.SIM . . . 23 SIMDDT demo program DDTDEM . . 27 SIMDDT, procedure for calling . 46 SIMDEM demo programs . . . . . 27 SIMED SIMULA Program Editor . . 28 SIMEI EXTERNAL SIMULATION CLASS 22 SIMEIO EXTERNAL SIMULATION CLASS 22 SIMEXP program for merging source files 28 SIMIBM Conversion Program . . . 28 SIMMIN EXTERNAL SIMULATION CLASS 22 SIMSTR SIMULA PROGRAM Stripper 28 SIMULA SOURCE PROGRAM CONVERSION PROGRAMS 28 Simulation demo program . . . . 27 Simulation of cat and mouse game 27 Simulation of doctor's waiting room 27 Simulation of troup transport . 27 SIXBIT EXTERNAL INTEGER PROCEDURE 123 SIXBIT from RADIX50, SXRX50 procedure 123 SIXBIT match with "wildcards", MATCH6 procedure 117 SIXBIT to ASCII conversion, IDSIXBIT procedure 116 SKIP EXTERNAL TEXT PROCEDURE . 63 SLEEP EXTERNAL PROCEDURE . . . 34 SORT PROCEDURES . . . . . . . . 97 SORTDN EXTERNAL PROCEDURE for sorting 2-dim integer array 99 Sorting a 2-dimensional integer array, SORTDN procedure 99 SORTING AND SUMMATION ETC. . . 94 SORTTA EXTERNAL PROCEDURE . . . 97 SORTTD EXTERNAL PROCEDURE . . . 98 SPLIT EXTERNAL PROCEDURE . . . 72 SPLITA EXTERNAL INTEGER PROCEDURE 73 SPLITC EXTERNAL INTEGER PROCEDURE 73 SQHELP EXTERNAL BOOLEAN PROCEDURE 26 SSCAN version of SCAN . . . . . 83 STARTPOS EXTERNAL INTEGER PROCEDURE 72 STAT1E simulation demo program 27 STAT2E simulation demo program 27 Status query . . . . . . . . . 143 STOP, immediate, of execution . 50 STORBOKSTAV EXTERNAL TEXT PROCEDURE 107 STORE data base handling package 23 STOREBYTE EXTERNAL INTEGER PROCEDURE 123 STOREWORD EXTERNAL INTEGER PROCEDURE 124 Structure of a SIMULA program, output of 123 Structured programming . . . . 27 Subjob control . . . . . . . . 118 Subjob control, JOBSTATUS procedure 117 Subjob control, PTYCHECK procedure 119 Subjob control, PTYFIL procedure 120 Subjob control, PTYINIMAGE procedure 120 SUBMIT EXTERNAL BOOLEAN PROCEDURE 48 SUMMARY LIST OF ROUTINES . . . 7 SWAP EXTERNAL PROCEDURE . . . . 52 SWEDISH LANGUAGE TEXT HANDLING AND INPUT/OUTPUT 107 SXRX50 EXTERNAL INTEGER PROCEDURE 123 Synchronize . . . . . . . . . . 133 TAB TTY bit setting from a SIMULA program 125 TABLE package, test of formula data collection 27 TAGORD EXTERNAL TEXT PROCEDURE 107 TAGTYP EXTERNAL INTEGER PROCEDURE 107 Tektronix terminal graphics package 25 Terminal character input, control of echoing 114 Terminal communication, TRMOP procedure 125 Terminal input data checking . 17 Terminal type enquiry . . . . . 26 Test programs . . . . . . . . . 27 Text editing of SIMULA direct access files 23 Text editing on directfiles . . 30 TEXT handling . . . . . . . . . 59 Text transformation from ASCII to SIXBIT 116 Text value comparison . . . . . 63 TIME AND DATE . . . . . . . . . 31 TIMELIMIT EXTERNAL PROCEDURE . 32 TMP:TRM file containing terminal type identification 26 TMPCOR input, TMPIN procedure . 124 TMPCOR output, TMPOUT procedure 125 TMPIN EXTERNAL TEXT PROCEDURE . 124 TMPNAM EXTERNAL TEXT PROCEDURE 124 TMPOUT EXTERNAL BOOLEAN PROCEDURE 125 TODAY EXTERNAL TEXT PROCEDURE . 31 TOPS-10 directory file handling, DIRHND class 113 Transferring control to another program, RUN procedure 47 Transmission of data, errors . 146 TRMOP EXTERNAL INTEGER PROCEDURE 125 TSUB EXTERNAL TEXT PROCEDURE . 60 TTY (.SET TTY) performed from a SIMULA program 125 TTY line number in DEC-10 network, TTYLINE procedure 127 TTY number in DEC-10 network, TTYNUMBER procedure 128 TTYCHECK EXTERNAL BOOLEAN PROCEDURE 36 TTYLINE external procedure . . 127 TTYNUMBER external procedure . 128 Type conversion, INTREA procedure 117 Type conversion, REAINT procedure 122 UFD sorting, SORTDN procedure . 99 UFD-file handling . . . . . . . 113 Unchecked memory access, LOADBYTE procedure 117 Unchecked memory access, LOADWORD 117 Unchecked memory access, STOREBYTE 123 Unchecked memory access, STOREWORD 124 Underflow error . . . . . . . . 148 UNFORMATTED (BINARY) I/O. . . . 38 Unformatted input/output . . . 38 UNIQUE EXTERNAL INTEGER PROCEDURE 103 UNLOAD of magtapes . . . . . . 44 UNPACK EXTERNAL BOOLEAN PROCEDURE 54 Unpacking a field from a 36-bit word, BITFIELD procedure 109 Unrestricted access to core, ABSADR procedure 108 UPCASE EXTERNAL TEXT PROCEDURE 71 UPCOMPARE EXTERNAL BOOLEAN PROCEDURE 63 UPTO EXTERNAL TEXT PROCEDURE . 59 UTILITY PACKAGES . . . . . . . 17 VIRTUAL MEMORY HANDLING . . . . 52 VIRTUAL MEMORY HANDLING (OR OVERLAY FACILITY) 52 VISTA EXTERNAL CLASS . . . . . 25 VISTA package, applications . . 27 Wait . . . . . . . . . . . . . 133 Wild card match, MATCH6 procedure 117 WILDSIX EXTERNAL INTEGER PROCEDURE 129 WRITE errors . . . . . . . . . 146 WRITE EXTERNAL PROCEDURE . . . 38 XCALLI EXTERNAL INTEGER PROCEDURE 129 ZIMSET EXTERNAL CLASS (SIMSET) 105 ZIMULATION EXTERNAL CLASS (SIMULATION) 105 ^C, simulated from program . . 50 ^O bit resetting . . . . . . . 45