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;
28 struct expr e, e1, e2;
42 /* ACALL or AJMP. In Flat24 mode, this is a
43 * 19 bit destination; in 8051 mode, this is a
46 * The opcode is merged with the address in a
47 * hack-o-matic fashion by the linker.
52 outr19(&e, op, R_J19);
56 outr11(&e, op, R_J11);
61 /* LCALL or LJMP. In Flat24 mode, this is a 24 bit
62 * destination; in 8051 mode, this is a 16 bit
85 /* A, direct, @R0, @R1, R0 to R7. "INC" also allows DPTR */
95 /* Direct is also legal */
101 outab(op + 6 + e.e_addr);
105 outab(op + 8 + e.e_addr);
110 /* only INC (op=0) has DPTR mode */
122 /* A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
142 outab(op + 6 + e1.e_addr);
146 outab(op + 8 + (e1.e_addr));
156 * A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7
157 * C,direct; C,/direct
196 outab(op + 6 + e1.e_addr);
200 outab(op + 8 + e1.e_addr);
209 /* XRL has no boolean version. Trap it */
236 /* A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
251 outab(op + 6 + e1.e_addr);
255 outab(op + 8 + e1.e_addr);
263 /* MOV instruction, all modes */
284 outab(0xE6 + e1.e_addr);
288 outab(0xE8 + e1.e_addr);
299 outab(0xF8 + e.e_addr);
303 outab(0x78 + e.e_addr);
309 outab(0xA8 + e.e_addr);
340 outab(0x86 + e1.e_addr);
345 outab(0x88 + e1.e_addr);
362 outab(0x76 + e.e_addr);
368 outab(0xA6 + e.e_addr);
373 outab(0xF6 + e.e_addr);
382 if ((t1 != S_DIR) && (t1 != S_EXT))
393 /* mov DPTR, #immed: for Flat24 mode,
394 * #immed is a 24 bit constant. For 8051,
395 * it is a 16 bit constant.
413 /* Branch on bit set/clear */
415 if ((t != S_DIR) && (t != S_EXT))
421 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
422 v1 = e1.e_addr - dot.s_addr - 1;
423 if (pass==2 && ((v1 < -128) || (v1 > 127)))
429 if (e1.e_mode != S_USER)
434 /* Relative branch */
437 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
438 v1 = e1.e_addr - dot.s_addr - 1;
439 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
445 if (e1.e_mode != S_USER)
450 /* A,#; A,dir; @R0,#; @R1,#; Rn,# */
462 else if ((t1 == S_DIR) || (t1 == S_EXT)) {
471 outab(op + 6 + e.e_addr);
478 outab(op + 8 + e.e_addr);
488 /* branch destination */
489 if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
490 v1 = e2.e_addr - dot.s_addr - 1;
491 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
497 if (e2.e_mode != S_USER)
502 /* Dir,dest; Reg,dest */
515 outab(op + 8 + e.e_addr);
522 /* branch destination */
523 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
524 v1 = e1.e_addr - dot.s_addr - 1;
525 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
531 if (e1.e_mode != S_USER)
544 /* A,@A+DPTR A,@A+PC */
552 else if (t1 == S_AT_APC)
559 /* A,@DPTR A,@R0 A,@R1 @DPTR,A @R0,A @R1,A */
571 outab(0xE2 + e1.e_addr);
587 outab(0xF2 + e.e_addr);
605 /* CLR or CPL: A, C, or bit */
653 if ((t != S_DIR) && (t != S_EXT)) {
670 outab(op + e1.e_addr);
683 * Is the next character a comma ?
694 * Machine specific initialization
699 static int beenHere=0; /* set non-zero if we have done that... */
703 /* First time only, add the pre-defined symbols to the symbol table*/
708 if (sp->s_type == S_NEW) {
709 sp->s_addr = pd->value;