/*
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. */
#include "pic-processor.h"
#ifndef __12_BIT_PROCESSORS_H__
#define __12_BIT_PROCESSORS_H__
// forward references
class _12bit_processor;
class IOPIN;
class OptionTraceType;
extern instruction *disasm12 (pic_processor *cpu,unsigned int inst);
class _12bit_processor : public pic_processor
{
public:
#define WDTE 4
enum _12BIT_DEFINITIONS
{
PA0 = 1<<5, /* Program page preselect bits (in status) */
PA1 = 1<<6,
PA2 = 1<<7,
RP0 = 1<<5, /* Register page select bits (in fsr) */
RP1 = 1<<6
};
unsigned int pa_bits; /* a CPU dependent bit-mask defining which of the program
* page bits in the status register are significant. */
virtual void reset(RESET_TYPE r);
virtual void create_symbols();
virtual void por();
#define FILE_REGISTERS 0x100
virtual unsigned int register_memory_size () const { return FILE_REGISTERS;};
virtual void dump_registers();
virtual void tris_instruction(unsigned int tris_register){return;};
virtual void create();
virtual void create_config_memory();
virtual PROCESSOR_TYPE isa(){return _12BIT_PROCESSOR_;};
virtual PROCESSOR_TYPE base_isa(){return _12BIT_PROCESSOR_;};
virtual instruction * disasm (unsigned int address, unsigned int inst)
{
return disasm12(this, inst);
}
void interrupt() { return; };
// Declare a set of functions that will allow the base class to
// get information about the derived classes. NOTE, the values returned here
// will cause errors if they are used -- the derived classes must define their
// parameters appropriately.
virtual unsigned int program_memory_size(){ return 3; }; // A bogus value that will cause errors if used
// The size of a program memory bank is 2^11 bytes for the 12-bit core
virtual void create_sfr_map() { return;};
// Return the portion of pclath that is used during branching instructions
// Actually, the 12bit core has no pclath. However, the program counter class doesn't need
// to know that. Thus this virtual function really just returns the code page for the
// 12bit cores.
virtual unsigned int get_pclath_branching_jump()
{
return ((status->value.get() & pa_bits) << 4);
}
// The modify pcl type instructions execute exactly like call instructions
virtual unsigned int get_pclath_branching_modpcl()
{
return ((status->value.get() & pa_bits) << 4);
}
// The valid bits in the FSR register vary across the various 12-bit devices
virtual unsigned int fsr_valid_bits()
{
return 0x1f; // Assume only 32 register addresses
}
virtual unsigned int fsr_register_page_bits()
{
return 0; // Assume only one register page.
}
virtual void option_new_bits_6_7(unsigned int);
virtual unsigned int config_word_address() const {return 0xfff;};
virtual bool set_config_word(unsigned int address, unsigned int cfg_word);
_12bit_processor(const char *_name=0, const char *desc=0);
virtual ~_12bit_processor();
protected:
OptionTraceType *mOptionTT;
};
#define cpu12 ( (_12bit_processor *)cpu)
#endif
syntax highlighted by Code2HTML, v. 0.9.1