515 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			515 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Sources of the "BRANCH" group instructions
 | 
						|
 */
 | 
						|
 | 
						|
/* $Header$ */
 | 
						|
 | 
						|
#include	<em_abs.h>
 | 
						|
#include	"global.h"
 | 
						|
#include	"log.h"
 | 
						|
#include	"mem.h"
 | 
						|
#include	"trap.h"
 | 
						|
#include	"text.h"
 | 
						|
#include	"fra.h"
 | 
						|
#include	"warn.h"
 | 
						|
 | 
						|
/*	Note that in the EM assembly language brach instructions have
 | 
						|
	lables as their arguments, where in the EM machine language they
 | 
						|
	have (relative) offsets as parameters.  This is not described in the
 | 
						|
	EM manual but follows from the Pascal interpreter.
 | 
						|
*/
 | 
						|
 | 
						|
#define	do_jump(j)	{ newPC(PC + (j)); }
 | 
						|
 | 
						|
DoBRAl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BRA b: Branch unconditionally to label b */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoBRAl2(%ld)", jump));
 | 
						|
	do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBRAl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BRA b: Branch unconditionally to label b */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoBRAl4(%ld)", jump));
 | 
						|
	do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBRAs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BRA b: Branch unconditionally to label b */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoBRAs(%ld)", jump));
 | 
						|
	do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLTl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BLT b: Branch less (pop 2 words, branch if top > second) */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLTl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLTl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BLT b: Branch less (pop 2 words, branch if top > second) */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLTl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLTs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BLT b: Branch less (pop 2 words, branch if top > second) */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLTs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BLE b: Branch less or equal */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BLE b: Branch less or equal */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBLEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BLE b: Branch less or equal */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBLEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBEQl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BEQ b: Branch equal */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBEQl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t == wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBEQl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BEQ b: Branch equal */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBEQl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t == wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBEQs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BEQ b: Branch equal */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBEQs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t == wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBNEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BNE b: Branch not equal */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBNEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t != wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBNEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BNE b: Branch not equal */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBNEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t != wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBNEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BNE b: Branch not equal */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBNEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (t != wpop())
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BGE b: Branch greater or equal */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BGE b: Branch greater or equal */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BGE b: Branch greater or equal */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGTl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BGT b: Branch greater */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGTl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGTl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* BGT b: Branch greater */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGTl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoBGTs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* BGT b: Branch greater */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
	register long t = wpop();
 | 
						|
 | 
						|
	LOG(("@B6 DoBGTs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > t)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLTl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZLT b: Branch less than zero (pop 1 word, branch negative) */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLTl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLTl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZLT b: Branch less than zero (pop 1 word, branch negative) */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLTl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLTs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZLT b: Branch less than zero (pop 1 word, branch negative) */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLTs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() < 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZLE b: Branch less or equal to zero */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZLE b: Branch less or equal to zero */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZLEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZLE b: Branch less or equal to zero */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZLEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() <= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZEQl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZEQ b: Branch equal zero */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZEQl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() == 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZEQl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZEQ b: Branch equal zero */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZEQl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() == 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZEQs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZEQ b: Branch equal zero */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZEQs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() == 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZNEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZNE b: Branch not zero */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZNEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() != 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZNEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZNE b: Branch not zero */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZNEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() != 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZNEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZNE b: Branch not zero */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZNEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() != 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGEl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZGE b: Branch greater or equal zero */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGEl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGEl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZGE b: Branch greater or equal zero */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGEl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGEs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZGE b: Branch greater or equal zero */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGEs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() >= 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGTl2(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZGT b: Branch greater than zero */
 | 
						|
	register long jump = (L_arg_2() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGTl2(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGTl4(arg)
 | 
						|
	long arg;
 | 
						|
{
 | 
						|
	/* ZGT b: Branch greater than zero */
 | 
						|
	register long jump = (L_arg_4() * arg);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGTl4(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 | 
						|
 | 
						|
DoZGTs(hob, wfac)
 | 
						|
	long hob;
 | 
						|
	size wfac;
 | 
						|
{
 | 
						|
	/* ZGT b: Branch greater than zero */
 | 
						|
	register long jump = (S_arg(hob) * wfac);
 | 
						|
 | 
						|
	LOG(("@B6 DoZGTs(%ld)", jump));
 | 
						|
	spoilFRA();
 | 
						|
	if (wpop() > 0)
 | 
						|
		do_jump(arg_c(jump));
 | 
						|
}
 |