123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- .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.
- .A
- 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.
- .N 1
- Flags :
- .IS 3
- .N 1
- Opcode type, only one of the following may be specified.
- .PS - 5 " "
- .PT \-
- opcode without argument
- .PT m
- mini
- .PT s
- shortie
- .PT 2
- opcode with 2-byte signed argument
- .PT 4
- opcode with 4-byte signed argument
- .PT 8
- opcode with 8-byte signed argument
- .PE
- Secondary (escaped) opcodes.
- .PS - 5 " "
- .PT e
- The opcode thus marked is in the secondary opcode group instead
- of the primary
- .PE
- restrictions on arguments
- .PS - 5 " "
- .PT N
- Negative arguments only
- .PT P
- Positive and zero arguments only
- .PE
- mapping of arguments
- .PS - 5 " "
- .PT w
- argument must be divisible by the wordsize and is divided by the
- wordsize before use as opcode argument.
- .PT o
- argument ( possibly after division ) must be >= 1 and is
- decremented before use as opcode argument
- .PE
- .IE
- If the opcode type is 2,4 or 8 the resulting argument is used as
- opcode argument (least significant byte first).
- .N
- 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.
- .N
- 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.
- .PS - 5
- .PT "aar mwPo 1 34"
- 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".
- .PT "adp sP 1 41"
- Opcode 41 is used as shortie for ADP with arguments in the range
- 0..255.
- .PT "bra sN 2 60"
- Opcode 60 is used as shortie for BRA with arguments \-1..\-256,
- 61 is used for arguments \-257..\-512.
- .PT "zer e\- 145"
- Escaped opcode 145 is used for ZER.
- .PE
- The interpreter opcode table:
- .N 1
- .IS 3
- .so itables
- .IE
- .P
- 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.
- .N
- The following suffices exist:
- .N 1
- .VS 1 0
- .IS 4
- .PS - 11
- .PT .z
- no arguments
- .PT .l
- 16-bit argument
- .PT .lw
- 16-bit argument divided by the wordsize
- .PT .p
- positive 16-bit argument
- .PT .pw
- positive 16-bit argument divided by the wordsize
- .PT .n
- negative 16-bit argument
- .PT .nw
- negative 16-bit argument divided by the wordsize
- .PT .s<num>
- shortie with <num> as high order argument byte
- .PT .sw<num>
- shortie with argument divided by the wordsize
- .PT .<num>
- mini with <num> as argument
- .PT .<num>W
- mini with <num>*wordsize as argument
- .PE 1
- <num> is a possibly negative integer.
- .VS 1 1
- .IE
- The dispatch table for the 256 primary opcodes:
- .DS B
- .ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 loc.0 loc.1 loc.2 loc.3 loc.4 loc.5 loc.6 loc.7
- 8 loc.8 loc.9 loc.10 loc.11 loc.12 loc.13 loc.14 loc.15
- 16 loc.16 loc.17 loc.18 loc.19 loc.20 loc.21 loc.22 loc.23
- 24 loc.24 loc.25 loc.26 loc.27 loc.28 loc.29 loc.30 loc.31
- 32 loc.32 loc.33 aar.1W adf.s0 adi.1W adi.2W adp.l adp.1
- 40 adp.2 adp.s0 adp.s\-1 ads.1W and.1W asp.1W asp.2W asp.3W
- 48 asp.4W asp.5W asp.w0 beq.l beq.s0 bge.s0 bgt.s0 ble.s0
- 56 blm.s0 blt.s0 bne.s0 bra.l bra.s\-1 bra.s\-2 bra.s0 bra.s1
- 64 cal.1 cal.2 cal.3 cal.4 cal.5 cal.6 cal.7 cal.8
- 72 cal.9 cal.10 cal.11 cal.12 cal.13 cal.14 cal.15 cal.16
- 80 cal.17 cal.18 cal.19 cal.20 cal.21 cal.22 cal.23 cal.24
- 88 cal.25 cal.26 cal.27 cal.28 cal.s0 cff.z cif.z cii.z
- 96 cmf.s0 cmi.1W cmi.2W cmp.z cms.s0 csa.1W csb.1W dec.z
- 104 dee.w0 del.w\-1 dup.1W dvf.s0 dvi.1W fil.l inc.z ine.lw
- 112 ine.w0 inl.\-1W inl.\-2W inl.\-3W inl.w\-1 inn.s0 ior.1W ior.s0
- 120 lae.l lae.w0 lae.w1 lae.w2 lae.w3 lae.w4 lae.w5 lae.w6
- 128 lal.p lal.n lal.0 lal.\-1 lal.w0 lal.w\-1 lal.w\-2 lar.W
- 136 ldc.0 lde.lw lde.w0 ldl.0 ldl.w\-1 lfr.1W lfr.2W lfr.s0
- 144 lil.w\-1 lil.w0 lil.0 lil.1W lin.l lin.s0 lni.z loc.l
- 152 loc.\-1 loc.s0 loc.s\-1 loe.lw loe.w0 loe.w1 loe.w2 loe.w3
- 160 loe.w4 lof.l lof.1W lof.2W lof.3W lof.4W lof.s0 loi.l
- 168 loi.1 loi.1W loi.2W loi.3W loi.4W loi.s0 lol.pw lol.nw
- 176 lol.0 lol.1W lol.2W lol.3W lol.\-1W lol.\-2W lol.\-3W lol.\-4W
- 184 lol.\-5W lol.\-6W lol.\-7W lol.\-8W lol.w0 lol.w\-1 lxa.1 lxl.1
- 192 lxl.2 mlf.s0 mli.1W mli.2W rck.1W ret.0 ret.1W ret.s0
- 200 rmi.1W sar.1W sbf.s0 sbi.1W sbi.2W sdl.w\-1 set.s0 sil.w\-1
- 208 sil.w0 sli.1W ste.lw ste.w0 ste.w1 ste.w2 stf.l stf.W
- 216 stf.2W stf.s0 sti.1 sti.1W sti.2W sti.3W sti.4W sti.s0
- 224 stl.pw stl.nw stl.0 stl.1W stl.\-1W stl.\-2W stl.\-3W stl.\-4W
- 232 stl.\-5W stl.w\-1 teq.z tgt.z tlt.z tne.z zeq.l zeq.s0
- 240 zeq.s1 zer.s0 zge.s0 zgt.s0 zle.s0 zlt.s0 zne.s0 zne.s\-1
- 248 zre.lw zre.w0 zrl.\-1W zrl.\-2W zrl.w\-1 zrl.nw escape1 escape2
- .DE 2
- The list of secondary opcodes (escape1):
- .N 1
- .DS B
- .ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 aar.l aar.z adf.l adf.z adi.l adi.z ads.l ads.z
- 8 adu.l adu.z and.l and.z asp.lw ass.l ass.z bge.l
- 16 bgt.l ble.l blm.l bls.l bls.z blt.l bne.l cai.z
- 24 cal.l cfi.z cfu.z ciu.z cmf.l cmf.z cmi.l cmi.z
- 32 cms.l cms.z cmu.l cmu.z com.l com.z csa.l csa.z
- 40 csb.l csb.z cuf.z cui.z cuu.z dee.lw del.pw del.nw
- 48 dup.l dus.l dus.z dvf.l dvf.z dvi.l dvi.z dvu.l
- 56 dvu.z fef.l fef.z fif.l fif.z inl.pw inl.nw inn.l
- 64 inn.z ior.l ior.z lar.l lar.z ldc.l ldf.l ldl.pw
- 72 ldl.nw lfr.l lil.pw lil.nw lim.z los.l los.z lor.s0
- 80 lpi.l lxa.l lxl.l mlf.l mlf.z mli.l mli.z mlu.l
- 88 mlu.z mon.z ngf.l ngf.z ngi.l ngi.z nop.z rck.l
- 96 rck.z ret.l rmi.l rmi.z rmu.l rmu.z rol.l rol.z
- 104 ror.l ror.z rtt.z sar.l sar.z sbf.l sbf.z sbi.l
- 112 sbi.z sbs.l sbs.z sbu.l sbu.z sde.l sdf.l sdl.pw
- 120 sdl.nw set.l set.z sig.z sil.pw sil.nw sim.z sli.l
- 128 sli.z slu.l slu.z sri.l sri.z sru.l sru.z sti.l
- 136 sts.l sts.z str.s0 tge.z tle.z trp.z xor.l xor.z
- 144 zer.l zer.z zge.l zgt.l zle.l zlt.l zne.l zrf.l
- 152 zrf.z zrl.pw dch.z exg.s0 exg.l exg.z lpb.z gto.l
- .DE 2
- Finally, the list of opcodes with four byte arguments (escape2).
- .DS
- .ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 loc
- .DE 0
|