/*
Copyright (C) 1998 T. Scott Dattalo
This file is part of gpsim.
gpsim 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.
gpsim 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 gpsim; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef __P16X7X_H__
#define __P16X7X_H__
#include "p16x6x.h" /* The '7x stuff is like '6x stuff with a/d converters */
#include "pir.h"
#include "a2dconverter.h"
#include "pm_rd.h"
//---------------------------------------------------------
class P16C71 : public P16C61
{
public:
ADCON0 adcon0;
ADCON1 adcon1;
ADRES adres;
virtual PROCESSOR_TYPE isa(){return _P16C71_;};
virtual void create_symbols();
virtual unsigned int program_memory_size() const { return 0x400; };
virtual void create_sfr_map();
P16C71(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
private:
// This is not a real PIR register, but only one that allows the A2D Interrupt
// flag be processed in manner similar to other processors.
class PIR_16C71;
PIR_16C71 *m_pir;
};
class P16C712 : public P16C62
{
public:
ADCON0 adcon0;
ADCON1 adcon1;
ADRES adres;
virtual PROCESSOR_TYPE isa(){return _P16C712_;};
virtual void create_sfr_map();
P16C712(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
virtual bool hasSSP() { return false; }
};
class P16C716 : public P16C712
{
public:
virtual PROCESSOR_TYPE isa(){return _P16C716_;};
virtual unsigned int program_memory_size() const { return 0x800; };
P16C716(const char *_name=0, const char *desc=0);
static Processor *construct(const char *name);
};
class P16C72 : public P16C62
{
public:
// XXX
// This pir1_2, pir2_2 stuff is not particularly pretty. It would be
// better to just tell C++ to redefine pir1 and pir2 and PIR1v2 and
// PIR2v2, but C++ only supports covariance in member function return
// values.
PIR1v2 pir1_2_reg;
PIR2v2 pir2_2_reg;
PIR_SET_2 pir_set_2_def;
ADCON0_withccp adcon0;
ADCON1 adcon1;
ADRES adres;
virtual PROCESSOR_TYPE isa(){return _P16C72_;};
virtual void create_symbols();
void create_sfr_map();
virtual PIR *get_pir1() { return (&pir1_2_reg); }
virtual PIR *get_pir2() { return (&pir2_2_reg); }
virtual PIR_SET *get_pir_set() { return (&pir_set_2_def); }
P16C72(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
};
class P16C73 : public P16C63
{
public:
// XXX
// This pir1_2, pir2_2 stuff is not particularly pretty. It would be
// better to just tell C++ to redefine pir1 and pir2 and PIR1v2 and
// PIR2v2, but C++ only supports covariance in member function return
// values.
PIR1v2 pir1_2_reg;
PIR2v2 pir2_2_reg;
PIR_SET_2 pir_set_2_def;
ADCON0_withccp adcon0;
ADCON1 adcon1;
ADRES adres;
virtual PROCESSOR_TYPE isa(){return _P16C73_;};
virtual void create_symbols();
void create_sfr_map();
virtual PIR *get_pir1() { return (&pir1_2_reg); }
virtual PIR *get_pir2() { return (&pir2_2_reg); }
virtual PIR_SET *get_pir_set() { return (&pir_set_2_def); }
P16C73(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
};
class P16F73 : public P16C73
{
public:
virtual PROCESSOR_TYPE isa(){return _P16F73_;};
virtual unsigned int register_memory_size () const { return 0x200;};
virtual void create_symbols();
void create_sfr_map();
P16F73(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
protected:
PM_RD pm_rd;
};
//---------------------------------------------------------
class P16C74 : public P16C65 // Not a typo, a 'c74 is more like a 'c65 then a 'c64!
{
public:
// XXX
// This pir1_2, pir2_2 stuff is not particularly pretty. It would be
// better to just tell C++ to redefine pir1 and pir2 and PIR1v2 and
// PIR2v2, but C++ only supports covariance in member function return
// values.
PIR1v2 pir1_2_reg;
PIR2v2 pir2_2_reg;
PIR_SET_2 pir_set_2_def;
ADCON0_withccp adcon0;
ADCON1 adcon1;
ADRES adres;
virtual PROCESSOR_TYPE isa(){return _P16C74_;};
virtual void create_symbols();
void create_sfr_map();
virtual PIR *get_pir1() { return (&pir1_2_reg); }
virtual PIR *get_pir2() { return (&pir2_2_reg); }
virtual PIR_SET *get_pir_set() { return (&pir_set_2_def); }
virtual unsigned int program_memory_size() const { return 0x1000; };
P16C74(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
};
class P16F74 : public P16C74
{
public:
virtual PROCESSOR_TYPE isa(){return _P16F74_;};
virtual unsigned int register_memory_size () const { return 0x200;};
virtual void create_symbols();
void create_sfr_map();
P16F74(const char *_name=0, const char *desc=0);
void create();
static Processor *construct(const char *name);
protected:
PM_RD pm_rd;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1