main z80inst.h
  1/*
  2 Copyright 2013 Michael Pavone
  3 This file is part of BlastEm. 
  4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
  5*/
  6#ifndef Z80INST_H_
  7#define Z80INST_H_
  8
  9#include <stdint.h>
 10
 11enum {
 12	Z80_LD,
 13	Z80_PUSH,
 14	Z80_POP,
 15	Z80_EX,
 16	Z80_EXX,
 17	Z80_LDI,
 18	Z80_LDIR,
 19	Z80_LDD,
 20	Z80_LDDR,
 21	Z80_CPI,
 22	Z80_CPIR,
 23	Z80_CPD,
 24	Z80_CPDR,
 25	Z80_ADD,
 26	Z80_ADC,
 27	Z80_SUB,
 28	Z80_SBC,
 29	Z80_AND,
 30	Z80_OR,
 31	Z80_XOR,
 32	Z80_CP,
 33	Z80_INC,
 34	Z80_DEC,
 35	Z80_DAA,
 36	Z80_CPL,
 37	Z80_NEG,
 38	Z80_CCF,
 39	Z80_SCF,
 40	Z80_NOP,
 41	Z80_HALT,
 42	Z80_DI,
 43	Z80_EI,
 44	Z80_IM,
 45	Z80_RLC,
 46	Z80_RL,
 47	Z80_RRC,
 48	Z80_RR,
 49	Z80_SLA,
 50	Z80_SRA,
 51	Z80_SLL,
 52	Z80_SRL,
 53	Z80_RLD,
 54	Z80_RRD,
 55	Z80_BIT,
 56	Z80_SET,
 57	Z80_RES,
 58	Z80_JP,
 59	Z80_JPCC,
 60	Z80_JR,
 61	Z80_JRCC,
 62	Z80_DJNZ,
 63	Z80_CALL,
 64	Z80_CALLCC,
 65	Z80_RET,
 66	Z80_RETCC,
 67	Z80_RETI,
 68	Z80_RETN,
 69	Z80_RST,
 70	Z80_IN,
 71	Z80_INI,
 72	Z80_INIR,
 73	Z80_IND,
 74	Z80_INDR,
 75	Z80_OUT,
 76	Z80_OUTI,
 77	Z80_OTIR,
 78	Z80_OUTD,
 79	Z80_OTDR,
 80	Z80_USE_MAIN
 81};
 82
 83enum {
 84	Z80_C=0,
 85	Z80_B,
 86	Z80_E,
 87	Z80_D,
 88	Z80_L,
 89	Z80_H,
 90	Z80_IXL,
 91	Z80_IXH,
 92	Z80_IYL,
 93	Z80_IYH,
 94	Z80_I,
 95	Z80_R,
 96	Z80_A,
 97	Z80_BC,
 98	Z80_DE,
 99	Z80_HL,
100	Z80_SP,
101	Z80_AF,
102	Z80_IX,
103	Z80_IY,
104	Z80_UNUSED
105};
106
107#define Z80_IMMED_FLAG 0x80
108#define Z80_USE_IMMED (Z80_IMMED_FLAG|Z80_UNUSED)
109
110enum {
111	Z80_CC_NZ,
112	Z80_CC_Z,
113	Z80_CC_NC,
114	Z80_CC_C,
115	Z80_CC_PO,
116	Z80_CC_PE,
117	Z80_CC_P,
118	Z80_CC_M
119};
120
121enum {
122	Z80_REG,
123	Z80_REG_INDIRECT,
124	Z80_IMMED,
125	Z80_IMMED_INDIRECT,
126	Z80_IX_DISPLACE,
127	Z80_IY_DISPLACE
128};
129#define Z80_DIR 0x80
130
131typedef struct {
132	uint8_t  op;
133	uint8_t  reg;
134	uint8_t  addr_mode;
135	uint8_t  ea_reg;
136	uint16_t immed;
137	uint16_t  opcode_bytes;
138} z80inst;
139
140uint8_t * z80_decode(uint8_t * istream, z80inst * decoded);
141int z80_disasm(z80inst * decoded, char * dst, uint16_t address);
142uint8_t z80_high_reg(uint8_t reg);
143uint8_t z80_low_reg(uint8_t reg);
144uint8_t z80_word_reg(uint8_t reg);
145uint8_t z80_is_terminal(z80inst * inst);
146
147#endif //Z80INST_H_
148