ack/plat/cpm/emu/dis8080.c

379 lines
10 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "intel_8080_emulator.h"
#include "dis8080.h"
enum
{
NOTHING,
CONST8,
CONST16,
};
struct insn
{
const char* name;
int operand;
};
static struct insn insns[0x100] =
{
/* 00-07 */
{ "nop", NOTHING },
{ "lxi b, 0x%04x", CONST16 },
{ "stax b", NOTHING },
{ "inx b", NOTHING },
{ "inr b", NOTHING },
{ "dcr b", NOTHING },
{ "mvi b, 0x%02x", CONST8 },
{ "rlc", NOTHING },
/* 08-0f */
{ "undef", NOTHING },
{ "dad b", NOTHING },
{ "ldax b", NOTHING },
{ "dcx b", NOTHING },
{ "inr c", NOTHING },
{ "dcr c", NOTHING },
{ "mvi c, 0x%02x", CONST8 },
{ "rrc", NOTHING },
/* 10-17 */
{ "nop", NOTHING },
{ "lxi d, 0x%04x", CONST16 },
{ "stax d", NOTHING },
{ "inx d", NOTHING },
{ "inr d", NOTHING },
{ "dcr d", NOTHING },
{ "mvi d, 0x%02x", CONST8 },
{ "ral", NOTHING },
/* 18-1f */
{ "undef", NOTHING },
{ "dad d", NOTHING },
{ "ldax d", NOTHING },
{ "dcx d", NOTHING },
{ "inr e", NOTHING },
{ "dcr e", NOTHING },
{ "mvi e, 0x%02x", CONST8 },
{ "rar", NOTHING },
/* 20-27 */
{ "nop", NOTHING },
{ "lxi h, 0x%04x", CONST16 },
{ "shld 0x%04x", CONST16 },
{ "inx h", NOTHING },
{ "inr h", NOTHING },
{ "dcr h", NOTHING },
{ "mvi h, 0x%02x", CONST8 },
{ "daa", NOTHING },
/* 28-2f */
{ "undef", NOTHING },
{ "dad h", NOTHING },
{ "lhld 0x%04x", CONST16 },
{ "dcx h", NOTHING },
{ "inr l", NOTHING },
{ "dcr l", NOTHING },
{ "mvi l, 0x%02x", CONST8 },
{ "cma", NOTHING },
/* 30-37 */
{ "nop", NOTHING },
{ "lxi sp, 0x%04x", CONST16 },
{ "sta 0x%04x", CONST16 },
{ "inx sp", NOTHING },
{ "inr m", NOTHING },
{ "dcr m", NOTHING },
{ "mvi m, 0x%02x", CONST8 },
{ "stc", NOTHING },
/* 38-3f */
{ "undef", NOTHING },
{ "dad sp", NOTHING },
{ "lda 0x%04x", CONST16 },
{ "dcx sp", NOTHING },
{ "inr a", NOTHING },
{ "dcr a", NOTHING },
{ "mvi a, 0x%02x", CONST8 },
{ "cmc", NOTHING },
/* 40-47 */
{ "mov b, b", NOTHING },
{ "mov b, c", NOTHING },
{ "mov b, d", NOTHING },
{ "mov b, e", NOTHING },
{ "mov b, h", NOTHING },
{ "mov b, l", NOTHING },
{ "mov b, m", NOTHING },
{ "mov b, a", NOTHING },
/* 47-4f */
{ "mov c, b", NOTHING },
{ "mov c, c", NOTHING },
{ "mov c, d", NOTHING },
{ "mov c, e", NOTHING },
{ "mov c, h", NOTHING },
{ "mov c, l", NOTHING },
{ "mov c, m", NOTHING },
{ "mov c, a", NOTHING },
/* 50-57 */
{ "mov d, b", NOTHING },
{ "mov d, c", NOTHING },
{ "mov d, d", NOTHING },
{ "mov d, e", NOTHING },
{ "mov d, h", NOTHING },
{ "mov d, l", NOTHING },
{ "mov d, m", NOTHING },
{ "mov d, a", NOTHING },
/* 57-5f */
{ "mov e, b", NOTHING },
{ "mov e, c", NOTHING },
{ "mov e, d", NOTHING },
{ "mov e, e", NOTHING },
{ "mov e, h", NOTHING },
{ "mov e, l", NOTHING },
{ "mov e, m", NOTHING },
{ "mov e, a", NOTHING },
/* 60-67 */
{ "mov h, b", NOTHING },
{ "mov h, c", NOTHING },
{ "mov h, d", NOTHING },
{ "mov h, e", NOTHING },
{ "mov h, h", NOTHING },
{ "mov h, l", NOTHING },
{ "mov h, m", NOTHING },
{ "mov h, a", NOTHING },
/* 67-6f */
{ "mov l, b", NOTHING },
{ "mov l, c", NOTHING },
{ "mov l, d", NOTHING },
{ "mov l, e", NOTHING },
{ "mov l, h", NOTHING },
{ "mov l, l", NOTHING },
{ "mov l, m", NOTHING },
{ "mov l, a", NOTHING },
/* 70-77 */
{ "mov m, b", NOTHING },
{ "mov m, c", NOTHING },
{ "mov m, d", NOTHING },
{ "mov m, e", NOTHING },
{ "mov m, h", NOTHING },
{ "mov m, l", NOTHING },
{ "hlt", NOTHING },
{ "mov m, a", NOTHING },
/* 77-7f */
{ "mov a, b", NOTHING },
{ "mov a, c", NOTHING },
{ "mov a, d", NOTHING },
{ "mov a, e", NOTHING },
{ "mov a, h", NOTHING },
{ "mov a, l", NOTHING },
{ "mov a, m", NOTHING },
{ "mov a, a", NOTHING },
/* 80-87 */
{ "add b", NOTHING },
{ "add c", NOTHING },
{ "add d", NOTHING },
{ "add e", NOTHING },
{ "add h", NOTHING },
{ "add l", NOTHING },
{ "add m", NOTHING },
{ "add a", NOTHING },
/* 88-8f */
{ "adc b", NOTHING },
{ "adc c", NOTHING },
{ "adc d", NOTHING },
{ "adc e", NOTHING },
{ "adc h", NOTHING },
{ "adc l", NOTHING },
{ "adc m", NOTHING },
{ "adc a", NOTHING },
/* 90-97 */
{ "sub b", NOTHING },
{ "sub c", NOTHING },
{ "sub d", NOTHING },
{ "sub e", NOTHING },
{ "sub h", NOTHING },
{ "sub l", NOTHING },
{ "sub m", NOTHING },
{ "sub a", NOTHING },
/* 98-9f */
{ "sbb b", NOTHING },
{ "sbb c", NOTHING },
{ "sbb d", NOTHING },
{ "sbb e", NOTHING },
{ "sbb h", NOTHING },
{ "sbb l", NOTHING },
{ "sbb m", NOTHING },
{ "sbb a", NOTHING },
/* a0-a7 */
{ "ana b", NOTHING },
{ "ana c", NOTHING },
{ "ana d", NOTHING },
{ "ana e", NOTHING },
{ "ana h", NOTHING },
{ "ana l", NOTHING },
{ "ana m", NOTHING },
{ "ana a", NOTHING },
/* a8-af */
{ "xra b", NOTHING },
{ "xra c", NOTHING },
{ "xra d", NOTHING },
{ "xra e", NOTHING },
{ "xra h", NOTHING },
{ "xra l", NOTHING },
{ "xra m", NOTHING },
{ "xra a", NOTHING },
/* b0-b7 */
{ "ora b", NOTHING },
{ "ora c", NOTHING },
{ "ora d", NOTHING },
{ "ora e", NOTHING },
{ "ora h", NOTHING },
{ "ora l", NOTHING },
{ "ora m", NOTHING },
{ "ora a", NOTHING },
/* b8-bf */
{ "cmp b", NOTHING },
{ "cmp c", NOTHING },
{ "cmp d", NOTHING },
{ "cmp e", NOTHING },
{ "cmp h", NOTHING },
{ "cmp l", NOTHING },
{ "cmp m", NOTHING },
{ "cmp a", NOTHING },
/* c0-c7 */
{ "rnz", NOTHING },
{ "pop b", NOTHING },
{ "jnz 0x%04x", CONST16 },
{ "jmp 0x%04x", CONST16 },
{ "cnz 0x%04x", CONST16 },
{ "push b", NOTHING },
{ "adi 0x%02x", CONST8 },
{ "rst 0", NOTHING },
/* c8-cf */
{ "rz", NOTHING },
{ "ret", NOTHING },
{ "jz 0x%04x", CONST16 },
{ "*jmp 0x%04x", CONST16 },
{ "cz 0x%04x", CONST16 },
{ "call 0x%04x", CONST16 },
{ "aci 0x%02x", CONST8 },
{ "rst 1", NOTHING },
/* d0-d7 */
{ "rnc", NOTHING },
{ "pop d", NOTHING },
{ "jnc 0x%04x", CONST16 },
{ "out 0x%02x", CONST8 },
{ "cnc 0x%04x", CONST16 },
{ "push d", NOTHING },
{ "sui 0x%02x", CONST8 },
{ "rst 2", NOTHING },
/* d8-df */
{ "rc", NOTHING },
{ "*ret", NOTHING },
{ "jc 0x%04x", CONST16 },
{ "in 0x%02x", CONST8 },
{ "cc 0x%04x", CONST16 },
{ "*call 0x%04x", CONST16 },
{ "sbi 0x%02x", CONST8 },
{ "rst 3", NOTHING },
/* e0-e7 */
{ "rpo", NOTHING },
{ "pop h", NOTHING },
{ "jpo 0x%04x", CONST16 },
{ "xthl", NOTHING },
{ "cpo 0x%04x", CONST16 },
{ "push h", NOTHING },
{ "ani 0x%02x", CONST8 },
{ "rst 4", NOTHING },
/* e8-ef */
{ "rpe", NOTHING },
{ "pchl", NOTHING },
{ "jpe 0x%04x", CONST16 },
{ "xchg", NOTHING },
{ "cpe 0x%04x", CONST16 },
{ "*call 0x%04x", CONST16 },
{ "xri 0x%02x", CONST8 },
{ "rst 5", NOTHING },
/* f0-f7 */
{ "rp", NOTHING },
{ "pop psw", NOTHING },
{ "jp 0x%04x", CONST16 },
{ "di", NOTHING },
{ "cp 0x%04x", CONST16 },
{ "push psw", NOTHING },
{ "ori 0x%02x", CONST8 },
{ "rst 6", NOTHING },
/* f8-ff */
{ "rm", NOTHING },
{ "sphl", NOTHING },
{ "jm 0x%04x", CONST16 },
{ "ei", NOTHING },
{ "cm 0x%04x", CONST16 },
{ "*call 0x%04x", CONST16 },
{ "cpi 0x%02x", CONST8 },
{ "rst 7", NOTHING },
};
uint16_t i8080_disassemble(char* buffer, size_t bufsiz, uint16_t pc)
{
uint8_t opcode = i8080_read(pc);
uint8_t p1 = i8080_read(pc+1);
uint8_t p2 = i8080_read(pc+2);
struct insn* insn = &insns[opcode];
uint16_t value = 0;
const char* left = "";
snprintf(buffer, bufsiz, "%04x : ", pc);
pc++;
switch (insn->operand)
{
case NOTHING:
left = "%02x : ";
break;
case CONST8:
left = "%02x %02x : ";
value = p1;
pc++;
break;
case CONST16:
left = "%02x %02x %02x : ";
value = p1 | (p2<<8);
pc += 2;
break;
}
snprintf(buffer + 7, bufsiz - 7, left, opcode, p1, p2);
snprintf(buffer + 18, bufsiz - 18, insn->name, value);
return pc;
}