Version 6.0 of Icon for the Amiga Scott Ballantyne 1. Introduction Version 6 of Icon for the Amiga should run on any Amiga with at least 512k of memory and running Kickstart Version 1.2 Due to the intense memory requirements of Icon, more memory is recommended, however, with few exceptions, you should be able to handle most programming tasks on a 512k box. The Amiga implementation of Icon is the work of Scott Ballantyne and Gary Sarf, and may be freely distributed on the usual 'use at your own risk' basis. It is based on the public domain version of Icon from the University of Arizona. The University of Arizona has released an upgraded version of Icon (V6.3), which fixes a few bugs in Version 6.0. We hope to make this available on the Amiga in a few months. We will also be releasing the source code for Amiga Icon at that time. Meanwhile, 6.0 is very usable as it is. Version 6.3 for the Amiga will also be using the arp.library, and so should be somewhat smaller. If you encounter any bugs or problems I would like to hear about them: BIX: SDB CIS: 70066,603 And elsewhere... 2. Documentation The basic reference for the Icon programming language is the book The Icon Programming Language, Ralph E. Griswold and Madge T. Griswold, Prentice-Hall, Inc., Englewood Cliffs, New Jer- sey, 1983. 313 pages. ISBN 0-13-449777-5. $25.95. This book is available in many college bookstores or can be ordered through any bookstore that handles special orders or by telephone directly from Prentice-Hall: (201) 767-9520. A brief overview of Icon is contained in technical report TR 83-3 [1] (overview.doc on the distribution diskette). Features that have been added to Icon since the book was written are described in TR 86-10b [2] (version6.doc on the distribution diskette). These technical reports, together with this document (Amiga.doc on this diskette), provide enough information to write simple Icon programs, but persons who are going to use Icon seri- ously will need the book. 3. Installing Amiga Icon There are five executable binary files needed to run Icon: Icont command processor Itran translator Ilink linker Iconx run-time system ixhdr start-up code Icont should be located on a place in your Path specification, while the remaining files may be placed wherever you like, however, you need to tell Icon where they are by making the following Assigns: Assign ICONX: location of Iconx Assign ICONT: location of Icont Assign ILINK: location of Ilink Assign ITRAN: location of Itran Assign HEAD: location of ixhdr If you start to get requesters which say, for example, "Please Insert Volume ICONX: in any drive", it is because you forgot to make these Assigns. The easiest way to do this is to use a batchfile, or the startup-sequence file if you boot to an Icon disk. You will also need the Set program, which is included on this diskette, and is the work of Thomas Rokicki of Radical Eye Software. The MANX Set may also be used, but the two versions of Set (the Rokicki Set and the MANX set) should not be mixed. If you are intending to use floating point math, then you will also need the mathieeedoubbas.library (as supplied on 1.2 Workbench disks) in the LIBS: directory. 4. Running Amiga Icon - Basic Information Files containing Icon programs must have the extension .icn. Such files should be plain text files (without line numbers or other extraneous information). The command processor icont runs itran and ilink to produce an ``icode'' file that can be executed by iconx. For example, an Icon program in the file prog.icn is translated and linked by 1> icont prog.icn The result is an icode file with the name prog (with the exten- sion removed). This file can be run by simply typing it's name, as though it were a binary machine code file, or by providing it as an argument to the icon runtime system as: 1> prog or 1> iconx prog Alternatively, icont can be instructed to execute the program after linking and translating by appending a -x to the command line, as in icont prog.icn -x In this case the file prog also is left and can be run subse- quently simply by typing it's name at the CLI prompt. If you find you are having difficulty due to memory constraints, there are various environment variables used by Icon which you may use to ''fine-tune'' your version. Section 6 has more information about other aspects of running Icon. 5. Testing the Installation There are a few programs on the distribution diskette that may be used for testing the installation and getting a feel for run- ning Icon: hello.icn This program prints the Icon version number, time, and date. Run this test as 1> icont hello.icn 1> hello Note that this can be done in one step with 1> icont hello.icn -x cross.icn This program prints all the ways that two words intersect in a common character. The file cross.dat contains typical data. Run this test as 1> icont cross.icn 1> cross icont meander.icn 1> meander icont roman.icn -x and provide some Arabic numbers from your console. Hit CNTRL-\ when you want to terminate. wordcnt.icn This program tabulates the number of occurrences of each word from the input file. Run this test as 1> icont wordcnt.icn 1> wordcnt wordcnt outfile If there are other examples included, have fun with them! 6. More on Running Icon For simple applications, the instructions for running Icon given in Section 4 may be adequate. The icont command processor supports a variety of options that may be useful in special situations. There also are several aspects of execution that can be controlled with environment variables. These are listed here. Persons who are new to Icon may wish to skip this section on the first reading but come back to it if they find the need for more control over the translation and execution of Icon programs. 6.1 Arguments Arguments can be passed to the Icon program by appending them to the command line. Such arguments are passed to the main pro- cedure as a list of strings. For example, 1> prog text.dat log.dat runs the icode file prog, passing its main procedure a list of two strings, "text.dat" and "log.dat". The program also can be translated, linked, and run with these arguments with a single command line by putting the arguments after the -x: 1> icont prog.icn -x text.dat log.dat These arguments might be the names of files that prog1.icn reads from and writes to. The main procedure might begin as follows: procedure main(a) in := open(a[1]) | stop("cannot open input file") out := open(a[2],"w") | stop("cannot open output file") . . . See also the information about the processing of command-line arguments given in Section 6.4. 6.2 The Command Processor The command processor icont can accept several input files at one time. When several files are given, they are translated and combined into a single icode file whose name is derived from the name of the first file. For example, icont prog1.icn prog2.icn translates and links the files prog1.icn and prog2.icn and pro- duces one icode file, prog1. A name other than the default one for the icode file produced by the Icon linker can be specified by using the -o option, fol- lowed by the desired name. For example, icont -o probe prog.icn produces the icode file named probe rather than prog. If the -c option is given to icont, only translation is per- formed and intermediate ``ucode'' files with the extensions .u1 and .u2 are kept. For example, icont -c prog1.icn leaves prog1.u1 and prog1.u2, instead of linking them to produce prog1. (The ucode files are deleted unless the -c option is used.) These ucode files can be used in a subsequent icont com- mand by using the .u1 name. This avoids having to translate the .icn file again. For example, icont prog2.icn prog1.u1 translates prog2.icn and links the result with the ucode files from a previous translation of prog1.icn. Note that only the .u1 name is given. Ucode files also can be added to a program when it is linked by using the link declaration in an Icon source program as described in [2]. It is worth noting that icont only controls the execution of the other components of the Icon system. For example, icont prog.icn -x is equivalent to itran prog.icn ilink prog.u1 iconx prog The Amiga version of Icont has a -v option, which will display the command lines it is executing. This can be useful if you are curious about exactly what information Icont is sending the various subsystems. Icon source programs may be read from standard input. The argument - signifies the use of standard input as a source file. In this case, the ucode files are named stdin.u1 and stdin.u2 and the icode file is named stdin. You indicate that you are finished with the text entry by typing CNTRL-\ (the Amiga standard EOF indicator). The informative messages from the translator and linker can be suppressed by using the -s option. Normally, both informative messages and error messages are sent to standard error output. The -t option causes &trace to have an initial value of -1 when the program is executed. Normally, &trace has an initial value of 0. The option -u causes warning messages to be issued for unde- clared identifiers in the program. The warnings are issued dur- ing the linking phase. Icon has several tables related to the translation and linking of programs. These tables are large enough for most programs, but translation or linking is terminated with an error message, indicating the offending table, if there is not enough room. If this happens, larger table sizes can be specified by using the -S option. This option has the form -S[cfgilrstCL]n, where the letter following the S specifies the table and n is the number of storage units to allocate for the table. c constant table 100 f field table 100 g global symbol table 200 i identifier table 500 l local symbol table 100 r record table 100 s string space 15,000 t tree space 15,000 C code buffer 20,000 L labels 500 The units depend on the table involved, but the default values can be used as guides for appropriate settings of -S options without knowing the units. For example, icont -Sc200 -Sg600 prog.icn translates and links prog.icn with twice the constant table space and three times the global symbol table space that ordinarily would be provided. 6.3 Environment Variables When an Icon program is executed, several environment vari- ables are examined to determine certain execution parameters. You establish the values of environment variables by using Set, which should be included with the Amiga Icon distribution package. Syntax is set STRING=VALUE VALUE can be anything, numeric or string data, that is required by Icon. Generally, the Icon environment variables require numbers. When setting a numeric environment variable do not include commas or other formatting characters - digits only. If you type Set, by itself, with no arguments, then it will display a list of all currently defined environment variables, along with their values. Finally, to remove an environment variable from memory, just type Set STRING= With nothing following the '=' sign, and this variable will be removed. Environment variables are particularly useful in adjusting Icon's storage requirements. This may be necessary if your com- puter does not have enough memory to run Icon as configured or for programs that have unusual demands for a particular kind of data. Partic- ular care should be taken when changing default sizes: unreason- able values may cause Icon to malfunction. The variables that affect the execution of Icon are: TRACE initializes the value of &trace. If this variable has a value, it overrides the translation-time -t option. NBUFS determines the number of i/o buffers used for files. When a file is opened, it is assigned an i/o buffer if one is available and the file is not the console. If no buffer is available, the file is not buffered. &input, &output, and &errout are buffered if buffers are available. The defualt for the Amiga implementation is 10. If NOERRBUF is set, &errout is not buffered. STRSIZE determines the initial size of the string space, in bytes. The string space grows if necessary, but it never shrinks. For the Amiga implementation of Icon, the default value of STRSIZE is 51,200. If the amount of memory available for running the Icon is small, the initial size of the string space can be set to a smaller value, such as 10,000. HEAPSIZE determines the initial size of the allocated block region, in bytes. The heap grows if necessary, but it never shrinks. The default value of HEAPSIZE is 51,200. If the amount of memory available for running Icon is small, the initial size of the allocated block region can be set to a smaller value, such as 10,000. COEXPSIZE determines the size, in words, of each co-expression block. The default value of COEXPSIZE is 2,000. MSTKSIZE determines the size, in words, of the main inter- preter stack. The default value of MSTKSIZE is 10,000. The size of the main interpreter stack can be set to a smaller value, such as 5,000. If the main interpreter stack is not large enough, excessive recursion may lead to program termination with a run-time error message. STATSIZE determines the size, in bytes, of the static region in which co-expression blocks are allocated. The default value of STATSIZE is 20,480. If the amount of memory available for running Iconis small, the size of the static region can be set to a small value, such as 100, provided that co-expressions are not used. STATINCR determines the size of the increment used when the static region is expanded. The default increment is one-fourth of the initial size of the static region. Icon on the Amiga allocates all it's memory from one big heap. Initially, Icon will attempt to grab the largest section of contiguos memory it can find. If you wish to limit the amount of memory Icon will ask for, then you can set the the maximum amount of memory Icon will ask for with the MAXMEM environment variable. This variable should specify a value in Kbytes, thus MAXMEM=300 will limit the amount of memory Icon will request to 300k bytes. Note that you may not get all the memory you ask for - Icon will attempt to get the amount of memory you asked for, but if it is not available, will ask for less. You will not get an out of memory error if this occurs. Out of memory errors will occur only when an Icon program needs more memory than Icon has available, and this is determined as the program runs its course, not during the icon system initialization. You can use the environment variable UFILES to establish where icont will place the temporary .u? files. By setting UFILES=RAM:, these will be placed in the ram disk, greatly speeding up the linking and translating phases of the process. Amiga Icon supports all the features of Version 6 of Icon, with the following exceptions and additions: o Pipes are not supported. A file cannot be opened with the ``p'' option. o The PATH environment variable is not used on the Amiga, instead, the CLI path is searched, as set by the Path command. o The IPATH environment string used by the Icon linker, is supported as described in [2]. The separator between paths is the bang ('!'). The current directory is always searched. You should specify a ':' in volume names, but you should not add a trailing '/' to path names. For example: set IPATH=df1:!df1:Iconstuff!df1:icontstuff/bookstuff will cause the linker to examine the current directory for linkable files, then the root directory of df1:, then Df1:Iconstuff, then df1:iconstuff/bookstuff. o All of the AmigaDOS logical devices can be used as files, this provides a simple means to output to a window, by opening a CON: or RAW: window. o Trace output is sent to STDERR. The following functions have been added to Icon only for the Amiga version, and should not be expected to be found on other versions: o Translate(string) -- returns translated string, try: Write(Translate("Hello big boy")) o Narrate(string, rate, pitch, mode, sex, volume, sampfreq, side) You can simply do Narrate(Translate(string)) if you want to accept the defaults, or you can set specific parameters: rate - rate of speaking -- 40 to 400, default is 150 pitch - pitch of voice -- 65 to 320. default is 110 mode - may be "natural" or "robotic", or you may use 0 or 1. default is natural (0). sex - may be "male" or "female", or you may use 0 or 1 default is male (0) volume - loudness of voice -- 0 (silence) to 64, default is 64 sampref - sample frequency. 5000 to 28000, default is 22200 side - may be "both", "right" or "left", to set the speaker from which the voice will come, default is "both". NOTE: You will have to use MAXMEM to limit the amount of memory initially grabbed by icon, or there will not be enough room in memory for the translator and narrator when you call these functions! o Delay(timeout) - wait timeout ticks, 50 per second, returns #seconds Delayed, defaults to 1 second. You should use this if you want a delay, instead of busy waiting. o DeleteFile(file) -- Delete a file. o Rename(old, new) -- Rename files o SetComment(file, string) -- Set a comment for file All of these functions use the Icon conventions as much as possible. The following functions are also extensions to Icon, but are common enough across implementations that you can somewhat depend on them: MATH: exp(x) log(x) log10(x) sqrt(x) TRIG: sin(x) cos(x) tan(x) acos(x) asin(x) atan(x) atan2(x, y) dtor(x) # Convert degrees to radians rtod(x) # Radians to degrees FILES: seek(file, offset, start) - aka C's fseek. GETENV: getenv(s) - return contents of environment variable s 6.4 Further details about running Icon programs. Icon does not actually produce machine code executable files. What actually happens is that the linker (Ilink) writes an executable file header (the program ixhdr, located in assigned directory HEAD:) which then loads and runs Iconx (the run time system) passing itself as an argument. This appears complex, but is actually the way Icon is handled on most systems - Icon compilers do not actually increase execution speed by very much, but they do increase program size a considerble amount. You may run Icon programs without taking advantage of this feature, by simply passing the icon program name to Iconx. Here are some examples: 1> prog can also be run as 1> Iconx prog 1> prog arg1 arg2 arg3 can also be run as 1> Iconx prog arg1 arg2 arg3 1> prog outfile arg1 arg2 arg3 can also be run as 1> Iconx outfile prog arg1 arg2 arg3 (Note that order of the arguments in this last one!). Of course, in this case, Iconx must be in your search path, and the icon program must have it's full name specified - the CLI path will not be searched. Icon programs may be interrupted by using CNTRL-C. However, the Icon system will only check for the CNTRL-C when it is doing I/O, so if you are stuck in an non I/O bound loop, well, it is time to reboot. ________________________________________________ 1. R. E. Griswold, An Overview of the Icon Programming Language, The Univ. of Arizona Tech. Rep. 83-3c, 1983, Revised 1986. 2. R. E. Griswold, W. H. Mitchell and J. O'Bagy, Version 6 of Icon, The Univ. of Arizona Tech. Rep. 86-10b, 1986.