46 lines
		
	
	
	
		
			895 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			895 B
		
	
	
	
		
			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$"
 | |
| 
 | |
| /*
 | |
|  * Motorola 6800 special routines
 | |
|  */
 | |
| 
 | |
| branch(opc,exp) register opc; expr_t exp; {
 | |
| 	register sm, dist;
 | |
| 	int saving;
 | |
| 
 | |
| 	dist = exp.val - (DOTVAL + 2);
 | |
| 	if (pass == PASS_2 && dist > 0 && !(exp.typ & S_DOT))
 | |
| 		dist -= DOTGAIN;
 | |
| 	sm = fitb(dist);
 | |
| 	if ((exp.typ & ~S_DOT) != DOTTYP)
 | |
| 		sm = 0;
 | |
| 	if (opc == 0x8D || opc == 0x20)
 | |
| 		saving = 1;
 | |
| 	else
 | |
| 		saving = 3;
 | |
| 	if (small(sm,saving)) {
 | |
| 		emit1(opc);
 | |
| 		emit1(dist);
 | |
| 	} else {
 | |
| 		if (opc == 0x8D)		/* bsr */
 | |
| 			emit1(0xBD);		/* jsr */
 | |
| 		else {
 | |
| 			if (opc != 0x20) {	/* bra */
 | |
| 
 | |
| 					/* reverse condition : */
 | |
| 
 | |
| 				emit1(opc ^ 1);
 | |
| 				emit1(3);
 | |
| 			}
 | |
| 			emit1(0x7E);		/* jmp */
 | |
| 		}
 | |
| #ifdef RELOCATION
 | |
| 		newrelo(exp.typ, RELO2 | RELBR);
 | |
| #endif
 | |
| 		emit2(exp.val);
 | |
| 	}
 | |
| }
 |