4 * (C) Copyright 1989,1990
11 * 28-Oct-97 Ported from 8085 to 8051 by John Hartman
19 extern int addr(struct expr *);
21 * Process machine ops.
28 register int t, t1, v1;
42 /* 11 bit destination. Top 3 bits become the MSBs of
46 outr11(&e, op, R_J11);
63 /* A, direct, @R0, @R1, R0 to R7. "INC" also allows DPTR */
73 /* Direct is also legal */
79 outab(op + 6 + e.e_addr);
83 outab(op + 8 + e.e_addr);
88 /* only INC (op=0) has DPTR mode */
100 /* A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
120 outab(op + 6 + e1.e_addr);
124 outab(op + 8 + (e1.e_addr));
134 * A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7
135 * C,direct; C,/direct
174 outab(op + 6 + e1.e_addr);
178 outab(op + 8 + e1.e_addr);
187 /* XRL has no boolean version. Trap it */
214 /* A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
229 outab(op + 6 + e1.e_addr);
233 outab(op + 8 + e1.e_addr);
241 /* MOV instruction, all modes */
262 outab(0xE6 + e1.e_addr);
266 outab(0xE8 + e1.e_addr);
277 outab(0xF8 + e.e_addr);
281 outab(0x78 + e.e_addr);
287 outab(0xA8 + e.e_addr);
318 outab(0x86 + e1.e_addr);
323 outab(0x88 + e1.e_addr);
340 outab(0x76 + e.e_addr);
346 outab(0xA6 + e.e_addr);
351 outab(0xF6 + e.e_addr);
360 if ((t1 != S_DIR) && (t1 != S_EXT))
379 /* Branch on bit set/clear */
381 if ((t != S_DIR) && (t != S_EXT))
388 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
389 if ( e1.e_addr == dot.s_addr)
392 v1 = e1.e_addr - dot.s_addr - 1;
393 /* if ((v1 < -128) || (v1 > 127))
399 if (e1.e_mode != S_USER)
404 /* Relative branch */
407 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
408 if ( e1.e_addr == dot.s_addr)
411 v1 = e1.e_addr - dot.s_addr - 1;
412 /* if ((v1 < -128) || (v1 > 127))
418 if (e1.e_mode != S_USER)
423 /* A,#; A,dir; @R0,#; @R1,#; Rn,# */
433 else if ((t1 == S_DIR) || (t1 == S_EXT)) {
442 outab(op + 6 + e.e_addr);
449 outab(op + 8 + e.e_addr);
459 /* branch destination */
462 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
463 if ( e1.e_addr == dot.s_addr)
466 v1 = e1.e_addr - dot.s_addr - 1;
467 /* if ((v1 < -128) || (v1 > 127))
473 if (e1.e_mode != S_USER)
478 /* Dir,dest; Reg,dest */
489 outab(op + 8 + e.e_addr);
496 /* branch destination */
499 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
500 if ( e1.e_addr == dot.s_addr)
503 v1 = e1.e_addr - dot.s_addr - 1;
504 /* if ((v1 < -128) || (v1 > 127))
510 if (e1.e_mode != S_USER)
523 /* A,@A+DPTR A,@A+PC */
531 else if (t1 == S_AT_APC)
538 /* A,@DPTR A,@R0 A,@R1 @DPTR,A @R0,A @R1,A */
550 outab(0xE2 + e1.e_addr);
566 outab(0xF2 + e.e_addr);
579 if (t != S_RAB) aerr();
583 /* CLR or CPL: A, C, or bit */
631 if ((t != S_DIR) && (t != S_EXT)) {
648 outab(op + e1.e_addr);
661 * Is the next character a comma ?
672 * Machine specific initialization
677 static int beenHere=0; /* set non-zero if we have done that... */
681 /* First time only, add the pe-defined symbols to the symbol table*/
686 if (sp->s_type == S_NEW) {
687 sp->s_addr = pd->value;