Hogwarts Wand Docs: ../server/picsim.h

Wand Sourcecode: ../server/picsim.h

//
// picsim.h - PIC C simulator for embedding pic microcode into a C program
//
// Copyright (C) 2006  Nathan (Acorn) Pooley
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// version 2 as published by the Free Software Foundation.
// 
// This program 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 (gpl.txt) for more details. 
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
// 
// You can contact the author, Nathan (Acorn) Pooley, by writing
// to Nathan (Acorn) Pooley, 949 Buckeye Drive, Sunnyvale, CA  94086, USA
// or through the form at http://www.rawbw.com/~acorn/wand/feedback.html
//

//#@DOC@ PIC C simulator for embedding pic microcode into a C program

//###########################################################################
//############################### DEFINES ###################################
//###########################################################################

//
// Define a label for branch or goto
//
#define picLabel(label)     label:  picInst(0,0,PIC_LABEL,#label)

//
// define a constant
//
#define picEqu(var,val)     enum { var = val };

//
// Declare/define a register
//

#if 0
//
// Register declarations
//
// picRegDecl()   - declare reg & place in local variable of same name
// picRegFind()   - declare reg & return id
// picRegGlobal() - following regs are globals
// picRegLocal()  - namespace for following registers
// picRegShare()  - indicate 2 Local namespaces which cannot overlap
//
#define picRegDecl(name)    int name = picRegFind(picCurChip, #name)
#define picRegGlobal()
#define picRegLocal(namespace)
#define picRegShare(namespace1,namespace2)
#endif


//
// Register declarations
//
// picRegLocal()      - local register variable
// picRegReturn()     - function return value
// picRegParam()      - function parameter (pass data into function)
// picRegInOutParam() - function parameter & return value
// picRegGlobal()     - global register declaration (specify namespace)
//
// picRegId()         - find id of register
//
#define picRegLocal(name)       name = picRegFind(picCurChip, #name, \
                                                    picNamespaceLocal)
#define picRegReturn(name)      name = picRegFind(picCurChip, #name, \
                                                    picNamespaceReturn)
#define picRegParam(name)       name = picRegFind(picCurChip, #name, \
                                                    picNamespaceParam)
#define picRegInOutParam(name)  name = picRegFind(picCurChip, #name, \
                                                    picNamespaceInOutParam)
#define picRegGlobal(name,namespace)   name = picRegFind(picCurChip, #name, \
                                                    namespace)
#define picRegId(name) picRegFind(picCurChip, #name, picNamespaceInOutParam)



//
// HIGH and LOW operators
//
#define UPPER(val)  (((val) >> 16) & 0xff)
#define HIGH(val)   (((val) >>  8) & 0xff)
#define LOW(val)    (((val)      ) & 0xff)

//
// Shortcuts for getting reg value
//
#define picRV(id)               picRegValU(0,id)
#define picRV16(idl,idh)        picRegValU32(0,idl,idh,-1,-1)
#define picRV24(idl,idh,idu)    picRegValU32(0,idl,idh,idu,-1)
#define picW()                  picRegValU(0,WREG)
#define picS()                  picRegValU(0,STATUS)
#define picFSR0()               picRV16(FSR0L,FSR0H)
#define picFSR1()               picRV16(FSR1L,FSR1H)
#define picFSR2()               picRV16(FSR2L,FSR2H)

//
// instruction set macros
//
#define nop()           picInst(0,0,PIC_NOP,0)

#define addwf(reg,dst)  picInst(reg,PICDST_##dst,PIC_ADDWF,0)
#define addwfc(reg,dst) picInst(reg,PICDST_##dst,PIC_ADDWFC,0)
#define andwf(reg,dst)  picInst(reg,PICDST_##dst,PIC_ANDWF,0)
#define comf(reg,dst)   picInst(reg,PICDST_##dst,PIC_COMF,0)
#define decf(reg,dst)   picInst(reg,PICDST_##dst,PIC_DECF,0)
#define incf(reg,dst)   picInst(reg,PICDST_##dst,PIC_INCF,0)
#define iorwf(reg,dst)  picInst(reg,PICDST_##dst,PIC_IORWF,0)
#define rlcf(reg,dst)   picInst(reg,PICDST_##dst,PIC_RLCF,0)
#define rlncf(reg,dst)  picInst(reg,PICDST_##dst,PIC_RLNCF,0)
#define rrcf(reg,dst)   picInst(reg,PICDST_##dst,PIC_RRCF,0)
#define rrncf(reg,dst)  picInst(reg,PICDST_##dst,PIC_RRNCF,0)
#define subfwb(reg,dst) picInst(reg,PICDST_##dst,PIC_SUBFWB,0)
#define subwf(reg,dst)  picInst(reg,PICDST_##dst,PIC_SUBWF,0)
#define subwfb(reg,dst) picInst(reg,PICDST_##dst,PIC_SUBWFB,0)
#define swapf(reg,dst)  picInst(reg,PICDST_##dst,PIC_SWAPF,0)
#define xorwf(reg,dst)  picInst(reg,PICDST_##dst,PIC_XORWF,0)
#define movf(reg,dst)   picInst(reg,PICDST_##dst,PIC_MOVF,0)

