home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / emulator / unix / z80pack / z80asm / z80aopc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-09  |  6.5 KB  |  176 lines

  1. /*
  2.  *      Z80 - Assembler
  3.  *      Copyright (C) 1987-1992 by Udo Munk
  4.  *
  5.  *    History:
  6.  *    17-SEP-1987 Development under Digital Research CP/M 2.2
  7.  *      28-JUN-1988 Switched to Unix System V.3
  8.  */
  9.  
  10. /*
  11.  *      Diese Modul enthaelt die Op-Code-Tabelle. In ihr
  12.  *      sind fuer jeden Z80 Op-Code und alle Pseudo-Op-Codes
  13.  *      ausser END Eintraege vorhanden. Die Tabelle muss
  14.  *      aufsteigend nach den Op-Code-Namen sortiert sein !
  15.  *
  16.  *      Die zweite Tabelle im Modul enthaelt die Namen aller
  17.  *      reservierten Operanden (Register, Registerpaare und Flags.
  18.  *      Sie muss ebenfalls nach den Namen sortiert sein !
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include "z80a.h"
  23.  
  24. /*
  25.  *      Die Funktionen zur Codegenerierung der einzelnen
  26.  *      Op-Codes muessen forward deklariert werden:
  27.  */
  28. extern int op_1b(), op_2b(), op_pupo(), op_ex(), op_ld();
  29. extern int op_call(), op_ret(), op_jp(), op_jr(), op_djnz(), op_rst();
  30. extern int op_add(), op_adc(), op_sub(), op_sbc(), op_cp();
  31. extern int op_inc(), op_dec(), op_or(), op_xor(), op_and();
  32. extern int op_rl(), op_rr(), op_sla(), op_sra(), op_srl(), op_rlc(), op_rrc();
  33. extern int op_out(), op_in(), op_im();
  34. extern int op_set(), op_res(), op_bit();
  35. extern int op_org(), op_dl(), op_equ();
  36. extern int op_ds(), op_db(), op_dw(), op_dm();
  37. extern int op_misc();
  38. extern int op_cond();
  39. extern int op_glob();
  40.  
  41. struct opc opctab[] = {
  42.     { "ADC",        op_adc,         0,    0    },
  43.     { "ADD",        op_add,         0,    0    },
  44.     { "AND",        op_and,         0,    0    },
  45.     { "BIT",        op_bit,         0,    0    },
  46.     { "CALL",       op_call,        0,    0    },
  47.     { "CCF",        op_1b,          0x3f, 0    },
  48.     { "CP",         op_cp,          0,    0    },
  49.     { "CPD",        op_2b,          0xed, 0xa9 },
  50.     { "CPDR",       op_2b,          0xed, 0xb9 },
  51.     { "CPI",        op_2b,          0xed, 0xa1 },
  52.     { "CPIR",       op_2b,          0xed, 0xb1 },
  53.     { "CPL",        op_1b,          0x2f, 0    },
  54.     { "DAA",        op_1b,          0x27, 0    },
  55.     { "DEC",        op_dec,         0,    0    },
  56.     { "DEFB",       op_db,          0,    0    },
  57.     { "DEFL",       op_dl,          0,    0    },
  58.     { "DEFM",       op_dm,          0,    0    },
  59.     { "DEFS",       op_ds,          0,    0    },
  60.     { "DEFW",       op_dw,          0,    0    },
  61.     { "DI",         op_1b,          0xf3, 0    },
  62.     { "DJNZ",       op_djnz,        0,    0    },
  63.     { "EI",         op_1b,          0xfb, 0    },
  64.     { "EJECT",      op_misc,        1,    0    },
  65.     { "ELSE",       op_cond,        98,   0    },
  66.     { "ENDIF",      op_cond,        99,   0    },
  67.     { "EQU",        op_equ,         0,    0    },
  68.     { "EX",         op_ex,          0,    0    },
  69.     { "EXTRN",      op_glob,        1,    0    },
  70.     { "EXX",        op_1b,          0xd9, 0    },
  71.     { "HALT",       op_1b,          0x76, 0    },
  72.     { "IFDEF",      op_cond,        1,    0    },
  73.     { "IFEQ",       op_cond,        3,    0    },
  74.     { "IFNDEF",     op_cond,        2,    0    },
  75.     { "IFNEQ",      op_cond,        4,    0    },
  76.     { "IM",         op_im,          0,    0    },
  77.     { "IN",         op_in,          0,    0    },
  78.     { "INC",        op_inc,         0,    0    },
  79.     { "INCLUDE",    op_misc,        6,    0    },
  80.     { "IND",        op_2b,          0xed, 0xaa },
  81.     { "INDR",       op_2b,          0xed, 0xba },
  82.     { "INI",        op_2b,          0xed, 0xa2 },
  83.     { "INIR",       op_2b,          0xed, 0xb2 },
  84.     { "JP",         op_jp,          0,    0    },
  85.     { "JR",         op_jr,          0,    0    },
  86.     { "LD",         op_ld,          0,    0    },
  87.     { "LDD",        op_2b,          0xed, 0xa8 },
  88.     { "LDDR",       op_2b,          0xed, 0xb8 },
  89.     { "LDI",        op_2b,          0xed, 0xa0 },
  90.     { "LDIR",       op_2b,          0xed, 0xb0 },
  91.     { "LIST",       op_misc,        2,    0    },
  92.     { "NEG",        op_2b,          0xed, 0x44 },
  93.     { "NOLIST",     op_misc,        3,    0    },
  94.     { "NOP",        op_1b,          0,    0    },
  95.     { "OR",         op_or,          0,    0    },
  96.     { "ORG",        op_org,         0,    0    },
  97.     { "OTDR",       op_2b,          0xed, 0xbb },
  98.     { "OTIR",       op_2b,          0xed, 0xb3 },
  99.     { "OUT",        op_out,         0,    0    },
  100.     { "OUTD",       op_2b,          0xed, 0xab },
  101.     { "OUTI",       op_2b,          0xed, 0xa3 },
  102.     { "PAGE",       op_misc,        4,    0    },
  103.     { "POP",        op_pupo,        1,    0    },
  104.     { "PRINT",      op_misc,        5,    0    },
  105.     { "PUBLIC",     op_glob,        2,    0    },
  106.     { "PUSH",       op_pupo,        2,    0    },
  107.     { "RES",        op_res,         0,    0    },
  108.     { "RET",        op_ret,         0,    0    },
  109.     { "RETI",       op_2b,          0xed, 0x4d },
  110.     { "RETN",       op_2b,          0xed, 0x45 },
  111.     { "RL",         op_rl,          0,    0    },
  112.     { "RLA",        op_1b,          0x17, 0    },
  113.     { "RLC",        op_rlc,         0,    0    },
  114.     { "RLCA",       op_1b,          0x07, 0    },
  115.     { "RLD",        op_2b,          0xed, 0x6f },
  116.     { "RR",         op_rr,          0,    0    },
  117.     { "RRA",        op_1b,          0x1f, 0    },
  118.     { "RRC",        op_rrc,         0,    0    },
  119.     { "RRCA",       op_1b,          0x0f, 0    },
  120.     { "RRD",        op_2b,          0xed, 0x67 },
  121.     { "RST",        op_rst,         0,    0    },
  122.     { "SBC",        op_sbc,         0,    0    },
  123.     { "SCF",        op_1b,          0x37, 0    },
  124.     { "SET",        op_set,         0,    0    },
  125.     { "SLA",        op_sla,         0,    0    },
  126.     { "SRA",        op_sra,         0,    0    },
  127.     { "SRL",        op_srl,         0,    0    },
  128.     { "SUB",        op_sub,         0,    0    },
  129.     { "TITLE",      op_misc,        7,    0    },
  130.     { "XOR",        op_xor,         0,    0    }
  131. };
  132.  
  133. /*
  134.  *    Die Anzahl der Eintraege in der Op-Code Tabelle wird fuer die
  135.  *    Suchfunktion search_op() in der Variablen no_opcodes abgelegt.
  136.  */
  137. int no_opcodes = sizeof(opctab) / sizeof(struct opc);
  138.  
  139. struct ope opetab[] = {
  140.     { "(BC)",       REGIBC },
  141.     { "(DE)",       REGIDE },
  142.     { "(HL)",       REGIHL },
  143.     { "(IX)",       REGIIX },
  144.     { "(IY)",       REGIIY },
  145.     { "(SP)",       REGISP },
  146.     { "A",          REGA   },
  147.     { "AF",         REGAF  },
  148.     { "B",          REGB   },
  149.     { "BC",         REGBC  },
  150.     { "C",          REGC   },
  151.     { "D",          REGD   },
  152.     { "DE",         REGDE  },
  153.     { "E",          REGE   },
  154.     { "H",          REGH   },
  155.     { "HL",         REGHL  },
  156.     { "I",          REGI   },
  157.     { "IX",         REGIX  },
  158.     { "IY",         REGIY  },
  159.     { "L",          REGL   },
  160.     { "M",          FLGM   },
  161.     { "NC",         FLGNC  },
  162.     { "NZ",         FLGNZ  },
  163.     { "P",          FLGP   },
  164.     { "PE",         FLGPE  },
  165.     { "PO",         FLGPO  },
  166.     { "R",          REGR   },
  167.     { "SP",         REGSP  },
  168.     { "Z",          FLGZ   }
  169. };
  170.  
  171. /*
  172.  *      Hier wird ebenfalls die Anzahl der Tabelleneintraege
  173.  *      bekannt gemacht.
  174.  */
  175. int no_operands = sizeof(opetab) / sizeof(struct ope);
  176.