/*
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 __16_BIT_PROCESSORS_H__
#define __16_BIT_PROCESSORS_H__
#include "pic-processor.h"
#include "pic-ioports.h"
#include "intcon.h"
#include "16bit-registers.h"
#include "16bit-tmrs.h"
#include "pir.h"
#include "uart.h"
#include "a2dconverter.h"
#include "value.h"
// forward references
extern instruction *disasm16 (pic_processor *cpu, unsigned int address, unsigned int inst);
class ConfigMemory;
//------------------------------------------------------------------------
//
// pic_processor
// |
// \__ _16bit_processor
//
// Base class for the 16bit PIC processors
//
class _16bit_processor : public pic_processor
{
public:
static const unsigned int CONFIG1L = 0x300000;
static const unsigned int CONFIG1H = 0x300001;
static const unsigned int CONFIG2L = 0x300002;
static const unsigned int CONFIG2H = 0x300003;
static const unsigned int CONFIG3L = 0x300004;
static const unsigned int CONFIG3H = 0x300005;
static const unsigned int CONFIG4L = 0x300006;
static const unsigned int CONFIG4H = 0x300007;
static const unsigned int CONFIG5L = 0x300008;
static const unsigned int CONFIG5H = 0x300009;
static const unsigned int CONFIG6L = 0x30000A;
static const unsigned int CONFIG6H = 0x30000B;
static const unsigned int CONFIG7L = 0x30000C;
static const unsigned int CONFIG7H = 0x30000D;
// So far, all 18xxx parts contain ports A,B,C
PicPortRegister *m_porta;
PicTrisRegister *m_trisa;
PicLatchRegister *m_lata;
PicPortRegister *m_portb;
PicTrisRegister *m_trisb;
PicLatchRegister *m_latb;
PicPortRegister *m_portc;
PicTrisRegister *m_trisc;
PicLatchRegister *m_latc;
ADCON0_16 adcon0;
ADCON1 adcon1;
ADRES adresl;
ADRES adresh;
INTCON_16 intcon;
INTCON2 intcon2;
INTCON3 intcon3;
BSR bsr;
TMR0_16 tmr0l;
TMR0H tmr0h;
T0CON t0con;
RCON rcon;
PIR1v2 pir1;
sfr_register ipr1;
sfr_register ipr2;
T1CON t1con;
PIE pie1;
PIR2v2 pir2;
PIE pie2;
T2CON t2con;
PR2 pr2;
TMR2 tmr2;
TMRL tmr1l;
TMRH tmr1h;
CCPCON ccp1con;
CCPRL ccpr1l;
CCPRH ccpr1h;
CCPCON ccp2con;
CCPRL ccpr2l;
CCPRH ccpr2h;
TMR3L tmr3l;
TMR3H tmr3h;
T3CON t3con;
PIR_SET_2 pir_set_def;
OSCCON osccon;
LVDCON lvdcon;
WDTCON wdtcon;
sfr_register prodh,prodl;
sfr_register pclatu;
Fast_Stack fast_stack;
Indirect_Addressing ind0;
Indirect_Addressing ind1;
Indirect_Addressing ind2;
USART_MODULE usart;
Stack16 stack16;
TBL_MODULE tbl;
TMR2_MODULE tmr2_module;
TMR3_MODULE tmr3_module;
SSP_MODULE ssp;
virtual void create_symbols();
void interrupt();
virtual void por();
virtual void create();// {return;};
virtual PROCESSOR_TYPE isa(){return _16BIT_PROCESSOR_;};
virtual PROCESSOR_TYPE base_isa(){return _16BIT_PROCESSOR_;};
virtual instruction * disasm (unsigned int address, unsigned int inst)
{
return disasm16(this, address, inst);
}
virtual void create_sfr_map();
virtual void create_config_memory();
virtual void create_stack() {stack = &stack16;};
// Return the portion of pclath that is used during branching instructions
virtual unsigned int get_pclath_branching_jump()
{
return ((pclatu.value.get()<<16) | ((pclath->value.get() & 0xf8)<<8));
}
// Return the portion of pclath that is used during modify PCL instructions
virtual unsigned int get_pclath_branching_modpcl()
{
return ((pclatu.value.get()<<16) | ((pclath->value.get() & 0xff)<<8));
}
virtual void option_new_bits_6_7(unsigned int);
// 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 (in some cases)
// -- the derived classes must define their parameters appropriately.
virtual unsigned int register_memory_size () const { return 0x1000;};
//virtual void set_out_of_range_pm(unsigned int address, unsigned int value);
virtual void create_iopin_map();
virtual int map_pm_address2index(int address) {return address/2;};
virtual int map_pm_index2address(int index) {return index*2;};
virtual unsigned int get_program_memory_at_address(unsigned int address);
virtual unsigned int get_config_word(unsigned int address);
virtual bool set_config_word(unsigned int address, unsigned int cfg_word);
virtual unsigned int configMemorySize() { return CONFIG7H-CONFIG1L+1; }
static pic_processor *construct();
_16bit_processor(const char *_name=0, const char *desc=0);
virtual ~_16bit_processor();
unsigned int getCurrentDisasmAddress() { return m_current_disasm_address;}
unsigned int getCurrentDisasmIndex() { return m_current_disasm_address/2;}
void setCurrentDisasmAddress(unsigned a) { m_current_disasm_address =a; }
protected:
unsigned int m_current_disasm_address; // Used only when .hex/.cod files are loaded
};
#define cpu16 ( (_16bit_processor *)cpu)
#endif
syntax highlighted by Code2HTML, v. 0.9.1