ack/mach/s2650/as/mach5.c

91 lines
1.6 KiB
C
Raw Normal View History

1987-03-09 19:15:41 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1985-06-10 16:57:01 +00:00
#define RCSID5 "$Header$"
/*
* Signetics 2650 special routines
*/
#define MASK 0x6000
#define MASK1 0x1FFF
#define MASK2 0x1FFE
page()
{
if(((DOTVAL - 1) & MASK1) == MASK1)
serror("page violation");
}
pag2()
{
if(((DOTVAL - 1) & MASK1) >= MASK2)
serror("page violation");
}
rela(exp,ind)
expr_t exp;
int ind;
{
int c, d;
page();
if(pass == PASS_3){
#ifdef ASLD
if((DOTVAL & MASK) != (exp.val & MASK))
serror("relative address outside page");
#endif
d = low13(DOTVAL);
c = low13(exp.val);
#ifdef ASLD
/*
* I (Duk Bekema) think the next two if's are meant to
* handle wrap around, but the original author didn't give
* any comment here and I don't know anything about the
* Signetics 2650.
*/
if(c - d > 0x1F80)
d |= 0x2000;
if(d - c > 0x1F80)
c |= 0x2000;
#endif
c -= d + 1;
fit(fit7(c));
}
#ifdef RELOCATION
newrelo(exp.typ, RELPC | RELO1);
#endif
emit1(low7(c) | ind);
}
absoa(exp, ix, ind)
expr_t exp;
int ix;
unsigned ind;
{
pag2();
#ifdef ASLD
if(pass == PASS_3 && (exp.val & MASK) != (DOTVAL & MASK))
serror("page violation");
#endif
#ifdef RELOCATION
newrelo(exp.typ, RELO2 | RELBR);
#endif
emit2(low13(exp.val) | ind | ix);
}
absob(exp, ind)
expr_t exp;
unsigned ind;
{
pag2();
#ifdef ASLD
if (exp.val < 0)
serror("branch to nonexistent memory");
#endif
#ifdef RELOCATION
newrelo(exp.typ, RELO2 | RELBR);
#endif
emit2(exp.val | ind);
}