@H(Differences between IMP80 and IOPT The following is a collection of differences noted between the currently supported IMP compiler on EMAS, IMP80, and the portable compiler, currently known as IOPT. The latter will be the only IMP compiler available on EMAS 3. N.B. Perhaps users of the old IMP9 compiler (there are probably still quite a few) should be warned in good time that IMP9 will not be available on EMAS 3. 1) In IMP80 access to a byte beyond the currently defined length of a string by use of CHARNO is permitted. This is not true in IOPT. However, in IOPT the length of a string constant or ~constant~ ~string~ can be found (but not changed!) by use of LENGTH(str), and the form CHARNO(str,n), where str is a string constant or ~constant~ ~string~ and n is an integer constant or ~constant~ ~integer~, is also permitted on the right hand side of an expression. This is not true of IMP80. 2) The keyword ~system~ is permitted in IOPT, but has a different meaning. At present, use of ~system~ in a ~spec~ statement produces a warning message, but the correct (i.e. IMP80-meaning) code is generated (the entry point is S#procname, where procname is the name, in upper case, of the procedure specified). It is advisable for users to remove all occurrences of the keyword ~system~ from their programs, by use of ~alias~; for example: ~system~ ~routine~ ~spec~ itos(~integer~ n) should become ~external~ ~routine~ ~spec~ itos ~alias~ "S#ITOS"(~integer~ n) Note that the entry point name (the part in double quotes) MUST be given in upper case, whatever case is used elsewhere in the program. Programs in which system procedures are defined (rather than merely specified) MUST be converted using ~alias~, as above. This is because such use of the keyword ~system~ is valid in IOPT, but does not mean the same as in IMP80. No warning message is given (perhaps it should be?), and the first indication of trouble occurs when entry points are found to be missing. The best advice is to get rid of the keyword ~system~ from all IMP programs. 3) 2900 assembler code is handled differently in some cases. Noted thus far: a) string descriptors are not loaded into the descriptor register by the instructions *LD_S, *LSD_S. Assembler programmers who need to use string descriptors can construct them in (locally declared) ~long~ ~integer~s, using ADDR. They will then operate correctly in IMP80 and in IOPT. 4) In IMP80, the array map ARRAY can take the name of an existing array as its second parameter, the format of that array then being used by ARRAY. This is not permitted in IOPT: the second parameter of ARRAY must be an explicitly declared ~array~ ~format~. @P() 5) There is no unassigned checking in IOPT on EMAS 2900, although there will be on EMAS 3. 6) The main advantage of IOPT on EMAS 2900 is that it produces faster programs than IMP80 when PARM(OPT) is used, although it takes approximately 2.25 times as long to compile a program. The background compilation command BIOPT, corresponding to BIMP80, is available. It is recommended that IMP80 be used when developing a program, but then when optimising IOPT be used to get the speed benefit, and to verify that the program will run on EMAS 3. John Murison May 1984