123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /*
- * (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
- 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);
- }
|