#define decfsz(reg,dst) picInst(reg,PICDST_##dst,PIC_DECFSZ,0)
#define dcfsnz(reg,dst) picInst(reg,PICDST_##dst,PIC_DCFSNZ,0)
#define incfsz(reg,dst) picInst(reg,PICDST_##dst,PIC_INCFSZ,0)
#define infsnz(reg,dst) picInst(reg,PICDST_##dst,PIC_INFSNZ,0)

#define movwf(reg)      picInst(reg,0,PIC_MOVWF,0)
#define movff(src,dst)  do { picInst(src,0,PIC_MOVFFa,0);   \
                             picInst(dst,0,PIC_MOVFFb,0); } while(0)

#define cpfseq(reg)     picInst(reg,0,PIC_CPFSEQ,0)
#define cpfsgt(reg)     picInst(reg,0,PIC_CPFSGT,0)
#define cpfslt(reg)     picInst(reg,0,PIC_CPFSLT,0)
#define tstfsz(reg)     picInst(reg,0,PIC_TSTFSZ,0)

#define clrf(reg)       picInst(reg,0,PIC_CLRF,0)
#define negf(reg)       picInst(reg,0,PIC_NEGF,0)
#define setf(reg)       picInst(reg,0,PIC_SETF,0)

#define mulwf(reg)      picInst(reg,0,PIC_MULWF,0)

#define bcf(reg,bit)    picInst(reg,PICDST_BIT##bit,PIC_BCF,#bit)
#define bsf(reg,bit)    picInst(reg,PICDST_BIT##bit,PIC_BSF,#bit)
#define btfsc(reg,bit)  picInst(reg,PICDST_BIT##bit,PIC_BTFSC,#reg "." #bit)
#define btfss(reg,bit)  picInst(reg,PICDST_BIT##bit,PIC_BTFSS,#reg "." #bit)
#define btg(reg,bit)    picInst(reg,PICDST_BIT##bit,PIC_BTG,#bit)

#define bc(label)       if (picInst(0,0,PIC_BC,#label)) goto label
#define bn(label)       if (picInst(0,0,PIC_BN,#label)) goto label
#define bnc(label)      if (picInst(0,0,PIC_BNC,#label)) goto label
#define bnn(label)      if (picInst(0,0,PIC_BNN,#label)) goto label
#define bnov(label)     if (picInst(0,0,PIC_BNOV,#label)) goto label
#define bnz(label)      if (picInst(0,0,PIC_BNZ,#label)) goto label
#define bov(label)      if (picInst(0,0,PIC_BOV,#label)) goto label
#define bz(label)       if (picInst(0,0,PIC_BZ,#label)) goto label
#define bra(label)      if (picInst(0,0,PIC_BRA,#label)) goto label
#define goto(label)     if (picInst(0,0,PIC_GOTO,#label)) goto label

#define call(func)      if (picInst(0,0,PIC_CALL,#func)) func()
#define rcall(func)     if (picInst(0,0,PIC_RCALL,#func)) func()
#define retfie(x)       if (picInst(0,x,PIC_RETFIE,0)) return
#define retlw(val)      if (picInst(0,val,PIC_RETLW,#val)) return
#define picReturn()     if (picInst(0,0,PIC_RETURN,0)) return

#define reset()         picInst(0,0,PIC_RESET,0)
#define sleep()         picInst(0,0,PIC_SLEEP,0)

#define clrwdt()        picInst(0,0,PIC_CLRWDT,0)
#define daw()           picInst(0,0,PIC_DAW,0)
#define pop()           picInst(0,0,PIC_POP,0)
#define push()          picInst(0,0,PIC_PUSH,0)

