⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 equll.c

📁 非常重要的嵌入式单片机开发语言 是美国德州仪器的MSP430系列的系统语言
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************************
  filename : equ.c
             equation calculation for PLC controller

                     designed by Pei-Chong Tang, March 1992

  data format    :  bit=<data:1>, byte=<data:1>
                   word=<data:2>, long=<data:4>
  address format : <4-byte>
  command format :
    nCHANGE : CHANGE reg #N from type #Y to type #X (N=2*5*5=50)
    nLOAD_K : LOAD constant of type #X to reg #R    (N=2*5=10)
    nLOAD_V : LOAD variable of type #X to reg #R    (N=2*5=10)
    nLOAD_P : LOAD pointer of type #X to reg #R     (N=2*5=10)
    nSAVE_V : SAVE r1 to a variable of type #X      (N=5)
    nSAVE_P : SAVE r1 #1 to a pointer of type #X    (N=5)
    nPUSH   : PUSH r1 as type #XX                   (N=5)
    nPOP    : POP  r2 as type #XX                   (N=5)
    nMOVE   : MOVE r1 to r2                         (N=5)
    nAND_BIT     : AND bitwise, r1=r1&r2            (N=5)
    nOR_BIT      : OR  bitwise, r1=r1|r2            (N=5)
    nXOR_BIT     : XOR bitwise, r1=r1^r2            (N=5)
    nNOT_BIT     : NOT bitwise, r1=~r1              (N=5)
    nADD         : ADDITION, r1=r1+r2               (N=5)
    nSUB         : SUBTRACT, r1=r2-r1               (N=5)
    nMUL         : MULTIPLY, r1=r1*r2               (N=5)
    nDIV         : DIVISION, r1=r2/r1               (N=5)
    nREM         : REMAIN,   r1=r2%r1               (N=5)
    nNEG         : NEGATIVE, r1=-r1                 (N=5)
    nSHIFT_LEFT  : SHIFT LEFT,  r1=r2<<r1           (N=5)
    nSHIFT_RIGHT : SHIFT RIGHT, r1=r2>>r1           (N=5)
    nGREAT_THAN  : GREAT THAN,  r1=(r2>r1)?255:0    (N=5)
    nGREAT_EQUAL : GREAT EQUAL, r1=(r2>=r1)?255:0   (N=5)
    nLESS_THAN   : LESS  THAN,  r1=(r2<r1)?255:0    (N=5)
    nLESS_EQUAL  : LESS  EQUAL, r1=(r2<=r1)?255:0   (N=5)
    nEQUAL       : EQUAL,       r1=(r1==r2)?255:0   (N=5)
    nNOT_EQUAL   : NOT EQUAL,   r1=(r1!=r2)?255:0   (N=5)
    nAND_LOGIC   : AND logical, r1=r1&&r2           (N=1)
    nOR_LOGIC    : AND logical, r1=r1||r2           (N=1)
    nNOT_LOGIC   : AND logical, r1=!r1              (N=1)
    nMIN         : MINIMUM,       r1=min(r1,r2)     (N=5)
    nMAX         : MAXIMUM,       r1=max(r1,r2)     (N=5)
    nABS         : ABSOLUTE,      r1=abs(r1)        (N=5)
    nSWAP        : SWAP all bits, r1=swap(r1)       (N=5)
    nBCD         : BINARY to BCD, r1=bcd(r1)        (N=5)
    nBINARY      : BCD to BINARY, r1=bin(r1)        (N=5)
    nPARITY      : PARITY,        r1=parity(r1)     (N=5)
    nCHANGE      : to BIT,        r1=bit(r1)
    nCHANGE      : to BYTE,       r1=char(r1)
    nCHANGE      : to WORD,       r1=int(r1)
    nCHANGE      : to LONG,       r1=long(r1)
    nCHANGE      : to FLOAT,      r1=float(r1)
    nACOS        : ACOS,          r1=acos(r1)       (N=1)
    nASIN        : ASIN,          r1=asin(r1)       (N=1)
    nATAN        : ATAN,          r1=atan(r1)       (N=1)
    nATAN2       : ATAN2,         r1=atan2(r1,r2)   (N=1)
    nCOSH        : COSH,          r1=acos(r1)       (N=1)
    nCOS         : COS,           r1=cos(r1)        (N=1)
    nEXP         : EXP,           r1=exp(r1)        (N=1)
    nLOG10       : LOG10,         r1=log10(r1)      (N=1)
    nLOG         : LOG,           r1=log(r1)        (N=1)
    nPOW10       : POW10,         r1=pow10(r1)      (N=1)
    nSIN         : SIN,           r1=sin(r1)        (N=1)
    nSINH        : SINH,          r1=sinh(r1)       (N=1)
    nSQRT        : SQRT,          r1=sqrt(r1)       (N=1)
    nTAN         : TAN,           r1=tan(r1)        (N=1)
    nTIME        : TIME NOW,      r1=time()         (N=1)
    nRANDOM      : RANDOM value,  r1=random()       (N=1)
    nEND         : END                              (N=1)
