pri= pri==alt ? 1 : 0;
pri = (pri == alt) ? 1 : 0;
embryo_program_run(Embryo_Program *ep, Embryo_Function fn){   Embryo_Header    *hdr;   Embryo_Func_Stub *func;   unsigned char    *code, *data;   Embryo_Cell      pri, alt, stk, frm, hea;   Embryo_Cell      reset_stk, reset_hea, *cip;   Embryo_UCell     codesize;   int              i;   unsigned int     op;   Embryo_Cell      offs;   int              num;   if (!ep) return EMBRYO_PROGRAM_FAIL;   if (ep->run_count > 0) return EMBRYO_PROGRAM_BUSY;   if (!(ep->flags & EMBRYO_FLAG_RELOC))     {   	ep->error = EMBRYO_ERROR_INIT;	return EMBRYO_PROGRAM_FAIL;     }   if (!ep->base)     {	ep->error = EMBRYO_ERROR_INIT;	return EMBRYO_PROGRAM_FAIL;     }      /* set up the registers */   hdr = (Embryo_Header *)ep->base;   codesize = (Embryo_UCell)(hdr->dat - hdr->cod);   code = ep->base + (int)hdr->cod;   data = ep->base + (int)hdr->dat;   hea = ep->hea;   stk = ep->stk;   reset_stk = stk;   reset_hea = hea;   frm = alt = pri = 0;   /* get the start address */   if (fn == EMBRYO_FUNCTION_MAIN)     {	if (hdr->cip < 0)	  {	     ep->error = EMBRYO_ERROR_INDEX;	     return EMBRYO_PROGRAM_FAIL;	  }	cip = (Embryo_Cell *)(code + (int)hdr->cip);     }   else if (fn == EMBRYO_FUNCTION_CONT)     {	/* all registers: pri, alt, frm, cip, hea, stk, reset_stk, reset_hea */	frm = ep->frm;	stk = ep->stk;	hea = ep->hea;	pri = ep->pri;	alt = ep->alt;	reset_stk = ep->reset_stk;	reset_hea = ep->reset_hea;	cip = (Embryo_Cell *)(code + (int)ep->cip);     }   else if (fn < 0)     {	ep->error = EMBRYO_ERROR_INDEX;	return EMBRYO_PROGRAM_FAIL;     }   else     {	if (fn >= (Embryo_Cell)NUMENTRIES(hdr, publics, natives))	  {	     ep->error = EMBRYO_ERROR_INDEX;	     return EMBRYO_PROGRAM_FAIL;	  }	func = GETENTRY(hdr, publics, fn);	cip = (Embryo_Cell *)(code + (int)func->address);     }   /* check values just copied */   CHKSTACK();   CHKHEAP();   if (fn != EMBRYO_FUNCTION_CONT)     {	int i;		for (i = ep->params_size - 1; i >= 0; i--)	  {	     Embryo_Param *pr;	     	     pr = &(ep->params[i]);	     if (pr->string)	       {		  int len;		  Embryo_Cell ep_addr, *addr;		  		  len = strlen(pr->string);		  ep_addr = embryo_data_heap_push(ep, len + 1);		  if (ep_addr == EMBRYO_CELL_NONE)		    {		       ep->error = EMBRYO_ERROR_HEAPLOW;		       return EMBRYO_PROGRAM_FAIL;		    }		  addr = embryo_data_address_get(ep, ep_addr);		  if (addr)		    embryo_data_string_set(ep, pr->string, addr);		  else		    {		       ep->error = EMBRYO_ERROR_HEAPLOW;		       return EMBRYO_PROGRAM_FAIL;		    }		  PUSH(ep_addr);		  free(pr->string);	       }	     else if (pr->cell_array)	       {		  int len;		  Embryo_Cell ep_addr, *addr;		  		  len = strlen(pr->string);		  ep_addr = embryo_data_heap_push(ep, len + 1);		  if (ep_addr == EMBRYO_CELL_NONE)		    {		       ep->error = EMBRYO_ERROR_HEAPLOW;		       return EMBRYO_PROGRAM_FAIL;		    }		  addr = embryo_data_address_get(ep, ep_addr);		  if (addr)		    memcpy(addr, pr->cell_array, 			   pr->cell_array_size * sizeof(Embryo_Cell));		  else		    {		       ep->error = EMBRYO_ERROR_HEAPLOW;		       return EMBRYO_PROGRAM_FAIL;		    }		  PUSH(ep_addr);		  free(pr->cell_array);	       }	     else	       {		  PUSH(pr->cell);	       }	  }	PUSH(ep->params_size * sizeof(Embryo_Cell));	PUSH(0);	if (ep->params)	  {	     free(ep->params);	     ep->params = NULL;	  }	ep->params_size = ep->params_alloc = 0;     }   /* check stack/heap before starting to run */   CHKMARGIN();   ep->run_count++;      /* start running */   for (;;)     {	op = (Embryo_Opcode)*cip++;	switch (op)	  {	   case EMBRYO_OP_LOAD_PRI:	     GETPARAM(offs);	     pri = *(Embryo_Cell *)(data + (int)offs);	     break;	   case EMBRYO_OP_LOAD_ALT:	     GETPARAM(offs);	     alt = *(Embryo_Cell *)(data + (int)offs);	     break;	   case EMBRYO_OP_LOAD_S_PRI:	     GETPARAM(offs);	     pri = *(Embryo_Cell *)(data + (int)frm + (int)offs);	     break;	   case EMBRYO_OP_LOAD_S_ALT:	     GETPARAM(offs);	     alt = *(Embryo_Cell *)(data + (int)frm + (int)offs);	     break;	   case EMBRYO_OP_LREF_PRI:	     GETPARAM(offs);	     offs = *(Embryo_Cell *)(data + (int)offs);	     pri = *(Embryo_Cell *)(data + (int)offs);	     break;	   case EMBRYO_OP_LREF_ALT:	     GETPARAM(offs);	     offs = *(Embryo_Cell *)(data + (int)offs);	     alt = *(Embryo_Cell *)(data + (int)offs);	     break;	   case EMBRYO_OP_LREF_S_PRI:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)frm+(int)offs);	     pri= * (Embryo_Cell *)(data+(int)offs);	     break;	   case EMBRYO_OP_LREF_S_ALT:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)frm+(int)offs);	     alt= * (Embryo_Cell *)(data+(int)offs);	     break;	   case EMBRYO_OP_LOAD_I:	     /* verify address */	     if (pri>=hea && pri<stk || (Embryo_UCell)pri>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     pri= * (Embryo_Cell *)(data+(int)pri);	     break;	   case EMBRYO_OP_LODB_I:	     GETPARAM(offs);	     /* verify address */	     if (pri>=hea && pri<stk || (Embryo_UCell)pri>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     switch (offs)	       {		case 1:		  pri= * (data+(int)pri);		  break;		case 2:		  pri= * (unsigned short *)(data+(int)pri);		  break;		case 4:		  pri= * (unsigned int *)(data+(int)pri);		  break;		default:		  ABORT(ep,EMBRYO_ERROR_INVINSTR);		  break;	       }	     break;	   case EMBRYO_OP_CONST_PRI:	     GETPARAM(pri);	     break;	   case EMBRYO_OP_CONST_ALT:	     GETPARAM(alt);	     break;	   case EMBRYO_OP_ADDR_PRI:	     GETPARAM(pri);	     pri+=frm;	     break;	   case EMBRYO_OP_ADDR_ALT:	     GETPARAM(alt);	     alt+=frm;	     break;	   case EMBRYO_OP_STOR_PRI:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)offs)=pri;	     break;	   case EMBRYO_OP_STOR_ALT:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)offs)=alt;	     break;	   case EMBRYO_OP_STOR_S_PRI:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)frm+(int)offs)=pri;	     break;	   case EMBRYO_OP_STOR_S_ALT:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)frm+(int)offs)=alt;	     break;	   case EMBRYO_OP_SREF_PRI:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)offs);	     *(Embryo_Cell *)(data+(int)offs)=pri;	     break;	   case EMBRYO_OP_SREF_ALT:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)offs);	     *(Embryo_Cell *)(data+(int)offs)=alt;	     break;	   case EMBRYO_OP_SREF_S_PRI:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)frm+(int)offs);	     *(Embryo_Cell *)(data+(int)offs)=pri;	     break;	   case EMBRYO_OP_SREF_S_ALT:	     GETPARAM(offs);	     offs= * (Embryo_Cell *)(data+(int)frm+(int)offs);	     *(Embryo_Cell *)(data+(int)offs)=alt;	     break;	   case EMBRYO_OP_STOR_I:	     /* verify address */	     if (alt>=hea && alt<stk || (Embryo_UCell)alt>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     *(Embryo_Cell *)(data+(int)alt)=pri;	     break;	   case EMBRYO_OP_STRB_I:	     GETPARAM(offs);	     /* verify address */	     if (alt>=hea && alt<stk || (Embryo_UCell)alt>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     switch (offs)	       {		case 1:		  *(data+(int)alt)=(unsigned char)pri;		  break;		case 2:		  *(unsigned short *)(data+(int)alt)=(unsigned short)pri;		  break;		case 4:		  *(unsigned int *)(data+(int)alt)=(unsigned int)pri;		  break;		default:		  ABORT(ep,EMBRYO_ERROR_INVINSTR);		  break;	       } /* switch */	     break;	   case EMBRYO_OP_LIDX:	     offs=pri*sizeof(Embryo_Cell)+alt;	     /* verify address */	     if (offs>=hea && offs<stk || (Embryo_UCell)offs>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     pri= * (Embryo_Cell *)(data+(int)offs);	     break;	   case EMBRYO_OP_LIDX_B:	     GETPARAM(offs);	     offs=(pri << (int)offs)+alt;	     /* verify address */	     if (offs>=hea && offs<stk || (Embryo_UCell)offs>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     pri= * (Embryo_Cell *)(data+(int)offs);	     break;	   case EMBRYO_OP_IDXADDR:	     pri=pri*sizeof(Embryo_Cell)+alt;	     break;	   case EMBRYO_OP_IDXADDR_B:	     GETPARAM(offs);	     pri=(pri << (int)offs)+alt;	     break;	   case EMBRYO_OP_ALIGN_PRI:	     GETPARAM(offs);#ifdef WORDS_BIGENDIAN	     if ((size_t)offs<sizeof(Embryo_Cell))	       pri ^= sizeof(Embryo_Cell)-offs;#endif       	     break;	   case EMBRYO_OP_ALIGN_ALT:	     GETPARAM(offs);#ifdef WORDS_BIGENDIAN	     if ((size_t)offs<sizeof(Embryo_Cell))	       alt ^= sizeof(Embryo_Cell)-offs;#endif       	     break;	   case EMBRYO_OP_LCTRL:	     GETPARAM(offs);	     switch (offs)	       {		case 0:		  pri=hdr->cod;		  break;		case 1:		  pri=hdr->dat;		  break;		case 2:		  pri=hea;		  break;		case 3:		  pri=ep->stp;		  break;		case 4:		  pri=stk;		  break;		case 5:		  pri=frm;		  break;		case 6:		  pri=(Embryo_Cell)((unsigned char *)cip - code);		  break;		default:		  ABORT(ep,EMBRYO_ERROR_INVINSTR);		  break;	       }	     break;	   case EMBRYO_OP_SCTRL:	     GETPARAM(offs);	     switch (offs)	       {		case 0:		case 1:		case 2:		  hea=pri;		  break;		case 3:		  /* cannot change these parameters */		  break;		case 4:		  stk=pri;		  break;		case 5:		  frm=pri;		  break;		case 6:		  cip=(Embryo_Cell *)(code + (int)pri);		  break;		default:		  ABORT(ep,EMBRYO_ERROR_INVINSTR);		  break;	       }	     break;	   case EMBRYO_OP_MOVE_PRI:	     pri=alt;	     break;	   case EMBRYO_OP_MOVE_ALT:	     alt=pri;	     break;	   case EMBRYO_OP_XCHG:	     offs=pri;         /* offs is a temporary variable */	     pri=alt;	     alt=offs;	     break;	   case EMBRYO_OP_PUSH_PRI:	     PUSH(pri);	     break;	   case EMBRYO_OP_PUSH_ALT:	     PUSH(alt);	     break;	   case EMBRYO_OP_PUSH_C:	     GETPARAM(offs);	     PUSH(offs);	     break;	   case EMBRYO_OP_PUSH_R:	     GETPARAM(offs);	     while (offs--)	       PUSH(pri);	     break;	   case EMBRYO_OP_PUSH:	     GETPARAM(offs);	     PUSH(* (Embryo_Cell *)(data+(int)offs));	     break;	   case EMBRYO_OP_PUSH_S:	     GETPARAM(offs);	     PUSH(* (Embryo_Cell *)(data+(int)frm+(int)offs));	     break;	   case EMBRYO_OP_POP_PRI:	     POP(pri);	     break;	   case EMBRYO_OP_POP_ALT:	     POP(alt);	     break;	   case EMBRYO_OP_STACK:	     GETPARAM(offs);	     alt=stk;	     stk+=offs;	     CHKMARGIN();	     CHKSTACK();	     break;	   case EMBRYO_OP_HEAP:	     GETPARAM(offs);	     alt=hea;	     hea+=offs;	     CHKMARGIN();	     CHKHEAP();	     break;	   case EMBRYO_OP_PROC:	     PUSH(frm);	     frm=stk;	     CHKMARGIN();	     break;	   case EMBRYO_OP_RET:	     POP(frm);	     POP(offs);	     /* verify the return address */	     if ((Embryo_UCell)offs>=codesize)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     cip=(Embryo_Cell *)(code+(int)offs);	     break;	   case EMBRYO_OP_RETN:	     POP(frm);	     POP(offs);	     /* verify the return address */	     if ((Embryo_UCell)offs>=codesize)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     cip=(Embryo_Cell *)(code+(int)offs);	     stk+= *(Embryo_Cell *)(data+(int)stk) + sizeof(Embryo_Cell); /* remove parameters from the stack */	     ep->stk=stk;	     break;	   case EMBRYO_OP_CALL:	     PUSH(((unsigned char *)cip-code)+sizeof(Embryo_Cell));/* skip address */	     cip=JUMPABS(code, cip);                   /* jump to the address */	     break;	   case EMBRYO_OP_CALL_PRI:	     PUSH((unsigned char *)cip-code);	     cip=(Embryo_Cell *)(code+(int)pri);	   break;	   case EMBRYO_OP_JUMP:	     /* since the GETPARAM() macro modifies cip, you cannot	      * do GETPARAM(cip) directly */	     cip=JUMPABS(code, cip);	     break;	   case EMBRYO_OP_JREL:	     offs=*cip;	     cip=(Embryo_Cell *)((unsigned char *)cip + (int)offs + sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JZER:	     if (pri==0)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JNZ:	     if (pri!=0)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JEQ:	     if (pri==alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JNEQ:	     if (pri!=alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JLESS:	     if ((Embryo_UCell)pri < (Embryo_UCell)alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JLEQ:	     if ((Embryo_UCell)pri <= (Embryo_UCell)alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JGRTR:	     if ((Embryo_UCell)pri > (Embryo_UCell)alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JGEQ:	     if ((Embryo_UCell)pri >= (Embryo_UCell)alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JSLESS:	     if (pri<alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JSLEQ:	     if (pri<=alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JSGRTR:	     if (pri>alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_JSGEQ:	     if (pri>=alt)	       cip=JUMPABS(code, cip);	     else	       cip=(Embryo_Cell *)((unsigned char *)cip+sizeof(Embryo_Cell));	     break;	   case EMBRYO_OP_SHL:	     pri<<=alt;	     break;	   case EMBRYO_OP_SHR:	     pri=(Embryo_UCell)pri >> (int)alt;	     break;	   case EMBRYO_OP_SSHR:	     pri>>=alt;	     break;	   case EMBRYO_OP_SHL_C_PRI:	     GETPARAM(offs);	     pri<<=offs;	     break;	   case EMBRYO_OP_SHL_C_ALT:	     GETPARAM(offs);	     alt<<=offs;	     break;	   case EMBRYO_OP_SHR_C_PRI:	     GETPARAM(offs);	     pri=(Embryo_UCell)pri >> (int)offs;	     break;	   case EMBRYO_OP_SHR_C_ALT:	     GETPARAM(offs);	     alt=(Embryo_UCell)alt >> (int)offs;	     break;	   case EMBRYO_OP_SMUL:	     pri*=alt;	     break;	   case EMBRYO_OP_SDIV:	     if (alt==0)	       ABORT(ep,EMBRYO_ERROR_DIVIDE);	     /* divide must always round down; this is a bit	      * involved to do in a machine-independent way.	      */	     offs=(pri % alt + alt) % alt;     /* true modulus */	     pri=(pri - offs) / alt;           /* division result */	     alt=offs;	     break;	   case EMBRYO_OP_SDIV_ALT:	     if (pri==0)	       ABORT(ep,EMBRYO_ERROR_DIVIDE);	     /* divide must always round down; this is a bit	      * involved to do in a machine-independent way.	      */	     offs=(alt % pri + pri) % pri;     /* true modulus */	     pri=(alt - offs) / pri;           /* division result */	     alt=offs;	     break;	   case EMBRYO_OP_UMUL:	     pri=(Embryo_UCell)pri * (Embryo_UCell)alt;	     break;	   case EMBRYO_OP_UDIV:	     if (alt==0)	       ABORT(ep,EMBRYO_ERROR_DIVIDE);	     offs=(Embryo_UCell)pri % (Embryo_UCell)alt;     /* temporary storage */	     pri=(Embryo_UCell)pri / (Embryo_UCell)alt;	     alt=offs;	     break;	   case EMBRYO_OP_UDIV_ALT:	     if (pri==0)	       ABORT(ep,EMBRYO_ERROR_DIVIDE);	     offs=(Embryo_UCell)alt % (Embryo_UCell)pri;     /* temporary storage */	     pri=(Embryo_UCell)alt / (Embryo_UCell)pri;	     alt=offs;	     break;	   case EMBRYO_OP_ADD:	     pri+=alt;	     break;	   case EMBRYO_OP_SUB:	     pri-=alt;	     break;	   case EMBRYO_OP_SUB_ALT:	     pri=alt-pri;	     break;	   case EMBRYO_OP_AND:	     pri&=alt;	     break;	   case EMBRYO_OP_OR:	     pri|=alt;	     break;	   case EMBRYO_OP_XOR:	     pri^=alt;	     break;	   case EMBRYO_OP_NOT:	     pri=!pri;	     break;	   case EMBRYO_OP_NEG:	     pri=-pri;	     break;	   case EMBRYO_OP_INVERT:	     pri=~pri;	     break;	   case EMBRYO_OP_ADD_C:	     GETPARAM(offs);	     pri+=offs;	     break;	   case EMBRYO_OP_SMUL_C:	     GETPARAM(offs);	     pri*=offs;	     break;	   case EMBRYO_OP_ZERO_PRI:	     pri=0;	     break;	   case EMBRYO_OP_ZERO_ALT:	     alt=0;	     break;	   case EMBRYO_OP_ZERO:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)offs)=0;	     break;	   case EMBRYO_OP_ZERO_S:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)frm+(int)offs)=0;	     break;	   case EMBRYO_OP_SIGN_PRI:	     if ((pri & 0xff)>=0x80)	       pri|= ~ (Embryo_UCell)0xff;	     break;	   case EMBRYO_OP_SIGN_ALT:	     if ((alt & 0xff)>=0x80)	       alt|= ~ (Embryo_UCell)0xff;	     break;	   case EMBRYO_OP_EQ:	     pri= pri==alt ? 1 : 0;	     break;	   case EMBRYO_OP_NEQ:	     pri= pri!=alt ? 1 : 0;	     break;	   case EMBRYO_OP_LESS:	     pri= (Embryo_UCell)pri < (Embryo_UCell)alt ? 1 : 0;	     break;	   case EMBRYO_OP_LEQ:	   pri= (Embryo_UCell)pri <= (Embryo_UCell)alt ? 1 : 0;	     break;	   case EMBRYO_OP_GRTR:	     pri= (Embryo_UCell)pri > (Embryo_UCell)alt ? 1 : 0;	   break;	   case EMBRYO_OP_GEQ:	     pri= (Embryo_UCell)pri >= (Embryo_UCell)alt ? 1 : 0;	     break;	   case EMBRYO_OP_SLESS:	     pri= pri<alt ? 1 : 0;	     break;	   case EMBRYO_OP_SLEQ:	     pri= pri<=alt ? 1 : 0;	     break;	   case EMBRYO_OP_SGRTR:	     pri= pri>alt ? 1 : 0;	     break;	   case EMBRYO_OP_SGEQ:	     pri= pri>=alt ? 1 : 0;	     break;	   case EMBRYO_OP_EQ_C_PRI:	     GETPARAM(offs);	     pri= pri==offs ? 1 : 0;	     break;	   case EMBRYO_OP_EQ_C_ALT:	     GETPARAM(offs);	     pri= alt==offs ? 1 : 0;	     break;	   case EMBRYO_OP_INC_PRI:	     pri++;	     break;	   case EMBRYO_OP_INC_ALT:	     alt++;	     break;	   case EMBRYO_OP_INC:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)offs) += 1;	     break;	   case EMBRYO_OP_INC_S:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)frm+(int)offs) += 1;	     break;	   case EMBRYO_OP_INC_I:	     *(Embryo_Cell *)(data+(int)pri) += 1;	     break;	   case EMBRYO_OP_DEC_PRI:	     pri--;	     break;	   case EMBRYO_OP_DEC_ALT:	     alt--;	     break;	   case EMBRYO_OP_DEC:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)offs) -= 1;	     break;	   case EMBRYO_OP_DEC_S:	     GETPARAM(offs);	     *(Embryo_Cell *)(data+(int)frm+(int)offs) -= 1;	     break;	   case EMBRYO_OP_DEC_I:	     *(Embryo_Cell *)(data+(int)pri) -= 1;	     break;	   case EMBRYO_OP_MOVS:	     GETPARAM(offs);	     /* verify top & bottom memory addresses, for both source and destination	      * addresses	      */	     if (pri>=hea && pri<stk || (Embryo_UCell)pri>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if ((pri+offs)>hea && (pri+offs)<stk || (Embryo_UCell)(pri+offs)>(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if (alt>=hea && alt<stk || (Embryo_UCell)alt>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if ((alt+offs)>hea && (alt+offs)<stk || (Embryo_UCell)(alt+offs)>(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     memcpy(data+(int)alt, data+(int)pri, (int)offs);	     break;	   case EMBRYO_OP_CMPS:	     GETPARAM(offs);	     /* verify top & bottom memory addresses, for both source and destination	      * addresses	      */	     if (pri>=hea && pri<stk || (Embryo_UCell)pri>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if ((pri+offs)>hea && (pri+offs)<stk || (Embryo_UCell)(pri+offs)>(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if (alt>=hea && alt<stk || (Embryo_UCell)alt>=(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     if ((alt+offs)>hea && (alt+offs)<stk || (Embryo_UCell)(alt+offs)>(Embryo_UCell)ep->stp)	       ABORT(ep,EMBRYO_ERROR_MEMACCESS);	     pri=memcmp(data+(int)alt, data+(int)pri, (int)offs);	     break;	   case EMBRYO_OP_FILL:	     GETPARAM(offs);	     /* verify top & bottom memory addresses (destination only) */	     if (((alt >= hea) && (alt < stk)) || 		 ((Embryo_UCell)alt >= (Embryo_UCell)ep->stp))	       ABORT(ep, EMBRYO_ERROR_MEMACCESS);	     if ((((alt + offs) > hea) && ((alt + offs) < stk)) || 		 ((Embryo_UCell)(alt + offs) > (Embryo_UCell)ep->stp))	       ABORT(ep, EMBRYO_ERROR_MEMACCESS);	     for (i = (int)alt; (size_t)offs >= sizeof(Embryo_Cell); i += sizeof(Embryo_Cell), offs -= sizeof(Embryo_Cell))	       *(Embryo_Cell *)(data + i) = pri;	     break;	   case EMBRYO_OP_HALT:	     GETPARAM(offs);	     ep->retval = pri;	     /* store complete status */	     ep->frm = frm;	     ep->stk = stk;	     ep->hea = hea;	     ep->pri = pri;	     ep->alt = alt;	     ep->cip = (Embryo_Cell)((unsigned char*)cip - code);	     if (offs == EMBRYO_ERROR_SLEEP)	       {		  ep->reset_stk = reset_stk;		  ep->reset_hea = reset_hea;		  ep->run_count--;		  return EMBRYO_PROGRAM_SLEEP;	       }	     OK(ep, (int)offs);	   case EMBRYO_OP_BOUNDS:	     GETPARAM(offs);	     if ((Embryo_UCell)pri > (Embryo_UCell)offs)	       ABORT(ep, EMBRYO_ERROR_BOUNDS);	     break;	   case EMBRYO_OP_SYSREQ_PRI:	     /* save a few registers */	     ep->cip = (Embryo_Cell)((unsigned char *)cip - code);	     ep->hea = hea;	     ep->frm = frm;	     ep->stk = stk;	     num = _embryo_native_call(ep, pri, &pri, (Embryo_Cell *)(data + (int)stk));	     if (num != EMBRYO_ERROR_NONE)	       {		  if (num == EMBRYO_ERROR_SLEEP)		    {		       ep->pri = pri;		       ep->alt = alt;		       ep->reset_stk = reset_stk;		       ep->reset_hea = reset_hea;		       ep->run_count--;		       return EMBRYO_PROGRAM_SLEEP;		    }		  ABORT(ep, num);	       }	     break;	   case EMBRYO_OP_SYSREQ_C:	     GETPARAM(offs);	     /* save a few registers */	     ep->cip = (Embryo_Cell)((unsigned char *)cip - code);	     ep->hea = hea;	     ep->frm = frm;	     ep->stk = stk;	     num = _embryo_native_call(ep, offs, &pri, (Embryo_Cell *)(data + (int)stk));	     if (num != EMBRYO_ERROR_NONE)	       {		  if (num == EMBRYO_ERROR_SLEEP)		    {		       ep->pri = pri;		       ep->alt = alt;		       ep->reset_stk = reset_stk;		       ep->reset_hea = reset_hea;		       ep->run_count--;		       return EMBRYO_PROGRAM_SLEEP;		    }		  ABORT(ep, num);	       }	     break;	   case EMBRYO_OP_SYSREQ_D:	     GETPARAM(offs);	     /* save a few registers */	     ep->cip = (Embryo_Cell)((unsigned char *)cip - code);	     ep->hea = hea;	     ep->frm = frm;	     ep->stk = stk;	     pri = ((Embryo_Native)offs)(ep, (Embryo_Cell *)(data + (int)stk));	     if (ep->error != EMBRYO_ERROR_NONE)	       {		  if (ep->error == EMBRYO_ERROR_SLEEP)		    {		       ep->pri = pri;		       ep->alt = alt;		       ep->reset_stk = reset_stk;		       ep->reset_hea = reset_hea;		       ep->run_count--;		       return EMBRYO_PROGRAM_SLEEP;		    }		  ABORT(ep, ep->error);	       }	     break;	   case EMBRYO_OP_JUMP_PRI:	     cip = (Embryo_Cell *)(code + (int)pri);	     break;	   case EMBRYO_OP_SWITCH:	       {		  Embryo_Cell *cptr;		  		  cptr = (Embryo_Cell *)*cip + 1; /* +1, to skip the "casetbl" opcode */		  cip = (Embryo_Cell *)*(cptr + 1); /* preset to "none-matched" case */		  num = (int)*cptr; /* number of records in the case table */		  for (cptr += 2; (num > 0) && (*cptr != pri); num--, cptr += 2);		  if (num > 0) cip = (Embryo_Cell *)*(cptr + 1); /* case found */	       }	     break;	   case EMBRYO_OP_SWAP_PRI:	     offs = *(Embryo_Cell *)(data + (int)stk);	     *(Embryo_Cell *)(data + (int)stk) = pri;	     pri = offs;	     break;	   case EMBRYO_OP_SWAP_ALT:	     offs = *(Embryo_Cell *)(data + (int)stk);	     *(Embryo_Cell *)(data + (int)stk) = alt;	     alt = offs;	     break;	   case EMBRYO_OP_PUSHADDR:	     GETPARAM(offs);	     PUSH(frm + offs);	     break;	   case EMBRYO_OP_NOP:	     break;	   default:	     ABORT(ep, EMBRYO_ERROR_INVINSTR);	  }     }   ep->run_count--;   return EMBRYO_PROGRAM_OK;}