#define lfsr(reg,val)   do { picInst(reg##L,val,PIC_LFSRa,#val); \
                             picInst(reg##H,val,PIC_LFSRb,0); } while(0)
#define movlb(val)      picInst(0,val,PIC_MOVLB,0)

#define addlw(val)      picInst(0,val,PIC_ADDLW,0)
#define andlw(val)      picInst(0,val,PIC_ANDLW,0)
#define iorlw(val)      picInst(0,val,PIC_IORLW,0)
#define movlw(val)      picInst(0,val,PIC_MOVLW,0)
#define mullw(val)      picInst(0,val,PIC_MULLW,0)
#define sublw(val)      picInst(0,val,PIC_SUBLW,0)
#define xorlw(val)      picInst(0,val,PIC_XORLW,0)

#define tblrd()         picInst(0,0,PIC_TBLRD,0)
#define tblrd_postinc() picInst(0,0,PIC_TBLRD_POSTINC,0)
#define tblrd_postdec() picInst(0,0,PIC_TBLRD_POSTDEC,0)
#define tblrd_preinc()  picInst(0,0,PIC_TBLRD_PREINC,0)
#define tblwt()         picInst(0,0,PIC_TBLWT,0)
#define tblwt_postinc() picInst(0,0,PIC_TBLWT_POSTINC,0)
#define tblwt_postdec() picInst(0,0,PIC_TBLWT_POSTDEC,0)
#define tblwt_preinc()  picInst(0,0,PIC_TBLWT_PREINC,0)

#define picInst(reg, dst, op, str)  picInstDB(reg,dst,op,__FILE__,__LINE__,str)

//###########################################################################
//############################### TYPEDEFS ##################################
//###########################################################################

typedef struct picRegRec picReg;

typedef struct picChipRec picChip;

//
// Destinations
//
typedef enum picDestEnum {
    PICDST_NONE,
    PICDST_W,
    PICDST_F,
    PICDST_BIT0,
    PICDST_BIT1,
    PICDST_BIT2,
    PICDST_BIT3,
    PICDST_BIT4,
    PICDST_BIT5,
    PICDST_BIT6,
    PICDST_BIT7,
    PICDST_READF,
    PICDST_CNT,

    PICDST_w        =   PICDST_W,
    PICDST_f        =   PICDST_F,

    PICDST_BITC     =   PICDST_BIT0,
    PICDST_BITDC    =   PICDST_BIT1,
    PICDST_BITZ     =   PICDST_BIT2,
    PICDST_BITOV    =   PICDST_BIT3,
    PICDST_BITN     =   PICDST_BIT4,

    PICDST_END
} picDest;

//
// opcodes
//
#define PIC_OPCODES(f) \
    f(NOP) \
    f(ADDWF) \
    f(ADDWFC) \
    f(ANDWF) \
    f(CLRF) \
    f(COMF) \
    f(CPFSEQ) \
    f(CPFSGT) \
    f(CPFSLT) \
    f(DECF) \
    f(DECFSZ) \
    f(DCFSNZ) \
    f(INCF) \
    f(INCFSZ) \
    f(INFSNZ) \
    f(IORWF) \
    f(MOVF) \
    f(MOVFFa) \
    f(MOVFFb) \
    f(MOVWF) \
    f(MULWF) \
    f(NEGF) \
    f(RLCF) \
    f(RLNCF) \
    f(RRCF) \
    f(RRNCF) \
    f(SETF) \
    f(SUBFWB) \
    f(SUBWF) \
    f(SUBWFB) \
    f(SWAPF) \
    f(TSTFSZ) \
    f(XORWF) \
    f(BCF) \
    f(BSF) \
    f(BTFSC) \
    f(BTFSS) \
    f(BTG) \
    f(BC) \
    f(BN) \
    f(BNC) \
    f(BNN) \
    f(BNOV) \
    f(BNZ) \
    f(BOV) \
    f(BRA) \
    f(BZ) \
    f(CALL) \
    f(CLRWDT) \
    f(DAW) \
    f(GOTO) \
    f(POP) \
    f(PUSH) \
    f(RCALL) \
    f(RESET) \
    f(RETFIE) \
    f(RETLW) \
    f(RETURN) \
    f(SLEEP) \
    f(ADDLW) \
    f(ANDLW) \
    f(IORLW) \
    f(LFSRa) \
    f(LFSRb) \
    f(MOVLB) \
    f(MOVLW) \
    f(MULLW) \
    f(SUBLW) \
    f(XORLW) \
    f(TBLRD) \
    f(TBLRD_POSTINC) \
    f(TBLRD_POSTDEC) \
    f(TBLRD_PREINC) \
    f(TBLWT) \
    f(TBLWT_POSTINC) \
    f(TBLWT_POSTDEC) \
    f(TBLWT_PREINC) \
    f(LABEL) \


typedef enum picOpcodeEnum {
    #define PIC_OPCODES_ENUM(f)     PIC_##f,
    PIC_OPCODES(PIC_OPCODES_ENUM)

    PIC_INST_CNT
} picOpcode;
    
//
// Special registers
//
enum {
    PIC_SFR_START   =   0xf80,
    FSR0L       =   PIC_SFR_START,
    FSR0H,
    INDF0,
    POSTINC0,
    POSTDEC0,
    PREINC0,
    PLUSW0,

    FSR1L,
    FSR1H,
    INDF1,
    POSTINC1,
    POSTDEC1,
    PREINC1,
    PLUSW1,

    FSR2L,
    FSR2H,
    INDF2,
    POSTINC2,
    POSTDEC2,
    PREINC2,
    PLUSW2,

    WREG,
    STATUS,
    BSR,

    TRISA,
    TRISB,
    TRISC,
    PORTA,
    PORTB,
    PORTC,

    TBLPTRU,
    TBLPTRH,
    TBLPTRL,
    TABLAT,

    PRODH,
    PRODL,
    PIC_SFR_END
};

//
// Reset typesd
//
typedef enum picResetTypeEnum {
    PIC_RESET_POWERON,
    PIC_RESET_INSTRUCTION,
    PIC_RESET_BROWNOUT,
    PIC_RESET_WATCHDOG,
    PIC_RESET_MCLR,
    PIC_RESET_STACKOVER,
    PIC_RESET_STACKUNDER,

    PIC_RESET_CNT
} picResetType;

//###########################################################################
//############################### PROTOTYPES ################################
//###########################################################################

//
// create/destroy a pic chip
//
// name - name to identify this chip
// partnum - part number.  e.g. pic18lf2525
//
picChip *picChipCreate(const char *name, const char *partnum);
void     picChipDestroy(picChip *chip);

//
// run picsim test suite
//
void     picTest(void);

//
// reset chip
//
void picChipReset(picChip *ch, enum picResetTypeEnum r);

//
// picTrace()    - enable/disable tracing
// picGetCycle() - get cycle count
// picSetCycle() - set cycle count
//
int  picTrace(int enable);
int  picGetCycle(void);
void picSetCycle(int cyc);

//
// get/set register values (for debug)
// 
//   picReg*32 funcs are for up to 32 bits (use -1 in r2 & r3 for 16 bit)
//   ValS is for signed
//   ValU is for unsigned
//   Set is signed or unsigned
//
unsigned int picRegX(picChip *chip,    int regId);
unsigned int picRegValU(picChip *chip, int regId);
signed int   picRegValS(picChip *chip, int regId);
void         picRegSet(picChip *chip,  int regId, int val);

unsigned int picRegX32(picChip *chip,    int r0, int r1, int r2, int r3);
unsigned int picRegValU32(picChip *chip, int r0, int r1, int r2, int r3);
signed int   picRegValS32(picChip *chip, int r0, int r1, int r2, int r3);
void         picRegSet32(picChip *chip,  int r0, int r1, int r2, int r3,
                                                                int val);

void picRegErase(picChip *chip, int regId);
void picRegEraseRange(picChip *chip, int regIdFirst, int regIdLast);

//
// Call this before running instructions
//
int picChipSetCurrent(picChip *chip);

//
// variable declaration
//
int picRegFind(picChip *chip, const char *name, const char *namespace);

//
// instruction (USE MACROS ABOVE)
//
int picInstDB(int reg, int dst, picOpcode op,const char *file, int line,
                                                    const char *dbstr);

//###########################################################################
//############################### GLOBALS ###################################
//###########################################################################

extern const char *picNamespaceGlobal;
extern const char *picNamespaceLocal;
extern const char *picNamespaceParam;
extern const char *picNamespaceInOutParam;
extern const char *picNamespaceReturn;
extern picChip *picCurChip;




This file Copyright (C) 2006 by Nathan (Acorn) Pooley
Go to TOP Wand page
Go to Acorn's personal webpage
Go to Hogwarts website: www.gotohogwarts.com
Snout: www.snout.org/game
Gadgets of Justice Unlimited
Snout GC (Wiki)
Snout Wiki
File created by do_doc at Wed May 30 03:30:19 PDT 2007