diff options
Diffstat (limited to 'ldmicro/simulate.cpp')
-rw-r--r-- | ldmicro/simulate.cpp | 1457 |
1 files changed, 714 insertions, 743 deletions
diff --git a/ldmicro/simulate.cpp b/ldmicro/simulate.cpp index cf23731..ecb9b0e 100644 --- a/ldmicro/simulate.cpp +++ b/ldmicro/simulate.cpp @@ -31,9 +31,8 @@ #include <limits.h> #include "ldmicro.h" -// #include "simulate.h" #include "intcode.h" -// #include "freeze.h" +#include "freezeLD.h" static struct { char name[MAX_NAME_LEN]; @@ -107,126 +106,117 @@ static char *MarkUsedVariable(char *name, DWORD flag); // Looks in the SingleBitItems list; if an item is not present then it is // FALSE by default. //----------------------------------------------------------------------------- -/* -static BOOL SingleBitOn(char *name) -{ - int i; - for(i = 0; i < SingleBitItemsCount; i++) { - if(strcmp(SingleBitItems[i].name, name)==0) { - return SingleBitItems[i].powered; - } - } - return FALSE; -} +// static BOOL SingleBitOn(char *name) +// { +// int i; +// for(i = 0; i < SingleBitItemsCount; i++) { +// if(strcmp(SingleBitItems[i].name, name)==0) { +// return SingleBitItems[i].powered; +// } +// } +// return FALSE; +// } //----------------------------------------------------------------------------- // Set the state of a single-bit item. Adds it to the list if it is not there // already. //----------------------------------------------------------------------------- -static void SetSingleBit(char *name, BOOL state) -{ - int i; - for(i = 0; i < SingleBitItemsCount; i++) { - if(strcmp(SingleBitItems[i].name, name)==0) { - if((name[0] == 'Y') && (SingleBitItems[i].powered != state)) - { - TranslateState(name, state); - // char Debug[256]; - // sprintf_s(Debug, "SetSingleBit: \tname: %s \t state: %d\n", - // name, state); - // OutputDebugString(Debug); - } - SingleBitItems[i].powered = state; - return; - } - } - if(i < MAX_IO) { - strcpy(SingleBitItems[i].name, name); - SingleBitItems[i].powered = state; - SingleBitItemsCount++; - } -} +// static void SetSingleBit(char *name, BOOL state) +// { +// int i; +// for(i = 0; i < SingleBitItemsCount; i++) { +// if(strcmp(SingleBitItems[i].name, name)==0) { +// SingleBitItems[i].powered = state; +// return; +// } +// } +// if(i < MAX_IO) { +// strcpy(SingleBitItems[i].name, name); +// SingleBitItems[i].powered = state; +// SingleBitItemsCount++; +// } +// } //----------------------------------------------------------------------------- // Count a timer up (i.e. increment its associated count by 1). Must already // exist in the table. //----------------------------------------------------------------------------- -static void IncrementVariable(char *name) -{ - int i; - for(i = 0; i < VariablesCount; i++) { - if(strcmp(Variables[i].name, name)==0) { - (Variables[i].val)++; - return; - } - } - oops(); -} +// static void IncrementVariable(char *name) +// { +// int i; +// for(i = 0; i < VariablesCount; i++) { +// if(strcmp(Variables[i].name, name)==0) { +// (Variables[i].val)++; +// return; +// } +// } +// oops(); +// } //----------------------------------------------------------------------------- // Set a variable to a value. //----------------------------------------------------------------------------- -static void SetSimulationVariable(char *name, SWORD val) -{ - int i; - for(i = 0; i < VariablesCount; i++) { - if(strcmp(Variables[i].name, name)==0) { - Variables[i].val = val; - return; - } - } - MarkUsedVariable(name, VAR_FLAG_OTHERWISE_FORGOTTEN); - SetSimulationVariable(name, val); -} +// static void SetSimulationVariable(char *name, SWORD val) +// { +// int i; +// for(i = 0; i < VariablesCount; i++) { +// if(strcmp(Variables[i].name, name)==0) { +// Variables[i].val = val; +// return; +// } +// } +// MarkUsedVariable(name, VAR_FLAG_OTHERWISE_FORGOTTEN); +// SetSimulationVariable(name, val); +// } //----------------------------------------------------------------------------- // Read a variable's value. //----------------------------------------------------------------------------- -SWORD GetSimulationVariable(char *name) -{ - int i; - for(i = 0; i < VariablesCount; i++) { - if(strcmp(Variables[i].name, name)==0) { - return Variables[i].val; - } - } - MarkUsedVariable(name, VAR_FLAG_OTHERWISE_FORGOTTEN); - return GetSimulationVariable(name); -} +// SWORD GetSimulationVariable(char *name) +// { +// int i; +// for(i = 0; i < VariablesCount; i++) { +// if(strcmp(Variables[i].name, name)==0) { +// return Variables[i].val; +// } +// } +// MarkUsedVariable(name, VAR_FLAG_OTHERWISE_FORGOTTEN); +// return GetSimulationVariable(name); +// } //----------------------------------------------------------------------------- // Set the shadow copy of a variable associated with a READ ADC operation. This // will get committed to the real copy when the rung-in condition to the // READ ADC is true. //----------------------------------------------------------------------------- -void SetAdcShadow(char *name, SWORD val) -{ - int i; - for(i = 0; i < AdcShadowsCount; i++) { - if(strcmp(AdcShadows[i].name, name)==0) { - AdcShadows[i].val = val; - return; - } - } - strcpy(AdcShadows[i].name, name); - AdcShadows[i].val = val; - AdcShadowsCount++; -} +// void SetAdcShadow(char *name, SWORD val) +// { +// int i; +// for(i = 0; i < AdcShadowsCount; i++) { +// if(strcmp(AdcShadows[i].name, name)==0) { +// AdcShadows[i].val = val; +// return; +// } +// } +// strcpy(AdcShadows[i].name, name); +// AdcShadows[i].val = val; +// AdcShadowsCount++; +// } //----------------------------------------------------------------------------- // Return the shadow value of a variable associated with a READ ADC. This is // what gets copied into the real variable when an ADC read is simulated. //----------------------------------------------------------------------------- -SWORD GetAdcShadow(char *name) -{ - int i; - for(i = 0; i < AdcShadowsCount; i++) { - if(strcmp(AdcShadows[i].name, name)==0) { - return AdcShadows[i].val; - } - } - return 0; -} +// SWORD GetAdcShadow(char *name) +// { +// int i; +// for(i = 0; i < AdcShadowsCount; i++) { +// if(strcmp(AdcShadows[i].name, name)==0) { +// return AdcShadows[i].val; +// } +// } +// return 0; +// } //----------------------------------------------------------------------------- // Mark how a variable is used; a series of flags that we can OR together, @@ -234,62 +224,62 @@ SWORD GetAdcShadow(char *name) // (e.g. just a TON, an RTO with its reset, etc.). Returns NULL for success, // else an error string. //----------------------------------------------------------------------------- -static char *MarkUsedVariable(char *name, DWORD flag) -{ - int i; - for(i = 0; i < VariablesCount; i++) { - if(strcmp(Variables[i].name, name)==0) { - break; - } - } - if(i >= MAX_IO) return ""; - - if(i == VariablesCount) { - strcpy(Variables[i].name, name); - Variables[i].usedFlags = 0; - Variables[i].val = 0; - VariablesCount++; - } - - switch(flag) { - case VAR_FLAG_TOF: - if(Variables[i].usedFlags != 0) - return _("TOF: variable cannot be used elsewhere"); - break; - - case VAR_FLAG_TON: - if(Variables[i].usedFlags != 0) - return _("TON: variable cannot be used elsewhere"); - break; +// static char *MarkUsedVariable(char *name, DWORD flag) +// { +// int i; +// for(i = 0; i < VariablesCount; i++) { +// if(strcmp(Variables[i].name, name)==0) { +// break; +// } +// } +// if(i >= MAX_IO) return ""; + +// if(i == VariablesCount) { +// strcpy(Variables[i].name, name); +// Variables[i].usedFlags = 0; +// Variables[i].val = 0; +// VariablesCount++; +// } + +// switch(flag) { +// case VAR_FLAG_TOF: +// if(Variables[i].usedFlags != 0) +// return _("TOF: variable cannot be used elsewhere"); +// break; + +// case VAR_FLAG_TON: +// if(Variables[i].usedFlags != 0) +// return _("TON: variable cannot be used elsewhere"); +// break; - case VAR_FLAG_RTO: - if(Variables[i].usedFlags & ~VAR_FLAG_RES) - return _("RTO: variable can only be used for RES elsewhere"); - break; - - case VAR_FLAG_CTU: - case VAR_FLAG_CTD: - case VAR_FLAG_CTC: - case VAR_FLAG_RES: - case VAR_FLAG_ANY: - break; - - case VAR_FLAG_OTHERWISE_FORGOTTEN: - if(name[0] != '$') { - Error(_("Variable '%s' not assigned to, e.g. with a " - "MOV statement, an ADD statement, etc.\r\n\r\n" - "This is probably a programming error; now it " - "will always be zero."), name); - } - break; - - default: - oops(); - } - - Variables[i].usedFlags |= flag; - return NULL; -} +// case VAR_FLAG_RTO: +// if(Variables[i].usedFlags & ~VAR_FLAG_RES) +// return _("RTO: variable can only be used for RES elsewhere"); +// break; + +// case VAR_FLAG_CTU: +// case VAR_FLAG_CTD: +// case VAR_FLAG_CTC: +// case VAR_FLAG_RES: +// case VAR_FLAG_ANY: +// break; + +// case VAR_FLAG_OTHERWISE_FORGOTTEN: +// if(name[0] != '$') { +// Error(_("Variable '%s' not assigned to, e.g. with a " +// "MOV statement, an ADD statement, etc.\r\n\r\n" +// "This is probably a programming error; now it " +// "will always be zero."), name); +// } +// break; + +// default: +// oops(); +// } + +// Variables[i].usedFlags |= flag; +// return NULL; +// } //----------------------------------------------------------------------------- // Check for duplicate uses of a single variable. For example, there should @@ -297,205 +287,207 @@ static char *MarkUsedVariable(char *name, DWORD flag) // to have an RTO with the same name as its reset; in fact, verify that // there must be a reset for each RTO. //----------------------------------------------------------------------------- -static void MarkWithCheck(char *name, int flag) -{ - char *s = MarkUsedVariable(name, flag); - if(s) { - Error(_("Variable for '%s' incorrectly assigned: %s."), name, s); - } -} -static void CheckVariableNamesCircuit(int which, void *elem) -{ - ElemLeaf *l = (ElemLeaf *)elem; - char *name = NULL; - DWORD flag; - - switch(which) { - case ELEM_SERIES_SUBCKT: { - int i; - ElemSubcktSeries *s = (ElemSubcktSeries *)elem; - for(i = 0; i < s->count; i++) { - CheckVariableNamesCircuit(s->contents[i].which, - s->contents[i].d.any); - } - break; - } - - case ELEM_PARALLEL_SUBCKT: { - int i; - ElemSubcktParallel *p = (ElemSubcktParallel *)elem; - for(i = 0; i < p->count; i++) { - CheckVariableNamesCircuit(p->contents[i].which, - p->contents[i].d.any); - } - break; - } +// static void MarkWithCheck(char *name, int flag) +// { +// char *s = MarkUsedVariable(name, flag); +// if(s) { +// Error(_("Variable for '%s' incorrectly assigned: %s."), name, s); +// } +// } + +// static void CheckVariableNamesCircuit(int which, void *elem) +// { +// ElemLeaf *l = (ElemLeaf *)elem; +// char *name = NULL; +// DWORD flag; + +// switch(which) { +// case ELEM_SERIES_SUBCKT: { +// int i; +// ElemSubcktSeries *s = (ElemSubcktSeries *)elem; +// for(i = 0; i < s->count; i++) { +// CheckVariableNamesCircuit(s->contents[i].which, +// s->contents[i].d.any); +// } +// break; +// } + +// case ELEM_PARALLEL_SUBCKT: { +// int i; +// ElemSubcktParallel *p = (ElemSubcktParallel *)elem; +// for(i = 0; i < p->count; i++) { +// CheckVariableNamesCircuit(p->contents[i].which, +// p->contents[i].d.any); +// } +// break; +// } - case ELEM_RTO: - case ELEM_TOF: - case ELEM_TON: - if(which == ELEM_RTO) - flag = VAR_FLAG_RTO; - else if(which == ELEM_TOF) - flag = VAR_FLAG_TOF; - else if(which == ELEM_TON) - flag = VAR_FLAG_TON; - else oops(); - - MarkWithCheck(l->d.timer.name, flag); - - break; - - case ELEM_CTU: - case ELEM_CTD: - case ELEM_CTC: - if(which == ELEM_CTU) - flag = VAR_FLAG_CTU; - else if(which == ELEM_CTD) - flag = VAR_FLAG_CTD; - else if(which == ELEM_CTC) - flag = VAR_FLAG_CTC; - else oops(); - - MarkWithCheck(l->d.counter.name, flag); - - break; - - case ELEM_RES: - MarkWithCheck(l->d.reset.name, VAR_FLAG_RES); - break; - - case ELEM_MOVE: - MarkWithCheck(l->d.move.dest, VAR_FLAG_ANY); - break; - - case ELEM_LOOK_UP_TABLE: - MarkWithCheck(l->d.lookUpTable.dest, VAR_FLAG_ANY); - break; - - case ELEM_PIECEWISE_LINEAR: - MarkWithCheck(l->d.piecewiseLinear.dest, VAR_FLAG_ANY); - break; - - case ELEM_READ_ADC: - MarkWithCheck(l->d.readAdc.name, VAR_FLAG_ANY); - break; - - case ELEM_ADD: - case ELEM_SUB: - case ELEM_MUL: - case ELEM_DIV: - MarkWithCheck(l->d.math.dest, VAR_FLAG_ANY); - break; - - case ELEM_UART_RECV: - MarkWithCheck(l->d.uart.name, VAR_FLAG_ANY); - break; - - case ELEM_SHIFT_REGISTER: { - int i; - for(i = 1; i < l->d.shiftRegister.stages; i++) { - char str[MAX_NAME_LEN+10]; - sprintf(str, "%s%d", l->d.shiftRegister.name, i); - MarkWithCheck(str, VAR_FLAG_ANY); - } - break; - } - - case ELEM_PERSIST: - case ELEM_FORMATTED_STRING: - case ELEM_SET_PWM: - case ELEM_MASTER_RELAY: - case ELEM_UART_SEND: - case ELEM_PLACEHOLDER: - case ELEM_COMMENT: - case ELEM_OPEN: - case ELEM_SHORT: - case ELEM_COIL: - case ELEM_CONTACTS: - case ELEM_ONE_SHOT_RISING: - case ELEM_ONE_SHOT_FALLING: - case ELEM_EQU: - case ELEM_NEQ: - case ELEM_GRT: - case ELEM_GEQ: - case ELEM_LES: - case ELEM_LEQ: - break; - - default: - oops(); - } -} -static void CheckVariableNames(void) -{ - int i; - for(i = 0; i < Prog.numRungs; i++) { - CheckVariableNamesCircuit(ELEM_SERIES_SUBCKT, Prog.rungs[i]); - } -} +// case ELEM_RTO: +// case ELEM_TOF: +// case ELEM_TON: +// if(which == ELEM_RTO) +// flag = VAR_FLAG_RTO; +// else if(which == ELEM_TOF) +// flag = VAR_FLAG_TOF; +// else if(which == ELEM_TON) +// flag = VAR_FLAG_TON; +// else oops(); + +// MarkWithCheck(l->d.timer.name, flag); + +// break; + +// case ELEM_CTU: +// case ELEM_CTD: +// case ELEM_CTC: +// if(which == ELEM_CTU) +// flag = VAR_FLAG_CTU; +// else if(which == ELEM_CTD) +// flag = VAR_FLAG_CTD; +// else if(which == ELEM_CTC) +// flag = VAR_FLAG_CTC; +// else oops(); + +// MarkWithCheck(l->d.counter.name, flag); + +// break; + +// case ELEM_RES: +// MarkWithCheck(l->d.reset.name, VAR_FLAG_RES); +// break; + +// case ELEM_MOVE: +// MarkWithCheck(l->d.move.dest, VAR_FLAG_ANY); +// break; + +// case ELEM_LOOK_UP_TABLE: +// MarkWithCheck(l->d.lookUpTable.dest, VAR_FLAG_ANY); +// break; + +// case ELEM_PIECEWISE_LINEAR: +// MarkWithCheck(l->d.piecewiseLinear.dest, VAR_FLAG_ANY); +// break; + +// case ELEM_READ_ADC: +// MarkWithCheck(l->d.readAdc.name, VAR_FLAG_ANY); +// break; + +// case ELEM_ADD: +// case ELEM_SUB: +// case ELEM_MUL: +// case ELEM_DIV: +// MarkWithCheck(l->d.math.dest, VAR_FLAG_ANY); +// break; + +// case ELEM_UART_RECV: +// MarkWithCheck(l->d.uart.name, VAR_FLAG_ANY); +// break; + +// case ELEM_SHIFT_REGISTER: { +// int i; +// for(i = 1; i < l->d.shiftRegister.stages; i++) { +// char str[MAX_NAME_LEN+10]; +// sprintf(str, "%s%d", l->d.shiftRegister.name, i); +// MarkWithCheck(str, VAR_FLAG_ANY); +// } +// break; +// } + +// case ELEM_PERSIST: +// case ELEM_FORMATTED_STRING: +// case ELEM_SET_PWM: +// case ELEM_MASTER_RELAY: +// case ELEM_UART_SEND: +// case ELEM_PLACEHOLDER: +// case ELEM_COMMENT: +// case ELEM_OPEN: +// case ELEM_SHORT: +// case ELEM_COIL: +// case ELEM_CONTACTS: +// case ELEM_ONE_SHOT_RISING: +// case ELEM_ONE_SHOT_FALLING: +// case ELEM_EQU: +// case ELEM_NEQ: +// case ELEM_GRT: +// case ELEM_GEQ: +// case ELEM_LES: +// case ELEM_LEQ: +// break; + +// default: +// oops(); +// } +// } + +// static void CheckVariableNames(void) +// { +// int i; +// for(i = 0; i < Prog.numRungs; i++) { +// CheckVariableNamesCircuit(ELEM_SERIES_SUBCKT, Prog.rungs[i]); +// } +// } //----------------------------------------------------------------------------- // The IF condition is true. Execute the body, up until the ELSE or the // END IF, and then skip the ELSE if it is present. Called with PC on the // IF, returns with PC on the END IF. //----------------------------------------------------------------------------- -static void IfConditionTrue(void) -{ - IntPc++; - // now PC is on the first statement of the IF body - SimulateIntCode(); - // now PC is on the ELSE or the END IF - if(IntCode[IntPc].op == INT_ELSE) { - int nesting = 1; - for(; ; IntPc++) { - if(IntPc >= IntCodeLen) oops(); - - if(IntCode[IntPc].op == INT_END_IF) { - nesting--; - } else if(INT_IF_GROUP(IntCode[IntPc].op)) { - nesting++; - } - if(nesting == 0) break; - } - } else if(IntCode[IntPc].op == INT_END_IF) { - return; - } else { - oops(); - } -} +// static void IfConditionTrue(void) +// { +// IntPc++; +// // now PC is on the first statement of the IF body +// SimulateIntCode(); +// // now PC is on the ELSE or the END IF +// if(IntCode[IntPc].op == INT_ELSE) { +// int nesting = 1; +// for(; ; IntPc++) { +// if(IntPc >= IntCodeLen) oops(); + +// if(IntCode[IntPc].op == INT_END_IF) { +// nesting--; +// } else if(INT_IF_GROUP(IntCode[IntPc].op)) { +// nesting++; +// } +// if(nesting == 0) break; +// } +// } else if(IntCode[IntPc].op == INT_END_IF) { +// return; +// } else { +// oops(); +// } +// } //----------------------------------------------------------------------------- // The IF condition is false. Skip the body, up until the ELSE or the END // IF, and then execute the ELSE if it is present. Called with PC on the IF, // returns with PC on the END IF. //----------------------------------------------------------------------------- -static void IfConditionFalse(void) -{ - int nesting = 0; - for(; ; IntPc++) { - if(IntPc >= IntCodeLen) oops(); - - if(IntCode[IntPc].op == INT_END_IF) { - nesting--; - } else if(INT_IF_GROUP(IntCode[IntPc].op)) { - nesting++; - } else if(IntCode[IntPc].op == INT_ELSE && nesting == 1) { - break; - } - if(nesting == 0) break; - } - - // now PC is on the ELSE or the END IF - if(IntCode[IntPc].op == INT_ELSE) { - IntPc++; - SimulateIntCode(); - } else if(IntCode[IntPc].op == INT_END_IF) { - return; - } else { - oops(); - } -} +// static void IfConditionFalse(void) +// { +// int nesting = 0; +// for(; ; IntPc++) { +// if(IntPc >= IntCodeLen) oops(); + +// if(IntCode[IntPc].op == INT_END_IF) { +// nesting--; +// } else if(INT_IF_GROUP(IntCode[IntPc].op)) { +// nesting++; +// } else if(IntCode[IntPc].op == INT_ELSE && nesting == 1) { +// break; +// } +// if(nesting == 0) break; +// } + +// // now PC is on the ELSE or the END IF +// if(IntCode[IntPc].op == INT_ELSE) { +// IntPc++; +// SimulateIntCode(); +// } else if(IntCode[IntPc].op == INT_END_IF) { +// return; +// } else { +// oops(); +// } +// } //----------------------------------------------------------------------------- // Evaluate a circuit, calling ourselves recursively to evaluate if/else @@ -503,229 +495,229 @@ static void IfConditionFalse(void) // internal tables. Returns when it reaches an end if or an else construct, // or at the end of the program. //----------------------------------------------------------------------------- -static void SimulateIntCode(void) -{ - for(; IntPc < IntCodeLen; IntPc++) { - IntOp *a = &IntCode[IntPc]; - switch(a->op) { - case INT_SIMULATE_NODE_STATE: - if(*(a->poweredAfter) != SingleBitOn(a->name1)) - NeedRedraw = TRUE; - *(a->poweredAfter) = SingleBitOn(a->name1); - break; - - case INT_SET_BIT: - SetSingleBit(a->name1, TRUE); - break; - - case INT_CLEAR_BIT: - SetSingleBit(a->name1, FALSE); - break; - - case INT_COPY_BIT_TO_BIT: - SetSingleBit(a->name1, SingleBitOn(a->name2)); - break; - - case INT_SET_VARIABLE_TO_LITERAL: - if(GetSimulationVariable(a->name1) != - a->literal && a->name1[0] != '$') - { - NeedRedraw = TRUE; - } - SetSimulationVariable(a->name1, a->literal); - break; - - case INT_SET_VARIABLE_TO_VARIABLE: - if(GetSimulationVariable(a->name1) != - GetSimulationVariable(a->name2)) - { - NeedRedraw = TRUE; - } - SetSimulationVariable(a->name1, - GetSimulationVariable(a->name2)); - break; - - case INT_INCREMENT_VARIABLE: - IncrementVariable(a->name1); - break; - - { - SWORD v; - case INT_SET_VARIABLE_ADD: - v = GetSimulationVariable(a->name2) + - GetSimulationVariable(a->name3); - goto math; - case INT_SET_VARIABLE_SUBTRACT: - v = GetSimulationVariable(a->name2) - - GetSimulationVariable(a->name3); - goto math; - case INT_SET_VARIABLE_MULTIPLY: - v = GetSimulationVariable(a->name2) * - GetSimulationVariable(a->name3); - goto math; - case INT_SET_VARIABLE_DIVIDE: - if(GetSimulationVariable(a->name3) != 0) { - v = GetSimulationVariable(a->name2) / - GetSimulationVariable(a->name3); - } else { - v = 0; - Error(_("Division by zero; halting simulation")); - StopSimulation(); - } - goto math; -math: - if(GetSimulationVariable(a->name1) != v) { - NeedRedraw = TRUE; - SetSimulationVariable(a->name1, v); - } - break; - } - -#define IF_BODY \ - { \ - IfConditionTrue(); \ - } else { \ - IfConditionFalse(); \ - } - case INT_IF_BIT_SET: - if(SingleBitOn(a->name1)) - IF_BODY - break; - - case INT_IF_BIT_CLEAR: - if(!SingleBitOn(a->name1)) - IF_BODY - break; - - case INT_IF_VARIABLE_LES_LITERAL: - if(GetSimulationVariable(a->name1) < a->literal) - IF_BODY - break; - - case INT_IF_VARIABLE_EQUALS_VARIABLE: - if(GetSimulationVariable(a->name1) == - GetSimulationVariable(a->name2)) - IF_BODY - break; - - case INT_IF_VARIABLE_GRT_VARIABLE: - if(GetSimulationVariable(a->name1) > - GetSimulationVariable(a->name2)) - IF_BODY - break; - - case INT_SET_PWM: - // Dummy call will cause a warning if no one ever assigned - // to that variable. - (void)GetSimulationVariable(a->name1); - break; - - // Don't try to simulate the EEPROM stuff: just hold the EEPROM - // busy all the time, so that the program never does anything - // with it. - case INT_EEPROM_BUSY_CHECK: - SetSingleBit(a->name1, TRUE); - break; - - case INT_EEPROM_READ: - case INT_EEPROM_WRITE: - oops(); - break; - - case INT_READ_ADC: - // Keep the shadow copies of the ADC variables because in - // the real device they will not be updated until an actual - // read is performed, which occurs only for a true rung-in - // condition there. - SetSimulationVariable(a->name1, GetAdcShadow(a->name1)); - break; - - case INT_UART_SEND: - if(SingleBitOn(a->name2) && (SimulateUartTxCountdown == 0)) { - SimulateUartTxCountdown = 2; - AppendToUartSimulationTextControl( - (BYTE)GetSimulationVariable(a->name1)); - } - if(SimulateUartTxCountdown == 0) { - SetSingleBit(a->name2, FALSE); - } else { - SetSingleBit(a->name2, TRUE); - } - break; - - case INT_UART_RECV: - if(QueuedUartCharacter >= 0) { - SetSingleBit(a->name2, TRUE); - SetSimulationVariable(a->name1, (SWORD)QueuedUartCharacter); - QueuedUartCharacter = -1; - } else { - SetSingleBit(a->name2, FALSE); - } - break; - - case INT_END_IF: - case INT_ELSE: - return; - - case INT_COMMENT: - break; +// static void SimulateIntCode(void) +// { +// for(; IntPc < IntCodeLen; IntPc++) { +// IntOp *a = &IntCode[IntPc]; +// switch(a->op) { +// case INT_SIMULATE_NODE_STATE: +// if(*(a->poweredAfter) != SingleBitOn(a->name1)) +// NeedRedraw = TRUE; +// *(a->poweredAfter) = SingleBitOn(a->name1); +// break; + +// case INT_SET_BIT: +// SetSingleBit(a->name1, TRUE); +// break; + +// case INT_CLEAR_BIT: +// SetSingleBit(a->name1, FALSE); +// break; + +// case INT_COPY_BIT_TO_BIT: +// SetSingleBit(a->name1, SingleBitOn(a->name2)); +// break; + +// case INT_SET_VARIABLE_TO_LITERAL: +// if(GetSimulationVariable(a->name1) != +// a->literal && a->name1[0] != '$') +// { +// NeedRedraw = TRUE; +// } +// SetSimulationVariable(a->name1, a->literal); +// break; + +// case INT_SET_VARIABLE_TO_VARIABLE: +// if(GetSimulationVariable(a->name1) != +// GetSimulationVariable(a->name2)) +// { +// NeedRedraw = TRUE; +// } +// SetSimulationVariable(a->name1, +// GetSimulationVariable(a->name2)); +// break; + +// case INT_INCREMENT_VARIABLE: +// IncrementVariable(a->name1); +// break; + +// { +// SWORD v; +// case INT_SET_VARIABLE_ADD: +// v = GetSimulationVariable(a->name2) + +// GetSimulationVariable(a->name3); +// goto math; +// case INT_SET_VARIABLE_SUBTRACT: +// v = GetSimulationVariable(a->name2) - +// GetSimulationVariable(a->name3); +// goto math; +// case INT_SET_VARIABLE_MULTIPLY: +// v = GetSimulationVariable(a->name2) * +// GetSimulationVariable(a->name3); +// goto math; +// case INT_SET_VARIABLE_DIVIDE: +// if(GetSimulationVariable(a->name3) != 0) { +// v = GetSimulationVariable(a->name2) / +// GetSimulationVariable(a->name3); +// } else { +// v = 0; +// Error(_("Division by zero; halting simulation")); +// StopSimulation(); +// } +// goto math; +// math: +// if(GetSimulationVariable(a->name1) != v) { +// NeedRedraw = TRUE; +// SetSimulationVariable(a->name1, v); +// } +// break; +// } + +// #define IF_BODY \ +// { \ +// IfConditionTrue(); \ +// } else { \ +// IfConditionFalse(); \ +// } +// case INT_IF_BIT_SET: +// if(SingleBitOn(a->name1)) +// IF_BODY +// break; + +// case INT_IF_BIT_CLEAR: +// if(!SingleBitOn(a->name1)) +// IF_BODY +// break; + +// case INT_IF_VARIABLE_LES_LITERAL: +// if(GetSimulationVariable(a->name1) < a->literal) +// IF_BODY +// break; + +// case INT_IF_VARIABLE_EQUALS_VARIABLE: +// if(GetSimulationVariable(a->name1) == +// GetSimulationVariable(a->name2)) +// IF_BODY +// break; + +// case INT_IF_VARIABLE_GRT_VARIABLE: +// if(GetSimulationVariable(a->name1) > +// GetSimulationVariable(a->name2)) +// IF_BODY +// break; + +// case INT_SET_PWM: +// // Dummy call will cause a warning if no one ever assigned +// // to that variable. +// (void)GetSimulationVariable(a->name1); +// break; + +// // Don't try to simulate the EEPROM stuff: just hold the EEPROM +// // busy all the time, so that the program never does anything +// // with it. +// case INT_EEPROM_BUSY_CHECK: +// SetSingleBit(a->name1, TRUE); +// break; + +// case INT_EEPROM_READ: +// case INT_EEPROM_WRITE: +// oops(); +// break; + +// case INT_READ_ADC: +// // Keep the shadow copies of the ADC variables because in +// // the real device they will not be updated until an actual +// // read is performed, which occurs only for a true rung-in +// // condition there. +// SetSimulationVariable(a->name1, GetAdcShadow(a->name1)); +// break; + +// case INT_UART_SEND: +// if(SingleBitOn(a->name2) && (SimulateUartTxCountdown == 0)) { +// SimulateUartTxCountdown = 2; +// AppendToUartSimulationTextControl( +// (BYTE)GetSimulationVariable(a->name1)); +// } +// if(SimulateUartTxCountdown == 0) { +// SetSingleBit(a->name2, FALSE); +// } else { +// SetSingleBit(a->name2, TRUE); +// } +// break; + +// case INT_UART_RECV: +// if(QueuedUartCharacter >= 0) { +// SetSingleBit(a->name2, TRUE); +// SetSimulationVariable(a->name1, (SWORD)QueuedUartCharacter); +// QueuedUartCharacter = -1; +// } else { +// SetSingleBit(a->name2, FALSE); +// } +// break; + +// case INT_END_IF: +// case INT_ELSE: +// return; + +// case INT_COMMENT: +// break; - default: - oops(); - break; - } - } -} +// default: +// oops(); +// break; +// } +// } +// } //----------------------------------------------------------------------------- // Called by the Windows timer that triggers cycles when we are running // in real time. //----------------------------------------------------------------------------- -void CALLBACK PlcCycleTimer(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) -{ - int i; - for(i = 0; i < CyclesPerTimerTick; i++) { - SimulateOneCycle(FALSE); - } -} +// void CALLBACK PlcCycleTimer(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) +// { +// int i; +// for(i = 0; i < CyclesPerTimerTick; i++) { +// SimulateOneCycle(FALSE); +// } +// } //----------------------------------------------------------------------------- // Simulate one cycle of the PLC. Update everything, and keep track of whether // any outputs have changed. If so, force a screen refresh. If requested do // a screen refresh regardless. //----------------------------------------------------------------------------- -void SimulateOneCycle(BOOL forceRefresh) -{ - // When there is an error message up, the modal dialog makes its own - // event loop, and there is risk that we would go recursive. So let - // us fix that. (Note that there are no concurrency issues; we really - // would get called recursively, not just reentrantly.) - static BOOL Simulating = FALSE; +// void SimulateOneCycle(BOOL forceRefresh) +// { +// // When there is an error message up, the modal dialog makes its own +// // event loop, and there is risk that we would go recursive. So let +// // us fix that. (Note that there are no concurrency issues; we really +// // would get called recursively, not just reentrantly.) +// static BOOL Simulating = FALSE; - if(Simulating) return; - Simulating = TRUE; +// if(Simulating) return; +// Simulating = TRUE; - NeedRedraw = FALSE; +// NeedRedraw = FALSE; - if(SimulateUartTxCountdown > 0) { - SimulateUartTxCountdown--; - } else { - SimulateUartTxCountdown = 0; - } +// if(SimulateUartTxCountdown > 0) { +// SimulateUartTxCountdown--; +// } else { +// SimulateUartTxCountdown = 0; +// } - IntPc = 0; - SimulateIntCode(); +// IntPc = 0; +// SimulateIntCode(); - if(NeedRedraw || SimulateRedrawAfterNextCycle || forceRefresh) { - InvalidateRect(MainWindow, NULL, FALSE); - ListView_RedrawItems(IoList, 0, Prog.io.count - 1); - } +// if(NeedRedraw || SimulateRedrawAfterNextCycle || forceRefresh) { +// InvalidateRect(MainWindow, NULL, FALSE); +// ListView_RedrawItems(IoList, 0, Prog.io.count - 1); +// } - SimulateRedrawAfterNextCycle = FALSE; - if(NeedRedraw) SimulateRedrawAfterNextCycle = TRUE; +// SimulateRedrawAfterNextCycle = FALSE; +// if(NeedRedraw) SimulateRedrawAfterNextCycle = TRUE; - Simulating = FALSE; -} +// Simulating = FALSE; +// } //----------------------------------------------------------------------------- // Start the timer that we use to trigger PLC cycles in approximately real @@ -733,271 +725,250 @@ void SimulateOneCycle(BOOL forceRefresh) // is about as fast as anyone could follow by eye. Faster timers will just // go instantly. //----------------------------------------------------------------------------- -void StartSimulationTimer(void) -{ - int p = Prog.cycleTime/1000; - if(p < 5) { - SetTimer(MainWindow, TIMER_SIMULATE, 10, PlcCycleTimer); - CyclesPerTimerTick = 10000 / Prog.cycleTime; - } else { - SetTimer(MainWindow, TIMER_SIMULATE, p, PlcCycleTimer); - CyclesPerTimerTick = 1; - } -} +// void StartSimulationTimer(void) +// { +// int p = Prog.cycleTime/1000; +// if(p < 5) { +// SetTimer(MainWindow, TIMER_SIMULATE, 10, PlcCycleTimer); +// CyclesPerTimerTick = 10000 / Prog.cycleTime; +// } else { +// SetTimer(MainWindow, TIMER_SIMULATE, p, PlcCycleTimer); +// CyclesPerTimerTick = 1; +// } +// } //----------------------------------------------------------------------------- // Clear out all the parameters relating to the previous simulation. //----------------------------------------------------------------------------- -void ClearSimulationData(void) -{ - VariablesCount = 0; - SingleBitItemsCount = 0; - AdcShadowsCount = 0; - QueuedUartCharacter = -1; - SimulateUartTxCountdown = 0; +// void ClearSimulationData(void) +// { +// VariablesCount = 0; +// SingleBitItemsCount = 0; +// AdcShadowsCount = 0; +// QueuedUartCharacter = -1; +// SimulateUartTxCountdown = 0; - CheckVariableNames(); +// CheckVariableNames(); - SimulateRedrawAfterNextCycle = TRUE; +// SimulateRedrawAfterNextCycle = TRUE; - if(!GenerateIntermediateCode()) { - ToggleSimulationMode(); - return; - } +// if(!GenerateIntermediateCode()) { +// ToggleSimulationMode(); +// return; +// } - SimulateOneCycle(TRUE); -} +// SimulateOneCycle(TRUE); +// } //----------------------------------------------------------------------------- // Provide a description for an item (Xcontacts, Ycoil, Rrelay, Ttimer, // or other) in the I/O list. //----------------------------------------------------------------------------- -void DescribeForIoList(char *name, char *out) -{ - switch(name[0]) { - case 'R': - case 'X': - case 'Y': - sprintf(out, "%d", SingleBitOn(name)); - break; - - case 'T': { - double dtms = GetSimulationVariable(name) * - (Prog.cycleTime / 1000.0); - if(dtms < 1000) { - sprintf(out, "%.2f ms", dtms); - } else { - sprintf(out, "%.3f s", dtms / 1000); - } - break; - } - default: { - SWORD v = GetSimulationVariable(name); - sprintf(out, "%hd (0x%04hx)", v, v); - break; - } - } -} +// void DescribeForIoList(char *name, char *out) +// { +// switch(name[0]) { +// case 'R': +// case 'X': +// case 'Y': +// sprintf(out, "%d", SingleBitOn(name)); +// break; + +// case 'T': { +// double dtms = GetSimulationVariable(name) * +// (Prog.cycleTime / 1000.0); +// if(dtms < 1000) { +// sprintf(out, "%.2f ms", dtms); +// } else { +// sprintf(out, "%.3f s", dtms / 1000); +// } +// break; +// } +// default: { +// SWORD v = GetSimulationVariable(name); +// sprintf(out, "%hd (0x%04hx)", v, v); +// break; +// } +// } +// } //----------------------------------------------------------------------------- // Toggle the state of a contact input; for simulation purposes, so that we // can set the input state of the program. //----------------------------------------------------------------------------- -void SimulationToggleContact(char *name) -{ - BOOL value = !SingleBitOn(name); - SetSingleBit(name, value); - ListView_RedrawItems(IoList, 0, Prog.io.count - 1); - // TranslateState(name, value); -} - -void SimulationSetContact(char* name) -{ - BOOL value = TRUE; - SetSingleBit(name, value); - ListView_RedrawItems(IoList, 0, Prog.io.count - 1); - MCUPinState(name,value); - // TranslateState(name, value); -} - -void SimulationResetContact(char* name) -{ - BOOL value = FALSE; - SetSingleBit(name, value); - ListView_RedrawItems(IoList, 0, Prog.io.count - 1); - MCUPinState(name,value); - // TranslateState(name, value); -} +// void SimulationToggleContact(char *name) +// { +// SetSingleBit(name, !SingleBitOn(name)); +// ListView_RedrawItems(IoList, 0, Prog.io.count - 1); +// } //----------------------------------------------------------------------------- // Dialog proc for the popup that lets you interact with the UART stuff. //----------------------------------------------------------------------------- -static LRESULT CALLBACK UartSimulationProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_DESTROY: - DestroyUartSimulationWindow(); - break; +// static LRESULT CALLBACK UartSimulationProc(HWND hwnd, UINT msg, +// WPARAM wParam, LPARAM lParam) +// { +// switch (msg) { +// case WM_DESTROY: +// DestroyUartSimulationWindow(); +// break; - case WM_CLOSE: - break; +// case WM_CLOSE: +// break; - case WM_SIZE: - MoveWindow(UartSimulationTextControl, 0, 0, LOWORD(lParam), - HIWORD(lParam), TRUE); - break; +// case WM_SIZE: +// MoveWindow(UartSimulationTextControl, 0, 0, LOWORD(lParam), +// HIWORD(lParam), TRUE); +// break; - case WM_ACTIVATE: - if(wParam != WA_INACTIVE) { - SetFocus(UartSimulationTextControl); - } - break; +// case WM_ACTIVATE: +// if(wParam != WA_INACTIVE) { +// SetFocus(UartSimulationTextControl); +// } +// break; - default: - return DefWindowProc(hwnd, msg, wParam, lParam); - } - return 1; -} +// default: +// return DefWindowProc(hwnd, msg, wParam, lParam); +// } +// return 1; +// } //----------------------------------------------------------------------------- // Intercept WM_CHAR messages that to the terminal simulation window so that // we can redirect them to the PLC program. //----------------------------------------------------------------------------- -static LRESULT CALLBACK UartSimulationTextProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - if(msg == WM_CHAR) { - QueuedUartCharacter = (BYTE)wParam; - return 0; - } +// static LRESULT CALLBACK UartSimulationTextProc(HWND hwnd, UINT msg, +// WPARAM wParam, LPARAM lParam) +// { +// if(msg == WM_CHAR) { +// QueuedUartCharacter = (BYTE)wParam; +// return 0; +// } - return CallWindowProc((WNDPROC)PrevTextProc, hwnd, msg, wParam, lParam); -} +// return CallWindowProc((WNDPROC)PrevTextProc, hwnd, msg, wParam, lParam); +// } //----------------------------------------------------------------------------- // Pop up the UART simulation window; like a terminal window where the // characters that you type go into UART RECV instruction and whatever // the program puts into UART SEND shows up as text. //----------------------------------------------------------------------------- -void ShowUartSimulationWindow(void) -{ - WNDCLASSEX wc; - memset(&wc, 0, sizeof(wc)); - wc.cbSize = sizeof(wc); +// void ShowUartSimulationWindow(void) +// { +// WNDCLASSEX wc; +// memset(&wc, 0, sizeof(wc)); +// wc.cbSize = sizeof(wc); - wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC | - CS_DBLCLKS; - wc.lpfnWndProc = (WNDPROC)UartSimulationProc; - wc.hInstance = Instance; - wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; - wc.lpszClassName = "LDmicroUartSimulationWindow"; - wc.lpszMenuName = NULL; - wc.hCursor = LoadCursor(NULL, IDC_ARROW); +// wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC | +// CS_DBLCLKS; +// wc.lpfnWndProc = (WNDPROC)UartSimulationProc; +// wc.hInstance = Instance; +// wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; +// wc.lpszClassName = "LDmicroUartSimulationWindow"; +// wc.lpszMenuName = NULL; +// wc.hCursor = LoadCursor(NULL, IDC_ARROW); - RegisterClassEx(&wc); +// RegisterClassEx(&wc); - DWORD TerminalX = 200, TerminalY = 200, TerminalW = 300, TerminalH = 150; +// DWORD TerminalX = 200, TerminalY = 200, TerminalW = 300, TerminalH = 150; - ThawDWORD(TerminalX); - ThawDWORD(TerminalY); - ThawDWORD(TerminalW); - ThawDWORD(TerminalH); +// ThawDWORD(TerminalX); +// ThawDWORD(TerminalY); +// ThawDWORD(TerminalW); +// ThawDWORD(TerminalH); - if(TerminalW > 800) TerminalW = 100; - if(TerminalH > 800) TerminalH = 100; +// if(TerminalW > 800) TerminalW = 100; +// if(TerminalH > 800) TerminalH = 100; - RECT r; - GetClientRect(GetDesktopWindow(), &r); - if(TerminalX >= (DWORD)(r.right - 10)) TerminalX = 100; - if(TerminalY >= (DWORD)(r.bottom - 10)) TerminalY = 100; +// RECT r; +// GetClientRect(GetDesktopWindow(), &r); +// if(TerminalX >= (DWORD)(r.right - 10)) TerminalX = 100; +// if(TerminalY >= (DWORD)(r.bottom - 10)) TerminalY = 100; - UartSimulationWindow = CreateWindowClient(WS_EX_TOOLWINDOW | - WS_EX_APPWINDOW, "LDmicroUartSimulationWindow", - "UART Simulation (Terminal)", WS_VISIBLE | WS_SIZEBOX, - TerminalX, TerminalY, TerminalW, TerminalH, - NULL, NULL, Instance, NULL); +// UartSimulationWindow = CreateWindowClient(WS_EX_TOOLWINDOW | +// WS_EX_APPWINDOW, "LDmicroUartSimulationWindow", +// "UART Simulation (Terminal)", WS_VISIBLE | WS_SIZEBOX, +// TerminalX, TerminalY, TerminalW, TerminalH, +// NULL, NULL, Instance, NULL); - UartSimulationTextControl = CreateWindowEx(0, WC_EDIT, "", WS_CHILD | - WS_CLIPSIBLINGS | WS_VISIBLE | ES_AUTOVSCROLL | ES_MULTILINE | - WS_VSCROLL, 0, 0, TerminalW, TerminalH, UartSimulationWindow, NULL, - Instance, NULL); +// UartSimulationTextControl = CreateWindowEx(0, WC_EDIT, "", WS_CHILD | +// WS_CLIPSIBLINGS | WS_VISIBLE | ES_AUTOVSCROLL | ES_MULTILINE | +// WS_VSCROLL, 0, 0, TerminalW, TerminalH, UartSimulationWindow, NULL, +// Instance, NULL); - HFONT fixedFont = CreateFont(14, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, - ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, - FF_DONTCARE, "Lucida Console"); - if(!fixedFont) - fixedFont = (HFONT)GetStockObject(SYSTEM_FONT); +// HFONT fixedFont = CreateFont(14, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, +// ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, +// FF_DONTCARE, "Lucida Console"); +// if(!fixedFont) +// fixedFont = (HFONT)GetStockObject(SYSTEM_FONT); - SendMessage((HWND)UartSimulationTextControl, WM_SETFONT, (WPARAM)fixedFont, - TRUE); +// SendMessage((HWND)UartSimulationTextControl, WM_SETFONT, (WPARAM)fixedFont, +// TRUE); - PrevTextProc = SetWindowLongPtr(UartSimulationTextControl, - GWLP_WNDPROC, (LONG_PTR)UartSimulationTextProc); +// PrevTextProc = SetWindowLongPtr(UartSimulationTextControl, +// GWLP_WNDPROC, (LONG_PTR)UartSimulationTextProc); - ShowWindow(UartSimulationWindow, TRUE); - SetFocus(MainWindow); -} +// ShowWindow(UartSimulationWindow, TRUE); +// SetFocus(MainWindow); +// } //----------------------------------------------------------------------------- // Get rid of the UART simulation terminal-type window. //----------------------------------------------------------------------------- -void DestroyUartSimulationWindow(void) -{ - // Try not to destroy the window if it is already destroyed; that is - // not for the sake of the window, but so that we don't trash the - // stored position. - if(UartSimulationWindow == NULL) return; +// void DestroyUartSimulationWindow(void) +// { +// // Try not to destroy the window if it is already destroyed; that is +// // not for the sake of the window, but so that we don't trash the +// // stored position. +// if(UartSimulationWindow == NULL) return; - DWORD TerminalX, TerminalY, TerminalW, TerminalH; - RECT r; +// DWORD TerminalX, TerminalY, TerminalW, TerminalH; +// RECT r; - GetClientRect(UartSimulationWindow, &r); - TerminalW = r.right - r.left; - TerminalH = r.bottom - r.top; +// GetClientRect(UartSimulationWindow, &r); +// TerminalW = r.right - r.left; +// TerminalH = r.bottom - r.top; - GetWindowRect(UartSimulationWindow, &r); - TerminalX = r.left; - TerminalY = r.top; +// GetWindowRect(UartSimulationWindow, &r); +// TerminalX = r.left; +// TerminalY = r.top; - FreezeDWORD(TerminalX); - FreezeDWORD(TerminalY); - FreezeDWORD(TerminalW); - FreezeDWORD(TerminalH); +// FreezeDWORD(TerminalX); +// FreezeDWORD(TerminalY); +// FreezeDWORD(TerminalW); +// FreezeDWORD(TerminalH); - DestroyWindow(UartSimulationWindow); - UartSimulationWindow = NULL; -} +// DestroyWindow(UartSimulationWindow); +// UartSimulationWindow = NULL; +// } //----------------------------------------------------------------------------- // Append a received character to the terminal buffer. //----------------------------------------------------------------------------- -static void AppendToUartSimulationTextControl(BYTE b) -{ - char append[5]; - - if((isalnum(b) || strchr("[]{};':\",.<>/?`~ !@#$%^&*()-=_+|", b) || - b == '\r' || b == '\n') && b != '\0') - { - append[0] = b; - append[1] = '\0'; - } else { - sprintf(append, "\\x%02x", b); - } - -#define MAX_SCROLLBACK 256 - char buf[MAX_SCROLLBACK]; - - SendMessage(UartSimulationTextControl, WM_GETTEXT, (WPARAM)sizeof(buf), - (LPARAM)buf); - - int overBy = (strlen(buf) + strlen(append) + 1) - sizeof(buf); - if(overBy > 0) { - memmove(buf, buf + overBy, strlen(buf)); - } - strcat(buf, append); - - SendMessage(UartSimulationTextControl, WM_SETTEXT, 0, (LPARAM)buf); - SendMessage(UartSimulationTextControl, EM_LINESCROLL, 0, (LPARAM)INT_MAX); -} -*/
\ No newline at end of file +// static void AppendToUartSimulationTextControl(BYTE b) +// { +// char append[5]; + +// if((isalnum(b) || strchr("[]{};':\",.<>/?`~ !@#$%^&*()-=_+|", b) || +// b == '\r' || b == '\n') && b != '\0') +// { +// append[0] = b; +// append[1] = '\0'; +// } else { +// sprintf(append, "\\x%02x", b); +// } + +// #define MAX_SCROLLBACK 256 +// char buf[MAX_SCROLLBACK]; + +// SendMessage(UartSimulationTextControl, WM_GETTEXT, (WPARAM)sizeof(buf), +// (LPARAM)buf); + +// int overBy = (strlen(buf) + strlen(append) + 1) - sizeof(buf); +// if(overBy > 0) { +// memmove(buf, buf + overBy, strlen(buf)); +// } +// strcat(buf, append); + +// SendMessage(UartSimulationTextControl, WM_SETTEXT, 0, (LPARAM)buf); +// SendMessage(UartSimulationTextControl, EM_LINESCROLL, 0, (LPARAM)INT_MAX); +// } |