From 23d5f003b063daf60c2f1837bae653a637091944 Mon Sep 17 00:00:00 2001 From: afanofosc Date: Thu, 9 Feb 2012 06:12:26 +0000 Subject: version 1.32 added variable-based jumps and calls/exittos added toupper and tolower arrops added text drawing to any Y value git-svn-id: https://mindboards.svn.sourceforge.net/svnroot/mindboards/lms_nbcnxc/branches/version_131@45 c9361245-7fe8-9947-84e8-057757c4e366 --- AT91SAM7S256/Source/c_cmd.c | 123 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 109 insertions(+), 14 deletions(-) (limited to 'AT91SAM7S256/Source/c_cmd.c') diff --git a/AT91SAM7S256/Source/c_cmd.c b/AT91SAM7S256/Source/c_cmd.c index fca498f..2909201 100644 --- a/AT91SAM7S256/Source/c_cmd.c +++ b/AT91SAM7S256/Source/c_cmd.c @@ -2115,11 +2115,11 @@ NXT_STATUS cCmdActivateProgram(UBYTE * pFileName) if((!isString2 || !isString3) || t1 == TC_ARRAY) // allow strings to go scalar, don't let through element compares of bytes or Bools isScalarBinop= FALSE; } - else if(opCode == OP_BRCMP) + else if(opCode == OP_BRCMP || opCode == OP_BRCMPABSVAR) isScalarBinop= FALSE; } } - else if(InstrSize == 6 && isT2Agg && (opCode == OP_NOT || opCode == OP_BRTST)) + else if(InstrSize == 6 && isT2Agg && (opCode == OP_NOT || opCode == OP_BRTST || opCode == OP_BRTSTABSVAR)) isScalarUnop2= FALSE; } pInstr += InstrSize/2; @@ -4740,6 +4740,7 @@ afterCompaction: NXT_STATUS cCmdInterpUnop1(CODE_WORD * const pCode) { + CLUMP_REC* pClumpRec = &(VarsCmd.pAllClumps[VarsCmd.RunQ.Head]); NXT_STATUS Status = NO_ERR; UBYTE opCode; DATA_ARG Arg1; @@ -4759,6 +4760,14 @@ NXT_STATUS cCmdInterpUnop1(CODE_WORD * const pCode) } break; + case OP_JMPABSVAR: + { + CODE_INDEX pc = (CODE_INDEX)(pClumpRec->PC-pClumpRec->CodeStart); + gPCDelta = (SWORD)Arg1-(SWORD)pc; + Status = NO_ERR; + } + break; + case OP_ACQUIRE: { NXT_ASSERT(cCmdIsDSElementIDSane(Arg1)); @@ -4795,9 +4804,18 @@ NXT_STATUS cCmdInterpUnop1(CODE_WORD * const pCode) break; case OP_FINCLUMPIMMED: + case OP_FINCLUMPVAR: { CLUMP_ID Clump= VarsCmd.RunQ.Head; // DeQ changes Head, use local val cCmdDeQClump(&(VarsCmd.RunQ), Clump); //Dequeue finalized clump + if (opCode == OP_FINCLUMPVAR) + { + // indirect clump reference + if (cCmdDSType(Arg1) <= TC_LAST_INT_SCALAR) + Arg1 = cCmdGetScalarValFromDataArg(Arg1, 0); + else + return (ERR_INSTR); + } cCmdSchedDependent(Clump, (CLUMP_ID)Arg1); // Use immediate form Status = CLUMP_DONE; @@ -4837,15 +4855,32 @@ NXT_STATUS cCmdInterpUnop1(CODE_WORD * const pCode) break; case OP_STOPCLUMPIMMED: + case OP_STOPCLUMPVAR: { + if (opCode == OP_STOPCLUMPVAR) + { + // indirect clump reference + if (cCmdDSType(Arg1) <= TC_LAST_INT_SCALAR) + Arg1 = cCmdGetScalarValFromDataArg(Arg1, 0); + else + return (ERR_INSTR); + } // Release any mutexes that the clump we are stopping owns - CLUMP_ID Clump = (CLUMP_ID)Arg1; - cCmdStopClump(Clump); + cCmdStopClump((CLUMP_ID)Arg1); } break; case OP_STARTCLUMPIMMED: + case OP_STARTCLUMPVAR: { + if (opCode == OP_STARTCLUMPVAR) + { + // indirect clump reference + if (cCmdDSType(Arg1) <= TC_LAST_INT_SCALAR) + Arg1 = cCmdGetScalarValFromDataArg(Arg1, 0); + else + return (ERR_INSTR); + } CLUMP_ID Clump = (CLUMP_ID)Arg1; // only enqueue the clump if it is not already on one of the queues // otherwise this is a no-op @@ -4874,6 +4909,7 @@ NXT_STATUS cCmdInterpUnop1(CODE_WORD * const pCode) ULONG scalarNots= 0, scalarBrtst= 0, scalarUn2Other= 0, scalarUn2Dispatch= 0, polyUn2Dispatch= 0; NXT_STATUS cCmdInterpScalarUnop2(CODE_WORD * const pCode) { + CLUMP_REC* pClumpRec = &(VarsCmd.pAllClumps[VarsCmd.RunQ.Head]); NXT_STATUS Status; UBYTE opCode; @@ -4897,7 +4933,7 @@ NXT_STATUS cCmdInterpScalarUnop2(CODE_WORD * const pCode) Status = NO_ERR; scalarNots ++; } - else if(opCode == OP_BRTST) + else if(opCode == OP_BRTST || opCode == OP_BRTSTABSVAR) { ULONG Branch, compare= COMP_CODE(pCode); ULONG TypeCode; @@ -4930,8 +4966,12 @@ NXT_STATUS cCmdInterpScalarUnop2(CODE_WORD * const pCode) || (compare == OPCC1_GTEQ && SVal1 >= 0)); } } - if (Branch) - gPCDelta = (SWORD)Arg1; + if (Branch) { + if (opCode == OP_BRTST) + gPCDelta = (SWORD)Arg1; + else + gPCDelta = (UWORD)Arg1 - (pClumpRec->PC-pClumpRec->CodeStart); + } else gPCDelta= 3; Status = NO_ERR; @@ -4946,6 +4986,7 @@ NXT_STATUS cCmdInterpScalarUnop2(CODE_WORD * const pCode) NXT_STATUS cCmdInterpUnop2(CODE_WORD * const pCode) { + CLUMP_REC* pClumpRec = &(VarsCmd.pAllClumps[VarsCmd.RunQ.Head]); NXT_STATUS Status = NO_ERR; UBYTE opCode; DATA_ARG Arg1; @@ -5003,6 +5044,7 @@ NXT_STATUS cCmdInterpUnop2(CODE_WORD * const pCode) break; case OP_BRTST: + case OP_BRTSTABSVAR: { //!!!BDUGGAN BRTST w/ Float? ULONG Branch, compare= COMP_CODE(pCode); @@ -5025,7 +5067,10 @@ NXT_STATUS cCmdInterpUnop2(CODE_WORD * const pCode) if (Branch) { - gPCDelta = (SWORD)Arg1; + if (opCode == OP_BRTST) + gPCDelta = (SWORD)Arg1; + else + gPCDelta = (UWORD)Arg1 - (pClumpRec->PC-pClumpRec->CodeStart); Status = NO_ERR; } } @@ -5054,7 +5099,15 @@ NXT_STATUS cCmdInterpUnop2(CODE_WORD * const pCode) break; case OP_SUBCALL: + case OP_SUBCALLVAR: { + if (opCode == OP_SUBCALLVAR) + { + if (cCmdDSType(Arg1) <= TC_LAST_INT_SCALAR) + Arg1 = cCmdGetScalarValFromDataArg(Arg1, 0); + else + return (ERR_INSTR); + } NXT_ASSERT(cCmdIsClumpIDSane((CLUMP_ID)Arg1)); NXT_ASSERT(!cCmdIsClumpOnQ(&(VarsCmd.RunQ), (CLUMP_ID)Arg1)); @@ -5606,6 +5659,7 @@ NXT_STATUS cCmdIOGetSet(ULONG opCode, DATA_ARG Arg1, DATA_ARG Arg2, DATA_ARG Arg ULONG scalarCmp= 0, scalarFloatCmp= 0, recursiveCmp= 0, PolyScalarCmp= 0, polyPolyCmp= 0, scalarOther= 0, scalarBinopDispatch= 0, polyBinopDispatch= 0; NXT_STATUS cCmdInterpScalarBinop(CODE_WORD * const pCode) { + CLUMP_REC* pClumpRec = &(VarsCmd.pAllClumps[VarsCmd.RunQ.Head]); NXT_STATUS Status; UBYTE opCode; UBYTE CmpBool; @@ -5649,7 +5703,7 @@ NXT_STATUS cCmdInterpScalarBinop(CODE_WORD * const pCode) scalarFloatCmp++; } } - else if(opCode == OP_BRCMP) { // t2 and t3 guaranteed scalar + else if(opCode == OP_BRCMP || opCode == OP_BRCMPABSVAR) { // t2 and t3 guaranteed scalar TYPE_CODE TypeCode2, TypeCode3; ULONG ArgVal2, ArgVal3; @@ -5662,10 +5716,14 @@ NXT_STATUS cCmdInterpScalarBinop(CODE_WORD * const pCode) ArgVal3= cCmdGetScalarValFromDataArg(Arg3, 0); CmpBool= cCmdCompare(COMP_CODE(pCode), ArgVal2, ArgVal3, TypeCode2, TypeCode3); - if (CmpBool) - gPCDelta = (SWORD)Arg1; - else - gPCDelta= 4; + if (CmpBool) { + if (opCode == OP_BRCMP) + gPCDelta = (SWORD)Arg1; + else + gPCDelta = (UWORD)Arg1-(pClumpRec->PC-pClumpRec->CodeStart); + } + else + gPCDelta = 4; Status= NO_ERR; } else if(opCode >= OP_SETIN && opCode <= OP_GETOUT) { @@ -5685,6 +5743,7 @@ NXT_STATUS cCmdInterpScalarBinop(CODE_WORD * const pCode) NXT_STATUS cCmdInterpBinop(CODE_WORD * const pCode) { + CLUMP_REC* pClumpRec = &(VarsCmd.pAllClumps[VarsCmd.RunQ.Head]); NXT_STATUS Status = NO_ERR; UBYTE opCode; DATA_ARG Arg1, Arg2, Arg3; @@ -5742,6 +5801,7 @@ NXT_STATUS cCmdInterpBinop(CODE_WORD * const pCode) break; case OP_BRCMP: + case OP_BRCMPABSVAR: { TYPE_CODE TypeCode2= cCmdDSType(Arg2), TypeCode3= cCmdDSType(Arg3); if(TypeCode2 <= TC_LAST_INT_SCALAR && TypeCode3 <= TC_LAST_INT_SCALAR) { @@ -5755,6 +5815,8 @@ NXT_STATUS cCmdInterpBinop(CODE_WORD * const pCode) if (CmpBool) gPCDelta = (SWORD)Arg1; + else + gPCDelta = (UWORD)Arg1 - (pClumpRec->PC-pClumpRec->CodeStart); } break; @@ -7324,11 +7386,17 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) // array operation if (Arg1 == OPARR_SORT) { - // source must be an array of non-aggregate type + // destination must be an array of non-aggregate type NXT_ASSERT(cCmdDSType(Arg2) == TC_ARRAY); TypeCode2 = cCmdDSType(INC_ID(Arg2)); NXT_ASSERT(!IS_AGGREGATE_TYPE(TypeCode2)); } + else if (Arg1 == OPARR_TOUPPER || Arg1 == OPARR_TOLOWER) { + // destination must be an array of ubyte type + NXT_ASSERT(cCmdDSType(Arg2) == TC_ARRAY); + TypeCode2 = cCmdDSType(INC_ID(Arg2)); + NXT_ASSERT(TypeCode2 == TC_UBYTE); + } else { // destination must be a non-aggregate type NXT_ASSERT(!IS_AGGREGATE_TYPE(cCmdDSType(Arg2))); @@ -7556,6 +7624,33 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) else if (TypeCode2 == TC_FLOAT) shell_sort_flt(pArg2, MinCount); } + else if (Arg1 == OPARR_TOUPPER || Arg1 == OPARR_TOLOWER) + { + NXT_ASSERT((cCmdDSType(Arg3) == TC_ARRAY) && (cCmdDSType(INC_ID(Arg3)) == TC_UBYTE)); + //Allocate Dst array + Status = cCmdDSArrayAlloc(Arg2, 0, MinCount); + if (IS_ERR(Status)) + return Status; + + UBYTE *pDst = cCmdResolveDataArg(Arg2, 0, NULL); + UBYTE *pSrc = cCmdResolveDataArg(Arg3, 0, NULL); + + //Move src to dst + for (i = 0; i < ArrayCount3; i++) + { + UBYTE ch = *pSrc; + if ((i >= ArgVal4) && (i <= ArgVal4+MinCount)) + { + if ((Arg1 == OPARR_TOUPPER) && (ch >= 'a') && (ch <= 'z')) + ch -= 0x20; + else if ((Arg1 == OPARR_TOLOWER) && (ch >= 'A') && (ch <= 'Z')) + ch += 0x20; + } + *pDst = ch; + pDst++; + pSrc++; + } + } else { //Fatal error: Unrecognized instruction -- cgit v1.2.3