#include <stdio.h>
void pt(int prog[], int cmd,int acc,int pc);

int main() {

    int prog[] = {
        2, 5, // load 5
        3, 3, // mult 3
        1,    // print acc
        4, 7, // jump 7
        2, 0, // load 0
        5, 11,// jz 11
        2, 2, // load 2
        5, 1, // jz 1
        3, 4, // mul 4
        1,    // print
        0     // stop
    };
    
    int cmd, pc, acc;
    cmd = pc = acc = 0;

    while(pc != -1){
        cmd = prog[pc];  
        switch(cmd){
            case 0: //Проверка на команду остановки
                printf("STOP\t ACC = %d\t PC = %d",acc,pc);
                pc = -1;
                break;

            case 1: // Комманда 1 - вывод регистра
                pt(prog,cmd,acc,pc);
                pc++;
                break;

            case 2: // Комманда 2 - Присвоить регистру число
                acc = prog[pc+1];//   из след ячейки памяти
                pt(prog,cmd,acc,pc);
                pc+=2;
                break;

            case 3: // Комманда 3 - Умножить регистр на число
                acc *= prog[pc+1];//  в след ячейке памяти
                pt(prog,cmd,acc,pc);
                pc +=2;
                break;

            case 4: // Комманда 4 - Безусловный переход на указанную
                pt(prog,cmd,acc,pc); //   ячейку памяти
                pc = prog[pc+1];
                break;

            case 5: // Комманда 5 - Переход на указанную ячейку
                pt(prog,cmd,acc,pc);// памяти если регистр равен 0
                if(acc == 0){pc = prog[pc+1];}                  
                else(pc+=2);
                break;

            default: printf("err\n");return 1; // Защита от неправильной комманды 
                                               //    и бесконечного зацикливания
        }
    }
    return 0;
}

    // Блок отвечающий за вывод в терминал
    // значиний в момент выполнения комманд
void pt(int prog[],int cmd,int acc,int pc){ 
    printf("\n");
    printf("cmd: %d\n",cmd);
    switch(cmd){
        case 1:
            printf("\tPrint acc\n\t\tacc = %d\n",acc);
            printf("\t\tcurr pc = %d",pc);break;
        case 2:
            printf("\tLoad acc\n\t\tacc = %d\n",acc);
            printf("\t\tcurr pc = %d",pc);break;
        case 3:
            printf("\tMult acc\n\t\tacc = %d\n",acc);
            printf("\t\tcurr pc = %d",pc);break;
        case 4:
            printf("\tJump to\n\t\tto = %d\n",prog[pc+1]);
            printf("\t\tcurr pc = %d",pc);break;
        case 5:
            if(acc==0){
                printf("\tJump to if acc zero\n\t\tto = %d\n",prog[pc+1]);
            }else(printf("\tJump to if acc zero\n\t\tacc != 0\n"));
            printf("\t\tcurr pc = %d",pc);
            break;
    }       
    printf("\n");
}  
