void ItemSpace::checkPreferredPositions() { for (int groupId = 0; groupId < m_groups.size(); groupId++) { ItemGroup &group = m_groups[groupId]; for (int itemId = 0; itemId < group.m_groupItems.size(); itemId++) { ItemSpaceItem &item = group.m_groupItems[itemId]; qreal push; PushPower power; /* Push items back towards their perferred positions. Cannot push items out of the working area, cannot push items away from their preferred positions. */ if (item.pushBack) { QRectF preferredGeometry = QRectF(item.preferredPosition, item.lastGeometry.size()); // left/right push = preferredGeometry.left() - item.lastGeometry.left(); if (push > 0) { performPush(groupId, DirRight, push, NoPower); } else if (push < 0) { performPush(groupId, DirLeft, -push, NoPower); } // up/down push = preferredGeometry.top() - item.lastGeometry.top(); if (push > 0) { performPush(groupId, DirDown, push, NoPower); } else if (push < 0) { performPush(groupId, DirUp, -push, NoPower); } } } } }
/* * This code is used to execute each instruction. */ void executeOneInstruction(int instr) { int X, Y, flagX1, flagX2, flagY1, flagY2, operation; char string[WORD_SIZE]; bzero(string, 16); switch (instr) { case START: storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); //increment IP break; case MOV: //1st phase:get the value 2nd phase:store the value X = yylex(); flagX1 = yylval.flag; flagX2 = yylval.flag2; Y = yylex(); flagY1 = yylval.flag; flagY2 = yylval.flag2; strcpy(string, yylval.data); if (!performMOV(X, flagX1, flagX2, Y, flagY1, flagY2, string)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case ARITH: operation = yylval.flag; X = yylex(); flagX1 = yylval.flag; if (operation != INR && operation != DCR) { Y = yylex(); flagY1 = yylval.flag; } if (!performArithmetic(X, flagX1, Y, flagY1, operation)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case LOGIC: operation = yylval.flag; X = yylex(); flagX1 = yylval.flag; Y = yylex(); flagY1 = yylval.flag; if (!performLogic(X, flagX1, Y, flagY1, operation)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case BRANCH: operation = yylval.flag; X = yylex(); flagX1 = yylval.flag; if (operation != JMP) { Y = yylex(); flagY1 = yylval.flag; } if (!performBranching(X, flagX1, Y, flagY1, operation)) return; break; case PUSH: X = yylex(); flagX1 = yylval.flag; if (!performPush(X, flagX1)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case POP: X = yylex(); flagX1 = yylval.flag; if (!performPop(X, flagX1)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case CALL: X = yylex(); flagX1 = yylval.flag; if (!performCall(X, flagX1)) return; break; case RET: if (!performRet()) return; break; case INT: X = yylex(); flagX1 = yylval.flag; if (!performINT(X, flagX1)) return; break; case IRET: if (!performIRET()) return; break; case IN: X = yylex(); flagX1 = yylval.flag; if (!performIN(X, flagX1)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case OUT: X = yylex(); flagX1 = yylval.flag; if (!performOUT(X, flagX1)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case LOAD: case STORE: X = yylex(); flagX1 = yylval.flag; Y = yylex(); flagY1 = yylval.flag; if (!performLoadStore(X, flagX1, Y, flagY1, instr)) return; storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; case HALT: if (mode == USER_MODE) { raiseException(newException(EX_ILLINSTR, "Call to Privileged Instruction HALT in USER mode", 0)); return; } printf("Machine is halting\n"); exit(0); break; case END: break; case BRKP: if (isDebugModeOn()) { step_flag = 1; printf("\nXSM Debug Environment\nType \"help\" for getting a list of commands\n"); } storeInteger(reg[IP_REG], getInteger(reg[IP_REG]) + WORDS_PER_INSTR); break; default: raiseException(newException(EX_ILLINSTR, "Illegal Instruction", 0)); return; } }
void ItemSpace::checkBorders() { for (int groupId = 0; groupId < m_groups.size(); groupId++) { ItemGroup &group = m_groups[groupId]; for (int itemId = 0; itemId < group.m_groupItems.size(); itemId++) { ItemSpaceItem &item = group.m_groupItems[itemId]; qreal push; PushPower power; /* Push items intersecting working area borders inside. For borders adjunct to the corner of alignment, allow pushing over the opposite border (and items there may be temporarily placed). */ // left border push = screenSpacing - item.lastGeometry.left(); if (push > 0) { item.animateMovement = true; power = PushAwayFromPreferred; if ((spaceAlignment & Qt::AlignLeft)) { power |= PushOverBorder; } performPush(groupId, DirRight, push, power); } // right border push = item.lastGeometry.right()+screenSpacing - workingGeom.width(); if (push > 0) { item.animateMovement = true; power = PushAwayFromPreferred; if ((spaceAlignment & Qt::AlignRight)) { power |= PushOverBorder; } performPush(groupId, DirLeft, push, power); } // top border push = screenSpacing - item.lastGeometry.top(); if (push > 0) { item.animateMovement = true; power = PushAwayFromPreferred; if ((spaceAlignment & Qt::AlignTop)) { power |= PushOverBorder; } performPush(groupId, DirDown, push, power); } // bottom border push = item.lastGeometry.bottom()+screenSpacing - workingGeom.height(); if (push > 0) { item.animateMovement = true; power = PushAwayFromPreferred; if ((spaceAlignment & Qt::AlignBottom)) { power |= PushOverBorder; } performPush(groupId, DirUp, push, power); } } } }