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 * Extensions: P. Felber
28 char imtab[3] = { 0x46, 0x56, 0x5E };
34 * Process a machine op.
40 register int op, t1, t2;
49 if (!hd64 && rf>X_HD64)
67 if ((v1 = admode(CND)) != 0) {
82 if ((v1 = admode(R16)) != 0 && (v1 &= 0xFF) != SP) {
83 if (v1 != gixiy(v1)) {
110 outab(imtab[e1.e_addr]);
125 if (genop(0xCB, op, &e2, 0) || t1)
133 if ((t2 != S_R8) || (e2.e_addr != A))
139 if (genop(0xCB, op, &e2, 0) || t1)
148 if ((t2 != S_R8) || (e2.e_addr != A))
154 if (genop(0, op, &e2, 1) || t1)
168 if (genop(0, op, &e1, 1))
172 if ((t1 == S_R8) && (e1.e_addr == A)) {
173 if (genop(0, op, &e2, 1))
177 if ((t1 == S_R16) && (t2 == S_R16)) {
187 if ((v1 == HL) && (v2 <= SP)) {
197 if ((v1 == IX) && (v2 != HL) && (v2 != IY)) {
204 if ((v1 == IY) && (v2 != HL) && (v2 != IX)) {
215 if ((v1 == HL) && (v2 <= SP) && (rf == S_ADD)) {
216 outab(0x09 | (v2<<4));
223 if ((rf == S_ADD) && (t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_IMMED)) {
237 v1 = op | e1.e_addr<<3;
238 if (genop(0, v1, &e2, 0) == 0)
241 outab(e1.e_addr<<3 | 0x06);
248 if ((t1 == S_R16) && (t2 == S_IMMED)) {
255 if ((t1 == S_R16) && (t2 == S_INDM)) {
256 if (gixiy(v1) == HL) {
265 if ((t1 == S_INDM) && (t2 == S_R16)) {
266 if (gixiy(v2) == HL) {
275 if ((t1 == S_R8) && (v1 == A) && (t2 == S_INDM)) {
280 if ((t1 == S_INDM) && (t2 == S_R8) && (v2 == A)) {
286 if ((t2 == S_R8) && (gixiy(t1) == S_IDHL)) {
292 if ((t2 == S_IMMED) && (gixiy(t1) == S_IDHL)) {
300 if ((t1 == S_R8X) && (t2 == S_R8) && (v2 == A)) {
305 if ((t1 == S_R8) && (v1 == A) && (t2 == S_R8X)) {
311 if ((t1 == S_R16) && (v1 == SP)) {
312 if ((t2 == S_R16) && (gixiy(v2) == HL)) {
317 if ((t1 == S_R8) && (v1 == A)) {
318 if ((t2 == S_IDBC) || (t2 == S_IDDE)) {
319 outab(0x0A | (t2-S_INDR)<<4);
323 if ((t2 == S_R8) && (v2 == A)) {
324 if ((t1 == S_IDBC) || (t1 == S_IDDE)) {
325 outab(0x02 | (t1-S_INDR)<<4);
333 if ((t1 == S_INDM) && (t2 == S_R16) && (v2 == SP)) {
342 if ((t1 == S_INDM) && (t2 == S_R8) && (v2 == A)) {
347 if ((t2 == S_INDM) && (t1 == S_R8) && (v1 == A)) {
356 if ((t1 == S_R8) && (v1 == A) && (t2 == S_IDHLD)) {
360 if ((t2 == S_R8) && (v2 == A) && (t1 == S_IDHLD)) {
368 if ((t1 == S_R8) && (v1 == A) && (t2 == S_IDHLI)) {
372 if ((t2 == S_R8) && (v2 == A) && (t1 == S_IDHLI)) {
382 case S_STOP: /* 0x10 */
391 case S_LDH: /* 0xE0 */
393 * 0xE0 : LDH (n),A = LD ($FF00+n),A
394 * 0xE2 : LDH (C),A = LD ($FF00+C),A
395 * 0xF0 : LDH A,(n) = LD A,($FF00+n)
396 * 0xF2 : LDH A,(C) = LD A,($FF00+C)
401 if ((t1 == S_INDM) && (t2 == S_R8) && (e2.e_addr == A)) {
406 if ((t1 == S_IDC) && (t2 == S_R8) && (e2.e_addr == A)) {
410 if ((t2 == S_INDM) && (t1 == S_R8) && (e1.e_addr == A)) {
415 if ((t2 == S_IDC) && (t1 == S_R8) && (e1.e_addr == A)) {
423 case S_LDA: /* 0xE8 */
425 * 0xE8 : LDA SP,#n(SP)
426 * 0xF8 : LDA HL,#n(SP)
431 if ((t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_INDR+SP)) {
436 if ((t1 == S_R16) && (e1.e_addr == HL) && (t2 == S_INDR+SP)) {
445 case S_LDHL: /* 0xF8 */
452 if ((t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_IMMED)) {
470 if ((t1 == S_IDSP) && (v1 == 0)) {
471 if (gixiy(v2) == HL) {
477 if ((v1 == DE) && (v2 == HL)) {
483 if ((t1 == S_R16X) && (t2 == S_R16X)) {
504 if ((v1 == A) && (t2 == S_INDM)) {
511 outab(((rf == S_IN) ? 0x40 : 0x41) + (v1<<3));
531 if (t1 != gixiy(t1)) {
553 if ((v1 = admode(CND)) != 0 && rf != S_DJNZ) {
554 if ((v1 &= 0xFF) <= 0x03) {
563 if ((v1 = admode(CND)) != 0) {
564 if ((v1 &= 0xFF) <= 0x18) {
574 if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
575 v2 = e2.e_addr - dot.s_addr - 1;
576 if (pass == 2 && ((v2 < -128) || (v2 > 127)))
582 if (e2.e_mode != S_USER)
587 if ((v1 = admode(CND)) != 0) {
599 if ((v1 = admode(CND)) != 0) {
613 if ((e1.e_addr == 0) && (gixiy(t1) == S_IDHL)) {
641 if ((t1 == S_R8) && (t2 == S_INDM)) {
643 outab(op | e1.e_addr<<3);
652 if ((t1 == S_R16) && ((v1 = e1.e_addr) <= SP)) {
664 outab(op | e1.e_addr<<3);
699 * general addressing evaluation
700 * return(0) if general addressing mode output, else
701 * return(esp->e_mode)
704 genop(pop, op, esp, f)
705 register int pop, op;
706 register struct expr *esp;
710 if ((t1 = esp->e_mode) == S_R8) {
713 outab(op|esp->e_addr);
722 if (gixiy(t1) == S_IDHL) {
733 if ((t1 == S_IMMED) && (f)) {
744 * IX and IY prebyte check
754 } else if (v == IY) {
757 } else if (v == S_IDIX) {
760 } else if (v == S_IDIY) {
769 * The next character must be a
781 * Machine dependent initialization