Polishing. Alcune implementazioni
This commit is contained in:
		
							parent
							
								
									8eab267645
								
							
						
					
					
						commit
						020a5062a2
					
				| @ -59,7 +59,7 @@ class VMAssembler: | |||||||
|         self.define_ops(key) |         self.define_ops(key) | ||||||
| 
 | 
 | ||||||
|     def parse(self, instruction): |     def parse(self, instruction): | ||||||
|         action = getattr(self, "op_{}".format(instruction.opcode.name)) |         action = getattr(self, "{}".format(instruction.opcode.method)) | ||||||
|         action(instruction) |         action(instruction) | ||||||
| 
 | 
 | ||||||
|     def process_code_line(self, line): |     def process_code_line(self, line): | ||||||
| @ -125,36 +125,66 @@ class VMAssembler: | |||||||
|         self.assembled_code += opcode.uint8() + imm.uint16() + reg.uint8() |         self.assembled_code += opcode.uint8() + imm.uint16() + reg.uint8() | ||||||
|         return |         return | ||||||
| 
 | 
 | ||||||
|     def imm(self, instruction): |     def byt2reg(self, instruction): | ||||||
|  |         """ | ||||||
|  |         Intel syntax -> REG, [BYTE]IMM | ||||||
|  |         """ | ||||||
|  |         opcode = instruction.opcode | ||||||
|  |         reg = instruction.args[0] | ||||||
|  |         imm = instruction.args[1] | ||||||
|  |         if reg.name == "ip": | ||||||
|  |             raise IPOverwrite(instruction) | ||||||
|  |         if not imm.isimm(): | ||||||
|  |             raise ExpectedImmediate(imm) | ||||||
|  |         if not reg.isreg(): | ||||||
|  |             raise ExpectedRegister(reg) | ||||||
|  |         if not opcode.uint8() or not reg.uint8() or not imm.uint8(): | ||||||
|  |             raise InvalidValue(instruction) | ||||||
|  |         self.assembled_code += opcode.uint8() + reg.uint8() + imm.uint8() | ||||||
|         return |         return | ||||||
| 
 | 
 | ||||||
|     def op_movi(self, instruction): |     def regonly(self, instruction): | ||||||
|         self.imm2reg(instruction) |         """ | ||||||
|  |         Instruction with only an argument: a register | ||||||
|  |         """ | ||||||
|  |         opcode = instruction.opcode | ||||||
|  |         reg = instruction.args[0] | ||||||
|  |         if reg.name == "ip": | ||||||
|  |             raise IPOverwrite(instruction) | ||||||
|  |         if not reg.isreg(): | ||||||
|  |             raise ExpectedRegister(reg) | ||||||
|  |         if not opcode.uint8() or not reg.uint8(): | ||||||
|  |             raise InvalidValue(instruction) | ||||||
|  |         self.assembled_code += opcode.uint8() + reg.uint8() | ||||||
|  |         return | ||||||
| 
 | 
 | ||||||
|     def op_movr(self, instruction): |     def immonly(self, instruction): | ||||||
|         self.reg2reg(instruction) |         """ | ||||||
|  |         Instruction with only an argument: an immediate | ||||||
|  |         """ | ||||||
|  |         opcode = instruction.opcode | ||||||
|  |         imm = instruction.args[0] | ||||||
|  |         if not imm.isimm(): | ||||||
|  |             raise ExpectedImmediate(imm) | ||||||
|  |         if not opcode.uint8() or not imm.uint16(): | ||||||
|  |             raise InvalidValue(instruction) | ||||||
|  |         self.assembled_code += opcode.uint8() + imm.uint16() | ||||||
|  |         return | ||||||
| 
 | 
 | ||||||
|     def op_load(self, instruction): |     def single(self, instruction): | ||||||
|         self.imm2reg(instruction) |         """ | ||||||
| 
 |         Instruction with no arguments | ||||||
|     def op_stor(self, instruction): |         """ | ||||||
|         self.reg2imm(instruction) |         opcode = instruction.opcode | ||||||
| 
 |         self.assembled_code += opcode.uint8() | ||||||
|     def op_addi(self, instruction): |         return | ||||||
|         self.imm2reg(instruction) |  | ||||||
| 
 |  | ||||||
|     def op_addr(self, instruction): |  | ||||||
|         self.reg2reg(instruction) |  | ||||||
| 
 | 
 | ||||||
