153 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| .bp
 | |
| .AP "EM CODE TABLES"
 | |
| The following table is used by the assembler for EM machine
 | |
| language.
 | |
| It specifies the opcodes used for each instruction and
 | |
| how arguments are mapped to machine language arguments.
 | |
| The table is presented in three columns,
 | |
| each line in each column contains three or four fields.
 | |
| Each line describes a range of interpreter opcodes by
 | |
| specifying for which instruction the range is used, the type of the
 | |
| opcodes (mini, shortie, etc..) and range for the instruction
 | |
| argument.
 | |
| .QQ
 | |
| The first field on each line gives the EM instruction mnemonic,
 | |
| the second field gives some flags.
 | |
| If the opcodes are minis or shorties the third field specifies
 | |
| how many minis/shorties are used.
 | |
| The last field gives the number of the (first) interpreter
 | |
| opcode.
 | |
| .LP
 | |
| Flags :
 | |
| .IP ""
 | |
| Opcode type, only one of the following may be specified.
 | |
| .RS
 | |
| .IP \-
 | |
| opcode without argument
 | |
| .IP m
 | |
| mini
 | |
| .IP s
 | |
| shortie
 | |
| .IP 2
 | |
| opcode with 2-byte signed argument
 | |
| .IP 4
 | |
| opcode with 4-byte signed argument
 | |
| .IP 8
 | |
| opcode with 8-byte signed argument
 | |
| .IP u
 | |
| opcode with 2-byte unsigned argument
 | |
| .RE
 | |
| .IP ""
 | |
| Secondary (escaped) opcodes.
 | |
| .RS
 | |
| .IP e
 | |
| The opcode thus marked is in the secondary opcode group instead
 | |
| of the primary
 | |
| .RE
 | |
| .IP ""
 | |
| restrictions on arguments
 | |
| .RS
 | |
| .IP N
 | |
| Negative arguments only
 | |
| .IP P
 | |
| Positive and zero arguments only
 | |
| .RE
 | |
| .IP ""
 | |
| mapping of arguments
 | |
| .RS
 | |
| .IP w
 | |
| argument must be divisible by the wordsize and is divided by the
 | |
| wordsize before use as opcode argument.
 | |
| .IP o
 | |
| argument ( possibly after division ) must be >= 1 and is
 | |
| decremented before use as opcode argument
 | |
| .RE
 | |
| .LP
 | |
| If the opcode type is 2,4 or 8 the resulting argument is used as
 | |
| opcode argument (least significant byte first).
 | |
| If the opcode type is mini, the argument is added
 | |
| to the first opcode \- if in range \- .
 | |
| If the argument is negative, the absolute value minus one is
 | |
| used in the algorithm above.
 | |
| .br
 | |
| For shorties with positive arguments the first opcode is used
 | |
| for arguments in the range 0..255, the second for the range
 | |
| 256..511, etc..
 | |
| For shorties with negative arguments the first opcode is used
 | |
| for arguments in the range \-1..\-256, the second for the range
 | |
| \-257..\-512, etc..
 | |
| The byte following the opcode contains the least significant
 | |
| byte of the argument.
 | |
| First some examples of these specifications.
 | |
| .IP "aar mwPo 1 34"
 | |
| .br
 | |
| Indicates that opcode 34 is used as a mini for Positive
 | |
| instruction arguments only.
 | |
| The w and o indicate division and decrementing of the
 | |
| instruction argument.
 | |
| Because the resulting argument must be zero ( only opcode 34 may be used),
 | |
| this mini can only be used for instruction argument 2.
 | |
| Conclusion: opcode 34 is for "AAR 2".
 | |
| .IP "adp sP 1 41"
 | |
| .br
 | |
| Opcode 41 is used as shortie for ADP with arguments in the range
 | |
| 0..255.
 | |
| .IP "bra sN 2 60"
 | |
| .br
 | |
| Opcode 60 is used as shortie for BRA with arguments \-1..\-256,
 | |
| 61 is used for arguments \-257..\-512.
 | |
| .IP "zer e\- 145"
 | |
| .br
 | |
| Escaped opcode 145 is used for ZER.
 | |
| .LP
 | |
| The interpreter opcode table:
 | |
| .DS
 | |
| .so itables
 | |
| .DE
 | |
| .PP
 | |
| The table above results in the following dispatch tables.
 | |
| Dispatch tables are used by interpreters to jump to the
 | |
| routines implementing the EM instructions, indexed by the next opcode.
 | |
| Each line of the dispatch tables gives the routine names
 | |
| of eight consecutive opcodes, preceded by the first opcode number
 | |
| on that line.
 | |
| Routine names consist of an EM mnemonic followed by a suffix.
 | |
| The suffices show the encoding used for each opcode.
 | |
| .LP
 | |
| The following suffices exist:
 | |
| .TS
 | |
| tab(:);
 | |
| l l.
 | |
| .z:no arguments
 | |
| .l:16-bit argument
 | |
| .L:32-bit argument
 | |
| .u:16-bit unsigned argument
 | |
| .lw:16-bit argument divided by the wordsize
 | |
| .Lw:32-bit argument divided by the wordsize
 | |
| .p:positive 16-bit argument
 | |
| .P:positive 32-bit argument
 | |
| .pw:positive 16-bit argument divided by the wordsize
 | |
| .Pw:positive 32-bit argument divided by the wordsize
 | |
| .n:negative 16-bit argument
 | |
| .N:negative 32-bit argument
 | |
| .nw:negative 16-bit argument divided by the wordsize
 | |
| .Nw:negative 32-bit argument divided by the wordsize
 | |
| .s<num>:shortie with <num> as high order argument byte
 | |
| .w<num>:shortie with argument divided by the wordsize
 | |
| .<num>:mini with <num> as argument
 | |
| .<num>W:mini with <num>*wordsize as argument
 | |
| .TE
 | |
| .LP
 | |
| <num> is a possibly negative integer.
 | |
| .LP
 | |
| The dispatch table for the 256 primary opcodes:
 | |
| .sp 1
 | |
| .so dispat1
 | |
| .sp 2
 | |
| The list of secondary opcodes (escape1):
 | |
| .sp 1
 | |
| .so dispat2
 | |
| .sp 2
 | |
| Finally, the list of opcodes with four byte arguments (escape2).
 | |
| .sp 1
 | |
| .so dispat3
 |