90 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			1.6 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 "$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);
 | |
| }
 |