Exemple #1
0
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);
                }
            }
        }
    }
}
Exemple #2
0
/*
 *	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;
	}
}
Exemple #3
0
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);
            }
        }
    }
}