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))
138 if (genop(0xCB, op, &e2, 0) || t1)
147 if ((t2 != S_R8) || (e2.e_addr != A))
152 if (genop(0, op, &e2, 1) || t1)
166 if (genop(0, op, &e1, 1))
170 if ((t1 == S_R8) && (e1.e_addr == A)) {
171 if (genop(0, op, &e2, 1))
175 if ((t1 == S_R16) && (t2 == S_R16)) {
185 if ((v1 == HL) && (v2 <= SP)) {
195 if ((v1 == IX) && (v2 != HL) && (v2 != IY)) {
202 if ((v1 == IY) && (v2 != HL) && (v2 != IX)) {
213 if ((v1 == HL) && (v2 <= SP) && (rf == S_ADD)) {
214 outab(0x09 | (v2<<4));
221 if ((rf == S_ADD) && (t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_IMMED)) {
235 v1 = op | e1.e_addr<<3;
236 if (genop(0, v1, &e2, 0) == 0)
239 outab(e1.e_addr<<3 | 0x06);
246 if ((t1 == S_R16) && (t2 == S_IMMED)) {
253 if ((t1 == S_R16) && (t2 == S_INDM)) {
254 if (gixiy(v1) == HL) {
263 if ((t1 == S_INDM) && (t2 == S_R16)) {
264 if (gixiy(v2) == HL) {
273 if ((t1 == S_R8) && (v1 == A) && (t2 == S_INDM)) {
278 if ((t1 == S_INDM) && (t2 == S_R8) && (v2 == A)) {
284 if ((t2 == S_R8) && (gixiy(t1) == S_IDHL)) {
290 if ((t2 == S_IMMED) && (gixiy(t1) == S_IDHL)) {
298 if ((t1 == S_R8X) && (t2 == S_R8) && (v2 == A)) {
303 if ((t1 == S_R8) && (v1 == A) && (t2 == S_R8X)) {
309 if ((t1 == S_R16) && (v1 == SP)) {
310 if ((t2 == S_R16) && (gixiy(v2) == HL)) {
315 if ((t1 == S_R8) && (v1 == A)) {
316 if ((t2 == S_IDBC) || (t2 == S_IDDE)) {
317 outab(0x0A | (t2-S_INDR)<<4);
321 if ((t2 == S_R8) && (v2 == A)) {
322 if ((t1 == S_IDBC) || (t1 == S_IDDE)) {
323 outab(0x02 | (t1-S_INDR)<<4);
331 if ((t1 == S_INDM) && (t2 == S_R16) && (v2 == SP)) {
340 if ((t1 == S_INDM) && (t2 == S_R8) && (v2 == A)) {
345 if ((t2 == S_INDM) && (t1 == S_R8) && (v1 == A)) {
354 if ((t1 == S_R8) && (v1 == A) && (t2 == S_IDHLD)) {
358 if ((t2 == S_R8) && (v2 == A) && (t1 == S_IDHLD)) {
366 if ((t1 == S_R8) && (v1 == A) && (t2 == S_IDHLI)) {
370 if ((t2 == S_R8) && (v2 == A) && (t1 == S_IDHLI)) {
380 case S_STOP: /* 0x10 */
389 case S_LDH: /* 0xE0 */
391 * 0xE0 : LDH (n),A = LD ($FF00+n),A
392 * 0xE2 : LDH (C),A = LD ($FF00+C),A
393 * 0xF0 : LDH A,(n) = LD A,($FF00+n)
394 * 0xF2 : LDH A,(C) = LD A,($FF00+C)
399 if ((t1 == S_INDM) && (t2 == S_R8) && (e2.e_addr == A)) {
404 if ((t1 == S_IDC) && (t2 == S_R8) && (e2.e_addr == A)) {
408 if ((t2 == S_INDM) && (t1 == S_R8) && (e1.e_addr == A)) {
413 if ((t2 == S_IDC) && (t1 == S_R8) && (e1.e_addr == A)) {
421 case S_LDA: /* 0xE8 */
423 * 0xE8 : LDA SP,#n(SP)
424 * 0xF8 : LDA HL,#n(SP)
429 if ((t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_INDR+SP)) {
434 if ((t1 == S_R16) && (e1.e_addr == HL) && (t2 == S_INDR+SP)) {
443 case S_LDHL: /* 0xF8 */
450 if ((t1 == S_R16) && (e1.e_addr == SP) && (t2 == S_IMMED)) {
468 if ((t1 == S_IDSP) && (v1 == 0)) {
469 if (gixiy(v2) == HL) {
475 if ((v1 == DE) && (v2 == HL)) {
481 if ((t1 == S_R16X) && (t2 == S_R16X)) {
502 if ((v1 == A) && (t2 == S_INDM)) {
509 outab(((rf == S_IN) ? 0x40 : 0x41) + (v1<<3));
529 if (t1 != gixiy(t1)) {
551 if ((v1 = admode(CND)) != 0 && rf != S_DJNZ) {
554 if ((v1 = admode(CND)) != 0) {
556 if ((v1 &= 0xFF) <= 0x18) {
565 if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
566 v2 = e2.e_addr - dot.s_addr - 1;
567 if (pass == 2 && ((v2 < -128) || (v2 > 127)))
573 if (e2.e_mode != S_USER)
578 if ((v1 = admode(CND)) != 0) {
590 if ((v1 = admode(CND)) != 0) {
604 if ((e1.e_addr == 0) && (gixiy(t1) == S_IDHL)) {
632 if ((t1 == S_R8) && (t2 == S_INDM)) {
634 outab(op | e1.e_addr<<3);
643 if ((t1 == S_R16) && ((v1 = e1.e_addr) <= SP)) {
655 outab(op | e1.e_addr<<3);
690 * general addressing evaluation
691 * return(0) if general addressing mode output, else
692 * return(esp->e_mode)
695 genop(pop, op, esp, f)
696 register int pop, op;
697 register struct expr *esp;
701 if ((t1 = esp->e_mode) == S_R8) {
704 outab(op|esp->e_addr);
713 if (gixiy(t1) == S_IDHL) {
724 if ((t1 == S_IMMED) && (f)) {
735 * IX and IY prebyte check
745 } else if (v == IY) {
748 } else if (v == S_IDIX) {
751 } else if (v == S_IDIY) {
760 * The next character must be a
772 * Machine dependent initialization