1446 lines
41 KiB
C
1446 lines
41 KiB
C
/*
|
||
===============================================================================
|
||
|
||
Casio Basic RUNTIME library for fx-9860G series v1.8x
|
||
|
||
copyright(c)2015/2016/2017/2018 by sentaro21
|
||
e-mail sentaro21@pm.matrix.jp
|
||
|
||
===============================================================================
|
||
*/
|
||
#include "CB.h"
|
||
//----------------------------------------------------------------------------------------------
|
||
// Expression evaluation string -> int
|
||
//----------------------------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalIntObjectAlignE4a( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlignE4b( unsigned int n ){ return n+n; } // align +6byte
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
int ReadMatrixInt( int reg, int dimA, int dimB){ // base:0 0- base:1 1-
|
||
char* MatAryC;
|
||
short* MatAryW;
|
||
int* MatAryI;
|
||
complex* MatAryCPLX;
|
||
int base=MatAry[reg].Base;
|
||
int r;
|
||
int result;
|
||
dimA-=base;
|
||
dimB-=base;
|
||
switch ( MatAry[reg].ElementSize ) {
|
||
case 2: // Vram
|
||
// dimA+=base;
|
||
// dimB+=base;
|
||
case 1:
|
||
MatAryC=(char*)MatAry[reg].Adrs; // Matrix array 1 bit
|
||
return ( MatAryC[dimB*(((MatAry[reg].SizeA-1)>>3)+1)+(dimA>>3)] & ( 128>>(dimA&7) ) ) != 0 ;
|
||
case 4:
|
||
MatAryC=(char*)MatAry[reg].Adrs; // Matrix array 4 bit
|
||
r=MatAryC[dimB*(((MatAry[reg].SizeA-1)>>1)+1)+(dimA>>1)];
|
||
if ( (dimA&1)==0 ) r = r>>4;
|
||
r = r&0xF;
|
||
// if ( r>=8 ) r -= 16; // minus
|
||
return r;
|
||
case 8:
|
||
MatAryC=(char*)MatAry[reg].Adrs;
|
||
return MatAryC[dimA*MatAry[reg].SizeB+dimB] ; // Matrix array char
|
||
case 16:
|
||
MatAryW=(short*)MatAry[reg].Adrs;
|
||
return MatAryW[dimA*MatAry[reg].SizeB+dimB] ; // Matrix array word
|
||
case 32:
|
||
MatAryI=(int*)MatAry[reg].Adrs;
|
||
return MatAryI[dimA*MatAry[reg].SizeB+dimB] ; // Matrix array int
|
||
case 64:
|
||
return MatAry[reg].Adrs[dimA*MatAry[(reg)].SizeB+dimB] ; // Matrix array doubl
|
||
case 128:
|
||
MatAryCPLX=(complex*)MatAry[reg].Adrs; // Matrix array 1 bit
|
||
return MatAryCPLX[dimA*MatAry[reg].SizeB+dimB].real ; // Matrix array complex
|
||
break;
|
||
}
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
int EvalIntObjectAlign4c0( unsigned int n ){ return n; } // align +4byte
|
||
int EvalIntObjectAlign4c1( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4c2( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4c3( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign6d( unsigned int n ){ return n+n; } // align +6byte
|
||
//-----------------------------------------------------------------------------
|
||
void WriteMatrixInt( int reg, int dimA, int dimB, int value){ // base:0 0- base:1 1-
|
||
char* MatAryC;
|
||
short* MatAryW;
|
||
int* MatAryI;
|
||
complex* MatAryCPLX;
|
||
int tmp,vtmp,mask;
|
||
int mptr;
|
||
int base=MatAry[reg].Base;
|
||
dimA-=base;
|
||
dimB-=base;
|
||
switch ( MatAry[reg].ElementSize ) {
|
||
case 2: // Vram
|
||
// dimA+=base;
|
||
// dimB+=base;
|
||
case 1:
|
||
MatAryC=(char*)MatAry[reg].Adrs; // Matrix array 1 bit
|
||
tmp=( 128>>(dimA&7) );
|
||
mptr=dimB*(((MatAry[reg].SizeA-1)>>3)+1)+(dimA>>3);
|
||
if ( value ) MatAryC[mptr] |= tmp ;
|
||
else MatAryC[mptr] &= ~tmp ;
|
||
break;
|
||
case 4:
|
||
MatAryC=(char*)MatAry[reg].Adrs; // Matrix array 4 bit
|
||
mptr=dimB*(((MatAry[reg].SizeA-1)>>1)+1)+((dimA)>>1);
|
||
vtmp=(value)&0x0F; mask=0xF0;
|
||
if ( (dimA&1)==0 ) { vtmp<<=4; mask>>=4; }
|
||
MatAryC[mptr] &= mask ;
|
||
MatAryC[mptr] |= vtmp ;
|
||
break;
|
||
case 8:
|
||
MatAryC=(char*)MatAry[reg].Adrs;
|
||
MatAryC[dimA*MatAry[reg].SizeB+dimB] = (char)value ; // Matrix array char
|
||
break;
|
||
case 16:
|
||
MatAryW=(short*)MatAry[reg].Adrs;
|
||
MatAryW[dimA*MatAry[reg].SizeB+dimB] = (short)value ; // Matrix array word
|
||
break;
|
||
case 32:
|
||
MatAryI=(int*)MatAry[reg].Adrs;
|
||
MatAryI[dimA*MatAry[reg].SizeB+dimB] = (int)value ; // Matrix array int
|
||
break;
|
||
case 64:
|
||
MatAry[reg].Adrs[dimA*MatAry[reg].SizeB+dimB] = (double)value ; // Matrix array double
|
||
break;
|
||
case 128:
|
||
MatAryCPLX=(complex*)MatAry[reg].Adrs; // Matrix array 1 bit
|
||
MatAryCPLX[dimA*MatAry[reg].SizeB+dimB] = Int2Cplx( value ); // Matrix array complex
|
||
break;
|
||
}
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
//int MatrixObjectAlign6a( unsigned int n ){ return n+n; } // align +6byte
|
||
//int MatrixObjectAlign4b( unsigned int n ){ return n; } // align +4byte
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
int MatOperandIntSub( int c ) {
|
||
if ( ( '0'<=c )&&( c<='9' ) ) return c-'0';
|
||
if ( ( ( 'A'<=c )&&( c<='Z' ) ) || ( ( 'a'<=c )&&( c<='z' ) ) ) return LocalInt[c-'A'][0] ;
|
||
if ( c == 0xFFFFFFC0 ) return LocalInt[28][0]; // Ans
|
||
if ( ( c == 0xFFFFFFCD ) || ( c == 0xFFFFFFCE ) ) return LocalInt[c-0xFFFFFFCD+26][0] ; // <r> or Theta
|
||
CB_Error(SyntaxERR);
|
||
return -1 ; // Syntax error
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
void MatOprandInt1sub( char *SRC, int reg, int *dimA ){ // base:0 0- base:1 1-
|
||
int c,d,e;
|
||
c=SRC[ExecPtr];
|
||
d=SRC[ExecPtr+1];
|
||
if ( (d==',')||(d==']')||(d==0x0E)||(d==0x13)||(d==0x0D)||(d==0) ) { // [a,
|
||
ExecPtr++ ;
|
||
(*dimA) = MatOperandIntSub( c );
|
||
} else
|
||
if ( d == 0xFFFFFF89 ) { // [a+1,
|
||
e=SRC[ExecPtr+3];
|
||
if ( (e==',')||(e==']')||(e==0x0E)||(e==0x13)||(e==0x0D)||(e==0) ) {
|
||
ExecPtr+=2 ;
|
||
(*dimA) = MatOperandIntSub( c );
|
||
c=SRC[ExecPtr++];
|
||
(*dimA) += MatOperandIntSub( c );
|
||
} else goto L1;
|
||
} else
|
||
if ( d == 0xFFFFFF99 ) { // [a-1,
|
||
e=SRC[ExecPtr+3];
|
||
if ( (e==',')||(e==']')||(e==0x0E)||(e==0x13)||(e==0x0D)||(e==0) ) {
|
||
ExecPtr+=2 ;
|
||
(*dimA) = MatOperandIntSub( c );
|
||
c=SRC[ExecPtr++];
|
||
(*dimA) -= MatOperandIntSub( c );
|
||
} else goto L1;
|
||
} else {
|
||
L1: (*dimA) = (EvalIntsubTop( SRC ));
|
||
}
|
||
}
|
||
void MatOprandInt2( char *SRC, int reg, int *dimA, int *dimB ){ // base:0 0- base:1 1-
|
||
int c,d;
|
||
int base=MatAry[reg].Base;
|
||
MatOprandInt1sub( SRC, reg, &(*dimA) );
|
||
if ( ( (*dimA) < base ) || ( MatAry[reg].SizeA-1+base < (*dimA) ) ) { CB_Error(DimensionERR); return ; } // Dimension error
|
||
if ( SRC[ExecPtr] == ',' ) {
|
||
ExecPtr++ ;
|
||
MatOprandInt1sub( SRC, reg, &(*dimB) );
|
||
if ( ( (*dimB) < base ) || ( MatAry[reg].SizeB-1+base < (*dimB) ) ) { CB_Error(DimensionERR); return ; } // Dimension error
|
||
} else {
|
||
(*dimB)=base;
|
||
}
|
||
if ( SRC[ExecPtr] == ']' ) ExecPtr++ ; //
|
||
}
|
||
void MatOprandInt1( char *SRC, int reg, int *dimA, int *dimB ){ // base:0 0- base:1 1-
|
||
int c,d;
|
||
int base;
|
||
MatOprandInt1sub( SRC, reg, &(*dimA) );
|
||
if ( MatAry[reg].SizeA == 0 ) {
|
||
DimMatrixSub( reg, DefaultElemetSize(), (*dimA)+1-MatBase, 1, MatBase ); // new matrix
|
||
if ( ErrorNo ) return ; // error
|
||
}
|
||
base=MatAry[reg].Base;
|
||
(*dimB)=base;
|
||
if ( ( (*dimA) < base ) || ( MatAry[reg].SizeA-1+base < (*dimA) ) ) {
|
||
// if ( MatAry[reg].SizeA < 10-base ) MatElementPlus( reg, 10-base, 1 ); // List element +
|
||
// else
|
||
if ( (MatAry[reg].SizeA+1)==((*dimA)-1+base) ) MatElementPlus( reg, (*dimA)-1+base, 1 ); // List element +
|
||
else
|
||
{ CB_Error(DimensionERR); return ; } // Dimension error
|
||
}
|
||
if ( SRC[ExecPtr] == ']' ) ExecPtr++ ; //
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalIntObjectAlignE4d( unsigned int n ){ return n+n; } // align +6byte
|
||
//int EvalIntObjectAlignE4e( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlignE4f( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlignE4g( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlignE4h( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlignE4i( unsigned int n ){ return n; } // align +4byte
|
||
//-----------------------------------------------------------------------------
|
||
|
||
int fintint( int x ) {
|
||
return x;
|
||
}
|
||
int fabsint( int x ) {
|
||
return abs(x);
|
||
}
|
||
int fnotint( int x ) {
|
||
return ! ( x );
|
||
}
|
||
int fsqrtint( int x ) {
|
||
if ( x<0 ) CB_Error(MathERR) ; // Math error
|
||
return sqrt( x );
|
||
}
|
||
int flog10int( int x ) {
|
||
if ( x<=0 ) CB_Error(MathERR) ; // Math error
|
||
return log10( x );
|
||
}
|
||
int fpow10int( int x ) {
|
||
return pow( 10, x );
|
||
}
|
||
int flnint( int x ) {
|
||
if ( x<=0 ) CB_Error(MathERR) ; // Math error
|
||
return log( x );
|
||
}
|
||
int ffracint( int x ) {
|
||
return 0;
|
||
}
|
||
int fexpint( int x ) {
|
||
return exp( x );
|
||
}
|
||
int fcuberootint( int x ) {
|
||
return pow( x, 1.0/3.0 );
|
||
}
|
||
int fsquint( int x ) {
|
||
return x*x;
|
||
}
|
||
int ffactint( int x ) {
|
||
int tmp;
|
||
tmp = x ;
|
||
x = 1;
|
||
while ( tmp > 0 ) { x *= tmp; tmp--; }
|
||
return x;
|
||
}
|
||
int f_nPrint( int n, int r ) {
|
||
int x,tmp;
|
||
if ( n<r ) { CB_Error(MathERR) ; return 0; } // Math error
|
||
x = 1;
|
||
tmp = n;
|
||
while ( tmp > n-r ) { x *= tmp; tmp--; }
|
||
return x;
|
||
}
|
||
int f_nCrint( int n, int r ) {
|
||
return f_nCr( n, r);
|
||
}
|
||
int frecipint( int x ) { // ^(-1) RECIP
|
||
if ( x == 0 ) CB_Error(DivisionByZeroERR); // Division by zero error
|
||
return 1 / x ;
|
||
}
|
||
|
||
int fsignint( int x ) { // -x
|
||
return -x;
|
||
}
|
||
int fADDint( int x, int y ) { // x + y
|
||
return x+y;
|
||
}
|
||
int fSUBint( int x, int y ) { // x - y
|
||
return x-y;
|
||
}
|
||
int fMULint( int x, int y ) { // x * y
|
||
return x*y;
|
||
}
|
||
int fDIVint( int x, int y ) { // x / y
|
||
if ( y == 0 ) CB_Error(DivisionByZeroERR); // Division by zero error
|
||
return x/y;
|
||
}
|
||
int fANDint( int x, int y ) { // x and y
|
||
return x & y;
|
||
}
|
||
int fORint( int x, int y ) { // x or y
|
||
return x | y;
|
||
}
|
||
int fXORint( int x, int y ) { // x xor y
|
||
return x ^ y;
|
||
}
|
||
int fNotint( int x ) { // Not x
|
||
return ~x;
|
||
}
|
||
int fANDint_logic( int x, int y ) { // x && y
|
||
return x && y;
|
||
}
|
||
int fORint_logic( int x, int y ) { // x || y
|
||
return x || y;
|
||
}
|
||
int fXORint_logic( int x, int y ) { // x xor y
|
||
return (x!=0) ^ (y!=0);
|
||
}
|
||
int fNotint_logic( int x ) { // Not x
|
||
return !x;
|
||
}
|
||
int fcmpEQint( int x, int y ) { // x = y
|
||
return x == y;
|
||
}
|
||
int fcmpGTint( int x, int y ) { // x > y
|
||
return x > y;
|
||
}
|
||
int fcmpLTint( int x, int y ) { // x < y
|
||
return x < y;
|
||
}
|
||
int fcmpNEint( int x, int y ) { // x != y
|
||
return x != y;
|
||
}
|
||
int fcmpGEint( int x, int y ) { // x >= y
|
||
return x >= y;
|
||
}
|
||
int fcmpLEint( int x, int y ) { // x <= y
|
||
return x <= y;
|
||
}
|
||
|
||
int fpowint( int x, int y ) { // pow(x,y)
|
||
return pow( x, y );
|
||
}
|
||
int fpowrootint( int x, int y ) { // powroot(x,y)
|
||
if ( y == 0 ) { CB_Error(MathERR) ; return 0; } // Math error
|
||
return pow( x, 1/(double)y );
|
||
}
|
||
int flogabint( int x, int y ) { // flogab(x,y)
|
||
double base;
|
||
int result;
|
||
if ( x <= 0 ) { CB_Error(MathERR) ; return 0; } // Math error
|
||
base = log(x);
|
||
result = log(y)/base;
|
||
return result ;
|
||
}
|
||
int frandint() {
|
||
return rand();
|
||
}
|
||
int frandIntint( int x, int y ) {
|
||
int i;
|
||
if ( x>y ) { i=x; x=y; y=i; }
|
||
return rand()*(y-x+1)/(RAND_MAX+1) +x ;
|
||
}
|
||
|
||
int fMODint( int x, int y ) { // fMODint(x,y)
|
||
int result;
|
||
if ( y == 0 ) CB_Error(DivisionByZeroERR); // Division by zero error
|
||
result= abs(x % y);
|
||
if ( x < 0 ) {
|
||
y = abs(y);
|
||
result = y-result;
|
||
if ( ( result == y ) || ( x == y ) ) result=0;
|
||
}
|
||
return result ;
|
||
}
|
||
|
||
int fGCDint( int x, int y ) { // GCD(x,y)
|
||
int tmp;
|
||
if ( x<y ) { tmp=x; x=y; y=tmp; }
|
||
tmp=fMODint(x,y);
|
||
while( tmp != 0 ) {
|
||
x=y;
|
||
y=tmp;
|
||
tmp=fMODint(x,y);
|
||
}
|
||
return y;
|
||
}
|
||
int fLCMint( int x, int y ) { // LCM(x,y)
|
||
if ( ( x < 0 ) || ( x < 0 ) ) { CB_Error(ArgumentERR) ; return 0; } // Argumenterror
|
||
return x/fGCDint(x,y)*y;
|
||
}
|
||
|
||
int CB_rand( char *SRC ) {
|
||
int c = SRC[ExecPtr];
|
||
if ( ( '0'<=c )&&( c<='9' ) ) {
|
||
jp:
|
||
srand(CB_EvalInt(SRC));
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
} else
|
||
if ( c=='#' ) { ExecPtr++; goto jp; }
|
||
return rand() ;
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalIntObjectAlignE4j( unsigned int n ){ return n; } // align +4byte
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
int CB_EvalInt( char *SRC ) {
|
||
int value;
|
||
if (CB_INT==1) value=EvalIntsubTop( SRC ); else value=EvalsubTopReal( SRC );
|
||
return value;
|
||
}
|
||
/*
|
||
int EvalIntEndCheck( int c ) {
|
||
if ( c==':' ) return c;
|
||
if ( c==0x0E ) return c; // ->
|
||
if ( c==0x13 ) return c; // =>
|
||
if ( c==',' ) return c;
|
||
if ( c==')' ) return c;
|
||
if ( c==']' ) return c;
|
||
if ( c==0x0D ) return c; // <CR>
|
||
return ( c==0 );
|
||
}
|
||
*/
|
||
int EvalIntsubTop( char *SRC ) { // eval 1
|
||
int result,dst;
|
||
int c;
|
||
int excptr=ExecPtr;
|
||
int ansreg=CB_MatListAnsreg;
|
||
|
||
// while ( SRC[ExecPtr]==0x20 ) ExecPtr++; // Skip Space
|
||
result=EvalIntsub1(SRC);
|
||
c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result;
|
||
else
|
||
if ( c==0xFFFFFF89 ) { // +
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result+dst;
|
||
} else
|
||
if ( c==0xFFFFFF99 ) { // -
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result-dst;
|
||
} else
|
||
if ( c=='=') { // ==
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result == dst;
|
||
} else
|
||
if ( c=='>') { // >
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result > dst;
|
||
} else
|
||
if ( c=='<') { // <
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result < dst;
|
||
} else
|
||
if ( c==0x11) { // !=
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result != dst;
|
||
} else
|
||
if ( c==0x12) { // >=
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result >= dst;
|
||
} else
|
||
if ( c==0x10) { // <=
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result <= dst;
|
||
} else
|
||
if ( c==0xFFFFFFA9 ) { // *
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result*dst;
|
||
} else
|
||
if ( c==0xFFFFFFB9 ) { // /
|
||
divj:
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return fDIVint(result,dst);
|
||
} else
|
||
if ( c==0xFFFFFF9A ) { // xor
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result ^ dst;
|
||
} else
|
||
if ( ( c=='|' ) || ( c==0xFFFFFFAA ) ) { // or
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result | dst;
|
||
} else
|
||
if ( ( c=='&' ) || ( c==0xFFFFFFBA ) ) { // and
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result & dst;
|
||
} else
|
||
if ( c==0xFFFFFF8B ) { // ^2
|
||
ExecPtr++;
|
||
c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return result*result;
|
||
} else
|
||
if ( c==0x7F ) { //
|
||
c=SRC[++ExecPtr];
|
||
if ( c==0xFFFFFFB0 ) { // And
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return (int)result && (int)dst;
|
||
} else
|
||
if ( c==0xFFFFFFB1 ) { // Or
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return (int)result || (int)dst;
|
||
} else
|
||
if ( c==0xFFFFFFB4 ) { // Xor
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return ((int)result!=0) ^ ((int)dst!=0);
|
||
} else
|
||
if ( c==0xFFFFFFBC ) { // Int/
|
||
goto divj;
|
||
} else
|
||
if ( c==0xFFFFFFBD ) { // Rmdr
|
||
ExecPtr++; dst=EvalIntsub1(SRC); c=SRC[ExecPtr]; if ( (c==':')||(c==0x0E)||(c==0x13)||(c==',')||(c==')')||(c==']')||(c==0x0D)||(c==0) ) return fMODint(result,dst);
|
||
}
|
||
}
|
||
|
||
ExecPtr=excptr;
|
||
CB_MatListAnsreg=ansreg;
|
||
return EvalIntsub14( SRC );
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalintObjectAlignE4c( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalintObjectAlignE4d( unsigned int n ){ return n+n; } // align +6byte
|
||
//-----------------------------------------------------------------------------
|
||
int Eval_atoi(char *SRC, int c ) {
|
||
int result=0;
|
||
if ( c == '0' ) {
|
||
c = SRC[++ExecPtr];
|
||
if ( ( c=='x' ) || ( c=='X' ) ) {
|
||
c=SRC[++ExecPtr];
|
||
while ( ( ( '0'<=c )&&( c<='9' ) ) || ( ('A'<=c)&&(c<='F') ) || ( ('a'<=c)&&(c<='f') ) ) {
|
||
if ( ( '0'<=c )&&( c<='9' ) ) result = result*16 +(c-'0');
|
||
else
|
||
if ( ('A'<=c)&&(c<='F') ) result = result*16 +(c-'A'+10);
|
||
else
|
||
if ( ('a'<=c)&&(c<='f') ) result = result*16 +(c-'a'+10);
|
||
c=SRC[++ExecPtr];
|
||
}
|
||
return result ;
|
||
} else
|
||
if ( ( c=='b' ) || ( c=='B' ) ) {
|
||
c=SRC[++ExecPtr];
|
||
while ( ('0'<=c)&&(c<='1') ) {
|
||
result = result*2 +(c-'0');
|
||
c=SRC[++ExecPtr];
|
||
}
|
||
return result ;
|
||
}
|
||
}
|
||
while ( ( '0'<=c )&&( c<='9' ) ) {
|
||
result = result*10 +(c-'0');
|
||
c=SRC[++ExecPtr];
|
||
}
|
||
return result ;
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
int Get2EvalInt( char *SRC, int *tmp, int *tmp2){
|
||
int c;
|
||
(*tmp) = EvalIntsubTop( SRC );
|
||
if ( SRC[ExecPtr] != ',' ) CB_Error(SyntaxERR) ; // Syntax error
|
||
ExecPtr++;
|
||
(*tmp2) = EvalIntsubTop( SRC );
|
||
c=SRC[ExecPtr];
|
||
if ( c == ')' ) ExecPtr++;
|
||
return c;
|
||
}
|
||
|
||
int EvalIntsub1(char *SRC) { // 1st Priority
|
||
int result,tmp,tmp2;
|
||
char c,d;
|
||
int dimA,dimB,reg,x,y;
|
||
int i,ptr,mptr;
|
||
char* MatAryC;
|
||
short* MatAryW;
|
||
int* MatAryI;
|
||
double* MatAryF;
|
||
|
||
c = SRC[ExecPtr++];
|
||
topj:
|
||
if ( c == '(') {
|
||
result = EvalIntsubTop( SRC );
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
return result;
|
||
}
|
||
while ( c == 0xFFFFFF89 ) c=SRC[ExecPtr++]; // +
|
||
if ( ( c == 0xFFFFFF87 ) || ( c == 0xFFFFFF99 ) ) { // -
|
||
return - EvalIntsub5( SRC );
|
||
}
|
||
if ( ( ( 'A'<=c )&&( c<='Z' ) ) || ( ( 'a'<=c )&&( c<='z' ) ) ) {
|
||
reg=c-'A';
|
||
regj:
|
||
c=SRC[ExecPtr];
|
||
if ( c=='#' ) { ExecPtr++; return LocalDbl[reg][0].real ; }
|
||
else
|
||
if ( c=='[' ) { goto Matrix; }
|
||
else
|
||
if ( ( '0'<=c )&&( c<='9' ) ) {
|
||
ExecPtr++;
|
||
dimA=c-'0';
|
||
MatOprand1num( SRC, reg, &dimA, &dimB );
|
||
goto Matrix2;
|
||
} else
|
||
if ( c=='%' ) ExecPtr++;
|
||
return LocalInt[reg][0] ;
|
||
}
|
||
if ( ( '0'<=c )&&( c<='9' ) ) {
|
||
ExecPtr--; return Eval_atoi( SRC, c );
|
||
}
|
||
|
||
switch ( c ) { // ( type C function ) sin cos tan...
|
||
case 0x7F: // 7F..
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0x40 : // Mat A[a,b]
|
||
Matjmp:
|
||
c=SRC[ExecPtr];
|
||
if ( ( ( 'A'<=c )&&( c<='Z' ) ) || ( ( 'a'<=c )&&( c<='z' ) ) ) { reg=c-'A'; ExecPtr++; }
|
||
else { reg=MatRegVar(SRC); if ( reg<0 ) CB_Error(SyntaxERR) ; } // Syntax error
|
||
Matrix1:
|
||
if ( SRC[ExecPtr] == '[' ) {
|
||
Matrix:
|
||
ExecPtr++;
|
||
MatOprandInt2( SRC, reg, &dimA, &dimB );
|
||
Matrix2:
|
||
if ( ErrorNo ) return 1 ; // error
|
||
} else { dspflag=3; // Mat A
|
||
dimA=MatAry[reg].Base; dimB=dimA;
|
||
CopyMatList2Ans( reg );
|
||
}
|
||
return ReadMatrixInt( reg, dimA, dimB);
|
||
|
||
case 0xFFFFFF84 : // Vct A[a,b]
|
||
reg=VctRegVar(SRC); if ( reg<0 ) CB_Error(SyntaxERR) ; // Syntax error
|
||
goto Matrix1;
|
||
|
||
case 0x51 : // List 1~26
|
||
case 0x6A : // List1
|
||
case 0x6B : // List2
|
||
case 0x6C : // List3
|
||
case 0x6D : // List4
|
||
case 0x6E : // List5
|
||
case 0x6F : // List6
|
||
reg=ListRegVar( SRC );
|
||
Listj:
|
||
if ( SRC[ExecPtr] == '[' ) {
|
||
ExecPtr++;
|
||
MatOprandInt1( SRC, reg, &dimA, &dimB ); // List 1[a]
|
||
if ( ErrorNo ) return 1 ; // error
|
||
} else { dspflag=4; // List 1
|
||
dimA=MatAry[reg].Base; dimB=dimA;
|
||
CopyMatList2Ans( reg );
|
||
}
|
||
return ReadMatrixInt( reg, dimA, dimB);
|
||
|
||
case 0x3A : // MOD(a,b)
|
||
Get2EvalInt( SRC, &tmp, &tmp2);
|
||
return fMODint(tmp,tmp2);
|
||
|
||
case 0x3C : // GCD(a,b)
|
||
Get2EvalInt( SRC, &tmp, &tmp2);
|
||
return fGCDint(tmp,tmp2);
|
||
|
||
case 0x3D : // LCM(a,b)
|
||
Get2EvalInt( SRC, &tmp, &tmp2);
|
||
return fLCMint(tmp,tmp2);
|
||
|
||
case 0xFFFFFF85 : // logab(a,b)
|
||
Get2EvalInt( SRC, &tmp, &tmp2);
|
||
return flogabint(tmp,tmp2);
|
||
|
||
case 0xFFFFFFB3 : // Not
|
||
return ( ! EvalIntsub5(SRC) ) ;
|
||
|
||
case 0xFFFFFF9F : // KeyRow(
|
||
return CB_KeyRow( SRC ) ;
|
||
case 0xFFFFFF8F : // Getkey
|
||
return CB_GetkeyEntry( SRC );
|
||
|
||
case 0xFFFFFF87 : // RanInt#(st,en)
|
||
if ( Get2EvalInt( SRC, &x, &y) == ',' ) {
|
||
ExecPtr++;
|
||
CB_RanInt( SRC, x, y );
|
||
}
|
||
return frandIntint( x, y ) ;
|
||
|
||
case 0xFFFFFFE9 : // CellSum(Mat A[x,y])
|
||
MatrixOprand( SRC, ®, &x, &y );
|
||
if ( ErrorNo ) return ; // error
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
return Cellsum( reg, x, y );
|
||
|
||
case 0x5F : // 1/128 Ticks
|
||
return CB_Ticks( SRC ); //
|
||
|
||
case 0xFFFFFFF0 : // GraphY str
|
||
case 0xFFFFFFF1: // Graphr
|
||
case 0xFFFFFFF2: // GraphXt
|
||
case 0xFFFFFFF3: // GraphYt
|
||
case 0xFFFFFFF4: // GraphX
|
||
return CBint_GraphYStr( SRC, 0 );
|
||
|
||
case 0xFFFFFFF5 : // IsExist(
|
||
return CB_IsExist( SRC, 0 );
|
||
case 0xFFFFFFF6 : // Peek(
|
||
return CB_PeekInt( SRC, EvalIntsubTop( SRC ) );
|
||
case 0xFFFFFFF8 : // VarPtr(
|
||
return CB_VarPtr( SRC );
|
||
case 0xFFFFFFFA : // ProgPtr(
|
||
return CB_ProgPtr( SRC );
|
||
case 0x00 : // Xmin
|
||
return Xmin;
|
||
case 0x01 : // Xmax
|
||
return Xmax;
|
||
case 0x02 : // Xscl
|
||
return Xscl;
|
||
case 0x04 : // Ymin
|
||
return Ymin;
|
||
case 0x05 : // Ymax
|
||
return Ymax;
|
||
case 0x06 : // Yscl
|
||
return Yscl;
|
||
case 0x08 : // Thetamin
|
||
return TThetamin;
|
||
case 0x09 : // Thetamax
|
||
return TThetamax;
|
||
case 0x0A : // Thetaptch
|
||
return TThetaptch;
|
||
case 0x0B : // Xfct
|
||
return Xfct;
|
||
case 0x0C : // Yfct
|
||
return Yfct;
|
||
|
||
case 0x29 : // Sigma( X, X, 1, 1000)
|
||
return CB_SigmaInt( SRC );
|
||
case 0x20 : // Max( List 1 ) Max( { 1,2,3,4,5 } )
|
||
return CB_MinMaxInt( SRC, 1 );
|
||
case 0x2D : // Min( List 1 ) Min( { 1,2,3,4,5 } )
|
||
return CB_MinMaxInt( SRC, 0 );
|
||
case 0x2E : // Mean( List 1 ) Mean( { 1,2,3,4,5 } )
|
||
return CB_MeanInt( SRC );
|
||
case 0x4C : // Sum List 1
|
||
return CB_SumInt( SRC );
|
||
case 0x4D : // Prod List 1)
|
||
return CB_ProdInt( SRC );
|
||
case 0x47: // Fill(
|
||
CB_MatFill(SRC);
|
||
return 3;
|
||
case 0x48: // Identity
|
||
CB_Identity(SRC);
|
||
return 3;
|
||
case 0x49: // Augment(
|
||
CB_Augment(SRC);
|
||
return 3;
|
||
case 0x2C: // Seq
|
||
CB_SeqInt(SRC);
|
||
return 3;
|
||
case 0x41: // Trn
|
||
CB_MatTrn(SRC);
|
||
return 3;
|
||
case 0x21: // Det
|
||
return Cplx_CB_MatDet(SRC).real;
|
||
|
||
case 0x46 : // Dim
|
||
result=CB_Dim( SRC );
|
||
if ( result >= 0 ) return result;
|
||
ExecPtr--; // error
|
||
break;
|
||
case 0x58 : // ElemSize( Mat A )
|
||
return CB_ElemSize( SRC );
|
||
case 0x59 : // RowSize( Mat A )
|
||
return CB_RowSize( SRC );
|
||
case 0x5A : // ColSize( Mat A )
|
||
return CB_ColSize( SRC );
|
||
case 0x5B : // MatBase( Mat A )
|
||
return CB_MatBase( SRC );
|
||
|
||
case 0x5C : // ListCmp( List 1, List 2)
|
||
return CB_ListCmp( SRC );
|
||
|
||
case 0x4A : // List>Mat( List 1, List 2,..) -> List 5
|
||
CB_List2Mat( SRC );
|
||
return 0;
|
||
case 0x4B : // Mat>List( Mat A, m) -> List n
|
||
CB_Mat2List( SRC );;
|
||
return 0;
|
||
|
||
case 0xFFFFFFCF : // System(
|
||
return CB_System( SRC );
|
||
case 0xFFFFFFDF : // Version
|
||
return CB_Version(); //
|
||
|
||
case 0xFFFFFF90 : // F Result
|
||
dspflag=4; // 2:value 3:Mat 4:List
|
||
return 0;
|
||
case 0xFFFFFF91 : // F Start
|
||
case 0xFFFFFF92 : // F End
|
||
case 0xFFFFFF93 : // F pitch
|
||
return REGf[c-0xFFFFFF90];
|
||
|
||
default:
|
||
ExecPtr--; // error
|
||
break;
|
||
}
|
||
break;
|
||
|
||
// case 0xFFFFFFC0 : // Ans
|
||
// return CBint_CurrentValue ;
|
||
case '&' : // & VarPtr
|
||
return CB_VarPtr( SRC ) ;
|
||
case 0xFFFFFFD0 : // const_PI
|
||
return const_PI ;
|
||
case 0xFFFFFFC1 : // Ran#
|
||
return CB_rand( SRC ) ;
|
||
case 0xFFFFFF97 : // abs
|
||
result = abs( EvalIntsub5( SRC ) );
|
||
return result ;
|
||
case 0xFFFFFFA6 : // int
|
||
case 0xFFFFFFDE : // intg
|
||
result = EvalIntsub5( SRC ) ;
|
||
return result ;
|
||
case 0xFFFFFFB6 : // frac
|
||
return 0 ;
|
||
case 0xFFFFFFA7 : // not
|
||
result = ~ ( EvalIntsub5( SRC ) );
|
||
return result ;
|
||
|
||
case '%' : // 1/128 Ticks
|
||
return CB_Ticks( SRC ); //
|
||
case '*' : // peek
|
||
return CB_PeekInt( SRC, EvalIntsub1( SRC ) ); //
|
||
case '@' : // Mat @A
|
||
ExecPtr--;
|
||
goto Matjmp;
|
||
|
||
case '{': // { 1,2,3,4,5... }->List Ans
|
||
// CB_List(SRC);
|
||
dspflag=4;
|
||
return 0;
|
||
case '[': // [ [0,1,2][2,3,4] ]->Mat Ans
|
||
// CB_Matrix(SRC);
|
||
dspflag=3;
|
||
return 0;
|
||
|
||
case 0xFFFFFF86 : // sqr
|
||
return fsqrtint( EvalIntsub5( SRC ) );
|
||
case 0xFFFFFF95 : // log10
|
||
return flog10int( EvalIntsub5( SRC ) );
|
||
case 0xFFFFFFB5 : // 10^
|
||
return fpow10int( EvalIntsub5( SRC ) );
|
||
case 0xFFFFFF85 : // ln
|
||
return flnint( EvalIntsub5( SRC ) );
|
||
case 0xFFFFFFA5 : // expn
|
||
return fexpint( EvalIntsub5( SRC ) );
|
||
case 0xFFFFFF96 : // cuberoot
|
||
return fcuberootint( EvalIntsub5( SRC ) );
|
||
|
||
case 0xFFFFFFF7: // F7..
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFFAF: // PxlTest(y,x)
|
||
y=(EvalIntsubTop( SRC ));
|
||
if ( SRC[ExecPtr] != ',' ) CB_Error(SyntaxERR) ; // Syntax error
|
||
ExecPtr++ ; // ',' skip
|
||
x=(EvalIntsubTop( SRC ));
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
result = PxlTest(y, x) ; //
|
||
return result ;
|
||
case 0xFFFFFFB0 : // SortA( List 1)
|
||
return CB_EvalSortAD( SRC, 1 );
|
||
case 0xFFFFFFB1 : // SortD( List 1)
|
||
return CB_EvalSortAD( SRC, 0 );
|
||
case 0xFFFFFFF4: // SysCall(
|
||
return CB_SysCall( SRC );
|
||
case 0xFFFFFFF5: // Call(
|
||
return CB_Call( SRC );
|
||
case 0xFFFFFFF8: // RefreshCtrl
|
||
return RefreshCtrl;
|
||
case 0xFFFFFFFA: // RefreshTime
|
||
return Refreshtime+1;
|
||
case 0xFFFFFFFB: // Screen
|
||
return ScreenMode;
|
||
case 0xFFFFFFFE: // BackLight
|
||
return BackLight(-1);
|
||
case 0xFFFFFFF2: // PopUpWin(
|
||
return CB_PopUpWin(SRC);
|
||
case 0xFFFFFFDE: // BatteryStatus
|
||
return CB_BatteryStatus(SRC);
|
||
default:
|
||
ExecPtr--; // error
|
||
break;
|
||
}
|
||
break;
|
||
case 0xFFFFFFF9: // F9..
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFFC6: // M_PixelTest(
|
||
return CB_ML_PixelTest( SRC );
|
||
case 0xFFFFFFD8: // M_Test
|
||
return CB_MLTest( SRC );
|
||
// case 0x53: // M_Contrast(
|
||
// return CB_ML_GetContrast( SRC );
|
||
case 0x31: // StrLen(
|
||
return CB_StrLen( SRC );
|
||
case 0x32: // StrCmp(
|
||
return CB_StrCmp( SRC );
|
||
case 0x33: // StrSrc(
|
||
return CB_StrSrc( SRC );
|
||
case 0x38: // Exp(
|
||
return CBint_EvalStr(SRC, 0 );
|
||
case 0x50: // StrAsc(
|
||
return CB_StrAsc( SRC );
|
||
// case 0x5F: // IsError(
|
||
// return CB_IsError(SRC);
|
||
case 0x60: // GetFont(
|
||
return CB_GetFont(SRC);
|
||
case 0x62: // GetFontMini(
|
||
return CB_GetFontMini(SRC);
|
||
case 0x21: // Xdot
|
||
return Xdot;
|
||
case 0x1B : // fn str
|
||
return CBint_FnStr( SRC, 0 );
|
||
|
||
case 0x4B: // DotP(
|
||
return CB_DotPInt( SRC );
|
||
case 0x4A: // CrossP(
|
||
CB_CrossP( SRC );
|
||
return 0;
|
||
case 0x6D: // Angle(
|
||
return CB_AngleV( SRC );
|
||
case 0x5E: // UnitV(
|
||
CB_UnitV( SRC );
|
||
return 0;
|
||
case 0x5B: // Norm(
|
||
return CB_NormVInt( SRC );
|
||
|
||
default:
|
||
ExecPtr--; // error
|
||
break;
|
||
}
|
||
break;
|
||
case 0xFFFFFFDD : // Eng
|
||
return ENG ;
|
||
default:
|
||
break;
|
||
}
|
||
if ( c == '#') {
|
||
result = EvalsubTopReal( SRC );
|
||
// result = Evalsub1( SRC );
|
||
return result;
|
||
} else
|
||
if ( c==' ' ) { while ( c==' ' )c=SRC[ExecPtr++]; goto topj; } // Skip Space
|
||
|
||
ExecPtr--;
|
||
reg=RegVarAliasEx( SRC ); if ( reg>=0 ) goto regj; // variable alias
|
||
CB_Error(SyntaxERR) ; // Syntax error
|
||
return 0 ;
|
||
}
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalIntObjectAlignE4g( unsigned int n ){ return n ; } // align +4byte
|
||
//int EvalIntObjectAlignE4h( unsigned int n ){ return n+n; } // align +6byte
|
||
//-----------------------------------------------------------------------------
|
||
int EvalIntsub2(char *SRC) { // 2nd Priority ( type B function ) ...
|
||
int cont=1;
|
||
int result,tmp;
|
||
int c;
|
||
result = EvalIntsub1( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFF8B : // ^2
|
||
result *= result ;
|
||
break;
|
||
case 0xFFFFFF9B : // ^(-1) RECIP
|
||
result = frecipint( result );
|
||
break;
|
||
case 0xFFFFFFAB : // !
|
||
result = ffactint( result );
|
||
break;
|
||
case ' ': // Skip Space
|
||
break;
|
||
default:
|
||
ExecPtr--;
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub4(char *SRC) { // 3rd Priority ( ^ ...)
|
||
int result,tmp;
|
||
int c;
|
||
result = EvalIntsub2( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFFA8 : // a ^ b
|
||
result = pow( result, EvalIntsub2( SRC ) );
|
||
break;
|
||
case 0xFFFFFFB8 : // powroot
|
||
result = pow( EvalIntsub2( SRC ), 1/result );
|
||
break;
|
||
case ' ': // Skip Space
|
||
break;
|
||
default:
|
||
ExecPtr--;
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub5(char *SRC) { // 5th Priority abbreviated multiplication
|
||
int result,tmp;
|
||
int c,execptr;
|
||
int dimA,dimB,reg,x,y;
|
||
result = EvalIntsub4( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr];
|
||
if ((( 'A'<=c )&&( c<='Z' )) ||
|
||
(( 'a'<=c )&&( c<='z' )) ||
|
||
( c == 0xFFFFFFCD ) || // <r>
|
||
( c == 0xFFFFFFCE ) || // Theta
|
||
( c == 0xFFFFFFD0 ) || // const_PI
|
||
( c == 0xFFFFFFC0 ) || // Ans
|
||
( c == 0xFFFFFFC1 )) { // Ran#
|
||
result *= EvalIntsub4( SRC ) ;
|
||
} else if ( c == 0x7F ) { // 7F..
|
||
c = SRC[ExecPtr+1];
|
||
if ( ( 0xFFFFFFB0 <= c ) && ( c <= 0xFFFFFFBD ) ) goto exitj; // And Or Not xor
|
||
result *= EvalIntsub4( SRC ) ;
|
||
} else if ( c == 0xFFFFFFF7 ) { // F7..
|
||
c = SRC[ExecPtr+1];
|
||
switch ( c ) {
|
||
case 0xFFFFFFAF: // PxlTest(y,x)
|
||
result *= EvalIntsub4( SRC ) ;
|
||
break;
|
||
default:
|
||
goto exitj;
|
||
break;
|
||
}
|
||
} else if ( c == 0xFFFFFFF9 ) { // F9..
|
||
c = SRC[ExecPtr+1];
|
||
switch ( c ) {
|
||
case 0x21: // Xdot
|
||
case 0x31: // StrLen(
|
||
case 0x32: // StrCmp(
|
||
case 0x33: // StrSrc(
|
||
case 0x38: // Exp(
|
||
case 0x4B: // DotP(
|
||
result *= EvalIntsub4( SRC ) ;
|
||
break;
|
||
default:
|
||
goto exitj;
|
||
break;
|
||
}
|
||
// } else if ( c == 0xFFFFFFE7 ) { // E7..
|
||
// c = SRC[ExecPtr+1];
|
||
// switch ( c ) {
|
||
// default:
|
||
// return result;
|
||
// break;
|
||
// }
|
||
} else {
|
||
exitj:
|
||
execptr=ExecPtr;
|
||
c=RegVarAliasEx(SRC);
|
||
if (c>0) { ExecPtr=execptr; result *= EvalIntsub4( SRC ) ; }
|
||
else return result;
|
||
}
|
||
}
|
||
}
|
||
int EvalIntsub7(char *SRC) { // 7th Priority abbreviated multiplication type A/C
|
||
int result,tmp;
|
||
int c;
|
||
result = EvalIntsub5( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr];
|
||
switch ( c ) {
|
||
case '(' :
|
||
case '{' :
|
||
case 0xFFFFFF97 : // abs
|
||
case 0xFFFFFFA6 : // int
|
||
case 0xFFFFFFB6 : // frac
|
||
case 0xFFFFFFDE : // intg
|
||
case 0xFFFFFF85 : // ln
|
||
case 0xFFFFFF86 : // sqr
|
||
case 0xFFFFFF95 : // log10
|
||
case 0xFFFFFF96 : // cuberoot
|
||
case 0xFFFFFFA5 : // expn
|
||
case 0xFFFFFFA7 : // Not
|
||
case 0xFFFFFFB5 : // 10^
|
||
case 0xFFFFFFB7 : // Neg
|
||
result *= EvalIntsub5( SRC );
|
||
break;
|
||
default:
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub10(char *SRC) { // 10th Priority ( *,/, int.,Rmdr )
|
||
int result,tmp;
|
||
int c;
|
||
result = EvalIntsub7( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFFA9 : // <20>~
|
||
result *= EvalIntsub7( SRC );
|
||
break;
|
||
case 0xFFFFFFB9 : // <20><>
|
||
tmp = EvalIntsub7( SRC );
|
||
if ( tmp == 0 ) CB_Error(DivisionByZeroERR); // Division by zero error
|
||
result /= tmp ;
|
||
break;
|
||
case 0x7F:
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFFBC: // Int<6E><74>
|
||
tmp = EvalIntsub7( SRC );
|
||
if ( tmp == 0 ) CB_Error(DivisionByZeroERR); // Division by zero error
|
||
result /= tmp ;
|
||
break;
|
||
case 0xFFFFFFBD: // Rmdr
|
||
tmp = EvalIntsub7( SRC );
|
||
result = fMODint( result, tmp );
|
||
break;
|
||
default:
|
||
ExecPtr-=2;
|
||
return result;
|
||
break;
|
||
}
|
||
break;
|
||
case 0xFFFFFF88 : // nPr
|
||
result = f_nPrint( result, EvalIntsub7( SRC ) );
|
||
break;
|
||
case 0xFFFFFF98 : // nCr
|
||
result = f_nCrint( result, EvalIntsub7( SRC ) );
|
||
break;
|
||
case ' ': // Skip Space
|
||
break;
|
||
default:
|
||
ExecPtr--;
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub11(char *SRC) { // 11th Priority ( +,- )
|
||
int result;
|
||
int c;
|
||
result = EvalIntsub10( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case 0xFFFFFF89 : // +
|
||
result += EvalIntsub10( SRC );
|
||
break;
|
||
case 0xFFFFFF99 : // -
|
||
result -= EvalIntsub10( SRC );
|
||
break;
|
||
case ' ': // Skip Space
|
||
break;
|
||
default:
|
||
ExecPtr--;
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub12(char *SRC) { // 12th Priority ( =,!=,><,>=,<= )
|
||
int result;
|
||
int c;
|
||
result = EvalIntsub11( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr++];
|
||
switch ( c ) {
|
||
case '=' : // =
|
||
result = ( result == EvalIntsub11( SRC ) );
|
||
break;
|
||
case '>' : // >
|
||
result = ( result > EvalIntsub11( SRC ) );
|
||
break;
|
||
case '<' : // <
|
||
result = ( result < EvalIntsub11( SRC ) );
|
||
break;
|
||
case 0x11 : // !=
|
||
result = ( result != EvalIntsub11( SRC ) );
|
||
break;
|
||
case 0x12 : // >=
|
||
result = ( result >= EvalIntsub11( SRC ) );
|
||
break;
|
||
case 0x10 : // <=
|
||
result = ( result <= EvalIntsub11( SRC ) );
|
||
break;
|
||
case 0xFFFFFF9A : // xor
|
||
result = ( result ^ EvalIntsub11( SRC ) );
|
||
break;
|
||
case '|' : // or
|
||
case 0xFFFFFFAA : // or
|
||
result = ( result | EvalIntsub11( SRC ) );
|
||
break;
|
||
case '&' : // and
|
||
case 0xFFFFFFBA : // and
|
||
result = ( result & EvalIntsub11( SRC ) );
|
||
break;
|
||
case ' ': // Skip Space
|
||
break;
|
||
default:
|
||
ExecPtr--;
|
||
return result;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int EvalIntsub13(char *SRC) { // 13th Priority ( And,and)
|
||
int result;
|
||
int c;
|
||
result = EvalIntsub12( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr];
|
||
if ( c == 0x7F ) {
|
||
c = SRC[ExecPtr+1];
|
||
switch ( c ) {
|
||
case 0xFFFFFFB0 : // And
|
||
ExecPtr+=2;
|
||
result = ( ( result != 0 ) & ( EvalIntsub12( SRC ) != 0 ) );
|
||
break;
|
||
default:
|
||
return result;
|
||
break;
|
||
}
|
||
} else
|
||
if ( c == ' ' ) ExecPtr++; // Skip Space
|
||
else return result;
|
||
}
|
||
}
|
||
int EvalIntsub14(char *SRC) { // 14th Priority ( Or,Xor,or,xor,xnor )
|
||
int result;
|
||
int c;
|
||
result = EvalIntsub13( SRC );
|
||
while ( 1 ) {
|
||
c = SRC[ExecPtr];
|
||
if ( c == 0x7F ) {
|
||
c = SRC[ExecPtr+1];
|
||
switch ( c ) {
|
||
case 0xFFFFFFB1 : // Or
|
||
ExecPtr+=2;
|
||
result = ( ( result != 0 ) | ( EvalIntsub13( SRC ) != 0 ) );
|
||
break;
|
||
case 0xFFFFFFB4 : // Xor
|
||
ExecPtr+=2;
|
||
result = ( ( result != 0 ) ^ ( EvalIntsub13( SRC ) != 0 ) );
|
||
break;
|
||
default:
|
||
return result;
|
||
break;
|
||
}
|
||
} else
|
||
if ( c == ' ' ) ExecPtr++; // Skip Space
|
||
else return result;
|
||
}
|
||
}
|
||
|
||
//----------------------------------------------------------------------------------------------
|
||
int EvalInt(char *SRC) { // Eval temp
|
||
int result;
|
||
int execptr=ExecPtr;
|
||
int oplen=strlenOp((char*)SRC);
|
||
if ( oplen == 0 ) return 0;
|
||
ExecPtr= 0;
|
||
ErrorPtr= 0;
|
||
ErrorNo = 0;
|
||
result = EvalIntsubTop( SRC );
|
||
if ( ExecPtr < oplen ) CB_Error(SyntaxERR) ; // Syntax error
|
||
if ( ErrorNo ) { CB_ErrMsg( ErrorNo ); }
|
||
ExecPtr=execptr;
|
||
return result;
|
||
}
|
||
|
||
//----------------------------------------------------------------------------------------------
|
||
//----------------------------------------------------------------------------------------------
|
||
int tickstmp=0;
|
||
int Hitickstmp=0;
|
||
#define P7305_EXTRA_TMU5_COUNT 0xA44D00D8
|
||
|
||
unsigned int GetTicks32768(){
|
||
if ( IsSH3 ) return RTC_GetTicks()<<8;
|
||
return *(unsigned int*)P7305_EXTRA_TMU5_COUNT;
|
||
}
|
||
|
||
void CB_StoreTicks( char *SRC, int value ) {
|
||
int n;
|
||
int high=0;
|
||
int t;
|
||
if ( SRC[ExecPtr] == '%' ) { // hi-res timer
|
||
ExecPtr++;
|
||
if ( IsSH3 == 0 ) high=1;
|
||
}
|
||
if ( high ) {
|
||
t=(int)GetTicks32768();
|
||
CB_HiTicksAdjust=t-value;
|
||
} else {
|
||
t=RTC_GetTicks();
|
||
CB_TicksAdjust=t-value;
|
||
}
|
||
skip_count=0;
|
||
}
|
||
|
||
int CB_RTC_GetTicks( int high ) {
|
||
if ( high ) return CB_HiTicksAdjust-(int)GetTicks32768() ;
|
||
return RTC_GetTicks()-CB_TicksAdjust ;
|
||
}
|
||
int CB_Ticks( char *SRC ) {
|
||
int n;
|
||
int high=0;
|
||
int t;
|
||
if ( SRC[ExecPtr] == '%' ) { // hi-res timer
|
||
ExecPtr++;
|
||
if ( IsSH3 == 0 ) high=1;
|
||
}
|
||
t=CB_RTC_GetTicks(high);
|
||
if ( SRC[ExecPtr]==0xFFFFFFF9 ) {
|
||
if ( SRC[ExecPtr+1]==0x4F ) { // Wait
|
||
ExecPtr+=2; // TicksWait n
|
||
n = CB_EvalInt( SRC );
|
||
dspflag=0;
|
||
if ( high ) {
|
||
if ( n<0 ) n=-n; else Hitickstmp=CB_RTC_GetTicks(high);
|
||
do {
|
||
if ( KeyScanDownAC() ) { KeyRecover(); if ( BreakCheck ) BreakPtr=ExecPtr; return t; } // [AC] break?
|
||
t=CB_RTC_GetTicks(high);
|
||
} while ( abs( t-Hitickstmp ) <= n ) ;
|
||
Hitickstmp=CB_RTC_GetTicks(high);
|
||
return Hitickstmp;
|
||
} else {
|
||
if ( n<0 ) n=-n; else tickstmp=CB_RTC_GetTicks(high);
|
||
do {
|
||
if ( KeyScanDownAC() ) { KeyRecover(); if ( BreakCheck ) BreakPtr=ExecPtr; return t; } // [AC] break?
|
||
t=CB_RTC_GetTicks(high);
|
||
} while ( abs( t-tickstmp ) <= n ) ;
|
||
tickstmp=CB_RTC_GetTicks(high);
|
||
return tickstmp;
|
||
}
|
||
}
|
||
}
|
||
return t;
|
||
}
|
||
|
||
int CB_Getkey3( char *SRC ) {
|
||
int key,tmpkey=0;
|
||
int result=0;
|
||
int shift=0;
|
||
int time1,time2;
|
||
int t0=CB_RTC_GetTicks(0);
|
||
if ( SRC[ExecPtr] != '(' ) { CB_Error(SyntaxERR); return 0; } // Syntax error
|
||
ExecPtr++;
|
||
time1 = CB_EvalInt( SRC );
|
||
if ( SRC[ExecPtr] == ',' ) {
|
||
ExecPtr++;
|
||
time2 = CB_EvalInt( SRC );
|
||
} else time2 = t0;
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
|
||
do {
|
||
key=CB_Getkey();
|
||
if ( key == 34 ) return key; // [AC]
|
||
if ( key ) tmpkey=key;
|
||
} while ( abs ( CB_RTC_GetTicks(0) - time2 ) < time1 ) ;
|
||
key=tmpkey;
|
||
return key;
|
||
}
|
||
|
||
int CB_KeyRowSub(int row){
|
||
if ( IsSH3 ) {
|
||
return ( CheckKeyRow(row) ) ; //SH3
|
||
}
|
||
else {
|
||
return ( CheckKeyRow7305(row) ) ; //SH4A
|
||
}
|
||
}
|
||
|
||
int CB_KeyRow( char *SRC ) { // Row Keyscan
|
||
int row;
|
||
row = CB_EvalInt( SRC );
|
||
if ( SRC[ExecPtr] == ')' ) ExecPtr++;
|
||
|
||
return CB_KeyRowSub(row) ;
|
||
}
|
||
|
||
//----------------------------------------------------------------------------------------------
|
||
int CB_GetkeyM() { // Getkey multi -> list { }
|
||
// 6 5 4 3 2 1
|
||
// char keycode9[]={ 79,69,59,49,39,29};
|
||
// char keycode8[]={ 78,68,58,48,38,28};
|
||
// char keycode7[]={ 77,67,57,47,37,27};
|
||
// char keycode6[]={ 76,66,56,46,36,26};
|
||
// char keycode5[]={ 75,65,55,45,35,25};
|
||
// char keycode4[]={ 74,64,54,44,34,24};
|
||
// char keycode3[]={ 73,63,53,43,33,23};
|
||
// char keycode2[]={ 72,62,52,42,32,22};
|
||
// char keycode1[]={ 71,61,51,41,31,21};
|
||
|
||
char rowdata[10];
|
||
char result[55];
|
||
int i,j,a,b,c=0,code;
|
||
for(i=1; i<=9; i++) rowdata[i]=CB_KeyRowSub(i);
|
||
b=128;
|
||
for(j=6; j>=1; j--) {
|
||
b>>=1;
|
||
for(i=9; i>=1; i--) {
|
||
if ( rowdata[i] & b ) {
|
||
code = i+(j+1)*10;
|
||
if ( IsSH3==2 ) { // slim
|
||
code = KeyConvert2Slim( code );
|
||
}
|
||
result[c++] = code;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
dspflag=4; // List ans
|
||
if ( c==0 ) {
|
||
c=1;
|
||
result[0]=0;
|
||
}
|
||
|
||
NewMatListAns( c, 1, 1, 8 ); // List Ans[c].b
|
||
for (i=0; i<c; i++) {
|
||
WriteMatrix( CB_MatListAnsreg, i+1, 1, result[i] ) ; //
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int CB_GetkeyEntry( char *SRC ) { // CB_GetKey entry
|
||
int c = SRC[ExecPtr],d;
|
||
int result,sdkcode=0;
|
||
if ( c=='@' ) { sdkcode=1; c = SRC[++ExecPtr]; } // Getkey SDK code
|
||
if ( ( ( '0'<=c )&&( c<='3' )) || ( c=='m') || ( c=='M') ) {
|
||
ExecPtr++ ;
|
||
switch ( c ) {
|
||
case 'M':
|
||
case 'm':
|
||
result=CB_GetkeyM() ;
|
||
break;
|
||
case '3':
|
||
result=CB_Getkey3( SRC ) ;
|
||
break;
|
||
default:
|
||
result=CB_GetkeyN( c-'0', 1, sdkcode ) ;
|
||
break;
|
||
}
|
||
} else result=CB_Getkey();
|
||
if ( sdkcode==0 ) if ( result==34 ) if (BreakCheck) { BreakPtr=ExecPtr; KeyRecover(); }
|
||
return result;
|
||
}
|
||
|
||
//----------------------------------------------------------------------------------------------
|
||
|
||
void CB_Wait( char *SRC ) {
|
||
int n;
|
||
n = CB_EvalInt( SRC );
|
||
if ( n < 0 ) { CB_Error(ArgumentERR); return ; } // Argument error
|
||
Waitcount = n ;
|
||
}
|
||
|
||
//----------------------------------------------------------------------------------------------
|
||
//-----------------------------------------------------------------------------
|
||
//int EvalIntObjectAlign6e( unsigned int n ){ return n+n; } // align +6byte
|
||
//int EvalIntObjectAlign4f( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4g( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4h( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4i( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4j( unsigned int n ){ return n; } // align +4byte
|
||
//int EvalIntObjectAlign4k( unsigned int n ){ return n; } // align +4byte
|