ack/mach/s2650/as/mach5.c
2019-03-25 00:13:56 +08:00

84 lines
1.5 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
#define RCSID5 "$Id$"
/*
* Signetics 2650 special routines
*/
#define MASK 0x6000
#define MASK1 0x1FFF
#define MASK2 0x1FFE
void page(void)
{
if(((DOTVAL - 1) & MASK1) == MASK1)
serror("page violation");
}
void pag2(void)
{
if(((DOTVAL - 1) & MASK1) >= MASK2)
serror("page violation");
}
void rela(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);
}
void absoa(expr_t exp, int ix, unsigned int 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);
}
void absob(expr_t exp, unsigned int 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);
}