#include <stdio.h>
#include "corewar.h"
#include "sim.h"

#define  INRANGE
#define  DRAW(a, b)
#define  INTERACTIVE  FALSE
#define  IMM1  FALSE
#define  IMM2  FALSE

#undef   IMM1
#define  IMM1  TRUE
static int  dat_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  dat_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  dat_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  dat_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  dat_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  dat_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  dat_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  dat_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_NONE
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_dat US_NONE US_NONE */
		DRAW(xeq_addr, DI_DEAD);
		th->next->prev = th->prev;
		th->prev->next = th->next;
		th->next = sim_tlist->empty;
		sim_tlist->empty = th;
		return(-1);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  mov_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  mov_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  mov_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  mov_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  mov_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  mov_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  mov_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  mov_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_ADDR|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_mov US_VAL (US_ADDR|US_RANGE) */
		if (INRANGE)  {
			core[addr2].val2 = val1;
			if (!IMM1 && !IMM2)  {
				core[addr2].instr = core[addr1].instr;
				core[addr2].val1 = core[addr1].val1;
				if (INTERACTIVE)
					core[addr2].index = core[addr1].index;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  add_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  add_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  add_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  add_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  add_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  add_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  add_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  add_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_add US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((val2 += val1) >= coresize)
				val2 -= coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((core[addr2].val1 += core[addr1].val1) >= coresize)
					core[addr2].val1 -= coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  sub_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  sub_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  sub_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  sub_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  sub_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  sub_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  sub_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  sub_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_sub US_VAL (US_VAL|US_RANGE) */
		if (INRANGE)  {
			if ((int)(val2 -= val1) < 0)
				val2 += coresize;
			core[addr2].val2 = val2;
			if (!IMM1 && !IMM2)  {
				if ((int)(core[addr2].val1 -= core[addr1].val1) < 0)
					core[addr2].val1 += coresize;
			}
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		if (++xeq_addr == coresize)
			xeq_addr = 0;
		th->addr = xeq_addr;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  jmp_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmp_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  jmp_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmp_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmp_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmp_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmp_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmp_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_NONE
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmp US_ADDR US_NONE */
		if (!IMM1)  {
			if (INTERACTIVE && (xeq_addr != addr1))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			th->addr = addr1;
		}
		DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  jmz_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmz_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  jmz_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmz_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmz_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmz_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmz_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmz_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmz US_ADDR US_VAL */
		if (val2 == 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  jmn_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmn_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  jmn_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmn_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmn_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmn_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  jmn_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  jmn_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_jmn US_ADDR US_VAL */
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  djn_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  djn_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  djn_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  djn_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  djn_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  djn_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  djn_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  djn_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  (US_VAL|US_RANGE)
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_djn US_ADDR (US_VAL|US_RANGE) */
		if (val2 == 0)
			val2 = coresize;
		--val2;
		if (INRANGE)  {
			core[addr2].val2 = val2;
			DRAW(addr2, DI_DAT + (id * DI_PLSIZ));
		}
		if (val2 != 0)  {
			if (!IMM1)  {
				if (INTERACTIVE && (addr1 != xeq_addr))
					DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
				th->addr = addr1;
			}
			DRAW(addr1, DI_XEQ + (id * DI_PLSIZ));
		} else  {
			DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (++xeq_addr >= coresize)
				xeq_addr -= coresize;
			th->addr = xeq_addr;
			DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		}
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  cmp_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  cmp_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  cmp_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  cmp_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  cmp_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  cmp_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  cmp_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  cmp_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_cmp US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (IMM1 || IMM2)  {
			if (val1 == val2)
				++xeq_addr;
		} else  {
			if ((val1 == val2) && (core[addr1].val1 == core[addr2].val1) &&
					(core[addr1].instr == core[addr2].instr))
				++xeq_addr;
		}
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  spl_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  spl_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  spl_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  spl_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  spl_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  spl_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  spl_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  spl_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_ADDR
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_spl US_ADDR US_VAL */
		if (INTERACTIVE)  {
			if ((xeq_addr != addr1) || (sim_tlist->count >= maxthreads))
				DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
			if (sim_tlist->count < maxthreads)
				DRAW(addr1, DI_RAN + (id * DI_PLSIZ));
		}
		if (++xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		if (split_id && (val2 != sim_tlist->ld_start))
			return(0);
		else
			return(sim_create_thread(th, addr1));
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  TRUE
static int  slt_imm_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  slt_imm_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_imm_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_imm_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_imm_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
#undef   IMM1
#define  IMM1  FALSE
static int  slt_dir_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  slt_dir_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dir_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dir_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dir_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_ind_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  slt_ind_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_ind_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_ind_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_ind_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp21, tmp22;
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dec_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  slt_dec_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dec_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dec_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_dec_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_inc_imm(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_imm notmp */
		if (USAGE != US_NONE)  {
			ADDR = xeq_addr;
			if (USAGE & US_VAL)
				VAL = ARG;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  TRUE
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
#undef   IMM2
#define  IMM2  TRUE
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef   IMM2
#define  IMM2  FALSE
#undef  TMP1
#undef  TMP2
}
static int  slt_inc_dir(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dir notmp */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE  ((arg2 <= w_radius) || (arg2 >= coresize - w_radius))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_inc_ind(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_ind */
		if (USAGE != US_NONE)  {
			if ((ADDR = xeq_addr + ARG) >= coresize)
				ADDR -= coresize;
			if ((ADDR += core[ADDR].val2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_inc_dec(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_dec tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
					TMP2 += coresize;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			if ((int)(TMP2 = core[TMP1].val2 - 1) < 0)
				TMP2 += coresize;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR = TMP1 + TMP2) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}
static int  slt_inc_inc(thread_t *th,
                        core_el_t *core,
                        aval_t w_radius,
                        aval_t coresize,
                        aval_t xeq_addr,
                        aval_t arg1,
                        aval_t arg2)  {
	aval_t  addr1, val1;
	aval_t  addr2, val2;
#define  USAGE  US_VAL
#define  ADDR   addr1
#define  VAL    val1
#define  ARG    arg1
#define  TMP1   tmp11
#define  TMP2   tmp12
	aval_t  tmp11, tmp12;
	aval_t  tmp21, tmp22;
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef   USAGE
#undef   ADDR
#undef   VAL
#undef   ARG
#undef   TMP1
#undef   TMP2
#define  USAGE  US_VAL
#define  ADDR   addr2
#define  VAL    val2
#define  ARG    arg2
#define  TMP1   tmp21
#define  TMP2   tmp22
		/* fetch am_inc tmp */
		if ((TMP1 = xeq_addr + ARG) >= coresize)
			TMP1 -= coresize;
		if (USAGE == US_NONE)  {
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = core[TMP1].val2 + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
			}
		} else  {
			ADDR = core[TMP1].val2;
			if ((ARG <= w_radius) || (ARG >= coresize - w_radius))  {
				if ((TMP2 = ADDR + 1) == coresize)
					TMP2 = 0;
				core[TMP1].val2 = TMP2;
				DRAW(TMP1, DI_DAT + (cur_id * DI_PLSIZ));
			}
			if ((ADDR += TMP1) >= coresize)
				ADDR -= coresize;
			if (USAGE & US_VAL)
				VAL = core[ADDR].val2;
		}
#if (USAGE & US_RANGE)
#undef  INRANGE
#define  INRANGE\
    ((((unsigned)(addr2 - xeq_addr + w_radius) <= (unsigned)(2*w_radius))) ||\
     ((unsigned)(addr2 - xeq_addr + (coresize - w_radius)) >=\
      (unsigned)(2*(coresize-w_radius))))
#endif
		/* fetch done */
#undef  USAGE
#undef  ADDR
#undef  VAL
#undef  ARG
		/* instruction op_slt US_VAL US_VAL */
		DRAW(xeq_addr, DI_RAN + (id * DI_PLSIZ));
		++xeq_addr;
		if (val1 < val2)
			++xeq_addr;
		if (xeq_addr >= coresize)
			xeq_addr -= coresize;
		DRAW(xeq_addr, DI_XEQ + (id * DI_PLSIZ));
		th->addr = xeq_addr;
		return(0);
		/* instruction done */
#undef  TMP1
#undef  TMP2
}


pintfunc  jmptable[] = {
dat_imm_imm,
dat_imm_dir,
dat_imm_ind,
dat_imm_dec,
dat_imm_inc,
dat_dir_imm,
dat_dir_dir,
dat_dir_ind,
dat_dir_dec,
dat_dir_inc,
dat_ind_imm,
dat_ind_dir,
dat_ind_ind,
dat_ind_dec,
dat_ind_inc,
dat_dec_imm,
dat_dec_dir,
dat_dec_ind,
dat_dec_dec,
dat_dec_inc,
dat_inc_imm,
dat_inc_dir,
dat_inc_ind,
dat_inc_dec,
dat_inc_inc,
mov_imm_imm,
mov_imm_dir,
mov_imm_ind,
mov_imm_dec,
mov_imm_inc,
mov_dir_imm,
mov_dir_dir,
mov_dir_ind,
mov_dir_dec,
mov_dir_inc,
mov_ind_imm,
mov_ind_dir,
mov_ind_ind,
mov_ind_dec,
mov_ind_inc,
mov_dec_imm,
mov_dec_dir,
mov_dec_ind,
mov_dec_dec,
mov_dec_inc,
mov_inc_imm,
mov_inc_dir,
mov_inc_ind,
mov_inc_dec,
mov_inc_inc,
add_imm_imm,
add_imm_dir,
add_imm_ind,
add_imm_dec,
add_imm_inc,
add_dir_imm,
add_dir_dir,
add_dir_ind,
add_dir_dec,
add_dir_inc,
add_ind_imm,
add_ind_dir,
add_ind_ind,
add_ind_dec,
add_ind_inc,
add_dec_imm,
add_dec_dir,
add_dec_ind,
add_dec_dec,
add_dec_inc,
add_inc_imm,
add_inc_dir,
add_inc_ind,
add_inc_dec,
add_inc_inc,
sub_imm_imm,
sub_imm_dir,
sub_imm_ind,
sub_imm_dec,
sub_imm_inc,
sub_dir_imm,
sub_dir_dir,
sub_dir_ind,
sub_dir_dec,
sub_dir_inc,
sub_ind_imm,
sub_ind_dir,
sub_ind_ind,
sub_ind_dec,
sub_ind_inc,
sub_dec_imm,
sub_dec_dir,
sub_dec_ind,
sub_dec_dec,
sub_dec_inc,
sub_inc_imm,
sub_inc_dir,
sub_inc_ind,
sub_inc_dec,
sub_inc_inc,
jmp_imm_imm,
jmp_imm_dir,
jmp_imm_ind,
jmp_imm_dec,
jmp_imm_inc,
jmp_dir_imm,
jmp_dir_dir,
jmp_dir_ind,
jmp_dir_dec,
jmp_dir_inc,
jmp_ind_imm,
jmp_ind_dir,
jmp_ind_ind,
jmp_ind_dec,
jmp_ind_inc,
jmp_dec_imm,
jmp_dec_dir,
jmp_dec_ind,
jmp_dec_dec,
jmp_dec_inc,
jmp_inc_imm,
jmp_inc_dir,
jmp_inc_ind,
jmp_inc_dec,
jmp_inc_inc,
jmz_imm_imm,
jmz_imm_dir,
jmz_imm_ind,
jmz_imm_dec,
jmz_imm_inc,
jmz_dir_imm,
jmz_dir_dir,
jmz_dir_ind,
jmz_dir_dec,
jmz_dir_inc,
jmz_ind_imm,
jmz_ind_dir,
jmz_ind_ind,
jmz_ind_dec,
jmz_ind_inc,
jmz_dec_imm,
jmz_dec_dir,
jmz_dec_ind,
jmz_dec_dec,
jmz_dec_inc,
jmz_inc_imm,
jmz_inc_dir,
jmz_inc_ind,
jmz_inc_dec,
jmz_inc_inc,
jmn_imm_imm,
jmn_imm_dir,
jmn_imm_ind,
jmn_imm_dec,
jmn_imm_inc,
jmn_dir_imm,
jmn_dir_dir,
jmn_dir_ind,
jmn_dir_dec,
jmn_dir_inc,
jmn_ind_imm,
jmn_ind_dir,
jmn_ind_ind,
jmn_ind_dec,
jmn_ind_inc,
jmn_dec_imm,
jmn_dec_dir,
jmn_dec_ind,
jmn_dec_dec,
jmn_dec_inc,
jmn_inc_imm,
jmn_inc_dir,
jmn_inc_ind,
jmn_inc_dec,
jmn_inc_inc,
djn_imm_imm,
djn_imm_dir,
djn_imm_ind,
djn_imm_dec,
djn_imm_inc,
djn_dir_imm,
djn_dir_dir,
djn_dir_ind,
djn_dir_dec,
djn_dir_inc,
djn_ind_imm,
djn_ind_dir,
djn_ind_ind,
djn_ind_dec,
djn_ind_inc,
djn_dec_imm,
djn_dec_dir,
djn_dec_ind,
djn_dec_dec,
djn_dec_inc,
djn_inc_imm,
djn_inc_dir,
djn_inc_ind,
djn_inc_dec,
djn_inc_inc,
cmp_imm_imm,
cmp_imm_dir,
cmp_imm_ind,
cmp_imm_dec,
cmp_imm_inc,
cmp_dir_imm,
cmp_dir_dir,
cmp_dir_ind,
cmp_dir_dec,
cmp_dir_inc,
cmp_ind_imm,
cmp_ind_dir,
cmp_ind_ind,
cmp_ind_dec,
cmp_ind_inc,
cmp_dec_imm,
cmp_dec_dir,
cmp_dec_ind,
cmp_dec_dec,
cmp_dec_inc,
cmp_inc_imm,
cmp_inc_dir,
cmp_inc_ind,
cmp_inc_dec,
cmp_inc_inc,
spl_imm_imm,
spl_imm_dir,
spl_imm_ind,
spl_imm_dec,
spl_imm_inc,
spl_dir_imm,
spl_dir_dir,
spl_dir_ind,
spl_dir_dec,
spl_dir_inc,
spl_ind_imm,
spl_ind_dir,
spl_ind_ind,
spl_ind_dec,
spl_ind_inc,
spl_dec_imm,
spl_dec_dir,
spl_dec_ind,
spl_dec_dec,
spl_dec_inc,
spl_inc_imm,
spl_inc_dir,
spl_inc_ind,
spl_inc_dec,
spl_inc_inc,
slt_imm_imm,
slt_imm_dir,
slt_imm_ind,
slt_imm_dec,
slt_imm_inc,
slt_dir_imm,
slt_dir_dir,
slt_dir_ind,
slt_dir_dec,
slt_dir_inc,
slt_ind_imm,
slt_ind_dir,
slt_ind_ind,
slt_ind_dec,
slt_ind_inc,
slt_dec_imm,
slt_dec_dir,
slt_dec_ind,
slt_dec_dec,
slt_dec_inc,
slt_inc_imm,
slt_inc_dir,
slt_inc_ind,
slt_inc_dec,
slt_inc_inc,
NULL};
