3 Copyright (C) 1989-1995 Alan R. Baldwin
4 721 Berkeley St., Kent, Ohio 44240
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 * 28-Oct-97 Ported from 8085 to 8051 by John Hartman
28 extern int addr(struct expr *);
30 * Process machine ops.
33 machine(struct mne *mp)
36 register int t, t1, v1;
37 struct expr e, e1, e2;
51 /* ACALL or AJMP. In Flat24 mode, this is a
52 * 19 bit destination; in 8051 mode, this is a
55 * The opcode is merged with the address in a
56 * hack-o-matic fashion by the linker.
61 outr19(&e, op, R_J19);
65 outr11(&e, op, R_J11);
70 /* LCALL or LJMP. In Flat24 mode, this is a 24 bit
71 * destination; in 8051 mode, this is a 16 bit
94 /* A, direct, @R0, @R1, R0 to R7. "INC" also allows DPTR */
104 /* Direct is also legal */
110 outab(op + 6 + e.e_addr);
114 outab(op + 8 + e.e_addr);
119 /* only INC (op=0) has DPTR mode */
131 /* A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
151 outab(op + 6 + e1.e_addr);
155 outab(op + 8 + (e1.e_addr));
165 * A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7
166 * C,direct; C,/direct
205 outab(op + 6 + e1.e_addr);
209 outab(op + 8 + e1.e_addr);
218 /* XRL has no boolean version. Trap it */
245 /* A,direct; A,@R0; A,@R1; A,R0 to A,R7 */
260 outab(op + 6 + e1.e_addr);
264 outab(op + 8 + e1.e_addr);
272 /* MOV instruction, all modes */
293 outab(0xE6 + e1.e_addr);
297 outab(0xE8 + e1.e_addr);
308 outab(0xF8 + e.e_addr);
312 outab(0x78 + e.e_addr);
318 outab(0xA8 + e.e_addr);
349 outab(0x86 + e1.e_addr);
354 outab(0x88 + e1.e_addr);
371 outab(0x76 + e.e_addr);
377 outab(0xA6 + e.e_addr);
382 outab(0xF6 + e.e_addr);
391 if ((t1 != S_DIR) && (t1 != S_EXT))
402 /* mov DPTR, #immed: for Flat24 mode,
403 * #immed is a 24 bit constant. For 8051,
404 * it is a 16 bit constant.
422 /* Branch on bit set/clear */
424 if ((t != S_DIR) && (t != S_EXT))
430 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
431 v1 = e1.e_addr - dot.s_addr - 1;
432 if (pass==2 && ((v1 < -128) || (v1 > 127)))
438 if (e1.e_mode != S_USER)
443 /* Relative branch */
446 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
447 v1 = e1.e_addr - dot.s_addr - 1;
448 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
454 if (e1.e_mode != S_USER)
459 /* A,#; A,dir; @R0,#; @R1,#; Rn,# */
471 else if ((t1 == S_DIR) || (t1 == S_EXT)) {
480 outab(op + 6 + e.e_addr);
487 outab(op + 8 + e.e_addr);
497 /* branch destination */
498 if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
499 v1 = e2.e_addr - dot.s_addr - 1;
500 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
506 if (e2.e_mode != S_USER)
511 /* Dir,dest; Reg,dest */
524 outab(op + 8 + e.e_addr);
531 /* branch destination */
532 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
533 v1 = e1.e_addr - dot.s_addr - 1;
534 if (pass == 2 && ((v1 < -128) || (v1 > 127)))
540 if (e1.e_mode != S_USER)
553 /* A,@A+DPTR A,@A+PC */
561 else if (t1 == S_AT_APC)
568 /* A,@DPTR A,@R0 A,@R1 @DPTR,A @R0,A @R1,A */
580 outab(0xE2 + e1.e_addr);
596 outab(0xF2 + e.e_addr);
614 /* CLR or CPL: A, C, or bit */
662 if ((t != S_DIR) && (t != S_EXT)) {
679 outab(op + e1.e_addr);
692 * Is the next character a comma ?
703 * Machine specific initialization
708 static int beenHere=0; /* set non-zero if we have done that... */
712 /* First time only, add the pre-defined symbols to the symbol table*/
717 if (sp->s_type == S_NEW) {
718 sp->s_addr = pd->value;