|     def define_ops(self, key): |     def define_ops(self, key): | ||||||
|         key_ba = bytearray(key, 'utf-8') |         key_ba = bytearray(key, 'utf-8') | ||||||
|         olds = copy.deepcopy(ops) |         olds = copy.deepcopy(ops) | ||||||
|         for b in key_ba: |         for b in key_ba: | ||||||
|             for op_com in ops: |             for op_com in ops: | ||||||
|                 if b % 2: |                 op_com.set_value(rol(b ^ op_com.value, b % 8, 8)) | ||||||
|                     op_com.set_value(rol(b ^ op_com.value, b % 8, 8)) |  | ||||||
|                 else: |  | ||||||
|                     op_com.set_value(rol(b ^ op_com.value, (b + 1) % 8, 8)) |  | ||||||
|         for i in ops: |         for i in ops: | ||||||
|             for j in ops: |             for j in ops: | ||||||
|                 j.set_value(rol(j.value, i.value % 8, 8)) |                 j.set_value(rol(j.value, i.value % 8, 8)) | ||||||
| @ -167,9 +197,10 @@ class VMComponent: | |||||||
|     Represents a register, operation or an immediate the VM recognizes |     Represents a register, operation or an immediate the VM recognizes | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def __init__(self, name, value): |     def __init__(self, name, value, method=None): | ||||||
|         self.name = name.casefold() |         self.name = name.casefold() | ||||||
|         self.value = value |         self.value = value | ||||||
|  |         self.method = method | ||||||
| 
 | 
 | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return "{}".format(self.name) |         return "{}".format(self.name) | ||||||
| @ -206,7 +237,7 @@ class VMComponent: | |||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
|     def isop(self): |     def isop(self): | ||||||
|         if self.name not in [x.casefold() for x in op_names]: |         if self.name not in [x[0].casefold() for x in op_names]: | ||||||
|             return False |             return False | ||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
| @ -240,38 +271,42 @@ class VMInstruction: | |||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return "{} {}".format(self.opcode.name, ", ".join([x.name for x in self.args])) |         return "{} {}".format(self.opcode.name, ", ".join([x.name for x in self.args])) | ||||||
| 
 | 
 | ||||||
| op_names = ["MOVI", | op_names = [["MOVI", "imm2reg"], | ||||||
|             "MOVR", |             ["MOVR", "reg2reg"], | ||||||
|             "LOAD", |             ["LOAD", "imm2reg"], | ||||||
|             "STOR", |             ["STOR", "reg2imm"], | ||||||
|             "ADDI", |             ["ADDI", "imm2reg"], | ||||||
|             "ADDR", |             ["ADDR", "reg2reg"], | ||||||
|             "SUBI", |             ["SUBI", "imm2reg"], | ||||||
|             "SUBR", |             ["SUBR", "reg2reg"], | ||||||
|             "XORB", |             ["XORB", "byt2reg"], | ||||||
|             "XORW", |             ["XORW", "imm2reg"], | ||||||
|             "XORR", |             ["XORR", "reg2reg"], | ||||||
|             "NOTR", |             ["NOTR", "regonly"], | ||||||
|             "MULI", |             ["MULI", "imm2reg"], | ||||||
|             "MULR", |             ["MULR", "reg2reg"], | ||||||
|             "DIVI", |             ["DIVI", "imm2reg"], | ||||||
|             "DIVR", |             ["DIVR", "reg2reg"], | ||||||
|             "PUSH", |             ["PUSH", "regonly"], | ||||||
|             "POOP", |             ["POOP", "regonly"], | ||||||
|             "CMPI", |             ["CMPI", "imm2reg"], | ||||||
|             "CMPR", |             ["CMPR", "reg2reg"], | ||||||
|             "JUMP", |             ["JMPI", "immonly"], | ||||||
|             "JMPA", |             ["JMPR", "regonly"], | ||||||
|             "JMPB", |             ["JPAI", "immonly"], | ||||||
|             "JMPE", |             ["JPAR", "regonly"], | ||||||
|             "SHIT", |             ["JPBI", "immonly"], | ||||||
|             "NOPE", |             ["JPBR", "regonly"], | ||||||
|             "GRMN"] |             ["JPEI", "immonly"], | ||||||
|  |             ["JPER", "regonly"], | ||||||
|  |             ["SHIT", "single"], | ||||||
|  |             ["NOPE", "single"], | ||||||
|  |             ["GRMN", "single"]] | ||||||
| 
 | 
 | ||||||
