/* 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
