diff --git a/doc/em/addend.n b/doc/em/addend.n index 05685c9ff..368ca2d12 100644 --- a/doc/em/addend.n +++ b/doc/em/addend.n @@ -736,6 +736,7 @@ interchanged before being processed. gives the number of lines of the first block. gives the number of lines of the second one. Blank and pure comment lines do not count. +This instruction is obsolete. Its use is strongly discouraged. .OU .sp MES ,* diff --git a/doc/em/app.codes.nr b/doc/em/app.codes.nr index 342e7362d..577863103 100644 --- a/doc/em/app.codes.nr +++ b/doc/em/app.codes.nr @@ -154,7 +154,7 @@ mini with as argument mini with *wordsize as argument .PE 1 is a possibly negative integer. -.VS 1 1 +.VS .IE The dispatch table for the 256 primary opcodes: .N 1 diff --git a/doc/em/app.exam.nr b/doc/em/app.exam.nr index 2121e08a0..0897298f9 100644 --- a/doc/em/app.exam.nr +++ b/doc/em/app.exam.nr @@ -141,7 +141,7 @@ have been added manually. Note that this code has already been optimized. lol 0 adp 2 sti 8 ; r.r2 := - lni ; lin 23 prior to optimization + lni ; lin 30 prior to optimization lal \-224 lol \-4 lae .2 @@ -176,7 +176,7 @@ have been added manually. Note that this code has already been optimized. sti 8 ; r2 := x + y loc 0 sil \-226 ; r1 := 0 - lin 34 ; note the abscence of the unnecesary jump + lin 34 ; note the absence of the unnecessary jump lae 22 ; address of output structure lol \-4 cal $_wri ; write integer with default width diff --git a/doc/em/app.int.nr b/doc/em/app.int.nr index d77adde18..26dd3a7c6 100644 --- a/doc/em/app.int.nr +++ b/doc/em/app.int.nr @@ -2,7 +2,10 @@ .AP "EM INTERPRETER" .nf .ft CW -.ta 8 16 24 32 40 48 56 64 72 80 +.lg 0 +.nr x \w' ' +.ta \nxu +\nxu +\nxu +\nxu +\nxu +\nxu +\nxu +\nxu +\nxu +\nxu .so em.i .ft P +.lg 1 .fi diff --git a/doc/em/assem.nr b/doc/em/assem.nr index 9926a28f3..51cf192a2 100644 --- a/doc/em/assem.nr +++ b/doc/em/assem.nr @@ -168,7 +168,7 @@ bit pattern:\fBddd\fP:\e\fBddd\fP .TE .DE The escape \fB\eddd\fP consists of the backslash followed by 1, -2, or 3 octal digits specifing the value of +2, or 3 octal digits specifying the value of the desired character. If the character following a backslash is not one of those specified, @@ -206,11 +206,11 @@ l l l. .TE .IE .S3 "Pseudoinstructions" -.S4 Storage declaration +.S4 "Storage declaration" Initialized global data is allocated by the pseudoinstruction CON, which needs at least one argument. Each argument is used to allocate and initialize a number of -consequtive bytes in data memory. +consecutive bytes in data memory. The number of bytes to be allocated and the alignment depend on the type of the argument. For each argument, an integral number of words, @@ -257,7 +257,7 @@ Switching to another type of fragment or placing a label forces word-alignment. There are three types of fragments in global data space: CON, ROM and BSS/HOL. -.N 2 +.N 1 .IS 2 .PS - 4 .PT "BSS ,," @@ -277,7 +277,7 @@ Assemble global data words initialized with the constants. Idem, but the initialized data will never be changed by the program. .PE .IE -.S4 Partitioning +.S4 "Partitioning" Two pseudoinstructions partition the input into procedures: .IS 2 .PS - 4 @@ -295,7 +295,7 @@ The number of bytes for locals must be specified in either the PRO or END pseudoinstruction or both. .PE .IE -.S4 Visibility +.S4 "Visibility" Names of data and procedures in an EM module can either be internal or external. External names are known outside the module and are used to link @@ -329,7 +329,7 @@ Internal procedure. is internal to this module and must be defined in this module. .PE .IE -.S4 Miscellaneous +.S4 "Miscellaneous" Two other pseudoinstructions provide miscellaneous features: .IS 2 .PS - 4 @@ -339,6 +339,7 @@ interchanged before being processed. gives the number of lines of the first block. gives the number of lines of the second one. Blank and pure comment lines do not count. +This instruction is obsolete. Its use is strongly discouraged. .PT "MES [,]*" A special type of comment. Used by compilers to communicate with the @@ -400,7 +401,7 @@ the locals in this procedure should not be kept in registers and all registers containing locals of other procedures should be saved upon entry to this procedure. .PE 1 -.VS 1 1 +.VS Each backend is free to skip irrelevant MES pseudos. .PE .IE @@ -456,6 +457,7 @@ r l. Absence of an optional argument is indicated by a special byte. .IE 2 +.NE 7 .CS Common Table for Neutral State and Arguments .CE @@ -490,7 +492,7 @@ are presented in two's complement notation, with the least significant byte first. For example: the value of a 32 bit constant is ((s4*256+b3)*256+b2)*256+b1, where s4 is b4\-256 if b4 is greater than 128 else s4 takes the value of b4. -A consists of a inmediatly followed by +A consists of a immediately followed by a sequence of bytes with length . .P .ne 8 @@ -588,6 +590,7 @@ Instructions that check for undefined integer or floating-point values and underflow or overflow are indicated below by (*). .N 1 +.VS 0 0 .DS .ta 12n GROUP 1 \- LOAD @@ -799,3 +802,4 @@ GROUP 15 \- MISCELLANEOUS STR \*r : Store register (0=LB, 1=SP, 2=HP) TRP \*- : Cause trap to occur (Error number on stack) .DE 0 +.VS diff --git a/doc/em/descr.nr b/doc/em/descr.nr index ed79ba850..f4145e7ba 100644 --- a/doc/em/descr.nr +++ b/doc/em/descr.nr @@ -18,9 +18,9 @@ Range check descriptors consist of two integers: .IS 2 .PS 1 4 "" . .PT -lower bound~~~~~~~signed +lower bound signed .PT -upper bound~~~~~~~signed +upper bound signed .PE .IE The range check instruction checks an integer on the stack against @@ -34,11 +34,11 @@ Array descriptors contain the following three integers: .IS 2 .PS 1 4 "" . .PT -lower bound~~~~~~~~~~~~~~~~~~~~~signed +lower bound signed .PT -upper bound \- lower bound~~~~~~~unsigned +upper bound \- lower bound unsigned .PT -number of bytes per element~~~~~unsigned +number of bytes per element unsigned .PE .IE The array instructions LAR, SAR and AAR have the pointer to the start @@ -88,7 +88,7 @@ value of LB after the jump .IE GTO replaces the loads PC, SP and LB from the descriptor, thereby jumping to a procedure -and removing zeor or more frames from the stack. +and removing zero or more frames from the stack. The LB, SP and PC in the descriptor must belong to a dynamically enclosing procedure, because some EM implementations will need to backtrack through diff --git a/doc/em/dspace.nr b/doc/em/dspace.nr index a610a20c2..620de3be1 100644 --- a/doc/em/dspace.nr +++ b/doc/em/dspace.nr @@ -70,7 +70,7 @@ The result of a LFR is only defined if the size used to fetch is identical to the size used in the last return. The instruction ASP, used to remove the parameters from the stack, the branch instruction BRA and the non-local goto -instrucion GTO are the only ones that leave the contents of +instruction GTO are the only ones that leave the contents of the 'function return area' intact. All other instructions are allowed to destroy the function return area. diff --git a/doc/em/em.i b/doc/em/em.i index a7a70f72e..1335029e1 100644 --- a/doc/em/em.i +++ b/doc/em/em.i @@ -159,7 +159,7 @@ var iclass: insclass; { true for escaped opcodes } dispat: array[insclass,byte] of dispatch; retsize:size; { holds size of last LFR } - insr: mnem; { holds the instructionnumber } + insr: mnem; { holds the instruction number } halted: boolean; { normally false } exitstatus:word; { parameter of MON 1 } ignmask:word; { ignore mask for traps } @@ -522,7 +522,7 @@ begin j:=0; end; {---------------------------------------------------------------------------} -{ Array indexing +{ Array indexing } {---------------------------------------------------------------------------} function arraycalc(c:adr):adr; { subscript calculation } diff --git a/doc/em/env.nr b/doc/em/env.nr index b3c476eb5..7252b1a55 100644 --- a/doc/em/env.nr +++ b/doc/em/env.nr @@ -209,3 +209,4 @@ trap number \-3, the signal is ignored. The flag returned by fork is 1 in the child process and 0 in the parent. The pid returned is the process-id of the other process. +.VS diff --git a/doc/em/exam.e b/doc/em/exam.e index b4af8e7c9..ff5e210b6 100644 --- a/doc/em/exam.e +++ b/doc/em/exam.e @@ -86,7 +86,7 @@ lol 0 adp 2 sti 8 ; r.r2 := - lni ; was lin 23 prior to optimization + lni ; was lin 30 prior to optimization lal -224 lol -4 lae .2 @@ -121,7 +121,7 @@ sti 8 ; r2 := x + y loc 0 sil -226 ; r1 := 0 - lin 34 ; note the abscence of the unnecesary jump + lin 34 ; note the absence of the unnecessary jump lae 22 ; address of output structure lol -4 cal $_wri ; write integer with default width diff --git a/doc/em/intro.nr b/doc/em/intro.nr index e9c4d7ad3..bef9f38ff 100644 --- a/doc/em/intro.nr +++ b/doc/em/intro.nr @@ -159,8 +159,11 @@ and not with the symbolic assembly language. .P As mentioned above, the current microcomputer technology offers 8, 16 and 32 bit -machines with address spaces ranging from 2\v'-0.5m'16\v'0.5m' -to 2\v'-0.5m'32\v'0.5m' bytes. +machines with address spaces ranging from +.Ex 2 16 +to +.Ex 2 32 +bytes. Having one size of pointers and integers restricts the usefulness of the language. We decided to have a different language for each combination of diff --git a/doc/em/mach.nr b/doc/em/mach.nr index 6cb6b14f3..f64383f8e 100644 --- a/doc/em/mach.nr +++ b/doc/em/mach.nr @@ -22,19 +22,15 @@ two groups of 256 secondary opcodes each. EM instructions without arguments have a single opcode assigned, possibly escaped: .Dr 6 - |--------------| | opcode | |--------------| - .De or .Dr 6 - |--------------|--------------| | escape | opcode | |--------------|--------------| - .De The encoding for instructions with an argument is more complex. Several instructions have an address from the global data area @@ -45,37 +41,29 @@ and negative arguments. There is always an opcode that takes the next two bytes as argument, high byte first: .Dr 6 - |--------------|--------------|--------------| | opcode | hibyte | lobyte | |--------------|--------------|--------------| - .De or .Dr 6 - |--------------|--------------|--------------|--------------| | escape | opcode | hibyte | lobyte | |--------------|--------------|--------------|--------------| - .De An extra escape is provided for instructions with four or eight byte arguments. .Dr 6 - - |--------------|--------------|--------------| |--------------| - | ESCAPE | opcode | hibyte |...| lobyte | - |--------------|--------------|--------------| |--------------| - + |--------------|--------------|--------------| |--------------| + | ESCAPE | opcode | hibyte |...| lobyte | + |--------------|--------------|--------------| |--------------| .De For most instructions some argument values predominate. The most frequent combinations of instruction and argument will be encoded in a single byte, called a mini: .Dr 6 - |---------------| |opcode+argument| (mini) |---------------| - .De The number of minis is restricted, because only 254 primary opcodes are available. @@ -90,19 +78,15 @@ into a single opcode. These opcodes are called shorties. Shorties may be escaped. .Dr 6 - |--------------|--------------| | opcode+high | lobyte | (shortie) |--------------|--------------| - .De or .Dr 6 - |--------------|--------------|--------------| | escape | opcode+high | lobyte | |--------------|--------------|--------------| - .De Escaped shorties are useless if the normal encoding has a primary opcode. Note that for some instruction-argument combinations @@ -136,7 +120,7 @@ Each descriptor contains: the number of bytes to be reserved for locals at each invocation. .N -This is a pointer-szied integer. +This is a pointer-sized integer. .PT 2. the start address of the procedure .PE @@ -217,6 +201,7 @@ unused unused .PE .IE +.VS .P The program text consists of NTEXT bytes. NTEXT is always a multiple of the wordsize. @@ -247,12 +232,12 @@ At load time an interpreter can perform any conversion deemed necessary, such as reordering bytes in integers and pointers and adding base addresses to pointers. -.BP .A In the following pictures we show a graphical notation of the initializers. The leftmost rectangle represents the leading byte. .N 1 +.VS 1 0 .DS .PS - 4 " " Fields marked with @@ -271,9 +256,8 @@ contain a data or instruction pointer contain a null terminated ASCII string .PE 1 .DE 0 -.VS 1 1 +.VS .Dr 6 - ------------------- | 0 | n | repeat last initialization n times ------------------- @@ -331,7 +315,7 @@ contain a null terminated ASCII string ------------------------- | 8 | m | s | initialized float of size m ------------------------- -.De 3 +.De .PS - 8 .PT type~0: If the last initialization initialized k bytes starting diff --git a/doc/em/macr.nr b/doc/em/macr.nr index d5900eeb7..3790cac6d 100644 --- a/doc/em/macr.nr +++ b/doc/em/macr.nr @@ -23,7 +23,7 @@ .. .de Df \" Drawing Footer .N 1 -.FT P +.ft R .CS .lg 1 .. @@ -33,3 +33,7 @@ .AD .N \\$1 .. +.\" macro for exponents, added by Ceriel Jacobs +.de Ex \" Exponent $1 $2 [$3] +\\$1\v'-0.5m'\s-2\\$2\s+2\v'0.5m'\\$3 +.. diff --git a/doc/em/mapping.nr b/doc/em/mapping.nr index f940c44f1..35351d329 100644 --- a/doc/em/mapping.nr +++ b/doc/em/mapping.nr @@ -195,7 +195,6 @@ LOI:1:pop:r0:pop:r0 LOE:40:push:eb+40:push:eb-41 .TE .DE -.BP .P The translation for the two implementations, if the target machine address is used as pointer representation, is: diff --git a/doc/em/title.nr b/doc/em/title.nr index 20f5a8913..653b009cf 100644 --- a/doc/em/title.nr +++ b/doc/em/title.nr @@ -1,7 +1,8 @@ .po 0 .TP 1 .ll 79n -.sp 15 +\& +.sp 10 .ce 4 DESCRIPTION OF A MACHINE ARCHITECTURE FOR USE WITH diff --git a/doc/em/traps.nr b/doc/em/traps.nr index c44c4b718..802f7a38d 100644 --- a/doc/em/traps.nr +++ b/doc/em/traps.nr @@ -8,7 +8,7 @@ This mechanism uses five instructions: LIM, SIM, SIG, TRP and RTT. This section of the manual may be omitted on the first reading since it presupposes knowledge of the EM instruction set. .P -The action taken when a trap occures is determined by the value +The action taken when a trap occurs is determined by the value of an internal EM trap register. This register contains a pointer to a procedure. Initially the pointer used is zero and all traps halt the @@ -124,7 +124,7 @@ ersave msave bss 2,0,0 ; Room to save previous value of trap mask - pro calcule,0 ; entry point + pro $calcule,0 ; entry point lxl 0 ; fill in non-local goto descriptor with LB ste jmpbuf+4 lor 1 ; and SP @@ -151,11 +151,11 @@ jmpbuf con *1,0,0 end .DE 0 -.VS 1 1 +.VS .DS Example of catch procedure .ta 1n 24n - pro catch,0 ; Local procedure that must catch the overflow trap + pro $catch,0 ; Local procedure that must catch the overflow trap lol 2 ; Load trap number loc 4 ; check for overflow bne *1 ; if other trap, call higher trap procedure diff --git a/doc/em/types.nr b/doc/em/types.nr index 27cb2c9d4..5e0ff15bd 100644 --- a/doc/em/types.nr +++ b/doc/em/types.nr @@ -33,7 +33,8 @@ restrictions imposed on the representation of the types used. A number \fBn\fP used in these paragraphs indicates the size of the object in \fIbits\fP. .S2 "Unsigned integers" -The range of unsigned integers is 0..2\v'-0.5m'\fBn\fP\v'0.5m'\-1. +The range of unsigned integers is 0.. +.Ex 2 "\fBn\fP" -1. A binary representation is assumed. The order of the bits within an object is knowingly left unspecified. @@ -61,17 +62,23 @@ We assume existence of at least single word unsigned arithmetic in any implementation. .S2 "Signed Integers" The range of signed integers is -\-2\v'-0.5m'\fBn\fP\-1\v'0.5m'~..~2\v'-0.5m'\fBn\fP\-1\v'0.5m'\-1, +.Ex \-2 "\fBn\fP\-1" ~.. +.Ex 2 "\fBn\fP\-1" \-1, in other words the range of signed integers of \fBn\fP bits using two's complement arithmetic. The representation is the same as for unsigned integers except the range -2\v'-0.5m'\fBn\fP\-1\v'0.5m'~..~2\v'-0.5m'\fBn\fP\v'0.5m'\-1 is mapped on the -range \-2\v'-0.5m'\fBn\fP\-1\v'0.5m'~..~\-1. +.Ex 2 "\fBn\fP\-1" ~.. +.Ex 2 "\fBn\fP" \-1 +is mapped on the +range +.Ex \-2 "\fBn\fP\-1" ~..~\-1. In other words, the most significant bit is used as sign bit. The convert instructions between signed and unsigned integers of the same size can be used to catch errors. .A -The value \-2\v'-0.5m'\fBn\fP\-1\v'0.5m' is used for undefined +The value +.Ex \-2 "\fBn\fP\-1" +is used for undefined signed integers. EM implementations should trap when this value is used in an operation on signed integers. @@ -80,7 +87,6 @@ can be used to disable such traps. .A We assume existence of at least single word signed arithmetic in any implementation. -.BP .S2 "Floating point values" Floating point values must have a signed mantissa and a signed exponent.