| reg_names = ["R0", "R1", "R2", "R3", "S0", "S1", "S2", "S3", "IP", "BP", "SP"] | reg_names = ["R0", "R1", "R2", "R3", "S0", "S1", "S2", "S3", "IP", "BP", "SP"] | ||||||
| section_names = ["DATA:", "CODE:", "STACK:"] | section_names = ["DATA:", "CODE:", "STACK:"] | ||||||
| section_flags = {s.casefold(): i + 1 for i, s in enumerate(section_names)} | section_flags = {s.casefold(): i + 1 for i, s in enumerate(section_names)} | ||||||
| ops = [VMComponent(s.casefold(), i) for i, s in enumerate(op_names)] | ops = [VMComponent(le[0], i, le[1]) for i, le in enumerate(op_names)] | ||||||
| regs = [VMComponent(s.casefold(), i) for i, s in enumerate(reg_names)] | regs = [VMComponent(s.casefold(), i) for i, s in enumerate(reg_names)] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -22,10 +22,14 @@ enum OPS_STARTING_VALUES { | |||||||
|   POOP, |   POOP, | ||||||
|   CMPI, |   CMPI, | ||||||
|   CMPR, |   CMPR, | ||||||
|   JUMP, |   JMPI, | ||||||
|   JMPA, |   JMPR, | ||||||
|   JMPB, |   JPAI, | ||||||
|   JMPE, |   JPAR, | ||||||
|  |   JPBI, | ||||||
|  |   JPBR, | ||||||
|  |   JPEI, | ||||||
|  |   JPER, | ||||||
|   SHIT, |   SHIT, | ||||||
|   NOPE, |   NOPE, | ||||||
|   GRMN, |   GRMN, | ||||||
| @ -41,7 +45,8 @@ INSTRUCTION SIZE TYPES | |||||||
| #define IMM2REG 4 | #define IMM2REG 4 | ||||||
| #define REG2IMM 4 | #define REG2IMM 4 | ||||||
| #define BYT2REG 3 | #define BYT2REG 3 | ||||||
| #define UNARY 2 | #define REGONLY 2 | ||||||
|  | #define IMMONLY 3 | ||||||
| #define SINGLE 1 | #define SINGLE 1 | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -58,19 +63,23 @@ INSTRUCTION SIZES | |||||||
| #define XORB_SIZE BYT2REG | #define XORB_SIZE BYT2REG | ||||||
| #define XORW_SIZE IMM2REG | #define XORW_SIZE IMM2REG | ||||||
| #define XORR_SIZE REG2REG | #define XORR_SIZE REG2REG | ||||||
| #define NOTR_SIZE UNARY | #define NOTR_SIZE REGONLY | ||||||
| #define MULI_SIZE IMM2REG | #define MULI_SIZE IMM2REG | ||||||
| #define MULR_SIZE REG2REG | #define MULR_SIZE REG2REG | ||||||
| #define DIVI_SIZE IMM2REG | #define DIVI_SIZE IMM2REG | ||||||
| #define DIVR_SIZE REG2REG | #define DIVR_SIZE REG2REG | ||||||
| #define PUSH_SIZE UNARY | #define PUSH_SIZE REGONLY | ||||||
| #define POOP_SIZE UNARY | #define POOP_SIZE REGONLY | ||||||
| #define CMPI_SIZE IMM2REG | #define CMPI_SIZE IMM2REG | ||||||
| #define CMPR_SIZE REG2REG | #define CMPR_SIZE REG2REG | ||||||
| #define JUMP_SIZE UNARY | #define JMPI_SIZE IMMONLY | ||||||
| #define JMPA_SIZE UNARY | #define JMPR_SIZE REGONLY | ||||||
| #define JMPB_SIZE UNARY | #define JPAI_SIZE IMMONLY | ||||||
| #define JMPE_SIZE UNARY | #define JPAR_SIZE REGONLY | ||||||
|  | #define JPBI_SIZE IMMONLY | ||||||
|  | #define JPBR_SIZE REGONLY | ||||||
|  | #define JPEI_SIZE IMMONLY | ||||||
|  | #define JPER_SIZE REGONLY | ||||||
| #define SHIT_SIZE SINGLE | #define SHIT_SIZE SINGLE | ||||||
| #define NOPE_SIZE SINGLE | #define NOPE_SIZE SINGLE | ||||||
| #define GRMN_SIZE SINGLE | #define GRMN_SIZE SINGLE | ||||||
| @ -14,11 +14,7 @@ void VM::defineOpcodes(uint8_t *key) { | |||||||
|   keysize = strlen((char *)key); |   keysize = strlen((char *)key); | ||||||
|   for (i = 0; i < keysize; i++) { |   for (i = 0; i < keysize; i++) { | ||||||
|     for (j = 0; j < NUM_OPS; j++) { |     for (j = 0; j < NUM_OPS; j++) { | ||||||
|       if (key[i] % 2) { |  | ||||||
|         OPS[j] = rol(key[i] ^ OPS[j], key[i] % 8, 8); |         OPS[j] = rol(key[i] ^ OPS[j], key[i] % 8, 8); | ||||||
|       } else { |  | ||||||
|         OPS[j] = rol(key[i] ^ OPS[j], (key[i] + 1) % 8, 8); |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   for (i = 0; i < NUM_OPS; i++) { |   for (i = 0; i < NUM_OPS; i++) { | ||||||
| @ -185,7 +181,7 @@ bool VM::execMOVI(void) { | |||||||
| 
 | 
 | ||||||
| bool VM::execMOVR(void) { | bool VM::execMOVR(void) { | ||||||
|   /*
 |   /*
 | ||||||
|   MOVR R1, R0 | R1 = R0 |   MOVR R1, R0 -> R1 = R0 | ||||||
|   --------------------- |   --------------------- | ||||||
|   R1, R0 = 0x10 <- DST / SRC are nibbles! |   R1, R0 = 0x10 <- DST / SRC are nibbles! | ||||||
|   */ |   */ | ||||||
| @ -203,7 +199,7 @@ bool VM::execMOVR(void) { | |||||||
| 
 | 
 | ||||||
| bool VM::execLOAD(void) { | bool VM::execLOAD(void) { | ||||||
|   /*
 |   /*
 | ||||||
|   LOAD R0, 0x1000 | R0 = data[0x1000] |   LOAD R0, 0x1000 -> R0 = data[0x1000] | ||||||
|   */ |   */ | ||||||
|   uint8_t dst; |   uint8_t dst; | ||||||
|   uint16_t src; |   uint16_t src; | ||||||
| @ -216,7 +212,7 @@ bool VM::execLOAD(void) { | |||||||
| 
 | 
 | ||||||
| bool VM::execSTOR(void) { | bool VM::execSTOR(void) { | ||||||
|   /*
 |   /*
 | ||||||
|   STOR 0x1000, R0 | data[0x1000] = R0 |   STOR 0x1000, R0 -> data[0x1000] = R0 | ||||||
|   */ |   */ | ||||||
|   uint16_t dst; |   uint16_t dst; | ||||||
|   uint8_t src; |   uint8_t src; | ||||||
| @ -229,7 +225,7 @@ bool VM::execSTOR(void) { | |||||||
| 
 | 
 | ||||||
| bool VM::execADDI(void) { | bool VM::execADDI(void) { | ||||||
|   /*
 |   /*
 | ||||||
|   ADDI R0, 0x2 | R0 += 2 |   ADDI R0, 0x2 -> R0 += 2 | ||||||
|   */ |   */ | ||||||
|   uint8_t dst; |   uint8_t dst; | ||||||
|   uint16_t src; |   uint16_t src; | ||||||
| @ -242,6 +238,9 @@ bool VM::execADDI(void) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool VM::execADDR(void) { | bool VM::execADDR(void) { | ||||||
|  |   /*
 | ||||||
|  |   ADDR R0, R1 -> R0 += R1 | ||||||
|  |   */ | ||||||
|   uint8_t dst; |   uint8_t dst; | ||||||
|   uint8_t src; |   uint8_t src; | ||||||
| 
 | 
 | ||||||
| @ -252,24 +251,124 @@ bool VM::execADDR(void) { | |||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool VM::execSUBI(void) { return true; } | bool VM::execSUBI(void) { | ||||||
| bool VM::execSUBR(void) { return true; } |   /*
 | ||||||
| bool VM::execXORB(void) { return true; } |   SUBI R0, 0x2 -> R0 -= 2 | ||||||
| bool VM::execXORW(void) { return true; } |   */ | ||||||
| bool VM::execXORR(void) { return true; } |   uint8_t dst; | ||||||
| bool VM::execNOTR(void) { return true; } |   uint16_t src; | ||||||
| bool VM::execMULI(void) { return true; } | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1]; | ||||||
|  |   src = *((uint16_t *)&as.code[regs[IP] + 2]); | ||||||
|  |   DBG_INFO(("SUBI %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] -= src; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execSUBR(void) { | ||||||
|  |   /*
 | ||||||
|  |   SUBR R0, R1 -> R0 -= R1 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint8_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1] >> 4; | ||||||
|  |   src = as.code[regs[IP] + 1] & 0b00001111; | ||||||
|  |   DBG_INFO(("SUBR %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] -= regs[src]; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execXORB(void) { | ||||||
|  |   /*
 | ||||||
|  |   XORB R0, 0x2 -> R0 ^= 0x02 or R0 ^= [BYTE] 0x02 (low byte) | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint8_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1]; | ||||||
|  |   src = as.code[regs[IP] + 2]; | ||||||
|  |   DBG_INFO(("XORB %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] ^= src; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execXORW(void) { | ||||||
|  |   /*
 | ||||||
|  |   XORW R0, 0x2 -> R0 ^= 0x0002 or R0, ^= [WORD] 0x2 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint16_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1]; | ||||||
|  |   src = *((uint16_t *)&as.code[regs[IP] + 2]); | ||||||
|  |   DBG_INFO(("XORW %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] ^= src; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execXORR(void) { | ||||||
|  |   /*
 | ||||||
|  |   XORR R0, R1 -> R0 ^= R1 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint8_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1] >> 4; | ||||||
|  |   src = as.code[regs[IP] + 1] & 0b00001111; | ||||||
|  |   DBG_INFO(("XORR %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] ^= regs[src]; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execNOTR(void) { | ||||||
|  |   /*
 | ||||||
|  |   NOTR R0, R1 -> R0 = ~R1 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint8_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1] >> 4; | ||||||
|  |   src = as.code[regs[IP] + 1] & 0b00001111; | ||||||
|  |   DBG_INFO(("NOTR %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] = ~regs[src]; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | bool VM::execMULI(void) { | ||||||
|  |   /*
 | ||||||
|  |   MULI R0, 0x2 | R0 *= 2 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint16_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1]; | ||||||
|  |   src = *((uint16_t *)&as.code[regs[IP] + 2]); | ||||||
|  |   DBG_INFO(("SUBI %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] *= src; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
| bool VM::execMULR(void) { return true; } | bool VM::execMULR(void) { return true; } | ||||||
| bool VM::execDIVI(void) { return true; } | bool VM::execDIVI(void) { | ||||||
|  |   /*
 | ||||||
|  |   DIVI R0, 0x2 | R0 /= 2 | ||||||
|  |   */ | ||||||
|  |   uint8_t dst; | ||||||
|  |   uint16_t src; | ||||||
|  | 
 | ||||||
|  |   dst = as.code[regs[IP] + 1]; | ||||||
|  |   src = *((uint16_t *)&as.code[regs[IP] + 2]); | ||||||
|  |   DBG_INFO(("DIVI %s, 0x%x\n", getRegName(dst), src)); | ||||||
|  |   regs[dst] /= src; | ||||||
|  |   return true; | ||||||
|  | } | ||||||
| bool VM::execDIVR(void) { return true; } | bool VM::execDIVR(void) { return true; } | ||||||
| bool VM::execPUSH(void) { return true; } | bool VM::execPUSH(void) { return true; } | ||||||
| bool VM::execPOOP(void) { return true; } | bool VM::execPOOP(void) { return true; } | ||||||
| bool VM::execCMPI(void) { return true; } | bool VM::execCMPI(void) { return true; } | ||||||
| bool VM::execCMPR(void) { return true; } | bool VM::execCMPR(void) { return true; } | ||||||
| bool VM::execJUMP(void) { return true; } | bool VM::execJMPI(void) { return true; } | ||||||
| bool VM::execJMPA(void) { return true; } | bool VM::execJMPR(void) { return true; } | ||||||
| bool VM::execJMPB(void) { return true; } | bool VM::execJPAI(void) { return true; } | ||||||
| bool VM::execJMPE(void) { return true; } | bool VM::execJPAR(void) { return true; } | ||||||
|  | bool VM::execJPBI(void) { return true; } | ||||||
|  | bool VM::execJPBR(void) { return true; } | ||||||
|  | bool VM::execJPEI(void) { return true; } | ||||||
|  | bool VM::execJPER(void) { return true; } | ||||||
| bool VM::execGRMN(void) { return true; } | bool VM::execGRMN(void) { return true; } | ||||||
| void VM::run(void) { | void VM::run(void) { | ||||||
|   uint8_t opcode; |   uint8_t opcode; | ||||||
| @ -333,22 +432,35 @@ void VM::run(void) { | |||||||
|     } else if (opcode == OPS[CMPR]) { |     } else if (opcode == OPS[CMPR]) { | ||||||
|       execCMPR(); |       execCMPR(); | ||||||
|       regs[IP] += CMPR_SIZE; |       regs[IP] += CMPR_SIZE; | ||||||
|     } else if (opcode == OPS[JUMP]) { |     } else if (opcode == OPS[JMPI]) { | ||||||
|       execJUMP(); |       execJMPI(); | ||||||
|       regs[IP] += JUMP_SIZE; |       regs[IP] += JMPI_SIZE; | ||||||
|     } else if (opcode == OPS[JMPA]) { |     } else if (opcode == OPS[JMPR]) { | ||||||
|       execJMPA(); |       execJMPR(); | ||||||
|       regs[IP] += JMPA_SIZE; |       regs[IP] += JMPR_SIZE; | ||||||
|     } else if (opcode == OPS[JMPB]) { |     }else if (opcode == OPS[JPAI]) { | ||||||
|       execJMPB(); |       execJPAI(); | ||||||
|       regs[IP] += JMPB_SIZE; |       regs[IP] += JPAI_SIZE; | ||||||
|     } else if (opcode == OPS[JMPE]) { |     }else if (opcode == OPS[JPAR]) { | ||||||
|       execJMPE(); |       execJPAR(); | ||||||
|       regs[IP] += JMPE_SIZE; |       regs[IP] += JPAR_SIZE; | ||||||
|  |     }else if (opcode == OPS[JPBI]) { | ||||||
|  |       execJPBI(); | ||||||
|  |       regs[IP] += JPBI_SIZE; | ||||||
|  |     }else if (opcode == OPS[JPBR]) { | ||||||
|  |       execJPBR(); | ||||||
|  |       regs[IP] += JPBR_SIZE; | ||||||
|  |     }else if (opcode == OPS[JPEI]) { | ||||||
|  |       execJPEI(); | ||||||
|  |       regs[IP] += JPEI_SIZE; | ||||||
|  |     }else if (opcode == OPS[JPER]) { | ||||||
|  |       execJPER(); | ||||||
|  |       regs[IP] += JPER_SIZE; | ||||||
|     } else if (opcode == OPS[GRMN]) { |     } else if (opcode == OPS[GRMN]) { | ||||||
|       execGRMN(); |       execGRMN(); | ||||||
|       regs[IP] += GRMN_SIZE; |       regs[IP] += GRMN_SIZE; | ||||||
|     } else if (opcode == OPS[SHIT]) { |     } else if (opcode == OPS[SHIT]) { | ||||||
|  |       DBG_INFO(("Halting.\n")); | ||||||
|       finished = true; |       finished = true; | ||||||
|     } else if (opcode == OPS[NOPE]) { |     } else if (opcode == OPS[NOPE]) { | ||||||
|       regs[IP] += NOPE_SIZE; |       regs[IP] += NOPE_SIZE; | ||||||
| @ -51,10 +51,14 @@ private: | |||||||
|   bool execPOOP(void); |   bool execPOOP(void); | ||||||
|   bool execCMPI(void); |   bool execCMPI(void); | ||||||
|   bool execCMPR(void); |   bool execCMPR(void); | ||||||
|   bool execJUMP(void); |   bool execJMPI(void); | ||||||
|   bool execJMPA(void); |   bool execJMPR(void); | ||||||
|   bool execJMPB(void); |   bool execJPAI(void); | ||||||
|   bool execJMPE(void); |   bool execJPAR(void); | ||||||
|  |   bool execJPBI(void); | ||||||
|  |   bool execJPBR(void); | ||||||
|  |   bool execJPEI(void); | ||||||
|  |   bool execJPER(void); | ||||||
|   bool execGRMN(void); |   bool execGRMN(void); | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user