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.
24 machine(struct mne *mp)
27 register int t, t1, v1;
41 /* ACALL or AJMP. In Flat24 mode, this is a
42 * 19 bit destination; in 8051 mode, this is a
45 * The opcode is merged with the address in a
46 * hack-o-matic fashion by the linker.
51 outr19(&e, op, R_J19);
55 outr11(&e, op, R_J11);
60 /* LCALl or LJMP. In Flat24 mode, this is a 24 bit
61 * destination; in 8051 mode, this is a 16 bit
84 /* A, direct, @R0, @R1, R0 to R7. "INC" also allows DPTR */
94 /* Direct is also legal */
100 outab(op + 6 + e.e_addr);
104 outab(op + 8 + e.e_addr);
109 /* only INC (op=0) has DPTR mode */
121 /* A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
141 outab(op + 6 + e1.e_addr);
145 outab(op + 8 + (e1.e_addr));
155 * A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7
156 * C,direct; C,/direct
195 outab(op + 6 + e1.e_addr);
199 outab(op + 8 + e1.e_addr);
208 /* XRL has no boolean version. Trap it */
235 /* A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
250 outab(op + 6 + e1.e_addr);
254 outab(op + 8 + e1.e_addr);
262 /* MOV instruction, all modes */
283 outab(0xE6 + e1.e_addr);
287 outab(0xE8 + e1.e_addr);
298 outab(0xF8 + e.e_addr);
302 outab(0x78 + e.e_addr);
308 outab(0xA8 + e.e_addr);
339 outab(0x86 + e1.e_addr);
344 outab(0x88 + e1.e_addr);
361 outab(0x76 + e.e_addr);
367 outab(0xA6 + e.e_addr);
372 outab(0xF6 + e.e_addr);
381 if ((t1 != S_DIR) && (t1 != S_EXT))
392 /* mov DPTR, #immed: for Flat24 mode,
393 * #immed is a 24 bit constant. For 8051,
394 * it is a 16 bit constant.
412 /* Branch on bit set/clear */
414 if ((t != S_DIR) && (t != S_EXT))
421 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
422 if ( e1.e_addr == dot.s_addr)
425 v1 = e1.e_addr - dot.s_addr - 1;
426 if (pass==2 && ((v1 < -128) || (v1 > 127)))
432 if (e1.e_mode != S_USER)
437 /* Relative branch */
440 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
441 if ( e1.e_addr == dot.s_addr)
444 v1 = e1.e_addr - dot.s_addr - 1;
445 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
451 if (e1.e_mode != S_USER)
456 /* A,#; A,dir; @R0,#; @R1,#; Rn,# */
466 else if ((t1 == S_DIR) || (t1 == S_EXT)) {
475 outab(op + 6 + e.e_addr);
482 outab(op + 8 + e.e_addr);
492 /* branch destination */
495 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
496 if ( e1.e_addr == dot.s_addr)
499 v1 = e1.e_addr - dot.s_addr - 1;
500 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
506 if (e1.e_mode != S_USER)
511 /* Dir,dest; Reg,dest */
523 outab(op + 8 + e.e_addr);
532 /* branch destination */
535 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
536 if ( e1.e_addr != dot.s_addr)
537 v1 = e1.e_addr - dot.s_addr - 1;
538 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
544 if (e1.e_mode != S_USER)
557 /* A,@A+DPTR A,@A+PC */
565 else if (t1 == S_AT_APC)
572 /* A,@DPTR A,@R0 A,@R1 @DPTR,A @R0,A @R1,A */
584 outab(0xE2 + e1.e_addr);
600 outab(0xF2 + e.e_addr);
618 /* CLR or CPL: A, C, or bit */
666 if ((t != S_DIR) && (t != S_EXT)) {
683 outab(op + e1.e_addr);
696 * Is the next character a comma ?
707 * Machine specific initialization
712 static int beenHere=0; /* set non-zero if we have done that... */
716 /* First time only, add the pre-defined symbols to the symbol table*/
721 if (sp->s_type == S_NEW) {
722 sp->s_addr = pd->value;