home *** CD-ROM | disk | FTP | other *** search
- /*
- * Z80 - Assembler
- * Copyright (C) 1987-1992 by Udo Munk
- *
- * History:
- * 17-SEP-1987 Development under Digital Research CP/M 2.2
- * 28-JUN-1988 Switched to Unix System V.3
- */
-
- /*
- * Dieses Modul enthaelt die Funktionen zur Bearbeitung
- * aller Op-Codes
- */
-
- #include <stdio.h>
- #include "z80a.h"
- #include "z80aglb.h"
-
- /*
- * Diese Funktion behandelt alle Op-Codes,
- * die keine Argumente benoetigen, und
- * ein Byte Op-Code Laenge haben
- */
- op_1b(b1, dummy)
- int b1, dummy;
- {
- if (pass == 1) { /* Pass 1 */
- if (*label)
- put_label();
- } else /* Pass 2 */
- ops[0] = b1;
- return(1);
- }
-
- /*
- * Diese Funktion behandelt alle Op-Codes,
- * die keine Argumente benoetigen, und
- * zwei Byte Op-Code Laenge haben
- */
- op_2b(b1, b2)
- int b1, b2;
- {
- if (pass == 1) { /* Pass 1 */
- if (*label)
- put_label();
- } else { /* Pass 2 */
- ops[0] = b1;
- ops[1] = b2;
- }
- return(2);
- }
-
- /*
- * Diese Funktion behandelt die Op-Codes IM
- */
- op_im()
- {
- if (pass == 1)
- if (*label)
- put_label();
- if (pass == 2) {
- ops[0] = 0xed;
- switch(eval(operand)) {
- case 0:
- ops[1] = 0x46;
- break;
- case 1:
- ops[1] = 0x56;
- break;
- case 2:
- ops[1] = 0x5e;
- break;
- default:
- ops[1] = 0;
- asmerr(E_ILLOPE);
- break;
- }
- }
- return(2);
- }
-
- /*
- * Diese Funktion behandelt die Op-Codes PUSH und POP
- */
- op_pupo(op_code, dummy)
- int op_code, dummy;
- {
- register int len;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (get_reg(operand)) {
- case REGAF:
- if (pass == 2) {
- if (op_code == 1)
- ops[0] = 0xf1; /* POP AF */
- else
- ops[0] = 0xf5; /* PUSH AF */
- }
- len = 1;
- break;
- case REGBC:
- if (pass == 2) {
- if (op_code == 1)
- ops[0] = 0xc1; /* POP BC */
- else
- ops[0] = 0xc5; /* PUSH BC */
- }
- len = 1;
- break;
- case REGDE:
- if (pass == 2) {
- if (op_code == 1)
- ops[0] = 0xd1; /* POP DE */
- else
- ops[0] = 0xd5; /* PUSH DE */
- }
- len = 1;
- break;
- case REGHL:
- if (pass == 2) {
- if (op_code == 1)
- ops[0] = 0xe1; /* POP HL */
- else
- ops[0] = 0xe5; /* PUSH HL */
- }
- len = 1;
- break;
- case REGIX:
- if (pass == 2) {
- if (op_code == 1) {
- ops[0] = 0xdd; /* POP IX */
- ops[1] = 0xe1;
- } else {
- ops[0] = 0xdd; /* PUSH IX */
- ops[1] = 0xe5;
- }
- }
- len = 2;
- break;
- case REGIY:
- if (pass == 2) {
- if (op_code == 1) {
- ops[0] = 0xfd; /* POP IY */
- ops[1] = 0xe1;
- } else {
- ops[0] = 0xfd; /* PUSH IY */
- ops[1] = 0xe5;
- }
- }
- len = 2;
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Diese Funktion behandelt den EX Op-Code
- */
- op_ex()
- {
- register int len;
-
- if (pass == 1)
- if (*label)
- put_label();
- if (strncmp(operand, "DE,HL", 5) == 0) {
- ops[0] = 0xeb;
- len = 1;
- } else if (strncmp(operand, "AF,AF'", 7) == 0) {
- ops[0] = 0x08;
- len = 1;
- } else if (strncmp(operand, "(SP),HL", 7) == 0) {
- ops[0] = 0xe3;
- len = 1;
- } else if (strncmp(operand, "(SP),IX", 7) == 0) {
- ops[0] = 0xdd;
- ops[1] = 0xe3;
- len = 2;
- } else if (strncmp(operand, "(SP),IY", 7) == 0) {
- ops[0] = 0xfd;
- ops[1] = 0xe3;
- len = 2;
- } else {
- ops[0] = 0;
- len = 1;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Diese Funktion behandelt den CALL Op-Code
- */
- op_call()
- {
- char *strchr();
- register char *p1, *p2;
- register int i;
-
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGC: /* CALL C,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xdc;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGNC: /* CALL NC,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xd4;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGZ: /* CALL Z,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xcc;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGNZ: /* CALL NZ,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xc4;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGPE: /* CALL PE,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xec;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGPO: /* CALL PO,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xe4;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGM: /* CALL M,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xfc;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case FLGP: /* CALL P,nn */
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xf4;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case NOREG: /* CALL nn */
- i = eval(operand);
- ops[0] = 0xcd;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- ops[2] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- ops[2] = 0;
- asmerr(E_ILLOPE);
- }
- }
- return(3);
- }
-
- /*
- * Diese Funktion behandelt den RST Op-Code
- */
- op_rst()
- {
- register int op;
-
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- op = eval(operand);
- if ((op / 8 > 7) || (op % 8 != 0)) {
- ops[0] = 0;
- asmerr(E_VALOUT);
- } else
- ops[0] = 0xc7 + op;
- }
- return(1);
- }
-
- /*
- * Diese Funktion behandelt den RET Op-Code
- */
- op_ret()
- {
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- switch (get_reg(operand)) {
- case NOOPERA: /* RET */
- ops[0] = 0xc9;
- break;
- case REGC: /* RET C */
- ops[0] = 0xd8;
- break;
- case FLGNC: /* RET NC */
- ops[0] = 0xd0;
- break;
- case FLGZ: /* RET Z */
- ops[0] = 0xc8;
- break;
- case FLGNZ: /* RET NZ */
- ops[0] = 0xc0;
- break;
- case FLGPE: /* RET PE */
- ops[0] = 0xe8;
- break;
- case FLGPO: /* RET PO */
- ops[0] = 0xe0;
- break;
- case FLGM: /* RET M */
- ops[0] = 0xf8;
- break;
- case FLGP: /* RET P */
- ops[0] = 0xf0;
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- }
- return(1);
- }
-
- /*
- * Diese Funktion behandelt den JP Op-Code
- */
- op_jp()
- {
- char *strchr();
- register char *p1, *p2;
- register int i, len;
-
- if (pass == 1)
- if (*label)
- put_label();
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGC: /* JP C,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xda;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGNC: /* JP NC,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xd2;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGZ: /* JP Z,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xca;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGNZ: /* JP NZ,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xc2;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGPE: /* JP PE,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xea;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGPO: /* JP PO,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xe2;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGM: /* JP M,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xfa;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case FLGP: /* JP P,nn */
- len = 3;
- if (pass == 2) {
- i = eval(strchr(operand, ',') + 1);
- ops[0] = 0xf2;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case REGIHL: /* JP (HL) */
- ops[0] = 0xe9;
- len = 1;
- break;
- case REGIIX: /* JP (IX) */
- ops[0] = 0xdd;
- ops[1] = 0xe9;
- len = 2;
- break;
- case REGIIY: /* JP (IY) */
- ops[0] = 0xfd;
- ops[1] = 0xe9;
- len = 2;
- break;
- case NOREG: /* JP nn */
- len = 3;
- if (pass == 2) {
- i = eval(operand);
- ops[0] = 0xc3;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- len = 1;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- len = 1;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Diese Funktion behandelt den JR Op-Code
- */
- op_jr()
- {
- char *strchr();
- register char *p1, *p2;
-
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGC: /* JR C,n */
- ops[0] = 0x38;
- ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
- break;
- case FLGNC: /* JR NC,n */
- ops[0] = 0x30;
- ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
- break;
- case FLGZ: /* JR Z,n */
- ops[0] = 0x28;
- ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
- break;
- case FLGNZ: /* JR NZ,n */
- ops[0] = 0x20;
- ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
- break;
- case NOREG: /* JR n */
- ops[0] = 0x18;
- ops[1] = chk_v2(eval(operand) - pc - 2);
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- }
- return(2);
- }
-
- /*
- * Diese Funktion behandelt den DJNZ Op-Code
- */
- op_djnz()
- {
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- ops[0] = 0x10;
- ops[1] = chk_v2(eval(operand) - pc - 2);
- }
- return(2);
- }
-
- /*
- * Diese Funktion behandelt die LD Op-Codes
- */
- op_ld()
- {
- register int len;
- register char *p1, *p2;
- char *get_second();
-
- if (pass == 1)
- if (*label)
- put_label();
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGA: /* LD A,? */
- len = lda();
- break;
- case REGB: /* LD B,? */
- len = ldb();
- break;
- case REGC: /* LD C,? */
- len = ldc();
- break;
- case REGD: /* LD D,? */
- len = ldd();
- break;
- case REGE: /* LD E,? */
- len = lde();
- break;
- case REGH: /* LD H,? */
- len = ldh();
- break;
- case REGL: /* LD L,? */
- len = ldl();
- break;
- case REGI: /* LD I,A */
- if (get_reg(get_second(operand)) == REGA) {
- len = 2;
- ops[0] = 0xed;
- ops[1] = 0x47;
- break;
- }
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- break;
- case REGR: /* LD R,A */
- if (get_reg(get_second(operand)) == REGA) {
- len = 2;
- ops[0] = 0xed;
- ops[1] = 0x4f;
- break;
- }
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- break;
- case REGBC: /* LD BC,? */
- len = ldbc();
- break;
- case REGDE: /* LD DE,? */
- len = ldde();
- break;
- case REGHL: /* LD HL,? */
- len = ldhl();
- break;
- case REGIX: /* LD IX,? */
- len = ldix();
- break;
- case REGIY: /* LD IY,? */
- len = ldiy();
- break;
- case REGSP: /* LD SP,? */
- len = ldsp();
- break;
- case REGIHL: /* LD (HL),? */
- len = ldihl();
- break;
- case REGIBC: /* LD (BC),A */
- if (get_reg(get_second(operand)) == REGA) {
- len = 1;
- ops[0] = 0x02;
- break;
- }
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- break;
- case REGIDE: /* LD (DE),A */
- if (get_reg(get_second(operand)) == REGA) {
- len = 1;
- ops[0] = 0x12;
- break;
- }
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- if (strncmp(operand, "(IX+", 4) == 0)
- len = ldiix(); /* LD (IX+d),? */
- else if (strncmp(operand, "(IY+", 4) == 0)
- len = ldiiy(); /* LD (IY+d),? */
- else if (*operand == '(')
- len = ldinn(); /* LD (nn),? */
- else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD A,?
- */
- lda()
- {
- char *get_second(), *strchr();
- register int op;
- register int i, len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD A,A */
- case REGB: /* LD A,B */
- case REGC: /* LD A,C */
- case REGD: /* LD A,D */
- case REGE: /* LD A,E */
- case REGH: /* LD A,H */
- case REGL: /* LD A,L */
- case REGIHL: /* LD A,(HL) */
- len = 1;
- ops[0] = 0x78 + op;
- break;
- case REGI: /* LD A,I */
- len = 2;
- ops[0] = 0xed;
- ops[1] = 0x57;
- break;
- case REGR: /* LD A,R */
- len = 2;
- ops[0] = 0xed;
- ops[1] = 0x5f;
- break;
- case REGIBC: /* LD A,(BC) */
- len = 1;
- ops[0] = 0x0a;
- break;
- case REGIDE: /* LD A,(DE) */
- len = 1;
- ops[0] = 0x1a;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD A,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x7e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD A,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x7e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 3; /* LD A,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0x3a;
- ops[1] = i & 255;
- ops[2] = i >> 8;
- }
- break;
- }
- len = 2; /* LD A,n */
- if (pass == 2) {
- ops[0] = 0x3e;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD B,?
- */
- ldb()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD B,A */
- case REGB: /* LD B,B */
- case REGC: /* LD B,C */
- case REGD: /* LD B,D */
- case REGE: /* LD B,E */
- case REGH: /* LD B,H */
- case REGL: /* LD B,L */
- case REGIHL: /* LD B,(HL) */
- len = 1;
- ops[0] = 0x40 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD B,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x46;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD B,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x46;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD B,n */
- if (pass == 2) {
- ops[0] = 0x06;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD C,?
- */
- ldc()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD C,A */
- case REGB: /* LD C,B */
- case REGC: /* LD C,C */
- case REGD: /* LD C,D */
- case REGE: /* LD C,E */
- case REGH: /* LD C,H */
- case REGL: /* LD C,L */
- case REGIHL: /* LD C,(HL) */
- len = 1;
- ops[0] = 0x48 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD C,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x4e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD C,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x4e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD C,n */
- if (pass == 2) {
- ops[0] = 0x0e;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD D,?
- */
- ldd()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD D,A */
- case REGB: /* LD D,B */
- case REGC: /* LD D,C */
- case REGD: /* LD D,D */
- case REGE: /* LD D,E */
- case REGH: /* LD D,H */
- case REGL: /* LD D,L */
- case REGIHL: /* LD D,(HL) */
- len = 1;
- ops[0] = 0x50 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD D,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x56;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD D,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x56;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD D,n */
- if (pass == 2) {
- ops[0] = 0x16;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD E,?
- */
- lde()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD E,A */
- case REGB: /* LD E,B */
- case REGC: /* LD E,C */
- case REGD: /* LD E,D */
- case REGE: /* LD E,E */
- case REGH: /* LD E,H */
- case REGL: /* LD E,L */
- case REGIHL: /* LD E,(HL) */
- len = 1;
- ops[0] = 0x58 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD E,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x5e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD E,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x5e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD E,n */
- if (pass == 2) {
- ops[0] = 0x1e;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD H,?
- */
- ldh()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD H,A */
- case REGB: /* LD H,B */
- case REGC: /* LD H,C */
- case REGD: /* LD H,D */
- case REGE: /* LD H,E */
- case REGH: /* LD H,H */
- case REGL: /* LD H,L */
- case REGIHL: /* LD H,(HL) */
- len = 1;
- ops[0] = 0x60 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD H,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x66;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD H,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x66;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD H,n */
- if (pass == 2) {
- ops[0] = 0x26;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD L,?
- */
- ldl()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD L,A */
- case REGB: /* LD L,B */
- case REGC: /* LD L,C */
- case REGD: /* LD L,D */
- case REGE: /* LD L,E */
- case REGH: /* LD L,H */
- case REGL: /* LD L,L */
- case REGIHL: /* LD L,(HL) */
- len = 1;
- ops[0] = 0x68 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) { /* LD L,(IX+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x6e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- if (strncmp(p, "(IY+", 4) == 0) { /* LD L,(IY+d) */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x6e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- break;
- }
- len = 2; /* LD L,n */
- if (pass == 2) {
- ops[0] = 0x2e;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD BC,?
- */
- ldbc()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 4; /* LD BC,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0xed;
- ops[1] = 0x4b;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- }
- len = 3; /* LD BC,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0x01;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD DE,?
- */
- ldde()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 4; /* LD DE,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0xed;
- ops[1] = 0x5b;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- }
- len = 3; /* LD DE,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0x11;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD HL,?
- */
- ldhl()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 3; /* LD HL,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0x2a;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- }
- len = 3; /* LD HL,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0x21;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD IX,?
- */
- ldix()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 4; /* LD IX,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0xdd;
- ops[1] = 0x2a;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- }
- len = 4; /* LD IX,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0xdd;
- ops[1] = 0x21;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD IY,?
- */
- ldiy()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 4; /* LD IY,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0xfd;
- ops[1] = 0x2a;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- }
- len = 4; /* LD IY,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0xfd;
- ops[1] = 0x21;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD SP,?
- */
- ldsp()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case REGHL: /* LD SP,HL */
- len = 1;
- ops[0] = 0xf9;
- break;
- case REGIX: /* LD SP,IX */
- len = 2;
- ops[0] = 0xdd;
- ops[1] = 0xf9;
- break;
- case REGIY: /* LD SP,IY */
- len = 2;
- ops[0] = 0xfd;
- ops[1] = 0xf9;
- break;
- case NOREG: /* Operand ist kein Register */
- if (*p == '(' && *(p + strlen(p) - 1) == ')') {
- len = 4; /* LD SP,(nn) */
- if (pass == 2) {
- i = calc_val(p + 1);
- ops[0] = 0xed;
- ops[1] = 0x7b;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- }
- len = 3; /* LD SP,nn */
- if (pass == 2) {
- i = eval(p);
- ops[0] = 0x31;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD (HL),?
- */
- ldihl()
- {
- register int op;
- register int len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD (HL),A */
- case REGB: /* LD (HL),B */
- case REGC: /* LD (HL),C */
- case REGD: /* LD (HL),D */
- case REGE: /* LD (HL),E */
- case REGH: /* LD (HL),H */
- case REGL: /* LD (HL),L */
- len = 1;
- ops[0] = 0x70 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- len = 2; /* LD (HL),n */
- if (pass == 2) {
- ops[0] = 0x36;
- ops[1] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD (IX+d),?
- */
- ldiix()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD (IX+d),A */
- case REGB: /* LD (IX+d),B */
- case REGC: /* LD (IX+d),C */
- case REGD: /* LD (IX+d),D */
- case REGE: /* LD (IX+d),E */
- case REGH: /* LD (IX+d),H */
- case REGL: /* LD (IX+d),L */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x70 + op;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- break;
- case NOREG: /* LD (IX+d),n */
- len = 4;
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x36;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD (IY+d),?
- */
- ldiiy()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* LD (IY+d),A */
- case REGB: /* LD (IY+d),B */
- case REGC: /* LD (IY+d),C */
- case REGD: /* LD (IY+d),D */
- case REGE: /* LD (IY+d),E */
- case REGH: /* LD (IY+d),H */
- case REGL: /* LD (IY+d),L */
- len = 3;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x70 + op;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- break;
- case NOREG: /* LD (IY+d),n */
- len = 4;
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x36;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = chk_v1(eval(p));
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes LD (nn),?
- */
- ldinn()
- {
- register int i, len;
- register char *p;
- char *get_second();
-
- p = get_second(operand);
- switch (get_reg(p)) {
- case REGA: /* LD (nn),A */
- len = 3;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0x32;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case REGBC: /* LD (nn),BC */
- len = 4;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0xed;
- ops[1] = 0x43;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case REGDE: /* LD (nn),DE */
- len = 4;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0xed;
- ops[1] = 0x53;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case REGHL: /* LD (nn),HL */
- len = 3;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0x22;
- ops[1] = i & 0xff;
- ops[2] = i >> 8;
- }
- break;
- case REGSP: /* LD (nn),SP */
- len = 4;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0xed;
- ops[1] = 0x73;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case REGIX: /* LD (nn),IX */
- len = 4;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0xdd;
- ops[1] = 0x22;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case REGIY: /* LD (nn),IY */
- len = 4;
- if (pass == 2) {
- i = calc_val(operand + 1);
- ops[0] = 0xfd;
- ops[1] = 0x22;
- ops[2] = i & 0xff;
- ops[3] = i >> 8;
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADD ?,?
- */
- op_add()
- {
- register int len;
- register char *p1, *p2;
-
- if (pass == 1)
- if (*label)
- put_label();
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGA: /* ADD A,? */
- len = adda();
- break;
- case REGHL: /* ADD HL,? */
- len = addhl();
- break;
- case REGIX: /* ADD IX,? */
- len = addix();
- break;
- case REGIY: /* ADD IY,? */
- len = addiy();
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADD A,?
- */
- adda()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* ADD A,A */
- case REGB: /* ADD A,B */
- case REGC: /* ADD A,C */
- case REGD: /* ADD A,D */
- case REGE: /* ADD A,E */
- case REGH: /* ADD A,H */
- case REGL: /* ADD A,L */
- case REGIHL: /* ADD A,(HL) */
- len = 1;
- ops[0] = 0x80 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) {
- len = 3; /* ADD A,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x86;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else if (strncmp(p, "(IY+", 4) == 0) {
- len = 3; /* ADD A,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x86;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else {
- len = 2; /* ADD A,n */
- if (pass == 2) {
- ops[0] = 0xc6;
- ops[1] = chk_v1(eval(p));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADD HL,?
- */
- addhl()
- {
- char *get_second();
-
- switch (get_reg(get_second(operand))) {
- case REGBC: /* ADD HL,BC */
- ops[0] = 0x09;
- break;
- case REGDE: /* ADD HL,DE */
- ops[0] = 0x19;
- break;
- case REGHL: /* ADD HL,HL */
- ops[0] = 0x29;
- break;
- case REGSP: /* ADD HL,SP */
- ops[0] = 0x39;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(1);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADD IX,?
- */
- addix()
- {
- char *get_second();
-
- switch (get_reg(get_second(operand))) {
- case REGBC: /* ADD IX,BC */
- ops[0] = 0xdd;
- ops[1] = 0x09;
- break;
- case REGDE: /* ADD IX,DE */
- ops[0] = 0xdd;
- ops[1] = 0x19;
- break;
- case REGIX: /* ADD IX,IX */
- ops[0] = 0xdd;
- ops[1] = 0x29;
- break;
- case REGSP: /* ADD IX,SP */
- ops[0] = 0xdd;
- ops[1] = 0x39;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(2);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADD IY,?
- */
- addiy()
- {
- char *get_second();
-
- switch (get_reg(get_second(operand))) {
- case REGBC: /* ADD IY,BC */
- ops[0] = 0xfd;
- ops[1] = 0x09;
- break;
- case REGDE: /* ADD IY,DE */
- ops[0] = 0xfd;
- ops[1] = 0x19;
- break;
- case REGIY: /* ADD IY,IY */
- ops[0] = 0xfd;
- ops[1] = 0x29;
- break;
- case REGSP: /* ADD IY,SP */
- ops[0] = 0xfd;
- ops[1] = 0x39;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(2);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADC ?,?
- */
- op_adc()
- {
- register int len;
- register char *p1, *p2;
-
- if (pass == 1)
- if (*label)
- put_label();
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGA: /* ADC A,? */
- len = adca();
- break;
- case REGHL: /* ADC HL,? */
- len = adchl();
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADC A,?
- */
- adca()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* ADC A,A */
- case REGB: /* ADC A,B */
- case REGC: /* ADC A,C */
- case REGD: /* ADC A,D */
- case REGE: /* ADC A,E */
- case REGH: /* ADC A,H */
- case REGL: /* ADC A,L */
- case REGIHL: /* ADC A,(HL) */
- len = 1;
- ops[0] = 0x88 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) {
- len = 3; /* ADC A,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x8e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else if (strncmp(p, "(IY+", 4) == 0) {
- len = 3; /* ADC A,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x8e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else {
- len = 2; /* ADD A,n */
- if (pass == 2) {
- ops[0] = 0xce;
- ops[1] = chk_v1(eval(p));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes ADC HL,?
- */
- adchl()
- {
- char *get_second();
-
- switch (get_reg(get_second(operand))) {
- case REGBC: /* ADC HL,BC */
- ops[0] = 0xed;
- ops[1] = 0x4a;
- break;
- case REGDE: /* ADC HL,DE */
- ops[0] = 0xed;
- ops[1] = 0x5a;
- break;
- case REGHL: /* ADC HL,HL */
- ops[0] = 0xed;
- ops[1] = 0x6a;
- break;
- case REGSP: /* ADC HL,SP */
- ops[0] = 0xed;
- ops[1] = 0x7a;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(2);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes SUB ?
- */
- op_sub()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* SUB A */
- case REGB: /* SUB B */
- case REGC: /* SUB C */
- case REGD: /* SUB D */
- case REGE: /* SUB E */
- case REGH: /* SUB H */
- case REGL: /* SUB L */
- case REGIHL: /* SUB (HL) */
- len = 1;
- ops[0] = 0x90 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* SUB (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x96;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* SUB (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x96;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 2; /* SUB n */
- if (pass == 2) {
- ops[0] = 0xd6;
- ops[1] = chk_v1(eval(operand));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes SBC ?,?
- */
- op_sbc()
- {
- register int len;
- register char *p1, *p2;
-
- if (pass == 1)
- if (*label)
- put_label();
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (get_reg(tmp)) {
- case REGA: /* SBC A,? */
- len = sbca();
- break;
- case REGHL: /* SBC HL,? */
- len = sbchl();
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes SBC A,?
- */
- sbca()
- {
- char *get_second(), *strchr();
- register int op;
- register int len;
- register char *p;
-
- p = get_second(operand);
- switch (op = get_reg(p)) {
- case REGA: /* SBC A,A */
- case REGB: /* SBC A,B */
- case REGC: /* SBC A,C */
- case REGD: /* SBC A,D */
- case REGE: /* SBC A,E */
- case REGH: /* SBC A,H */
- case REGL: /* SBC A,L */
- case REGIHL: /* SBC A,(HL) */
- len = 1;
- ops[0] = 0x98 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p, "(IX+", 4) == 0) {
- len = 3; /* SBC A,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x9e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else if (strncmp(p, "(IY+", 4) == 0) {
- len = 3; /* SBC A,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x9e;
- ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
- }
- } else {
- len = 2; /* SBC A,n */
- if (pass == 2) {
- ops[0] = 0xde;
- ops[1] = chk_v1(eval(p));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes SBC HL,?
- */
- sbchl()
- {
- char *get_second();
-
- switch (get_reg(get_second(operand))) {
- case REGBC: /* SBC HL,BC */
- ops[0] = 0xed;
- ops[1] = 0x42;
- break;
- case REGDE: /* SBC HL,DE */
- ops[0] = 0xed;
- ops[1] = 0x52;
- break;
- case REGHL: /* SBC HL,HL */
- ops[0] = 0xed;
- ops[1] = 0x62;
- break;
- case REGSP: /* SBC HL,SP */
- ops[0] = 0xed;
- ops[1] = 0x72;
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(2);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes INC ?
- */
- op_inc()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* INC A */
- case REGB: /* INC B */
- case REGC: /* INC C */
- case REGD: /* INC D */
- case REGE: /* INC E */
- case REGH: /* INC H */
- case REGL: /* INC L */
- case REGIHL: /* INC (HL) */
- len = 1;
- ops[0] = 0x04 + (op << 3);
- break;
- case REGBC: /* INC BC */
- len = 1;
- ops[0] = 0x03;
- break;
- case REGDE: /* INC DE */
- len = 1;
- ops[0] = 0x13;
- break;
- case REGHL: /* INC HL */
- len = 1;
- ops[0] = 0x23;
- break;
- case REGSP: /* INC SP */
- len = 1;
- ops[0] = 0x33;
- break;
- case REGIX: /* INC IX */
- len = 2;
- ops[0] = 0xdd;
- ops[1] = 0x23;
- break;
- case REGIY: /* INC IY */
- len = 2;
- ops[0] = 0xfd;
- ops[1] = 0x23;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* INC (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x34;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* INC (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x34;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes DEC ?
- */
- op_dec()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* DEC A */
- case REGB: /* DEC B */
- case REGC: /* DEC C */
- case REGD: /* DEC D */
- case REGE: /* DEC E */
- case REGH: /* DEC H */
- case REGL: /* DEC L */
- case REGIHL: /* DEC (HL) */
- len = 1;
- ops[0] = 0x05 + (op << 3);
- break;
- case REGBC: /* DEC BC */
- len = 1;
- ops[0] = 0x0b;
- break;
- case REGDE: /* DEC DE */
- len = 1;
- ops[0] = 0x1b;
- break;
- case REGHL: /* DEC HL */
- len = 1;
- ops[0] = 0x2b;
- break;
- case REGSP: /* DEC SP */
- len = 1;
- ops[0] = 0x3b;
- break;
- case REGIX: /* DEC IX */
- len = 2;
- ops[0] = 0xdd;
- ops[1] = 0x2b;
- break;
- case REGIY: /* DEC IY */
- len = 2;
- ops[0] = 0xfd;
- ops[1] = 0x2b;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* DEC (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0x35;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* DEC (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0x35;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes OR ?
- */
- op_or()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* OR A */
- case REGB: /* OR B */
- case REGC: /* OR C */
- case REGD: /* OR D */
- case REGE: /* OR E */
- case REGH: /* OR H */
- case REGL: /* OR L */
- case REGIHL: /* OR (HL) */
- len = 1;
- ops[0] = 0xb0 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* OR (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xb6;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* OR (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xb6;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 2; /* OR n */
- if (pass == 2) {
- ops[0] = 0xf6;
- ops[1] = chk_v1(eval(operand));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes XOR ?
- */
- op_xor()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* XOR A */
- case REGB: /* XOR B */
- case REGC: /* XOR C */
- case REGD: /* XOR D */
- case REGE: /* XOR E */
- case REGH: /* XOR H */
- case REGL: /* XOR L */
- case REGIHL: /* XOR (HL) */
- len = 1;
- ops[0] = 0xa8 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* XOR (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xae;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* XOR (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xae;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 2; /* XOR n */
- if (pass == 2) {
- ops[0] = 0xee;
- ops[1] = chk_v1(eval(operand));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes AND ?
- */
- op_and()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* AND A */
- case REGB: /* AND B */
- case REGC: /* AND C */
- case REGD: /* AND D */
- case REGE: /* AND E */
- case REGH: /* AND H */
- case REGL: /* AND L */
- case REGIHL: /* AND (HL) */
- len = 1;
- ops[0] = 0xa0 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* AND (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xa6;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* AND (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xa6;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 2; /* AND n */
- if (pass == 2) {
- ops[0] = 0xe6;
- ops[1] = chk_v1(eval(operand));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt alle Op-Codes CP ?
- */
- op_cp()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* CP A */
- case REGB: /* CP B */
- case REGC: /* CP C */
- case REGD: /* CP D */
- case REGE: /* CP E */
- case REGH: /* CP H */
- case REGL: /* CP L */
- case REGIHL: /* CP (HL) */
- len = 1;
- ops[0] = 0xb8 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 3; /* CP (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xbe;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 3; /* CP (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xbe;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- }
- } else {
- len = 2; /* OR n */
- if (pass == 2) {
- ops[0] = 0xfe;
- ops[1] = chk_v1(eval(operand));
- }
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den RL Op-Code
- */
- op_rl()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* RL A */
- case REGB: /* RL B */
- case REGC: /* RL C */
- case REGD: /* RL D */
- case REGE: /* RL E */
- case REGH: /* RL H */
- case REGL: /* RL L */
- case REGIHL: /* RL (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x10 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* RL (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x16;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* RL (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x16;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den RR Op-Code
- */
- op_rr()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* RR A */
- case REGB: /* RR B */
- case REGC: /* RR C */
- case REGD: /* RR D */
- case REGE: /* RR E */
- case REGH: /* RR H */
- case REGL: /* RR L */
- case REGIHL: /* RR (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x18 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* RR (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x1e;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* RR (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x1e;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den SLA Op-Code
- */
- op_sla()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* SLA A */
- case REGB: /* SLA B */
- case REGC: /* SLA C */
- case REGD: /* SLA D */
- case REGE: /* SLA E */
- case REGH: /* SLA H */
- case REGL: /* SLA L */
- case REGIHL: /* SLA (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x20 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* SLA (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x26;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* SLA (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x26;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den SRA Op-Code
- */
- op_sra()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* SRA A */
- case REGB: /* SRA B */
- case REGC: /* SRA C */
- case REGD: /* SRA D */
- case REGE: /* SRA E */
- case REGH: /* SRA H */
- case REGL: /* SRA L */
- case REGIHL: /* SRA (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x28 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* SRA (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x2e;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* SRA (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x2e;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den SRL Op-Code
- */
- op_srl()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* SRL A */
- case REGB: /* SRL B */
- case REGC: /* SRL C */
- case REGD: /* SRL D */
- case REGE: /* SRL E */
- case REGH: /* SRL H */
- case REGL: /* SRL L */
- case REGIHL: /* SRL (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x38 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* SRL (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x3e;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* SRL (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x3e;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den RLC Op-Code
- */
- op_rlc()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* RLC A */
- case REGB: /* RLC B */
- case REGC: /* RLC C */
- case REGD: /* RLC D */
- case REGE: /* RLC E */
- case REGH: /* RLC H */
- case REGL: /* RLC L */
- case REGIHL: /* RLC (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x00 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* RLC (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x06;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* RLC (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x06;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den RRC Op-Code
- */
- op_rrc()
- {
- char *strchr();
- register int len, op;
-
- if (pass == 1)
- if (*label)
- put_label();
- switch (op = get_reg(operand)) {
- case REGA: /* RRC A */
- case REGB: /* RRC B */
- case REGC: /* RRC C */
- case REGD: /* RRC D */
- case REGE: /* RRC E */
- case REGH: /* RRC H */
- case REGL: /* RRC L */
- case REGIHL: /* RRC (HL) */
- len = 2;
- ops[0] = 0xcb;
- ops[1] = 0x08 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(operand, "(IX+", 4) == 0) {
- len = 4; /* RRC (IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x0e;
- }
- } else if (strncmp(operand, "(IY+", 4) == 0) {
- len = 4; /* RRC (IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x0e;
- }
- } else {
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- len = 1;
- ops[0] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- len = 1;
- ops[0] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion behandelt den OUT Op-Code
- */
- op_out()
- {
- register int op;
- char *get_second();
-
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- if (strncmp(operand, "(C),", 4) == 0) {
- switch(op = get_reg(get_second(operand))) {
- case REGA: /* OUT (C),A */
- case REGB: /* OUT (C),B */
- case REGC: /* OUT (C),C */
- case REGD: /* OUT (C),D */
- case REGE: /* OUT (C),E */
- case REGH: /* OUT (C),H */
- case REGL: /* OUT (C),L */
- ops[0] = 0xed;
- ops[1] = 0x41 + (op << 3);
- break;
- case NOOPERA: /* Operand fehlt */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- } else {
- ops[0] = 0xd3; /* OUT (n),A */
- ops[1] = chk_v1(calc_val(operand + 1));
- }
- }
- return(2);
- }
-
- /*
- * Die Funktion behandelt den IN Op-Code
- */
- op_in()
- {
- char *get_second();
- register char *p1, *p2;
- register int op;
-
- if (pass == 1) { /* PASS 1 */
- if (*label)
- put_label();
- } else { /* PASS 2 */
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- switch (op = get_reg(tmp)) {
- case REGA:
- if (strncmp(operand, "A,(C)", 5) == 0) {
- ops[0] = 0xed; /* IN A,(C) */
- ops[1] = 0x78;
- } else {
- ops[0] = 0xdb; /* IN A,(n) */
- ops[1] = chk_v1(calc_val(get_second(operand) + 1));
- }
- break;
- case REGB: /* IN B,(C) */
- case REGC: /* IN C,(C) */
- case REGD: /* IN D,(C) */
- case REGE: /* IN E,(C) */
- case REGH: /* IN H,(C) */
- case REGL: /* IN L,(C) */
- ops[0] = 0xed;
- ops[1] = 0x40 + (op << 3);
- break;
- default: /* ungueltiger Operand */
- ops[0] = 0;
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- }
- return(2);
- }
-
- /*
- * Diese Funktion behandelt den SET Op-Code
- */
- op_set()
- {
- char *strchr();
- register char *p1, *p2;
- register int len;
- register int i;
- register int op;
-
- len = 2;
- i = 0;
- if (pass == 1)
- if (*label)
- put_label();
- ops[0] = 0xcb;
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- if (pass == 2) {
- i = eval(tmp);
- if (i < 0 || i > 7)
- asmerr(E_VALOUT);
- }
- switch (op = get_reg(++p1)) {
- case REGA: /* SET n,A */
- case REGB: /* SET n,B */
- case REGC: /* SET n,C */
- case REGD: /* SET n,D */
- case REGE: /* SET n,E */
- case REGH: /* SET n,H */
- case REGL: /* SET n,L */
- case REGIHL: /* SET n,(HL) */
- ops[1] = 0xc0 + i * 8 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p1, "(IX+", 4) == 0) {
- len = 4; /* SET n,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0xc6 + i * 8;
- }
- } else if (strncmp(p1, "(IY+", 4) == 0) {
- len = 4; /* SET n,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0xc6 + i * 8;
- }
- } else {
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Diese Funktion behandelt den RES Op-Code
- */
- op_res()
- {
- char *strchr();
- register char *p1, *p2;
- register int len;
- register int i;
- register int op;
-
- len = 2;
- i = 0;
- if (pass == 1)
- if (*label)
- put_label();
- ops[0] = 0xcb;
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- if (pass == 2) {
- i = eval(tmp);
- if (i < 0 || i > 7)
- asmerr(E_VALOUT);
- }
- switch (op = get_reg(++p1)) {
- case REGA: /* RES n,A */
- case REGB: /* RES n,B */
- case REGC: /* RES n,C */
- case REGD: /* RES n,D */
- case REGE: /* RES n,E */
- case REGH: /* RES n,H */
- case REGL: /* RES n,L */
- case REGIHL: /* RES n,(HL) */
- ops[1] = 0x80 + i * 8 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p1, "(IX+", 4) == 0) {
- len = 4; /* RES n,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x86 + i * 8;
- }
- } else if (strncmp(p1, "(IY+", 4) == 0) {
- len = 4; /* RES n,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x86 + i * 8;
- }
- } else {
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Diese Funktion behandelt den BIT Op-Code
- */
- op_bit()
- {
- char *strchr();
- register char *p1, *p2;
- register int len;
- register int i;
- register int op;
-
- len = 2;
- i = 0;
- if (pass == 1)
- if (*label)
- put_label();
- ops[0] = 0xcb;
- p1 = operand;
- p2 = tmp;
- while (*p1 != ',' && *p1 != '\0')
- *p2++ = *p1++;
- *p2 = '\0';
- if (pass == 2) {
- i = eval(tmp);
- if (i < 0 || i > 7)
- asmerr(E_VALOUT);
- }
- switch (op = get_reg(++p1)) {
- case REGA: /* BIT n,A */
- case REGB: /* BIT n,B */
- case REGC: /* BIT n,C */
- case REGD: /* BIT n,D */
- case REGE: /* BIT n,E */
- case REGH: /* BIT n,H */
- case REGL: /* BIT n,L */
- case REGIHL: /* BIT n,(HL) */
- ops[1] = 0x40 + i * 8 + op;
- break;
- case NOREG: /* Operand ist kein Register */
- if (strncmp(p1, "(IX+", 4) == 0) {
- len = 4; /* BIT n,(IX+d) */
- if (pass == 2) {
- ops[0] = 0xdd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x46 + i * 8;
- }
- } else if (strncmp(p1, "(IY+", 4) == 0) {
- len = 4; /* BIT n,(IY+d) */
- if (pass == 2) {
- ops[0] = 0xfd;
- ops[1] = 0xcb;
- ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
- ops[3] = 0x46 + i * 8;
- }
- } else {
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- break;
- case NOOPERA: /* Operand fehlt */
- ops[1] = 0;
- asmerr(E_MISOPE);
- break;
- default: /* ungueltiger Operand */
- ops[1] = 0;
- asmerr(E_ILLOPE);
- }
- return(len);
- }
-
- /*
- * Die Funktion liefert einen Pointer auf den zweiten Operanden
- * bei Befehlen der Form: Op-Code destination,source
- * Fehlt ,source wird ein NULL-Pointer geliefert.
- */
- char *get_second(s)
- register char *s;
- {
- char *strchr();
- register char *p;
-
- if ((p = strchr(s, ',')) != NULL)
- return(p + 1);
- else
- return(NULL);
- }
-
- /*
- * Die Funktion bestimmt den Wert eines Reststrings der
- * Form: expression)
- * Z.B.: LD A,(IX+7)
- * --
- */
- calc_val(s)
- register char *s;
- {
- register char *p;
- register int i;
- char *strrchr(), *strncpy();
-
- if ((p = strrchr(s, ')')) == NULL) {
- asmerr(E_MISPAR);
- return(0);
- }
- i = p - s;
- strncpy(tmp, s, i);
- *(tmp + i) = '\0';
- return(eval(tmp));
- }
-