/*
    6809.h   	-	header for monitor and simulator
    Copyright (C) 2001  Arto Salmi

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/


#ifndef __M6809_H_
#define __M6809_H_ 1

#define R_A 1
#define R_B (1<<1)
#define R_AB (R_A|R_B)
#define R_D (1<<2)
#define R_X (1<<3)
#define R_Y (1<<4)
#define R_S (1<<5)
#define R_U (1<<6)
#define R_PC (1<<7)
#define R_DP (1<<8)
#define R_CC (1<<9)
#define R_H (1<<10)
#define R_N (1<<11)
#define R_Z (1<<12)
#define R_V (1<<13)
#define R_C (1<<14)
#define R_HNZVC (R_H|R_N|R_Z|R_V|R_C|R_E) /*TESTING*/
#define R_EFI (1<<15)
#define R_VAL (1<<16)
#define R_RES (1<<17)
#define R_MSN (1<<18)
#define R_LSN (1<<19)
#define R_EA  (1<<20)
#define R_CLOCKTICKS (1<<21)
#define R_ARG (1<<22)
#define R_E (1<<23)
#define R_F (1<<24)
#define R_I (1<<25)
#define R_Always (1<<26)
// remember to recompile 6809dasm.c whenever R_Always changes!
/* Only used in flush() code.  Don't flush pseudo-regs that are always lost after translating a single opcode. */


//#define R_FLUSH (((unsigned int)-1) & (~R_RES) & (~R_VAL) & (~R_EA) & (~R_ARG_ )
// #define R_FLUSH (R_A|R_B|R_X|R_Y|R_S|R_U|R_PC|R_DP|R_HNZVC|R_Always)
#define R_FLUSH (R_A|R_B|R_X|R_Y|R_S|R_U|R_PC|R_DP|R_HNZVC|R_CLOCKTICKS|R_Always)
typedef unsigned char UINT8;
typedef signed char INT8;

typedef unsigned short UINT16;
typedef signed short INT16;

typedef unsigned int UINT32;
typedef signed int INT32;

// CC=EFHINZVC
#define E_FLAG 0x80
#define F_FLAG 0x40
#define H_FLAG 0x20
#define I_FLAG 0x10
#define N_FLAG 0x08
#define Z_FLAG 0x04
#define V_FLAG 0x02
#define C_FLAG 0x01

extern UINT8 *memory;
extern int Gen_C;
extern int Gen_Switch;
extern int Do_Timing;
extern int Single_Step;

extern int Accessible;

/* 6809.c */
extern int VECTREX;
extern void translate6809 (int CodePC, int NextPC, int cycles);
extern void cpu_reset (void);
extern void dumpf(int def, int use, char *s, ...);

/* vectrex-regs.c */
extern char *Name[0x10000];
extern int In[0x10000], Out[0x10000], Trash[0x10000];
extern unsigned char DP_In[0x10000], DP_Out[0x10000];

extern void init_vectrex_bios(void);

#endif /* __M6809_H_ */