diff options
author | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-04-21 01:09:40 +1000 |
---|---|---|
committer | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-04-21 01:09:40 +1000 |
commit | c4c28762385c52d0c349da72e3f3bbed64197411 (patch) | |
tree | 7e95944cb8c32440280f53b57c1caa62d0b5bb86 | |
parent | 1bf33140ce7e858ee7fe1a416e7ebfd586f024b3 (diff) |
work in progress
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | ToDo | 10 | ||||
-rwxr-xr-x | a.out | bin | 30696 -> 0 bytes | |||
-rw-r--r-- | instruction-bin.c | 256 | ||||
-rw-r--r-- | instruction-init.h | 256 | ||||
-rw-r--r-- | makefile | 3 |
6 files changed, 290 insertions, 243 deletions
@@ -8,8 +8,12 @@ My emulator has a handful of specific milestones to achieve that will demonstrat 2. Run a system monitor program correctly. 3. Successfully run a BASIC program in Wozniak's BASIC interpreter. +Restrictions of my emulator include: + +1. No plans to support illegal instructions as of yet. + Planned core features for the emulator include: 1. A terminal emulator with the original Apple I font. -2. An emulation of the Apple I cassette reader peripheral, which will let binary files be given as input. -3. A seperate assembler program so the user may write their own programs to read into the emulator.
\ No newline at end of file +2. A program to read binary files straight to memory. +3. An extremely simple assembler so the user may write programs to read into the emulator.
\ No newline at end of file @@ -0,0 +1,10 @@ +Before the next commit, this should all be completed. + +Create the makefile. +Fix directory structures and header files before it gets even messier. +Delete unnecessary files. +Fix up the instruction dump file. +Expand the names of any acronyms, like IT +Figure out simple threading in C to run other programs within the same address space. Perhaps use this to let the emulator run as an engine, which is interfaced by swappable clients, such as the SDL terminal emulator, terminal, and instruction interpreter clients. + Following on from this, functions like a computer hard reset may be useful. +Unstage a.out.
\ No newline at end of file Binary files differdiff --git a/instruction-bin.c b/instruction-bin.c new file mode 100644 index 0000000..d470c74 --- /dev/null +++ b/instruction-bin.c @@ -0,0 +1,256 @@ +#include"include.h" + +void setIT(int i, uintptr_t p, Addressing r); +void setAllIT(); + +int main(){ + setAllIT(); + // here, do calls to dump all instructions into a bin file + FILE* fs = fopen("instructions.bin", "w"); + for(char* c = IT; c < (IT + InstructionTableSize); c++){ + fputc(*c, fs); + } + fclose(fs); +} + +void setIT(int i, uintptr_t p, Addressing r){ + uintptr_t* p1 = (IT + (sizeof(uintptr_t)*i)); + *p1 = p; + + Addressing* r1 = (IT + (sizeof(uintptr_t)*256) + (sizeof(Addressing)*i)); + *r1 = r; +} + +void setAllIT(){ + IT = malloc(256 * (sizeof(uintptr_t) + sizeof(Addressing))); + // Load and Store Instructions + // fLDA(Addressing, address); + setIT(0xA9, (uintptr_t)&fLDA, eImmediate); + setIT(0xA5, (uintptr_t)&fLDA, eZeroPage); + setIT(0xB5, (uintptr_t)&fLDA, eZeroPageIndexedX); + setIT(0xAD, (uintptr_t)&fLDA, eAbsolute); + setIT(0xBD, (uintptr_t)&fLDA, eAbsoluteIndexedX); + setIT(0xB9, (uintptr_t)&fLDA, eAbsoluteIndexedY); + setIT(0xA1, (uintptr_t)&fLDA, eIndexedIndirect); + setIT(0xB1, (uintptr_t)&fLDA, eIndirectIndexed); + // fLDX(Addressing, address); + setIT(0xA2, (uintptr_t)&fLDX, eImmediate); + setIT(0xA6, (uintptr_t)&fLDX, eZeroPage); + setIT(0xB6, (uintptr_t)&fLDX, eZeroPageIndexedY); + setIT(0xAE, (uintptr_t)&fLDX, eAbsolute); + setIT(0xBE, (uintptr_t)&fLDX, eAbsoluteIndexedY); + // fLDY(Addressing, address); + setIT(0xA0, (uintptr_t)&fLDY, eImmediate); + setIT(0xA4, (uintptr_t)&fLDY, eZeroPage); + setIT(0xB4, (uintptr_t)&fLDY, eZeroPageIndexedX); + setIT(0xAC, (uintptr_t)&fLDY, eAbsolute); + setIT(0xBC, (uintptr_t)&fLDY, eAbsoluteIndexedX); + // fSTA(Addressing, address); + setIT(0x85, (uintptr_t)&fSTA, eZeroPage); + setIT(0x95, (uintptr_t)&fSTA, eZeroPageIndexedX); + setIT(0x8D, (uintptr_t)&fSTA, eAbsolute); + setIT(0x9D, (uintptr_t)&fSTA, eAbsoluteIndexedX); + setIT(0x99, (uintptr_t)&fSTA, eAbsoluteIndexedY); + setIT(0x81, (uintptr_t)&fSTA, eIndexedIndirect); + setIT(0x91, (uintptr_t)&fSTA, eIndirectIndexed); + // fSTX(Addressing, address); + setIT(0x86, (uintptr_t)&fSTX, eZeroPage); + setIT(0x96, (uintptr_t)&fSTX, eZeroPageIndexedX); + setIT(0x8E, (uintptr_t)&fSTX, eAbsolute); + // fSTY(Addressing, address); + setIT(0x84, (uintptr_t)&fSTY, eZeroPage); + setIT(0x94, (uintptr_t)&fSTY, eZeroPageIndexedY); + setIT(0x8C, (uintptr_t)&fSTY, eAbsolute); + + // Arithmetic Instructions + // fADC(Addressing, address); + setIT(0x69, (uintptr_t)&fADC, eImmediate); + setIT(0x65, (uintptr_t)&fADC, eZeroPage); + setIT(0x75, (uintptr_t)&fADC, eZeroPageIndexedX); + setIT(0x6D, (uintptr_t)&fADC, eAbsolute); + setIT(0x7D, (uintptr_t)&fADC, eAbsoluteIndexedX); + setIT(0x79, (uintptr_t)&fADC, eAbsoluteIndexedY); + setIT(0x61, (uintptr_t)&fADC, eIndexedIndirect); + setIT(0x71, (uintptr_t)&fADC, eIndirectIndexed); + // fSBC(Addressing, address); + setIT(0xE9, (uintptr_t)&fSBC, eImmediate); + setIT(0xE5, (uintptr_t)&fSBC, eZeroPage); + setIT(0xF5, (uintptr_t)&fSBC, eZeroPageIndexedX); + setIT(0xED, (uintptr_t)&fSBC, eAbsolute); + setIT(0xFD, (uintptr_t)&fSBC, eAbsoluteIndexedX); + setIT(0xF9, (uintptr_t)&fSBC, eAbsoluteIndexedY); + setIT(0xE1, (uintptr_t)&fSBC, eIndexedIndirect); + setIT(0xF1, (uintptr_t)&fSBC, eIndirectIndexed); + + //Increment and Decrement Instructions + //INC(Addressing, address); + setIT(0xE6, (uintptr_t)&fINC, eZeroPage); + setIT(0xF6, (uintptr_t)&fINC, eZeroPageIndexedX); + setIT(0xEE, (uintptr_t)&fINC, eAbsolute); + setIT(0xFE, (uintptr_t)&fINC, eAbsoluteIndexedX); + //INX(Addressing, address); + setIT(0xE8, (uintptr_t)&fINX, eImplied); + //INY(Addressing, address); + setIT(0xC8, (uintptr_t)&fINY, eImplied); + //DEC(Addressing, address); + setIT(0xC6, (uintptr_t)&fDEC, eZeroPage); + setIT(0xD6, (uintptr_t)&fDEC, eZeroPageIndexedX); + setIT(0xCE, (uintptr_t)&fDEC, eAbsolute); + setIT(0xDE, (uintptr_t)&fDEC, eAbsoluteIndexedX); + //DEX(Addressing, address); + setIT(0xCA, (uintptr_t)&fDEX, eImplied); + //DEY(Addressing, address); + setIT(0x88, (uintptr_t)&fDEY, eImplied); + + // Logical Instructions + //AND(Addressing, address); + setIT(0x29, (uintptr_t)&fAND, eImmediate); + setIT(0x25, (uintptr_t)&fAND, eZeroPage); + setIT(0x35, (uintptr_t)&fAND, eZeroPageIndexedX); + setIT(0x2D, (uintptr_t)&fAND, eAbsolute); + setIT(0x3D, (uintptr_t)&fAND, eAbsoluteIndexedX); + setIT(0x39, (uintptr_t)&fAND, eAbsoluteIndexedY); + setIT(0x21, (uintptr_t)&fAND, eIndexedIndirect); + setIT(0x31, (uintptr_t)&fAND, eIndirectIndexed); + //ORA(Addressing, address); + setIT(0x09, (uintptr_t)&fORA, eImmediate); + setIT(0x05, (uintptr_t)&fORA, eZeroPage); + setIT(0x15, (uintptr_t)&fORA, eZeroPageIndexedX); + setIT(0x0D, (uintptr_t)&fORA, eAbsolute); + setIT(0x1D, (uintptr_t)&fORA, eAbsoluteIndexedX); + setIT(0x19, (uintptr_t)&fORA, eAbsoluteIndexedY); + setIT(0x01, (uintptr_t)&fORA, eIndexedIndirect); + setIT(0x11, (uintptr_t)&fORA, eIndirectIndexed); + //EOR(Addressing, address); + setIT(0x49, (uintptr_t)&fEOR, eImmediate); + setIT(0x45, (uintptr_t)&fEOR, eZeroPage); + setIT(0x55, (uintptr_t)&fEOR, eZeroPageIndexedX); + setIT(0x4D, (uintptr_t)&fEOR, eAbsolute); + setIT(0x5D, (uintptr_t)&fEOR, eAbsoluteIndexedX); + setIT(0x59, (uintptr_t)&fEOR, eAbsoluteIndexedY); + setIT(0x41, (uintptr_t)&fEOR, eIndexedIndirect); + setIT(0x51, (uintptr_t)&fEOR, eIndirectIndexed); + + // Jump, Branch, Compare, and Test Bits + //JMP(Addressing, address); + setIT(0x4C, (uintptr_t)&fJMP, eAbsolute); + setIT(0x6C, (uintptr_t)&fJMP, eIndirectAbsolute); + //BCC(Addressing, address); + setIT(0x90, (uintptr_t)&fBCC, eRelative); + //BCS(Addressing, address); + setIT(0xB0, (uintptr_t)&fBCS, eRelative); + //BEQ(Addressing, address); + setIT(0xF0, (uintptr_t)&fBEQ, eRelative); + //BNE(Addressing, address); + setIT(0xD0, (uintptr_t)&fBNE, eRelative); + //BMI(Addressing, address); + setIT(0x30, (uintptr_t)&fBMI, eRelative); + //BPL(Addressing, address); + setIT(0x10, (uintptr_t)&fBPL, eRelative); + //BVS(Addressing, address); + setIT(0x70, (uintptr_t)&fBVS, eRelative); + //BVC(Addressing, address); + setIT(0x50, (uintptr_t)&fBVC, eRelative); + //CMP(Addressing, address); + setIT(0xC9, (uintptr_t)&fCMP, eImmediate); + setIT(0xC5, (uintptr_t)&fCMP, eZeroPage); + setIT(0xD5, (uintptr_t)&fCMP, eZeroPageIndexedX); + setIT(0xCD, (uintptr_t)&fCMP, eAbsolute); + setIT(0xDD, (uintptr_t)&fCMP, eAbsoluteIndexedX); + setIT(0xD9, (uintptr_t)&fCMP, eAbsoluteIndexedY); + setIT(0xC1, (uintptr_t)&fCMP, eIndexedIndirect); + setIT(0xD1, (uintptr_t)&fCMP, eIndirectIndexed); + //CPX(Addressing, address); + setIT(0xE0, (uintptr_t)&fCPX, eImmediate); + setIT(0xE4, (uintptr_t)&fCPX, eZeroPage); + setIT(0xEC, (uintptr_t)&fCPX, eAbsolute); + //CPY(Addressing, address); + setIT(0xC0, (uintptr_t)&fCPY, eImmediate); + setIT(0xC4, (uintptr_t)&fCPY, eZeroPage); + setIT(0xCC, (uintptr_t)&fCPY, eAbsolute); + //BIT(Addressing, address); + setIT(0x4C, (uintptr_t)&fBIT, eZeroPage); + setIT(0x6C, (uintptr_t)&fBIT, eAbsolute); + + // Shift and Rotate Instructions + //ASL(Addressing, address); + setIT(0x0A, (uintptr_t)&fASL, eAccumulator); + setIT(0x06, (uintptr_t)&fASL, eZeroPage); + setIT(0x16, (uintptr_t)&fASL, eZeroPageIndexedX); + setIT(0x0E, (uintptr_t)&fASL, eAbsolute); + setIT(0x1E, (uintptr_t)&fASL, eAbsoluteIndexedX); + //LSR(Addressing, address); + setIT(0x4A, (uintptr_t)&fLSR, eAccumulator); + setIT(0x46, (uintptr_t)&fLSR, eZeroPage); + setIT(0x56, (uintptr_t)&fLSR, eZeroPageIndexedX); + setIT(0x4E, (uintptr_t)&fLSR, eAbsolute); + setIT(0x5E, (uintptr_t)&fLSR, eAbsoluteIndexedX); + //ROL(Addressing, address); + setIT(0x2A, (uintptr_t)&fROL, eAccumulator); + setIT(0x26, (uintptr_t)&fROL, eZeroPage); + setIT(0x36, (uintptr_t)&fROL, eZeroPageIndexedX); + setIT(0x2E, (uintptr_t)&fROL, eAbsolute); + setIT(0x3E, (uintptr_t)&fROL, eAbsoluteIndexedX); + //ROR(Addressing, address); + setIT(0x6A, (uintptr_t)&fROR, eAccumulator); + setIT(0x66, (uintptr_t)&fROR, eZeroPage); + setIT(0x76, (uintptr_t)&fROR, eZeroPageIndexedX); + setIT(0x6E, (uintptr_t)&fROR, eAbsolute); + setIT(0x7E, (uintptr_t)&fROR, eAbsoluteIndexedX); + + // Transfer Instructions + //TAX(Addressing, address); + setIT(0xAA, (uintptr_t)&fTAX, eImplied); + //TAY(Addressing, address); + setIT(0xA8, (uintptr_t)&fTAY, eImplied); + //TXA(Addressing, address); + setIT(0x8A, (uintptr_t)&fTXA, eImplied); + //TYA(Addressing, address); + setIT(0x98, (uintptr_t)&fTYA, eImplied); + + // Stack Instructions + //TSX(Addressing, address); + setIT(0xBA, (uintptr_t)&fTSX, eImplied); + //TXS(Addressing, address); + setIT(0x9A, (uintptr_t)&fTXS, eImplied); + //PHA(Addressing, address); + setIT(0x48, (uintptr_t)&fPHA, eImplied); + //PHP(Addressing, address); + setIT(0x08, (uintptr_t)&fPHP, eImplied); + //PLA(Addressing, address); + setIT(0x68, (uintptr_t)&fPLA, eImplied); + //PLP(Addressing, address); + setIT(0x28, (uintptr_t)&fPLP, eImplied); + + // Subroutine Instructions + //JSR(Addressing, address); + setIT(0x20, (uintptr_t)&fJSR, eAbsolute); + //RTS(Addressing, address); + setIT(0x60, (uintptr_t)&fRTS, eImplied); + //RTI(Addressing, address); + setIT(0x40, (uintptr_t)&fRTI, eImplied); + + // Set/Reset Insutrctions + //CLC(Addressing, address); + setIT(0x18, (uintptr_t)&fCLC, eImplied); + //CLD(Addressing, address); + setIT(0xD8, (uintptr_t)&fCLD, eImplied); + //CLI(Addressing, address); + setIT(0x58, (uintptr_t)&fCLI, eImplied); + //CLV(Addressing, address); + setIT(0xB8, (uintptr_t)&fCLV, eImplied); + //SEC(Addressing, address); + setIT(0x38, (uintptr_t)&fSEC, eImplied); + //SED(Addressing, address); + setIT(0xF8, (uintptr_t)&fSED, eImplied); + //SEI(Addressing, address); + setIT(0x78, (uintptr_t)&fSEI, eImplied); + + // NOP/BRK Instructions + //NOP(Addressing, address); + setIT(0xEA, (uintptr_t)&fNOP, eImplied); + //BRK(Addressing, address); + setIT(0x00, (uintptr_t)&fBRK, eImplied); +} + + diff --git a/instruction-init.h b/instruction-init.h index adb5047..12cdfa4 100644 --- a/instruction-init.h +++ b/instruction-init.h @@ -6,15 +6,7 @@ void* IT; void (*func)(Addressing, address); -void setIT(int i, uintptr_t p, Addressing r){ - uintptr_t* p1 = (IT + (sizeof(uintptr_t)*i)); - *p1 = p; - - Addressing* r1 = (IT + (sizeof(uintptr_t)*256) + (sizeof(Addressing)*i)); - *r1 = r; - - printf("DEBUG:\t%x\t%x -> %x\t%x -> %x\n", i, p1, *p1, r1, *r1); -} +#define InstructionTableSize (256*(sizeof(uintptr_t) + sizeof(Addressing))) /* uintptr_t getITFunction(int i){ //Segmentation fault is occurring here, likely in next one too @@ -30,12 +22,25 @@ Addressing getITAddressing(int i){ void callIT(int i, address val){ - uintptr_t a = ((uintptr_t)IT + (sizeof(uintptr_t) * i)); + uintptr_t a = (IT + (sizeof(uintptr_t) * i)); memcpy(&func, a, sizeof(uintptr_t)); Addressing* r = (IT + ((sizeof(uintptr_t)*256) + (sizeof(Addressing) * i))); func(*r, val); } +void initIT(){ + IT = malloc(InstructionTableSize); + FILE* fs = fopen("instructions.bin", "r"); + + /*if (fs == NULL){ + system("instruction-dump"); + }*/ + for(char* c = IT; c < (IT + InstructionTableSize); c++){ //NEED TO MAKE (IT + (256*(sizeof(uintptr_t) + sizeof(Addressing)))) a macro + *c = fgetc(fs); + } //Investigate whether doing word sized units would increase speed + fclose(fs); + //read in the instruction data binary +} @@ -107,236 +112,5 @@ void fSEI(Addressing, address); void fNOP(Addressing, address); void fBRK(Addressing, address); -void initIT(){ //Change this to load a binary file which contains this same information. - //So will need to dump the contents of IT at some point. - IT = malloc(256 * (sizeof(uintptr_t) + sizeof(Addressing))); - - // Load and Store Instructions - // fLDA(Addressing, address); - setIT(0xA9, (uintptr_t)&fLDA, eImmediate); - setIT(0xA5, (uintptr_t)&fLDA, eZeroPage); - setIT(0xB5, (uintptr_t)&fLDA, eZeroPageIndexedX); - setIT(0xAD, (uintptr_t)&fLDA, eAbsolute); - setIT(0xBD, (uintptr_t)&fLDA, eAbsoluteIndexedX); - setIT(0xB9, (uintptr_t)&fLDA, eAbsoluteIndexedY); - setIT(0xA1, (uintptr_t)&fLDA, eIndexedIndirect); - setIT(0xB1, (uintptr_t)&fLDA, eIndirectIndexed); - // fLDX(Addressing, address); - setIT(0xA2, (uintptr_t)&fLDX, eImmediate); - setIT(0xA6, (uintptr_t)&fLDX, eZeroPage); - setIT(0xB6, (uintptr_t)&fLDX, eZeroPageIndexedY); - setIT(0xAE, (uintptr_t)&fLDX, eAbsolute); - setIT(0xBE, (uintptr_t)&fLDX, eAbsoluteIndexedY); - // fLDY(Addressing, address); - setIT(0xA0, (uintptr_t)&fLDY, eImmediate); - setIT(0xA4, (uintptr_t)&fLDY, eZeroPage); - setIT(0xB4, (uintptr_t)&fLDY, eZeroPageIndexedX); - setIT(0xAC, (uintptr_t)&fLDY, eAbsolute); - setIT(0xBC, (uintptr_t)&fLDY, eAbsoluteIndexedX); - // fSTA(Addressing, address); - setIT(0x85, (uintptr_t)&fSTA, eZeroPage); - setIT(0x95, (uintptr_t)&fSTA, eZeroPageIndexedX); - setIT(0x8D, (uintptr_t)&fSTA, eAbsolute); - setIT(0x9D, (uintptr_t)&fSTA, eAbsoluteIndexedX); - setIT(0x99, (uintptr_t)&fSTA, eAbsoluteIndexedY); - setIT(0x81, (uintptr_t)&fSTA, eIndexedIndirect); - setIT(0x91, (uintptr_t)&fSTA, eIndirectIndexed); - // fSTX(Addressing, address); - setIT(0x86, (uintptr_t)&fSTX, eZeroPage); - setIT(0x96, (uintptr_t)&fSTX, eZeroPageIndexedX); - setIT(0x8E, (uintptr_t)&fSTX, eAbsolute); - // fSTY(Addressing, address); - setIT(0x84, (uintptr_t)&fSTY, eZeroPage); - setIT(0x94, (uintptr_t)&fSTY, eZeroPageIndexedY); - setIT(0x8C, (uintptr_t)&fSTY, eAbsolute); - - // Arithmetic Instructions - // fADC(Addressing, address); - setIT(0x69, (uintptr_t)&fADC, eImmediate); - setIT(0x65, (uintptr_t)&fADC, eZeroPage); - setIT(0x75, (uintptr_t)&fADC, eZeroPageIndexedX); - setIT(0x6D, (uintptr_t)&fADC, eAbsolute); - setIT(0x7D, (uintptr_t)&fADC, eAbsoluteIndexedX); - setIT(0x79, (uintptr_t)&fADC, eAbsoluteIndexedY); - setIT(0x61, (uintptr_t)&fADC, eIndexedIndirect); - setIT(0x71, (uintptr_t)&fADC, eIndirectIndexed); - // fSBC(Addressing, address); - setIT(0xE9, (uintptr_t)&fSBC, eImmediate); - setIT(0xE5, (uintptr_t)&fSBC, eZeroPage); - setIT(0xF5, (uintptr_t)&fSBC, eZeroPageIndexedX); - setIT(0xED, (uintptr_t)&fSBC, eAbsolute); - setIT(0xFD, (uintptr_t)&fSBC, eAbsoluteIndexedX); - setIT(0xF9, (uintptr_t)&fSBC, eAbsoluteIndexedY); - setIT(0xE1, (uintptr_t)&fSBC, eIndexedIndirect); - setIT(0xF1, (uintptr_t)&fSBC, eIndirectIndexed); - - //Increment and Decrement Instructions - //INC(Addressing, address); - setIT(0xE6, (uintptr_t)&fINC, eZeroPage); - setIT(0xF6, (uintptr_t)&fINC, eZeroPageIndexedX); - setIT(0xEE, (uintptr_t)&fINC, eAbsolute); - setIT(0xFE, (uintptr_t)&fINC, eAbsoluteIndexedX); - //INX(Addressing, address); - setIT(0xE8, (uintptr_t)&fINX, eImplied); - //INY(Addressing, address); - setIT(0xC8, (uintptr_t)&fINY, eImplied); - //DEC(Addressing, address); - setIT(0xC6, (uintptr_t)&fDEC, eZeroPage); - setIT(0xD6, (uintptr_t)&fDEC, eZeroPageIndexedX); - setIT(0xCE, (uintptr_t)&fDEC, eAbsolute); - setIT(0xDE, (uintptr_t)&fDEC, eAbsoluteIndexedX); - //DEX(Addressing, address); - setIT(0xCA, (uintptr_t)&fDEX, eImplied); - //DEY(Addressing, address); - setIT(0x88, (uintptr_t)&fDEY, eImplied); - - // Logical Instructions - //AND(Addressing, address); - setIT(0x29, (uintptr_t)&fAND, eImmediate); - setIT(0x25, (uintptr_t)&fAND, eZeroPage); - setIT(0x35, (uintptr_t)&fAND, eZeroPageIndexedX); - setIT(0x2D, (uintptr_t)&fAND, eAbsolute); - setIT(0x3D, (uintptr_t)&fAND, eAbsoluteIndexedX); - setIT(0x39, (uintptr_t)&fAND, eAbsoluteIndexedY); - setIT(0x21, (uintptr_t)&fAND, eIndexedIndirect); - setIT(0x31, (uintptr_t)&fAND, eIndirectIndexed); - //ORA(Addressing, address); - setIT(0x09, (uintptr_t)&fORA, eImmediate); - setIT(0x05, (uintptr_t)&fORA, eZeroPage); - setIT(0x15, (uintptr_t)&fORA, eZeroPageIndexedX); - setIT(0x0D, (uintptr_t)&fORA, eAbsolute); - setIT(0x1D, (uintptr_t)&fORA, eAbsoluteIndexedX); - setIT(0x19, (uintptr_t)&fORA, eAbsoluteIndexedY); - setIT(0x01, (uintptr_t)&fORA, eIndexedIndirect); - setIT(0x11, (uintptr_t)&fORA, eIndirectIndexed); - //EOR(Addressing, address); - setIT(0x49, (uintptr_t)&fEOR, eImmediate); - setIT(0x45, (uintptr_t)&fEOR, eZeroPage); - setIT(0x55, (uintptr_t)&fEOR, eZeroPageIndexedX); - setIT(0x4D, (uintptr_t)&fEOR, eAbsolute); - setIT(0x5D, (uintptr_t)&fEOR, eAbsoluteIndexedX); - setIT(0x59, (uintptr_t)&fEOR, eAbsoluteIndexedY); - setIT(0x41, (uintptr_t)&fEOR, eIndexedIndirect); - setIT(0x51, (uintptr_t)&fEOR, eIndirectIndexed); - - // Jump, Branch, Compare, and Test Bits - //JMP(Addressing, address); - setIT(0x4C, (uintptr_t)&fJMP, eAbsolute); - setIT(0x6C, (uintptr_t)&fJMP, eIndirectAbsolute); - //BCC(Addressing, address); - setIT(0x90, (uintptr_t)&fBCC, eRelative); - //BCS(Addressing, address); - setIT(0xB0, (uintptr_t)&fBCS, eRelative); - //BEQ(Addressing, address); - setIT(0xF0, (uintptr_t)&fBEQ, eRelative); - //BNE(Addressing, address); - setIT(0xD0, (uintptr_t)&fBNE, eRelative); - //BMI(Addressing, address); - setIT(0x30, (uintptr_t)&fBMI, eRelative); - //BPL(Addressing, address); - setIT(0x10, (uintptr_t)&fBPL, eRelative); - //BVS(Addressing, address); - setIT(0x70, (uintptr_t)&fBVS, eRelative); - //BVC(Addressing, address); - setIT(0x50, (uintptr_t)&fBVC, eRelative); - //CMP(Addressing, address); - setIT(0xC9, (uintptr_t)&fCMP, eImmediate); - setIT(0xC5, (uintptr_t)&fCMP, eZeroPage); - setIT(0xD5, (uintptr_t)&fCMP, eZeroPageIndexedX); - setIT(0xCD, (uintptr_t)&fCMP, eAbsolute); - setIT(0xDD, (uintptr_t)&fCMP, eAbsoluteIndexedX); - setIT(0xD9, (uintptr_t)&fCMP, eAbsoluteIndexedY); - setIT(0xC1, (uintptr_t)&fCMP, eIndexedIndirect); - setIT(0xD1, (uintptr_t)&fCMP, eIndirectIndexed); - //CPX(Addressing, address); - setIT(0xE0, (uintptr_t)&fCPX, eImmediate); - setIT(0xE4, (uintptr_t)&fCPX, eZeroPage); - setIT(0xEC, (uintptr_t)&fCPX, eAbsolute); - //CPY(Addressing, address); - setIT(0xC0, (uintptr_t)&fCPY, eImmediate); - setIT(0xC4, (uintptr_t)&fCPY, eZeroPage); - setIT(0xCC, (uintptr_t)&fCPY, eAbsolute); - //BIT(Addressing, address); - setIT(0x4C, (uintptr_t)&fBIT, eZeroPage); - setIT(0x6C, (uintptr_t)&fBIT, eAbsolute); - - // Shift and Rotate Instructions - //ASL(Addressing, address); - setIT(0x0A, (uintptr_t)&fASL, eAccumulator); - setIT(0x06, (uintptr_t)&fASL, eZeroPage); - setIT(0x16, (uintptr_t)&fASL, eZeroPageIndexedX); - setIT(0x0E, (uintptr_t)&fASL, eAbsolute); - setIT(0x1E, (uintptr_t)&fASL, eAbsoluteIndexedX); - //LSR(Addressing, address); - setIT(0x4A, (uintptr_t)&fLSR, eAccumulator); - setIT(0x46, (uintptr_t)&fLSR, eZeroPage); - setIT(0x56, (uintptr_t)&fLSR, eZeroPageIndexedX); - setIT(0x4E, (uintptr_t)&fLSR, eAbsolute); - setIT(0x5E, (uintptr_t)&fLSR, eAbsoluteIndexedX); - //ROL(Addressing, address); - setIT(0x2A, (uintptr_t)&fROL, eAccumulator); - setIT(0x26, (uintptr_t)&fROL, eZeroPage); - setIT(0x36, (uintptr_t)&fROL, eZeroPageIndexedX); - setIT(0x2E, (uintptr_t)&fROL, eAbsolute); - setIT(0x3E, (uintptr_t)&fROL, eAbsoluteIndexedX); - //ROR(Addressing, address); - setIT(0x6A, (uintptr_t)&fROR, eAccumulator); - setIT(0x66, (uintptr_t)&fROR, eZeroPage); - setIT(0x76, (uintptr_t)&fROR, eZeroPageIndexedX); - setIT(0x6E, (uintptr_t)&fROR, eAbsolute); - setIT(0x7E, (uintptr_t)&fROR, eAbsoluteIndexedX); - - // Transfer Instructions - //TAX(Addressing, address); - setIT(0xAA, (uintptr_t)&fTAX, eImplied); - //TAY(Addressing, address); - setIT(0xA8, (uintptr_t)&fTAY, eImplied); - //TXA(Addressing, address); - setIT(0x8A, (uintptr_t)&fTXA, eImplied); - //TYA(Addressing, address); - setIT(0x98, (uintptr_t)&fTYA, eImplied); - - // Stack Instructions - //TSX(Addressing, address); - setIT(0xBA, (uintptr_t)&fTSX, eImplied); - //TXS(Addressing, address); - setIT(0x9A, (uintptr_t)&fTXS, eImplied); - //PHA(Addressing, address); - setIT(0x48, (uintptr_t)&fPHA, eImplied); - //PHP(Addressing, address); - setIT(0x08, (uintptr_t)&fPHP, eImplied); - //PLA(Addressing, address); - setIT(0x68, (uintptr_t)&fPLA, eImplied); - //PLP(Addressing, address); - setIT(0x28, (uintptr_t)&fPLP, eImplied); - - // Subroutine Instructions - //JSR(Addressing, address); - setIT(0x20, (uintptr_t)&fJSR, eAbsolute); - //RTS(Addressing, address); - setIT(0x60, (uintptr_t)&fRTS, eImplied); - //RTI(Addressing, address); - setIT(0x40, (uintptr_t)&fRTI, eImplied); - // Set/Reset Insutrctions - //CLC(Addressing, address); - setIT(0x18, (uintptr_t)&fCLC, eImplied); - //CLD(Addressing, address); - setIT(0xD8, (uintptr_t)&fCLD, eImplied); - //CLI(Addressing, address); - setIT(0x58, (uintptr_t)&fCLI, eImplied); - //CLV(Addressing, address); - setIT(0xB8, (uintptr_t)&fCLV, eImplied); - //SEC(Addressing, address); - setIT(0x38, (uintptr_t)&fSEC, eImplied); - //SED(Addressing, address); - setIT(0xF8, (uintptr_t)&fSED, eImplied); - //SEI(Addressing, address); - setIT(0x78, (uintptr_t)&fSEI, eImplied); - // NOP/BRK Instructions - //NOP(Addressing, address); - setIT(0xEA, (uintptr_t)&fNOP, eImplied); - //BRK(Addressing, address); - setIT(0x00, (uintptr_t)&fBRK, eImplied); -}
\ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..41cddbc --- /dev/null +++ b/makefile @@ -0,0 +1,3 @@ +main: + gcc instruction-bin.c -o instruction-dump + gcc test.c -o main |