// instruction-init.h // Initializes every instruction function prior to addressing.h so that function addresses are accessible // also defines the array used to refer to functions //InstructionTable void* InstructionTable; void (*func)(Addressing, address); #define InstructionTableSize (256 * (sizeof(uintptr_t) + sizeof(Addressing))) /* uintptr_t getInstructionTableFunction(int i){ //Segmentation fault is occurring here, likely in next one too uintptr_t r = (InstructionTable + (sizeof(uintptr_t)*i)); return r; } Addressing getInstructionTableAddressing(int i){ Addressing r = (InstructionTable + (sizeof(uintptr_t)*256) + (sizeof(Addressing)*i)); return r; } */ void callInstructionTable(int i, address val){ printf("Table:\t%x\n", InstructionTable); uintptr_t* a = (InstructionTable + (sizeof(uintptr_t) * i)); printf("A Val:\t%x\n", a); printf("Before:\t%x\n", func); func = *a; printf("After:\t%x\n", func); //printf("Before:\t%x\n", func); memcpy(&func, a, sizeof(uintptr_t)); printf("After:\t%x\n", func); Addressing* r = (InstructionTable + ((sizeof(uintptr_t)*256) + (sizeof(Addressing) * i))); func(*r, val); printf("Statement OK"); } void initInstructionTable(){ InstructionTable = malloc(InstructionTableSize); FILE* fs = fopen("instructions.bin", "r"); for(byte* c = InstructionTable; c < (InstructionTable + InstructionTableSize); c++){ //NEED TO MAKE (InstructionTable + (256*(sizeof(uintptr_t) + sizeof(Addressing)))) a macro *c = (byte)fgetc(fs); } //Investigate whether doing word sized units would increase speed fclose(fs); //read in the instruction data binary } // Load and Store Instructions void fLDA(Addressing, address); void fLDX(Addressing, address); void fLDY(Addressing, address); void fSTA(Addressing, address); void fSTX(Addressing, address); void fSTY(Addressing, address); // Arithmetic Instructions void fADC(Addressing, address); void fSBC(Addressing, address); //Increment and Decrement Instructions void fINC(Addressing, address); void fINX(Addressing, address); void fINY(Addressing, address); void fDEC(Addressing, address); void fDEX(Addressing, address); void fDEY(Addressing, address); // Logical Instructions void fAND(Addressing, address); void fORA(Addressing, address); void fEOR(Addressing, address); // Jump, Branch, Compare, and Test Bits void fJMP(Addressing, address); void fBCC(Addressing, address); void fBCS(Addressing, address); void fBEQ(Addressing, address); void fBNE(Addressing, address); void fBMI(Addressing, address); void fBPL(Addressing, address); void fBVS(Addressing, address); void fBVC(Addressing, address); void fCMP(Addressing, address); void fCPX(Addressing, address); void fCPY(Addressing, address); void fBIT(Addressing, address); // Shift and Rotate Instructions void fASL(Addressing, address); void fLSR(Addressing, address); void fROL(Addressing, address); void fROR(Addressing, address); // Transfer Instructions void fTAX(Addressing, address); void fTAY(Addressing, address); void fTXA(Addressing, address); void fTYA(Addressing, address); // Stack Instructions void fTSX(Addressing, address); void fTXS(Addressing, address); void fPHA(Addressing, address); void fPHP(Addressing, address); void fPLA(Addressing, address); void fPLP(Addressing, address); // Subroutine Instructions void fJSR(Addressing, address); void fRTS(Addressing, address); void fRTI(Addressing, address); // Set/Reset Insutrctions void fCLC(Addressing, address); void fCLD(Addressing, address); void fCLI(Addressing, address); void fCLV(Addressing, address); void fSEC(Addressing, address); void fSED(Addressing, address); void fSEI(Addressing, address); // NOP/BRK Instructions void fNOP(Addressing, address); void fBRK(Addressing, address);