update to ida 7.6, add builds
This commit is contained in:
230
idasdk76/module/z80/i5.hpp
Normal file
230
idasdk76/module/z80/i5.hpp
Normal file
@@ -0,0 +1,230 @@
|
||||
/*
|
||||
* Interactive disassembler (IDA).
|
||||
* Version 2.06
|
||||
* Copyright (c) 1990-93 by Ilfak Guilfanov. (2:5020/209@fidonet)
|
||||
* ALL RIGHTS RESERVED.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef I5HPP
|
||||
#define I5HPP
|
||||
|
||||
#include "../idaidp.hpp"
|
||||
#include "ins.hpp"
|
||||
#include <diskio.hpp>
|
||||
#include "../iohandler.hpp"
|
||||
|
||||
//------------------------------------------------------------------
|
||||
// debugger functions
|
||||
typedef const regval_t &idaapi getreg_t(const char *name, const regval_t *regvalues);
|
||||
|
||||
//------------------------------------------------------------------
|
||||
// customization of insn_t structure:
|
||||
#define o_cond o_idpspec0
|
||||
|
||||
#define Cond reg
|
||||
|
||||
|
||||
//------------------------------------------------------------------
|
||||
enum opcond_t // condition code types
|
||||
{
|
||||
oc_nz,
|
||||
oc_z,
|
||||
oc_nc,
|
||||
oc_c,
|
||||
oc_po,
|
||||
oc_pe,
|
||||
oc_p,
|
||||
oc_m,
|
||||
oc_not
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------
|
||||
#define _PT_64180 0x01 // HD64180
|
||||
#define _PT_Z80 0x02 // Z80
|
||||
#define _PT_8085 0x04 // Intel 8085
|
||||
#define _PT_Z180 0x08 // Z180
|
||||
#define _PT_Z380 0x10 // Z380
|
||||
#define _PT_GB 0x20 // GameBoy
|
||||
|
||||
#define PT_GB _PT_GB
|
||||
#define PT_Z380 _PT_Z380
|
||||
#define PT_Z180 ( PT_Z380 | _PT_Z180)
|
||||
#define PT_64180 ( PT_Z180 | _PT_64180)
|
||||
#define PT_Z80 ( PT_64180| _PT_Z80 | _PT_GB)
|
||||
#define PT_8085 ( PT_Z80 | _PT_8085 )
|
||||
|
||||
extern int pflag;
|
||||
|
||||
enum RegNo ENUM_SIZE(uint16)
|
||||
{
|
||||
R_b = 0,
|
||||
R_c = 1,
|
||||
R_d = 2,
|
||||
R_e = 3,
|
||||
R_h = 4,
|
||||
R_l = 5,
|
||||
R_a = 7,
|
||||
R_bc = 8,
|
||||
R_de = 9,
|
||||
R_hl = 10,
|
||||
R_af = 11,
|
||||
R_sp = 12,
|
||||
R_ix = 13,
|
||||
R_iy = 14,
|
||||
R_af2 = 15,
|
||||
R_r = 16,
|
||||
R_i = 17,
|
||||
R_f = 18,
|
||||
R_xl = 19,
|
||||
R_xh = 20,
|
||||
R_yl = 21,
|
||||
R_yh = 22,
|
||||
|
||||
R_w,
|
||||
R_lw,
|
||||
R_ixl,
|
||||
R_ixu,
|
||||
R_dsr,
|
||||
R_xsr,
|
||||
R_iyl,
|
||||
R_iyu,
|
||||
R_ysr,
|
||||
R_sr,
|
||||
R_ib,
|
||||
R_iw,
|
||||
R_xm,
|
||||
R_lck,
|
||||
R_bc2,
|
||||
R_de2,
|
||||
R_hl2,
|
||||
R_ix2,
|
||||
R_iy2,
|
||||
R_b2,
|
||||
R_c2,
|
||||
R_d2,
|
||||
R_e2,
|
||||
R_h2,
|
||||
R_l2,
|
||||
R_m2,
|
||||
R_a2,
|
||||
|
||||
R_vcs, // virtual code segment register
|
||||
R_vds // virtual data segment register
|
||||
};
|
||||
|
||||
|
||||
//------------------------------------------------------------------
|
||||
#define UAS_NOENS 0x0001 // I5: don't specify start addr in the .end directive
|
||||
#define UAS_NPAIR 0x0002 // I5: pairs are denoted by 1 char ('b')
|
||||
#define UAS_UNDOC 0x0004 // I5: does assembler support undoc-d instrs?
|
||||
#define UAS_MKIMM 0x0008 // I5: place # in front of imm operand
|
||||
#define UAS_MKOFF 0x0010 // I5: offset(ix) form
|
||||
#define UAS_CNDUP 0x0020 // I5: conditions UPPERCASE
|
||||
#define UAS_FUNNY 0x0040 // I5: special for A80
|
||||
#define UAS_CSEGS 0x0080 // I5: generate 'cseg' directives
|
||||
#define UAS_TOFF 0x0100 // I5: (ix+-10)
|
||||
#define UAS_ZMASM 0x0200 // ZMASM
|
||||
#define UAS_GBASM 0x0400 // RGBASM
|
||||
|
||||
|
||||
#define aux_off16 0x0001 // o_displ: off16
|
||||
|
||||
//------------------------------------------------------------------
|
||||
struct z80_iohandler_t : public iohandler_t
|
||||
{
|
||||
z80_iohandler_t(netnode &nn) : iohandler_t(nn) {}
|
||||
};
|
||||
|
||||
struct insndesc_t;
|
||||
struct z80_t : public procmod_t
|
||||
{
|
||||
netnode helper;
|
||||
z80_iohandler_t ioh = z80_iohandler_t(helper);
|
||||
|
||||
int pflag = 0;
|
||||
int code;
|
||||
|
||||
uchar saved_value = 0;
|
||||
bool flow = false;
|
||||
bool isx = false;
|
||||
|
||||
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
|
||||
|
||||
const char *find_ioport(uval_t port);
|
||||
const char *find_ioport_bit(int port, int bit);
|
||||
void choose_device(int respinfo);
|
||||
|
||||
void set_cpu(int np);
|
||||
void load_from_idb();
|
||||
|
||||
const char *set_idp_options(const char *keyword, int /*value_type*/, const void * /*value*/, bool /*idb_loaded*/);
|
||||
|
||||
// out.cpp
|
||||
inline bool isFunny(void) { return (ash.uflag & UAS_FUNNY) != 0; }
|
||||
void i5_header(outctx_t &ctx);
|
||||
void i5_footer(outctx_t &ctx);
|
||||
void i5_segstart(outctx_t &ctx, segment_t *);
|
||||
|
||||
// ana.cpp
|
||||
int i5_ana(insn_t *_insn);
|
||||
void load_z80_operand(insn_t &insn, op_t &x, uchar op);
|
||||
bool search_map(insn_t &insn, const insndesc_t *map, uchar _code);
|
||||
bool z380_insns(insn_t &insn, const insndesc_t *map, const insndesc_t *cb);
|
||||
bool z380_ED(insn_t &insn);
|
||||
void z80_ixcommands(insn_t &insn, bool _isx);
|
||||
void z80_misc(insn_t &insn);
|
||||
void ConvertToZ80(insn_t &insn);
|
||||
void op_r1(op_t &x) const;
|
||||
void op_r2(op_t &x) const;
|
||||
void op_ss(op_t &x) const;
|
||||
void op_dd(op_t &x) const;
|
||||
void op_xdispl(insn_t &insn, op_t &x) const;
|
||||
void op_ix(op_t &x) const;
|
||||
void op_ibyte(op_t &x,int low) const;
|
||||
int op_xbytereg(op_t &x,uint16 mode) const;
|
||||
int op_xr1(op_t &x) const;
|
||||
int op_xr2(op_t &x) const;
|
||||
inline bool isGB(void);
|
||||
inline bool isZ380(void);
|
||||
inline bool isZ180(void);
|
||||
inline bool isZ80(void);
|
||||
inline bool is64180(void);
|
||||
inline bool is8085(void);
|
||||
|
||||
// emu.cpp
|
||||
int i5_emu(const insn_t &insn);
|
||||
void load_operand(const insn_t &insn, const op_t &x);
|
||||
sval_t named_regval(const char *regname, getreg_t *getreg, const regval_t *rv);
|
||||
sval_t regval(const op_t &op, getreg_t *getreg, const regval_t *rv);
|
||||
bool check_cond(uint16_t cc, getreg_t *getreg, const regval_t *regvalues);
|
||||
ea_t next_exec_insn(
|
||||
ea_t ea,
|
||||
getreg_t *getreg,
|
||||
const regval_t *regvalues);
|
||||
ea_t calc_step_over(ea_t ip) const;
|
||||
bool get_operand_info(
|
||||
idd_opinfo_t *opinf,
|
||||
ea_t ea,
|
||||
int n,
|
||||
getreg_t *getreg,
|
||||
const regval_t *regvalues);
|
||||
bool get_reg_info(
|
||||
const char **main_regname,
|
||||
bitrange_t *bitrange,
|
||||
const char *regname);
|
||||
};
|
||||
|
||||
extern int data_id;
|
||||
#define PROCMOD_NAME z80
|
||||
#define PROCMOD_NODE_NAME "$ " QSTRINGIZE(PROCMOD_NAME)
|
||||
|
||||
|
||||
inline bool z80_t::isGB(void) { return (pflag & PT_GB) != 0; }
|
||||
inline bool z80_t::isZ380(void) { return (pflag & PT_Z380) != 0; }
|
||||
inline bool z80_t::isZ180(void) { return (pflag & PT_Z180) != 0; }
|
||||
inline bool z80_t::isZ80(void) { return (pflag & PT_Z80) != 0; }
|
||||
inline bool z80_t::is64180(void) { return (pflag & PT_64180) != 0; }
|
||||
inline bool z80_t::is8085(void) { return !isZ80(); }
|
||||
|
||||
#endif // I5HPP
|
||||
Reference in New Issue
Block a user