#ifndef CPU_H_INCLUDED
#define CPU_H_INCLUDED

#include"mem.h"



/*

HALT	    00 00 00 00 Aborta o programa
READ POS	00 01 XX XX Lê uma palavra do dispositivo de entrada (o console) para o acumulador
WRITE POS	00 02 XX XX Escreve um valor armazenado no acumulador no dispositivo de saída (o console)
LOAD POS	00 03 XX XX Carrega para o acumulador uma palavra da memória no endereço XX especificado pelos últimos dois dígitos
STORE POS	00 04 XX XX Armazena na memória, no endereço XX, a palavra contida no acumulador
ADD	POS     00 05 XX XX Adiciona o valor no endereço de memória XX ao valor no acumulador
SUB	POS     00 06 XX XX Subtrai o valor no endereço de memória XX do valor no acumulador
MUL	PÒS     00 07 XX XX Multiplica o valor no acumulador pelo valor no endereço de memória XX
DIV	POS     00 08 XX XX Divide o  valor no acumulador pelo valor no endereço de memória XX
MOD	POS     00 09 XX XX Determina o resto da divisão do valor no acumulador pelo valor no endereço de memória XX
BRANCH	    00 0A XX XX Transfere o fluxo de execução para o endereço  de memória XX
BRANCHNEG	00 0B XX XX Transfere o fluxo para o endereço XX caso o valor no acumulador seja negativo
BRANCHZERO	00 0C XX XX Transfere o fluxo para o endereço XX caso o valor no acumulador seja igual à zero
*/

struct decode{char * inst_name, word op};

struct decode decode_list[NUM_INST] = {{"HALT",0x0},
                                       {"READ",0x1},
                                       {"WRITE",0x2},
                                       {"LOAD",0x3},
                                       {"STORE",0x4},
                                       {"ADD",0x5},
                                       {"SUB",0x6},
                                       {"MUL",0x7},
                                       {"DIV",0x8},
                                       {"MOD",0x9},
                                       {"BRANCH",0xA},
                                       {"BRANCHNEG",0xB},
                                       {"BRANCHZERO",0xC},
                                       };



struct _cpu_t
{
    memory_t mem;
    word acc;
    word add;
    int pc;

}cpu_t;

typedef  struct cpu_t cpu_t;

word_t getOpcode(cpu);

void run(cpu_t cpu);

void exec(cpu_t cpu);

void exitCPU(cpu_t cpu);

void compile(char * file_name);


void loadProgram(cpu_t,char * file_name);



#endif // CPU_H_INCLUDED
