#include "instr.h" #include "mem.h" #include #include "addrs.h" #include "instr_map.h" #include "mem_seg.h" uint8_t _invalid_opcode(prog_counter_t* pcounter, device_mem_t* devMem) { opcode_t op = extractOpcode(devMem, *pcounter); printf("Invalid opcode at 0x%016X: 0x%016X\n", *pcounter, op); return (uint8_t)(-1); } void setCombinations(opcode_t base, opcode_t mask, instr_h_func* tgt, instr_h_func val) { opcode_t start_opcode = base; do { tgt[(start_opcode & mask) | base] = val; start_opcode += 1; } while(start_opcode < (base | mask)); tgt[(start_opcode & mask) | base] = val; } void setOpcodeSizes(uint8_t* opcodeSizes) { instruction_metadata_t metadataArray[] = HANDLER_REGISTERS; for (size_t i = 0; i < ((opcode_t)~0); i++) { opcodeSizes[i] = 0; } for(size_t i = 0; i < sizeof(metadataArray) / sizeof(instruction_metadata_t); i++) { opcode_t start_opcode = metadataArray[i].base; do { opcodeSizes[(start_opcode & metadataArray[i].argsMask) | metadataArray[i].base] = metadataArray[i].opcodeLen; start_opcode += 1; } while(start_opcode < (metadataArray[i].base | metadataArray[i].argsMask)); } } instr_h_func* genInstrArray(char* errbuf) { instruction_metadata_t metadataArray[] = HANDLER_REGISTERS; instr_h_func* instrArray = calloc(((opcode_t)~0), sizeof(instr_h_func*)); if (instrArray == NULL) { sprintf(errbuf, "Unable to allocate instruction table"); return NULL; } for (size_t i = 0; i < ((opcode_t)~0); i++) { instrArray[i] = &_invalid_opcode; } for(size_t i = 0; i < sizeof(metadataArray) / sizeof(instruction_metadata_t); i++) { setCombinations(metadataArray[i].base, metadataArray[i].argsMask, instrArray, metadataArray[i].h); } return instrArray; } opcode_t extractOpcode(device_mem_t* devMem, prog_counter_t programCounter) { return ((opcode_t*)devMem->cells[MEMSEG_PS])[programCounter]; } size_t pubExtractOpcode(device_mem_t* devMem, size_t _programCounter) { prog_counter_t programCounter = (prog_counter_t)(_programCounter); return (size_t)(((opcode_t*)devMem->cells[MEMSEG_PS])[programCounter]); }