/* tm.h
   Copyright (C) 1992, 1993 Free Software Foundation, Inc.

This file is part of Z8KSIM

Z8KSIM 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, or (at your option)
any later version.

Z8KSIM 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 Z8KZIM; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef _TM_H
#define _TM_H

#ifdef __FOOBEYGNUC__
typedef SFtype __attribute__ ((mode (SF)));
typedef DFtype __attribute__ ((mode (DF)));

typedef int HItype __attribute__ ((mode (HI)));
typedef int SItype __attribute__ ((mode (SI)));

typedef unsigned int UHItype __attribute__ ((mode (HI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
#else
typedef float SFtype;
typedef double DFtype;
typedef short int HItype;
typedef long int SItype;
typedef unsigned short UHItype ;
typedef unsigned int USItype ;
#endif

typedef struct UDIstruct
{
  USItype high;
  USItype low;
} UDItype;

#define BIG_ENDIAN_HOST
typedef unsigned int sim_phys_addr_type;
typedef unsigned int sim_logical_addr_type;

#define PAGE_POWER 23		/*  only one pages */

#define MAP_PHYSICAL_TO_LOGICAL(x)  (((x >> 8) & 0x7f0000) | (x & 0xffff))
#define MAP_LOGICAL_TO_PHYSICAL(x)  (((x <<8) & 0x7f000000) | (x & 0xffff))
#define REG_PC     17
#define REG_CYCLES 18
#define REG_INSTS  19
#define REG_TIME   20
#define REG_FP     21
#define REG_SP     22
#define REG_CCR    16

#define SET_REG(x,y)  set_reg(x,y)
#define SINGLE_STEP 1

#define PSW_CARRY context->carry
#define PSW_OP    context->op
#define PSW_OVERFLOW context->overflow
#define PSW_SIGN context->sign
#define PSW_ZERO context->zero
#define GET_PC()  context->pc
#define SET_PC(x) context->pc = x

struct op_info
{
  short int exec;
};

extern struct op_info op_info_table[];

typedef union
{
  unsigned short int word;

}

borw_type;

typedef struct state_struct
{
  unsigned short *memory;
  int carry;
  int sign;
  int zero;
  int overflow;
  int op;
  int cycles;

  borw_type regs[16];

  sim_phys_addr_type sometimes_pc;
#ifdef __GNUC__
  volatile
#endif
  int exception;

#define iwords_0  iwords0
#define iwords_1  iwords1
#define iwords_2  iwords2
#define iwords_3  iwords3

#define ibytes_0    (iwords_0>>8)
#define ibytes_1    (iwords_0&0xff)
#define ibytes_2    (iwords_1>>8)
#define ibytes_3    (iwords_1& 0xff)
#define ibytes_4    (iwords_2>>8)

  int insts;
  int ticks;

  int next_inst;
  int broken_flags;

  int srca;
  int srcb;
  int dst;
  int size;
}

sim_state_type;

#define CMP_FLAGS 100
#define TST_FLAGS 101
#endif

extern int get_word_mem_da PARAMS((sim_state_type *context, int addr)); 
extern int get_word_reg PARAMS((sim_state_type *context, int reg)); 
extern void support_call PARAMS((sim_state_type *context, int sc)); 
extern void tm_exception PARAMS((int x)); 
extern int tm_read_byte PARAMS((int x)); 
extern int tm_signal PARAMS((void)); 
extern void tm_state PARAMS((sim_state_type *x)); 
extern void tm_write_byte PARAMS((int x, int y)); 
extern void bfop_bad1 PARAMS(()); 
extern int fail PARAMS((sim_state_type *context, int v)); 
extern void fop_bad PARAMS((sim_state_type *context)); 
extern void sfop_bad1 PARAMS(()); 
extern void swap_long PARAMS((char *buf, int val)); 
extern void swap_word PARAMS((char *buf, int val)); 
extern void tm_fetch_register PARAMS((int regno, char *buf)); 
extern void tm_info_print PARAMS((sim_state_type *x)); 
extern void tm_resume PARAMS((int step)); 
extern void tm_store_register PARAMS((int regno, int value)); 


#ifndef __GNUC__
/* If were using gnuc then these will be inlined, so the prototypes 
 won't be right */
long int sitoptr PARAMS((long int si)); 
long int ptrtosi PARAMS((long int ptr)); 
void put_long_reg PARAMS((sim_state_type *context, int reg, int val)); 
void put_quad_reg PARAMS((sim_state_type *context, int reg, int val1, int val2)); 
void put_word_reg PARAMS((sim_state_type *context, int reg, int val)); 
SItype get_long_reg PARAMS((sim_state_type *context, int reg)); 
void put_byte_reg PARAMS((sim_state_type *context, int reg, int val)); 
int get_byte_reg PARAMS((sim_state_type *context, int reg)); 
void put_word_mem_da PARAMS((sim_state_type *context, int addr, int value)); 
unsigned char get_byte_mem_da PARAMS((sim_state_type *context, int addr)); 
void put_byte_mem_da PARAMS((sim_state_type *context, int addr, int value)); 
SItype get_long_mem_da PARAMS((sim_state_type *context, int addr)); 
void put_long_mem_da PARAMS((sim_state_type *context, int addr, int value)); 
int get_word_mem_ir PARAMS((sim_state_type *context, int reg)); 
void put_word_mem_ir PARAMS((sim_state_type *context, int reg, int value)); 
int get_byte_mem_ir PARAMS((sim_state_type *context, int reg)); 
void put_byte_mem_ir PARAMS((sim_state_type *context, int reg, int value)); 
int get_long_mem_ir PARAMS((sim_state_type *context, int reg)); 
void put_long_mem_ir PARAMS((sim_state_type *context, int reg, int value)); 
void put_long_mem_x PARAMS((sim_state_type *context, int base, int reg, int value)); 
void put_word_mem_x PARAMS((sim_state_type *context, int base, int reg, int value)); 
void put_byte_mem_x PARAMS((sim_state_type *context, int base, int reg, int value)); 
int get_word_mem_x PARAMS((sim_state_type *context, int base, int reg)); 
int get_byte_mem_x PARAMS((sim_state_type *context, int base, int reg)); 
int get_long_mem_x PARAMS((sim_state_type *context, int base, int reg)); 
int COND PARAMS((sim_state_type *context, int c)); 
void NORMAL_FLAGS PARAMS((sim_state_type *context, int size, int dst, int srca, int srcb)); 
void TEST_NORMAL_FLAGS PARAMS((sim_state_type *context, int size, int dst)); 
void put_ptr_long_reg PARAMS((sim_state_type *context, int reg, int val)); 
long int get_ptr_long_reg PARAMS((sim_state_type *context, int reg)); 
long int get_ptr_long_mem_ir PARAMS((sim_state_type *context, int reg)); 
long int get_ptr_long_mem_da PARAMS((sim_state_type *context, long int addr)); 
void put_ptr_long_mem_da PARAMS((sim_state_type *context, long int addr, long int ptr)); 
#endif