add instr, manifest, dev_variant
This commit is contained in:
91
src/instr.c
Normal file
91
src/instr.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include "instr.h"
|
||||
#include "mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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]);
|
||||
}
|
||||
Reference in New Issue
Block a user