fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 361 lines 19 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/cpu/e8080/disasm.c * 7 * Created: 2012-11-28 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2012-2014 Hampa Hug <hampa@hampa.ch> * 9 *****************************************************************************/ 10 11/***************************************************************************** 12 * This program is free software. You can redistribute it and / or modify it * 13 * under the terms of the GNU General Public License version 2 as published * 14 * by the Free Software Foundation. * 15 * * 16 * This program is distributed in the hope that it will be useful, but * 17 * WITHOUT ANY WARRANTY, without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * 19 * Public License for more details. * 20 *****************************************************************************/ 21 22 23#include "e8080.h" 24#include "internal.h" 25 26#include <string.h> 27 28 29static 30e8080_dop_t doptab[256] = { 31 { 0x00, "NOP", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 32 { 0x01, "LXI", "BC", NULL, ARG_STR, ARG_IM16, 3, 10, 0 }, 33 { 0x02, "STAX", "BC", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 34 { 0x03, "INX", "BC", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 35 { 0x04, "INR", "B", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 36 { 0x05, "DCR", "B", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 37 { 0x06, "MVI", "B", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 38 { 0x07, "RLC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 39 { 0x08, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 40 { 0x09, "DAD", "BC", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 41 { 0x0a, "LDAX", "BC", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 42 { 0x0b, "DCX", "BC", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 43 { 0x0c, "INR", "C", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 44 { 0x0d, "DCR", "C", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 45 { 0x0e, "MVI", "C", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 46 { 0x0f, "RRC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 47 { 0x10, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 48 { 0x11, "LXI", "DE", NULL, ARG_STR, ARG_IM16, 3, 10, 0 }, 49 { 0x12, "STAX", "DE", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 50 { 0x13, "INX", "DE", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 51 { 0x14, "INR", "D", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 52 { 0x15, "DCR", "D", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 53 { 0x16, "MVI", "D", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 54 { 0x17, "RAL", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 55 { 0x18, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 56 { 0x19, "DAD", "DE", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 57 { 0x1a, "LDAX", "DE", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 58 { 0x1b, "DCX", "DE", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 59 { 0x1c, "INR", "E", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 60 { 0x1d, "DCR", "E", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 61 { 0x1e, "MVI", "E", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 62 { 0x1f, "RAR", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 63 { 0x20, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 64 { 0x21, "LXI", "HL", NULL, ARG_STR, ARG_IM16, 3, 10, 0 }, 65 { 0x22, "SHLD", NULL, NULL, ARG_AD16, ARG_NONE, 3, 16, 0 }, 66 { 0x23, "INX", "HL", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 67 { 0x24, "INR", "H", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 68 { 0x25, "DCR", "H", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 69 { 0x26, "MVI", "H", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 70 { 0x27, "DAA", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 71 { 0x28, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 72 { 0x29, "DAD", "HL", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 73 { 0x2a, "LHLD", NULL, NULL, ARG_AD16, ARG_NONE, 3, 16, 0 }, 74 { 0x2b, "DCX", "HL", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 75 { 0x2c, "INR", "L", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 76 { 0x2d, "DCR", "L", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 77 { 0x2e, "MVI", "L", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 78 { 0x2f, "CMA", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 79 { 0x30, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 80 { 0x31, "LXI", "SP", NULL, ARG_STR, ARG_IM16, 3, 10, 0 }, 81 { 0x32, "STA", NULL, NULL, ARG_AD16, ARG_NONE, 3, 13, 0 }, 82 { 0x33, "INX", "SP", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 83 { 0x34, "INR", "M", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 84 { 0x35, "DCR", "M", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 85 { 0x36, "MVI", "M", NULL, ARG_STR, ARG_IMM8, 2, 10, 0 }, 86 { 0x37, "STC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 87 { 0x38, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 88 { 0x39, "DAD", "SP", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 89 { 0x3a, "LDA", NULL, NULL, ARG_AD16, ARG_NONE, 3, 13, 0 }, 90 { 0x3b, "DCX", "SP", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 91 { 0x3c, "INR", "A", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 92 { 0x3d, "DCR", "A", NULL, ARG_STR, ARG_NONE, 1, 5, 0 }, 93 { 0x3e, "MVI", "A", NULL, ARG_STR, ARG_IMM8, 2, 7, 0 }, 94 { 0x3f, "CMC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 95 { 0x40, "MOV", "B", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 96 { 0x41, "MOV", "B", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 97 { 0x42, "MOV", "B", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 98 { 0x43, "MOV", "B", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 99 { 0x44, "MOV", "B", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 100 { 0x45, "MOV", "B", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 101 { 0x46, "MOV", "B", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 102 { 0x47, "MOV", "B", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 103 { 0x48, "MOV", "C", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 104 { 0x49, "MOV", "C", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 105 { 0x4a, "MOV", "C", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 106 { 0x4b, "MOV", "C", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 107 { 0x4c, "MOV", "C", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 108 { 0x4d, "MOV", "C", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 109 { 0x4e, "MOV", "C", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 110 { 0x4f, "MOV", "C", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 111 { 0x50, "MOV", "D", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 112 { 0x51, "MOV", "D", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 113 { 0x52, "MOV", "D", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 114 { 0x53, "MOV", "D", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 115 { 0x54, "MOV", "D", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 116 { 0x55, "MOV", "D", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 117 { 0x56, "MOV", "D", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 118 { 0x57, "MOV", "D", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 119 { 0x58, "MOV", "E", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 120 { 0x59, "MOV", "E", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 121 { 0x5a, "MOV", "E", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 122 { 0x5b, "MOV", "E", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 123 { 0x5c, "MOV", "E", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 124 { 0x5d, "MOV", "E", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 125 { 0x5e, "MOV", "E", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 126 { 0x5f, "MOV", "E", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 127 { 0x60, "MOV", "H", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 128 { 0x61, "MOV", "H", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 129 { 0x62, "MOV", "H", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 130 { 0x63, "MOV", "H", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 131 { 0x64, "MOV", "H", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 132 { 0x65, "MOV", "H", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 133 { 0x66, "MOV", "H", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 134 { 0x67, "MOV", "H", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 135 { 0x68, "MOV", "L", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 136 { 0x69, "MOV", "L", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 137 { 0x6a, "MOV", "L", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 138 { 0x6b, "MOV", "L", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 139 { 0x6c, "MOV", "L", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 140 { 0x6d, "MOV", "L", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 141 { 0x6e, "MOV", "L", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 142 { 0x6f, "MOV", "L", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 143 { 0x70, "MOV", "M", "B", ARG_STR, ARG_STR, 1, 7, 0 }, 144 { 0x71, "MOV", "M", "C", ARG_STR, ARG_STR, 1, 7, 0 }, 145 { 0x72, "MOV", "M", "D", ARG_STR, ARG_STR, 1, 7, 0 }, 146 { 0x73, "MOV", "M", "E", ARG_STR, ARG_STR, 1, 7, 0 }, 147 { 0x74, "MOV", "M", "H", ARG_STR, ARG_STR, 1, 7, 0 }, 148 { 0x75, "MOV", "M", "L", ARG_STR, ARG_STR, 1, 7, 0 }, 149 { 0x76, "HLT", NULL, NULL, ARG_NONE, ARG_NONE, 1, 7, 0 }, 150 { 0x77, "MOV", "M", "A", ARG_STR, ARG_STR, 1, 7, 0 }, 151 { 0x78, "MOV", "A", "B", ARG_STR, ARG_STR, 1, 5, 0 }, 152 { 0x79, "MOV", "A", "C", ARG_STR, ARG_STR, 1, 5, 0 }, 153 { 0x7a, "MOV", "A", "D", ARG_STR, ARG_STR, 1, 5, 0 }, 154 { 0x7b, "MOV", "A", "E", ARG_STR, ARG_STR, 1, 5, 0 }, 155 { 0x7c, "MOV", "A", "H", ARG_STR, ARG_STR, 1, 5, 0 }, 156 { 0x7d, "MOV", "A", "L", ARG_STR, ARG_STR, 1, 5, 0 }, 157 { 0x7e, "MOV", "A", "M", ARG_STR, ARG_STR, 1, 7, 0 }, 158 { 0x7f, "MOV", "A", "A", ARG_STR, ARG_STR, 1, 5, 0 }, 159 { 0x80, "ADD", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 160 { 0x81, "ADD", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 161 { 0x82, "ADD", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 162 { 0x83, "ADD", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 163 { 0x84, "ADD", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 164 { 0x85, "ADD", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 165 { 0x86, "ADD", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 166 { 0x87, "ADD", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 167 { 0x88, "ADC", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 168 { 0x89, "ADC", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 169 { 0x8a, "ADC", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 170 { 0x8b, "ADC", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 171 { 0x8c, "ADC", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 172 { 0x8d, "ADC", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 173 { 0x8e, "ADC", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 174 { 0x8f, "ADC", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 175 { 0x90, "SUB", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 176 { 0x91, "SUB", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 177 { 0x92, "SUB", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 178 { 0x93, "SUB", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 179 { 0x94, "SUB", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 180 { 0x95, "SUB", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 181 { 0x96, "SUB", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 182 { 0x97, "SUB", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 183 { 0x98, "SBB", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 184 { 0x99, "SBB", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 185 { 0x9a, "SBB", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 186 { 0x9b, "SBB", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 187 { 0x9c, "SBB", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 188 { 0x9d, "SBB", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 189 { 0x9e, "SBB", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 190 { 0x9f, "SBB", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 191 { 0xa0, "ANA", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 192 { 0xa1, "ANA", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 193 { 0xa2, "ANA", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 194 { 0xa3, "ANA", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 195 { 0xa4, "ANA", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 196 { 0xa5, "ANA", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 197 { 0xa6, "ANA", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 198 { 0xa7, "ANA", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 199 { 0xa8, "XRA", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 200 { 0xa9, "XRA", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 201 { 0xaa, "XRA", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 202 { 0xab, "XRA", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 203 { 0xac, "XRA", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 204 { 0xad, "XRA", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 205 { 0xae, "XRA", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 206 { 0xaf, "XRA", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 207 { 0xb0, "ORA", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 208 { 0xb1, "ORA", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 209 { 0xb2, "ORA", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 210 { 0xb3, "ORA", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 211 { 0xb4, "ORA", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 212 { 0xb5, "ORA", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 213 { 0xb6, "ORA", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 214 { 0xb7, "ORA", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 215 { 0xb8, "CMP", "B", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 216 { 0xb9, "CMP", "C", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 217 { 0xba, "CMP", "D", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 218 { 0xbb, "CMP", "E", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 219 { 0xbc, "CMP", "H", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 220 { 0xbd, "CMP", "L", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 221 { 0xbe, "CMP", "M", NULL, ARG_STR, ARG_NONE, 1, 7, 0 }, 222 { 0xbf, "CMP", "A", NULL, ARG_STR, ARG_NONE, 1, 4, 0 }, 223 { 0xc0, "RNZ", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 224 { 0xc1, "POP", "BC", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 225 { 0xc2, "JNZ", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 226 { 0xc3, "JMP", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP }, 227 { 0xc4, "CNZ", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 228 { 0xc5, "PUSH", "BC", NULL, ARG_STR, ARG_NONE, 1, 11, 0 }, 229 { 0xc6, "ADI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 230 { 0xc7, "RST", "0", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 231 { 0xc8, "RZ", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 232 { 0xc9, "RET", NULL, NULL, ARG_NONE, ARG_NONE, 1, 10, E8080_OPF_RET }, 233 { 0xca, "JZ", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 234 { 0xcb, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 235 { 0xcc, "CZ", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 236 { 0xcd, "CALL", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL }, 237 { 0xce, "ACI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 238 { 0xcf, "RST", "1", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 239 { 0xd0, "RNC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 240 { 0xd1, "POP", "DE", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 241 { 0xd2, "JNC", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 242 { 0xd3, "OUT", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 10, 0 }, 243 { 0xd4, "CNC", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 244 { 0xd5, "PUSH", "DE", NULL, ARG_STR, ARG_NONE, 1, 11, 0 }, 245 { 0xd6, "SUI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 246 { 0xd7, "RST", "2", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 247 { 0xd8, "RC", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 248 { 0xd9, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 249 { 0xda, "JC", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 250 { 0xdb, "IN", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 10, 0 }, 251 { 0xdc, "CC", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 252 { 0xdd, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 253 { 0xde, "SBI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 254 { 0xdf, "RST", "3", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 255 { 0xe0, "RPO", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 256 { 0xe1, "POP", "HL", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 257 { 0xe2, "JPO", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 258 { 0xe3, "XTHL", NULL, NULL, ARG_NONE, ARG_NONE, 1, 18, 0 }, 259 { 0xe4, "CPO", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 260 { 0xe5, "PUSH", "HL", NULL, ARG_STR, ARG_NONE, 1, 11, 0 }, 261 { 0xe6, "ANI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 262 { 0xe7, "RST", "4", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 263 { 0xe8, "RPE", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 264 { 0xe9, "PCHL", NULL, NULL, ARG_NONE, ARG_NONE, 1, 5, E8080_OPF_JMP }, 265 { 0xea, "JPE", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 266 { 0xeb, "XCHG", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 267 { 0xec, "CPE", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 268 { 0xed, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 269 { 0xee, "XRI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 270 { 0xef, "RST", "5", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 271 { 0xf0, "RP", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 272 { 0xf1, "POP", "AF", NULL, ARG_STR, ARG_NONE, 1, 10, 0 }, 273 { 0xf2, "JP", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 274 { 0xf3, "DI", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 275 { 0xf4, "CP", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 276 { 0xf5, "PUSH", "AF", NULL, ARG_STR, ARG_NONE, 1, 11, 0 }, 277 { 0xf6, "ORI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 278 { 0xf7, "RST", "6", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL }, 279 { 0xf8, "RM", NULL, NULL, ARG_NONE, ARG_NONE, 1, 11, E8080_OPF_RET | E8080_OPF_COND }, 280 { 0xf9, "SPHL", NULL, NULL, ARG_NONE, ARG_NONE, 1, 5, 0 }, 281 { 0xfa, "JM", NULL, NULL, ARG_JP16, ARG_NONE, 3, 10, E8080_OPF_JMP | E8080_OPF_COND }, 282 { 0xfb, "EI", NULL, NULL, ARG_NONE, ARG_NONE, 1, 4, 0 }, 283 { 0xfc, "CM", NULL, NULL, ARG_JP16, ARG_NONE, 3, 17, E8080_OPF_CALL | E8080_OPF_COND }, 284 { 0xfd, "DB", NULL, NULL, ARG_OPC8, ARG_NONE, 1, 4, E8080_OPF_UND }, 285 { 0xfe, "CPI", NULL, NULL, ARG_IMM8, ARG_NONE, 2, 7, 0 }, 286 { 0xff, "RST", "7", NULL, ARG_STR, ARG_NONE, 1, 11, E8080_OPF_CALL } 287}; 288 289 290static 291int e8080_disasm_arg (char *dst, const unsigned char *src, const char *str, unsigned arg) 292{ 293 switch (arg) { 294 case ARG_STR: 295 strcpy (dst, str); 296 return (0); 297 298 case ARG_OPC8: 299 sprintf (dst, "%02X", src[0]); 300 return (0); 301 302 case ARG_IMM8: 303 sprintf (dst, "%02X", src[1]); 304 return (0); 305 306 case ARG_AD16: 307 case ARG_IM16: 308 case ARG_JP16: 309 sprintf (dst, "%04X", e8080_uint16 (src[1], src[2])); 310 return (0); 311 } 312 313 return (1); 314} 315 316void e8080_disasm (e8080_disasm_t *op, const unsigned char *src, unsigned short pc) 317{ 318 unsigned i, n; 319 e8080_dop_t *tab; 320 321 tab = &doptab[src[0] & 0xff]; 322 323 op->pc = pc; 324 op->flags = tab->flags; 325 op->data_cnt = tab->size; 326 327 for (i = 0; i < tab->size; i++) { 328 op->data[i] = src[i]; 329 } 330 331 strcpy (op->op, tab->mnemonic); 332 333 n = 0; 334 335 if (e8080_disasm_arg (op->arg[n], src, tab->arg1s, tab->arg1) == 0) { 336 n += 1; 337 } 338 339 if (e8080_disasm_arg (op->arg[n], src, tab->arg2s, tab->arg2) == 0) { 340 n += 1; 341 } 342 343 op->arg_cnt = n; 344} 345 346void e8080_disasm_mem (e8080_t *c, e8080_disasm_t *op, unsigned short pc) 347{ 348 unsigned i; 349 unsigned char src[4]; 350 351 for (i = 0; i < 4; i++) { 352 src[i] = e8080_get_mem8 (c, (pc + i) & 0xffff); 353 } 354 355 e8080_disasm (op, src, pc); 356} 357 358void e8080_disasm_cur (e8080_t *c, e8080_disasm_t *op) 359{ 360 e8080_disasm_mem (c, op, e8080_get_pc (c)); 361}