**********************************************************/
#include "eMSP.h"
#include "plc.h"

                      //***** definition of data type *****
#define  BIT  0
#define  CHR  1
#define  INT  2
#define  LNG  3
#define dBIT  0
#define dCHR  1
#define dINT  2
#define dLNG  3
#define sBIT  0
#define sCHR  10
#define sINT  20
#define sLNG  30
                      //***** definition of registers *****
#define REG1  0
#define REG2  5
                       //***** definition of commands *****
#define nCHANGE      0
#define nLOAD_K      50
#define nLOAD_V      60
#define nLOAD_P      70
#define nSAVE_V      80
#define nSAVE_ACC    85
#define nPOP         90
#define nPUSH        95
#define nMOVE        100
#define nAND_BIT     105
#define nOR_BIT      110
#define nXOR_BIT     115
#define nNOT_BIT     120
#define nADD         125
#define nSUB         130
#define nMUL         135
#define nDIV         140
#define nREM         145
#define nNEG         150
#define nSHIFT_LEFT  155
#define nSHIFT_RIGHT 160
#define nGREAT_THAN  165
#define nLESS_THAN   170
#define nGREAT_EQUAL 175
#define nLESS_EQUAL  180
#define nEQUAL       185
#define nNOT_EQUAL   190
#define nAND_LOGIC   195
#define nOR_LOGIC    196
#define nNOT_LOGIC   197
#define nMIN         200
#define nMAX         205
#define nABS         210
#define nSWAP        215
#define nBCD         220
#define nBINARY      225
#define nPARITY      230
#define nTIME        235
#define nRANDOM      236
#define nACOS        237
#define nASIN        238
#define nATAN        239
#define nATAN2       240
#define nCOSH        241
#define nCOS         242
#define nEXP         243
#define nLOG         244
#define nLOG10       245
#define nPOW10       246
#define nSIN         247
#define nSINH        248
#define nSQRT        249
#define nTAN         250
#define nTC          251
#define nTI          252
#define nTL          253
#define nTF          254

static union {unsigned char c; int i; long l;} r1,r2;

//*********************************************************
// EQU_function()
//     equation calculation
//*********************************************************
static unsigned char getByte(unsigned char *);
static unsigned      getWord(unsigned char *);
static long          getLong(unsigned char *);
static void putByte(unsigned char *,unsigned char);
static void putWord(unsigned char *,unsigned);
static void putLong(unsigned char *,long);

