mirror of
https://github.com/elliotnunn/NetBoot.git
synced 2024-12-28 08:30:48 +00:00
97 lines
3.0 KiB
C
97 lines
3.0 KiB
C
/*
|
|
** 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);
|