ack/util/int/do_sets.c
1989-11-22 13:38:37 +00:00

138 lines
2.7 KiB
C

/*
* Sources of the "SETS" group instructions
*/
/* $Header$ */
#include <em_abs.h>
#include "global.h"
#include "log.h"
#include "trap.h"
#include "mem.h"
#include "text.h"
#include "fra.h"
PRIVATE bit_test(), create_set();
DoINNl2(arg)
size arg;
{
/* INN w: Bit test on w byte set (bit number on top of stack) */
register size l = (L_arg_2() * arg);
LOG(("@Y6 DoINNl2(%ld)", l));
spoilFRA();
bit_test(arg_w(l));
}
DoINNs(hob, wfac)
long hob;
size wfac;
{
/* INN w: Bit test on w byte set (bit number on top of stack) */
register size l = (S_arg(hob) * wfac);
LOG(("@Y6 DoINNs(%ld)", l));
spoilFRA();
bit_test(arg_w(l));
}
DoINNz()
{
/* INN w: Bit test on w byte set (bit number on top of stack) */
register size l = uwpop();
LOG(("@Y6 DoINNz(%ld)", l));
spoilFRA();
bit_test(arg_w(l));
}
DoSETl2(arg)
size arg;
{
/* SET w: Create singleton w byte set with bit n on (n is top of stack) */
register size l = (L_arg_2() * arg);
LOG(("@Y6 DoSETl2(%ld)", l));
spoilFRA();
create_set(arg_w(l));
}
DoSETs(hob, wfac)
long hob;
size wfac;
{
/* SET w: Create singleton w byte set with bit n on (n is top of stack) */
register size l = (S_arg(hob) * wfac);
LOG(("@Y6 DoSETs(%ld)", l));
spoilFRA();
create_set(arg_w(l));
}
DoSETz()
{
/* SET w: Create singleton w byte set with bit n on (n is top of stack) */
register size l = uwpop();
LOG(("@Y6 DoSETz(%ld)", l));
spoilFRA();
create_set(arg_w(l));
}
/********************************************************
* bit testing *
* *
* Tests whether the bit with number to be found *
* on TOS is on in 'w'-byte set. *
* ON --> push 1 on stack. *
* OFF -> push 0 on stack. *
********************************************************/
PRIVATE bit_test(w)
size w;
{
register int bitno =
(int) swpop(); /* bitno on TOS */
register char test_byte = (char) 0;/* default value to be tested */
if (must_test && !(IgnMask&BIT(ESET))) {
/* Only w<<3 bytes CAN be tested */
if (bitno > (int) ((w << 3) - 1)) {
trap(ESET);
}
}
test_byte = stack_loc(SP + (bitno >> 3));
st_dec(w);
wpush((long)((test_byte & BIT(bitno & 7)) ? 1 : 0));
}
/********************************************************
* set creation *
* *
* Creates a singleton 'w'-byte set with as *
* singleton member, the bit with number on *
* TOS. The w bytes constituting the set are *
* pushed on the stack. *
********************************************************/
PRIVATE create_set(w)
size w;
{
register int bitno = (int) swpop();
register size nbytes = w;
st_inc(nbytes);
while (--nbytes >= 0) {
st_stn(SP + nbytes, 0L, 1L);
}
if (must_test && !(IgnMask&BIT(ESET))) {
if (bitno > (int) ((w << 3) - 1)) {
trap(ESET);
}
}
st_stn(SP + (bitno >> 3), (long)BIT(bitno & 7), 1L);
}