void EQU_function(unsigned char *p)
{    static unsigned int rand=1;
     unsigned char buf[16]; unsigned char *s,*next;
     next=p+(*(p+1));
     p+=2; s=buf;                      //**reset stack
     while (1)
     {    if (p>=next) return;
          switch (*p++)
          {                            //**change format
          case nCHANGE+REG1+sBIT+dBIT :            break;
          case nCHANGE+REG1+sBIT+dCHR :            break;
          case nCHANGE+REG1+sBIT+dINT : r1.i=r1.c; break;
          case nCHANGE+REG1+sBIT+dLNG : r1.l=r1.c; break;
          case nCHANGE+REG1+sCHR+dBIT : r1.c=(r1.c)?255:0; break;
          case nCHANGE+REG1+sCHR+dCHR :            break;
          case nCHANGE+REG1+sCHR+dINT : r1.i=r1.c; break;
          case nCHANGE+REG1+sCHR+dLNG : r1.l=r1.c; break;
          case nCHANGE+REG1+sINT+dBIT : r1.c=(r1.i)?255:0; break;
          case nCHANGE+REG1+sINT+dCHR :            break;
          case nCHANGE+REG1+sINT+dINT :            break;
          case nCHANGE+REG1+sINT+dLNG : r1.l=r1.i; break;
          case nCHANGE+REG1+sLNG+dBIT : r1.c=(r1.l)?255:0; break;
          case nCHANGE+REG1+sLNG+dCHR :            break;
          case nCHANGE+REG1+sLNG+dINT :            break;
          case nCHANGE+REG1+sLNG+dLNG :            break;
                                       //**change format
          case nCHANGE+REG2+sBIT+dBIT :            break;
          case nCHANGE+REG2+sBIT+dCHR :            break;
          case nCHANGE+REG2+sBIT+dINT : r2.i=r2.c; break;
          case nCHANGE+REG2+sBIT+dLNG : r2.l=r2.c; break;
          case nCHANGE+REG2+sCHR+dBIT : r2.c=(r2.c)?255:0; break;
          case nCHANGE+REG2+sCHR+dCHR :            break;
          case nCHANGE+REG2+sCHR+dINT : r2.i=r2.c; break;
          case nCHANGE+REG2+sCHR+dLNG : r2.l=r2.c; break;
          case nCHANGE+REG2+sINT+dBIT : r2.c=(r2.i)?255:0; break;
          case nCHANGE+REG2+sINT+dCHR :            break;
          case nCHANGE+REG2+sINT+dINT :            break;
          case nCHANGE+REG2+sINT+dLNG : r2.l=r2.i; break;
          case nCHANGE+REG2+sLNG+dBIT : r2.c=(r2.l)?255:0; break;
          case nCHANGE+REG2+sLNG+dCHR :            break;
          case nCHANGE+REG2+sLNG+dINT :            break;
          case nCHANGE+REG2+sLNG+dLNG :            break;
                                       //**load constant
          case nLOAD_K+REG1+BIT : r1.c=getByte(p); p++;  break;
          case nLOAD_K+REG1+CHR : r1.c=getByte(p); p++;  break;
          case nLOAD_K+REG1+INT : r1.i=getWord(p); p+=2; break;
          case nLOAD_K+REG1+LNG : r1.l=getLong(p); p+=4; break;
          case nLOAD_K+REG2+BIT : r2.c=getByte(p); p++;  break;
          case nLOAD_K+REG2+CHR : r2.c=getByte(p); p++;  break;
          case nLOAD_K+REG2+INT : r2.i=getWord(p); p+=2; break;
          case nLOAD_K+REG2+LNG : r2.l=getLong(p); p+=4; break;
                                       //**load variable
          case nLOAD_V+REG1+BIT :
          case nLOAD_V+REG1+CHR :
          case nLOAD_V+REG1+INT :
          case nLOAD_V+REG1+LNG : r1.l=PLCgetData(getLong(p)); p+=4; break;
          case nLOAD_V+REG2+BIT :
          case nLOAD_V+REG2+CHR :
          case nLOAD_V+REG2+INT :
          case nLOAD_V+REG2+LNG : r2.l=PLCgetData(getLong(p)); p+=4; break;
                                       //**load pointer
          case nLOAD_P+REG1+BIT :
          case nLOAD_P+REG1+CHR :
          case nLOAD_P+REG1+INT :
          case nLOAD_P+REG1+LNG : r1.l=PLCgetData(getLong(p)); p+=4; break;
          case nLOAD_P+REG2+BIT :
          case nLOAD_P+REG2+CHR :
          case nLOAD_P+REG2+INT :
          case nLOAD_P+REG2+LNG : r2.l=PLCgetData(getLong(p)); p+=4; break;
                                       //**save variable
          case nSAVE_ACC+BIT :    RAM_PLCacc=(r1.c)?255:0;     p++;  break;
          case nSAVE_ACC+CHR :    RAM_PLCacc=(r1.c)?255:0;     p++;  break;
          case nSAVE_ACC+INT :    RAM_PLCacc=(r1.i)?255:0;     p++;  break;
          case nSAVE_ACC+LNG :    RAM_PLCacc=(r1.l)?255:0;     p++;  break;
          case nSAVE_V+BIT :
          case nSAVE_V+CHR :
          case nSAVE_V+INT :
          case nSAVE_V+LNG :      PLCputData(getLong(p),r1.l); p+=4; break;
                              //***** push into stack *****
          case nPUSH+BIT : putByte(s,r1.c); s++;  break;
          case nPUSH+CHR : putByte(s,r1.c); s++;  break;
          case nPUSH+INT : putWord(s,r1.i); s+=2; break;
          case nPUSH+LNG : putLong(s,r1.l); s+=4; break;
                               //***** pop from stack *****
          case nPOP+BIT : s--;  r2.c=getByte(s); break;
          case nPOP+CHR : s--;  r2.c=getByte(s); break;
          case nPOP+INT : s-=2; r2.i=getWord(s); break;
          case nPOP+LNG : s-=4; r2.l=getLong(s); break;
                                //***** move r1 to r2 *****
          case nMOVE+BIT : r2.c=r1.c; break;
          case nMOVE+CHR : r2.c=r1.c; break;
          case nMOVE+INT : r2.i=r1.i; break;
          case nMOVE+LNG : r2.l=r1.l; break;
                                  //***** bitwise AND *****
          case nAND_BIT+BIT : r1.c&=r2.c; break;
          case nAND_BIT+CHR : r1.c&=r2.c; break;
          case nAND_BIT+INT : r1.i&=r2.i; break;
          case nAND_BIT+LNG : r1.l&=r2.l; break;
                                   //***** bitwise OR *****
          case nOR_BIT+BIT : r1.c|=r2.c; break;
          case nOR_BIT+CHR : r1.c|=r2.c; break;
          case nOR_BIT+INT : r1.i|=r2.i; break;
          case nOR_BIT+LNG : r1.l|=r2.l; break;
                                  //***** bitwise XOR *****
          case nXOR_BIT+BIT : r1.c^=r2.c; break;
          case nXOR_BIT+CHR : r1.c^=r2.c; break;
          case nXOR_BIT+INT : r1.i^=r2.i; break;
          case nXOR_BIT+LNG : r1.l^=r2.l; break;
                                  //***** bitwise NOT *****
          case nNOT_BIT+BIT : r1.c=~r1.c; break;
          case nNOT_BIT+CHR : r1.c=~r1.c; break;
          case nNOT_BIT+INT : r1.i=~r1.i; break;
          case nNOT_BIT+LNG : r1.l=~r1.l; break;
                                          //***** ADD *****
          case nADD+BIT :             break;
          case nADD+CHR : r1.c+=r2.c; break;
          case nADD+INT : r1.i+=r2.i; break;
          case nADD+LNG : r1.l+=r2.l; break;
                                          //***** SUB *****
          case nSUB+BIT :                 break;
          case nSUB+CHR : r1.c=r2.c-r1.c; break;
          case nSUB+INT : r1.i=r2.i-r1.i; break;
          case nSUB+LNG : r1.l=r2.l-r1.l; break;
                                          //***** MUL *****
          case nMUL+BIT :             break;
          case nMUL+CHR : r1.c*=r2.c; break;
          case nMUL+INT : r1.i*=r2.i; break;
          case nMUL+LNG : r1.l*=r2.l; break;
                                          //***** DIV *****
          case nDIV+BIT :                 break;
          case nDIV+CHR : r1.c=r2.c/r1.c; break;
          case nDIV+INT : r1.i=r2.i/r1.i; break;
          case nDIV+LNG : r1.l=r2.l/r1.l; break;
                                          //***** REM *****
          case nREM+BIT :                 break;
          case nREM+CHR : r1.c=r2.c%r1.c; break;
          case nREM+INT : r1.i=r2.i%r1.i; break;
          case nREM+LNG : r1.l=r2.l%r1.l; break;
                                          //***** NEG *****
          case nNEG+BIT :             break;
          case nNEG+CHR : r1.c=-r1.c; break;
          case nNEG+INT : r1.i=-r1.i; break;
          case nNEG+LNG : r1.l=-r1.l; break;
                                   //***** shift LEFT *****
          case nSHIFT_LEFT+BIT :          break;
          case nSHIFT_LEFT+CHR : r1.c=r2.c<<r1.c; break;
          case nSHIFT_LEFT+INT : r1.i=r2.i<<r1.c; break;
          case nSHIFT_LEFT+LNG : r1.l=r2.l<<r1.c; break;
                                  //***** shift RIGHT *****
          case nSHIFT_RIGHT+BIT :                  break;
          case nSHIFT_RIGHT+CHR : r1.c=r2.c>>r1.c; break;
          case nSHIFT_RIGHT+INT : r1.i=r2.i>>r1.c; break;
          case nSHIFT_RIGHT+LNG : r1.l=r2.l>>r1.c; break;
                                   //***** great than *****
          case nGREAT_THAN+BIT : r1.c=(r2.c>r1.c)?255:0; break;
          case nGREAT_THAN+CHR : r1.c=(r2.c>r1.c)?255:0; break;
          case nGREAT_THAN+INT : r1.c=(r2.i>r1.i)?255:0; break;
          case nGREAT_THAN+LNG : r1.c=(r2.l>r1.l)?255:0; break;
                                    //***** less than *****
          case nLESS_THAN+BIT : r1.c=(r2.c<r1.c)?255:0; break;
          case nLESS_THAN+CHR : r1.c=(r2.c<r1.c)?255:0; break;
          case nLESS_THAN+INT : r1.c=(r2.i<r1.i)?255:0; break;
          case nLESS_THAN+LNG : r1.c=(r2.l<r1.l)?255:0; break;
                                  //***** great equal *****
          case nGREAT_EQUAL+BIT : r1.c=(r2.c>=r1.c)?255:0; break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -