Annotation of generator/src/.extra/z80-mame/makez80.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************
                      2:  *
                      3:  *      makez80.c
                      4:  *      486++ asm emitter for a Z80 cpu core
                      5:  *      supports GNU assembler and NASM
                      6:  *
                      7:  *      Copyright (c) 1999 Juergen Buchmueller, all rights reserved.
                      8:  *
                      9:  *      - This source code is released as freeware for non-commercial purposes.
                     10:  *      - You are free to use and redistribute this code in modified or
                     11:  *        unmodified form, provided you list me in the credits.
                     12:  *      - If you modify this source code, you must add a notice to each modified
                     13:  *        source file that it has been changed.  If you're a nice person, you
                     14:  *        will clearly mark each change too.  :)
                     15:  *      - If you wish to use this for commercial purposes, please contact me at
                     16:  *        [email protected]
                     17:  *      - The author of this copywritten work reserves the right to change the
                     18:  *     terms of its usage and license at any time, including retroactively
                     19:  *   - This entire notice must remain in the source code.
                     20:  *
                     21:  *****************************************************************************/
                     22: 
                     23: #include <stdio.h>
                     24: #include <stdarg.h>
                     25: #include <string.h>
                     26: #include <signal.h>
                     27: #include "cpuintrf.h"
                     28: #include "osd_cpu.h"
                     29: 
                     30: #define FAST_MEMORY    1
                     31: #define INLINE_IOPORTS 0               /* inline cpu_readport/cpu_writeport functions */
                     32: #define BUSY_LOOP_HACKS 1              /* break out of tight loops waiting for an interrupt */
                     33: #define WBYTE_EA4_EDX  1               /* use one writeback function for DD/FD CB <ofs8> xx opcodes */
                     34: #define EARLY_CTC              1
                     35: #define CALC_PREVPC    0               /* calculate previouspc */
                     36: 
                     37: #define ABITS           4       /* ABITS2_16 + ABITS_MIN_16 */
                     38: 
                     39: #define GLOBL  0
                     40: 
                     41: #define GAS     0
                     42: #define NASM    1
                     43: #define TASM   2
                     44: 
                     45: typedef unsigned char  byte;
                     46: typedef unsigned short  word;
                     47: typedef unsigned long   dword;
                     48: 
                     49: FILE *output;
                     50: int as = GAS;
                     51: int verbose = 0, mame_debug = 0, optimize = 0;
                     52: int opcodes = 0;
                     53: int rbyte = 0, rword = 0, wbyte = 0, wword = 0;
                     54: int align_funcs = 2, align_jumps = 2, align_loops = 1;
                     55: 
                     56: typedef enum {
                     57:     none=0,
                     58:     al,  ah,  cl,  ch,  dl,  dh,  bl,  bh,
                     59:     ax,  cx,  dx,  bx,  si,  di,  bp,  sp,
                     60:        eax, ecx, edx, ebx, esi, edi, ebp, esp
                     61: }   x86_regs;
                     62: 
                     63: typedef enum {
                     64:        dm,     db,     dw,     dd,     align,  extrn,  globl,  text,
                     65:        data,   aaa,    aad,    aam,    aas,    adc,    adcb,   adcl,
                     66:        adcw,   add,    addb,   addl,   addw,   and,    andb,   andl,
                     67:        andw,   bswap,  bt,     btc,    btr,    bts,    call,   callf,
                     68:        cbw,    cdq,    clc,    cld,    cli,    clts,   cmc,    cmp,
                     69:        cmpb,   cmpl,   cmpsb,  cmpsd,  cmpsw,  cmpw,   cpuid,  cwd,
                     70:        cwde,   daa,    das,    dec,    decb,   decl,   decw,   div,
                     71:        divb,   divd,   divw,   fwait,  hlt,    idiv,   idivb,  idivd,
                     72:        idivw,  imul,   imulb,  imuld,  imulw,  in,     inc,    incb,
                     73:        incl,   incw,   insb,   insd,   insw,   intr,   into,   iret,
                     74:        iretd,  ja,     jae,    jael,   jal,    jb,     jbe,    jbel,
                     75:        jbl,    jc,     jcl,    jcxz,   je,     jecxz,  jel,    jg,
                     76:        jge,    jgel,   jgl,    jl,     jle,    jlel,   jll,    jmp,
                     77:        jmpf,   jmpl,   jna,    jnae,   jnael,  jnal,   jnb,    jnbe,
                     78:        jnbel,  jnbl,   jnc,    jncl,   jne,    jnel,   jng,    jnge,
                     79:        jngel,  jngl,   jnl,    jnle,   jnlel,  jnll,   jno,    jnol,
                     80:        jnp,    jnpl,   jns,    jnsl,   jnz,    jnzl,   jo,     jol,
                     81:        jp,     jpe,    jpel,   jpl,    jpo,    jpol,   js,     jsl,
                     82:        jz,     jzl,    lahf,   lds,    lea,    leave,  les,    lfs,
                     83:        lgdt,   lgs,    lidt,   lldt,   lmsw,   lock,   lodsb,  lodsd,
                     84:        lodsw,  loop,   loope,  loopne, loopnz, loopz,  lss,    ltr,
                     85:        mov,    movb,   movl,   movsb,  movsbl, movsbw, movsd,  movsw,
                     86:        movswl, movw,   movzbl, movzbw, movzwl, mul,    mulb,   muld,
                     87:        mulw,   neg,    negb,   negw,   negl,   nop,    not,    notb,
                     88:        notw,   notl,   or,     orb,    orl,    orw,    out,    outsb,
                     89:        outsd,  outsw,  pop,    popa,   popad,  popl,   popf,   popfd,
                     90:        popw,   push,   pusha,  pushad, pushl,  pushf,  pushfd, pushw,
                     91:        rclb,   rcll,   rclw,   rcrb,   rcrl,   rcrw,   rep,    repe,
                     92:        repne,  repnz,  repz,   ret,    retd,   retf,   retfd,  rolb,
                     93:        roll,   rolw,   rorb,   rorl,   rorw,   sahf,   salb,   sall,
                     94:        salw,   sarb,   sarl,   sarw,   sbbb,   sbbl,   sbbw,   scasb,
                     95:        scasd,  scasw,  seta,   setae,  setb,   setbe,  setc,   sete,
                     96:        setg,   setge,  setl,   setle,  setna,  setnae, setnb,  setnbe,
                     97:        setnc,  setne,  setng,  setnge, setnl,  setnle, setno,  setnp,
                     98:        setns,  setnz,  seto,   setp,   setpe,  setpo,  sets,   setz,
                     99:        sgdt,   shlb,   shld,   shll,   shlw,   shrb,   shrd,   shrl,
                    100:        shrw,   sidt,   sldt,   smsw,   stc,    std,    sti,    stosb,
                    101:        stosd,  stosw,  subb,   subl,   subw,   testb,  testl,  testw,
                    102:        verr,   verw,   wait,   xchg,   xchgb,  xchgw,  xchgl,  xlat,
                    103:        xlatb,  xorb,   xorl,   xorw
                    104: }   x86_token;
                    105: 
                    106: #define AL     R(al)
                    107: #define AH     R(ah)
                    108: #define CL     R(cl)
                    109: #define CH     R(ch)
                    110: #define DL     R(dl)
                    111: #define DH     R(dh)
                    112: #define BL     R(bl)
                    113: #define BH     R(bh)
                    114: #define AX     R(ax)
                    115: #define CX     R(cx)
                    116: #define DX     R(dx)
                    117: #define BX     R(bx)
                    118: #define SI     R(si)
                    119: #define DI     R(di)
                    120: #define BP     R(bp)
                    121: #define EAX R(eax)
                    122: #define ECX R(ecx)
                    123: #define EDX R(edx)
                    124: #define EBX R(ebx)
                    125: #define ESI R(esi)
                    126: #define EDI R(edi)
                    127: #define EBP R(ebp)
                    128: #define ESP R(esp)
                    129: 
                    130: void emit(const char *fmt, ...) __attribute__((format(printf,1,2)));
                    131: 
                    132: void com(const char *fmt, ...);
                    133: 
                    134: const char *O(const char *symbol);
                    135: 
                    136: int str(char *dst, const char *src);
                    137: 
                    138: const char *x86_rstr[][3] = {
                    139:        {"",    "",   ""    },
                    140:        {"%al", "al", "al"  },
                    141:        {"%ah", "ah", "ah"  },
                    142:        {"%cl", "cl", "cl"  },
                    143:        {"%ch", "ch", "ch"  },
                    144:        {"%dl", "dl", "dl"  },
                    145:        {"%dh", "dh", "dh"  },
                    146:        {"%bl", "bl", "bl"  },
                    147:        {"%bh", "bh", "bh"  },
                    148:        {"%ax", "ax", "ax"  },
                    149:        {"%cx", "cx", "cx"  },
                    150:        {"%dx", "dx", "dx"  },
                    151:        {"%bx", "bx", "bx"  },
                    152:        {"%si", "si", "si"  },
                    153:        {"%di", "di", "di"  },
                    154:        {"%bp", "bp", "bp"  },
                    155:        {"%sp", "sp", "sp"  },
                    156:        {"%eax","eax","eax" },
                    157:        {"%ecx","ecx","ecx" },
                    158:        {"%edx","edx","edx" },
                    159:        {"%ebx","ebx","ebx" },
                    160:        {"%esi","esi","esi" },
                    161:        {"%edi","edi","edi" },
                    162:        {"%ebp","ebp","ebp" },
                    163:        {"%esp","esp","esp" },
                    164: };
                    165: 
                    166: const char *x86_token_str[][3] = {
                    167:        {".ascii",          "db",               "db",             },
                    168:        {".byte",           "db",               "db",             },
                    169:        {".short",          "dw",               "dw",             },
                    170:        {".long",           "dd",               "dd",             },
                    171:        {".align",          "align",            "align",          },
                    172:     {".extern",         "extern",           "extern",         },
                    173:     {".global",         "global",           "global",         },
                    174:     {".text",           "section\t.text",   ".code",          },
                    175:     {".data",           "section\t.data",   ".data",          },
                    176:     {"aaa",             "aaa",              "aaa",            },
                    177:        {"aad",             "aad",              "aad",            },
                    178:        {"aam",             "aam",              "aam",            },
                    179:        {"aas",             "aas",              "aas",            },
                    180:        {"adc",             "adc",              "adc",            },
                    181:        {"adcb",            "adc",              "adc",            },
                    182:        {"adcl",            "adc",              "adc",            },
                    183:        {"adcw",            "adc",              "adc",            },
                    184:        {"add",             "add",              "add",            },
                    185:        {"addb",            "add",              "add",            },
                    186:        {"addl",            "add",              "add",            },
                    187:        {"addw",            "add",              "add",            },
                    188:        {"and",             "and",              "and",            },
                    189:        {"andb",            "and",              "and",            },
                    190:        {"andl",            "and",              "and",            },
                    191:        {"andw",            "and",              "and",            },
                    192:        {"bswap",           "bswap",            "bswap",          },
                    193:        {"bt",              "bt",               "bt",             },
                    194:        {"btc",             "btc",              "btc",            },
                    195:        {"btr",             "btr",              "btr",            },
                    196:        {"bts",             "bts",              "bts",            },
                    197:        {"call",            "call",             "call",           },
                    198:        {"callf",           "callf",            "callf",          },
                    199:        {"cbw",             "cbw",              "cbw",            },
                    200:        {"cdq",             "cdq",              "cdq",            },
                    201:        {"clc",             "clc",              "clc",            },
                    202:        {"cld",             "cld",              "cld",            },
                    203:        {"cli",             "cli",              "cli",            },
                    204:        {"clts",            "clts",             "clts",           },
                    205:        {"cmc",             "cmc",              "cmc",            },
                    206:        {"cmp",             "cmp",              "cmp",            },
                    207:        {"cmpb",            "cmp",              "cmp",            },
                    208:        {"cmpl",            "cmp",              "cmp",            },
                    209:        {"cmpsb",           "cmpsb",            "cmpsb",          },
                    210:        {"cmpsd",           "cmpsd",            "cmpsd",          },
                    211:        {"cmpsw",           "cmpsw",            "cmpsw",          },
                    212:        {"cmpw",            "cmp",              "cmp",            },
                    213:        {"cpuid",           "cpuid",            "cpuid",          },
                    214:        {"cwd",             "cwd",              "cwd",            },
                    215:        {"cwde",            "cwde",             "cwde",           },
                    216:        {"daa",             "daa",              "daa",            },
                    217:        {"das",             "das",              "das",            },
                    218:        {"dec",             "dec",              "dec",            },
                    219:        {"decb",            "dec",              "dec",            },
                    220:        {"decl",            "dec",              "dec",            },
                    221:        {"decw",            "dec",              "dec",            },
                    222:        {"div",             "div",              "div",            },
                    223:        {"divb",            "div",              "div",            },
                    224:        {"divd",            "div",              "div",            },
                    225:        {"divw",            "div",              "div",            },
                    226:        {"fwait",           "fwait",            "fwait",          },
                    227:        {"hlt",             "hlt",              "hlt",            },
                    228:        {"idiv",            "idiv",             "idiv",           },
                    229:        {"idivb",           "idiv",             "idiv",           },
                    230:        {"idivd",           "idiv",             "idiv",           },
                    231:        {"idivw",           "idiv",             "idiv",           },
                    232:        {"imul",            "imul",             "imul",           },
                    233:        {"imulb",           "imul",             "imul",           },
                    234:        {"imuld",           "imul",             "imul",           },
                    235:        {"imulw",           "imul",             "imul",           },
                    236:        {"in",              "in",               "in",             },
                    237:        {"inc",             "inc",              "inc",            },
                    238:        {"incb",            "inc",              "inc",            },
                    239:        {"incl",            "inc",              "inc",            },
                    240:        {"incw",            "inc",              "inc",            },
                    241:        {"insb",            "insb",             "insb",           },
                    242:        {"insd",            "insd",             "insd",           },
                    243:        {"insw",            "insw",             "insw",           },
                    244:        {"int",             "int",              "int",            },
                    245:        {"into",            "into",             "into",           },
                    246:        {"iret",            "iret",             "iret",           },
                    247:        {"iretd",           "iretf",            "iretf",          },
                    248:        {"ja",              "ja",               "ja",             },
                    249:        {"jae",             "jae",              "jae",            },
                    250:        {"jael",            "jae",              "jae",            },
                    251:        {"jal",             "ja",               "ja",             },
                    252:        {"jb",              "jb",               "jb",             },
                    253:        {"jbe",             "jbe",              "jbe",            },
                    254:        {"jbel",            "jbe",              "jbe",            },
                    255:        {"jbl",             "jb",               "jb",             },
                    256:        {"jc",              "jc",               "jc",             },
                    257:        {"jcl",             "jc",               "jc",             },
                    258:        {"jcxz",            "jcxz",             "jcxz",           },
                    259:        {"je",              "je",               "je",             },
                    260:        {"jecxz",           "jecxz",            "jecxz",          },
                    261:        {"jel",             "je",               "je",             },
                    262:        {"jg",              "jg",               "jg",             },
                    263:        {"jge",             "jge",              "jge",            },
                    264:        {"jgel",            "jge",              "jge",            },
                    265:        {"jgl",             "jg",               "jg",             },
                    266:        {"jl",              "jl",               "jl",             },
                    267:        {"jle",             "jle",              "jle",            },
                    268:        {"jlel",            "jle",              "jle",            },
                    269:        {"jll",             "jl",               "jl",             },
                    270:        {"jmp",             "jmp",              "jmp",            },
                    271:        {"jmpf",            "jmpf",             "jmpf",           },
                    272:        {"jmpl",            "jmp",              "jmp",            },
                    273:        {"jna",             "jna",              "jna",            },
                    274:        {"jnae",            "jnae",             "jnae",           },
                    275:        {"jnael",           "jnae",             "jnae",           },
                    276:        {"jnal",            "jna",              "jna",            },
                    277:        {"jnb",             "jnb",              "jnb",            },
                    278:        {"jnbe",            "jnbe",             "jnbe",           },
                    279:        {"jnbel",           "jnbe",             "jnbe",           },
                    280:        {"jnbl",            "jnb",              "jnb",            },
                    281:        {"jnc",             "jnc",              "jnc",            },
                    282:        {"jncl",            "jnc",              "jnc",            },
                    283:        {"jne",             "jne",              "jne",            },
                    284:        {"jnel",            "jne",              "jne",            },
                    285:        {"jng",             "jng",              "jng",            },
                    286:        {"jnge",            "jnge",             "jnge",           },
                    287:        {"jngel",           "jnge",             "jnge",           },
                    288:        {"jngl",            "jng",              "jng",            },
                    289:        {"jnl",             "jnl",              "jnl",            },
                    290:        {"jnle",            "jnle",             "jnle",           },
                    291:        {"jnlel",           "jnle",             "jnle",           },
                    292:        {"jnll",            "jnl",              "jnl",            },
                    293:        {"jno",             "jno",              "jno",            },
                    294:        {"jnol",            "jno",              "jno",            },
                    295:        {"jnp",             "jnp",              "jnp",            },
                    296:        {"jnpl",            "jnp",              "jnp",            },
                    297:        {"jns",             "jns",              "jns",            },
                    298:        {"jnsl",            "jns",              "jns",            },
                    299:        {"jnz",             "jnz",              "jnz",            },
                    300:        {"jnzl",            "jnz",              "jnz",            },
                    301:        {"jo",              "jo",               "jo",             },
                    302:        {"jol",             "jo",               "jo",             },
                    303:        {"jp",              "jp",               "jp",             },
                    304:        {"jpe",             "jpe",              "jpe",            },
                    305:        {"jpel",            "jpe",              "jpe",            },
                    306:        {"jpl",             "jp",               "jp",             },
                    307:        {"jpo",             "jpo",              "jpo",            },
                    308:        {"jpol",            "jpo",              "jpo",            },
                    309:        {"js",              "js",               "js",             },
                    310:        {"jsl",             "js",               "js",             },
                    311:        {"jz",              "jz",               "jz",             },
                    312:        {"jzl",             "jz",               "jz",             },
                    313:        {"lahf",            "lahf",             "lahf",           },
                    314:        {"lds",             "lds",              "lds",            },
                    315:        {"lea",             "lea",              "lea",            },
                    316:        {"leave",           "leave",            "leave",          },
                    317:        {"les",             "les",              "les",            },
                    318:        {"lfs",             "lfs",              "lfs",            },
                    319:        {"lgdt",            "lgdt",             "lgdt",           },
                    320:        {"lgs",             "lgs",              "lgs",            },
                    321:        {"lidt",            "lidt",             "lidt",           },
                    322:        {"lldt",            "lldt",             "lldt",           },
                    323:        {"lmsw",            "lmsw",             "lmsw",           },
                    324:        {"lock",            "lock",             "lock",           },
                    325:        {"lodsb",           "lodsb",            "lodsb",          },
                    326:        {"lodsd",           "lodsd",            "lodsd",          },
                    327:        {"lodsw",           "lodsw",            "lodsw",          },
                    328:        {"loop",            "loop",             "loop",           },
                    329:        {"loope",           "loope",            "loope",          },
                    330:        {"loopne",          "loopne",           "loopne"          },
                    331:        {"loopnz",          "loopnz",           "loopnz"          },
                    332:        {"loopz",           "loopz",            "loopz",          },
                    333:        {"lss",             "lss",              "lss",            },
                    334:        {"ltr",             "ltr",              "ltr",            },
                    335:        {"mov",             "mov",              "mov",            },
                    336:        {"movb",            "mov",              "mov",            },
                    337:        {"movl",            "mov",              "mov",            },
                    338:        {"movsb",           "movsb",            "movsb",          },
                    339:        {"movsbl",          "movsx",            "movsx",          },
                    340:        {"movsbw",          "movsx",            "movsx",          },
                    341:        {"movsl",           "movsd",            "movsd",          },
                    342:        {"movsw",           "movsw",            "movsw",          },
                    343:        {"movswl",          "movsx",            "movsx",          },
                    344:        {"movw",            "mov",              "mov",            },
                    345:        {"movzbl",          "movzx",            "movzx",          },
                    346:        {"movzbw",          "movzx",            "movzx",          },
                    347:        {"movzwl",          "movzx",            "movzx",          },
                    348:        {"mul",             "mul",              "mul",            },
                    349:        {"mulb",            "mul",              "mul",            },
                    350:        {"muld",            "mul",              "mul",            },
                    351:        {"mulw",            "mul",              "mul",            },
                    352:        {"neg",             "neg",              "neg",            },
                    353:        {"negb",            "neg",              "neg",            },
                    354:        {"negw",            "neg",              "neg",            },
                    355:        {"negl",            "neg",              "neg",            },
                    356:        {"nop",             "nop",              "nop",            },
                    357:        {"not",             "not",              "not",            },
                    358:        {"notb",            "not",              "not",            },
                    359:        {"notw",            "not",              "not",            },
                    360:        {"notl",            "not",              "not",            },
                    361:        {"or",              "or",               "or",             },
                    362:        {"orb",             "or",               "or",             },
                    363:        {"orl",             "or",               "or",             },
                    364:        {"orw",             "or",               "or",             },
                    365:        {"out",             "out",              "out",            },
                    366:        {"outsb",           "outsb",            "outsb",          },
                    367:        {"outsd",           "outsd",            "outsd",          },
                    368:        {"outsw",           "outsw",            "outsw",          },
                    369:        {"pop",             "pop",              "pop",            },
                    370:        {"popa",            "popa",             "popa",           },
                    371:        {"popal",           "popad",            "popad",          },
                    372:        {"popl",            "pop",              "pop",            },
                    373:        {"popf",            "popf",             "popf",           },
                    374:        {"popfl",           "popfd",            "popfd",          },
                    375:        {"popw",            "pop",              "pop",            },
                    376:        {"push",            "push",             "push",           },
                    377:        {"pusha",           "pusha",            "pusha",          },
                    378:        {"pushal",          "pushad",           "pushad"          },
                    379:        {"pushl",           "push\tdword",      "push\tdword",    },
                    380:        {"pushf",           "pushf",            "pushf",          },
                    381:        {"pushfl",          "pushfd",           "pushfd"          },
                    382:        {"pushw",           "push\tword",       "push\tword",     },
                    383:        {"rclb",            "rcl",              "rcl",            },
                    384:        {"rcll",            "rcl",              "rcl",            },
                    385:        {"rclw",            "rcl",              "rcl",            },
                    386:        {"rcrb",            "rcr",              "rcr",            },
                    387:        {"rcrl",            "rcr",              "rcr",            },
                    388:        {"rcrw",            "rcr",              "rcr",            },
                    389:        {"rep",             "rep",              "rep",            },
                    390:        {"repe",            "repe",             "repe",           },
                    391:        {"repne",           "repne",            "repne",          },
                    392:        {"repnz",           "repnz",            "repnz",          },
                    393:        {"repz",            "repz",             "repz",           },
                    394:        {"ret",             "ret",              "ret",            },
                    395:        {"retd",            "retd",             "retd",           },
                    396:        {"retf",            "retf",             "retf",           },
                    397:        {"retfd",           "retfd",            "retfd",          },
                    398:        {"rolb",            "rol",              "rol",            },
                    399:        {"roll",            "rol",              "rol",            },
                    400:        {"rolw",            "rol",              "rol",            },
                    401:        {"rorb",            "ror",              "ror",            },
                    402:        {"rorl",            "ror",              "ror",            },
                    403:        {"rorw",            "ror",              "ror",            },
                    404:        {"sahf",            "sahf",             "sahf",           },
                    405:        {"salb",            "sal",              "sal",            },
                    406:        {"sall",            "sal",              "sal",            },
                    407:        {"salw",            "sal",              "sal",            },
                    408:        {"sarb",            "sar",              "sar",            },
                    409:        {"sarl",            "sar",              "sar",            },
                    410:        {"sarw",            "sar",              "sar",            },
                    411:        {"sbbb",            "sbb ",             "sbb ",           },
                    412:        {"sbbl",            "sbb ",             "sbb ",           },
                    413:        {"sbbw",            "sbb ",             "sbb ",           },
                    414:        {"scasb",           "scasb",            "scasb",          },
                    415:        {"scasd",           "scasd",            "scasd",          },
                    416:        {"scasw",           "scasw",            "scasw",          },
                    417:        {"seta",            "seta",             "seta",           },
                    418:        {"setae",           "setae",            "setae",          },
                    419:        {"setb",            "setb",             "setb",           },
                    420:        {"setbe",           "setbe",            "setbe",          },
                    421:        {"setc",            "setc",             "setc",           },
                    422:        {"sete",            "sete",             "sete",           },
                    423:        {"setg",            "setg",             "setg",           },
                    424:        {"setge",           "setge",            "setge",          },
                    425:        {"setl",            "setl",             "setl",           },
                    426:        {"setle",           "setle",            "setle",          },
                    427:        {"setna",           "setna",            "setna",          },
                    428:        {"setnae",          "setnae",           "setnae"          },
                    429:        {"setnb",           "setnb",            "setnb",          },
                    430:        {"setnbe",          "setnbe",           "setnbe"          },
                    431:        {"setnc",           "setnc",            "setnc",          },
                    432:        {"setne",           "setne",            "setne",          },
                    433:        {"setng",           "setng",            "setng",          },
                    434:        {"setnge",          "setnge",           "setnge"          },
                    435:        {"setnl",           "setnl",            "setnl",          },
                    436:        {"setnle",          "setnle",           "setnle"          },
                    437:        {"setno",           "setno",            "setno",          },
                    438:        {"setnp",           "setnp",            "setnp",          },
                    439:        {"setns",           "setns",            "setns",          },
                    440:        {"setnz",           "setnz",            "setnz",          },
                    441:        {"seto",            "seto",             "seto",           },
                    442:        {"setp",            "setp",             "setp",           },
                    443:        {"setpe",           "setpe",            "setpe",          },
                    444:        {"setpo",           "setpo",            "setpo",          },
                    445:        {"sets",            "sets",             "sets",           },
                    446:        {"setz",            "setz",             "setz",           },
                    447:        {"sgdt",            "sgdt",             "sgdt",           },
                    448:        {"shlb",            "shl",              "shl",            },
                    449:        {"shld",            "shld",             "shld",           },
                    450:        {"shll",            "shl",              "shl",            },
                    451:        {"shlw",            "shl",              "shl",            },
                    452:        {"shrb",            "shr",              "shr",            },
                    453:        {"shrd",            "shrd",             "shrd",           },
                    454:        {"shrl",            "shr",              "shr",            },
                    455:        {"shrw",            "shr",              "shr",            },
                    456:        {"sidt",            "sidt",             "sidt",           },
                    457:        {"sldt",            "sldt",             "sldt",           },
                    458:        {"smsw",            "smsw",             "smsw",           },
                    459:        {"stc",             "stc",              "stc",            },
                    460:        {"std",             "std",              "std",            },
                    461:        {"sti",             "sti",              "sti",            },
                    462:        {"stosb",           "stosb",            "stosb",          },
                    463:        {"stosl",           "stosd",            "stosd",          },
                    464:        {"stosw",           "stosw",            "stosw",          },
                    465:        {"subb",            "sub",              "sub",            },
                    466:        {"subl",            "sub",              "sub",            },
                    467:        {"subw",            "sub",              "sub",            },
                    468:        {"testb",           "test",             "test",           },
                    469:        {"testl",           "test",             "test",           },
                    470:        {"testw",           "test",             "test",           },
                    471:        {"verr",            "verr",             "verr",           },
                    472:        {"verw",            "verw",             "verw",           },
                    473:        {"wait",            "wait",             "wait",           },
                    474:        {"xchg",            "xchg",             "xchg",           },
                    475:        {"xchgb",           "xchg",             "xchg",           },
                    476:        {"xchgw",           "xchg",             "xchg",           },
                    477:        {"xchgl",           "xchg",             "xchg",           },
                    478:        {"xlat",            "xlat",             "xlat",           },
                    479:        {"xlatb",           "xlatb",            "xlatb",          },
                    480:        {"xorb",            "xor",              "xor",            },
                    481:        {"xorl",            "xor",              "xor",            },
                    482:        {"xorw",            "xor",              "xor",            },
                    483: };
                    484: 
                    485: #define SF                             0x80
                    486: #define ZF                             0x40
                    487: #define YF                             0x20
                    488: #define HF                             0x10
                    489: #define XF                             0x08
                    490: #define PF                             0x04
                    491: #define VF                             PF
                    492: #define NF                             0x02
                    493: #define CF                             0x01
                    494: 
                    495: #define INT_IRQ         0x01
                    496: #define INT_NMI                0x80
                    497: 
                    498: #define zF              M(1,"z80_AF",0,0,0,0)
                    499: #define zA                             M(1,"z80_AF",0,1,0,0)
                    500: #define zAF                    M(2,"z80_AF",0,0,0,0)
                    501: #define zAF32                  M(4,"z80_AF",0,0,0,0)
                    502: 
                    503: #define zC                             M(1,"z80_BC",0,0,0,0)
                    504: #define zB                             M(1,"z80_BC",0,1,0,0)
                    505: #define zBC                    M(2,"z80_BC",0,0,0,0)
                    506: #define zBC32                  M(4,"z80_BC",0,0,0,0)
                    507: 
                    508: #define zE                             M(1,"z80_DE",0,0,0,0)
                    509: #define zD                             M(1,"z80_DE",0,1,0,0)
                    510: #define zDE                    M(2,"z80_DE",0,0,0,0)
                    511: #define zDE32                  M(4,"z80_DE",0,0,0,0)
                    512: 
                    513: #define zL                             M(1,"z80_HL",0,0,0,0)
                    514: #define zH                             M(1,"z80_HL",0,1,0,0)
                    515: #define zHL                    M(2,"z80_HL",0,0,0,0)
                    516: #define zHL32                  M(4,"z80_HL",0,0,0,0)
                    517: 
                    518: #define zLX                    M(1,"z80_IX",0,0,0,0)
                    519: #define zHX                    M(1,"z80_IX",0,1,0,0)
                    520: #define zIX                    M(2,"z80_IX",0,0,0,0)
                    521: #define zIX32                  M(4,"z80_IX",0,0,0,0)
                    522: 
                    523: #define zLY                    M(1,"z80_IY",0,0,0,0)
                    524: #define zHY                    M(1,"z80_IY",0,1,0,0)
                    525: #define zIY                    M(2,"z80_IY",0,0,0,0)
                    526: #define zIY32                  M(4,"z80_IY",0,0,0,0)
                    527: 
                    528: #define zPCL                   M(1,"z80_PC",0,0,0,0)
                    529: #define zPCH                   M(1,"z80_PC",0,1,0,0)
                    530: #define zPC                    M(2,"z80_PC",0,0,0,0)
                    531: #define zPC32                  M(4,"z80_PC",0,0,0,0)
                    532: 
                    533: #define zSPL                   M(1,"z80_SP",0,0,0,0)
                    534: #define zSPH                   M(1,"z80_SP",0,1,0,0)
                    535: #define zSP                    M(2,"z80_SP",0,0,0,0)
                    536: #define zSP32                  M(4,"z80_SP",0,0,0,0)
                    537: 
                    538: #define zF2                    M(1,"z80_AF2",0,0,0,0)
                    539: #define zA2                    M(1,"z80_AF2",0,1,0,0)
                    540: #define zAF2            M(2,"z80_AF2",0,0,0,0)
                    541: #define zBC2                   M(2,"z80_BC2",0,0,0,0)
                    542: #define zDE2                   M(2,"z80_DE2",0,0,0,0)
                    543: #define zHL2                   M(2,"z80_HL2",0,0,0,0)
                    544: 
                    545: #define zR                             M(1,"z80_R",0,0,0,0)
                    546: #define zR2             M(1,"z80_R2",0,0,0,0)
                    547: #define zIFF1           M(1,"z80_IFF1",0,0,0,0)
                    548: #define zIFF2           M(1,"z80_IFF2",0,0,0,0)
                    549: #define zHALT           M(1,"z80_HALT",0,0,0,0)
                    550: #define zIM                    M(1,"z80_IM",0,0,0,0)
                    551: #define zI                             M(1,"z80_I",0,0,0,0)
                    552: #define pending                M(1,"z80_pending_irq",0,0,0,0)
                    553: #define vector_d               M(4,"z80_vector",0,0,0,0)
                    554: #define vector_w               M(2,"z80_vector",0,0,0,0)
                    555: #define vector_h               M(1,"z80_vector",0,2,0,0)
                    556: #define irq_max                M(4,"z80_irq_max",0,0,0,0)
                    557: #define request_irq    M(4,"z80_request_irq",0,0,0,0)
                    558: #define service_irq    M(4,"z80_service_irq",0,0,0,0)
                    559: #define int_state(n)   M(4,"z80_int_state",0,0,n,4)
                    560: #define irq(n,o)               M(4,"z80_irq",n,o,0,0)
                    561: #define nmi_state              M(4,"z80_nmi_state",0,0,0,0)
                    562: #define irq_state              M(4,"z80_irq_state",0,0,0,0)
                    563: #define irq_callback   M(4,"z80_irq_callback",0,0,0,0)
                    564: #define zEA                    M(4,"z80_EA",0,0,0,0)
                    565: #define zMB                    M(1,"z80_MB",0,0,0,0)
                    566: #define zDAA(n)                M(2,"z80_daa",0,0,n,2)
                    567: 
                    568: #define zICOUNT                M(4,"_Z80_ICount",0,0,0,0)
                    569: #define zITOTAL                M(4,"z80_itotal",0,0,0,0)
                    570: #define zIEXTRN                M(4,"z80_iextrn",0,0,0,0)
                    571: 
                    572: #define PREVPC                 M(4,"_previouspc",0,0,0,0)
                    573: #define DEBUG                  M(1,"_mame_debug",0,0,0,0)
                    574: #define BANKBASE(n)    M(4,"_cpu_bankbase",0,0,n,4)
                    575: #define MRHARD          M(4,"_cur_mrhard",0,0,0,0)
                    576: #define READHW(n,a)    M(1,"_readhardware",n,-0x4000,a,1)
                    577: #define READOFFSET(n)  M(4,"_memoryreadoffset",0,0,n,4)
                    578: #define READHANDLER(n) M(4,"_memoryreadhandler",0,0,n,4)
                    579: 
                    580: #define MWHARD          M(4,"_cur_mwhard",0,0,0,0)
                    581: #define WRITEHW(n,a)   M(1,"_writehardware",n,-0x4000,a,1)
                    582: #define WRITEOFFSET(n) M(4,"_memorywriteoffset",0,0,n,4)
                    583: #define WRITEHANDLER(n) M(4,"_memorywritehandler",0,0,n,4)
                    584: 
                    585: #define ROM             M(4,"_ROM",0,0,0,0)
                    586: #define RAM             M(4,"_RAM",0,0,0,0)
                    587: #define OP_ROM                 M(4,"_OP_ROM",0,0,0,0)
                    588: #define OP_RAM                 M(4,"_OP_RAM",0,0,0,0)
                    589: 
                    590: /* Z80 accu and flags mapped to x86 (E)AX register */
                    591: #define F                              AH
                    592: #define A                              AL
                    593: #define AF                             AX
                    594: #define AF32                   EAX
                    595: 
                    596: /* Z80 HL mapped to x86 (E)BX register */
                    597: #define L                              BL
                    598: #define H                              BH
                    599: #define HL                             BX
                    600: #define HL32                   EBX
                    601: 
                    602: /* Z80 program counter mapped to x86 (E)SI register */
                    603: #define pc32            esi
                    604: #define PC              SI
                    605: #define PC32            ESI
                    606: 
                    607: #include "z80daa.h"
                    608: 
                    609: void emit(const char *fmt, ...)
                    610: {
                    611: va_list arg;
                    612:     va_start(arg,fmt);
                    613:        vfprintf(output, fmt, arg);
                    614:     va_end(arg);
                    615:     fprintf(output, "\n");
                    616: }
                    617: 
                    618: void com(const char *fmt, ...)
                    619: {
                    620: va_list arg;
                    621: int len = 0;
                    622:        if (fmt) {
                    623:                if (as == GAS)
                    624:                        len += fprintf(output, "/* ");
                    625:                else
                    626:                        len += fprintf(output, "; ");
                    627:                va_start(arg, fmt);
                    628:                len += vfprintf(output, fmt, arg);
                    629:                va_end(arg);
                    630:                if (as == GAS)
                    631:                {
                    632:                        while (len < 72)
                    633:                        {
                    634:                                fprintf(output, "\t");
                    635:                                len += 8 - (len & 7);
                    636:                        }
                    637:                        fprintf(output, " */");
                    638:                }
                    639:     }
                    640:        fprintf(output, "\n");
                    641: }
                    642: 
                    643: /* return an immediate decimal byte size value */
                    644: const char *B(int value)
                    645: {
                    646:     static char B_str[32][16];
                    647:     static int which = 0;
                    648:     char *dst;
                    649: 
                    650:     which = ++which % 32;
                    651:     dst = B_str[which];
                    652:     if (as == GAS)
                    653:                sprintf(dst, "$%d", value);
                    654:     else
                    655:                sprintf(dst, "byte %d", value);
                    656:     return B_str[which];
                    657: }
                    658: 
                    659: /* return an immediate decimal value */
                    660: const char *D(int value)
                    661: {
                    662:     static char D_str[32][16];
                    663:     static int which = 0;
                    664:     char *dst;
                    665: 
                    666:     which = ++which % 32;
                    667:     dst = D_str[which];
                    668:     if (as == GAS)
                    669:         sprintf(dst, "$%d", value);
                    670:     else
                    671:         sprintf(dst, "%d", value);
                    672:     return D_str[which];
                    673: }
                    674: 
                    675: /* return an immediate hexadecimal value */
                    676: const char *X(int value)
                    677: {
                    678:     static char X_str[32][16];
                    679:     static int which = 0;
                    680:     char *dst;
                    681: 
                    682:     which = ++which % 32;
                    683:     dst = X_str[which];
                    684:     if (as == GAS)
                    685:         sprintf(dst, "$0x%x", value);
                    686:     else
                    687:         sprintf(dst, "0%xh", value);
                    688:     return X_str[which];
                    689: }
                    690: 
                    691: /* return a symbol with 'short' distance modifier (for NASM) */
                    692: char *LS(const char *symbol)
                    693: {
                    694:        static char buffer[128];
                    695:        if (as == NASM)
                    696:                sprintf(buffer, "short %s", symbol);
                    697:        else
                    698:                sprintf(buffer, "%s", symbol);
                    699:        return buffer;
                    700: }
                    701: 
                    702: /* return a symbol with 'near' distance modifier (for NASM) */
                    703: char *LN(const char *symbol)
                    704: {
                    705:        static char buffer[128];
                    706:        if (as == NASM)
                    707:                sprintf(buffer, "near %s", symbol);
                    708:        else
                    709:                sprintf(buffer, "%s", symbol);
                    710:        return buffer;
                    711: }
                    712: 
                    713: /* emit a symbol and optional comment */
                    714: void S(const char *symbol, const char *comment, ...)
                    715: {
                    716:        va_list arg;
                    717:        char buffer[256];
                    718:        char fmt[128];
                    719:        int len = 0;
                    720: 
                    721:     fmt[0] = '\0';
                    722:     if (symbol)
                    723:                len += sprintf(fmt, "%s:", symbol);
                    724:        if (comment) {
                    725:                while (len < 32) {
                    726:                        strcat(fmt,"\t");
                    727:                        len += 8 - (len & 7);
                    728:                }
                    729:                if (as == GAS) {
                    730:                        strcat(fmt,"/* ");
                    731:                        len += 3;
                    732:                } else {
                    733:                        strcat(fmt,"; ");
                    734:                        len += 2;
                    735:         }
                    736:                len += strlen(comment);
                    737:                strcat(fmt, comment);
                    738:     }
                    739:     va_start(arg, comment);
                    740:        len = len - strlen(fmt) + vsprintf(buffer, fmt, arg);
                    741:        va_end(arg);
                    742: 
                    743:        if (comment && as == GAS) {
                    744:                while (len < 72) {
                    745:                        strcat(buffer,"\t");
                    746:                        len += 8 - (len & 7);
                    747:         }
                    748:                strcat(buffer, "*/");
                    749:        }
                    750:        fprintf(output, "%s\n", buffer);
                    751: }
                    752: 
                    753: /* emit an symbol, x86 instruction, dst and src operands and comment */
                    754: void I(const char *sym, x86_token t, const char *dst, const char *src, const char *comment)
                    755: {
                    756:        char buffer[32], *p;
                    757:        int len = 0, first_tab;
                    758: 
                    759:        first_tab = (t < align) ? 24 : 8;
                    760:        if (sym)
                    761:                len += fprintf(output, "%s:", sym);
                    762: 
                    763:        strcpy(buffer, x86_token_str[t][as]);
                    764:        if (as == NASM) {
                    765:                p = strstr(buffer,"\tdword");       /* remove 'dword' once if it occurs twice */
                    766:                if (p && ((src && !strncmp(src,"dword",5)) || (dst && !strncmp(dst,"dword",5))))
                    767:                        *p = '\0';
                    768:                p = strstr(buffer,"\tword");        /* remove 'word' once if it occurs twice */
                    769:                if (p && ((src && !strncmp(src,"word",4)) || (dst && !strncmp(dst,"word",4))))
                    770:                        *p = '\0';
                    771:        }
                    772: 
                    773:        do {
                    774:                len = (len | 7) + 1;
                    775:                fprintf(output, "\t");
                    776:        } while (len < first_tab);
                    777: 
                    778:     len += fprintf(output, "%s", buffer);
                    779:     if (dst) {
                    780:                do {
                    781:                        len = (len | 7) + 1;
                    782:                        fprintf(output, "\t");
                    783:                } while (len < first_tab + 8);
                    784:         if (src) {
                    785:                        if (as == GAS)
                    786:                                len += fprintf(output, "%s, %s", src, dst);
                    787:                        else
                    788:                                len += fprintf(output, "%s, %s", dst, src);
                    789:                } else {
                    790:                        len += fprintf(output, "%s", dst);
                    791:         }
                    792:        } else {
                    793:                if (src) {
                    794:                        do {
                    795:                                len = (len | 7) + 1;
                    796:                                fprintf(output, "\t");
                    797:                        } while (len < first_tab + 8);
                    798:                        len += fprintf(output, "%s", src);
                    799:                }
                    800:     }
                    801:        if (comment) {
                    802:                do {
                    803:                        fprintf(output, "\t");
                    804:                        len = (len | 7) + 1;
                    805:                } while (len < 48);
                    806:                if (as == GAS) {
                    807:                        len += fprintf(output, "/* %s", comment);
                    808:                        while (len < 72) {
                    809:                                fprintf(output, "\t");
                    810:                                len = (len | 7) + 1;
                    811:             }
                    812:                        len += fprintf(output, " */");
                    813:                } else {
                    814:                        len += fprintf(output, "; %s", comment);
                    815:                }
                    816:        }
                    817:        fprintf(output, "\n");
                    818: }
                    819: 
                    820: /* return a memory reference */
                    821: const char *M(int size, const char *base, x86_regs r1, int offs, x86_regs r2, int mult)
                    822: {
                    823:        static char mem_str[32][64];
                    824:        static int which = 0;
                    825:        char *dst;
                    826: 
                    827:     which = ++which % 32;
                    828:     dst = mem_str[which];
                    829:        switch (as) {
                    830:                case GAS:
                    831:                        if (base) {
                    832:                                dst += sprintf(dst, "%s", base);
                    833:                                if (offs)
                    834:                                        dst += sprintf(dst, "%+d", offs);
                    835:                        } else {
                    836:                                if (offs)
                    837:                                        dst += sprintf(dst, "%d", offs);
                    838:                        }
                    839:                        if (r1) {
                    840:                                dst += sprintf(dst, "(%s", x86_rstr[r1][as]);
                    841:                                if (r2)
                    842:                                        dst += sprintf(dst, ",%s", x86_rstr[r2][as]);
                    843:                                if (mult)
                    844:                                        dst += sprintf(dst, ",%d", mult);
                    845:                                dst += sprintf(dst, ")");
                    846:                        } else if (r2) {
                    847:                                dst += sprintf(dst, "(,%s", x86_rstr[r2][as]);
                    848:                                if (mult)
                    849:                                        dst += sprintf(dst, ",%d", mult);
                    850:                                dst += sprintf(dst, ")");
                    851:                        }
                    852:                        break;
                    853: 
                    854:         case NASM:
                    855:                        switch (size) {
                    856:                                case 1:
                    857:                                        dst += sprintf(dst, "byte[");
                    858:                                        break;
                    859:                                case 2:
                    860:                                        dst += sprintf(dst, "word[");
                    861:                                        break;
                    862:                                case 4:
                    863:                                        dst += sprintf(dst, "dword[");
                    864:                                        break;
                    865:                                default:        /* no size prefix */
                    866:                                        dst += sprintf(dst, "[");
                    867:                        }
                    868:                        if (base)
                    869:                                dst += sprintf(dst, "%s", base);
                    870:                        if (r1) {
                    871:                                if (base)
                    872:                                        dst += sprintf(dst, "+");
                    873:                                dst += sprintf(dst, "%s", x86_rstr[r1][as]);
                    874:                                if (offs)
                    875:                                        dst += sprintf(dst, "%+d", offs);
                    876:                                if (r2) {
                    877:                                        dst += sprintf(dst, "+%s", x86_rstr[r2][as]);
                    878:                                        if (mult && mult > 1)
                    879:                                                dst += sprintf(dst, "*%d", mult);
                    880:                                }
                    881:                        } else if (r2) {
                    882:                                if (base)
                    883:                                        dst += sprintf(dst, "+");
                    884:                                dst += sprintf(dst, "%s", x86_rstr[r2][as]);
                    885:                                if (mult && mult > 1)
                    886:                                        dst += sprintf(dst, "*%d", mult);
                    887:                        } else {
                    888:                                if (offs) {
                    889:                                        if (base)
                    890:                                                dst += sprintf(dst, "%+d", offs);
                    891:                                        else
                    892:                                                dst += sprintf(dst, "%s", X(offs));
                    893:                                }
                    894:                        }
                    895:                        dst += sprintf(dst, "]");
                    896:                        break;
                    897: 
                    898:         case TASM:
                    899:                        switch (size) {
                    900:                                case 1:
                    901:                                        dst += sprintf(dst, "byte ptr [");
                    902:                                        break;
                    903:                                case 2:
                    904:                                        dst += sprintf(dst, "word ptr [");
                    905:                                        break;
                    906:                                case 4:
                    907:                                        dst += sprintf(dst, "dword ptr [");
                    908:                                        break;
                    909:                                default:        /* no size prefix */
                    910:                                        dst += sprintf(dst, "[");
                    911:                        }
                    912:                        if (base)
                    913:                                dst += sprintf(dst, "%s", base);
                    914:                        if (r1) {
                    915:                                if (base)
                    916:                                        dst += sprintf(dst, "+");
                    917:                                dst += sprintf(dst, "%s", x86_rstr[r1][as]);
                    918:                                if (offs)
                    919:                                        dst += sprintf(dst, "%+d", offs);
                    920:                                if (r2) {
                    921:                                        dst += sprintf(dst, "+%s", x86_rstr[r2][as]);
                    922:                                        if (mult)
                    923:                                                dst += sprintf(dst, "*%d", mult);
                    924:                                }
                    925:                        } else if (r2) {
                    926:                                if (base)
                    927:                                        dst += sprintf(dst, "+");
                    928:                                dst += sprintf(dst, "%s", x86_rstr[r2][as]);
                    929:                                if (mult)
                    930:                                        dst += sprintf(dst, "*%d", mult);
                    931:                        } else {
                    932:                                if (offs) {
                    933:                                        if (base)
                    934:                                                dst += sprintf(dst, "%+d", offs);
                    935:                                        else
                    936:                                                dst += sprintf(dst, "%s", X(offs));
                    937:                                }
                    938:                        }
                    939:                        dst += sprintf(dst, "]");
                    940:             break;
                    941:     }
                    942:     return mem_str[which];
                    943: }
                    944: 
                    945: /* return a x86 register name */
                    946: const char *R(x86_regs rg)
                    947: {
                    948:        if (as == GAS) {
                    949:                switch (rg) {
                    950:                        case none: return "none";
                    951:                        case al:  return "%al";
                    952:                        case ah:  return "%ah";
                    953:                        case cl:  return "%cl";
                    954:                        case ch:  return "%ch";
                    955:                        case dl:  return "%dl";
                    956:                        case dh:  return "%dh";
                    957:                        case bl:  return "%bl";
                    958:                        case bh:  return "%bh";
                    959:                        case ax:  return "%ax";
                    960:                        case cx:  return "%cx";
                    961:                        case dx:  return "%dx";
                    962:                        case bx:  return "%bx";
                    963:                        case si:  return "%si";
                    964:                        case di:  return "%di";
                    965:                        case bp:  return "%bp";
                    966:                        case sp:  return "%sp";
                    967:                        case eax: return "%eax";
                    968:                        case ecx: return "%ecx";
                    969:                        case edx: return "%edx";
                    970:                        case ebx: return "%ebx";
                    971:                        case esi: return "%esi";
                    972:                        case edi: return "%edi";
                    973:                        case ebp: return "%ebp";
                    974:                        case esp: return "%esp";
                    975:                }
                    976:        } else {
                    977:                switch (rg) {
                    978:                        case none: return "none";
                    979:             case al:  return "al";
                    980:                        case ah:  return "ah";
                    981:                        case cl:  return "cl";
                    982:                        case ch:  return "ch";
                    983:                        case dl:  return "dl";
                    984:                        case dh:  return "dh";
                    985:                        case bl:  return "bl";
                    986:                        case bh:  return "bh";
                    987:                        case ax:  return "ax";
                    988:                        case cx:  return "cx";
                    989:                        case dx:  return "dx";
                    990:                        case bx:  return "bx";
                    991:                        case si:  return "si";
                    992:                        case di:  return "di";
                    993:                        case bp:  return "bp";
                    994:                        case sp:  return "sp";
                    995:                        case eax: return "eax";
                    996:                        case ecx: return "ecx";
                    997:                        case edx: return "edx";
                    998:                        case ebx: return "ebx";
                    999:                        case esi: return "esi";
                   1000:                        case edi: return "edi";
                   1001:                        case ebp: return "ebp";
                   1002:                        case esp: return "esp";
                   1003:         }
                   1004:     }
                   1005:        return "xx";
                   1006: }
                   1007: 
                   1008: const char *O(const char *symbol)
                   1009: {
                   1010:        static char ofs_str[32][32];
                   1011:        static int which = 0;
                   1012:        char *dst;
                   1013: 
                   1014:     which = ++which % 32;
                   1015:        dst = ofs_str[which];
                   1016:        switch (as) {
                   1017:                case GAS:       /* GAS: $ indicates immediate (address of) */
                   1018:                        sprintf(dst, "$%s", symbol);
                   1019:                        break;
                   1020:                case NASM:      /* NASM: only the name w/o square brackets */
                   1021:                        sprintf(dst, "%s", symbol);
                   1022:                        break;
                   1023:                case TASM:      /* TASM: offset name */
                   1024:                        sprintf(dst, "offset %s", symbol);
                   1025:             break;
                   1026:     }
                   1027:        return ofs_str[which];
                   1028: }
                   1029: 
                   1030: int str(char *dst, const char *src)
                   1031: {
                   1032:        int argc = 0;
                   1033:        char strdelim = '"';
                   1034: 
                   1035:        if (as == GAS) {
                   1036:                *dst++ = strdelim;
                   1037:                while (*src) {
                   1038:                        switch (*src) {
                   1039:                                case '\b':   /* backspace */
                   1040:                                        dst += sprintf(dst, "\\010");
                   1041:                                        break;
                   1042:                                case '\t':   /* tab */
                   1043:                                        dst += sprintf(dst, "\\011");
                   1044:                                        break;
                   1045:                                case '\n':   /* newline */
                   1046:                                        dst += sprintf(dst, "\\012");
                   1047:                                        break;
                   1048:                                case '\r':   /* carriage return  */
                   1049:                                        dst += sprintf(dst, "\\015");
                   1050:                                        break;
                   1051:                                default:
                   1052:                                        if (src[0] == '%' && src[1] != '%')
                   1053:                                                argc++;
                   1054:                                        *dst++ = *src;
                   1055:                        }
                   1056:                        src++;
                   1057:                }
                   1058:                strcpy(dst, "\\000\"");
                   1059:        } else {
                   1060:                char len = 0;
                   1061:                int instr = 0;
                   1062: 
                   1063:                while (*src) {
                   1064:                        switch (*src) {
                   1065:                                case '\b':   /* backspace */
                   1066:                                case '\t':   /* tab */
                   1067:                                case '\n':   /* line feed */
                   1068:                                case '\r':   /* new line */
                   1069:                                        if (instr) {
                   1070:                                                *dst++ = strdelim;
                   1071:                                                len++;
                   1072:                                                instr = 0;
                   1073:                                        }
                   1074:                                        if (len) {
                   1075:                                                *dst++ = ',';
                   1076:                                                len++;
                   1077:                                        }
                   1078:                                        dst += sprintf(dst, "%d", *src);
                   1079:                                        break;
                   1080:                                default:
                   1081:                                        if (src[0] == '%' && src[1] != '%')
                   1082:                                                argc++;
                   1083:                                        if (!instr) {
                   1084:                                                if (len) {
                   1085:                                                        *dst++ = ',';
                   1086:                                                        len++;
                   1087:                                                }
                   1088:                         *dst++ = strdelim;
                   1089:                                                len++;
                   1090:                                                instr = 1;
                   1091:                                        }
                   1092:                     *dst++ = *src;
                   1093:                                        len++;
                   1094:                        }
                   1095:                        src++;
                   1096:                }
                   1097:                if (instr) {
                   1098:                        *dst++ = strdelim;
                   1099:                        len++;
                   1100:                }
                   1101:                if (len)
                   1102:                        *dst++ = ',';
                   1103:                strcpy(dst, "0");
                   1104:     }
                   1105:     return argc;
                   1106: }
                   1107: 
                   1108: void debug(int level, char *fmt, ...)
                   1109: {
                   1110:        static int dbg_cnt = 0;
                   1111:        va_list args;
                   1112: 
                   1113:     if (verbose >= level) {
                   1114:                int i, argc;
                   1115:                char dbgtxt[16], dbgend[16], format[128];
                   1116:                char *arg, pusharg[32][64];
                   1117: 
                   1118:         argc = str(format, fmt);
                   1119:         dbg_cnt++;
                   1120:                sprintf(dbgtxt, "L%04x", dbg_cnt);
                   1121:                sprintf(dbgend, "L%04xx", dbg_cnt);
                   1122:                I(0,            data,   0,                                      0,              0);
                   1123:                I(dbgtxt,       dm,     format,                         0,              0);
                   1124:                I(0,            text,   0,                                      0,              0);
                   1125:         va_start(args, fmt);
                   1126:                for (i = 0; i < argc; i++) {
                   1127:                        arg = va_arg(args, char *);
                   1128:                        sprintf(pusharg[i],"\t%s\t%s\n",x86_token_str[pushl][as],arg);
                   1129:                }
                   1130:                va_end(args);
                   1131:                I(0,testl,      M(4,"_errorlog",0,0,0,0),   D(-1),  0);
                   1132:                I(0,je,         LS(dbgend),                             0,              0);
                   1133:                I(0,pushad,0,0,0);
                   1134:                for (i = argc - 1; i >= 0; i--)
                   1135:                        fputs(pusharg[i], output);
                   1136:                I(0,pushl,      O(dbgtxt),                                      0,              0);
                   1137:                I(0,pushl,      M(4,"_errorlog",0,0,0,0),   0,      0);
                   1138:                I(0,call, "_fprintf",                   0,      0);
                   1139:                I(0,addl,       ESP,                                            D((argc + 2) * 4),0);
                   1140:                I(0,popad,      0,                                                      0,              0);
                   1141:                S(dbgend,0);
                   1142:     }
                   1143: }
                   1144: 
                   1145: static void dumpregs(void)
                   1146: {
                   1147:        debug(8,"AF:%04x BC:%04x DE:%04x HL:%04x IX:%04x IY:%04x SP:%04x PC:%04x PC:%04x\n",
                   1148:                zAF,zBC,zDE,zHL,zIX,zIY,zSP,zPC);
                   1149: }
                   1150: 
                   1151: 
                   1152: static void pad(int alignment)
                   1153: {
                   1154:        char buffer[4+1];
                   1155:        com(0);
                   1156:        if (alignment) {
                   1157:                if (as == GAS) {
                   1158:                        sprintf(buffer, "%d", alignment);
                   1159:                        I(0,align,buffer,0,0);
                   1160:                } else {
                   1161:                        sprintf(buffer, "%d", 2<<alignment);
                   1162:                        I(0,align,buffer,0,0);
                   1163:                }
                   1164:        }
                   1165: }
                   1166: 
                   1167: static void save_af(void)
                   1168: {
                   1169:     I(0,movb,   zF,         F,          "save F");
                   1170:        I(0,movb,       zA,             A,                      "save A");
                   1171: }
                   1172: 
                   1173: static void restore_af(void)
                   1174: {
                   1175:        I(0,movzbl, AF32,               zA,             "get A");
                   1176:        I(0,movb,       F,                      zF,             "get F");
                   1177: }
                   1178: 
                   1179: static void save_z80(int opsize)
                   1180: {
                   1181:        I(0,movw,       zPC,            PC,             "save PC");
                   1182:        I(0,movw,       zHL,            HL,             "save HL");
                   1183: #if CALC_PREVPC
                   1184:     if (opsize) {
                   1185:                if ( opsize == +1 )
                   1186:                        I(0,decl,       PC32,           0,                      "subtract opcode size from PC");
                   1187:                else
                   1188:                        I(0,subl,       PC32,           B(opsize),      "subtract opcode size from PC");
                   1189:                I(0,movl,       PREVPC,         PC32,           "store previous PC");
                   1190:        }
                   1191: #endif
                   1192: }
                   1193: 
                   1194: static void restore_z80(void)
                   1195: {
                   1196:        I(0,movzwl, PC32,               zPC,            "get PC");
                   1197:        I(0,movzwl, HL32,               zHL,            "get HL");
                   1198: }
                   1199: 
                   1200: /*************************************************************************
                   1201:  * MOVB
                   1202:  * Move register/memory from src to dst
                   1203:  *************************************************************************/
                   1204: static void MOVB( const char *dst, const char *src, const char *comment, ... )
                   1205: {
                   1206:        char buffer[128+1];
                   1207:     va_list arg;
                   1208:        va_start(arg, comment);
                   1209:        vsprintf(buffer, comment, arg);
                   1210:     va_end(arg);
                   1211: 
                   1212:     if (!strcmp(dst, src))
                   1213:                return;
                   1214:     if (!strcmp(dst, AL) || !strcmp(src, AL) ||
                   1215:         !strcmp(dst, AH) || !strcmp(src, AH) ||
                   1216:         !strcmp(dst, CL) || !strcmp(src, CL) ||
                   1217:         !strcmp(dst, CH) || !strcmp(src, CH) ||
                   1218:         !strcmp(dst, DL) || !strcmp(src, DL) ||
                   1219:         !strcmp(dst, DH) || !strcmp(src, DH) ||
                   1220:         !strcmp(dst, BL) || !strcmp(src, BL) ||
                   1221:         !strcmp(dst, BH) || !strcmp(src, BH)) {
                   1222:         if (!strcmp(dst,EAX) || !strcmp(dst,ECX) ||
                   1223:             !strcmp(dst,EDX) || !strcmp(dst,EBX) ||
                   1224:             !strcmp(dst,EBP) || !strcmp(dst,ESI) ||
                   1225:             !strcmp(dst,EDI) || !strcmp(dst,ESP)) {
                   1226:                        /* zero extend byte register */
                   1227:                        I(0,movzbl, dst,        src,    buffer);
                   1228:         } else {
                   1229:                        /* dst and src are byte register */
                   1230:                        I(0,movb,       dst,    src,    buffer);
                   1231:         }
                   1232:     } else {
                   1233:         if (!strcmp(dst,EAX) || !strcmp(dst,ECX) ||
                   1234:             !strcmp(dst,EDX) || !strcmp(dst,EBX) ||
                   1235:             !strcmp(dst,EBP) || !strcmp(dst,ESI) ||
                   1236:             !strcmp(dst,EDI) || !strcmp(dst,ESP)) {
                   1237:                        /* zero extend memory byte */
                   1238:                        I(0,movzbl, dst,        src,    buffer);
                   1239:         } else {
                   1240:                        /* memory to memory byte transfer */
                   1241:                        I(0,movb,       CL,     src,    buffer);
                   1242:             I(0,movb,   dst,    CL,     0);
                   1243:         }
                   1244:     }
                   1245: }
                   1246: 
                   1247: /*************************************************************************
                   1248:  * ADJUST_PC
                   1249:  * increment/decrement or adjust program counter (PC)
                   1250:  *************************************************************************/
                   1251: void ADJUST_PC( int offset )
                   1252: {
                   1253:        if (offset == +1)
                   1254:                I(0,incl,       PC32,   0,                                      "increment PC");
                   1255:        else
                   1256:        if (offset == -1)
                   1257:                I(0,decl,       PC32,   0,                                      "decrement PC");
                   1258:        else
                   1259:                I(0,addl,       PC32,   B(offset),                      "adjust PC");
                   1260: }
                   1261: 
                   1262: /*************************************************************************
                   1263:  * ROP
                   1264:  * Read opcode from OP_ROM at PC
                   1265:  *************************************************************************/
                   1266: static void ROP( void )
                   1267: {
                   1268:        I(0,movl,       EDI,    OP_ROM,                         "get OP_ROM base");
                   1269:        I(0,movzbl, ECX,        M(1,0,edi,0,pc32,1),"read opcode byte");
                   1270:        ADJUST_PC(+1);
                   1271: }
                   1272: 
                   1273: /*************************************************************************
                   1274:  * ARG
                   1275:  * dst         where to store the result
                   1276:  * Get an 8 bit argument from OP_RAM at PC
                   1277:  *************************************************************************/
                   1278: static void ARG( const char *dst )
                   1279: {
                   1280:        I(0,movl,       EDI,    OP_RAM,         "get OP_RAM base");
                   1281:        MOVB( dst, M(1,0,edi,0,pc32,1), "read opcode argument byte");
                   1282:        ADJUST_PC(+1);
                   1283: }
                   1284: 
                   1285: /*************************************************************************
                   1286:  * ARG16
                   1287:  * dst         where to store the result
                   1288:  * Get an 16 bit argument from OP_RAM at PC
                   1289:  *************************************************************************/
                   1290: static void ARG16(const char *dst)
                   1291: {
                   1292:        I(0,movl,       EDI,    OP_RAM,         "get OP_RAM base");
                   1293:        if (!strcmp(dst, EAX) || !strcmp(dst, ECX) ||
                   1294:                !strcmp(dst, EDX) || !strcmp(dst, EBX) ||
                   1295:                !strcmp(dst, ESI) || !strcmp(dst, EDI) ||
                   1296:                !strcmp(dst, EBP) || !strcmp(dst, ESP)) {
                   1297:                I(0,movzwl, dst,        M(2,0,edi,0,pc32,1), "read opcode argument word (zero extend)");
                   1298:        } else {
                   1299:                I(0,movzwl, ECX,        M(2,0,edi,0,pc32,1), "read opcode argument word (zero extend)");
                   1300:         I(0,movl,   dst,    ECX,        "store result");
                   1301:        }
                   1302:        if (strcmp(dst, PC32))  /* not loaded PC itself? */
                   1303:                ADJUST_PC(+2);
                   1304: }
                   1305: 
                   1306: /*************************************************************************
                   1307:  * REL
                   1308:  * Get an sign extended byte argument from OP_RAM at PC into ECX
                   1309:  *************************************************************************/
                   1310: static void REL( void )
                   1311: {
                   1312:        I(0,movl,       EDI,    OP_RAM,                         "get OP_RAM base");
                   1313:        I(0,movsbl, ECX,        M(1,0,edi,0,pc32,1),"read 2's complement offset");
                   1314:        ADJUST_PC(+1);
                   1315: }
                   1316: 
                   1317: /*************************************************************************
                   1318:  * OFS
                   1319:  * base        IX or IY register (dword[z80_IX] or dword[z80_IY])
                   1320:  * Build index register plus ofs8 (2's complement offset)
                   1321:  *************************************************************************/
                   1322: static void OFS(const char *base)
                   1323: {
                   1324:        I(0,movl,       EDI,    OP_RAM,                         "get OP_RAM base");
                   1325:        I(0,movsbl, ECX,        M(1,0,edi,0,pc32,1),"read opcode argument byte");
                   1326:        I(0,addl,       ECX,    base,                           "add index register");
                   1327:        I(0,movzwl, EBP,        CX,                             "16 address bits");
                   1328:     ADJUST_PC(+1);
                   1329: }
                   1330: 
                   1331: /*************************************************************************
                   1332:  * CHANGE_PC
                   1333:  * Check if cur_mrhard for the new PC has changed and call
                   1334:  * cpu_setOPbase16 if necessary
                   1335:  *************************************************************************/
                   1336: static void CHANGE_PC( void )
                   1337: {
                   1338:        static int chgpc = 0;
                   1339:     char symbol[32+1];
                   1340:        chgpc++;
                   1341:        sprintf(symbol,"chgpc_%02x", chgpc);
                   1342:        I(0,movzwl, ECX,        PC,                                     "get PC to ECX");
                   1343:        I(0,movl,       PC32,   ECX,                                    "make PC 16 bit again");
                   1344:     I(0,movl,   EDI,    MRHARD,                 0);
                   1345:     I(0,shrl,   ECX,    D(ABITS),               ">> (ABITS2_16 + ABITS_MIN_16)");
                   1346:        I(0,movb,       CL,     M(1,0,edi,0,ecx,1),     "get cur_mrhard[index]");
                   1347:        I(0,cmpb,       CL,     M(1,"_ophw",0,0,0,0),   "changed?");
                   1348:        I(0,je,         LS(symbol),0,                                   "no, skip");
                   1349:     save_af();
                   1350:        save_z80( 0 );
                   1351:        I(0,pushl,      PC32,   0,                                              0);
                   1352:        I(0,call,       "_cpu_setOPbase16",0,           0);
                   1353:        I(0,addl,       ESP,    B(4),                                   0);
                   1354:        restore_z80();
                   1355:        restore_af();
                   1356:        S(symbol,0);
                   1357: }
                   1358: 
                   1359: /*************************************************************************
                   1360:  * RBYTE
                   1361:  * dst where to store the result
                   1362:  * src memory address
                   1363:  * Read a byte from memory
                   1364:  *************************************************************************/
                   1365: static void RBYTE( int opsize, const char *val, const char *src )
                   1366: {
                   1367:        char symbol[15+1];
                   1368:        rbyte++;
                   1369:        sprintf(symbol,"rbyte%d",   opsize*CALC_PREVPC);
                   1370:        if (strcmp(src, EBP))
                   1371:                I(0,movl,       EBP,    src,            "memory address to EBP");
                   1372:        I(0,call,       symbol, 0,                      "read byte");
                   1373:        if( strcmp(val, EDX) && strcmp(val, DX)  && strcmp(val, DL) )
                   1374:                I(0,movl,       val,    EDX,            "store result");
                   1375: }
                   1376: 
                   1377: /*************************************************************************
                   1378:  * RWORD
                   1379:  * val where to store the result
                   1380:  * src memory address
                   1381:  * Read a word from memory
                   1382:  *************************************************************************/
                   1383: static void RWORD( int opsize, const char *val, const char *src )
                   1384: {
                   1385:        char symbol[15+1];
                   1386:        rword++;
                   1387:        sprintf(symbol,"rword%d", opsize*CALC_PREVPC);
                   1388:        if (strcmp(src, EBP))
                   1389:                I(0,movl,       EBP,    src,            "memory address to EBP");
                   1390:        I(0,call,       symbol, 0,                      "read word");
                   1391:        if( strcmp(val, EDX) && strcmp(val, DX)  && strcmp(val, DL) )
                   1392:                I(0,movl,       val,    EDX,            "store result");
                   1393: }
                   1394: 
                   1395: /*************************************************************************
                   1396:  * WBYTE
                   1397:  * dst memory address
                   1398:  * val value to store
                   1399:  * Write a byte to memory
                   1400:  *************************************************************************/
                   1401: static void WBYTE( int opsize, const char *dst, const char *val )
                   1402: {
                   1403:        char symbol[15+1];
                   1404:        wbyte++;
                   1405:        sprintf(symbol,"wbyte%d", opsize*CALC_PREVPC);
                   1406:        if (strcmp(dst, EBP))
                   1407:                I(0,movl,       EBP,    dst,    "memory address to EBP");
                   1408:        if (strcmp(val, EDX))
                   1409:                I(0,movl,       EDX,    val,    "get value to EDX");
                   1410:        I(0,call,       symbol, 0,              "write byte");
                   1411: }
                   1412: 
                   1413: /*************************************************************************
                   1414:  * WWORD
                   1415:  * dst memory address
                   1416:  * val value to store
                   1417:  * Write a word to memory
                   1418:  *************************************************************************/
                   1419: static void WWORD( int opsize, const char *dst, const char *val )
                   1420: {
                   1421:        char symbol[15+1];
                   1422:        wword++;
                   1423:        sprintf(symbol,"wword%d", opsize*CALC_PREVPC);
                   1424:        if (strcmp(dst, EBP))
                   1425:                I(0,movl,       EBP,    dst,    "memory address to EBP");
                   1426:        if (strcmp(val, EDX))
                   1427:                I(0,movl,       EDX,    val,    "get value to EDX");
                   1428:        I(0,call,       symbol, 0,              "write word");
                   1429: }
                   1430: 
                   1431: static void PUSH( int opsize, const char *src )
                   1432: {
                   1433:        char reg[32+1];
                   1434:        strcpy(reg, src);
                   1435:        I(0,subw,       zSP,    B(2),   0);
                   1436:        WWORD( opsize, zSP32, reg );
                   1437: }
                   1438: 
                   1439: static void POP( int opsize, const char *dst )
                   1440: {
                   1441:        char reg[32+1];
                   1442:        strcpy(reg, dst);
                   1443:        RWORD( opsize, reg, zSP32 );
                   1444:        I(0,addw,       zSP,    B(2),   0);
                   1445: }
                   1446: 
                   1447: static char *beg_opcode(int cycles, const char *symbol, const char *comment, ...)
                   1448: {
                   1449:        static char endfunc[32];
                   1450:        char begfunc[32], *dst = begfunc;
                   1451:        char buffer[256];
                   1452:        va_list args;
                   1453: 
                   1454: #if GLOBL
                   1455:        /* put an underscore in front of the symbol */
                   1456:        sprintf(dst, "_%s", symbol);
                   1457:        I(0,globl,begfunc,0,0);
                   1458: #else
                   1459:        /* extract the symbol */
                   1460:     strcpy(dst, symbol);
                   1461: #endif
                   1462: 
                   1463:        /* symbol to put at the end of the function */
                   1464:        sprintf(endfunc, "L%s", begfunc);
                   1465: 
                   1466:        if (comment) {
                   1467:                va_start(args, comment);
                   1468:                vsprintf(buffer, comment, args);
                   1469:                va_end(args);
                   1470:                com("***** %s", buffer);
                   1471:        }
                   1472:        pad(align_funcs);
                   1473:     S(begfunc,0);
                   1474:        if (cycles)
                   1475:                I(0,subl,       zICOUNT,        B(cycles),      "subtract from ICount");
                   1476:        if (strncmp(symbol,"xx",2)) /* M1 type opcode fetch? */
                   1477:                I(0,incb,       zR,             0,                      "increment R register once");
                   1478: 
                   1479:     opcodes++;
                   1480: 
                   1481:     return endfunc;
                   1482: }
                   1483: 
                   1484: static void end_opcode(const char *op_base)
                   1485: {
                   1486:     if (!strcmp(op_base, "z_op")) {
                   1487:                I(0,orl,        zICOUNT,        B(0),                   "all cycles used up?");
                   1488:                I(0,jle,        LN("z80_execute_done"),0,   0);
                   1489: #if (!CALC_PREVPC)
                   1490:                I(0,movl,       PREVPC,         PC32,                   "store previous PC");
                   1491: #endif
                   1492:         if (mame_debug) {
                   1493:                        I(0,testb,      DEBUG,                  D(1),           0);
                   1494:                        I(0,jne,        LN("z80_mame_debug"),0,     0);
                   1495:         }
                   1496:     }
                   1497:     if (strcmp(op_base, "z_xx")) {
                   1498:         ROP();
                   1499:        } else {
                   1500:                ARG( ECX );  /* byte #4 of [DD/FD CB <ofs8> xx] is read as op_arg! */
                   1501:        }
                   1502:        I(0,jmp,        M(4,op_base,0,0,ecx,4),0,               "jump to opcode handler");
                   1503:     com(0);
                   1504: }
                   1505: 
                   1506: static void mk_debug( void )
                   1507: {
                   1508:        save_af();
                   1509:        save_z80(0);
                   1510: #if 0
                   1511:     I(0,movb,   AL,             zR,         "get R");
                   1512:     I(0,andb,   AL,             X(0x7f),    "mask lower seven bits");
                   1513:     I(0,orb,    AL,             zR2,        "get original bit 7");
                   1514:     I(0,movb,   zR,             AL,         "save it for the debugger");
                   1515: #endif
                   1516:     I(0,call,   "_MAME_Debug",  0,          0);
                   1517:        restore_z80();
                   1518:        restore_af();
                   1519: }
                   1520: 
                   1521: static void mk_take_irq( int opcode )
                   1522: {
                   1523:        char symbol[14][32+1];
                   1524:        sprintf(symbol[ 0],"z80_%02x_check_daisy_1",    opcode);
                   1525:        sprintf(symbol[ 1],"z80_%02x_check_daisy_2",    opcode);
                   1526:        sprintf(symbol[ 2],"z80_%02x_check_daisy_3",    opcode);
                   1527:        sprintf(symbol[ 3],"z80_%02x_check_daisy_4",    opcode);
                   1528:        sprintf(symbol[ 4],"z80_%02x_check_daisy_5",    opcode);
                   1529:        sprintf(symbol[ 5],"z80_%02x_take_irq_1",       opcode);
                   1530:        sprintf(symbol[ 6],"z80_%02x_take_irq_2",       opcode);
                   1531:        sprintf(symbol[ 7],"z80_%02x_take_irq_3",       opcode);
                   1532:        sprintf(symbol[ 8],"z80_%02x_take_irq_4",       opcode);
                   1533:        sprintf(symbol[ 9],"z80_%02x_take_irq_5",       opcode);
                   1534:        sprintf(symbol[10],"z80_%02x_take_irq_6",       opcode);
                   1535:        sprintf(symbol[11],"z80_%02x_take_irq_7",       opcode);
                   1536:        sprintf(symbol[12],"z80_%02x_take_irq_8",       opcode);
                   1537:        sprintf(symbol[13],"z80_%02x_take_irq_done",    opcode);
                   1538: 
                   1539:     I(0,cmpl,   irq_max,        B(0),               "daisy chain mode?");
                   1540:        I(0,je,         LN(symbol[ 5]),0,                                       "no, single int");
                   1541: 
                   1542: #if (!EARLY_CTC)
                   1543:        com("===================================================================");
                   1544:        com("  Z80CTC code                                                      ");
                   1545:     com("===================================================================");
                   1546:     save_af();
                   1547:        I(0,movb,       zIFF1,                  D(0),                           "clear IFF1");
                   1548:     I(0,pushl,  D(0),           0,                  "irqline always 0");
                   1549:        I(0,call,       irq_callback,   0,                                      "get the vector");
                   1550:     I(0,addl,   ESP,            B(4),               "clean up stack");
                   1551:     I(0,movzbl, EDX,            AL,                 "EDX = state");
                   1552:        I(0,movl,       ECX,                    EAX,                            0);
                   1553:        restore_af();
                   1554:        I(0,shrl,       ECX,                    D(8),                           "ECX = device");
                   1555:        I(0,cmpl,       EDX,                    int_state(ecx),         "state change?");
                   1556:        I(0,je,         LN(symbol[ 4]),0,                                       "no change, skip");
                   1557:        I(0,movl,       int_state(ecx), EDX,                            "store new state");
                   1558:        I(0,movl,       EDX,                    D(-1),                          0);
                   1559:        I(0,movl,       ECX,                    D(0),                           0);
                   1560:        I(0,movl,       request_irq,    EDX,                            "reset request IRQ");
                   1561:        I(0,movl,       service_irq,    EDX,                            "reset service IRQ");
                   1562:     pad(align_loops);
                   1563:        S(symbol[1],0);
                   1564:        I(0,testl,      int_state(ecx), X(Z80_INT_IEO),         "Z80_INT_IEO set?");
                   1565:        I(0,je,         LS(symbol[2]),0,                                        "no, skip");
                   1566:        I(0,movl,       request_irq,    EDX,                            "mask lower IRQ");
                   1567:        I(0,movl,       service_irq,    ECX,                            "set service device number");
                   1568:     com(0);
                   1569:        S(symbol[2],0);
                   1570:        I(0,testl,      int_state(ecx), X(Z80_INT_REQ),         "Z80_INT_REQ set?");
                   1571:        I(0,je,         LS(symbol[3]),0,                                        "no, skip");
                   1572:        I(0,movl,       request_irq,    ECX,                            "set request device number");
                   1573:     com(0);
                   1574:        S(symbol[3],0);
                   1575:        I(0,incl,       ECX,                    0,                                      "next device");
                   1576:        I(0,cmpl,       ECX,                    irq_max,                        "more entries to check?");
                   1577:        I(0,jb,         LS(symbol[1]),0,                                        "yes, check them");
                   1578: #endif
                   1579:        com("===================================================================");
                   1580:        com("  check Z80CTC request irq                                         ");
                   1581:     com("===================================================================");
                   1582:        S(symbol[ 4],0);
                   1583:     I(0,movl,   ECX,            request_irq,        "get device");
                   1584:        I(0,cmpl,       ECX,                    B(0),                           "request?");
                   1585:        I(0,jl,         LN(symbol[13]),0,                                       "should not happen, but...");
                   1586:     save_af();
                   1587:        I(0,lea,        ECX,                    M(0,0,0,0,ecx,4),       "* sizeof(Z80_DaisyChain)");
                   1588:     I(0,pushl,  irq(ecx,12),    0,                  "Z80.irq[device].irq_param");
                   1589:        I(0,call,       irq(ecx, 4),    0,                                      "call Z80.irq[device].interrupt_entry");
                   1590:        I(0,addl,       ESP,                    B(4),                           "one DWORD was pushed");
                   1591:        I(0,movl,       vector_d,               EAX,                            "store vector");
                   1592:     restore_af();
                   1593:     I(0,movl,   request_irq,    D(-1),              "reset request IRQ");
                   1594:        I(0,jmp,        LS(symbol[ 6]), 0,                                      0);
                   1595: 
                   1596:        com("===================================================================");
                   1597:        com("  single interrupt code                                            ");
                   1598:     com("===================================================================");
                   1599:        S(symbol[ 5],0);
                   1600:        save_af();
                   1601:        I(0,movb,       zIFF1,                  D(0),                           "clear IFF1");
                   1602:     I(0,pushl,  D(0),           0,                  "irqline always 0");
                   1603:     I(0,call,   irq_callback,   0,                  "do a irq_callback");
                   1604:        I(0,movl,       vector_d,               EAX,                            "store vector");
                   1605:     I(0,addl,   ESP,            B(4),               "one DWORD was pushed");
                   1606:     restore_af();
                   1607: 
                   1608:        com("===================================================================");
                   1609:        com("  here when a valid vector is set                                  ");
                   1610:     com("===================================================================");
                   1611:        S(symbol[ 6],0);
                   1612:        com(0);
                   1613:     I(0,cmpb,   zHALT,          D(1),               "CPU was halted?");
                   1614:        I(0,jne,        LS(symbol[ 7]), 0,                                      "no, skip");
                   1615:     I(0,movb,   zHALT,          D(0),               "clear halt flag");
                   1616:        I(0,incw,       PC,                     0,                                      0);
                   1617:     com(0);
                   1618:        S(symbol[ 7],0);
                   1619:     I(0,movl,   PREVPC,         D(-1),              "no valid previous PC");
                   1620:     I(0,cmpb,   zIM,            B(2),               "interrupt mode 2?");
                   1621:        I(0,jne,        LN(symbol[ 8]), 0,                                      "no, test IM 1");
                   1622:        I(0,call,       "z80_push_pc",  0,                  0);
                   1623:        I(0,movzwl, ECX,                        vector_w,                       "get vector");
                   1624:     I(0,movb,   CH,             zI,                 "get MSB from I register");
                   1625:        RWORD( 0, PC32, ECX );
                   1626:        I(0,jmp,        symbol[12],     0,                                      "change PC and exit");
                   1627: 
                   1628:     com(0);
                   1629:        S(symbol[ 8],0);
                   1630:     I(0,cmpb,   zIM,            B(1),               "interrupt mode 1?");
                   1631:        I(0,jne,        LN(symbol[ 9]),0,                                       "no, it's IM 0");
                   1632:        I(0,call,       "z80_push_pc",  0,                  0);
                   1633:        I(0,addl,       zIEXTRN,                B(11),                          "subtract <RST xx> cycles");
                   1634:        I(0,movl,       PC32,                   X(0x38),                        "<RST 38> vector");
                   1635:        I(0,jmp,        symbol[12],     0,                                      "change PC and exit");
                   1636: 
                   1637:        com("===================================================================");
                   1638:        com("  here when interrupt mode is 0                                    ");
                   1639:     com("===================================================================");
                   1640:        S(symbol[ 9],0);
                   1641:        I(0,cmpb,       vector_h,               X(0xcd),                        "opcode <CALL imm16>?");
                   1642:        I(0,jne,        LN(symbol[10]),0,                                       "no, skip");
                   1643:        I(0,call,       "z80_push_pc",  0,                  0);
                   1644: //     The C core doesn't count cycles for <CALL imm16> vector
                   1645: //  I(0,addl,   zIEXTRN,        B(17),              "subtract cycles for CALL opcode");
                   1646:        I(0,movzwl, PC32,                       vector_w,                       "get vector bits 0..15");
                   1647:        I(0,jmp,        LS(symbol[12]), 0,                                      "change PC and exit");
                   1648: 
                   1649:     com(0);
                   1650:        S(symbol[10],0);
                   1651:        I(0,cmpb,       vector_h,               X(0xc3),                        "opcode <JP imm16>?");
                   1652:        I(0,jne,        LS(symbol[11]), 0,                                      "no, skip");
                   1653: //     The C core doesn't count cycles for <JP   imm16> vector
                   1654: //     I(0,addl,       zIEXTRN,                B(10),                          "subtract cycles for JP opcode");
                   1655:        I(0,movzwl, PC32,                       vector_w,                       "get vector bits 0..15");
                   1656:        I(0,jmp,        LS(symbol[12]), 0,                                      "change PC and exit");
                   1657: 
                   1658:        com(0);
                   1659:     S(symbol[11],0);
                   1660:        com("===================================================================");
                   1661:        com("  here when vector is single byte opcode                           ");
                   1662:     com("===================================================================");
                   1663:        I(0,call,       "z80_push_pc",  0,                  0);
                   1664:        I(0,addl,       zIEXTRN,                B(11),                          "assume <RST xx> cycles");
                   1665:        I(0,movl,       PC32,                   vector_d,                       "get vector");
                   1666:        I(0,andl,       PC32,                   B(0x38),                        "mask RST vector");
                   1667: 
                   1668:        com("===================================================================");
                   1669:        com("  here with new PC                                                 ");
                   1670:     com("===================================================================");
                   1671:        S(symbol[12],0);
                   1672:        CHANGE_PC();
                   1673: 
                   1674:        com(0);
                   1675:     pad(align_jumps);
                   1676:     S(symbol[13],0);
                   1677:        save_af();
                   1678:        save_z80(0);
                   1679: }
                   1680: 
                   1681: static void mk_header(void)
                   1682: {
                   1683:        int i;
                   1684: 
                   1685:     com("===========================================================================");
                   1686:     com("                                                                           ");
                   1687:     com("    Z80 x86 cpu emulation                                                  ");
                   1688:     com("    Copyright (c) 1998 by Juergen Buchmueller                              ");
                   1689:     com("    ([email protected])                                                 ");
                   1690:     com("                                                                           ");
                   1691: if (as == GAS)
                   1692:     com("    For assembly by GNU assembler only                                     ");
                   1693: else
                   1694: if (as == NASM)
                   1695:     com("    For assembly by NASM only                                              ");
                   1696: else
                   1697:     com("    For assembly by TASM 3.2 and later only                                ");
                   1698:     com("                                                                           ");
                   1699:     com("    Theory of operation                                                    ");
                   1700:     com("        eax holds the current accumulator and flags (al = A, ah = F)       ");
                   1701:     com("        ecx is used as temporary register (address)                        ");
                   1702:     com("        edx is used as temporary register (data)                           ");
                   1703:     com("        esi holds the current program counter (PC)                         ");
                   1704:        com("        ebp is used as memory handler return address                       ");
                   1705:     com("                                                                           ");
                   1706:     com("===========================================================================");
                   1707:     com(0);
                   1708:     if (as == NASM)
                   1709:         emit("bits\t32");
                   1710:     if (as == TASM)
                   1711:     {
                   1712:         emit(".486");
                   1713:         emit(".model\tflat");
                   1714:     }
                   1715:     com(0);
                   1716:     I(0,data,0,0,0);
                   1717:     S("z_op",0);
                   1718:     I(0,dd,"op_00,op_01,op_02,op_03,op_04,op_05,op_06,op_07,op_08,op_09,op_0a,op_0b,op_0c,op_0d,op_0e,op_0f",0,0);
                   1719:     I(0,dd,"op_10,op_11,op_12,op_13,op_14,op_15,op_16,op_17,op_18,op_19,op_1a,op_1b,op_1c,op_1d,op_1e,op_1f",0,0);
                   1720:     I(0,dd,"op_20,op_21,op_22,op_23,op_24,op_25,op_26,op_27,op_28,op_29,op_2a,op_2b,op_2c,op_2d,op_2e,op_2f",0,0);
                   1721:     I(0,dd,"op_30,op_31,op_32,op_33,op_34,op_35,op_36,op_37,op_38,op_39,op_3a,op_3b,op_3c,op_3d,op_3e,op_3f",0,0);
                   1722:     I(0,dd,"op_40,op_41,op_42,op_43,op_44,op_45,op_46,op_47,op_48,op_49,op_4a,op_4b,op_4c,op_4d,op_4e,op_4f",0,0);
                   1723:     I(0,dd,"op_50,op_51,op_52,op_53,op_54,op_55,op_56,op_57,op_58,op_59,op_5a,op_5b,op_5c,op_5d,op_5e,op_5f",0,0);
                   1724:     I(0,dd,"op_60,op_61,op_62,op_63,op_64,op_65,op_66,op_67,op_68,op_69,op_6a,op_6b,op_6c,op_6d,op_6e,op_6f",0,0);
                   1725:     I(0,dd,"op_70,op_71,op_72,op_73,op_74,op_75,op_76,op_77,op_78,op_79,op_7a,op_7b,op_7c,op_7d,op_7e,op_7f",0,0);
                   1726:     I(0,dd,"op_80,op_81,op_82,op_83,op_84,op_85,op_86,op_87,op_88,op_89,op_8a,op_8b,op_8c,op_8d,op_8e,op_8f",0,0);
                   1727:     I(0,dd,"op_90,op_91,op_92,op_93,op_94,op_95,op_96,op_97,op_98,op_99,op_9a,op_9b,op_9c,op_9d,op_9e,op_9f",0,0);
                   1728:     I(0,dd,"op_a0,op_a1,op_a2,op_a3,op_a4,op_a5,op_a6,op_a7,op_a8,op_a9,op_aa,op_ab,op_ac,op_ad,op_ae,op_af",0,0);
                   1729:     I(0,dd,"op_b0,op_b1,op_b2,op_b3,op_b4,op_b5,op_b6,op_b7,op_b8,op_b9,op_ba,op_bb,op_bc,op_bd,op_be,op_bf",0,0);
                   1730:     I(0,dd,"op_c0,op_c1,op_c2,op_c3,op_c4,op_c5,op_c6,op_c7,op_c8,op_c9,op_ca,op_cb,op_cc,op_cd,op_ce,op_cf",0,0);
                   1731:     I(0,dd,"op_d0,op_d1,op_d2,op_d3,op_d4,op_d5,op_d6,op_d7,op_d8,op_d9,op_da,op_db,op_dc,op_dd,op_de,op_df",0,0);
                   1732:     I(0,dd,"op_e0,op_e1,op_e2,op_e3,op_e4,op_e5,op_e6,op_e7,op_e8,op_e9,op_ea,op_eb,op_ec,op_ed,op_ee,op_ef",0,0);
                   1733:     I(0,dd,"op_f0,op_f1,op_f2,op_f3,op_f4,op_f5,op_f6,op_f7,op_f8,op_f9,op_fa,op_fb,op_fc,op_fd,op_fe,op_ff",0,0);
                   1734:     com(0);
                   1735:     S("z_cb",0);
                   1736:     I(0,dd,"cb_00,cb_01,cb_02,cb_03,cb_04,cb_05,cb_06,cb_07,cb_08,cb_09,cb_0a,cb_0b,cb_0c,cb_0d,cb_0e,cb_0f",0,0);
                   1737:     I(0,dd,"cb_10,cb_11,cb_12,cb_13,cb_14,cb_15,cb_16,cb_17,cb_18,cb_19,cb_1a,cb_1b,cb_1c,cb_1d,cb_1e,cb_1f",0,0);
                   1738:     I(0,dd,"cb_20,cb_21,cb_22,cb_23,cb_24,cb_25,cb_26,cb_27,cb_28,cb_29,cb_2a,cb_2b,cb_2c,cb_2d,cb_2e,cb_2f",0,0);
                   1739:     I(0,dd,"cb_30,cb_31,cb_32,cb_33,cb_34,cb_35,cb_36,cb_37,cb_38,cb_39,cb_3a,cb_3b,cb_3c,cb_3d,cb_3e,cb_3f",0,0);
                   1740:     I(0,dd,"cb_40,cb_41,cb_42,cb_43,cb_44,cb_45,cb_46,cb_47,cb_48,cb_49,cb_4a,cb_4b,cb_4c,cb_4d,cb_4e,cb_4f",0,0);
                   1741:     I(0,dd,"cb_50,cb_51,cb_52,cb_53,cb_54,cb_55,cb_56,cb_57,cb_58,cb_59,cb_5a,cb_5b,cb_5c,cb_5d,cb_5e,cb_5f",0,0);
                   1742:     I(0,dd,"cb_60,cb_61,cb_62,cb_63,cb_64,cb_65,cb_66,cb_67,cb_68,cb_69,cb_6a,cb_6b,cb_6c,cb_6d,cb_6e,cb_6f",0,0);
                   1743:     I(0,dd,"cb_70,cb_71,cb_72,cb_73,cb_74,cb_75,cb_76,cb_77,cb_78,cb_79,cb_7a,cb_7b,cb_7c,cb_7d,cb_7e,cb_7f",0,0);
                   1744:     I(0,dd,"cb_80,cb_81,cb_82,cb_83,cb_84,cb_85,cb_86,cb_87,cb_88,cb_89,cb_8a,cb_8b,cb_8c,cb_8d,cb_8e,cb_8f",0,0);
                   1745:     I(0,dd,"cb_90,cb_91,cb_92,cb_93,cb_94,cb_95,cb_96,cb_97,cb_98,cb_99,cb_9a,cb_9b,cb_9c,cb_9d,cb_9e,cb_9f",0,0);
                   1746:     I(0,dd,"cb_a0,cb_a1,cb_a2,cb_a3,cb_a4,cb_a5,cb_a6,cb_a7,cb_a8,cb_a9,cb_aa,cb_ab,cb_ac,cb_ad,cb_ae,cb_af",0,0);
                   1747:     I(0,dd,"cb_b0,cb_b1,cb_b2,cb_b3,cb_b4,cb_b5,cb_b6,cb_b7,cb_b8,cb_b9,cb_ba,cb_bb,cb_bc,cb_bd,cb_be,cb_bf",0,0);
                   1748:     I(0,dd,"cb_c0,cb_c1,cb_c2,cb_c3,cb_c4,cb_c5,cb_c6,cb_c7,cb_c8,cb_c9,cb_ca,cb_cb,cb_cc,cb_cd,cb_ce,cb_cf",0,0);
                   1749:     I(0,dd,"cb_d0,cb_d1,cb_d2,cb_d3,cb_d4,cb_d5,cb_d6,cb_d7,cb_d8,cb_d9,cb_da,cb_db,cb_dc,cb_dd,cb_de,cb_df",0,0);
                   1750:     I(0,dd,"cb_e0,cb_e1,cb_e2,cb_e3,cb_e4,cb_e5,cb_e6,cb_e7,cb_e8,cb_e9,cb_ea,cb_eb,cb_ec,cb_ed,cb_ee,cb_ef",0,0);
                   1751:     I(0,dd,"cb_f0,cb_f1,cb_f2,cb_f3,cb_f4,cb_f5,cb_f6,cb_f7,cb_f8,cb_f9,cb_fa,cb_fb,cb_fc,cb_fd,cb_fe,cb_ff",0,0);
                   1752:     com(0);
                   1753:     S("z_dd",0);
                   1754:     I(0,dd,"dd_00,dd_01,dd_02,dd_03,dd_04,dd_05,dd_06,dd_07,dd_08,dd_09,dd_0a,dd_0b,dd_0c,dd_0d,dd_0e,dd_0f",0,0);
                   1755:     I(0,dd,"dd_10,dd_11,dd_12,dd_13,dd_14,dd_15,dd_16,dd_17,dd_18,dd_19,dd_1a,dd_1b,dd_1c,dd_1d,dd_1e,dd_1f",0,0);
                   1756:     I(0,dd,"dd_20,dd_21,dd_22,dd_23,dd_24,dd_25,dd_26,dd_27,dd_28,dd_29,dd_2a,dd_2b,dd_2c,dd_2d,dd_2e,dd_2f",0,0);
                   1757:     I(0,dd,"dd_30,dd_31,dd_32,dd_33,dd_34,dd_35,dd_36,dd_37,dd_38,dd_39,dd_3a,dd_3b,dd_3c,dd_3d,dd_3e,dd_3f",0,0);
                   1758:     I(0,dd,"dd_40,dd_41,dd_42,dd_43,dd_44,dd_45,dd_46,dd_47,dd_48,dd_49,dd_4a,dd_4b,dd_4c,dd_4d,dd_4e,dd_4f",0,0);
                   1759:     I(0,dd,"dd_50,dd_51,dd_52,dd_53,dd_54,dd_55,dd_56,dd_57,dd_58,dd_59,dd_5a,dd_5b,dd_5c,dd_5d,dd_5e,dd_5f",0,0);
                   1760:     I(0,dd,"dd_60,dd_61,dd_62,dd_63,dd_64,dd_65,dd_66,dd_67,dd_68,dd_69,dd_6a,dd_6b,dd_6c,dd_6d,dd_6e,dd_6f",0,0);
                   1761:     I(0,dd,"dd_70,dd_71,dd_72,dd_73,dd_74,dd_75,dd_76,dd_77,dd_78,dd_79,dd_7a,dd_7b,dd_7c,dd_7d,dd_7e,dd_7f",0,0);
                   1762:     I(0,dd,"dd_80,dd_81,dd_82,dd_83,dd_84,dd_85,dd_86,dd_87,dd_88,dd_89,dd_8a,dd_8b,dd_8c,dd_8d,dd_8e,dd_8f",0,0);
                   1763:     I(0,dd,"dd_90,dd_91,dd_92,dd_93,dd_94,dd_95,dd_96,dd_97,dd_98,dd_99,dd_9a,dd_9b,dd_9c,dd_9d,dd_9e,dd_9f",0,0);
                   1764:     I(0,dd,"dd_a0,dd_a1,dd_a2,dd_a3,dd_a4,dd_a5,dd_a6,dd_a7,dd_a8,dd_a9,dd_aa,dd_ab,dd_ac,dd_ad,dd_ae,dd_af",0,0);
                   1765:     I(0,dd,"dd_b0,dd_b1,dd_b2,dd_b3,dd_b4,dd_b5,dd_b6,dd_b7,dd_b8,dd_b9,dd_ba,dd_bb,dd_bc,dd_bd,dd_be,dd_bf",0,0);
                   1766:     I(0,dd,"dd_c0,dd_c1,dd_c2,dd_c3,dd_c4,dd_c5,dd_c6,dd_c7,dd_c8,dd_c9,dd_ca,dd_cb,dd_cc,dd_cd,dd_ce,dd_cf",0,0);
                   1767:     I(0,dd,"dd_d0,dd_d1,dd_d2,dd_d3,dd_d4,dd_d5,dd_d6,dd_d7,dd_d8,dd_d9,dd_da,dd_db,dd_dc,dd_dd,dd_de,dd_df",0,0);
                   1768:     I(0,dd,"dd_e0,dd_e1,dd_e2,dd_e3,dd_e4,dd_e5,dd_e6,dd_e7,dd_e8,dd_e9,dd_ea,dd_eb,dd_ec,dd_ed,dd_ee,dd_ef",0,0);
                   1769:     I(0,dd,"dd_f0,dd_f1,dd_f2,dd_f3,dd_f4,dd_f5,dd_f6,dd_f7,dd_f8,dd_f9,dd_fa,dd_fb,dd_fc,dd_fd,dd_fe,dd_ff",0,0);
                   1770:     com(0);
                   1771:     S("z_ed",0);
                   1772:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1773:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1774:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1775:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1776:     I(0,dd,"ed_40,ed_41,ed_42,ed_43,ed_44,ed_45,ed_46,ed_47,ed_48,ed_49,ed_4a,ed_4b,ed_4c,ed_4d,ed_4e,ed_4f",0,0);
                   1777:     I(0,dd,"ed_50,ed_51,ed_52,ed_53,ed_54,ed_55,ed_56,ed_57,ed_58,ed_59,ed_5a,ed_5b,ed_5c,ed_5d,ed_5e,ed_5f",0,0);
                   1778:     I(0,dd,"ed_60,ed_61,ed_62,ed_63,ed_64,ed_65,ed_66,ed_67,ed_68,ed_69,ed_6a,ed_6b,ed_6c,ed_6d,ed_6e,ed_6f",0,0);
                   1779:     I(0,dd,"ed_70,ed_71,ed_72,ed_73,ed_74,ed_75,ed_76,illop,ed_78,ed_79,ed_7a,ed_7b,ed_7c,ed_7d,ed_7e,illop",0,0);
                   1780:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1781:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1782:     I(0,dd,"ed_a0,ed_a1,ed_a2,ed_a3,illop,illop,illop,illop,ed_a8,ed_a9,ed_aa,ed_ab,illop,illop,illop,illop",0,0);
                   1783:     I(0,dd,"ed_b0,ed_b1,ed_b2,ed_b3,illop,illop,illop,illop,ed_b8,ed_b9,ed_ba,ed_bb,illop,illop,illop,illop",0,0);
                   1784:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1785:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1786:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1787:     I(0,dd,"illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop,illop",0,0);
                   1788:     com(0);
                   1789:     S("z_fd",0);
                   1790:     I(0,dd,"fd_00,fd_01,fd_02,fd_03,fd_04,fd_05,fd_06,fd_07,fd_08,fd_09,fd_0a,fd_0b,fd_0c,fd_0d,fd_0e,fd_0f",0,0);
                   1791:     I(0,dd,"fd_10,fd_11,fd_12,fd_13,fd_14,fd_15,fd_16,fd_17,fd_18,fd_19,fd_1a,fd_1b,fd_1c,fd_1d,fd_1e,fd_1f",0,0);
                   1792:     I(0,dd,"fd_20,fd_21,fd_22,fd_23,fd_24,fd_25,fd_26,fd_27,fd_28,fd_29,fd_2a,fd_2b,fd_2c,fd_2d,fd_2e,fd_2f",0,0);
                   1793:     I(0,dd,"fd_30,fd_31,fd_32,fd_33,fd_34,fd_35,fd_36,fd_37,fd_38,fd_39,fd_3a,fd_3b,fd_3c,fd_3d,fd_3e,fd_3f",0,0);
                   1794:     I(0,dd,"fd_40,fd_41,fd_42,fd_43,fd_44,fd_45,fd_46,fd_47,fd_48,fd_49,fd_4a,fd_4b,fd_4c,fd_4d,fd_4e,fd_4f",0,0);
                   1795:     I(0,dd,"fd_50,fd_51,fd_52,fd_53,fd_54,fd_55,fd_56,fd_57,fd_58,fd_59,fd_5a,fd_5b,fd_5c,fd_5d,fd_5e,fd_5f",0,0);
                   1796:     I(0,dd,"fd_60,fd_61,fd_62,fd_63,fd_64,fd_65,fd_66,fd_67,fd_68,fd_69,fd_6a,fd_6b,fd_6c,fd_6d,fd_6e,fd_6f",0,0);
                   1797:     I(0,dd,"fd_70,fd_71,fd_72,fd_73,fd_74,fd_75,fd_76,fd_77,fd_78,fd_79,fd_7a,fd_7b,fd_7c,fd_7d,fd_7e,fd_7f",0,0);
                   1798:     I(0,dd,"fd_80,fd_81,fd_82,fd_83,fd_84,fd_85,fd_86,fd_87,fd_88,fd_89,fd_8a,fd_8b,fd_8c,fd_8d,fd_8e,fd_8f",0,0);
                   1799:     I(0,dd,"fd_90,fd_91,fd_92,fd_93,fd_94,fd_95,fd_96,fd_97,fd_98,fd_99,fd_9a,fd_9b,fd_9c,fd_9d,fd_9e,fd_9f",0,0);
                   1800:     I(0,dd,"fd_a0,fd_a1,fd_a2,fd_a3,fd_a4,fd_a5,fd_a6,fd_a7,fd_a8,fd_a9,fd_aa,fd_ab,fd_ac,fd_ad,fd_ae,fd_af",0,0);
                   1801:     I(0,dd,"fd_b0,fd_b1,fd_b2,fd_b3,fd_b4,fd_b5,fd_b6,fd_b7,fd_b8,fd_b9,fd_ba,fd_bb,fd_bc,fd_bd,fd_be,fd_bf",0,0);
                   1802:     I(0,dd,"fd_c0,fd_c1,fd_c2,fd_c3,fd_c4,fd_c5,fd_c6,fd_c7,fd_c8,fd_c9,fd_ca,fd_cb,fd_cc,fd_cd,fd_ce,fd_cf",0,0);
                   1803:     I(0,dd,"fd_d0,fd_d1,fd_d2,fd_d3,fd_d4,fd_d5,fd_d6,fd_d7,fd_d8,fd_d9,fd_da,fd_db,fd_dc,fd_dd,fd_de,fd_df",0,0);
                   1804:     I(0,dd,"fd_e0,fd_e1,fd_e2,fd_e3,fd_e4,fd_e5,fd_e6,fd_e7,fd_e8,fd_e9,fd_ea,fd_eb,fd_ec,fd_ed,fd_ee,fd_ef",0,0);
                   1805:     I(0,dd,"fd_f0,fd_f1,fd_f2,fd_f3,fd_f4,fd_f5,fd_f6,fd_f7,fd_f8,fd_f9,fd_fa,fd_fb,fd_fc,fd_fd,fd_fe,fd_ff",0,0);
                   1806:     com(0);
                   1807:     S("z_xx",0);
                   1808:     I(0,dd,"xx_00,xx_01,xx_02,xx_03,xx_04,xx_05,xx_06,xx_07,xx_08,xx_09,xx_0a,xx_0b,xx_0c,xx_0d,xx_0e,xx_0f",0,0);
                   1809:     I(0,dd,"xx_10,xx_11,xx_12,xx_13,xx_14,xx_15,xx_16,xx_17,xx_18,xx_19,xx_1a,xx_1b,xx_1c,xx_1d,xx_1e,xx_1f",0,0);
                   1810:     I(0,dd,"xx_20,xx_21,xx_22,xx_23,xx_24,xx_25,xx_26,xx_27,xx_28,xx_29,xx_2a,xx_2b,xx_2c,xx_2d,xx_2e,xx_2f",0,0);
                   1811:     I(0,dd,"xx_30,xx_31,xx_32,xx_33,xx_34,xx_35,xx_36,xx_37,xx_38,xx_39,xx_3a,xx_3b,xx_3c,xx_3d,xx_3e,xx_3f",0,0);
                   1812:     I(0,dd,"xx_40,xx_41,xx_42,xx_43,xx_44,xx_45,xx_46,xx_47,xx_48,xx_49,xx_4a,xx_4b,xx_4c,xx_4d,xx_4e,xx_4f",0,0);
                   1813:     I(0,dd,"xx_50,xx_51,xx_52,xx_53,xx_54,xx_55,xx_56,xx_57,xx_58,xx_59,xx_5a,xx_5b,xx_5c,xx_5d,xx_5e,xx_5f",0,0);
                   1814:     I(0,dd,"xx_60,xx_61,xx_62,xx_63,xx_64,xx_65,xx_66,xx_67,xx_68,xx_69,xx_6a,xx_6b,xx_6c,xx_6d,xx_6e,xx_6f",0,0);
                   1815:     I(0,dd,"xx_70,xx_71,xx_72,xx_73,xx_74,xx_75,xx_76,xx_77,xx_78,xx_79,xx_7a,xx_7b,xx_7c,xx_7d,xx_7e,xx_7f",0,0);
                   1816:     I(0,dd,"xx_80,xx_81,xx_82,xx_83,xx_84,xx_85,xx_86,xx_87,xx_88,xx_89,xx_8a,xx_8b,xx_8c,xx_8d,xx_8e,xx_8f",0,0);
                   1817:     I(0,dd,"xx_90,xx_91,xx_92,xx_93,xx_94,xx_95,xx_96,xx_97,xx_98,xx_99,xx_9a,xx_9b,xx_9c,xx_9d,xx_9e,xx_9f",0,0);
                   1818:     I(0,dd,"xx_a0,xx_a1,xx_a2,xx_a3,xx_a4,xx_a5,xx_a6,xx_a7,xx_a8,xx_a9,xx_aa,xx_ab,xx_ac,xx_ad,xx_ae,xx_af",0,0);
                   1819:     I(0,dd,"xx_b0,xx_b1,xx_b2,xx_b3,xx_b4,xx_b5,xx_b6,xx_b7,xx_b8,xx_b9,xx_ba,xx_bb,xx_bc,xx_bd,xx_be,xx_bf",0,0);
                   1820:     I(0,dd,"xx_c0,xx_c1,xx_c2,xx_c3,xx_c4,xx_c5,xx_c6,xx_c7,xx_c8,xx_c9,xx_ca,xx_cb,xx_cc,xx_cd,xx_ce,xx_cf",0,0);
                   1821:     I(0,dd,"xx_d0,xx_d1,xx_d2,xx_d3,xx_d4,xx_d5,xx_d6,xx_d7,xx_d8,xx_d9,xx_da,xx_db,xx_dc,xx_dd,xx_de,xx_df",0,0);
                   1822:     I(0,dd,"xx_e0,xx_e1,xx_e2,xx_e3,xx_e4,xx_e5,xx_e6,xx_e7,xx_e8,xx_e9,xx_ea,xx_eb,xx_ec,xx_ed,xx_ee,xx_ef",0,0);
                   1823:     I(0,dd,"xx_f0,xx_f1,xx_f2,xx_f3,xx_f4,xx_f5,xx_f6,xx_f7,xx_f8,xx_f9,xx_fa,xx_fb,xx_fc,xx_fd,xx_fe,xx_ff",0,0);
                   1824:     com(0);
                   1825:     com(0);
                   1826:     S("z80_daa",0);
                   1827:     for (i = 0; i < sizeof(DAATable)/sizeof(DAATable[0]); i += 4) {
                   1828:         char buffer[32+1];
                   1829:         sprintf(buffer,"%5d,%5d,%5d,%5d",
                   1830:                        (word)((DAATable[i+0]<<8)|(DAATable[i+0]>>8)),
                   1831:                        (word)((DAATable[i+1]<<8)|(DAATable[i+1]>>8)),
                   1832:                        (word)((DAATable[i+2]<<8)|(DAATable[i+2]>>8)),
                   1833:                        (word)((DAATable[i+3]<<8)|(DAATable[i+3]>>8)));
                   1834:         I(0,dw,buffer,0,0);
                   1835:     }
                   1836:     I(0,globl,"_Z80_ICount",0,0);
                   1837:        I("_Z80_ICount",dd,"0",0,"cycle count during run");
                   1838:        I("z80_itotal",dd,"0",0,"total cycles to run");
                   1839:        I("z80_iextrn",dd,"0",0,"external cycles to subtract (interrupt)");
                   1840:     com(0);
                   1841:     I(0,globl,"_Z80",0,0);
                   1842:     S("_Z80",0);
                   1843:     I("z80_AF",         dd,"0",0,"offset _Z80 + 0x00");
                   1844:     I("z80_BC",         dd,"0",0,"offset _Z80 + 0x04");
                   1845:     I("z80_DE",         dd,"0",0,"offset _Z80 + 0x08");
                   1846:     I("z80_HL",         dd,"0",0,"offset _Z80 + 0x0c");
                   1847:     I("z80_IX",         dd,"0",0,"offset _Z80 + 0x10");
                   1848:     I("z80_IY",         dd,"0",0,"offset _Z80 + 0x14");
                   1849:     I("z80_PC",         dd,"0",0,"offset _Z80 + 0x18");
                   1850:     I("z80_SP",         dd,"0",0,"offset _Z80 + 0x1c");
                   1851:     I("z80_AF2",        dd,"0",0,"offset _Z80 + 0x20");
                   1852:     I("z80_BC2",        dd,"0",0,"offset _Z80 + 0x24");
                   1853:     I("z80_DE2",        dd,"0",0,"offset _Z80 + 0x28");
                   1854:     I("z80_HL2",        dd,"0",0,"offset _Z80 + 0x2c");
                   1855:     I("z80_R",          db,"0",0,"offset _Z80 + 0x30");
                   1856:     I("z80_R2",         db,"0",0,"offset _Z80 + 0x31");
                   1857:     I("z80_IFF1",       db,"0",0,"offset _Z80 + 0x32");
                   1858:     I("z80_IFF2",       db,"0",0,"offset _Z80 + 0x33");
                   1859:     I("z80_HALT",       db,"0",0,"offset _Z80 + 0x34");
                   1860:     I("z80_IM",         db,"0",0,"offset _Z80 + 0x35");
                   1861:     I("z80_I",          db,"0",0,"offset _Z80 + 0x36");
                   1862:     I("z80_pending_irq",db,"0",0,"offset _Z80 + 0x37");
                   1863:     I("z80_vector",     dd,"0",0,"offset _Z80 + 0x38");
                   1864:     I("z80_irq_max",    dd,"0",0,"offset _Z80 + 0x3c");
                   1865:     I("z80_request_irq",dd,"0",0,"offset _Z80 + 0x40");
                   1866:     I("z80_service_irq",dd,"0",0,"offset _Z80 + 0x44");
                   1867:     I("z80_int_state",  dd,"0,0,0,0",0,"offset _Z80 + 0x48");
                   1868:     I("z80_irq",        dd,"0,0,0,0",0,"offset _Z80 + 0x58");
                   1869:     I(0,                dd,"0,0,0,0",0,"offset _Z80 + 0x68");
                   1870:     I(0,                dd,"0,0,0,0",0,"offset _Z80 + 0x78");
                   1871:     I(0,                dd,"0,0,0,0",0,"offset _Z80 + 0x88");
                   1872:     I("z80_nmi_state",  dd,"0",0,"offset _Z80 + 0x98");
                   1873:     I("z80_irq_state",  dd,"0",0,"offset _Z80 + 0x9c");
                   1874:     I("z80_irq_callback",dd,"0",0,"offset _Z80 + 0xa0");
                   1875:     #define Z80_SIZE    0x00a4
                   1876: 
                   1877:        I("z80_EA",         dd,"0",0,"temporary storage for effective address");
                   1878:        I("z80_MB",         dd,"0",0,"temporary storage for memory byte (LSB or MSB)");
                   1879:     com(0);
                   1880:     if (mame_debug)
                   1881:         I(0,extrn,"_mame_debug",0,0);
                   1882:     if (verbose)
                   1883:         I(0,extrn,"_errorlog",0,0);
                   1884:     I(0,extrn,"_previouspc",0,0);
                   1885:     I(0,extrn,"_ROM",0,0);
                   1886:     I(0,extrn,"_RAM",0,0);
                   1887:     I(0,extrn,"_OP_ROM",0,0);
                   1888:     I(0,extrn,"_OP_RAM",0,0);
                   1889:     com(0);
                   1890:     I(0,text,0,0,0);
                   1891:     I(0,extrn,"_malloc",0,0);
                   1892:     I(0,extrn,"_raise",0,0);
                   1893:     if (mame_debug)
                   1894:         I(0,extrn,"_MAME_Debug",0,0);
                   1895:     if (verbose)
                   1896:         I(0,extrn,"_fprintf",0,0);
                   1897:     com(0);
                   1898:     I(0,extrn,"_ophw",0,0);
                   1899:     I(0,extrn,"_cpu_bankbase",0,0);
                   1900:        com(0);
                   1901:     I(0,extrn,"_mrh_error",0,0);
                   1902:     I(0,extrn,"_cur_mrhard",0,0);
                   1903:     I(0,extrn,"_readhardware",0,0);
                   1904:        I(0,extrn,"_memoryreadoffset",0,0);
                   1905:        I(0,extrn,"_memoryreadhandler",0,0);
                   1906:     I(0,extrn,"_cur_mwhard",0,0);
                   1907:        com(0);
                   1908:     I(0,extrn,"_mwh_error",0,0);
                   1909:     I(0,extrn,"_writehardware",0,0);
                   1910:        I(0,extrn,"_memorywriteoffset",0,0);
                   1911:        I(0,extrn,"_memorywritehandler",0,0);
                   1912:     I(0,extrn,"_cpu_setOPbase16",0,0);
                   1913:     I(0,extrn,"_cpu_getactivecpu",0,0);
                   1914:     com(0);
                   1915:     I(0,extrn,"_cpu_readmem16",0,0);
                   1916:     I(0,extrn,"_cpu_writemem16",0,0);
                   1917: #if INLINE_IOPORTS
                   1918:     I(0,extrn,"_cur_portmask",0,0);
                   1919:     I(0,extrn,"_cur_readport",0,0);
                   1920:     I(0,extrn,"_cur_writeport",0,0);
                   1921: #else
                   1922:     I(0,extrn,"_cpu_readport",0,0);
                   1923:     I(0,extrn,"_cpu_writeport",0,0);
                   1924: #endif
                   1925:     com(0);
                   1926: }
                   1927: 
                   1928: static void mk_interface(void)
                   1929: {
                   1930:     I(0,text,0,0,0);
                   1931:        pad(align_funcs);
                   1932:     com("===================================================================");
                   1933:     com("  void Z80_SetRegs(void *regs);                                    ");
                   1934:     com("===================================================================");
                   1935:     I(0,globl,"_Z80_SetRegs",0,0);
                   1936:     S("_Z80_SetRegs",0);
                   1937:     I(0,pushl,  ESI,    0,                  0);
                   1938:     I(0,pushl,  EDI,    0,                  0);
                   1939:        I(0,movl,       ESI,    M(4,0,esp,12,0,0),      "get source");
                   1940: debug(7,"Z80_SetRegs(0x%08x)\n",ESI);
                   1941:     I(0,movl,   EDI,    O("_Z80"),          "set destination");
                   1942:     I(0,movl,   ECX,    X(Z80_SIZE/4),      0);
                   1943:     I(0,cld,    0,      0,                  0);
                   1944:        I(0,rep,        0,              0,                                      0);
                   1945:        I(0,movsd,      0,              0,                                      0);
                   1946:        I(0,movl,       ECX,    zPC32,                          0);
                   1947:        I(0,movl,       EDI,    MRHARD,                         0);
                   1948:     I(0,shrl,   ECX,    D(ABITS),           0);
                   1949:        I(0,movb,       CL,     M(1,0,edi,0,ecx,1), 0);
                   1950:        I(0,cmpb,       CL,     M(1,"_ophw",0,0,0,0),0);
                   1951:        I(0,je,         "z80_set_context_1",0,          0);
                   1952:        I(0,pushl,      zPC32,  0,                                      0);
                   1953:        I(0,call,       "_cpu_setOPbase16",0,       0);
                   1954:        I(0,addl,       ESP,    B(4),                           0);
                   1955:        S("z80_set_context_1",0);
                   1956:     dumpregs();
                   1957:     I(0,popl,   EDI,    0,                  0);
                   1958:     I(0,popl,   ESI,    0,                  0);
                   1959:     I(0,ret,    0,      0,                  0);
                   1960: 
                   1961:        pad(align_funcs);
                   1962:     com("===================================================================");
                   1963:     com("  void Z80_GetRegs(void *regs);                                    ");
                   1964:     com("===================================================================");
                   1965:     I(0,globl,"_Z80_GetRegs",0,0);
                   1966:     S("_Z80_GetRegs",0);
                   1967:     I(0,pushl,  ESI,    0,                  0);
                   1968:     I(0,pushl,  EDI,    0,                  0);
                   1969:     I(0,movl,   EDI,    M(4,0,esp,12,0,0),  "get destination");
                   1970: debug(7,"Z80_GetRegs(0x%08x)\n",EDI);
                   1971:     I(0,movl,   ESI,    O("_Z80"),          "set source");
                   1972:     I(0,movl,   ECX,    X(Z80_SIZE/4),      0);
                   1973:     I(0,cld,    0,      0,                  0);
                   1974:     I(0,rep,    0,                  0,      0);
                   1975:     I(0,movsd,  0,                  0,      0);
                   1976:     dumpregs();
                   1977:     I(0,popl,   EDI,    0,                  0);
                   1978:     I(0,popl,   ESI,    0,                  0);
                   1979:     I(0,ret,    0,      0,                  0);
                   1980: 
                   1981:        pad(align_funcs);
                   1982:     com("===================================================================");
                   1983:     com("  unsigned Z80_GetPC(void);                                        ");
                   1984:     com("===================================================================");
                   1985:     I(0,globl,"_Z80_GetPC",0,0);
                   1986:     S("_Z80_GetPC",0);
                   1987:     I(0,movl,   EAX,    zPC32,                  0);
                   1988: debug(7,"Z80_GetPC() %04x\n",EAX);
                   1989:     I(0,ret,    0,      0,                      0);
                   1990: 
                   1991:        pad(align_funcs);
                   1992:     com("===================================================================");
                   1993:     com("  void Z80_set_nmi_line(int state);                                ");
                   1994:     com("===================================================================");
                   1995:     I(0,globl,"_Z80_set_nmi_line",0,0);
                   1996:     S("_Z80_set_nmi_line",0);
                   1997:        I(0,pushl,      EBP,                    0,                                              0);
                   1998:     I(0,pushl,  EBX,            0,                      0);
                   1999:     I(0,pushl,  ESI,            0,                      0);
                   2000:     I(0,pushl,  EDI,            0,                      0);
                   2001:     I(0,movl,   ECX,            M(4,0,esp,20,0,0),      "get state");
                   2002: debug(3,"Z80_set_nmi_line(%d)\n",ECX);
                   2003:     I(0,cmpl,   ECX,            nmi_state,              "changed?");
                   2004:     I(0,je,     LN("z80_set_nmi_line_done"),0,          "no, leave");
                   2005:     I(0,movl,   nmi_state,      ECX,                    "store new state");
                   2006:     I(0,cmpl,   ECX,            B(CLEAR_LINE),          "clear line now?");
                   2007:     I(0,je,     LN("z80_set_nmi_line_done"),0,          "yes, skip");
                   2008:     com(0);
                   2009:        restore_z80();
                   2010:        restore_af();
                   2011:     I(0,movl,   PREVPC,         D(-1),                  "no valid previous PC");
                   2012:     I(0,testb,  zHALT,          D(1),                   "halted?");
                   2013:     I(0,je,     LS("z80_set_nmi_line_1"),0,             "no, skip");
                   2014:     I(0,movb,   zHALT,          D(0),                   "clear halt flag");
                   2015:        I(0,incw,       PC,                     0,                                              0);
                   2016:        com(0);
                   2017:     S("z80_set_nmi_line_1",0);
                   2018:        I(0,call,       "z80_push_pc",  0,                      0);
                   2019:        I(0,movb,       CL,                     X(0x00),                                0);
                   2020:        I(0,xchgb,      CL,                     zIFF1,                                  "clear IFF1 and copy");
                   2021:        I(0,movb,       zIFF2,                  CL,                                     "previous state to IFF2");
                   2022:        I(0,movl,       PC32,                   X(0x66),                                "PC = NMI vector");
                   2023:        I(0,movl,       ECX,                    PC32,                                   0);
                   2024:        I(0,movl,       EDI,                    MRHARD,                                 0);
                   2025:        I(0,shrl,       ECX,                    D(ABITS),                               0);
                   2026:        I(0,movb,       CL,                     M(1,0,edi,0,ecx,1),     0);
                   2027:        I(0,cmpb,       CL,                     M(1,"_ophw",0,0,0,0),   0);
                   2028:        I(0,je,         LS("z80_set_nmi_line_2"),0,             0);
                   2029:        I(0,pushl,      zPC32,                  0,                                              0);
                   2030:        I(0,call,       "_cpu_setOPbase16",0,                   0);
                   2031:        I(0,addl,       ESP,                    B(4),                                   0);
                   2032:        S("z80_set_nmi_line_2",0);
                   2033:        save_af();
                   2034:        save_z80(0);
                   2035:     com(0);
                   2036:     S("z80_set_nmi_line_done",0);
                   2037:     I(0,popl,   EDI,            0,                      0);
                   2038:     I(0,popl,   ESI,            0,                      0);
                   2039:     I(0,popl,   EBX,            0,                      0);
                   2040:        I(0,popl,       EBP,                    0,                                              0);
                   2041:     I(0,ret,    0,              0,                  0);
                   2042: 
                   2043:        pad(align_funcs);
                   2044:     com("===================================================================");
                   2045:     com("  void Z80_set_irq_line(int irqline, int state);                   ");
                   2046:     com("===================================================================");
                   2047:     I(0,globl,"_Z80_set_irq_line",0,0);
                   2048:     S("_Z80_set_irq_line",0);
                   2049:     I(0,pushl,  EBP,            0,                  0);
                   2050:     I(0,pushl,  EBX,            0,                  0);
                   2051:     I(0,pushl,  ESI,            0,                  0);
                   2052:     I(0,pushl,  EDI,            0,                  0);
                   2053:     restore_af();
                   2054:        restore_z80();
                   2055:     I(0,movl,   EDX,            M(4,0,esp,24,0,0),  0);
                   2056:     I(0,movl,   ECX,            M(4,0,esp,20,0,0),  0);
                   2057:     I(0,movl,   irq_state,      EDX,                0);
                   2058: debug(3,"Z80_set_irq_line(%d,%d)\n",ECX,EDX);
                   2059:     I(0,cmpl,   EDX,            B(CLEAR_LINE),      "line cleared?");
                   2060:     I(0,je,     LN("z80_set_irq_line_done"),0,      "yes, leave");
                   2061: #if EARLY_CTC
                   2062:     I(0,cmpl,   irq_max,        B(0),               "daisy chain mode?");
                   2063:     I(0,je,     LN("z80_set_irq_line_assert"),0,    "no, it's single int");
                   2064:     save_af();
                   2065:     I(0,pushl,  D(0),           0,                  "irqline always 0");
                   2066:     I(0,call,   irq_callback,   0,                  "get the vector");
                   2067:     I(0,addl,   ESP,            B(4),               "clean up stack");
                   2068:        I(0,movl,       ECX,                    EAX,                            "ECX = (device<<8)");
                   2069:     I(0,movzbl, EDX,            AL,                 "EDX = state");
                   2070:     restore_af();
                   2071:     I(0,shrl,   ECX,            D(8),               "ECX = device");
                   2072:     I(0,cmpl,   EDX,            int_state(ecx),     "state change?");
                   2073:     I(0,je,     LN("z80_set_irq_line_assert"),0,    "no change, skip");
                   2074:     I(0,movl,   int_state(ecx), EDX,                "store new state");
                   2075:     I(0,movl,   EDX,            D(-1),              0);
                   2076:     I(0,movl,   ECX,            D(0),               0);
                   2077:     I(0,movl,   request_irq,    EDX,                "reset request IRQ");
                   2078:     I(0,movl,   service_irq,    EDX,                "reset service IRQ");
                   2079:     S("z80_set_irq_line_dc_1",0);
                   2080:     I(0,testl,  int_state(ecx), X(Z80_INT_IEO),     "Z80_INT_IEO set?");
                   2081:     I(0,je,     LS("z80_set_irq_line_dc_2"),0,      "no, skip");
                   2082:     I(0,movl,   request_irq,    EDX,                "mask lower IRQ");
                   2083:     I(0,movl,   service_irq,    ECX,                "set service device number");
                   2084:     com(0);
                   2085:     S("z80_set_irq_line_dc_2",0);
                   2086:     I(0,testb,  int_state(ecx), X(Z80_INT_REQ),     "Z80_INT_REQ set?");
                   2087:     I(0,je,     LS("z80_set_irq_line_dc_3"),0,      "no, skip");
                   2088:     I(0,movl,   request_irq,    ECX,                "set request device number");
                   2089:     com(0);
                   2090:     S("z80_set_irq_line_dc_3",0);
                   2091:     I(0,incl,   ECX,            0,                  "next device");
                   2092:     I(0,cmpl,   ECX,            irq_max,            "more entries to check?");
                   2093:     I(0,jb,     LS("z80_set_irq_line_dc_1"),0,      "yes, check them");
                   2094:     S("z80_set_irq_line_assert",0);
                   2095: #endif
                   2096:     I(0,testb,  zIFF1,          X(INT_IRQ),         "interrupts enabled?");
                   2097:     I(0,je,     LN("z80_set_irq_line_done"),0,      "no, leave");
                   2098:     mk_take_irq( 0x00 );
                   2099:     S("z80_set_irq_line_done",0);
                   2100:     save_af();
                   2101:        save_z80(0);
                   2102:     I(0,popl,   EDI,            0,                  0);
                   2103:     I(0,popl,   ESI,            0,                  0);
                   2104:     I(0,popl,   EBX,            0,                  0);
                   2105:     I(0,popl,   EBP,            0,                  0);
                   2106:     I(0,ret,    0,              0,                  0);
                   2107:     com(0);
                   2108: 
                   2109:        pad(align_funcs);
                   2110:     com("===================================================================");
                   2111:     com("  void Z80_set_irq_callback(int (*callback)(int irqline));         ");
                   2112:     com("===================================================================");
                   2113:     I(0,globl,"_Z80_set_irq_callback",0,0);
                   2114:     S("_Z80_set_irq_callback",0);
                   2115:     I(0,movl,   EAX, M(4,0,esp,4,0,0),  0);
                   2116: debug(3,"Z80_set_irq_callback(%x)\n",EAX);
                   2117:     I(0,movl,   irq_callback,   EAX,    0);
                   2118:     I(0,ret,0,0,0);
                   2119:     com(0);
                   2120: 
                   2121:        pad(align_funcs);
                   2122:     com("===================================================================");
                   2123:     com("  void Z80_Reset(Z80_DaisyChain *daisy_chain);                     ");
                   2124:     com("===================================================================");
                   2125:     I(0,globl,"_Z80_Reset",0,0);
                   2126:     S("_Z80_Reset",0);
                   2127:     I(0,pushl,  EBP,        0,                      0);
                   2128:     I(0,pushl,  EBX,        0,                      0);
                   2129:     I(0,pushl,  ESI,        0,                      0);
                   2130:     I(0,pushl,  EDI,        0,                      0);
                   2131: debug(1,"Z80_reset()\n");
                   2132:     I(0,movl,   EAX,        D(0),                   0);
                   2133:     I(0,movl,   EDI,        O("_Z80"),              "wipe out Z80 registers");
                   2134:     I(0,movl,   ECX,        D(Z80_SIZE/4),          0);
                   2135:     I(0,cld,    0,          0,                      0);
                   2136:     I(0,rep,    0,          0,                      0);
                   2137:     I(0,stosd,  0,          0,                      0);
                   2138:     I(0,movl,   request_irq,    D(-1),              0);
                   2139:     I(0,movl,   service_irq,    D(-1),              0);
                   2140:     I(0,movl,   zSP32,      X(0xf000),              0);
                   2141:     I(0,movl,   ESI,        M(4,0,esp,20,0,0),      "get daisy_chain");
                   2142:     I(0,orl,    ESI,        ESI,                    "NULL ?");
                   2143:     I(0,je,     LS("z80_reset_3"),0,                "yes, skip");
                   2144:     I(0,movl,   EBX,        D(Z80_MAXDAISY),        0);
                   2145:     I(0,movl,   EDI,        O("z80_irq"),           "copy to z80_irq++");
                   2146: 
                   2147:     pad(align_loops);
                   2148:     S("z80_reset_1",0);
                   2149:     I(0,cmpl,   M(4,0,esi,12,0,0),D(-1),            "more entries?");
                   2150:     I(0,je,     LS("z80_reset_3"),0,                0);
                   2151:     I(0,movl,   EAX,        M(4,0,esi,0,0,0),       "get Z80.irq[device].reset");
                   2152:     I(0,cmp,    EAX,        D(0),                   "handler?");
                   2153:     I(0,je,     LS("z80_reset_2"),0,                "no, skip");
                   2154:     I(0,pushl,  M(4,0,esi,12,0,0),0,                "Z80.irq[device].irq_param");
                   2155:     I(0,call,   EAX,        0,                      0);
                   2156:     I(0,addl,   ESP,        B(4),                   0);
                   2157:     S("z80_reset_2",0);
                   2158:     I(0,cld,    0,          0,                      0);
                   2159:     I(0,movsd,  0,          0,                      0);
                   2160:     I(0,movsd,  0,          0,                      0);
                   2161:     I(0,movsd,  0,          0,                      0);
                   2162:     I(0,movsd,  0,          0,                      0);
                   2163:     I(0,incl,   irq_max,    0,                      "count entries");
                   2164:     I(0,decl,   EBX,        0,                      "more to check?");
                   2165:     I(0,jne,    LS("z80_reset_1"),0,                0);
                   2166:     S("z80_reset_3",0);
                   2167:        I(0,movl,       ECX,    zPC32,                          0);
                   2168:        I(0,movl,       EDI,    MRHARD,                         0);
                   2169:     I(0,shrl,   ECX,    D(ABITS),           0);
                   2170:        I(0,movb,       CL,     M(1,0,edi,0,ecx,1), 0);
                   2171:        I(0,cmpb,       CL,     M(1,"_ophw",0,0,0,0),0);
                   2172:        I(0,je,         "z80_reset_4",0,            0);
                   2173:        I(0,pushl,      zPC32,  0,                                      0);
                   2174:        I(0,call,       "_cpu_setOPbase16",0,       0);
                   2175:        I(0,addl,       ESP,    B(4),                           0);
                   2176:        S("z80_reset_4",0);
                   2177:     dumpregs();
                   2178:     I(0,popl,   EDI,        0,                      0);
                   2179:     I(0,popl,   ESI,        0,                      0);
                   2180:     I(0,popl,   EBX,        0,                      0);
                   2181:     I(0,popl,   EBP,        0,                      0);
                   2182:     I(0,ret,    0,          0,                      0);
                   2183:     com(0);
                   2184: 
                   2185:        pad(align_funcs);
                   2186:     com("===================================================================");
                   2187:     com("  int Z80_Execute(int cycles);                                     ");
                   2188:     com("===================================================================");
                   2189:     I(0,globl,"_Z80_Execute",0,0);
                   2190:     S("_Z80_Execute",0);
                   2191:     I(0,pushl,  EBP,            0,                  0);
                   2192:     I(0,pushl,  EBX,            0,                  0);
                   2193:     I(0,pushl,  ESI,            0,                  0);
                   2194:     I(0,pushl,  EDI,            0,                  0);
                   2195:     I(0,movl,   EAX,            M(4,0,esp,20,0,0),  "get the ICount");
                   2196:        I(0,movl,       ECX,                    D(0),                           0);
                   2197:        I(0,xchgl,      ECX,                    zIEXTRN,                        "external cycles (interrupt)");
                   2198:        I(0,movl,       zITOTAL,                EAX,                            "store total cycles");
                   2199:     I(0,subl,   EAX,            ECX,                "subtract from cycle count");
                   2200:        I(0,movl,       zICOUNT,                EAX,                            "store cycles to run");
                   2201: debug(6,"Z80_execute(%d)\n",EAX);
                   2202:     restore_af();
                   2203:        restore_z80();
                   2204:     I(0,jmp,    "z80_next_opcode",0,                0);
                   2205: 
                   2206:        pad(align_funcs);
                   2207:     com("===================================================================");
                   2208:     com("  illegal opcode                                                   ");
                   2209:     com("===================================================================");
                   2210:     S("illop",0);
                   2211: debug(5,"illegal opcode $%04x: %02x\n", PC32, EAX);
                   2212: 
                   2213:        pad(align_funcs);
                   2214:     com("===================================================================");
                   2215:     com("  fetch next opcode                                                ");
                   2216:     com("===================================================================");
                   2217:     S("z80_next_opcode",0);
                   2218:     if (mame_debug) {
                   2219:         com("===================================================================");
                   2220:         com("  call MAME debugger                                               ");
                   2221:         com("===================================================================");
                   2222:         I(0,testb,  DEBUG,          D(1),           0);
                   2223:         I(0,je,     LS("z80_no_debug"),0,           0);
                   2224:         S("z80_mame_debug",0);
                   2225:         mk_debug();
                   2226:         S("z80_no_debug",0);
                   2227:     }
                   2228:     S("z80_next_opcode_1",0);
                   2229:     ROP();
                   2230:        I(0,jmp,        M(4,"z_op",0,0,ecx,4),0,    "jump to opcode handler");
                   2231: 
                   2232:        pad(align_funcs);
                   2233:     S("z80_execute_done",0);
                   2234:        save_z80(0);
                   2235:     save_af();
                   2236:     I(0,popl,   EDI,            0,          0);
                   2237:     I(0,popl,   ESI,            0,          0);
                   2238:     I(0,popl,   EBX,            0,          0);
                   2239:     I(0,popl,   EBP,            0,          0);
                   2240:     I(0,movl,   EAX,            zITOTAL,    0);
                   2241:     I(0,subl,   EAX,            zICOUNT,    0);
                   2242: debug(6,"Z80_execute() : %d\n", EAX);
                   2243:     I(0,ret,    0,              0,          0);
                   2244:     com(0);
                   2245: }
                   2246: 
                   2247: static void mk_rbyte_handler( int i )
                   2248: {
                   2249: #if FAST_MEMORY
                   2250:        #define rTBL    1       /* jump table */
                   2251:        #define rRAM    2       /* read RAM */
                   2252:        #define rNOP    3       /* read NOP */
                   2253:        #define rBNK    4       /* read bank memory */
                   2254:        #define rRHW    5       /* readhardware */
                   2255:        #define rUSR    6       /* read user (handler) */
                   2256:        #define rNON    7       /* read unassigned memory */
                   2257: 
                   2258:     int j;
                   2259:     char buffer[128+1], symbol[8][31+1];
                   2260:     static UINT8 mr[256] = {  /* MHELE (HT_XXX) to symbol mapping */
                   2261:                rRAM,rBNK,rBNK,rBNK,rBNK,rBNK,rBNK,rBNK,rBNK,rNON,rNOP,rRAM,rRAM,rUSR,rUSR,rUSR,
                   2262:                rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,
                   2263:                rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,
                   2264:                rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,rUSR,
                   2265:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2266:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2267:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2268:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2269:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2270:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2271:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2272:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2273:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2274:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2275:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,
                   2276:                rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW,rRHW
                   2277:     };
                   2278: 
                   2279:     sprintf(symbol[0], "rbyte%d",     i);
                   2280:        sprintf(symbol[rTBL], "rbyte%d_tbl", i);
                   2281:        sprintf(symbol[rRAM], "rbyte0_ram");       /* not different due to opsize */
                   2282:        sprintf(symbol[rNOP], "rbyte0_nop");       /* not different due to opsize */
                   2283:        sprintf(symbol[rBNK], "rbyte0_bnk");       /* not different due to opsize */
                   2284:        sprintf(symbol[rRHW], "rbyte%d_rhw", i);
                   2285:     sprintf(symbol[rUSR], "rbyte%d_usr", i);
                   2286:        sprintf(symbol[rNON], "rbyte%d_non", i);
                   2287: 
                   2288:     com("===================================================================");
                   2289:     com("  read a byte from memory at EBP to EDX for opcodes of size %d      ",i);
                   2290:     com("===================================================================");
                   2291:        pad(align_funcs);
                   2292:     S(symbol[0],0);
                   2293:     I(0,movl,   ECX,    EBP,                "memory address to ECX");
                   2294:     I(0,movl,   EDI,    MRHARD,             "read flags");
                   2295:     I(0,shrl,   ECX,    D(ABITS),           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2296:     I(0,movzbl, EDX,    M(1,0,edi,0,ecx,1), "get MHELE value");
                   2297:        I(0,jmp,        M(4,symbol[rTBL],0,0,edx,4),0, "jump to memory read function");
                   2298: 
                   2299:        I(0,data,0,0,0);
                   2300:        pad(align_funcs);
                   2301:        S(symbol[rTBL],0);
                   2302:     for (j = 0; j < 256; j += 4) {
                   2303:         sprintf(buffer,"%s,%s,%s,%s",symbol[mr[j+0]], symbol[mr[j+1]],symbol[mr[j+2]], symbol[mr[j+3]]);
                   2304:         I(0,dd,buffer,0,0);
                   2305:     }
                   2306:        I(0,text,0,0,0);
                   2307: 
                   2308:        if (i == 0) {   /* functions that are needed only once */
                   2309:                pad(align_funcs);
                   2310:                S(symbol[rRAM],"read HT_RAM, HT_RAMROM, HT_ROM");
                   2311:                I(0,movl,       EDI,    RAM,                            "get RAM/ROM base");
                   2312:                I(0,movb,       DL,     M(1,0,edi,0,ebp,1), "get byte from RAM/ROM");
                   2313:                I(0,ret,        0,              0,                                      0);
                   2314: 
                   2315:                pad(align_funcs);
                   2316:                S(symbol[rNOP],"read HT_NOP");
                   2317:         I(0,movb,   DL,     D(0),               "return zero");
                   2318:         I(0,ret,    0,      0,                  0);
                   2319: 
                   2320:                pad(align_funcs);
                   2321:                S(symbol[rBNK],"read HT_BANK1 .. HT_BANK8");
                   2322:                I(0,movl,       ECX,    EBP,                            "get address to ECX");
                   2323:                I(0,movl,       EDI,    BANKBASE(edx),          "get BANKn base");
                   2324:         I(0,subl,   ECX,    READOFFSET(edx),    "subtract read offset");
                   2325:                I(0,movb,       DL,     M(1,0,edi,0,ecx,1), "get byte from BANKn");
                   2326:                I(0,ret,        0,              0,                                      0);
                   2327:        }
                   2328: 
                   2329:        pad(align_funcs);
                   2330:        S(symbol[rRHW],"read MH_HARDMAX .. 255");
                   2331:     I(0,movl,   EDI,    EDX,                "get hw to EDI");
                   2332:     I(0,movl,   ECX,    EBP,                "address to ECX");
                   2333:     I(0,shll,   EDI,    D(8),               "hw << MH_SBITS");
                   2334:     I(0,andl,   ECX,    B(15),              "mask bits 0..3");
                   2335:     I(0,movb,   DL,     READHW(edi,ecx),    "get MHELE");
                   2336:        I(0,jmp,        M(4,symbol[rTBL],0,0,edx,4),0, "jump to read handler");
                   2337: 
                   2338:        pad(align_funcs);
                   2339:        S(symbol[rUSR],"read HT_USER .. MH_HARDMAX-1");
                   2340:     save_af();
                   2341:     save_z80( i );
                   2342:     I(0,movl,   ECX,    EBP,                "get address to ECX");
                   2343:     I(0,subl,   ECX,    READOFFSET(edx),    "subtract read offset");
                   2344:        I(0,movl,       EDI,    READHANDLER(edx),       "get memoryreadhandler");
                   2345:     I(0,pushl,  ECX,    0,                  "offset");
                   2346:        I(0,call,       EDI,    0,                                      "call handler");
                   2347:     I(0,movl,   EDX,    EAX,                "return value");
                   2348:     I(0,addl,   ESP,    B(1*4),             "one DWORD was pushed");
                   2349:     restore_z80();
                   2350:     restore_af();
                   2351:     I(0,ret,    0,      0,                  0);
                   2352: 
                   2353:        pad(align_funcs);
                   2354:        S(symbol[rNON],"read HT_NON");
                   2355:     save_af();
                   2356:     save_z80( i );
                   2357:     I(0,pushl,  EBP,    0,                  "memory address");
                   2358:     I(0,call,   "_mrh_error",0,             0);
                   2359:     I(0,movl,   EDX,    EAX,                "return value");
                   2360:     I(0,addl,   ESP,    B(1*4),             "one DWORD was pushed");
                   2361:     restore_z80();
                   2362:     restore_af();
                   2363:     I(0,ret,    0,      0,                  0);
                   2364: 
                   2365: #else
                   2366:        char symbol[2][31+1];
                   2367:     sprintf(symbol[0], "rbyte%d", i);
                   2368:     sprintf(symbol[1], "rbyte%d_user", i);
                   2369: 
                   2370:     pad(align_funcs);
                   2371:     com("===================================================================");
                   2372:     com("  read a byte from memory at EBP to EDX for opcodes of size %d      ",i);
                   2373:     com("===================================================================");
                   2374:     S(symbol[0],0);
                   2375:     I(0,movl,   ECX,    EBP,                "memory address to ECX");
                   2376:     I(0,movl,   EDI,    MRHARD,             "read flags");
                   2377:     I(0,shrl,   ECX,    D(ABITS),           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2378:     I(0,testb,  M(1,0,edi,0,ecx,1),D(-1),   "ROM/RAM?");
                   2379:     I(0,jne,    LS(symbol[1]),0,            "nope, need to call handler");
                   2380:     I(0,movl,   EDI,    RAM,                "get RAM base");
                   2381:     I(0,movzbl, EDX,    M(1,0,edi,0,ebp,1), "get byte from RAM");
                   2382:     I(0,ret,    0,      0,                  0);
                   2383: 
                   2384:     pad(align_jumps);
                   2385:     S(symbol[1],0);
                   2386:     save_af();
                   2387:     save_z80( i );
                   2388:     I(0,pushl,  EBP,    0,                  "memory address");
                   2389:     I(0,call,   "_cpu_readmem16",0,         0);
                   2390:     I(0,movl,   EDX,    EAX,                "return value");
                   2391:     I(0,addl,   ESP,    B(1*4),             "one DWORD was pushed");
                   2392:     restore_z80();
                   2393:     restore_af();
                   2394:     I(0,ret,    0,      0,                  0);
                   2395: #endif
                   2396: }
                   2397: 
                   2398: static void mk_rword_handler( int i )
                   2399: {
                   2400:        char symbol[3][15+1];
                   2401:     sprintf(symbol[0], "rword%d",       i);
                   2402:        sprintf(symbol[1], "rword%d_usr",   i);
                   2403:        sprintf(symbol[2], "rbyte%d",       i);
                   2404: 
                   2405:        pad(align_funcs);
                   2406:        com("===================================================================");
                   2407:        com("  read a word from memory at EBP to EDX for opcodes of size %d      ",i);
                   2408:     com("===================================================================");
                   2409:     S(symbol[0],0);
                   2410:        I(0,movl,       ECX,    EBP,                            "memory address to ECX");
                   2411:        I(0,orl,        ECX,    B(15),                          "check if address...");
                   2412:        I(0,cmpl,       ECX,    EBP,                            "...is 0xxxFh");
                   2413:        I(0,je,         LS(symbol[1]),0,                        "yes, need to read LSB then MSB");
                   2414:        I(0,shrl,       ECX,    D(4),                           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2415:        I(0,movl,       EDI,    MRHARD,                         "read flags");
                   2416:        I(0,testb,      M(1,0,edi,0,ecx,1),D(-1),       "MHELE == ROM/RAM?");
                   2417:        I(0,jne,        LS(symbol[1]),0,                        "nope, need to call handler");
                   2418:        pad(align_funcs);
                   2419:     I(0,movl,   EDI,    RAM,                "get RAM base");
                   2420:        I(0,movzwl, EDX,        M(2,0,edi,0,ebp,1), "get word from ROM/RAM");
                   2421:        I(0,ret,        0,              0,                                      0);
                   2422: 
                   2423:        pad(align_funcs);
                   2424:        S(symbol[1],0);
                   2425:        I(0,call,       symbol[2],      0,                              "read LSB");
                   2426:        I(0,incw,       BP,     0,                                      "address + 1");
                   2427:        I(0,movb,       zMB,    DL,                             "save LSB value");
                   2428:        I(0,call,       symbol[2],      0,                              "read MSB");
                   2429:        I(0,shll,       EDX,    D(8),                           "value to MSB");
                   2430:        I(0,movb,       DL,     zMB,                            "get LSB");
                   2431:        I(0,ret,        0,              0,                                      0);
                   2432: }
                   2433: 
                   2434: static void mk_wbyte_handler( int i )
                   2435: {
                   2436: #if FAST_MEMORY
                   2437:        #define wTBL   1        /* jump table */
                   2438:     #define wRAM   2    /* write RAM */
                   2439:        #define wNOP   3        /* don't write (NOP or ROM) */
                   2440:        #define wRAR   4        /* write RAM and ROM */
                   2441:        #define wBNK   5        /* write bank memory */
                   2442:        #define wWHW   6        /* writehardware */
                   2443:        #define wUSR   7        /* write user (handler) */
                   2444:        #define wNON   8        /* write unassigned memory */
                   2445:     int j;
                   2446:        char buffer[128+1], symbol[9][31+1];
                   2447:     static UINT8 mw[256] = {  /* MHELE (HT_XXX) to symbol mapping */
                   2448:                wRAM,wBNK,wBNK,wBNK,wBNK,wBNK,wBNK,wBNK,wBNK,wNON,wNOP,wRAR,wNOP,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,
                   2449:                wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,wUSR,
                   2450:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,
                   2451:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,
                   2452:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,
                   2453:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,
                   2454:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,
                   2455:                wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW,wWHW
                   2456:     };
                   2457: 
                   2458:     sprintf(symbol[0], "wbyte%d",     i);
                   2459:        sprintf(symbol[wTBL], "wbyte%d_tbl", i);
                   2460:        sprintf(symbol[wRAM], "wbyte0_ram");       /* not different due to opsize */
                   2461:     sprintf(symbol[wNOP], "wbyte0_nop");       /* not different due to opsize */
                   2462:        sprintf(symbol[wRAR], "wbyte0_rar");       /* not different due to opsize */
                   2463:        sprintf(symbol[wBNK], "wbyte0_bnk");       /* not different due to opsize */
                   2464:     sprintf(symbol[wWHW], "wbyte%d_whw", i);
                   2465:     sprintf(symbol[wUSR], "wbyte%d_usr", i);
                   2466:        sprintf(symbol[wNON], "wbyte%d_non", i);
                   2467: 
                   2468:     com("===================================================================");
                   2469:     com("  write a byte from EDX to memory at EBP for opcodes of size %d     ",i);
                   2470:     com("===================================================================");
                   2471:        pad(align_funcs);
                   2472:     S(symbol[0],0);
                   2473:     I(0,movl,   ECX,    EBP,                "memory address to ECX");
                   2474:     I(0,movl,   EDI,    MWHARD,             "write flags");
                   2475:     I(0,shrl,   ECX,    D(ABITS),           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2476:     I(0,movzbl, EDI,    M(1,0,edi,0,ecx,1), "get MHELE value");
                   2477:        I(0,jmp,        M(4,symbol[wTBL],0,0,edi,4),0, "jump to memory write function");
                   2478: 
                   2479:        I(0,data,0,0,0);
                   2480:        pad(align_funcs);
                   2481:        S(symbol[wTBL],0);
                   2482:     for (j = 0; j < 256; j += 4) {
                   2483:         sprintf(buffer,"%s,%s,%s,%s",symbol[mw[j+0]], symbol[mw[j+1]],symbol[mw[j+2]], symbol[mw[j+3]]);
                   2484:         I(0,dd,buffer,0,0);
                   2485:     }
                   2486:        I(0,text,0,0,0);
                   2487: 
                   2488:        if (i == 0) {   /* functions that are needed only once */
                   2489:                pad(align_funcs);
                   2490:                S(symbol[wRAM],"HT_RAM");
                   2491:                I(0,movl,       EDI,    RAM,                            "get RAM base");
                   2492:                I(0,movb,       M(1,0,edi,0,ebp,1), DL,         "put byte into RAM");
                   2493:                I(0,ret,        0,              0,                                      0);
                   2494: 
                   2495:                pad(align_funcs);
                   2496:                S(symbol[wNOP],"HT_NOP");
                   2497:         I(0,ret,    0,      0,                  "do nothing");
                   2498: 
                   2499:                pad(align_funcs);
                   2500:                S(symbol[wRAR],"HT_RAMROM");
                   2501:                I(0,movl,       EDI,    RAM,                            "get RAM base");
                   2502:                I(0,movl,       ECX,    ROM,                            "get ROM base");
                   2503:                I(0,movb,       M(1,0,edi,0,ebp,1), DL,         "put byte into RAM");
                   2504:                I(0,movb,       M(1,0,ecx,0,ebp,1), DL,         "put byte into ROM");
                   2505:         I(0,ret,    0,      0,                  0);
                   2506: 
                   2507:                pad(align_funcs);
                   2508:                S(symbol[wBNK],"HT_BANK1 - HT_BANK8");
                   2509:                I(0,movl,       ECX,    EBP,                            "get address int0 ECX");
                   2510:                I(0,subl,       ECX,    WRITEOFFSET(edi),       "subtract write offset");
                   2511:                I(0,movl,       EDI,    BANKBASE(edi),          "get BANKn base");
                   2512:                I(0,movb,       M(1,0,edi,0,ecx,1), DL,         "put byte to BANKn + offset");
                   2513:                I(0,ret,        0,              0,                                      0);
                   2514:        }
                   2515: 
                   2516:        pad(align_funcs);
                   2517:        S(symbol[wWHW],"MH_HARDMAX..255");
                   2518:     I(0,movl,   ECX,    EBP,                "get address to ECX");
                   2519:     I(0,shll,   EDI,    D(8),               "hw << MH_SBITS");
                   2520:     I(0,andl,   ECX,    B(15),              "mask bits 0..3");
                   2521:     I(0,movzbl, EDI,    WRITEHW(edi,ecx),   "get MHELE");
                   2522:        I(0,jmp,        M(4,symbol[wTBL],0,0,edi,4),0, "jump to write handler");
                   2523: 
                   2524:        pad(align_funcs);
                   2525:        S(symbol[wUSR],"HT_USER .. MH_HARDMAX-1");
                   2526:     save_af();
                   2527:     save_z80( i );
                   2528:     I(0,movl,   ECX,    EBP,                "get address to ECX");
                   2529:     I(0,pushl,  EDX,    0,                  "data byte");
                   2530:     I(0,subl,   ECX,    WRITEOFFSET(edi),   "subtract write offset");
                   2531:     I(0,movl,   EDI,    WRITEHANDLER(edi),  "get memorywritehandler");
                   2532:     I(0,pushl,  ECX,    0,                  "offset");
                   2533:        I(0,call,       EDI,    0,                                      "call handler");
                   2534:     I(0,addl,   ESP,    B(2*4),             "two DWORDs were pushed");
                   2535:     restore_z80();
                   2536:     restore_af();
                   2537:     I(0,ret,    0,      0,                  0);
                   2538: 
                   2539:        pad(align_funcs);
                   2540:     S(symbol[wNON],"HT_NON");
                   2541:     save_af();
                   2542:     save_z80( i );
                   2543:     I(0,pushl,  EDX,    0,                  "data byte");
                   2544:     I(0,pushl,  EBP,    0,                  "memory address");
                   2545:     I(0,call,   "_mwh_error",0,             0);
                   2546:     I(0,addl,   ESP,    B(2*4),             "two DWORDs were pushed");
                   2547:     restore_z80();
                   2548:     restore_af();
                   2549:     I(0,ret,    0,      0,                  0);
                   2550: 
                   2551: #else
                   2552:        char symbol[2][31+1];
                   2553:     sprintf(symbol[0], "wbyte%d", i);
                   2554:     sprintf(symbol[1], "wbyte%d_user", i);
                   2555:     pad(align_funcs);
                   2556:     com("===================================================================");
                   2557:     com("  write a byte from EDX to memory at EBP for opcodes of size %d     ",i);
                   2558:     com("===================================================================");
                   2559:     S(symbol[0],0);
                   2560:     I(0,movl,   ECX,    EBP,                "get memory address to ECX");
                   2561:     I(0,movl,   EDI,    MWHARD,             "write flags");
                   2562:     I(0,shrl,   ECX,    D(ABITS),           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2563:     I(0,movzbl, ECX,    M(1,0,edi,0,ecx,1), "get MHELE");
                   2564:     I(0,orb,    CL,     CL,                 "write to RAM?");
                   2565:     I(0,jne,    LS(symbol[1]),0,            "nope, need to call writemem16");
                   2566:     I(0,movl,   EDI,    RAM,                "get RAM base");
                   2567:     I(0,movb,   M(1,0,edi,0,ebp,1),DL,      "store byte to RAM");
                   2568:     I(0,ret,    0,      0,                  "return to caller");
                   2569: 
                   2570:     pad(align_jumps);
                   2571:     S(symbol[1],0);
                   2572:     save_af();
                   2573:     save_z80( i );
                   2574:     I(0,pushl,  EDX,    0,                  "value");
                   2575:     I(0,pushl,  EBP,    0,                  "memory address");
                   2576:     I(0,call,   "_cpu_writemem16",0,        0);
                   2577:     I(0,addl,   ESP,    B(2*4),             "two DWORDs were pushed");
                   2578:     restore_z80();
                   2579:     restore_af();
                   2580:     I(0,ret,    0,      0,                  "return to caller");
                   2581: #endif
                   2582: }
                   2583: 
                   2584: static void mk_wword_handler( int i )
                   2585: {
                   2586:        char symbol[3][15+1];
                   2587: 
                   2588:     sprintf(symbol[0], "wword%d",       i);
                   2589:        sprintf(symbol[1], "wword%d_usr",   i);
                   2590:        sprintf(symbol[2], "wbyte%d",       i);
                   2591:        pad(align_funcs);
                   2592:        com("===================================================================");
                   2593:     com("  write a word from EDX to memory at ECX for opcodes of size %d     ",i);
                   2594:     com("===================================================================");
                   2595:     S(symbol[0],0);
                   2596:        I(0,movl,       ECX,    EBP,                            "memory address to ECX");
                   2597:        I(0,orb,        CL,     X(0x0f),                        "check if address...");
                   2598:        I(0,cmpl,       ECX,    EBP,                            "...is 0xxxFh");
                   2599:        I(0,je,         LS(symbol[1]),0,                        "yes, need to write LSB then MSB");
                   2600:        I(0,movl,       EDI,    MWHARD,                         "write flags");
                   2601:     I(0,shrl,   ECX,    D(ABITS),           ">> (ABITS2_16 + ABITS_MIN_16)");
                   2602:        I(0,testb,      M(1,0,edi,0,ecx,1),D(-1),       "MHELE == RAM?");
                   2603:        I(0,jne,        LS(symbol[1]),0,                        "nope, need to call handler");
                   2604:        pad(align_funcs);
                   2605:        I(0,movl,       EDI,    RAM,                            "get RAM base");
                   2606:        I(0,movw,       M(2,0,edi,0,ebp,1),DX,          "store word to RAM");
                   2607:        I(0,ret,        0,              0,                                      0);
                   2608: 
                   2609:        pad(align_funcs);
                   2610:        S(symbol[1],0);
                   2611:        I(0,movb,       zMB,    DH,                             "save MSB of data");
                   2612:        I(0,movzbl, EDX,        DL,                             "EDX = LSB only");
                   2613:        I(0,call,       symbol[2],      0,                              "write LSB");
                   2614:        I(0,incw,       BP,     0,                                      "address + 1");
                   2615:        I(0,movzbl, EDX,        zMB,                            "EDX = MSB only");
                   2616:        I(0,call,       symbol[2],      0,                              "write MSB");
                   2617:        I(0,ret,        0,              0,                                      0);
                   2618: }
                   2619: 
                   2620: static void mk_memory_handlers( void )
                   2621: {
                   2622:        int i;
                   2623: 
                   2624:        for (i = 0; i <= 4*CALC_PREVPC; i++) {
                   2625:                mk_rbyte_handler(i);
                   2626:         mk_rword_handler(i);
                   2627:         mk_wbyte_handler(i);
                   2628:                mk_wword_handler(i);
                   2629:     }
                   2630: 
                   2631:        com(0);
                   2632:     com("===================================================================");
                   2633:        com("  push PC to stack (called from interrupt handlers)                ");
                   2634:        com("===================================================================");
                   2635:        pad(align_funcs);
                   2636:        S("z80_push_pc",0);
                   2637:        I(0,subw,       zSP,    B(2),                           0);
                   2638:        I(0,movzwl, EDX,        PC,                             "get PC to EDX");
                   2639:        I(0,movzwl, EBP,        zSP,                            "get SP to EBP");
                   2640:        I(0,jmp,        "wword0",  0,               "write word");
                   2641: 
                   2642:     com(0);
                   2643:     com("===================================================================");
                   2644:        com("  write back EDX to address EBP (DD/FD CB <ofs> xx opcodes)        ");
                   2645:        com("===================================================================");
                   2646:        pad(align_funcs);
                   2647:        S("wb_ea4_edx",0);
                   2648: #if CALC_PREVPC
                   2649:     I(0,call,   "wbyte4",0,                 "write the value in EDX");
                   2650: #else
                   2651:        I(0,call,       "wbyte0",0,                 "write the value in EDX");
                   2652: #endif
                   2653:     end_opcode("z_op");
                   2654: }
                   2655: 
                   2656: void M_INC( const char *dst )
                   2657: {
                   2658:        I(0,shrb,       F,              D(1),                   "save carry");
                   2659:        I(0,incb,       dst,    0,                              0);
                   2660:     I(0,lahf,   0,      0,              0);
                   2661:        I(0,seto,       CL,     0,                              0);
                   2662:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2663:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C");
                   2664:        I(0,orb,        F,              CL,                     "combine the flags");
                   2665: }
                   2666: 
                   2667: void M_DEC( const char *dst )
                   2668: {
                   2669:        I(0,shrb,       F,              D(1),                   "save carry");
                   2670:        I(0,decb,       dst,    0,                              0);
                   2671:     I(0,lahf,   0,      0,              0);
                   2672:        I(0,seto,       CL,     0,                              0);
                   2673:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2674:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C");
                   2675:        I(0,orb,        F,              X(NF),                  "set N");
                   2676:        I(0,orb,        F,              CL,                     "combine the flags");
                   2677: }
                   2678: 
                   2679: void M_ADD16( const char *dst, const char *src )
                   2680: {
                   2681:        I(0,movw,       DX,     dst,                    "get destination");
                   2682:        I(0,movw,       CX,     src,                    "get source");
                   2683:        I(0,addb,       DL,     CL,                     0);
                   2684:        I(0,adcb,       DH,     CH,                     0);
                   2685:        I(0,movb,       CL,     F,                              "get old flags");
                   2686:     I(0,lahf,   0,      0,              0);
                   2687:        I(0,andb,       CL,     X(SF|ZF|PF),    "mask S,Z and P/V");
                   2688:     I(0,movw,   dst,    DX,             "store result");
                   2689:        I(0,andb,       F,              X(HF|CF),               "mask H and C");
                   2690:        I(0,orb,        F,              CL,                     "set old flag bits");
                   2691: }
                   2692: 
                   2693: void M_ADD( const char *src )
                   2694: {
                   2695:        I(0,addb,       A,              src,                    "add source");
                   2696:     I(0,lahf,   0,      0,              0);
                   2697:        I(0,seto,       CL,     0,                              0);
                   2698:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2699:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C");
                   2700:        I(0,orb,        F,              CL,                     "combine the flags");
                   2701: }
                   2702: 
                   2703: void M_ADC( const char *src )
                   2704: {
                   2705:        I(0,sahf,       0,              0,                              "set flags");
                   2706:        I(0,adcb,       A,              src,                    "add source with carry");
                   2707:     I(0,lahf,   0,      0,              0);
                   2708:        I(0,seto,       CL,     0,                              0);
                   2709:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2710:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C");
                   2711:        I(0,orb,        F,              CL,                     "combine the flags");
                   2712: }
                   2713: 
                   2714: void M_SUB( const char *src )
                   2715: {
                   2716:        I(0,subb,       A,              src,                    "subtract source");
                   2717:     I(0,lahf,   0,      0,              0);
                   2718:        I(0,seto,       CL,     0,                              0);
                   2719:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2720:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C");
                   2721:        I(0,orb,        F,              X(NF),                  "set N");
                   2722:        I(0,orb,        F,              CL,                     "combine the flags");
                   2723: }
                   2724: 
                   2725: void M_SBC( const char *src )
                   2726: {
                   2727:        I(0,sahf,       0,              0,                              "set the flags");
                   2728:        I(0,sbbb,       A,              src,                    "subtract source with carry");
                   2729:     I(0,lahf,   0,      0,              0);
                   2730:        I(0,seto,       CL,     0,                              0);
                   2731:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2732:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z and C");
                   2733:        I(0,orb,        F,              X(NF),                  "set N");
                   2734:        I(0,orb,        F,              CL,                     "combine the flags");
                   2735: }
                   2736: 
                   2737: void M_AND( const char *src )
                   2738: {
                   2739:        I(0,andb,       A,              src,                    "logical and with source");
                   2740:        I(0,lahf,       0,              0,                              0);
                   2741:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S,Z and P/V");
                   2742:        I(0,orb,        F,              X(HF),                  "set H");
                   2743: }
                   2744: 
                   2745: void M_XOR( const char *src )
                   2746: {
                   2747:        I(0,xorb,       A,              src,                    "logical exclusive or with source");
                   2748:     I(0,lahf,   0,      0,              0);
                   2749:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S,Z and P/V");
                   2750: }
                   2751: 
                   2752: void M_OR( const char *src )
                   2753: {
                   2754:        I(0,orb,        A,              src,                    "logical or with source");
                   2755:        I(0,lahf,       0,              0,                              0);
                   2756:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S,Z and P/V flags");
                   2757: }
                   2758: 
                   2759: void M_CP( const char *src )
                   2760: {
                   2761:        I(0,cmpb,       A,              src,                    "compare with source");
                   2762:        I(0,lahf,       0,              0,                              0);
                   2763:        I(0,seto,       CL,     0,                              0);
                   2764:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   2765:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S,Z,H and C flags");
                   2766:        I(0,orb,        F,              X(NF),                  "set N");
                   2767:        I(0,orb,        F,              CL,                     "combine the flags");
                   2768: }
                   2769: 
                   2770: #if BUSY_LOOP_HACKS
                   2771: void M_JR( int opcode )
                   2772: {
                   2773:     char symbol[4][32+1];
                   2774:        int i;
                   2775:        for (i = 0; i < 4; i++)
                   2776:                sprintf(symbol[i],"op_%02x_%d", opcode, i);
                   2777:        I(0,movl,       EDX,            PC32,           "ECX = old PC");
                   2778:        I(0,decl,       EDX,            0,                      "- 1");
                   2779:        REL();
                   2780:        I(0,addl,       PC32,           ECX,            "change PC");
                   2781:        I(0,cmpl,       EDX,            PC32,           "busy loop (tight) ?");
                   2782:        I(0,jne,        LS(symbol[0]),0,                "no, skip");
                   2783:        I(0,orl,        zICOUNT,        B(0),           "more cycles left?");
                   2784:        I(0,jle,        LN(symbol[3]),0,                "no, skip");
                   2785:        I(0,movl,       zICOUNT,        D(0),           "bail out");
                   2786:        I(0,jmp,        symbol[3],      0,                      0);
                   2787: 
                   2788:     pad(align_jumps);
                   2789:        S(symbol[0],0);
                   2790:        I(0,decl,       EDX,            0,                      "EDX = oldpc - 1");
                   2791:        I(0,movl,       EDI,            OP_ROM,         "get OP_ROM base");
                   2792:        I(0,movb,       CL,             M(1,0,edi,0,pc32,1), "read opcode byte");
                   2793:        I(0,cmpl,       EDX,            PC32,           "busy loop (1 byte opcode) ?");
                   2794:        I(0,jne,        LS(symbol[2]),0,                "no, skip");
                   2795:        I(0,cmpb,       CL,             X(0x00),        "NOP - JR xxxx ?");
                   2796:        I(0,jne,        LS(symbol[1]),0,                "no, skip");
                   2797:        I(0,orl,        zICOUNT,        B(0),           "more cycles left?");
                   2798:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2799:        I(0,movl,       zICOUNT,        D(0),           "bail out");
                   2800:        I(0,jmp,        symbol[3],      0,                      0);
                   2801: 
                   2802:     pad(align_jumps);
                   2803:        S(symbol[1],0);
                   2804:        I(0,cmpb,       CL,             X(0xfb),        "EI - JR xxxx ?");
                   2805:        I(0,jne,        LS(symbol[2]),0,                "no, skip");
                   2806:        I(0,cmpl,       zICOUNT,        B(4),           "more than four cycles left?");
                   2807:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2808:        I(0,movl,       zICOUNT,        D(4),           "bail out after EI");
                   2809:        I(0,jmp,        symbol[3],      0,                      0);
                   2810: 
                   2811:     pad(align_jumps);
                   2812:        S(symbol[2],0);
                   2813:        I(0,cmpb,       CL,             X(0x31),        "LD SP,xxxx - JR xxxx ?");
                   2814:        I(0,jne,        LS(symbol[3]),0,                "no, skip");
                   2815:     I(0,subl,   EDX,        B(2),       "EDX = oldpc - 3");
                   2816:        I(0,cmpl,       EDX,            PC32,           "busy loop (3 byte opcode) ?");
                   2817:        I(0,jne,        LS(symbol[3]),0,                "no, skip");
                   2818:        I(0,cmpl,       zICOUNT,        B(10),          "more than ten cycles left?");
                   2819:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2820:        I(0,movl,       zICOUNT,        D(10),          "bail out after LD SP,xxxx");
                   2821:        I(0,jmp,        LS(symbol[3]),0,                0);
                   2822: 
                   2823:     pad(align_jumps);
                   2824:        S(symbol[3],0);
                   2825:        CHANGE_PC();
                   2826: }
                   2827: #else
                   2828: void M_JR( int opcode )
                   2829: {
                   2830:        REL();
                   2831:        I(0,addl,       PC32,           ECX,            "change PC");
                   2832:        CHANGE_PC();
                   2833: }
                   2834: #endif
                   2835: 
                   2836: void M_JR_CC( int opcode, int flag )
                   2837: {
                   2838:        char symbol[32+1];
                   2839:        sprintf(symbol,"op_%02x_take", opcode);
                   2840:        if (flag) {
                   2841:                I(0,sahf,       0,              0,                              "set flags");
                   2842:                switch (opcode & 0x38) {
                   2843:                        case 0x20: I(0,jnz, LS(symbol),0,"Z == 0: take jump");  break;
                   2844:                        case 0x28: I(0,jz,      LS(symbol),0,"Z == 1: take jump");  break;
                   2845:                        case 0x30: I(0,jnc, LS(symbol),0,"C == 0: take jump");  break;
                   2846:                        case 0x38: I(0,jc,      LS(symbol),0,"C == 1: take jump");  break;
                   2847:                }
                   2848:                ADJUST_PC(+1);
                   2849:                end_opcode("z_op");
                   2850:        }
                   2851: 
                   2852:     pad(align_jumps);
                   2853:        S(symbol,"take the relative jump");
                   2854:        REL();
                   2855:        I(0,addl,       PC32,           ECX,    "change PC");
                   2856:     I(0,subl,   zICOUNT,B(5),       "five additional cycles");
                   2857:        CHANGE_PC();
                   2858: }
                   2859: 
                   2860: void M_DJNZ( int opcode )
                   2861: {
                   2862:        char symbol[32+1];
                   2863:        sprintf(symbol,"op_%02x_take    ", opcode);
                   2864:        I(0,decb,       zB,     0,                      "decrement B");
                   2865:        I(0,jne,        LS(symbol),0,           "not zero, take the jump");
                   2866:        ADJUST_PC(+1);
                   2867:        end_opcode("z_op");
                   2868: 
                   2869:     pad(align_jumps);
                   2870:        S(symbol,"take the relative jump");
                   2871:        REL();
                   2872:        I(0,addl,       PC32,           ECX,    "change PC");
                   2873:     I(0,subl,   zICOUNT,B(5),       "five additional cycles");
                   2874:        CHANGE_PC();
                   2875: }
                   2876: 
                   2877: void M_HALT( int opcode )
                   2878: {
                   2879:        char symbol[32+1];
                   2880:     sprintf(symbol,"op_%02x_done", opcode);
                   2881:        I(0,movb,       zHALT,          B(1),           "set HALT flag");
                   2882:        ADJUST_PC(-1);
                   2883:        I(0,orl,        zICOUNT,        B(0),           "cycle count <= zero already?");
                   2884:        I(0,jle,        LS(symbol), 0,                  0);
                   2885:        I(0,movl,       zICOUNT,        D(0),           0);
                   2886:        S(symbol,0);
                   2887: }
                   2888: 
                   2889: void M_RET( int opcode )
                   2890: {
                   2891:        POP( 1, PC32 );
                   2892:        CHANGE_PC();
                   2893: }
                   2894: 
                   2895: void M_RET_CC( int opcode )
                   2896: {
                   2897:        char symbol[32+1];
                   2898:        sprintf(symbol,"op_%02x_done", opcode);
                   2899:        I(0,sahf,       0,              0,                      "set flags");
                   2900:        switch (opcode & 0x38) {
                   2901:                case 0x00: I(0,jne,    LS(symbol),0,"Z == 0: return");  break;
                   2902:                case 0x08: I(0,je,         LS(symbol),0,"Z == 1: return");  break;
                   2903:                case 0x10: I(0,jnc,    LS(symbol),0,"C == 0: return");  break;
                   2904:                case 0x18: I(0,jc,         LS(symbol),0,"C == 1: return");  break;
                   2905:                case 0x20: I(0,jpo,    LS(symbol),0,"P == 0: return");  break;
                   2906:                case 0x28: I(0,jpe,    LS(symbol),0,"P == 1: return");  break;
                   2907:                case 0x30: I(0,jns,    LS(symbol),0,"S == 0: return");  break;
                   2908:                case 0x38: I(0,js,         LS(symbol),0,"S == 1: return");  break;
                   2909:        }
                   2910:        end_opcode("z_op");
                   2911: 
                   2912:     pad(align_jumps);
                   2913:        S(symbol,"execute the return");
                   2914:        I(0,subl,       zICOUNT,B(6),           "six additional cycles");
                   2915:        M_RET( opcode );
                   2916: }
                   2917: 
                   2918: #if BUSY_LOOP_HACKS
                   2919: void M_JP( int opcode )
                   2920: {
                   2921:        char symbol[4][32+1];
                   2922:        int i;
                   2923:        for (i = 0; i < 4; i++)
                   2924:                sprintf(symbol[i],"op_%02x_%d", opcode, i);
                   2925:        I(0,movl,       ECX,            PC32,           "ECX = PC");
                   2926:        I(0,decl,       ECX,            0,                      "- 1");
                   2927:        ARG16( PC32 );
                   2928:        I(0,cmpl,       ECX,            PC32,           "busy loop (tight) ?");
                   2929:        I(0,jne,        LS(symbol[0]),0,                "no, skip");
                   2930:        I(0,orl,        zICOUNT,        B(0),           "more cycles left?");
                   2931:        I(0,jle,        LN(symbol[3]),0,                "no, skip");
                   2932:        I(0,movl,       zICOUNT,        D(0),           "bail out");
                   2933:        I(0,jmp,        symbol[3],      0,                      0);
                   2934:        pad(align_jumps);
                   2935:        S(symbol[0],0);
                   2936:        I(0,decl,       ECX,            0,                      "ECX = oldpc - 1");
                   2937:        I(0,movl,       EDI,            OP_ROM,         "get OP_ROM base");
                   2938:        I(0,movb,       DL,             M(1,0,edi,0,pc32,1), "read opcode byte");
                   2939:        I(0,cmpl,       ECX,            PC32,           "busy loop (1 byte opcode) ?");
                   2940:        I(0,jne,        LS(symbol[2]),0,                "no, skip");
                   2941:        I(0,cmpb,       DL,             X(0x00),        "NOP - JP xxxx ?");
                   2942:        I(0,jne,        LS(symbol[1]),0,                "no, skip");
                   2943:        I(0,orl,        zICOUNT,        B(0),           "more cycles left?");
                   2944:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2945:        I(0,movl,       zICOUNT,        D(0),           "bail out");
                   2946:        I(0,jmp,        symbol[3],      0,                      0);
                   2947:        pad(align_jumps);
                   2948:        S(symbol[1],0);
                   2949:        I(0,cmpb,       DL,             X(0xfb),        "EI - JP xxxx ?");
                   2950:        I(0,jne,        LS(symbol[2]),0,                "no, skip");
                   2951:        I(0,cmpl,       zICOUNT,        B(4),           "more than four cycles left?");
                   2952:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2953:        I(0,movl,       zICOUNT,        D(4),           "bail out after EI");
                   2954:        I(0,jmp,        symbol[3],      0,                      0);
                   2955:        pad(align_jumps);
                   2956:        S(symbol[2],0);
                   2957:        I(0,cmpb,       DL,             X(0x31),        "LD SP,xxxx - JP xxxx ?");
                   2958:        I(0,jne,        LS(symbol[3]),0,                "no, skip");
                   2959:        I(0,subl,       ECX,            B(2),           "ECX = oldpc - 3");
                   2960:        I(0,cmpl,       ECX,            PC32,           "busy loop (3 byte opcode) ?");
                   2961:        I(0,jne,        LS(symbol[3]),0,                "no, skip");
                   2962:        I(0,cmpl,       zICOUNT,        B(10),          "more than ten cycles left?");
                   2963:        I(0,jle,        LS(symbol[3]),0,                "nope, leave");
                   2964:        I(0,movl,       zICOUNT,        D(10),          "bail out after LD SP,xxxx");
                   2965:        I(0,jmp,        LS(symbol[3]),0,                0);
                   2966:        pad(align_jumps);
                   2967:        S(symbol[3],0);
                   2968:        CHANGE_PC();
                   2969: }
                   2970: #else
                   2971: void M_JP( int opcode )
                   2972: {
                   2973:        ARG16( PC32 );
                   2974:        CHANGE_PC();
                   2975: }
                   2976: #endif
                   2977: 
                   2978: void M_JP_CC( int opcode )
                   2979: {
                   2980:        char symbol[32+1];
                   2981:        sprintf(symbol,"op_%02x_take", opcode);
                   2982:        I(0,sahf,       0,              0,                      "set flags");
                   2983:        switch (opcode & 0x38) {
                   2984:                case 0x00: I(0,jne,    LS(symbol),0,"Z == 0: jump");    break;
                   2985:                case 0x08: I(0,je,         LS(symbol),0,"Z == 1: jump");    break;
                   2986:                case 0x10: I(0,jnc,    LS(symbol),0,"C == 0: jump");    break;
                   2987:                case 0x18: I(0,jc,         LS(symbol),0,"C == 1: jump");    break;
                   2988:                case 0x20: I(0,jpo,    LS(symbol),0,"P == 0: jump");    break;
                   2989:                case 0x28: I(0,jpe,    LS(symbol),0,"P == 1: jump");    break;
                   2990:                case 0x30: I(0,jns,    LS(symbol),0,"S == 0: jump");    break;
                   2991:                case 0x38: I(0,js,         LS(symbol),0,"S == 1: jump");    break;
                   2992:        }
                   2993:        ADJUST_PC(+2);
                   2994:        end_opcode("z_op");
                   2995: 
                   2996:     pad(align_jumps);
                   2997:        S(symbol,"take the jump");
                   2998:        ARG16( PC32 );
                   2999:        CHANGE_PC();
                   3000: }
                   3001: 
                   3002: void M_JP_REG( int opcode, const char *reg )
                   3003: {
                   3004:        I(0,movl,       PC32,   reg,  0);
                   3005:        CHANGE_PC();
                   3006: }
                   3007: 
                   3008: void M_CALL( int opcode )
                   3009: {
                   3010:        ARG16( zEA );
                   3011:        PUSH( 3, PC32 );
                   3012:        I(0,movl,       PC32,   zEA,            "get the new PC");
                   3013:        CHANGE_PC();
                   3014: }
                   3015: 
                   3016: void M_CALL_CC( int opcode )
                   3017: {
                   3018:        char symbol[32+1];
                   3019:        sprintf(symbol,"op_%02x_take", opcode);
                   3020:        I(0,sahf,       0,              0,                      "set flags");
                   3021:        switch (opcode & 0x38) {
                   3022:                case 0x00: I(0,jne,    LS(symbol),0,"Z == 0: call");    break;
                   3023:                case 0x08: I(0,je,         LS(symbol),0,"Z == 1: call");    break;
                   3024:                case 0x10: I(0,jnc,    LS(symbol),0,"C == 0: call");    break;
                   3025:                case 0x18: I(0,jc,         LS(symbol),0,"C == 1: call");    break;
                   3026:                case 0x20: I(0,jpo,    LS(symbol),0,"P == 0: call");    break;
                   3027:                case 0x28: I(0,jpe,    LS(symbol),0,"P == 1: call");    break;
                   3028:                case 0x30: I(0,jns,    LS(symbol),0,"S == 0: call");    break;
                   3029:                case 0x38: I(0,js,         LS(symbol),0,"S == 1: call");    break;
                   3030:     }
                   3031:        ADJUST_PC(+2);
                   3032:     end_opcode("z_op");
                   3033: 
                   3034:     pad(align_jumps);
                   3035:        S(symbol,"make the call");
                   3036:        ARG16( zEA );
                   3037:        PUSH( 3, PC32 );
                   3038:        I(0,movl,       PC32,   zEA,            "get new PC");
                   3039:     I(0,subl,   zICOUNT,B(7),       "seven additional cycles");
                   3040:        CHANGE_PC();
                   3041: }
                   3042: 
                   3043: void M_RST( int opcode )
                   3044: {
                   3045:        PUSH( 1, PC32 );
                   3046:        I(0,movl,       PC32,   X(opcode & 0x38),  0);
                   3047:        CHANGE_PC();
                   3048: }
                   3049: 
                   3050: void M_EX_AF_AF2( void )
                   3051: {
                   3052:        I(0,xchgb,      F,              zF2,    0);
                   3053:        I(0,xchgb,      A,              zA2,    0);
                   3054: }
                   3055: 
                   3056: void M_EXX( void )
                   3057: {
                   3058:        I(0,movzwl, ECX,        zBC,    0);
                   3059:        I(0,xchgw,      CX,     zBC2,   0);
                   3060:        I(0,movw,       zBC,    CX,     0);
                   3061:        I(0,movzwl, ECX,        zDE,    0);
                   3062:        I(0,xchgw,      CX,     zDE2,   0);
                   3063:        I(0,movw,       zDE,    CX,     0);
                   3064:        I(0,xchgw,      HL,     zHL2,   0);
                   3065: }
                   3066: 
                   3067: void M_EX_DE_HL( void )
                   3068: {
                   3069:        I(0,xchgw,      HL,     zDE,    0);
                   3070: }
                   3071: 
                   3072: void M_RLCA( void )
                   3073: {
                   3074:        I(0,shrb,       F,              D(1),                   "knock out C");
                   3075:        I(0,rolb,       A,              D(1),                   0);
                   3076:        I(0,adcb,       F,              F,                              "get C");
                   3077:        I(0,andb,       F,              X(~(HF|NF)&255),"remove H and N flags");
                   3078: }
                   3079: 
                   3080: void M_RRCA( void )
                   3081: {
                   3082:        I(0,shrb,       F,              D(1),                   "knock out C");
                   3083:        I(0,rorb,       A,              D(1),                   0);
                   3084:        I(0,adcb,       F,              F,                              "get C");
                   3085:        I(0,andb,       F,              X(~(HF|NF)&255),"remove H and N flags");
                   3086: }
                   3087: 
                   3088: void M_RLA( void )
                   3089: {
                   3090:        I(0,shrb,       F,              D(1),                   "C into carry");
                   3091:        I(0,rclb,       A,              D(1),                   0);
                   3092:        I(0,adcb,       F,              F,                              "get C");
                   3093:        I(0,andb,       F,              X(~(HF|NF)&255),"remove H and N flags");
                   3094: }
                   3095: 
                   3096: void M_RRA( void )
                   3097: {
                   3098:        I(0,shrb,       F,              D(1),                   "C into carry");
                   3099:        I(0,rcrb,       A,              D(1),                   0);
                   3100:        I(0,adcb,       F,              F,                              "get C");
                   3101:        I(0,andb,       F,              X(~(HF|NF)&255),"remove H and N flags");
                   3102: }
                   3103: 
                   3104: void M_CPL( void )
                   3105: {
                   3106:        I(0,xorb,       A,      X(0xff),                        "one's complement accumulator");
                   3107:        I(0,orb,        F,      X(HF|NF),                       "set H and N");
                   3108: }
                   3109: 
                   3110: void M_DAA( int opcode )
                   3111: {
                   3112:        I(0,movzbl, ECX,        A,                              "get accu");
                   3113:        I(0,rorb,       F,              D(2),                   "check N flag");
                   3114:        I(0,adcb,       CH,     CH,                     0);
                   3115:        I(0,rorb,       F,              D(3),                   "check H flag");
                   3116:        I(0,adcb,       CH,     CH,                     0);
                   3117:        I(0,rorb,       F,              D(5),                   "check C flag");
                   3118:        I(0,adcb,       CH,     CH,                     0);
                   3119:        I(0,movzwl, AF32,       zDAA(ecx),              "get DAA table entry");
                   3120: }
                   3121: 
                   3122: void M_SCF( void )
                   3123: {
                   3124:        I(0,andb,       F,      X(~(HF|NF)&255),"clear H and N");
                   3125:     I(0,orb,    F,  X(CF),          "set C");
                   3126: }
                   3127: 
                   3128: void M_CCF( void )
                   3129: {
                   3130:        I(0,movb,       CL,     F,                      0);
                   3131:        I(0,andb,       F,              X(~(HF|NF)),"clear H and N");
                   3132:        I(0,andb,       CL,     X(CF),          "mask C");
                   3133:        I(0,shlb,       CL,     D(4),           "move C to H");
                   3134:        I(0,orb,        CL,     X(CF),          "set C");
                   3135:        I(0,xorb,       F,              CL,             "toggle C, set/leave H");
                   3136: }
                   3137: 
                   3138: void M_DI( void )
                   3139: {
                   3140:        I(0,movb,       zIFF1,  D(0),   "clear both interrupt flip-flops");
                   3141:        I(0,movb,       zIFF2,  D(0),   0);
                   3142: }
                   3143: 
                   3144: void M_EI( int opcode )
                   3145: {
                   3146:        char symbol[32+1];
                   3147:        sprintf(symbol, "op_%02x_skip", opcode);
                   3148:        I(0,movb,       CL,                     X(0xff),                0);
                   3149:        I(0,movb,       zIFF2,                  CL,                     "set interrupt flip-flop 2");
                   3150:        I(0,cmpb,       CL,                     zIFF1,                  "interrupt flip-flop 1 already set?");
                   3151:        I(0,je,         LN(symbol),     0,                              "yes, skip");
                   3152:        I(0,movb,       zIFF1,                  CL,                     "set IFF1");
                   3153:        I(0,cmpl,       irq_state,              B(CLEAR_LINE),  "irq line clear?");
                   3154:        I(0,je,         LN(symbol),     0,                              "yes, skip");
                   3155:        save_af();
                   3156:        save_z80(2);
                   3157:        I(0,movl,       ESI,                    zICOUNT,                "save remaining cycle count");
                   3158:        I(0,movl,       EDI,                    zITOTAL,                "and total cycle count");
                   3159:        I(0,pushl,      D(1),                   0,                              "execute one opcode");
                   3160:        I(0,call,       "_Z80_Execute", 0,              "recursive.. eww!");
                   3161:        I(0,movl,       zITOTAL,                EDI,                    "restore total cycle count");
                   3162:        I(0,movl,       zICOUNT,                ESI,                    "restore remaining cycle count");
                   3163:     I(0,addl,   ESP,            B(4),           "clean up stack");
                   3164:        I(0,subl,       zICOUNT,                EAX,                    "subtract cycles used");
                   3165:        restore_z80();
                   3166:        restore_af();
                   3167:        mk_take_irq( opcode );
                   3168:        I(0,movl,       ECX,                    D(0),                   0);
                   3169:        I(0,xchgl,      ECX,                    zIEXTRN,                "interrupt used cycles");
                   3170:        I(0,subl,       zICOUNT,                ECX,                    "subtract from cycle count");
                   3171:        com(0);
                   3172:     pad(align_jumps);
                   3173:        S(symbol,0);
                   3174: }
                   3175: 
                   3176: void M_RLC( const char *reg )
                   3177: {
                   3178:        I(0,rolb,       reg,    D(1),                   "rotate left circular");
                   3179:        I(0,setc,       CL,     0,                              "CL = 1 if carry set");
                   3180:        I(0,orb,        reg,    D(0),                   "check sign, zero and parity");
                   3181:     I(0,lahf,   0,      0,              0);
                   3182:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S, Z and P/V flags");
                   3183:        I(0,orb,        F,              CL,                     "combine with C");
                   3184: }
                   3185: 
                   3186: void M_RRC( const char *reg )
                   3187: {
                   3188:        I(0,rorb,       reg,    D(1),                   "rotate right circular");
                   3189:        I(0,setc,       CL,     0,                              "CL = 1 if carry set");
                   3190:        I(0,orb,        reg,    D(0),                   "check sign, zero and parity");
                   3191:     I(0,lahf,   0,      0,              0);
                   3192:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S, Z and P/V flags");
                   3193:        I(0,orb,        F,              CL,                     "combine with C");
                   3194: }
                   3195: 
                   3196: void M_RL( const char *reg )
                   3197: {
                   3198:        I(0,shrb,       F,              D(1),                   "get C into carry");
                   3199:        I(0,rclb,       reg,    D(1),                   "rotate left through carry");
                   3200:        I(0,setc,       CL,     0,                              "CL = 1 if carry set");
                   3201:     I(0,orb,    reg,    D(0),           0);
                   3202:     I(0,lahf,   0,      0,              0);
                   3203:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S,Z and P/V flags");
                   3204:        I(0,orb,        F,              CL,                     "combine with C");
                   3205: }
                   3206: 
                   3207: void M_RR( const char *reg )
                   3208: {
                   3209:        I(0,shrb,       F,              D(1),                   "get C into carry");
                   3210:        I(0,rcrb,       reg,    D(1),                   "rotate right through carry");
                   3211:        I(0,setc,       CL,     0,                              "CL = 1 if carry set");
                   3212:        I(0,orb,        reg,    D(0),                   "check sign, zero and parity");
                   3213:     I(0,lahf,   0,      0,              0);
                   3214:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S,Z and P/V flags");
                   3215:        I(0,orb,        F,              CL,                     "combine with C");
                   3216: }
                   3217: 
                   3218: void M_SLL( const char *reg )
                   3219: {
                   3220:        I(0,shlb,       reg,    D(1),                   "shift left logical");
                   3221:     I(0,lahf,   0,      0,              0);
                   3222:        I(0,andb,       F,              X(SF|PF|CF),    "mask S, P/V and C flags");
                   3223:        I(0,orb,        reg,    D(1),                   "set bit 0 of destination");
                   3224: }
                   3225: 
                   3226: void M_SRL( const char *reg )
                   3227: {
                   3228:        I(0,shrb,       reg,    D(1),                   "shift right logical");
                   3229:     I(0,lahf,   0,      0,              0);
                   3230:        I(0,andb,       F,              X(SF|ZF|PF|CF), "mask S, Z, P/V and C flags");
                   3231: }
                   3232: 
                   3233: void M_SLA( const char *reg )
                   3234: {
                   3235:        I(0,salb,       reg,    D(1),                   "shift left arithmetical (well..)");
                   3236:     I(0,lahf,   0,      0,              0);
                   3237:        I(0,andb,       F,              X(SF|ZF|PF|CF), "mask S, Z, P/V and C flags");
                   3238: }
                   3239: 
                   3240: void M_SRA( const char *reg )
                   3241: {
                   3242:        I(0,sarb,       reg,    D(1),                   "shift right arithmetical");
                   3243:     I(0,lahf,   0,      0,              0);
                   3244:        I(0,andb,       F,              X(SF|ZF|PF|CF), "mask S, Z, P/V and C flags");
                   3245: }
                   3246: 
                   3247: void M_BIT( int n, const char *reg )
                   3248: {
                   3249:        I(0,movb,       CL,     F,                              "save flags");
                   3250:     I(0,movb,   CH,     X(1<<n),        "bit mask");
                   3251:        I(0,andb,       CL,     X(CF),                  "keep C flag");
                   3252:        I(0,orb,        CL,     X(HF),                  "set H flag");
                   3253:     I(0,andb,   CH,     reg,            "check sign and zero");
                   3254:     I(0,lahf,   0,      0,              0);
                   3255:        I(0,andb,       F,              X(SF|ZF),               "mask S and Z flags");
                   3256:        I(0,orb,        F,              CL,                     "combine with C");
                   3257: }
                   3258: 
                   3259: void M_RES( int n, const char *reg )
                   3260: {
                   3261:        I(0,andb,       reg,    X(~(1<<n)&255), "reset bit mask");
                   3262: }
                   3263: 
                   3264: void M_SET( int n, const char *reg )
                   3265: {
                   3266:        I(0,orb,        reg,    X(1<<n),                "set bit mask");
                   3267: }
                   3268: 
                   3269: void M_OUT( int opsize, const char *port, const char *reg )
                   3270: {
                   3271: #if INLINE_IOPORTS
                   3272:        static int wport = 0;
                   3273:        char symbol[3][7+1];
                   3274:        int i;
                   3275:        wport++;
                   3276:        for (i = 0; i < 3; i++)
                   3277:                sprintf(symbol[i], "WP%03x_%d", wport, i);
                   3278:        if (strcmp(reg, EDX))
                   3279:                I(0,movzbl, EDX,        reg,                    "output register");
                   3280:        if (strcmp(port, ECX))
                   3281:                I(0,movl,       ECX,    port,                   "output port");
                   3282:        save_af();
                   3283:     save_z80(opsize);
                   3284:     I(0,movl,   EDI,    M(4,"_cur_writeport",0,0,0,0),0);
                   3285:        I(0,orl,        EDI,    EDI,                            0);
                   3286:        I(0,je,         LS(symbol[2]),0,                        0);
                   3287:     I(0,andl,   ECX,    M(4,"_cur_portmask",0,0,0,0),0);
                   3288:        pad(align_jumps);
                   3289:        S(symbol[0],0);
                   3290:        I(0,cmpl,       M(4,0,edi,0,0,0),       D(-1),  "end of table?");
                   3291:        I(0,je,         LS(symbol[2]),0,                        0);
                   3292:        I(0,cmpl,       ECX,    M(4,0,edi,0,0,0),       "port < start?");
                   3293:        I(0,jb,         LS(symbol[1]),0,                        0);
                   3294:        I(0,cmpl,       ECX,    M(4,0,edi,4,0,0),       "port > end?");
                   3295:        I(0,ja,         LS(symbol[1]),0,                        0);
                   3296:        I(0,movl,       EBX,    M(4,0,edi,8,0,0),       "get handler");
                   3297:        I(0,orl,        EBX,    EBX,                            "IOWP_NOP ?");
                   3298:        I(0,je,         LS(symbol[2]),0,                        0);
                   3299:        I(0,subl,       ECX,    M(4,0,edi,0,0,0),       "subtract start");
                   3300:        I(0,pushl,      EDX,    0,                                      "value");
                   3301:        I(0,pushl,      ECX,    0,                                      "offset");
                   3302:        I(0,call,       EBX,    0,                                      "call handler");
                   3303:        I(0,addl,       ESP,    B(8),                           "two DWORDs were pushed");
                   3304:     I(0,jmp,    LS(symbol[2]),0,            0);
                   3305:        pad(align_jumps);
                   3306:        S(symbol[1],0);
                   3307:        I(0,addl,       EDI,    B(12),                          "skip sizeof(IOWritePort)");
                   3308:        I(0,jmp,        LS(symbol[0]),0,                        "test next entry");
                   3309:        pad(align_jumps);
                   3310:     S(symbol[2],0);
                   3311:        restore_z80();
                   3312:        restore_af();
                   3313: #else
                   3314:        if (strcmp(reg,EDX))
                   3315:                I(0,movzbl, EDX,        reg,                            "output register");
                   3316:        if (strcmp(port,ECX))
                   3317:                I(0,movl,       ECX,    port,                           "port");
                   3318:        save_af();
                   3319:     save_z80(opsize);
                   3320:     I(0,pushl,  EDX,    0,                  "value");
                   3321:        I(0,pushl,      ECX,    0,                                      "port");
                   3322:        I(0,call,       "_cpu_writeport",0,         0);
                   3323:        I(0,addl,       ESP,    B(8),                           "two DWORDs were pushed");
                   3324:        restore_z80();
                   3325:        restore_af();
                   3326: #endif
                   3327: }
                   3328: 
                   3329: void M_IN( int opsize, const char *reg, const char *port )
                   3330: {
                   3331: #if INLINE_IOPORTS
                   3332:        static int wport = 0;
                   3333:        char symbol[3][7+1];
                   3334:        int i;
                   3335:        wport++;
                   3336:        for (i = 0; i < 3; i++)
                   3337:                sprintf(symbol[i], "RP%03x_%d", wport, i);
                   3338:        if (strcmp(port,ECX))
                   3339:                I(0,movl,       ECX,    port,                   "output port");
                   3340:        save_af();
                   3341:     save_z80(opsize);
                   3342:     I(0,movl,   EDI,    M(4,"_cur_readport",0,0,0,0),0);
                   3343:        I(0,orl,        EDI,    EDI,                            0);
                   3344:        I(0,je,         LS(symbol[2]),0,                        0);
                   3345:     I(0,andl,   ECX,    M(4,"_cur_portmask",0,0,0,0),0);
                   3346:        pad(align_jumps);
                   3347:        S(symbol[0],0);
                   3348:        I(0,cmpl,       M(4,0,edi,0,0,0),       D(-1),  "end of table?");
                   3349:        I(0,je,         LS(symbol[2]),0,                        0);
                   3350:        I(0,cmpl,       ECX,    M(4,0,edi,0,0,0),       "port < start?");
                   3351:        I(0,jb,         LS(symbol[1]),0,                        0);
                   3352:        I(0,cmpl,       ECX,    M(4,0,edi,4,0,0),       "port > end?");
                   3353:        I(0,ja,         LS(symbol[1]),0,                        0);
                   3354:        I(0,movl,       EAX,    M(4,0,edi,8,0,0),       "get handler");
                   3355:        I(0,orl,        EAX,    EAX,                            "IORP_NOP ?");
                   3356:        I(0,je,         LS(symbol[2]),0,                        0);
                   3357:        I(0,subl,       ECX,    M(4,0,edi,0,0,0),       "subtract start");
                   3358:        I(0,pushl,      ECX,    0,                                      "offset");
                   3359:        I(0,call,       EAX,    0,                                      "call handler");
                   3360:        I(0,addl,       ESP,    B(4),                           0);
                   3361:        I(0,jmp,        LS(symbol[2]),0,                        0);
                   3362:        pad(align_jumps);
                   3363:        S(symbol[1],0);
                   3364:        I(0,addl,       EDI,    B(12),                          "skip sizeof(IOReadPort)");
                   3365:        I(0,jmp,        LS(symbol[0]),0,                        "test next entry");
                   3366:        pad(align_jumps);
                   3367:     S(symbol[2],0);
                   3368:        I(0,movzbl, EDX,        AL,                             0);
                   3369:        restore_z80();
                   3370:        restor_af();
                   3371: #else
                   3372:        if (strcmp(port,ECX))
                   3373:         I(0,movl,   ECX,    port,           "output port");
                   3374:        save_af();
                   3375:     save_z80(opsize);
                   3376:     I(0,pushl,  ECX,    0,              0);
                   3377:        I(0,call,       "_cpu_readport",0,      0);
                   3378:        I(0,addl,       ESP,    B(4),                   0);
                   3379:        I(0,movzbl, EDX,        AL,                             0);
                   3380:     restore_z80();
                   3381:        restore_af();
                   3382: #endif
                   3383:        if (strcmp(reg, EDX) && strcmp(reg, DL))
                   3384:         I(0,movb,   reg,    DL,             "input register");
                   3385: }
                   3386: 
                   3387: void M_OUT_BC( const char *reg )
                   3388: {
                   3389:        I(0,movzbl, EDX,        reg,                    "get value to EDX");
                   3390:        M_OUT( 2, zBC32, EDX );
                   3391: }
                   3392: 
                   3393: void M_IN_BC( const char *reg )
                   3394: {
                   3395:        M_IN( 2, EDX, zBC32 );
                   3396:        I(0,movb,       CL,     F,                              "save flags");
                   3397:        I(0,andb,       CL,     X(CF),                  "mask C flag");
                   3398:        I(0,orb,        DL,     DL,                     "check sign, zero and parity");
                   3399:        I(0,lahf,       0,              0,                              0);
                   3400:     I(0,andb,   F,      X(SF|ZF|PF),    "mask S, Z and P/V flags");
                   3401:        if (strcmp(reg, DL))
                   3402:                I(0,movb,       reg,    DL,                     0);
                   3403:        I(0,orb,        F,              CL,                     "combine with carry");
                   3404: }
                   3405: 
                   3406: void M_ADC16( const char *src )
                   3407: {
                   3408:        I(0,movw,       DX,     src,                    "get source");
                   3409:        I(0,sahf,       0,              0,                              "set flags");
                   3410:        I(0,adcb,       L,              DL,                     "add LSB");
                   3411:        I(0,adcb,       H,              DH,                     "add with carry MSB");
                   3412:        I(0,seto,       CL,     0,                              "CL = 1 if overflow");
                   3413:     I(0,lahf,   0,      0,              0);
                   3414:     I(0,shlb,   CL,     D(2),           "shift overflow to P/V bit position");
                   3415:        I(0,andb,       F,              X(SF|HF|CF),    "mask S, H and C flags");
                   3416:        I(0,orb,        F,              CL,                     "combine with P/V");
                   3417:        I(0,cmpl,       HL32,   B(0),                   "HL = zero?");
                   3418:        I(0,setz,       CL,     0,                              "CL = 1 if zero");
                   3419:        I(0,shlb,       CL,     D(6),                   "shift zero to Z bit position");
                   3420:        I(0,orb,        F,              CL,                     "combine with Z");
                   3421: }
                   3422: 
                   3423: void M_SBC16( const char *src )
                   3424: {
                   3425:        I(0,movw,       DX,     src,                    "get source");
                   3426:        I(0,sahf,       0,              0,                              "set flags");
                   3427:        I(0,sbbb,       L,              DL,                     0);
                   3428:        I(0,sbbb,       H,              DH,                     0);
                   3429:     I(0,seto,   CL,     0,              "F = 1 if overflow");
                   3430:        I(0,lahf,       0,              0,                              0);
                   3431:     I(0,shlb,   CL,     D(2),           "shift overflow to P/V bit position");
                   3432:        I(0,andb,       F,              X(SF|HF|CF),    "mask S, H and C flags");
                   3433:        I(0,orb,        F,              CL,                     "combine with P/V");
                   3434:        I(0,cmpl,       HL32,   B(0),                   "HL = zero?");
                   3435:        I(0,setz,       CL,     0,                              "CL = 1 if zero");
                   3436:     I(0,orb,    F,      X(NF),          "set N");
                   3437:        I(0,shlb,       CL,     D(6),                   "shift zero to Z bit position");
                   3438:        I(0,orb,        F,              CL,                     "combine with Z");
                   3439: }
                   3440: 
                   3441: void M_NEG( void )
                   3442: {
                   3443:        I(0,movb,       CL,     A,                              "get accumulator");
                   3444:        I(0,movb,       A,              D(0),                   "subtract from zero");
                   3445:        I(0,subb,       A,              CL,                     0);
                   3446:        I(0,lahf,       0,              0,                              0);
                   3447:        I(0,seto,       CL,     0,                              "F = 1 if overflow");
                   3448:     I(0,shlb,   CL,     D(2),           "get overflow to P/V bit position");
                   3449:        I(0,andb,       F,              X(SF|ZF|HF|CF), "mask S, Z, H and C flags");
                   3450:        I(0,orb,        F,              X(NF),                  "set N");
                   3451:        I(0,orb,        F,              CL,                     "combine with P/V");
                   3452: }
                   3453: 
                   3454: void M_RETI( int opcode )
                   3455: {
                   3456:        char symbol[32+1];
                   3457:        sprintf(symbol,"ed_%02x_skip", opcode);
                   3458: 
                   3459:     POP( 2, PC32 );
                   3460:        CHANGE_PC();
                   3461:     I(0,movl,   ECX,    service_irq,    0);
                   3462:        I(0,cmpl,       ECX,    B(0),                   0);
                   3463:        I(0,jl,         LS(symbol),0,                   0);
                   3464:        save_af();
                   3465:        save_z80(2);
                   3466:        I(0,lea,        ECX,    M(0,0,0,0,ecx,4),"* sizeof(Z80_DaisyChain)");
                   3467:        I(0,pushl,      irq(ecx,12),0,                  "Z80.irq[device].irq_param");
                   3468:        I(0,call,       irq(ecx, 8),0,                  "Z80.irq[device].interrupt_reti");
                   3469:     I(0,addl,   ESP,    B(4),           0);
                   3470:        restore_z80();
                   3471:     restore_af();
                   3472:        pad(align_jumps);
                   3473:        S(symbol,0);
                   3474: }
                   3475: 
                   3476: void M_RETN( int opcode )
                   3477: {
                   3478:        char symbol[32+1];
                   3479:        sprintf(symbol,"ed_%02x_skip", opcode);
                   3480: 
                   3481:        POP( 2, PC32 );
                   3482:        CHANGE_PC();
                   3483:     I(0,movb,   CL,             zIFF2,      "get interrupt flip-flop 2");
                   3484:        I(0,orb,        CL,                     CL,             "will RETN enable interrupts?");
                   3485:        I(0,je,         LN(symbol),0,                           "no, skip");
                   3486:        I(0,movb,       zIFF1,                  CL,             "copy to interrupt flip-flop 1");
                   3487:        I(0,cmpl,       irq_state,              B(CLEAR_LINE),"irq line cleared?");
                   3488:        I(0,je,         LN(symbol),0,                           "yes, skip");
                   3489:        mk_take_irq( opcode );
                   3490:        I(0,movl,       ECX,                    D(0),                   0);
                   3491:        I(0,xchgl,      ECX,                    zIEXTRN,                "interrupt used cycles");
                   3492:     I(0,subl,   zICOUNT,        ECX,            "subtract from cycle count");
                   3493:     pad(align_jumps),
                   3494:        S(symbol,0);
                   3495: }
                   3496: 
                   3497: void M_LD_I_A( void )
                   3498: {
                   3499:        I(0,movb,       zI,     A,         0);
                   3500: }
                   3501: 
                   3502: void M_LD_A_I( void )
                   3503: {
                   3504:        I(0,movb,       CL,     F,                              "save flags");
                   3505:     I(0,movb,   A,      zI,             0);
                   3506:        I(0,andb,       CL,     X(CF),                  "mask C flag");
                   3507:        I(0,orb,        A,              A,                              "check sign and zero");
                   3508:        I(0,lahf,       0,              0,                              0);
                   3509:        I(0,andb,       F,              X(SF|ZF),               "mask S and Z flags");
                   3510:        I(0,orb,        F,              CL,                     "combine with C");
                   3511:     I(0,movb,   CL,     zIFF2,          "get interrupt flip-flop 2");
                   3512:        I(0,andb,       CL,     X(PF),                  "shift to P/V bit position");
                   3513:        I(0,orb,        F,              CL,                     "get IFF2 into P/V");
                   3514: }
                   3515: 
                   3516: void M_LD_R_A( void )
                   3517: {
                   3518:        I(0,movb,       CL,     A,                              0);
                   3519:        I(0,movb,       zR,     CL,                     "store accu into R");
                   3520:        I(0,andb,       CL,     X(0x80),                "mask bit 7");
                   3521:        I(0,movb,       zR2,    CL,                     "save in R2");
                   3522: }
                   3523: 
                   3524: void M_LD_A_R( void )
                   3525: {
                   3526:        I(0,movb,       CL,     F,                              "save flags");
                   3527:        I(0,movb,       A,              zR,                     0);
                   3528:        I(0,andb,       A,              X(0x7f),                "mask lower 7 bits");
                   3529:     I(0,andb,   CL,     X(CF),          "mask C flag");
                   3530:        I(0,orb,        A,              zR2,                    "get bit 7 from original R");
                   3531:        I(0,lahf,       0,              0,                              0);
                   3532:        I(0,andb,       F,              X(SF|ZF),               "mask S and Z flags");
                   3533:        I(0,orb,        F,              CL,                     "combine with C");
                   3534:     I(0,movb,   CL,     zIFF2,          "get interrupt flip-flop 2");
                   3535:        I(0,andb,       CL,     X(PF),                  "shift to P/V bit position");
                   3536:     I(0,orb,    F,      CL,             "get IFF2 into P/V");
                   3537: }
                   3538: 
                   3539: void M_RLD( void )
                   3540: {
                   3541:        RBYTE( 2, EDX, HL32 );
                   3542:        I(0,movb,       CH,     A,                              "get accu into CH");
                   3543:        I(0,movb,       CL,     F,                              "save flags");
                   3544:        I(0,andl,       ECX,    X(0x0f00|CF),   "mask lower nibble and keep C flag");
                   3545:        I(0,shll,       EDX,    D(4),                   "shift memory byte left one nibble");
                   3546:        I(0,xorb,       A,              CH,                     "remove lower nibble from accu");
                   3547:        I(0,orb,        DL,     CH,                     "put lower nibble of A into lower nibble of result");
                   3548:        I(0,orb,        A,              DH,                     "put upper nibble of result into lower nibble of A");
                   3549:        I(0,lahf,       0,              0,                              0);
                   3550:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S, Z and P/V flags");
                   3551:        I(0,orb,        F,              CL,                     "combine with C");
                   3552:        I(0,movzbl, EDX,        DL,                     "EDX = result");
                   3553:        WBYTE( 2, HL32, EDX );
                   3554: }
                   3555: 
                   3556: void M_RRD( void )
                   3557: {
                   3558:        RBYTE( 2, EDX, HL32 );
                   3559:        I(0,movb,       DH,     A,                              "put A into MSB of result");
                   3560:        I(0,rorw,       DX,     D(4),                   "DL = result, DH 4..7 = lower nibble of memory");
                   3561:        I(0,movb,       CL,     F,                              "save flags");
                   3562:        I(0,shrb,       DH,     D(4),                   "DH 0..3 = lower nibble of memory");
                   3563:        I(0,andb,       CL,     X(CF),                  "keep C flag");
                   3564:        I(0,andb,       A,              X(0xf0),                "keep upper nibble of A");
                   3565:        I(0,orb,        A,              DH,                     "set lower nibble from memory");
                   3566:        I(0,lahf,       0,              0,                              0);
                   3567:        I(0,andb,       F,              X(SF|ZF|PF),    "mask S, Z and P/V flags");
                   3568:        I(0,orb,        F,              CL,                     "combine flags");
                   3569:        I(0,movzbl, EDX,        DL,                     "EDX = result");
                   3570:        WBYTE( 2, HL32, EDX );
                   3571: }
                   3572: 
                   3573: const char *s(char *fmt, ...)
                   3574: {
                   3575:        va_list arg;
                   3576:     static char buffer[128];
                   3577:        va_start(arg, fmt);
                   3578:        vsprintf(buffer, fmt, arg);
                   3579:        va_end(arg);
                   3580:        return buffer;
                   3581: }
                   3582: 
                   3583: void mk_opcodes(int op_base)
                   3584: {
                   3585:        char op[32];
                   3586:        char hl[2+1], h[2+1], l[2+1], m[8+1];
                   3587:        char zhl[32+1], zh[32+1], zl[32+1], zhl32[32+1];
                   3588:        int mc = 0, mi = 0, mr = 0;
                   3589: 
                   3590:        if (op_base == 0xdd00) {
                   3591:                strcpy(op,"dd_%02x");   /* opcode label mask */
                   3592:                strcpy(hl,"IX");        /* word register name */
                   3593:                strcpy(h,"HX");         /* MSB byte register name */
                   3594:                strcpy(l,"LX");         /* LSB byte register name */
                   3595:                strcpy(m,"(IX+ofs8)");  /* memory register name */
                   3596:                strcpy(zh,zHX);                 /* MSB byte register */
                   3597:                strcpy(zl,zLX);                 /* LSB byte register */
                   3598:                strcpy(zhl,zIX);                /* word register */
                   3599:                strcpy(zhl32,zIX32);    /* dword register */
                   3600:                mc = 8;                                 /* additional cycles for r/w (IX+ofs8) */
                   3601:         mi = 5;                 /* additional cycles for w (IX+ofs8),imm8 */
                   3602:         mr = 1;                 /* additional cycles for accessing IXL/IXH */
                   3603:     } else
                   3604:        if (op_base == 0xfd00) {
                   3605:                strcpy(op,"fd_%02x");   /* opcode label mask */
                   3606:                strcpy(hl,"IY");        /* word register name */
                   3607:                strcpy(h,"HY");         /* MSB byte register name */
                   3608:                strcpy(l,"LY");         /* LSB byte register name */
                   3609:                strcpy(m,"(IY+ofs8)");  /* memory register name */
                   3610:                strcpy(zh,zHY);                 /* MSB byte register */
                   3611:                strcpy(zl,zLY);                 /* LSB byte register */
                   3612:                strcpy(zhl,zIY);                /* word register */
                   3613:                strcpy(zhl32,zIY32);    /* dword register */
                   3614:                mc = 8;                                 /* additional cycles for r/w (IY+ofs8) */
                   3615:                mi = 5;                                 /* additional cycles for w (IY+ofs8),imm8 */
                   3616:                mr = 1;                                 /* additional cycles for accessing IXL/IXH */
                   3617:     } else {
                   3618:                strcpy(op,"op_%02x");   /* opcode label mask */
                   3619:                strcpy(hl,"HL");        /* word register name */
                   3620:                strcpy(h,"H");          /* MSB byte register name */
                   3621:                strcpy(l,"L");          /* LSB byte register name */
                   3622:                strcpy(m,"(HL)");       /* memory register name */
                   3623:                strcpy(zh,H);                   /* MSB byte register */
                   3624:                strcpy(zl,L);                   /* LSB byte register */
                   3625:                strcpy(zhl,HL);                 /* word register */
                   3626:                strcpy(zhl32,HL32);     /* dword register */
                   3627:     }
                   3628: 
                   3629:        beg_opcode( 4,s(op,0x00),"NOP");
                   3630:        end_opcode("z_op");
                   3631: 
                   3632:        beg_opcode( 4,s(op,0x08),"EX   AF,AF'");
                   3633:     M_EX_AF_AF2();
                   3634:        end_opcode("z_op");
                   3635: 
                   3636:        beg_opcode( 8,s(op,0x10),"DJNZ ofs8");
                   3637:     M_DJNZ( op_base|0x10 );
                   3638:        end_opcode("z_op");
                   3639: 
                   3640:        beg_opcode(12,s(op,0x18),"JR   ofs8");
                   3641:     M_JR( op_base|0x18 );
                   3642:        end_opcode("z_op");
                   3643: 
                   3644:        beg_opcode( 7,s(op,0x20),"JR   NZ,ofs8");
                   3645:     M_JR_CC( op_base|0x20, ZF );
                   3646:        end_opcode("z_op");
                   3647: 
                   3648:        beg_opcode( 7,s(op,0x28),"JR   Z,ofs8");
                   3649:     M_JR_CC( op_base|0x28, ZF );
                   3650:        end_opcode("z_op");
                   3651: 
                   3652:        beg_opcode( 7,s(op,0x30),"JR   NC,ofs8");
                   3653:     M_JR_CC( op_base|0x30, CF );
                   3654:        end_opcode("z_op");
                   3655: 
                   3656:        beg_opcode( 7,s(op,0x38),"JR   C,ofs8");
                   3657:     M_JR_CC( op_base|0x38, CF );
                   3658:        end_opcode("z_op");
                   3659: 
                   3660: /*********/
                   3661: 
                   3662:     beg_opcode(10,s(op,0x01),"LD   BC,imm16");
                   3663:        ARG16( zBC32 );
                   3664:        end_opcode("z_op");
                   3665: 
                   3666:        beg_opcode(10,s(op,0x11),"LD   DE,imm16");
                   3667:     ARG16( zDE32 );
                   3668:        end_opcode("z_op");
                   3669: 
                   3670:        beg_opcode(10,s(op,0x21),"LD   %s,imm16",hl);
                   3671:     ARG16( zhl32 );
                   3672:        end_opcode("z_op");
                   3673: 
                   3674:        beg_opcode(10,s(op,0x31),"LD   SP,imm16");
                   3675:        ARG16( zSP32 );
                   3676:        end_opcode("z_op");
                   3677: 
                   3678: /*********/
                   3679: 
                   3680:     beg_opcode(11,s(op,0x09),"ADD  %s,BC",hl);
                   3681:        M_ADD16( zhl, zBC );
                   3682:        end_opcode("z_op");
                   3683: 
                   3684:        beg_opcode(11,s(op,0x19),"ADD  %s,DE",hl);
                   3685:        M_ADD16( zhl, zDE );
                   3686:        end_opcode("z_op");
                   3687: 
                   3688:        beg_opcode(11,s(op,0x29),"ADD  %s,%s",hl,hl);
                   3689:        M_ADD16( zhl, zhl );
                   3690:        end_opcode("z_op");
                   3691: 
                   3692:        beg_opcode(11,s(op,0x39),"ADD  %s,SP",hl);
                   3693:        M_ADD16( zhl, zSP );
                   3694:        end_opcode("z_op");
                   3695: 
                   3696: /*********/
                   3697: 
                   3698:     beg_opcode( 7,s(op,0x02),"LD   (BC),A");
                   3699:        I(0,movzbl, EDX,        A,              0);
                   3700:        WBYTE( 1, zBC32, EDX );
                   3701:        end_opcode("z_op");
                   3702: 
                   3703:        beg_opcode( 7,s(op,0x0a),"LD   A,(BC)");
                   3704:        RBYTE( 1, EDX, zBC32 );
                   3705:        I(0,movb,       A,              DL,     0);
                   3706:        end_opcode("z_op");
                   3707: 
                   3708:     beg_opcode( 7,s(op,0x12),"LD   (DE),A");
                   3709:        I(0,movzbl, EDX,        A,              0);
                   3710:        WBYTE( 1, zDE32, EDX );
                   3711:        end_opcode("z_op");
                   3712: 
                   3713:        beg_opcode( 7,s(op,0x1a),"LD   A,(DE)");
                   3714:        RBYTE( 1, EDX, zDE32 );
                   3715:        I(0,movb,       A,              DL,     0);
                   3716:        end_opcode("z_op");
                   3717: 
                   3718:     beg_opcode(16,s(op,0x22),"LD   (imm16),%s",hl);
                   3719:        ARG16( EBP );
                   3720:        WWORD( (op_base)?4:3, EBP, zhl32 );
                   3721:        end_opcode("z_op");
                   3722: 
                   3723:        beg_opcode(16,s(op,0x2a),"LD   %s,(imm16)",hl);
                   3724:        ARG16( EBP );
                   3725:        RWORD( (op_base)?4:3, zhl32, EBP );
                   3726:        end_opcode("z_op");
                   3727: 
                   3728:        beg_opcode(13,s(op,0x32),"LD   (imm16),A");
                   3729:        ARG16( EBP );
                   3730:        I(0,movzbl, EDX,        A,              0);
                   3731:        WBYTE( 3, EBP, EDX );
                   3732:        end_opcode("z_op");
                   3733: 
                   3734:     beg_opcode(13,s(op,0x3a),"LD   A,(imm16)");
                   3735:        ARG16( EBP );
                   3736:        RBYTE( 3, EDX, EBP );
                   3737:        I(0,movb,       A,              DL,     0);
                   3738:        end_opcode("z_op");
                   3739: 
                   3740: /*********/
                   3741: 
                   3742:     beg_opcode( 6,s(op,0x03),"INC  BC");
                   3743:        I(0,incw,       zBC,    0,              0);
                   3744:        end_opcode("z_op");
                   3745: 
                   3746:     beg_opcode( 6,s(op,0x0b),"DEC  BC");
                   3747:     I(0,decw,   zBC,    0,      0);
                   3748:        end_opcode("z_op");
                   3749: 
                   3750:        beg_opcode( 6,s(op,0x13),"INC  DE");
                   3751:     I(0,incw,   zDE,    0,      0);
                   3752:        end_opcode("z_op");
                   3753: 
                   3754:     beg_opcode( 6,s(op,0x1b),"DEC  DE");
                   3755:     I(0,decw,   zDE,    0,      0);
                   3756:        end_opcode("z_op");
                   3757: 
                   3758:        beg_opcode( 6,s(op,0x23),"INC  %s",hl);
                   3759:     I(0,incw,   zhl,    0,      0);
                   3760:        end_opcode("z_op");
                   3761: 
                   3762:     beg_opcode( 6,s(op,0x2b),"DEC  %s",hl);
                   3763:     I(0,decw,   zhl,    0,      0);
                   3764:        end_opcode("z_op");
                   3765: 
                   3766:        beg_opcode( 6,s(op,0x33),"INC  SP");
                   3767:        I(0,incw,       zSP,    0,              0);
                   3768:        end_opcode("z_op");
                   3769: 
                   3770:        beg_opcode( 6, s(op,0x3b),"DEC  SP");
                   3771:        I(0,decw,       zSP,    0,              0);
                   3772:        end_opcode("z_op");
                   3773: 
                   3774: /*********/
                   3775: 
                   3776:     beg_opcode( 4,s(op,0x04),"INC  B");
                   3777:        M_INC( zB );
                   3778:        end_opcode("z_op");
                   3779: 
                   3780:        beg_opcode( 4,s(op,0x0c),"INC  C");
                   3781:        M_INC( zC );
                   3782:        end_opcode("z_op");
                   3783: 
                   3784:        beg_opcode( 4,s(op,0x14),"INC  D");
                   3785:        M_INC( zD );
                   3786:        end_opcode("z_op");
                   3787: 
                   3788:        beg_opcode( 4,s(op,0x1c),"INC  E");
                   3789:        M_INC( zE );
                   3790:        end_opcode("z_op");
                   3791: 
                   3792:        beg_opcode( 4+mr,s(op,0x24),"INC  %s",h);
                   3793:     M_INC( zh );
                   3794:        end_opcode("z_op");
                   3795: 
                   3796:        beg_opcode( 4+mr,s(op,0x2c),"INC  %s",l);
                   3797:     M_INC( zl );
                   3798:        end_opcode("z_op");
                   3799: 
                   3800:        beg_opcode(11+mc,s(op,0x34),"INC  %s",m);
                   3801:     if (op_base) {
                   3802:                OFS( zhl32 );
                   3803:                RBYTE( 3, EDX, EBP );
                   3804:         M_INC( DL );
                   3805:                WBYTE( 3, EBP, EDX );
                   3806:     } else {
                   3807:                RBYTE( 1, EDX, HL32 );
                   3808:         M_INC( DL );
                   3809:                WBYTE( 1, HL32, EDX );
                   3810:     }
                   3811:        end_opcode("z_op");
                   3812: 
                   3813:     beg_opcode( 4,s(op,0x3c),"INC  A");
                   3814:     M_INC( A );
                   3815:        end_opcode("z_op");
                   3816: 
                   3817: /*********/
                   3818: 
                   3819:        beg_opcode( 4,s(op,0x05),"DEC  B");
                   3820:     M_DEC( zB );
                   3821:        end_opcode("z_op");
                   3822: 
                   3823:        beg_opcode( 4,s(op,0x0d),"DEC  C");
                   3824:     M_DEC( zC );
                   3825:        end_opcode("z_op");
                   3826: 
                   3827:        beg_opcode( 4,s(op,0x15),"DEC  D");
                   3828:     M_DEC( zD );
                   3829:        end_opcode("z_op");
                   3830: 
                   3831:     beg_opcode( 4,s(op,0x1d),"DEC  E");
                   3832:     M_DEC( zE );
                   3833:        end_opcode("z_op");
                   3834: 
                   3835:        beg_opcode( 4+mr,s(op,0x25),"DEC  %s",h);
                   3836:     M_DEC( zh );
                   3837:        end_opcode("z_op");
                   3838: 
                   3839:        beg_opcode( 4+mr,s(op,0x2d),"DEC  %s",l);
                   3840:     M_DEC( zl );
                   3841:        end_opcode("z_op");
                   3842: 
                   3843:     beg_opcode(11+mc,s(op,0x35),"DEC  %s",m);
                   3844:     if (op_base) {
                   3845:                OFS( zhl32 );
                   3846:                RBYTE( 3, EDX, EBP );
                   3847:         M_DEC( DL );
                   3848:                WBYTE( 3, EBP, EDX );
                   3849:     } else {
                   3850:                RBYTE( 1, EDX, HL32 );
                   3851:         M_DEC( DL );
                   3852:                WBYTE( 1, HL32, EDX );
                   3853:     }
                   3854:        end_opcode("z_op");
                   3855: 
                   3856:     beg_opcode( 4,s(op,0x3d),"DEC  A");
                   3857:     M_DEC( A );
                   3858:        end_opcode("z_op");
                   3859: 
                   3860: /*********/
                   3861: 
                   3862:        beg_opcode( 7,s(op,0x06),"LD   B,imm8");
                   3863:        ARG( CL );
                   3864:        I(0,movb,       zB,     CL,     0);
                   3865:        end_opcode("z_op");
                   3866: 
                   3867:        beg_opcode( 7,s(op,0x0e),"LD   C,imm8");
                   3868:        ARG( CL );
                   3869:        I(0,movb,       zC,     CL,     0);
                   3870:        end_opcode("z_op");
                   3871: 
                   3872:        beg_opcode( 7,s(op,0x16),"LD   D,imm8");
                   3873:        ARG( CL );
                   3874:        I(0,movb,       zD,     CL,     0);
                   3875:        end_opcode("z_op");
                   3876: 
                   3877:     beg_opcode( 7,s(op,0x1e),"LD   E,imm8");
                   3878:        ARG( CL );
                   3879:        I(0,movb,       zE,     CL,     0);
                   3880:        end_opcode("z_op");
                   3881: 
                   3882:        if ( op_base ) {
                   3883:                beg_opcode( 5,s(op,0x26),"LD   %s,imm8",h);
                   3884:                ARG( CL );
                   3885:                I(0,movb,       zh,     CL,     0);
                   3886:        } else {
                   3887:                beg_opcode( 7,s(op,0x26),"LD   %s,imm8",h);
                   3888:                ARG( zh );
                   3889:     }
                   3890:     end_opcode("z_op");
                   3891: 
                   3892:        if ( op_base ) {
                   3893:                beg_opcode( 5,s(op,0x2e),"LD   %s,imm8",l);
                   3894:                ARG( CL );
                   3895:                I(0,movb,       zl,     CL,     0);
                   3896:        } else {
                   3897:         beg_opcode( 7,s(op,0x2e),"LD   %s,imm8",l);
                   3898:                ARG( zl );
                   3899:        }
                   3900:        end_opcode("z_op");
                   3901: 
                   3902:     beg_opcode(10+mi,s(op,0x36),"LD   %s,imm8",m);
                   3903:     if (op_base) {
                   3904:                OFS( zhl32 );
                   3905:                ARG( EDX );
                   3906: #if WB_EA4_EDX
                   3907:                I(0,jmp,        "wb_ea4_edx",0,    0);
                   3908: #else
                   3909:                WBYTE( 4, EBP, EDX );
                   3910:                end_opcode("z_op");
                   3911: #endif
                   3912:     } else {
                   3913:                ARG( EDX );
                   3914:                WBYTE( 2, HL32, EDX );
                   3915:                end_opcode("z_op");
                   3916:     }
                   3917: 
                   3918:     beg_opcode( 7,s(op,0x3e),"LD   A,imm8");
                   3919:        ARG( CL );
                   3920:        I(0,movb,       A,              CL,     0);
                   3921:        end_opcode("z_op");
                   3922: 
                   3923: /*********/
                   3924: 
                   3925:     beg_opcode( 4,s(op,0x1f),"RRA");
                   3926:        M_RRA();
                   3927:        end_opcode("z_op");
                   3928: 
                   3929:     beg_opcode( 4,s(op,0x07),"RLCA");
                   3930:     M_RLCA();
                   3931:        end_opcode("z_op");
                   3932: 
                   3933:     beg_opcode( 4,s(op,0x0f),"RRCA");
                   3934:     M_RRCA();
                   3935:        end_opcode("z_op");
                   3936: 
                   3937:     beg_opcode( 4,s(op,0x17),"RLA");
                   3938:     M_RLA();
                   3939:        end_opcode("z_op");
                   3940: 
                   3941:        beg_opcode( 4,s(op,0x27),"DAA");
                   3942:        M_DAA( op_base|0x27 );
                   3943:        end_opcode("z_op");
                   3944: 
                   3945:        beg_opcode( 4,s(op,0x2f),"CPL");
                   3946:        M_CPL();
                   3947:        end_opcode("z_op");
                   3948: 
                   3949:        beg_opcode( 4,s(op,0x37),"SCF");
                   3950:        M_SCF();
                   3951:        end_opcode("z_op");
                   3952: 
                   3953:        beg_opcode( 4,s(op,0x3f),"CCF");
                   3954:        M_CCF();
                   3955:        end_opcode("z_op");
                   3956: 
                   3957: /*********/
                   3958: 
                   3959:     beg_opcode( 4,s(op,0x40),"LD   B,B");
                   3960:        MOVB( zB, zB, "B = B" );
                   3961:        end_opcode("z_op");
                   3962: 
                   3963:        beg_opcode( 4,s(op,0x41),"LD   B,C");
                   3964:        MOVB( zB, zC, "B = C" );
                   3965:        end_opcode("z_op");
                   3966: 
                   3967:        beg_opcode( 4,s(op,0x42),"LD   B,D");
                   3968:        MOVB( zB, zD, "B = D" );
                   3969:        end_opcode("z_op");
                   3970: 
                   3971:        beg_opcode( 4,s(op,0x43),"LD   B,E");
                   3972:        MOVB( zB, zE, "B = E" );
                   3973:        end_opcode("z_op");
                   3974: 
                   3975:        beg_opcode( 4+mr,s(op,0x44),"LD   B,%s",h);
                   3976:        MOVB( zB, zh, "B = %s", h );
                   3977:        end_opcode("z_op");
                   3978: 
                   3979:        beg_opcode( 4+mr,s(op,0x45),"LD   B,%s",l);
                   3980:        MOVB( zB, zl, "B = %s", l );
                   3981:        end_opcode("z_op");
                   3982: 
                   3983:        beg_opcode( 7+mc,s(op,0x46),"LD   B,%s",m);
                   3984:        if (op_base) {
                   3985:                OFS( zhl32 );
                   3986:                RBYTE( 3, EDX, EBP );
                   3987:     } else {
                   3988:                RBYTE( 1, EDX, HL32 );
                   3989:        }
                   3990:        MOVB( zB, DL, "B = %s", m );
                   3991:        end_opcode("z_op");
                   3992: 
                   3993:        beg_opcode( 4,s(op,0x47),"LD   B,A");
                   3994:        MOVB( zB, A, "B = A" );
                   3995:        end_opcode("z_op");
                   3996: 
                   3997: /*********/
                   3998: 
                   3999:     beg_opcode( 4,s(op,0x48),"LD   C,B");
                   4000:        MOVB( zC, zB, "C = B"  );
                   4001:        end_opcode("z_op");
                   4002: 
                   4003:        beg_opcode( 4,s(op,0x49),"LD   C,C");
                   4004:        MOVB( zC, zC, "C = C"  );
                   4005:     end_opcode("z_op");
                   4006: 
                   4007:        beg_opcode( 4,s(op,0x4a),"LD   C,D");
                   4008:        MOVB( zC, zD, "C = D"  );
                   4009:     end_opcode("z_op");
                   4010: 
                   4011:        beg_opcode( 4,s(op,0x4b),"LD   C,E");
                   4012:        MOVB( zC, zE, "C = E"  );
                   4013:     end_opcode("z_op");
                   4014: 
                   4015:        beg_opcode( 4+mr,s(op,0x4c),"LD   C,%s",h);
                   4016:        MOVB( zC, zh, "C = %s", h );
                   4017:     end_opcode("z_op");
                   4018: 
                   4019:        beg_opcode( 4+mr,s(op,0x4d),"LD   C,%s",l);
                   4020:        MOVB( zC, zl, "C = %s", l );
                   4021:     end_opcode("z_op");
                   4022: 
                   4023:        beg_opcode( 7+mc,s(op,0x4e),"LD   C,%s",m);
                   4024:        if (op_base) {
                   4025:                OFS( zhl32 );
                   4026:                RBYTE( 3, EDX, EBP );
                   4027:     } else {
                   4028:                RBYTE( 1, EDX, HL32 );
                   4029:     }
                   4030:        MOVB( zC, DL, "C = %s", m );
                   4031:        end_opcode("z_op");
                   4032: 
                   4033:        beg_opcode( 4,s(op,0x4f),"LD   C,A");
                   4034:        MOVB( zC, A, "C = A" );
                   4035:        end_opcode("z_op");
                   4036: 
                   4037: /*********/
                   4038: 
                   4039:     beg_opcode( 4,s(op,0x50),"LD   D,B");
                   4040:        MOVB( zD, zB, "D = B" );
                   4041:        end_opcode("z_op");
                   4042: 
                   4043:        beg_opcode( 4,s(op,0x51),"LD   D,C");
                   4044:        MOVB( zD, zC, "D = C" );
                   4045:     end_opcode("z_op");
                   4046: 
                   4047:        beg_opcode( 4,s(op,0x52),"LD   D,D");
                   4048:        MOVB( zD, zD, "D = D" );
                   4049:     end_opcode("z_op");
                   4050: 
                   4051:        beg_opcode( 4,s(op,0x53),"LD   D,E");
                   4052:        MOVB( zD, zE, "D = E" );
                   4053:     end_opcode("z_op");
                   4054: 
                   4055:        beg_opcode( 4+mr,s(op,0x54),"LD   D,%s",h);
                   4056:        MOVB( zD, zh, "D = %s", h );
                   4057:     end_opcode("z_op");
                   4058: 
                   4059:        beg_opcode( 4+mr,s(op,0x55),"LD   D,%s",l);
                   4060:        MOVB( zD, zl, "D = %s", l );
                   4061:     end_opcode("z_op");
                   4062: 
                   4063:        beg_opcode( 7+mc,s(op,0x56),"LD   D,%s",m);
                   4064:        if (op_base) {
                   4065:                OFS( zhl32 );
                   4066:                RBYTE( 3, EDX, EBP );
                   4067:     } else {
                   4068:                RBYTE( 1, EDX, HL32 );
                   4069:     }
                   4070:        MOVB( zD, DL, "D = %s", m );
                   4071:        end_opcode("z_op");
                   4072: 
                   4073:        beg_opcode( 4,s(op,0x57),"LD   D,A");
                   4074:        MOVB( zD, A, "D = A" );
                   4075:        end_opcode("z_op");
                   4076: 
                   4077: /*********/
                   4078: 
                   4079:     beg_opcode( 4,s(op,0x58),"LD   E,B");
                   4080:        MOVB( zE, zB, "E = B" );
                   4081:        end_opcode("z_op");
                   4082: 
                   4083:        beg_opcode( 4,s(op,0x59),"LD   E,C");
                   4084:        MOVB( zE, zC, "E = C" );
                   4085:     end_opcode("z_op");
                   4086: 
                   4087:        beg_opcode( 4,s(op,0x5a),"LD   E,D");
                   4088:        MOVB( zE, zD, "E = D" );
                   4089:     end_opcode("z_op");
                   4090: 
                   4091:        beg_opcode( 4,s(op,0x5b),"LD   E,E");
                   4092:        MOVB( zE, zE, "E = E" );
                   4093:     end_opcode("z_op");
                   4094: 
                   4095:        beg_opcode( 4+mr,s(op,0x5c),"LD   E,%s",h);
                   4096:        MOVB( zE, zh, "E = %s", h );
                   4097:     end_opcode("z_op");
                   4098: 
                   4099:        beg_opcode( 4+mr,s(op,0x5d),"LD   E,%s",l);
                   4100:        MOVB( zE, zl, "E = %s", l );
                   4101:     end_opcode("z_op");
                   4102: 
                   4103:        beg_opcode( 7+mc,s(op,0x5e),"LD   E,%s",m);
                   4104:        if (op_base) {
                   4105:                OFS( zhl32 );
                   4106:                RBYTE( 3, EDX, EBP );
                   4107:        } else {
                   4108:                RBYTE( 1, EDX, HL32 );
                   4109:     }
                   4110:        MOVB( zE, DL, "E = %s", m );
                   4111:     end_opcode("z_op");
                   4112: 
                   4113:        beg_opcode( 4,s(op,0x5f),"LD   E,A");
                   4114:        MOVB( zE, A, "E = A" );
                   4115:     end_opcode("z_op");
                   4116: 
                   4117: /*********/
                   4118: 
                   4119:        beg_opcode( 4+mr,s(op,0x60),"LD   %s,B",h);
                   4120:        MOVB( zh, zB, "%s = B", h );
                   4121:        end_opcode("z_op");
                   4122: 
                   4123:        beg_opcode( 4+mr,s(op,0x61),"LD   %s,C",h);
                   4124:        MOVB( zh, zC, "%s = C", h );
                   4125:     end_opcode("z_op");
                   4126: 
                   4127:        beg_opcode( 4+mr,s(op,0x62),"LD   %s,D",h);
                   4128:        MOVB( zh, zD, "%s = D", h );
                   4129:     end_opcode("z_op");
                   4130: 
                   4131:        beg_opcode( 4+mr,s(op,0x63),"LD   %s,E",h);
                   4132:        MOVB( zh, zE, "%s = E", h );
                   4133:     end_opcode("z_op");
                   4134: 
                   4135:        beg_opcode( 4+mr,s(op,0x64),"LD   %s,%s",h,h);
                   4136:        MOVB( zh, zh, "%s = %s", h, h );
                   4137:     end_opcode("z_op");
                   4138: 
                   4139:        beg_opcode( 4+mr,s(op,0x65),"LD   %s,%s",h,l);
                   4140:        MOVB( zh, zl, "%s = %s", h, l );
                   4141:     end_opcode("z_op");
                   4142: 
                   4143:        beg_opcode( 7+mc,s(op,0x66),"LD   H,%s",m);
                   4144:        if (op_base) {
                   4145:                OFS( zhl32 );
                   4146:                RBYTE( 3, EDX, EBP );
                   4147:     } else {
                   4148:                RBYTE( 1, EDX, HL32 );
                   4149:     }
                   4150:        MOVB( H, DL, "H = %s", m );
                   4151:        end_opcode("z_op");
                   4152: 
                   4153:        beg_opcode( 4+mr,s(op,0x67),"LD   %s,A",h);
                   4154:        MOVB( zh, A, "%s = A", h );
                   4155:     end_opcode("z_op");
                   4156: 
                   4157: /*********/
                   4158: 
                   4159:        beg_opcode( 4+mr,s(op,0x68),"LD   %s,B",l);
                   4160:        MOVB( zl, zB, "%s = B", l );
                   4161:     end_opcode("z_op");
                   4162: 
                   4163:        beg_opcode( 4+mr,s(op,0x69),"LD   %s,C",l);
                   4164:        MOVB( zl, zC, "%s = C", l );
                   4165:     end_opcode("z_op");
                   4166: 
                   4167:        beg_opcode( 4+mr,s(op,0x6a),"LD   %s,D",l);
                   4168:        MOVB( zl, zD, "%s = D", l );
                   4169:     end_opcode("z_op");
                   4170: 
                   4171:        beg_opcode( 4+mr,s(op,0x6b),"LD   %s,E",l);
                   4172:        MOVB( zl, zE, "%s = E", l );
                   4173:     end_opcode("z_op");
                   4174: 
                   4175:        beg_opcode( 4+mr,s(op,0x6c),"LD   %s,%s",l,h);
                   4176:        MOVB( zl, zh, "%s = %s", l, h );
                   4177:     end_opcode("z_op");
                   4178: 
                   4179:        beg_opcode( 4+mr,s(op,0x6d),"LD   %s,%s",l,l);
                   4180:        MOVB( zl, zl, "%s = %s", l, l );
                   4181:     end_opcode("z_op");
                   4182: 
                   4183:        beg_opcode( 7+mc,s(op,0x6e),"LD   L,%s",m);
                   4184:        if (op_base) {
                   4185:                OFS( zhl32 );
                   4186:                RBYTE( 3, EDX, EBP );
                   4187:     } else {
                   4188:                RBYTE( 1, EDX, HL32 );
                   4189:     }
                   4190:        MOVB( L, DL, "L = %s", m );
                   4191:     end_opcode("z_op");
                   4192: 
                   4193:        beg_opcode( 4+mr,s(op,0x6f),"LD   %s,A",l);
                   4194:        MOVB( zl, A, "%s = A", l );
                   4195:        end_opcode("z_op");
                   4196: 
                   4197: /*********/
                   4198: 
                   4199:     beg_opcode( 7+mc,s(op,0x70),"LD   %s,B",m);
                   4200:        MOVB( EDX, zB, "%s = B", m  );
                   4201:        if (op_base) {
                   4202:                OFS( zhl32 );
                   4203:                WBYTE( 3, EBP, EDX );
                   4204:        } else {
                   4205:                WBYTE( 1, HL32, EDX );
                   4206:        }
                   4207:        end_opcode("z_op");
                   4208: 
                   4209:        beg_opcode( 7+mc,s(op,0x71),"LD   %s,C",m);
                   4210:        MOVB( EDX, zC, "%s = C", m  );
                   4211:        if (op_base) {
                   4212:                OFS( zhl32 );
                   4213:                WBYTE( 3, EBP, EDX );
                   4214:        } else {
                   4215:                WBYTE( 1, HL32, EDX );
                   4216:     }
                   4217:        end_opcode("z_op");
                   4218: 
                   4219:        beg_opcode( 7+mc,s(op,0x72),"LD   %s,D",m);
                   4220:        MOVB( EDX, zD, "%s = D", m  );
                   4221:        if (op_base) {
                   4222:                OFS( zhl32 );
                   4223:                WBYTE( 3, EBP, EDX );
                   4224:        } else {
                   4225:                WBYTE( 1, HL32, EDX );
                   4226:        }
                   4227:        end_opcode("z_op");
                   4228: 
                   4229:        beg_opcode( 7+mc,s(op,0x73),"LD   %s,E",m);
                   4230:        MOVB( EDX, zE, "%s = E", m );
                   4231:     if (op_base) {
                   4232:                OFS( zhl32 );
                   4233:                WBYTE( 3, EBP, EDX );
                   4234:        } else {
                   4235:                WBYTE( 1, HL32, EDX );
                   4236:     }
                   4237:        end_opcode("z_op");
                   4238: 
                   4239:        beg_opcode( 7+mc,s(op,0x74),"LD   %s,H",m);
                   4240:        MOVB( EDX, H, "%s = H", m );
                   4241:        if (op_base) {
                   4242:                OFS( zhl32 );
                   4243:                WBYTE( 3, EBP, EDX );
                   4244:        } else {
                   4245:                WBYTE( 1, HL32, EDX );
                   4246:     }
                   4247:        end_opcode("z_op");
                   4248: 
                   4249:        beg_opcode( 7+mc,s(op,0x75),"LD   %s,L",m);
                   4250:        MOVB( EDX, L, "%s = L", m );
                   4251:     if (op_base) {
                   4252:                OFS( zhl32 );
                   4253:                WBYTE( 3, EBP, EDX );
                   4254:        } else {
                   4255:                WBYTE( 1, HL32, EDX );
                   4256:     }
                   4257:        end_opcode("z_op");
                   4258: 
                   4259:        beg_opcode( 4,s(op,0x76),"HALT");
                   4260:        M_HALT( op_base|0x76 );
                   4261:        end_opcode("z_op");
                   4262: 
                   4263:        beg_opcode( 7+mc,s(op,0x77),"LD   %s,A",m);
                   4264:        MOVB( EDX, A, "%s = A", m );
                   4265:        if (op_base) {
                   4266:                OFS( zhl32 );
                   4267:                WBYTE( 3, EBP, EDX );
                   4268:        } else {
                   4269:                WBYTE( 1, HL32, EDX );
                   4270:     }
                   4271:        end_opcode("z_op");
                   4272: 
                   4273: /*********/
                   4274: 
                   4275:     beg_opcode( 4,s(op,0x78),"LD   A,B");
                   4276:        MOVB( A, zB, "A = B" );
                   4277:        end_opcode("z_op");
                   4278: 
                   4279:        beg_opcode( 4,s(op,0x79),"LD   A,C");
                   4280:        MOVB( A, zC, "A = C" );
                   4281:     end_opcode("z_op");
                   4282: 
                   4283:        beg_opcode( 4,s(op,0x7a),"LD   A,D");
                   4284:        MOVB( A, zD, "A = D" );
                   4285:     end_opcode("z_op");
                   4286: 
                   4287:        beg_opcode( 4,s(op,0x7b),"LD   A,E");
                   4288:        MOVB( A, zE, "A = E" );
                   4289:     end_opcode("z_op");
                   4290: 
                   4291:        beg_opcode( 4+mr,s(op,0x7c),"LD   A,%s",h);
                   4292:        MOVB( A, zh, "A = %s", h );
                   4293:     end_opcode("z_op");
                   4294: 
                   4295:        beg_opcode( 4+mr,s(op,0x7d),"LD   A,%s",l);
                   4296:        MOVB( A, zl, "A = %s", l );
                   4297:     end_opcode("z_op");
                   4298: 
                   4299:        beg_opcode( 7+mc,s(op,0x7e),"LD   A,%s",m);
                   4300:        if (op_base) {
                   4301:                OFS( zhl32 );
                   4302:                RBYTE( 3, EDX, EBP );
                   4303:     } else {
                   4304:                RBYTE( 1, EDX, HL32 );
                   4305:     }
                   4306:        MOVB( A, DL, "A = %s", m );
                   4307:        end_opcode("z_op");
                   4308: 
                   4309:     beg_opcode( 4,s(op,0x7f),"LD   A,A");
                   4310:        MOVB( A, A, "A = A" );
                   4311:     end_opcode("z_op");
                   4312: 
                   4313: /*********/
                   4314: 
                   4315:     beg_opcode( 4,s(op,0x80),"ADD  A,B");
                   4316:        M_ADD( zB );
                   4317:        end_opcode("z_op");
                   4318: 
                   4319:        beg_opcode( 4,s(op,0x81),"ADD  A,C");
                   4320:        M_ADD( zC );
                   4321:        end_opcode("z_op");
                   4322: 
                   4323:        beg_opcode( 4,s(op,0x82),"ADD  A,D");
                   4324:        M_ADD( zD );
                   4325:        end_opcode("z_op");
                   4326: 
                   4327:        beg_opcode( 4,s(op,0x83),"ADD  A,E");
                   4328:        M_ADD( zE );
                   4329:        end_opcode("z_op");
                   4330: 
                   4331:        beg_opcode( 4+mr,s(op,0x84),"ADD  A,%s",h);
                   4332:        M_ADD( zh );
                   4333:        end_opcode("z_op");
                   4334: 
                   4335:        beg_opcode( 4+mr,s(op,0x85),"ADD  A,%s",l);
                   4336:        M_ADD( zl );
                   4337:        end_opcode("z_op");
                   4338: 
                   4339:        beg_opcode( 7+mc,s(op,0x86),"ADD  A,%s",m);
                   4340:        if (op_base) {
                   4341:                OFS( zhl32 );
                   4342:                RBYTE( 3, EDX, EBP );
                   4343:     } else {
                   4344:                RBYTE( 1, EDX, HL32 );
                   4345:     }
                   4346:        M_ADD( DL );
                   4347:        end_opcode("z_op");
                   4348: 
                   4349:        beg_opcode( 4,s(op,0x87),"ADD  A,A");
                   4350:        M_ADD( A );
                   4351:        end_opcode("z_op");
                   4352: 
                   4353: /*********/
                   4354: 
                   4355:     beg_opcode( 4,s(op,0x88),"ADC  A,B");
                   4356:        M_ADC( zB );
                   4357:        end_opcode("z_op");
                   4358: 
                   4359:        beg_opcode( 4,s(op,0x89),"ADC  A,C");
                   4360:        M_ADC( zC );
                   4361:        end_opcode("z_op");
                   4362: 
                   4363:        beg_opcode( 4,s(op,0x8a),"ADC  A,D");
                   4364:        M_ADC( zD );
                   4365:        end_opcode("z_op");
                   4366: 
                   4367:        beg_opcode( 4,s(op,0x8b),"ADC  A,E");
                   4368:        M_ADC( zE );
                   4369:        end_opcode("z_op");
                   4370: 
                   4371:        beg_opcode( 4+mr,s(op,0x8c),"ADC  A,%s",h);
                   4372:        M_ADC( zh );
                   4373:        end_opcode("z_op");
                   4374: 
                   4375:        beg_opcode( 4+mr,s(op,0x8d),"ADC  A,%s",l);
                   4376:        M_ADC( zl );
                   4377:        end_opcode("z_op");
                   4378: 
                   4379:        beg_opcode( 7+mc,s(op,0x8e),"ADC  A,%s",m);
                   4380:        if (op_base) {
                   4381:                OFS( zhl32 );
                   4382:                RBYTE( 3, EDX, EBP );
                   4383:     } else {
                   4384:                RBYTE( 1, EDX, HL32 );
                   4385:     }
                   4386:        M_ADC( DL );
                   4387:        end_opcode("z_op");
                   4388: 
                   4389:        beg_opcode( 4,s(op,0x8f),"ADC  A,A");
                   4390:        M_ADC( A );
                   4391:        end_opcode("z_op");
                   4392: 
                   4393: /*********/
                   4394: 
                   4395:     beg_opcode( 4,s(op,0x90),"SUB  B");
                   4396:        M_SUB( zB );
                   4397:        end_opcode("z_op");
                   4398: 
                   4399:        beg_opcode( 4,s(op,0x91),"SUB  C");
                   4400:        M_SUB( zC );
                   4401:        end_opcode("z_op");
                   4402: 
                   4403:        beg_opcode( 4,s(op,0x92),"SUB  D");
                   4404:        M_SUB( zD );
                   4405:        end_opcode("z_op");
                   4406: 
                   4407:        beg_opcode( 4,s(op,0x93),"SUB  E");
                   4408:        M_SUB( zE );
                   4409:        end_opcode("z_op");
                   4410: 
                   4411:        beg_opcode( 4+mr,s(op,0x94),"SUB  %s",h);
                   4412:        M_SUB( zh );
                   4413:        end_opcode("z_op");
                   4414: 
                   4415:        beg_opcode( 4+mr,s(op,0x95),"SUB  %s",l);
                   4416:        M_SUB( zl );
                   4417:        end_opcode("z_op");
                   4418: 
                   4419:        beg_opcode( 7+mc,s(op,0x96),"SUB  %s",m);
                   4420:        if (op_base) {
                   4421:                OFS( zhl32 );
                   4422:                RBYTE( 3, EDX, EBP );
                   4423:     } else {
                   4424:                RBYTE( 1, EDX, HL32 );
                   4425:     }
                   4426:        M_SUB( DL );
                   4427:        end_opcode("z_op");
                   4428: 
                   4429:        beg_opcode( 4,s(op,0x97),"SUB  A");
                   4430:        M_SUB( A );
                   4431:        end_opcode("z_op");
                   4432: 
                   4433: /*********/
                   4434: 
                   4435:     beg_opcode( 4,s(op,0x98),"SBC  A,B");
                   4436:        M_SBC( zB );
                   4437:        end_opcode("z_op");
                   4438: 
                   4439:        beg_opcode( 4,s(op,0x99),"SBC  A,C");
                   4440:        M_SBC( zC );
                   4441:        end_opcode("z_op");
                   4442: 
                   4443:        beg_opcode( 4,s(op,0x9a),"SBC  A,D");
                   4444:        M_SBC( zD );
                   4445:        end_opcode("z_op");
                   4446: 
                   4447:        beg_opcode( 4,s(op,0x9b),"SBC  A,E");
                   4448:        M_SBC( zE );
                   4449:        end_opcode("z_op");
                   4450: 
                   4451:        beg_opcode( 4+mr,s(op,0x9c),"SBC  A,%s",h);
                   4452:        M_SBC( zh );
                   4453:        end_opcode("z_op");
                   4454: 
                   4455:        beg_opcode( 4+mr,s(op,0x9d),"SBC  A,%s",l);
                   4456:        M_SBC( zl );
                   4457:        end_opcode("z_op");
                   4458: 
                   4459:        beg_opcode( 7+mc,s(op,0x9e),"SBC  A,%s",m);
                   4460:        if (op_base) {
                   4461:                OFS( zhl32 );
                   4462:                RBYTE( 3, EDX, EBP );
                   4463:     } else {
                   4464:                RBYTE( 1, EDX, HL32 );
                   4465:     }
                   4466:        M_SBC( DL );
                   4467:        end_opcode("z_op");
                   4468: 
                   4469:        beg_opcode( 4,s(op,0x9f),"SBC  A,A");
                   4470:        M_SBC( A );
                   4471:        end_opcode("z_op");
                   4472: 
                   4473: /*********/
                   4474: 
                   4475:     beg_opcode( 4,s(op,0xa0),"AND  B");
                   4476:        M_AND( zB );
                   4477:        end_opcode("z_op");
                   4478: 
                   4479:        beg_opcode( 4,s(op,0xa1),"AND  C");
                   4480:        M_AND( zC );
                   4481:        end_opcode("z_op");
                   4482: 
                   4483:        beg_opcode( 4,s(op,0xa2),"AND  D");
                   4484:        M_AND( zD );
                   4485:        end_opcode("z_op");
                   4486: 
                   4487:        beg_opcode( 4,s(op,0xa3),"AND  E");
                   4488:        M_AND( zE );
                   4489:        end_opcode("z_op");
                   4490: 
                   4491:        beg_opcode( 4+mr,s(op,0xa4),"AND  %s",h);
                   4492:        M_AND( zh );
                   4493:        end_opcode("z_op");
                   4494: 
                   4495:        beg_opcode( 4+mr,s(op,0xa5),"AND  %s",l);
                   4496:        M_AND( zl );
                   4497:        end_opcode("z_op");
                   4498: 
                   4499:        beg_opcode( 7+mc,s(op,0xa6),"AND  %s",m);
                   4500:        if (op_base) {
                   4501:                OFS( zhl32 );
                   4502:                RBYTE( 3, EDX, EBP );
                   4503:     } else {
                   4504:                RBYTE( 1, EDX, HL32 );
                   4505:     }
                   4506:        M_AND( DL );
                   4507:        end_opcode("z_op");
                   4508: 
                   4509:        beg_opcode( 4,s(op,0xa7),"AND  A");
                   4510:        M_AND( A );
                   4511:        end_opcode("z_op");
                   4512: 
                   4513: /*********/
                   4514: 
                   4515:     beg_opcode( 4,s(op,0xa8),"XOR  B");
                   4516:        M_XOR( zB );
                   4517:        end_opcode("z_op");
                   4518: 
                   4519:        beg_opcode( 4,s(op,0xa9),"XOR  C");
                   4520:        M_XOR( zC );
                   4521:        end_opcode("z_op");
                   4522: 
                   4523:        beg_opcode( 4,s(op,0xaa),"XOR  D");
                   4524:        M_XOR( zD );
                   4525:        end_opcode("z_op");
                   4526: 
                   4527:        beg_opcode( 4,s(op,0xab),"XOR  E");
                   4528:        M_XOR( zE );
                   4529:        end_opcode("z_op");
                   4530: 
                   4531:        beg_opcode( 4+mr,s(op,0xac),"XOR  %s",h);
                   4532:        M_XOR( zh );
                   4533:        end_opcode("z_op");
                   4534: 
                   4535:        beg_opcode( 4+mr,s(op,0xad),"XOR  %s",l);
                   4536:        M_XOR( zl );
                   4537:        end_opcode("z_op");
                   4538: 
                   4539:        beg_opcode( 7+mc,s(op,0xae),"XOR  %s",m);
                   4540:        if (op_base) {
                   4541:                OFS( zhl32 );
                   4542:                RBYTE( 3, EDX, EBP );
                   4543:     } else {
                   4544:                RBYTE( 1, EDX, HL32 );
                   4545:     }
                   4546:        M_XOR( DL );
                   4547:        end_opcode("z_op");
                   4548: 
                   4549:        beg_opcode( 4,s(op,0xaf),"XOR  A");
                   4550:        M_XOR( A );
                   4551:        end_opcode("z_op");
                   4552: 
                   4553: /*********/
                   4554: 
                   4555:     beg_opcode( 4,s(op,0xb0),"OR   B");
                   4556:        M_OR( zB );
                   4557:        end_opcode("z_op");
                   4558: 
                   4559:        beg_opcode( 4,s(op,0xb1),"OR   C");
                   4560:        M_OR( zC );
                   4561:        end_opcode("z_op");
                   4562: 
                   4563:        beg_opcode( 4,s(op,0xb2),"OR   D");
                   4564:        M_OR( zD );
                   4565:        end_opcode("z_op");
                   4566: 
                   4567:        beg_opcode( 4,s(op,0xb3),"OR   E");
                   4568:        M_OR( zE );
                   4569:        end_opcode("z_op");
                   4570: 
                   4571:        beg_opcode( 4+mr,s(op,0xb4),"OR   %s",h);
                   4572:        M_OR( zh );
                   4573:        end_opcode("z_op");
                   4574: 
                   4575:        beg_opcode( 4+mr,s(op,0xb5),"OR   %s",l);
                   4576:        M_OR( zl );
                   4577:        end_opcode("z_op");
                   4578: 
                   4579:        beg_opcode( 7+mc,s(op,0xb6),"OR   %s",m);
                   4580:        if (op_base) {
                   4581:                OFS( zhl32 );
                   4582:                RBYTE( 3, EDX, EBP );
                   4583:     } else {
                   4584:                RBYTE( 1, EDX, HL32 );
                   4585:     }
                   4586:        M_OR( DL );
                   4587:        end_opcode("z_op");
                   4588: 
                   4589:        beg_opcode( 4,s(op,0xb7),"OR   A");
                   4590:        M_OR( A );
                   4591:        end_opcode("z_op");
                   4592: 
                   4593: /*********/
                   4594: 
                   4595:     beg_opcode( 4,s(op,0xb8),"CP   B");
                   4596:        M_CP( zB );
                   4597:        end_opcode("z_op");
                   4598: 
                   4599:        beg_opcode( 4,s(op,0xb9),"CP   C");
                   4600:        M_CP( zC );
                   4601:        end_opcode("z_op");
                   4602: 
                   4603:        beg_opcode( 4,s(op,0xba),"CP   D");
                   4604:        M_CP( zD );
                   4605:        end_opcode("z_op");
                   4606: 
                   4607:        beg_opcode( 4,s(op,0xbb),"CP   E");
                   4608:        M_CP( zE );
                   4609:        end_opcode("z_op");
                   4610: 
                   4611:        beg_opcode( 4+mr,s(op,0xbc),"CP   %s",h);
                   4612:        M_CP( zh );
                   4613:        end_opcode("z_op");
                   4614: 
                   4615:        beg_opcode( 4+mr,s(op,0xbd),"CP   %s",l);
                   4616:        M_CP( zl );
                   4617:        end_opcode("z_op");
                   4618: 
                   4619:        beg_opcode( 7+mc,s(op,0xbe),"CP   %s",m);
                   4620:        if (op_base) {
                   4621:                OFS( zhl32 );
                   4622:                RBYTE( 3, EDX, EBP );
                   4623:     } else {
                   4624:                RBYTE( 1, EDX, HL32 );
                   4625:     }
                   4626:        M_CP( DL );
                   4627:        end_opcode("z_op");
                   4628: 
                   4629:        beg_opcode( 4,s(op,0xbf),"CP   A");
                   4630:        M_CP( A );
                   4631:        end_opcode("z_op");
                   4632: 
                   4633: /*********/
                   4634: 
                   4635:     beg_opcode( 5,s(op,0xc0),"RET  NZ");
                   4636:        M_RET_CC( op_base|0xc0 );
                   4637:        end_opcode("z_op");
                   4638: 
                   4639:        beg_opcode( 5,s(op,0xc8),"RET  Z");
                   4640:        M_RET_CC( op_base|0xc8 );
                   4641:        end_opcode("z_op");
                   4642: 
                   4643:        beg_opcode( 5,s(op,0xd0),"RET  NC");
                   4644:        M_RET_CC( op_base|0xd0 );
                   4645:        end_opcode("z_op");
                   4646: 
                   4647:     beg_opcode( 5,s(op,0xd8),"RET  C");
                   4648:        M_RET_CC( op_base|0xd8 );
                   4649:        end_opcode("z_op");
                   4650: 
                   4651:     beg_opcode( 5,s(op,0xe0),"RET  PE");
                   4652:        M_RET_CC( op_base|0xe0 );
                   4653:        end_opcode("z_op");
                   4654: 
                   4655:     beg_opcode( 5,s(op,0xe8),"RET  PO");
                   4656:        M_RET_CC( op_base|0xe8 );
                   4657:        end_opcode("z_op");
                   4658: 
                   4659:     beg_opcode( 5,s(op,0xf0),"RET  P");
                   4660:        M_RET_CC( op_base|0xf0 );
                   4661:        end_opcode("z_op");
                   4662: 
                   4663:     beg_opcode( 5,s(op,0xf8),"RET  M");
                   4664:        M_RET_CC( op_base|0xf8 );
                   4665:        end_opcode("z_op");
                   4666: 
                   4667: /*********/
                   4668: 
                   4669:     beg_opcode(10,s(op,0xc1),"POP  BC");
                   4670:        POP( 1, zBC32 );
                   4671:        end_opcode("z_op");
                   4672: 
                   4673:     beg_opcode(10,s(op,0xd1),"POP  DE");
                   4674:        POP( 1, zDE32 );
                   4675:        end_opcode("z_op");
                   4676: 
                   4677:     beg_opcode(10,s(op,0xe1),"POP  %s",hl);
                   4678:        POP( (op_base)?2:1, zhl32 );
                   4679:        end_opcode("z_op");
                   4680: 
                   4681:     beg_opcode(10,s(op,0xf1),"POP  AF");
                   4682:        POP( 1, zAF32 );
                   4683:        restore_af();
                   4684:        end_opcode("z_op");
                   4685: 
                   4686:        beg_opcode(11,s(op,0xc5),"PUSH BC");
                   4687:        PUSH( 1, zBC32 );
                   4688:        end_opcode("z_op");
                   4689: 
                   4690:     beg_opcode(11,s(op,0xd5),"PUSH DE");
                   4691:        PUSH( 1, zDE32 );
                   4692:        end_opcode("z_op");
                   4693: 
                   4694:     beg_opcode(11,s(op,0xe5),"PUSH %s",hl);
                   4695:        PUSH( (op_base)?2:1, zhl32 );
                   4696:        end_opcode("z_op");
                   4697: 
                   4698:     beg_opcode(11,s(op,0xf5),"PUSH AF");
                   4699:        save_af();
                   4700:        PUSH( 1, zAF32 );
                   4701:        end_opcode("z_op");
                   4702: 
                   4703: /*********/
                   4704: 
                   4705:        beg_opcode(10,s(op,0xc2),"JP   NZ,imm16");
                   4706:        M_JP_CC( op_base|0xc2 );
                   4707:        end_opcode("z_op");
                   4708: 
                   4709:     beg_opcode(10,s(op,0xca),"JP   Z,imm16");
                   4710:        M_JP_CC( op_base|0xca );
                   4711:        end_opcode("z_op");
                   4712: 
                   4713:     beg_opcode(10,s(op,0xd2),"JP   NC,imm16");
                   4714:        M_JP_CC( op_base|0xd2 );
                   4715:        end_opcode("z_op");
                   4716: 
                   4717:     beg_opcode(10,s(op,0xda),"JP   C,imm16");
                   4718:        M_JP_CC( op_base|0xda );
                   4719:        end_opcode("z_op");
                   4720: 
                   4721:     beg_opcode(10,s(op,0xe2),"JP   PE,imm16");
                   4722:        M_JP_CC( op_base|0xe2 );
                   4723:        end_opcode("z_op");
                   4724: 
                   4725:     beg_opcode(10,s(op,0xea),"JP   PO,imm16");
                   4726:        M_JP_CC( op_base|0xea );
                   4727:        end_opcode("z_op");
                   4728: 
                   4729:     beg_opcode(10,s(op,0xf2),"JP   P,imm16");
                   4730:        M_JP_CC( op_base|0xf2 );
                   4731:        end_opcode("z_op");
                   4732: 
                   4733:     beg_opcode(10,s(op,0xfa),"JP   M,imm16");
                   4734:        M_JP_CC( op_base|0xfa );
                   4735:        end_opcode("z_op");
                   4736: 
                   4737: /*********/
                   4738: 
                   4739:     beg_opcode(10,s(op,0xc3),"JP   imm16");
                   4740:        M_JP( op_base|0xc3 );
                   4741:        end_opcode("z_op");
                   4742: 
                   4743:        if (op_base) {
                   4744:         beg_opcode( 0,s(op,0xcb),"%02x CB <ofs8> xx", op_base >> 8);
                   4745:                OFS( zhl32 );
                   4746:                RBYTE( 3, EDX, EBP );
                   4747:                end_opcode("z_xx");
                   4748:     } else {
                   4749:         beg_opcode( 0,s(op,0xcb),"CB xx");
                   4750:                end_opcode("z_cb");
                   4751:     }
                   4752: 
                   4753:        beg_opcode(11,s(op,0xd3),"OUT  (imm8),A");
                   4754:     ARG( ECX );
                   4755:        I(0,movzbl, EDX,        A,              "value");
                   4756:     I(0,movb,   CH,     A,      "16 bit port A on upper 8 address lines");
                   4757:        M_OUT( 2, ECX, EDX );
                   4758:        end_opcode("z_op");
                   4759: 
                   4760:     beg_opcode(11,s(op,0xdb),"IN   A,(imm8)");
                   4761:     ARG( ECX );
                   4762:     I(0,movb,   CH,     A,      "16 bit port A on upper 8 address lines");
                   4763:        M_IN( 2, EDX, ECX );
                   4764:        I(0,movb,       A,              DL,     "get result");
                   4765:     end_opcode("z_op");
                   4766: 
                   4767:     beg_opcode(19,s(op,0xe3),"EX   (SP),%s",hl);
                   4768:        RWORD( (op_base)?2:1, EDX, zSP32 );
                   4769:        I(0,xchgw,      DX,    zhl,     0);
                   4770:        WWORD( (op_base)?2:1, zSP32, EDX );
                   4771:        end_opcode("z_op");
                   4772: 
                   4773:     beg_opcode( 4,s(op,0xeb),"EX   DE,HL");
                   4774:        M_EX_DE_HL();
                   4775:        end_opcode("z_op");
                   4776: 
                   4777:     beg_opcode( 4,s(op,0xf3),"DI");
                   4778:     M_DI();
                   4779:        end_opcode("z_op");
                   4780: 
                   4781:     beg_opcode( 4,s(op,0xfb),"EI");
                   4782:     M_EI( op_base|0xfb );
                   4783:        end_opcode("z_op");
                   4784: 
                   4785: /*********/
                   4786: 
                   4787:     beg_opcode(10,s(op,0xc4),"CALL NZ,imm16");
                   4788:        M_CALL_CC( op_base|0xc4 );
                   4789:        end_opcode("z_op");
                   4790: 
                   4791:        beg_opcode(10,s(op,0xcc),"CALL Z,imm16");
                   4792:        M_CALL_CC( op_base|0xcc );
                   4793:        end_opcode("z_op");
                   4794: 
                   4795:        beg_opcode(10,s(op,0xd4),"CALL NC,imm16");
                   4796:        M_CALL_CC( op_base|0xd4 );
                   4797:        end_opcode("z_op");
                   4798: 
                   4799:        beg_opcode(10,s(op,0xdc),"CALL C,imm16");
                   4800:        M_CALL_CC( op_base|0xdc );
                   4801:        end_opcode("z_op");
                   4802: 
                   4803:        beg_opcode(10,s(op,0xe4),"CALL PE,imm16");
                   4804:        M_CALL_CC( op_base|0xe4 );
                   4805:        end_opcode("z_op");
                   4806: 
                   4807:     beg_opcode(10,s(op,0xec),"CALL PO,imm16");
                   4808:        M_CALL_CC( op_base|0xec );
                   4809:        end_opcode("z_op");
                   4810: 
                   4811:     beg_opcode(10,s(op,0xf4),"CALL P,imm16");
                   4812:        M_CALL_CC( op_base|0xf4 );
                   4813:        end_opcode("z_op");
                   4814: 
                   4815:     beg_opcode(10,s(op,0xfc),"CALL M,imm16");
                   4816:        M_CALL_CC( op_base|0xfc );
                   4817:        end_opcode("z_op");
                   4818: 
                   4819: /*********/
                   4820: 
                   4821:        beg_opcode(10,s(op,0xc9),"RET");
                   4822:        M_RET( op_base|0xc9 );
                   4823:        end_opcode("z_op");
                   4824: 
                   4825:     beg_opcode( 4,s(op,0xd9),"EXX");
                   4826:     M_EXX();
                   4827:        end_opcode("z_op");
                   4828: 
                   4829:     beg_opcode( 4,s(op,0xe9),"JP   (%s)",hl);
                   4830:     M_JP_REG( op_base|0xe9, zhl32 );
                   4831:        end_opcode("z_op");
                   4832: 
                   4833:     beg_opcode( 6,s(op,0xf9),"LD   SP,%s",hl);
                   4834:        I(0,movl,       ECX,    zhl32,          0);
                   4835:        I(0,movl,       zSP32,  ECX,            0);
                   4836:        end_opcode("z_op");
                   4837: 
                   4838:        beg_opcode(17,s(op,0xcd),"CALL imm16");
                   4839:     M_CALL( op_base|0xcd );
                   4840:        end_opcode("z_op");
                   4841: 
                   4842:     beg_opcode( 4,s(op,0xdd),"DD xx");
                   4843:        end_opcode("z_dd");
                   4844: 
                   4845:     beg_opcode( 0,s(op,0xed),"ED xx");
                   4846:        end_opcode("z_ed");
                   4847: 
                   4848:     beg_opcode( 4,s(op,0xfd),"FD xx");
                   4849:     end_opcode("z_fd");
                   4850: 
                   4851: /*********/
                   4852: 
                   4853:     beg_opcode( 7,s(op,0xc6),"ADD  A,imm8");
                   4854:        ARG( DL );
                   4855:        M_ADD( DL );
                   4856:        end_opcode("z_op");
                   4857: 
                   4858:        beg_opcode( 7,s(op,0xce),"ADC  A,imm8");
                   4859:        ARG( DL );
                   4860:        M_ADC( DL );
                   4861:        end_opcode("z_op");
                   4862: 
                   4863:        beg_opcode( 7,s(op,0xd6),"SUB  imm8");
                   4864:        ARG( DL );
                   4865:        M_SUB( DL );
                   4866:        end_opcode("z_op");
                   4867: 
                   4868:        beg_opcode( 7,s(op,0xde),"SBC  A,imm8");
                   4869:        ARG( DL );
                   4870:        M_SBC( DL );
                   4871:        end_opcode("z_op");
                   4872: 
                   4873:        beg_opcode( 7,s(op,0xe6),"AND  imm8");
                   4874:        ARG( DL );
                   4875:        M_AND( DL );
                   4876:        end_opcode("z_op");
                   4877: 
                   4878:        beg_opcode( 7,s(op,0xee),"XOR  imm8");
                   4879:        ARG( DL );
                   4880:        M_XOR( DL );
                   4881:        end_opcode("z_op");
                   4882: 
                   4883:        beg_opcode( 7,s(op,0xf6),"OR   imm8");
                   4884:        ARG( DL );
                   4885:        M_OR( DL );
                   4886:        end_opcode("z_op");
                   4887: 
                   4888:        beg_opcode( 7,s(op,0xfe),"CP   imm8");
                   4889:        ARG( DL );
                   4890:        M_CP( DL );
                   4891:        end_opcode("z_op");
                   4892: 
                   4893: /*********/
                   4894: 
                   4895:     beg_opcode(11,s(op,0xc7),"RST  $00");
                   4896:     M_RST( op_base|0xc7 );
                   4897:        end_opcode("z_op");
                   4898: 
                   4899:     beg_opcode(11,s(op,0xcf),"RST  $08");
                   4900:     M_RST( op_base|0xcf );
                   4901:        end_opcode("z_op");
                   4902: 
                   4903:     beg_opcode(11,s(op,0xd7),"RST  $10");
                   4904:     M_RST( op_base|0xd7 );
                   4905:        end_opcode("z_op");
                   4906: 
                   4907:     beg_opcode(11,s(op,0xdf),"RST  $18");
                   4908:     M_RST( op_base|0xdf );
                   4909:        end_opcode("z_op");
                   4910: 
                   4911:     beg_opcode(11,s(op,0xe7),"RST  $20");
                   4912:     M_RST( op_base|0xe7 );
                   4913:        end_opcode("z_op");
                   4914: 
                   4915:     beg_opcode(11,s(op,0xef),"RST  $28");
                   4916:     M_RST( op_base|0xef );
                   4917:        end_opcode("z_op");
                   4918: 
                   4919:     beg_opcode(11,s(op,0xf7),"RST  $30");
                   4920:     M_RST( op_base|0xf7 );
                   4921:        end_opcode("z_op");
                   4922: 
                   4923:     beg_opcode(11,s(op,0xff),"RST  $38");
                   4924:        M_RST( op_base|0xff );
                   4925:        end_opcode("z_op");
                   4926: }
                   4927: 
                   4928: void mk_opcodes_cb(void)
                   4929: {
                   4930:        int i, j, b;
                   4931:     char r[4+1], zr[32+1];
                   4932:     for (i = 0; i < 0x100; i += 0x08) {
                   4933:                for (j = 0; j < 8; j++) {
                   4934:                        switch (j) {
                   4935:                                case 0: strcpy(r,"B");    strcpy(zr,zB); break;
                   4936:                                case 1: strcpy(r,"C");    strcpy(zr,zC); break;
                   4937:                                case 2: strcpy(r,"D");    strcpy(zr,zD); break;
                   4938:                                case 3: strcpy(r,"E");    strcpy(zr,zE); break;
                   4939:                                case 4: strcpy(r,"H");    strcpy(zr,H);  break;
                   4940:                                case 5: strcpy(r,"L");    strcpy(zr,L);  break;
                   4941:                                case 6: strcpy(r,"(HL)"); strcpy(zr,DL); break;
                   4942:                                case 7: strcpy(r,"A");    strcpy(zr,A);  break;
                   4943:                        }
                   4944:                        switch (i) {
                   4945:                                case 0x00:
                   4946:                                        if (j == 6) {
                   4947:                                                beg_opcode(15,s("cb_%02x",i+j),"RLC  %s",r);
                   4948:                                                RBYTE( 2, EDX, HL32 );
                   4949:                     } else {
                   4950:                                                beg_opcode( 8,s("cb_%02x",i+j),"RLC  %s",r);
                   4951:                                        }
                   4952:                                        M_RLC( zr );
                   4953:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   4954:                                        end_opcode("z_op");
                   4955:                     break;
                   4956:                                case 0x08:
                   4957:                                        if (j == 6) {
                   4958:                                                beg_opcode(15,s("cb_%02x",i+j),"RRC  %s",r);
                   4959:                                                RBYTE( 2, EDX, HL32 );
                   4960:                     } else {
                   4961:                                                beg_opcode( 8,s("cb_%02x",i+j),"RRC  %s",r);
                   4962:                                        }
                   4963:                                        M_RRC( zr );
                   4964:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   4965:                                        end_opcode("z_op");
                   4966:                     break;
                   4967:                 case 0x10:
                   4968:                                        if (j == 6) {
                   4969:                                                beg_opcode(15,s("cb_%02x",i+j),"RL   %s",r);
                   4970:                                                RBYTE( 2, EDX, HL32 );
                   4971:                     } else {
                   4972:                                                beg_opcode( 8,s("cb_%02x",i+j),"RL   %s",r);
                   4973:                                        }
                   4974:                                        M_RL ( zr );
                   4975:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   4976:                                        end_opcode("z_op");
                   4977:                     break;
                   4978:                 case 0x18:
                   4979:                                        if (j == 6) {
                   4980:                                                beg_opcode(15,s("cb_%02x",i+j),"RR   %s",r);
                   4981:                                                RBYTE( 2, EDX, HL32 );
                   4982:                     } else {
                   4983:                                                beg_opcode( 8,s("cb_%02x",i+j),"RR   %s",r);
                   4984:                                        }
                   4985:                                        M_RR ( zr );
                   4986:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   4987:                                        end_opcode("z_op");
                   4988:                     break;
                   4989:                 case 0x20:
                   4990:                                        if (j == 6) {
                   4991:                                                beg_opcode(15,s("cb_%02x",i+j),"SLA  %s",r);
                   4992:                                                RBYTE( 2, EDX, HL32 );
                   4993:                     } else {
                   4994:                                                beg_opcode( 8,s("cb_%02x",i+j),"SLA  %s",r);
                   4995:                                        }
                   4996:                                        M_SLA( zr );
                   4997:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   4998:                                        end_opcode("z_op");
                   4999:                     break;
                   5000:                 case 0x28:
                   5001:                                        if (j == 6) {
                   5002:                                                beg_opcode(15,s("cb_%02x",i+j),"SRA  %s",r);
                   5003:                                                RBYTE( 2, EDX, HL32 );
                   5004:                     } else {
                   5005:                                                beg_opcode( 8,s("cb_%02x",i+j),"SRA  %s",r);
                   5006:                                        }
                   5007:                                        M_SRA( zr );
                   5008:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   5009:                                        end_opcode("z_op");
                   5010:                     break;
                   5011:                 case 0x30:
                   5012:                                        if (j == 6) {
                   5013:                                                beg_opcode(15,s("cb_%02x",i+j),"SLL  %s",r);
                   5014:                                                RBYTE( 2, EDX, HL32 );
                   5015:                     } else {
                   5016:                                                beg_opcode( 8,s("cb_%02x",i+j),"SLL  %s",r);
                   5017:                                        }
                   5018:                                        M_SLL( zr );
                   5019:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   5020:                                        end_opcode("z_op");
                   5021:                     break;
                   5022:                 case 0x38:
                   5023:                                        if (j == 6) {
                   5024:                                                beg_opcode(15,s("cb_%02x",i+j),"SRL  %s",r);
                   5025:                                                RBYTE( 2, EDX, HL32 );
                   5026:                     } else {
                   5027:                                                beg_opcode( 8,s("cb_%02x",i+j),"SRL  %s",r);
                   5028:                                        }
                   5029:                                        M_SRL( zr );
                   5030:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   5031:                                        end_opcode("z_op");
                   5032:                     break;
                   5033:                 case 0x40: case 0x48: case 0x50: case 0x58:
                   5034:                                case 0x60: case 0x68: case 0x70: case 0x78:
                   5035:                                        b = (i >> 3) & 7;
                   5036:                                        if (j == 6) {
                   5037:                         beg_opcode(12,s("cb_%02x",i+j),"BIT  %d,%s",b,r);
                   5038:                                                RBYTE( 2, EDX, HL32 );
                   5039:                                        } else {
                   5040:                                                beg_opcode( 8,s("cb_%02x",i+j),"BIT  %d,%s",b,r);
                   5041:                     }
                   5042:                                        M_BIT( b, zr );
                   5043:                                        end_opcode("z_op");
                   5044:                     break;
                   5045:                                case 0x80: case 0x88: case 0x90: case 0x98:
                   5046:                                case 0xa0: case 0xa8: case 0xb0: case 0xb8:
                   5047:                                        b = (i >> 3) & 7;
                   5048:                                        if (j == 6) {
                   5049:                         beg_opcode(15,s("cb_%02x",i+j),"RES  %d,%s",b,r);
                   5050:                                                RBYTE( 2, EDX, HL32 );
                   5051:                                        } else {
                   5052:                         beg_opcode( 8,s("cb_%02x",i+j),"RES  %d,%s",b,r);
                   5053:                                        }
                   5054:                                        M_RES( b, zr );
                   5055:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   5056:                                        end_opcode("z_op");
                   5057:                     break;
                   5058:                                case 0xc0: case 0xc8: case 0xd0: case 0xd8:
                   5059:                                case 0xe0: case 0xe8: case 0xf0: case 0xf8:
                   5060:                                        b = (i >> 3) & 7;
                   5061:                                        if (j == 6) {
                   5062:                         beg_opcode(15,s("cb_%02x",i+j),"SET  %d,%s",b,r);
                   5063:                                                RBYTE( 2, EDX, HL32 );
                   5064:                                        } else {
                   5065:                                                beg_opcode( 8,s("cb_%02x",i+j),"SET  %d,%s",b,r);
                   5066:                                        }
                   5067:                                        M_SET( b, zr );
                   5068:                                        if (j == 6) WBYTE( 2, HL32, EDX );
                   5069:                                        end_opcode("z_op");
                   5070:                     break;
                   5071:             }
                   5072:                }
                   5073:        }
                   5074: }
                   5075: 
                   5076: void mk_opcodes_xx(void)
                   5077: {
                   5078:        int i, j, b;
                   5079:        char r[32+1], zr[32+1];
                   5080:     for (i = 0; i < 0x100; i += 0x08) {
                   5081:                for (j = 0; j < 8; j++) {
                   5082:                        switch (j) {
                   5083:                                case 0: strcpy(r,"B=(IX/IY+ofs8)"); strcpy(zr,zB); break;
                   5084:                                case 1: strcpy(r,"C=(IX/IY+ofs8)"); strcpy(zr,zC); break;
                   5085:                                case 2: strcpy(r,"D=(IX/IY+ofs8)"); strcpy(zr,zD); break;
                   5086:                                case 3: strcpy(r,"E=(IX/IY+ofs8)"); strcpy(zr,zE); break;
                   5087:                                case 4: strcpy(r,"H=(IX/IY+ofs8)"); strcpy(zr,H);  break;
                   5088:                                case 5: strcpy(r,"L=(IX/IY+ofs8)"); strcpy(zr,L);  break;
                   5089:                                case 6: strcpy(r,"(IX/IY+ofs8)");   strcpy(zr,DL); break;
                   5090:                                case 7: strcpy(r,"A=(IX/IY+ofs8)"); strcpy(zr,A);  break;
                   5091:                        }
                   5092:                        switch (i) {
                   5093:                                case 0x00:
                   5094:                                        beg_opcode(19,s("xx_%02x",i+j),"RLC  %s",r);
                   5095:                                        M_RLC( DL );
                   5096:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5097: #if WB_EA4_EDX
                   5098:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5099: #else
                   5100:                                        WBYTE( 4, EBP, EDX );
                   5101:                                        end_opcode("z_op");
                   5102: #endif
                   5103:                                        break;
                   5104:                                case 0x08:
                   5105:                                        beg_opcode(19,s("xx_%02x",i+j),"RRC  %s",r);
                   5106:                                        M_RRC( DL );
                   5107:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5108: #if WB_EA4_EDX
                   5109:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5110: #else
                   5111:                                        WBYTE( 4, EBP, EDX );
                   5112:                                        end_opcode("z_op");
                   5113: #endif
                   5114:                     break;
                   5115:                                case 0x10:
                   5116:                                        beg_opcode(19,s("xx_%02x",i+j),"RL   %s",r);
                   5117:                                        M_RL ( DL );
                   5118:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5119: #if WB_EA4_EDX
                   5120:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5121: #else
                   5122:                                        WBYTE( 4, EBP, EDX );
                   5123:                                        end_opcode("z_op");
                   5124: #endif
                   5125:                     break;
                   5126:                                case 0x18:
                   5127:                                        beg_opcode(19,s("xx_%02x",i+j),"RR   %s",r);
                   5128:                                        M_RR ( DL );
                   5129:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5130: #if WB_EA4_EDX
                   5131:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5132: #else
                   5133:                                        WBYTE( 4, EBP, EDX );
                   5134:                                        end_opcode("z_op");
                   5135: #endif
                   5136:                     break;
                   5137:                                case 0x20:
                   5138:                                        beg_opcode(19,s("xx_%02x",i+j),"SLA  %s",r);
                   5139:                                        M_SLA( DL );
                   5140:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5141: #if WB_EA4_EDX
                   5142:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5143: #else
                   5144:                                        WBYTE( 4, EBP, EDX );
                   5145:                                        end_opcode("z_op");
                   5146: #endif
                   5147:                     break;
                   5148:                                case 0x28:
                   5149:                                        beg_opcode(19,s("xx_%02x",i+j),"SRA  %s",r);
                   5150:                                        M_SRA( DL );
                   5151:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5152: #if WB_EA4_EDX
                   5153:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5154: #else
                   5155:                                        WBYTE( 4, EBP, EDX );
                   5156:                                        end_opcode("z_op");
                   5157: #endif
                   5158:                     break;
                   5159:                                case 0x30:
                   5160:                                        beg_opcode(19,s("xx_%02x",i+j),"SLL  %s",r);
                   5161:                                        M_SLL( DL );
                   5162:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5163: #if WB_EA4_EDX
                   5164:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5165: #else
                   5166:                                        WBYTE( 4, EBP, EDX );
                   5167:                                        end_opcode("z_op");
                   5168: #endif
                   5169:                     break;
                   5170:                                case 0x38:
                   5171:                                        beg_opcode(19,s("xx_%02x",i+j),"SRL  %s",r);
                   5172:                                        M_SRL( DL );
                   5173:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5174: #if WB_EA4_EDX
                   5175:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5176: #else
                   5177:                                        WBYTE( 4, EBP, EDX );
                   5178:                                        end_opcode("z_op");
                   5179: #endif
                   5180:                     break;
                   5181:                                case 0x40: case 0x48: case 0x50: case 0x58:
                   5182:                                case 0x60: case 0x68: case 0x70: case 0x78:
                   5183:                                        b = (i >> 3) & 7;
                   5184:                                        beg_opcode(16,s("xx_%02x",i+j),"BIT  %d,%s",b,r);
                   5185:                                        M_BIT( b, DL );
                   5186:                                        end_opcode("z_op");
                   5187:                     break;
                   5188:                                case 0x80: case 0x88: case 0x90: case 0x98:
                   5189:                                case 0xa0: case 0xa8: case 0xb0: case 0xb8:
                   5190:                                        b = (i >> 3) & 7;
                   5191:                                        beg_opcode(19,s("xx_%02x",i+j),"RES  %d,%s",b,r);
                   5192:                                        M_RES( b, DL );
                   5193:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5194: #if WB_EA4_EDX
                   5195:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5196: #else
                   5197:                                        WBYTE( 4, EBP, EDX );
                   5198:                                        end_opcode("z_op");
                   5199: #endif
                   5200:                     break;
                   5201:                                case 0xc0: case 0xc8: case 0xd0: case 0xd8:
                   5202:                                case 0xe0: case 0xe8: case 0xf0: case 0xf8:
                   5203:                                        b = (i >> 3) & 7;
                   5204:                                        beg_opcode(19,s("xx_%02x",i+j),"SET  %d,%s",b,r);
                   5205:                                        M_SET( b, DL );
                   5206:                                        if (j != 6) I(0,movb, zr, DL, 0);
                   5207: #if WB_EA4_EDX
                   5208:                                        I(0,jmp,        "wb_ea4_edx",0,    0);
                   5209: #else
                   5210:                                        WBYTE( 4, EBP, EDX );
                   5211:                                        end_opcode("z_op");
                   5212: #endif
                   5213:                     break;
                   5214:             }
                   5215:                }
                   5216:        }
                   5217: }
                   5218: 
                   5219: void mk_opcodes_ed(void)
                   5220: {
                   5221:        beg_opcode(12,"ed_40","IN   B,(C)");
                   5222:        M_IN_BC( zB );
                   5223:        end_opcode("z_op");
                   5224: 
                   5225:        beg_opcode(12,"ed_41","OUT  (C),B");
                   5226:        M_OUT_BC( zB );
                   5227:        end_opcode("z_op");
                   5228: 
                   5229:        beg_opcode(15,"ed_42","SBC  HL,BC");
                   5230:        M_SBC16( zBC );
                   5231:        end_opcode("z_op");
                   5232: 
                   5233:        beg_opcode(20,"ed_43","LD   (imm16),BC");
                   5234:        ARG16( ECX );
                   5235:        WWORD( 4, ECX, zBC32 );
                   5236:        end_opcode("z_op");
                   5237: 
                   5238:        beg_opcode( 8,"ed_44","NEG");
                   5239:        M_NEG();
                   5240:        end_opcode("z_op");
                   5241: 
                   5242:        beg_opcode(14,"ed_45","RETN");
                   5243:        M_RETN( 0x45 );
                   5244:        end_opcode("z_op");
                   5245: 
                   5246:        beg_opcode( 8,"ed_46","IM   0");
                   5247:        I(0,movb,       zIM,    D(0),   "set IM = 0");
                   5248:        end_opcode("z_op");
                   5249: 
                   5250:        beg_opcode( 9,"ed_47","LD   I,A");
                   5251:        M_LD_I_A();
                   5252:        end_opcode("z_op");
                   5253: 
                   5254:        beg_opcode(12,"ed_48","IN   C,(C)");
                   5255:        M_IN_BC( zC );
                   5256:        end_opcode("z_op");
                   5257: 
                   5258:        beg_opcode(12,"ed_49","OUT  (C),C");
                   5259:        M_OUT_BC( zC );
                   5260:        end_opcode("z_op");
                   5261: 
                   5262:        beg_opcode(15,"ed_4a","ADC  HL,BC");
                   5263:        M_ADC16( zBC );
                   5264:        end_opcode("z_op");
                   5265: 
                   5266:        beg_opcode(20,"ed_4b","LD   BC,(imm16)");
                   5267:        ARG16( ECX );
                   5268:        RWORD( 4, EDX, ECX );
                   5269:        I(0,movw,       zBC,    DX,     0);
                   5270:        end_opcode("z_op");
                   5271: 
                   5272:        beg_opcode( 8,"ed_4c","NEG");
                   5273:        M_NEG();
                   5274:        end_opcode("z_op");
                   5275: 
                   5276:        beg_opcode(14,"ed_4d","RETI");
                   5277:        M_RETI(0x4d);
                   5278:        end_opcode("z_op");
                   5279: 
                   5280:        beg_opcode( 8,"ed_4e","IM   0");
                   5281:        I(0,movb,       zIM,    D(0),   "set IM = 0");
                   5282:        end_opcode("z_op");
                   5283: 
                   5284:        beg_opcode( 9,"ed_4f","LD   R,A");
                   5285:        M_LD_R_A();
                   5286:        end_opcode("z_op");
                   5287: 
                   5288:        beg_opcode(12,"ed_50","IN   D,(C)");
                   5289:        M_IN_BC( zD );
                   5290:        end_opcode("z_op");
                   5291: 
                   5292:        beg_opcode(12,"ed_51","OUT  (C),D");
                   5293:        M_OUT_BC( zD );
                   5294:        end_opcode("z_op");
                   5295: 
                   5296:        beg_opcode(15,"ed_52","SBC  HL,DE");
                   5297:        M_SBC16( zDE );
                   5298:        end_opcode("z_op");
                   5299: 
                   5300:        beg_opcode(20,"ed_53","LD   (imm16),DE");
                   5301:        ARG16( ECX );
                   5302:        WWORD( 4, ECX, zDE32 );
                   5303:        end_opcode("z_op");
                   5304: 
                   5305:        beg_opcode( 8,"ed_54","NEG");
                   5306:        M_NEG();
                   5307:        end_opcode("z_op");
                   5308: 
                   5309:        beg_opcode(14,"ed_55","RETN");
                   5310:        M_RETN( 0x55 );
                   5311:        end_opcode("z_op");
                   5312: 
                   5313:        beg_opcode( 8,"ed_56","IM   1");
                   5314:        I(0,movb,       zIM,    D(1),   "set IM = 1");
                   5315:        end_opcode("z_op");
                   5316: 
                   5317:        beg_opcode( 9,"ed_57","LD   A,I");
                   5318:        M_LD_A_I();
                   5319:        end_opcode("z_op");
                   5320: 
                   5321:        beg_opcode(12,"ed_58","IN   E,(C)");
                   5322:        M_IN_BC( zE );
                   5323:        end_opcode("z_op");
                   5324: 
                   5325:        beg_opcode(12,"ed_59","OUT  (C),E");
                   5326:        M_OUT_BC( zE );
                   5327:        end_opcode("z_op");
                   5328: 
                   5329:        beg_opcode(15,"ed_5a","ADC  HL,DE");
                   5330:        M_ADC16( zDE );
                   5331:        end_opcode("z_op");
                   5332: 
                   5333:        beg_opcode(20,"ed_5b","LD   DE,(imm16)");
                   5334:        ARG16( ECX );
                   5335:        RWORD( 4, EDX, ECX );
                   5336:        I(0,movw,       zDE,    DX,     0);
                   5337:        end_opcode("z_op");
                   5338: 
                   5339:        beg_opcode( 8,"ed_5c","NEG");
                   5340:        M_NEG();
                   5341:        end_opcode("z_op");
                   5342: 
                   5343:        beg_opcode(14,"ed_5d","RETI");
                   5344:        M_RETI( 0x5d );
                   5345:        end_opcode("z_op");
                   5346: 
                   5347:        beg_opcode( 8,"ed_5e","IM   2");
                   5348:        I(0,movb,       zIM,    D(2),   "set IM = 2");
                   5349:        end_opcode("z_op");
                   5350: 
                   5351:        beg_opcode( 9,"ed_5f","LD   A,R");
                   5352:        M_LD_A_R();
                   5353:        end_opcode("z_op");
                   5354: 
                   5355:        beg_opcode(12,"ed_60","IN   H,(C)");
                   5356:        M_IN_BC( H );
                   5357:        end_opcode("z_op");
                   5358: 
                   5359:        beg_opcode(12,"ed_61","OUT  (C),H");
                   5360:        M_OUT_BC( H );
                   5361:        end_opcode("z_op");
                   5362: 
                   5363:        beg_opcode(15,"ed_62","SBC  HL,HL");
                   5364:        M_SBC16( HL );
                   5365:        end_opcode("z_op");
                   5366: 
                   5367:        beg_opcode(20,"ed_63","LD   (imm16),HL");
                   5368:        ARG16( ECX );
                   5369:        WWORD( 4, ECX, HL32 );
                   5370:        end_opcode("z_op");
                   5371: 
                   5372:        beg_opcode( 8,"ed_64","NEG");
                   5373:        M_NEG();
                   5374:        end_opcode("z_op");
                   5375: 
                   5376:        beg_opcode(14,"ed_65","RETN");
                   5377:        M_RETN( 0x65 );
                   5378:        end_opcode("z_op");
                   5379: 
                   5380:        beg_opcode( 8,"ed_66","IM   0");
                   5381:        I(0,movb,       zIM,    D(0),   "set IM = 0");
                   5382:        end_opcode("z_op");
                   5383: 
                   5384:        beg_opcode(18,"ed_67","RRD  (HL)");
                   5385:        M_RRD();
                   5386:        end_opcode("z_op");
                   5387: 
                   5388:        beg_opcode(12,"ed_68","IN   L,(C)");
                   5389:        M_IN_BC( L );
                   5390:        end_opcode("z_op");
                   5391: 
                   5392:        beg_opcode(12,"ed_69","OUT  (C),L");
                   5393:        M_OUT_BC( L );
                   5394:        end_opcode("z_op");
                   5395: 
                   5396:        beg_opcode(15,"ed_6a","ADC  HL,HL");
                   5397:        M_ADC16( HL );
                   5398:        end_opcode("z_op");
                   5399: 
                   5400:        beg_opcode(20,"ed_6b","LD   HL,(imm16)");
                   5401:        ARG16( ECX );
                   5402:        RWORD( 4, EDX, ECX );
                   5403:        I(0,movw,       HL,     DX,     0);
                   5404:        end_opcode("z_op");
                   5405: 
                   5406:        beg_opcode( 8,"ed_6c","NEG");
                   5407:        M_NEG();
                   5408:        end_opcode("z_op");
                   5409: 
                   5410:        beg_opcode(14,"ed_6d","RETI");
                   5411:        M_RETI( 0x6d );
                   5412:        end_opcode("z_op");
                   5413: 
                   5414:        beg_opcode( 8,"ed_6e","IM   0");
                   5415:        I(0,movb,       zIM,    D(0),   "set IM = 0");
                   5416:        end_opcode("z_op");
                   5417: 
                   5418:        beg_opcode(18,"ed_6f","RLD  (HL)");
                   5419:        M_RLD();
                   5420:        end_opcode("z_op");
                   5421: 
                   5422:        beg_opcode(12,"ed_70","IN   F,(C)");
                   5423:        M_IN_BC( DL );
                   5424:        end_opcode("z_op");
                   5425: 
                   5426:        beg_opcode(12,"ed_71","OUT  (C),0");
                   5427:        I(0,movb,       DL,     D(0),   0);
                   5428:     M_OUT_BC( DL );
                   5429:        end_opcode("z_op");
                   5430: 
                   5431:        beg_opcode(15,"ed_72","SBC  HL,SP");
                   5432:        M_SBC16( zSP );
                   5433:        end_opcode("z_op");
                   5434: 
                   5435:        beg_opcode(20,"ed_73","LD   (imm16),SP");
                   5436:        ARG16( ECX );
                   5437:        WWORD( 4, ECX, zSP32 );
                   5438:        end_opcode("z_op");
                   5439: 
                   5440:        beg_opcode( 8,"ed_74","NEG");
                   5441:        M_NEG();
                   5442:        end_opcode("z_op");
                   5443: 
                   5444:        beg_opcode(14,"ed_75","RETN");
                   5445:        M_RETN( 0x75 );
                   5446:        end_opcode("z_op");
                   5447: 
                   5448:        beg_opcode( 8,"ed_76","IM   1");
                   5449:        I(0,movb,       zIM,    D(1),   "set IM = 1");
                   5450:        end_opcode("z_op");
                   5451: 
                   5452:        beg_opcode(12,"ed_78","IN   A,(C)");
                   5453:        M_IN_BC( A );
                   5454:        end_opcode("z_op");
                   5455: 
                   5456:        beg_opcode(12,"ed_79","OUT  (C),A");
                   5457:        M_OUT_BC( A );
                   5458:        end_opcode("z_op");
                   5459: 
                   5460:        beg_opcode(15,"ed_7a","ADC  HL,SP");
                   5461:        M_ADC16( zSP );
                   5462:        end_opcode("z_op");
                   5463: 
                   5464:        beg_opcode(20,"ed_7b","LD   SP,(imm16)");
                   5465:        ARG16( ECX );
                   5466:        RWORD( 4, EDX, ECX );
                   5467:        I(0,movw,       zSP,    DX,     0);
                   5468:        end_opcode("z_op");
                   5469: 
                   5470:        beg_opcode( 8,"ed_7c","NEG");
                   5471:        M_NEG();
                   5472:        end_opcode("z_op");
                   5473: 
                   5474:        beg_opcode(14,"ed_7d","RETI");
                   5475:        M_RETI( 0x7d );
                   5476:        end_opcode("z_op");
                   5477: 
                   5478:        beg_opcode( 8,"ed_7e","IM   2");
                   5479:        I(0,movb,       zIM,    D(2),   "set IM = 2");
                   5480:        end_opcode("z_op");
                   5481: 
                   5482:        beg_opcode(16,"ed_a0","LDI");
                   5483:        RBYTE( 2, EDX, HL32 );
                   5484:        WBYTE( 2, zDE32, EDX );
                   5485:     I(0,andb,   F,      X(SF|ZF|CF),    "keep S,Z and C flags");
                   5486:        I(0,incw,       HL,     0,                              "HL++");
                   5487:        I(0,incw,       zDE,    0,                              "DE++");
                   5488:        I(0,decw,       zBC,    0,                              "BC--");
                   5489:        I(0,je,         LS("ed_a0_skip"),0,     0);
                   5490:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5491:        S("ed_a0_skip",0);
                   5492:        end_opcode("z_op");
                   5493: 
                   5494:        beg_opcode(16,"ed_a1","CPI");
                   5495:        RBYTE( 2, EDX, HL32 );
                   5496:        I(0,movb,       CL,     F,                              "save flags");
                   5497:     I(0,andb,   CL,     X(CF),          "keep C flag");
                   5498:        I(0,cmpb,       A,              DL,                     0);
                   5499:        I(0,lahf,       0,              0,                              0);
                   5500:        I(0,andb,       F,              X(SF|ZF|HF),    "mask S,Z and H flags");
                   5501:        I(0,orb,        F,              X(NF),                  "set N flag");
                   5502:        I(0,orb,        F,              CL,                     "combine with C");
                   5503:        I(0,incw,       HL,     0,                              "HL++");
                   5504:        I(0,decw,       zBC,    0,                              "BC--");
                   5505:        I(0,je,         LS("ed_a1_skip"),0,     0);
                   5506:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5507:        S("ed_a1_skip",0);
                   5508:        end_opcode("z_op");
                   5509: 
                   5510:        beg_opcode(16,"ed_a2","INI");
                   5511:        I(0,decb,       zB,     0,                              "--B");
                   5512:        M_IN( 2, EDX, zBC32 );
                   5513:        WBYTE( 2, HL32, EDX );
                   5514:        I(0,movb,       F,              X(ZF|NF),               "set Z and N flags");
                   5515:        I(0,incw,       HL,     0,                              "HL++");
                   5516:        I(0,testb,      zB,     B(-1),                  "B counted down?");
                   5517:        I(0,je,         LS("ed_a2_skip"),0,     0);
                   5518:        I(0,movb,       F,              X(NF),                  "set N only");
                   5519:        S("ed_a2_skip",0);
                   5520:        end_opcode("z_op");
                   5521: 
                   5522:        beg_opcode(16,"ed_a3","OUTI");
                   5523:        RBYTE( 2, EDX, HL32 );
                   5524:        M_OUT( 2, zBC32, EDX );
                   5525:     I(0,movb,   F,      X(ZF|NF),       "set Z and N");
                   5526:        I(0,incw,       HL,     0,                              "HL++");
                   5527:        I(0,decb,       zB,     0,                              "B--");
                   5528:        I(0,je,         LS("ed_a3_skip"),0,     0);
                   5529:        I(0,movb,       F,              X(NF),                  "set N only");
                   5530:        S("ed_a3_skip",0);
                   5531:        end_opcode("z_op");
                   5532: 
                   5533:        beg_opcode(16,"ed_a8","LDD");
                   5534:        RBYTE( 2, EDX, HL32 );
                   5535:        WBYTE( 2, zDE32, EDX );
                   5536:     I(0,andb,   F,      X(SF|ZF|CF),    "keep S,Z and C flags");
                   5537:        I(0,decw,       HL,     0,                              "HL--");
                   5538:        I(0,decw,       zDE,    0,                              "DE--");
                   5539:        I(0,decw,       zBC,    0,                              "BC--");
                   5540:        I(0,je,         LS("ed_a8_skip"),0,     0);
                   5541:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5542:        S("ed_a8_skip",0);
                   5543:        end_opcode("z_op");
                   5544: 
                   5545:        beg_opcode(16,"ed_a9","CPD");
                   5546:        RBYTE( 2, EDX, HL32 );
                   5547:        I(0,movb,       CL,     F,                              "save flags");
                   5548:     I(0,andb,   CL,     X(CF),          "keep C flag");
                   5549:        I(0,cmpb,       A,              DL,                     0);
                   5550:        I(0,lahf,       0,              0,                              0);
                   5551:        I(0,andb,       F,              X(SF|ZF|HF),    "mask S,Z and H flags");
                   5552:        I(0,orb,        F,              X(NF),                  "set N flag");
                   5553:     I(0,orb,    F,      CL,             "combine with C");
                   5554:        I(0,decw,       HL,     0,                              "HL--");
                   5555:        I(0,decw,       zBC,    0,                              "BC--");
                   5556:        I(0,je,         LS("ed_a9_skip"),0,     0);
                   5557:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5558:        S("ed_a9_skip",0);
                   5559:        end_opcode("z_op");
                   5560: 
                   5561:        beg_opcode(16,"ed_aa","IND");
                   5562:        I(0,decb,       zB,     0,                              "--B");
                   5563:        M_IN( 2, EDX,  zBC32 );
                   5564:        WBYTE( 2, HL32, EDX );
                   5565:     I(0,movb,   F,      X(ZF|NF),       "set Z and N flags");
                   5566:        I(0,decw,       HL,     0,                              "HL--");
                   5567:        I(0,testb,      zB,     B(-1),                  "B counted down?");
                   5568:        I(0,je,         LS("ed_aa_skip"),0,     0);
                   5569:        I(0,andb,       F,              X(NF),                  "leave N only");
                   5570:        S("ed_aa_skip",0);
                   5571:        end_opcode("z_op");
                   5572: 
                   5573:        beg_opcode(16,"ed_ab","OUTD");
                   5574:        RBYTE( 2, EDX, HL32 );
                   5575:        M_OUT( 2, zBC32, EDX );
                   5576:        I(0,movb,       F,              X(ZF|NF),               "set Z and N flags");
                   5577:        I(0,decw,       HL,     0,                              "HL--");
                   5578:        I(0,decb,       zB,     0,                              "B--");
                   5579:        I(0,je,         LS("ed_ab_skip"),0,     0);
                   5580:        I(0,andb,       F,              X(NF),                  "set N only");
                   5581:        S("ed_ab_skip",0);
                   5582:        end_opcode("z_op");
                   5583: 
                   5584:        beg_opcode(16,"ed_b0","LDIR");
                   5585:     RBYTE( 2, EDX, HL32 );
                   5586:        WBYTE( 2, zDE32, EDX );
                   5587:        I(0,andb,       F,              X(SF|ZF|CF),    "keep S,Z and C flags");
                   5588:        I(0,incw,       HL,     0,                              "HL++");
                   5589:        I(0,incw,       zDE,    0,                              "DE++");
                   5590:        I(0,decw,       zBC,    0,                              "BC--");
                   5591:        I(0,je,         LS("ed_b0_skip"),0,     0);
                   5592:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5593:        ADJUST_PC(-2);
                   5594:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5595:     S("ed_b0_skip",0);
                   5596:        end_opcode("z_op");
                   5597: 
                   5598:        beg_opcode(16,"ed_b1","CPIR");
                   5599:        RBYTE( 2, EDX, HL32 );
                   5600:        I(0,movb,       CL,     F,                              "save flags");
                   5601:        I(0,andb,       CL,     X(CF),                  "keep C flag");
                   5602:        I(0,cmpb,       A,              DL,                     0);
                   5603:        I(0,lahf,       0,              0,                              0);
                   5604:        I(0,andb,       F,              X(SF|ZF|HF),    "mask S,Z and H flags");
                   5605:        I(0,orb,        F,              X(NF),                  "set N flag");
                   5606:        I(0,orb,        F,              CL,                     "combine with C");
                   5607:        I(0,incw,       HL,     0,                              "HL++");
                   5608:        I(0,decw,       zBC,    0,                              "BC--");
                   5609:        I(0,je,         LS("ed_b1_skip"),0,     0);
                   5610:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5611:        I(0,testb,      F,              X(ZF),                  "Z flag set?");
                   5612:        I(0,jne,        LS("ed_b1_skip"),0,     "yes, don't repeat");
                   5613:        ADJUST_PC(-2);
                   5614:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5615:     S("ed_b1_skip",0);
                   5616:        end_opcode("z_op");
                   5617: 
                   5618:        beg_opcode(16,"ed_b2","INIR");
                   5619:        I(0,decb,       zB,     0,                              "--B");
                   5620:        M_IN( 2, EDX,  zBC32 );
                   5621:        WBYTE( 2, HL32, EDX );
                   5622:        I(0,incw,       HL,     0,                              "HL++");
                   5623:        I(0,movb,       F,              X(ZF|NF),               "set Z and N");
                   5624:        I(0,testb,      zB,     B(-1),                  "B counted down?");
                   5625:        I(0,je,         LS("ed_b2_skip"),0,     0);
                   5626:        I(0,movb,       F,              X(NF),                  "set N only");
                   5627:        ADJUST_PC(-2);
                   5628:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5629:     S("ed_b2_skip",0);
                   5630:        end_opcode("z_op");
                   5631: 
                   5632:        beg_opcode(16,"ed_b3","OTIR");
                   5633:        RBYTE( 2, EDX, HL32 );
                   5634:        M_OUT( 2, zBC32, EDX );
                   5635:     I(0,movb,   F,      X(ZF|NF),       "set Z and N");
                   5636:        I(0,incw,       HL,     0,                              "HL++");
                   5637:        I(0,decb,       zB,     0,                              "B--");
                   5638:        I(0,je,         LS("ed_b3_skip"),0,     0);
                   5639:        I(0,movb,       F,              X(NF),                  "set N only");
                   5640:        ADJUST_PC(-2);
                   5641:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5642:     S("ed_b3_skip",0);
                   5643:        end_opcode("z_op");
                   5644: 
                   5645:        beg_opcode(16,"ed_b8","LDDR");
                   5646:        RBYTE( 2, EDX, HL32 );
                   5647:        WBYTE( 2, zDE32, EDX );
                   5648:     I(0,andb,   F,      X(SF|ZF|CF),    "keep S,Z and C flags");
                   5649:        I(0,decw,       HL,     0,                              "HL--");
                   5650:        I(0,decw,       zDE,    0,                              "DE--");
                   5651:        I(0,decw,       zBC,    0,                              "BC--");
                   5652:        I(0,je,         LS("ed_b8_skip"),0,     0);
                   5653:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5654:        ADJUST_PC(-2);
                   5655:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5656:     S("ed_b8_skip",0);
                   5657:        end_opcode("z_op");
                   5658: 
                   5659:        beg_opcode(16,"ed_b9","CPDR");
                   5660:        RBYTE( 2, EDX, HL32 );
                   5661:        I(0,movb,       CL,     F,                              "save flags");
                   5662:        I(0,andb,       CL,     X(CF),                  "keep C flag");
                   5663:        I(0,cmpb,       A,              DL,                     0);
                   5664:        I(0,lahf,       0,              0,                              0);
                   5665:        I(0,andb,       F,              X(SF|ZF|HF),    "mask S,Z and H flags");
                   5666:        I(0,orb,        F,              X(NF),                  "set N flag");
                   5667:        I(0,orb,        F,              CL,                     "combine with C");
                   5668:        I(0,decw,       HL,     0,                              "HL--");
                   5669:        I(0,decw,       zBC,    0,                              "BC--");
                   5670:        I(0,je,         LS("ed_b9_skip"),0,     0);
                   5671:        I(0,orb,        F,              X(PF),                  "BC not zero, set P/V");
                   5672:        I(0,testb,      F,              X(ZF),                  "Z flag set?");
                   5673:        I(0,jne,        LS("ed_b9_skip"),0,     "yes, don't repeat");
                   5674:        ADJUST_PC(-2);
                   5675:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5676:     S("ed_b9_skip",0);
                   5677:        end_opcode("z_op");
                   5678: 
                   5679:        beg_opcode(16,"ed_ba","INDR");
                   5680:        I(0,decb,       zB,     0,                              "--B");
                   5681:        M_IN( 2, EDX,  zBC32 );
                   5682:        WBYTE( 2, HL32, EDX );
                   5683:     I(0,movb,   F,      X(ZF|NF),       "set Z and N");
                   5684:        I(0,decw,       HL,     0,                              "HL--");
                   5685:        I(0,testb,      zB,     B(-1),                  0);
                   5686:        I(0,je,         LS("ed_ba_skip"),0,     0);
                   5687:        I(0,movb,       F,              X(NF),                  "set N only");
                   5688:        ADJUST_PC(-2);
                   5689:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5690:     S("ed_ba_skip",0);
                   5691:        end_opcode("z_op");
                   5692: 
                   5693:        beg_opcode(16,"ed_bb","OTDR");
                   5694:        RBYTE( 2, EDX, HL32 );
                   5695:        M_OUT( 2, zBC32, EDX );
                   5696:     I(0,movb,   F,      X(ZF|NF),       "set Z and N");
                   5697:        I(0,decw,       HL,     0,                              "HL--");
                   5698:        I(0,decb,       zB,     0,                              "B--");
                   5699:        I(0,je,         LS("ed_bb_skip"),0,     0);
                   5700:        I(0,movb,       F,              X(NF),                  "set N only");
                   5701:        ADJUST_PC(-2);
                   5702:     I(0,subl,   zICOUNT,B(5),           "five more cycles");
                   5703:     S("ed_bb_skip",0);
                   5704:        end_opcode("z_op");
                   5705: }
                   5706: 
                   5707: int main(int ac, char **av)
                   5708: {
                   5709: int i;
                   5710: 
                   5711:        if (ac < 2) {
                   5712:                fprintf(stderr, "usage: %s [options] output.asm\n", av[0]);
                   5713:                fprintf(stderr, "options can be one of the following\n");
                   5714:                fprintf(stderr, "-nasm\tgenerate NASM output%s\n",(as==NASM)?" (default)":"");
                   5715:                fprintf(stderr, "-gas\tgenerate GNU assembler output%s\n",(as==GAS)?" (default)":"");
                   5716:                fprintf(stderr, "-verbose n\toutput error.log (n= 0 none - 9 everything)\n");
                   5717:                fprintf(stderr, "-On\temit self optimizing code (n=0 no, n=1 yes)\n");
                   5718:                fprintf(stderr, "-Ddefine\tdefines for conditional output\n");
                   5719:                fprintf(stderr, "\t-DMAME_DEBUG output code to call MAMEs debugger\n");
                   5720:                return 1;
                   5721:        }
                   5722:        printf("Z80 x86 asm emitter V0.6 for MAME\n");
                   5723:        printf("Copyright (c) 1999 by Juergen Buchmueller ([email protected])\n");
                   5724: 
                   5725:        for (i = 1; av[i][0] == '-'; i++) {
                   5726:                if (!strcmp(av[i], "-gas")) {
                   5727:             as = GAS;
                   5728:                } else if (!strcmp(av[i], "-nasm") || !strcmp(av[i], "-nasmw")) {
                   5729:             as = NASM;
                   5730:                } else if (!strcmp(av[i], "-tasm")) {
                   5731:                        as = TASM;
                   5732:                } else if (!strcmp(av[i],"-verbose")) {
                   5733:                        if (++i < ac - 1) {
                   5734:                                sscanf(av[i], "%d", &verbose);
                   5735:             }
                   5736:                } else if (!strncmp(av[i], "-D", 2)) {
                   5737:                        if (!strcmp(&av[i][2],"MAME_DEBUG")) {
                   5738:                                mame_debug = 1;
                   5739:                        } else {
                   5740:                                /* fprintf(stderr, "ignored define '%s'\n", &av[i][2]); */
                   5741:                        }
                   5742:                } else if (!strncmp(av[i], "-m", 2)) {
                   5743:                        if (!strncmp(&av[i][2],"386",3)) {
                   5744:                                align_funcs = 1;
                   5745:                                align_jumps = 1;
                   5746:                 align_loops = 1;
                   5747:                        } else
                   5748:                        if (!strncmp(&av[i][2],"486",3)) {
                   5749:                                align_funcs = 2;
                   5750:                                align_jumps = 2;
                   5751:                 align_loops = 1;
                   5752:             } else
                   5753:                        if (!strncmp(&av[i][2],"pentium",3)) {
                   5754:                                align_funcs = 2;
                   5755:                                align_jumps = 2;
                   5756:                 align_loops = 1;
                   5757:             } else
                   5758:             if (!strncmp(&av[i][2],"align-functions=",16)) {
                   5759:                                sscanf(&av[i][18], "%d", &align_funcs);
                   5760:                        } else
                   5761:                        if (!strncmp(&av[i][2],"align-jumps=",12)) {
                   5762:                                sscanf(&av[i][14], "%d", &align_jumps);
                   5763:             } else
                   5764:                        if (!strncmp(&av[i][2],"align-loops=",12)) {
                   5765:                 sscanf(&av[i][14], "%d", &align_loops);
                   5766:             } else {
                   5767:                 /* fprintf(stderr, "ignored optimizing option '%s'\n", &av[i][2]); */
                   5768:             }
                   5769:         } else {
                   5770: /*
                   5771:  *                     fprintf(stderr, "unsupported option '%s'\n", av[i]);
                   5772:  *                     return 1;
                   5773:  */
                   5774:         }
                   5775:     }
                   5776:        if (as == GAS)  printf("- GNU assembler output\n");
                   5777:        if (as == NASM) printf("- NASM output\n");
                   5778:        if (as == TASM) printf("- TASM output\n");
                   5779:        if (mame_debug) printf("- with MAME_Debug code\n");
                   5780:     printf("- verbose level   %d\n", verbose);
                   5781:        printf("- align functions %d (%d bytes)\n", align_funcs, 2<<align_funcs);
                   5782:        printf("- align jumps     %d (%d bytes)\n", align_jumps, 2<<align_jumps);
                   5783:        printf("- align loops     %d (%d bytes)\n", align_loops, 2<<align_loops);
                   5784: 
                   5785:        output = fopen(av[i], "w");
                   5786: 
                   5787:        mk_header();
                   5788:        mk_interface();
                   5789:        mk_memory_handlers();
                   5790:     mk_opcodes(0x0000);
                   5791:        mk_opcodes_ed();
                   5792:        mk_opcodes_cb();
                   5793:     mk_opcodes(0xdd00);
                   5794:        mk_opcodes(0xfd00);
                   5795:        mk_opcodes_xx();
                   5796: 
                   5797:        if (as == TASM)
                   5798:                emit("\tend");
                   5799: 
                   5800:        printf("generated %d opcodes\n", opcodes);
                   5801:        printf("functions rbyte:%d wbyte:%d rword:%d wword:%d\n",
                   5802:                rbyte, wbyte, rword, wword);
                   5803: 
                   5804:        fclose(output);
                   5805:        return 0;
                   5806: }
                   5807: 
                   5808: 
                   5809: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.