/*
** cpu.h 650x/65C02/6510/6280 cpu-description header-file
** (c) in 2002,2008,2009,2014,2018,2020 by Frank Wille
*/

#define BIGENDIAN 0
#define LITTLEENDIAN 1
#define VASM_CPU_650X 1

/* maximum number of operands for one mnemonic */
#define MAX_OPERANDS 3

/* maximum number of mnemonic-qualifiers per mnemonic */
#define MAX_QUALIFIERS 0

/* data type to represent a target-address */
typedef int32_t taddr;
typedef uint32_t utaddr;

/* minimum instruction alignment */
#define INST_ALIGN 1

/* default alignment for n-bit data */
#define DATA_ALIGN(n) 1

/* operand class for n-bit data definitions */
#define DATA_OPERAND(n) DATAOP

/* returns true when instruction is valid for selected cpu */
#define MNEMONIC_VALID(i) cpu_available(i)

/* we define two additional unary operations, '<' and '>' */
int ext_unary_type(char *);
int ext_unary_eval(int,taddr,taddr *,int);
int ext_find_base(symbol **,expr *,section *,taddr);
#define LOBYTE (LAST_EXP_TYPE+1)
#define HIBYTE (LAST_EXP_TYPE+2)
#define EXT_UNARY_NAME(s) (*s=='<'||*s=='>')
#define EXT_UNARY_TYPE(s) ext_unary_type(s)
#define EXT_UNARY_EVAL(t,v,r,c) ext_unary_eval(t,v,r,c)
#define EXT_FIND_BASE(b,e,s,p) ext_find_base(b,e,s,p)

/* type to store each operand */
typedef struct {
  int type;
  expr *value;
  utaddr dp;
} operand;


/* additional mnemonic data */
typedef struct {
  unsigned char opcode;
  unsigned char zp_opcode;  /* !=0 means optimization to zero page allowed */
  uint16_t available;
} mnemonic_extension;

/* available */
#define M6502    1       /* standard 6502 instruction set */
#define ILL      2       /* illegal 6502 instructions */
#define DTV      4       /* C64 DTV instruction set extension */
#define M65C02   8       /* basic 65C02 extensions on 6502 instruction set */
#define WDC02    16      /* WDC65C02 extensions on 65C02 instruction set */
#define CSGCE02  32      /* CSG65CE02 extensions on WDC65C02 instruction set */
#define HU6280   64      /* HuC6280 extensions on WDC65C02 instruction set */


/* adressing modes */
#define IMPLIED  0
#define ABS      1       /* $1234 */
#define ABSX     2       /* $1234,X */
#define ABSY     3       /* $1234,Y */
#define INDIR    4       /* ($1234) - JMP only */
#define INDX     5       /* ($12,X) */
#define INDY     6       /* ($12),Y */
#define DPINDIR  7       /* ($12) */
#define INDIRX   8       /* ($1234,X) - JMP only */
#define ZPAGE    9       /* add ZPAGE-ABS to optimize ABS/ABSX/ABSY */
#define ZPAGEX   10
#define ZPAGEY   11
#define RELJMP   12      /* B!cc/JMP construction */
#define REL      13      /* $1234 - 8-bit signed relative branch */
#define IMMED    14      /* #$12 */
#define WBIT     15      /* bit-number (WDC65C02) */
#define DATAOP   16      /* data operand */
#define ACCU     17      /* A */
#define DUMX     18      /* dummy X as 'second' operand */
#define DUMY     19      /* dummy Y as 'second' operand */


/* cpu-specific symbol-flags */
#define ZPAGESYM (RSRVD_C<<0)   /* symbol will reside in the zero/direct-page */


/* exported by cpu.c */
int cpu_available(int);
