Пример #1
0
int main(){
    char receive_buffer[80] = "12345 shangshandalaohu";
    int crc;
    crc = getcrc(receive_buffer);
    char* rest;
    printf("receive_buffer is %s\n",receive_buffer);
    rest = getrest(receive_buffer);
    printf("crc is %d\n",crc);
    printf("rest is %s\n",rest);
}
int main(void)
{
	int memCounter = 0;
    char input;
    int numCountRef, firstNumRef, secondNumRef, intRestRef;
    
    printf("CS 350 Lab 8, Andrey Danilkovich\nFull SDC Simulator\n\n");
	initCPU();
	readMemory();
    
	printf("\nBeginning execution:\n");
	printf("At the > prompt, press return to execute the next instruction (or q to quit or h or ? for help).\n");
	char prompt[] = "> ";
	printf("%s", prompt);
	char command[80];
	fgets(command, sizeof command, stdin);	// Read past end of current line.
    
    scanf("%c", &input);
    
	do
    {
        while(input != '\n' && getchar() != '\n' ){ /* Do Nothing to clear \n from a char */ } // clear out the extra space after the char
        
        numCountRef = getcount(mem, memCounter);
        firstNumRef = getfirst(mem, memCounter, numCountRef);
        secondNumRef = getsecond(mem, memCounter, numCountRef);
        intRestRef = getrest(mem, memCounter, numCountRef);
        
        if(firstNumRef == 0)
        {
            memCounter++;
        }
        else if(input == '\r' | input == '\n')
        {
            instruction_cycle(mem, regs, memCounter);
            memCounter++;
            printf("%s", prompt);
            scanf("%c", &input);
            
            if(firstNumRef == 8 & regs[secondNumRef] > 0)
            {
                memCounter = intRestRef;
            }
            
        }
        else if(input == 'h')
        {
            helpMsg();              // call help message
            printf("%s", prompt);
            scanf("%c", &input);
        }
        else if(input == 'q')
        {
            printf("Quitting program.\n");
        }
        else
        {
            printf("Unknown command; ignoring it.\n");
            printf("%s", prompt);
            scanf("%c", &input);
        }
        
    }
    while (memCounter != 99 & input != 'q');
    
    // Finish Program
    // Print Halting message, diplay registers and memory
    printf("At 00 instr 0 0 00: HALT\n\nHalting\n");
	printf("\nRegisters:\n");
	dumpRegisters(regs);
    
	printf("\nMemory:\n");
	dumpMemory(mem);
}
int instruction_cycle(int mem[], int regs[], int memCounter)
{
    int intCount, firstNum, secondNum, intRest;
    char readInput, futureInput;
    
    intCount = getcount(mem, memCounter);
    firstNum = getfirst(mem, memCounter, intCount);
    secondNum = getsecond(mem, memCounter, intCount);
    intRest = getrest(mem, memCounter, intCount);
    
    // TEST CASE: printf("** This is the first digit: %d **\n", firstNum);
    if (firstNum != 0)
        printf("At %02d instr %d %d %02d: ", memCounter, firstNum, secondNum, intRest);
    
     
    switch (firstNum)
    {
        case 0: // DONE!!!
        {
            // HALT execution
            // Microcode: Running ← false
            memCounter++;
            break;
        }
        case 1: // DONE!!!
        {
            // LD
            // EXAMPLE: LD   R0 <- M[02] = 9225
            // Microcode: Reg[R]←Mem[MM]
            
            regs[secondNum] = mem[intRest];
            printf("LD   R%d <- M[%02d] = %d\n", secondNum, intRest, regs[secondNum]);
            break;
        }
        case 2: // DONE!!!
        {
            // ST
            // EXAMPLE: ST   M[22] <- R3 = -1
            // Microcode: Mem[MM]←Reg[R]
            
            mem[intRest] = regs[secondNum];
            printf("ST   M[%02d] <- R%d = %d\n", intRest, secondNum, mem[intRest]);
            break;
        }
        case 3: // DONE!!!
        {
            // ADD
            // EXAMPLE: ADD  R1 <- R1 + M[22] = 3 + -1 = 2
            // Microcode: Reg[R]←Reg[R] + Mem[MM]
            
            printf("ADD  R%d <- R%d + M[%02d] = %d + %d", secondNum, secondNum, intRest, regs[secondNum], mem[intRest]);
            regs[secondNum] = (regs[secondNum] + mem[intRest]) % 10000;
            
            printf(" = %d\n", regs[secondNum]);
            break;
        }
        case 4: // DONE!!!
        {
            // NEG
            // EXAMPLE: NEG  R3 <- -(R3) = -1
            // Microcode: Reg[R]←–Reg[R]
            regs[secondNum] = (-1 * regs[secondNum]);
            printf("NEG  R%d <- -(R%d) = %d\n", secondNum, secondNum, regs[secondNum]);
            break;
        }
        case 5: // DONE!!!
        {
            // ST
            // EXAMPLE: LDM  R3 <- 1
            // Microcode: Reg[R] ← MM
            regs[secondNum] = intRest;
            printf("LDM   R%d <- %d\n", secondNum, intRest);
            break;
        }
        case 6: // DONE!!!
        {
            // ADDM
            // EXAMPLE: ADDM R0 <- R0 + 01 = 9225 + 1 = 9226
            // Microcode: Reg[R]←Reg[R]+MM
            
            regs[secondNum] = regs[secondNum] + 1;
            printf("ADDM R%d <- R%d + 01 = %d + 1 = %d\n", secondNum, secondNum, (regs[secondNum] - 1), regs[secondNum]);
            break;
        }
        case 7: // EQUAL 0?
        {  
            // BR
            // EXAMPLE: BR   10
            // Microcode: PC←MM
            
            printf("BR   %d\n", intRest);
            break;
        }
        case 8:
        {
            // BRP
            // EXAMPLE: BRP  13 if R1 = 2 > 0: Yes
            // Microcode: if Reg[R]>0 then PC ← MM
            if(regs[secondNum] > 0)
            {
                memCounter = intRest;
                printf("BRP  %02d if R%d = %d > 0: Yes\n", intRest, secondNum, regs[secondNum]);
                return(memCounter);
            }
            else
            {
                printf("BRP  %02d if R%d = %d > 0: No\n", intRest, secondNum, regs[secondNum]);
            }
            break;
        }
        case 9:
        {
            // Read a character and copy its ASCII representation into R0.
            if (secondNum == 0)  
            {
                printf("I/O  Read char\nEnter a char (and press return): ");
                readInput = getchar();
                //scanf(" %c", &readInput);
                while(readInput != '\n' && getchar() != '\n' )
                { /* Do Nothing */ }
                printf("R%d <- %d\n", secondNum, readInput);
                
                futureInput = readInput;

                regs[secondNum] = readInput;  // set register
            }
            
            // Print the character whose ASCII representation is in R0.
            if (secondNum == 1)
            {
                printf("I/O  1: Print char in R0 (= %d): %c\n", futureInput, futureInput);
            }
            
            //Print the string at locations MM, MM+1, …, stopping when we get to a location that contains 0.
            if (secondNum == 2)
            {
                printf("I/O  2: Print string: Hello, world!\n");
            }
            // Print out the values of the registers.
            if (secondNum == 3)
            {
                printf("I/O  3: Dump Registers\n");
                dumpRegisters(regs);
            }
            //Print out the values in memory as a 10 by 10 table
            if (secondNum == 4)
            {
                printf("I/O  4: Dump Memory\n");
                dumpMemory(mem);
            }
            break;
        }
        default:
        {
            printf("\nAdd operaions here\n");
            break;
        }
    }
    return 0;
}