/* * Dumb8 8-bit processing unit * Made by github.com/xamidev * * This is free and unencumbered software released into the public domain. * For more information, please refer to */ #include #include #include #include #include #include "cpu.h" CPU_t cpu; /* * Initializing the CPU: program counter and registers to zero, halted flag to false. */ void cpu_init() { printf("Initializing Dumb8 CPU...\n"); cpu.pc = 0; cpu.halted = false; cpu.equal_flag = false; cpu.flag_clear_delay = 0; for (size_t i=0; i 0) { cpu.flag_clear_delay--; if (cpu.flag_clear_delay == 0) { cpu.equal_flag = false; } } switch (opcode) { // Some lines are repeating.. Should make this a better way.. case NOP: break; case MOV: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] = cpu.reg[reg2]; break; case PUT: reg1 = cpu.memory[cpu.pc++]; value = cpu.memory[cpu.pc++]; cpu.reg[reg1] = value; break; case ADD: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] += cpu.reg[reg2]; break; case SUB: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] -= cpu.reg[reg2]; break; case OR: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] |= cpu.reg[reg2]; break; case AND: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] &= cpu.reg[reg2]; break; case XOR: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.reg[reg1] ^= cpu.reg[reg2]; break; case HLT: cpu.halted = true; break; case JMP: addr = cpu.memory[cpu.pc++]; cpu.pc = addr; break; case JEQ: reg1 = cpu.memory[cpu.pc++]; addr = cpu.memory[cpu.pc++]; if (cpu.equal_flag) { cpu.pc = addr; } break; case CMP: reg1 = cpu.memory[cpu.pc++]; reg2 = cpu.memory[cpu.pc++]; cpu.equal_flag = (cpu.reg[reg1] == cpu.reg[reg2]); cpu.flag_clear_delay = 2; break; case OUT: reg1 = cpu.memory[cpu.pc++]; putchar(cpu.reg[reg1]); break; case IN: reg1 = cpu.memory[cpu.pc++]; cpu.reg[reg1] = getchar(); break; default: printf("Unknown instruction: 0x%02X\n", opcode); cpu.halted = true; break; } } /* * Loading the program in memory */ void cpu_load(const uint8_t* program, size_t size) { for (size_t i=0; i\n", argv[0]); return -1; } load_program_from_bin(argv[1]); // Dumping our program mem_dump(); cpu_run(); // Post-mortem analysis cpu_dump(); return 0; }