diff options
Diffstat (limited to 'cpu/opcodes.go')
| -rw-r--r-- | cpu/opcodes.go | 91 |
1 files changed, 88 insertions, 3 deletions
diff --git a/cpu/opcodes.go b/cpu/opcodes.go index 13f9612..ea6e1b9 100644 --- a/cpu/opcodes.go +++ b/cpu/opcodes.go @@ -28,6 +28,7 @@ func init() { } } + // load accumulator def(0xA9, "LDA", ModeImmediate, 2, false, ldaExec) def(0xA5, "LDA", ModeZeroPage, 3, false, ldaExec) def(0xB5, "LDA", ModeZeroPageX, 4, false, ldaExec) @@ -37,18 +38,21 @@ func init() { def(0xA1, "LDA", ModeIndirectX, 6, false, ldaExec) def(0xB1, "LDA", ModeIndirectY, 5, true, ldaExec) + // load X def(0xA2, "LDX", ModeImmediate, 2, false, ldxExec) def(0xA6, "LDX", ModeZeroPage, 3, false, ldxExec) def(0xB6, "LDX", ModeZeroPageY, 4, false, ldxExec) def(0xAE, "LDX", ModeAbsolute, 4, false, ldxExec) def(0xBE, "LDX", ModeAbsoluteY, 4, true, ldxExec) + // load Y def(0xA0, "LDY", ModeImmediate, 2, false, ldyExec) def(0xA4, "LDY", ModeZeroPage, 3, false, ldyExec) def(0xB4, "LDY", ModeZeroPageX, 4, false, ldyExec) def(0xAC, "LDY", ModeAbsolute, 4, false, ldyExec) def(0xBC, "LDY", ModeAbsoluteX, 4, true, ldyExec) + // store accumulator def(0x85, "STA", ModeZeroPage, 3, false, staExec) def(0x95, "STA", ModeZeroPageX, 4, false, staExec) def(0x8D, "STA", ModeAbsolute, 4, false, staExec) @@ -57,26 +61,48 @@ func init() { def(0x81, "STA", ModeIndirectX, 6, false, staExec) def(0x91, "STA", ModeIndirectY, 6, false, staExec) + // store X def(0x86, "STX", ModeZeroPage, 3, false, stxExec) def(0x96, "STX", ModeZeroPageY, 4, false, stxExec) def(0x8E, "STX", ModeAbsolute, 4, false, stxExec) + // store Y def(0x84, "STY", ModeZeroPage, 3, false, styExec) def(0x94, "STY", ModeZeroPageX, 4, false, styExec) def(0x8C, "STY", ModeAbsolute, 4, false, styExec) + // transfer accumulator to X def(0xAA, "TAX", ModeImplied, 2, false, taxExec) + + // transfer x to accumulator def(0x8A, "TXA", ModeImplied, 2, false, txaExec) + + // transfer accumulator to Y def(0xA8, "TAY", ModeImplied, 2, false, tayExec) + + // transfer y to accumulator def(0x98, "TYA", ModeImplied, 2, false, tyaExec) + + // transfer stack pointer to x def(0xBA, "TSX", ModeImplied, 2, false, tsxExec) + + // transfer x to stack pointer def(0x9A, "TXS", ModeImplied, 2, false, txsExec) + // push accumulator def(0x48, "PHA", ModeImplied, 3, false, phaExec) + + // pull accumulator def(0x68, "PLA", ModeImplied, 4, false, plaExec) + + // originally personal homepage, now PHP: Hypertext Preprocessor + // totally not push processor status (SR) def(0x08, "PHP", ModeImplied, 3, false, phpExec) + + // pull processor status (SR) def(0x28, "PLP", ModeImplied, 4, false, plpExec) + // add with carry def(0x69, "ADC", ModeImmediate, 2, false, adcExec) def(0x65, "ADC", ModeZeroPage, 3, false, adcExec) def(0x75, "ADC", ModeZeroPageX, 4, false, adcExec) @@ -86,7 +112,9 @@ func init() { def(0x61, "ADC", ModeIndirectX, 6, false, adcExec) def(0x71, "ADC", ModeIndirectY, 5, true, adcExec) + // subtract with carry def(0xE9, "SBC", ModeImmediate, 2, false, sbcExec) + def(0xEB, "SBC", ModeImmediate, 2, false, sbcExec) def(0xE5, "SBC", ModeZeroPage, 3, false, sbcExec) def(0xF5, "SBC", ModeZeroPageX, 4, false, sbcExec) def(0xED, "SBC", ModeAbsolute, 4, false, sbcExec) @@ -95,6 +123,7 @@ func init() { def(0xE1, "SBC", ModeIndirectX, 6, false, sbcExec) def(0xF1, "SBC", ModeIndirectY, 5, true, sbcExec) + // and (with accumulator) def(0x29, "AND", ModeImmediate, 2, false, andExec) def(0x25, "AND", ModeZeroPage, 3, false, andExec) def(0x35, "AND", ModeZeroPageX, 4, false, andExec) @@ -104,6 +133,7 @@ func init() { def(0x21, "AND", ModeIndirectX, 6, false, andExec) def(0x31, "AND", ModeIndirectY, 5, true, andExec) + // or with accumulator def(0x09, "ORA", ModeImmediate, 2, false, oraExec) def(0x05, "ORA", ModeZeroPage, 3, false, oraExec) def(0x15, "ORA", ModeZeroPageX, 4, false, oraExec) @@ -113,6 +143,7 @@ func init() { def(0x01, "ORA", ModeIndirectX, 6, false, oraExec) def(0x11, "ORA", ModeIndirectY, 5, true, oraExec) + // exclusive or (with accumulator) def(0x49, "EOR", ModeImmediate, 2, false, eorExec) def(0x45, "EOR", ModeZeroPage, 3, false, eorExec) def(0x55, "EOR", ModeZeroPageX, 4, false, eorExec) @@ -122,48 +153,63 @@ func init() { def(0x41, "EOR", ModeIndirectX, 6, false, eorExec) def(0x51, "EOR", ModeIndirectY, 5, true, eorExec) + // bit test def(0x24, "BIT", ModeZeroPage, 3, false, bitExec) def(0x2C, "BIT", ModeAbsolute, 4, false, bitExec) + // arithmetic shift left def(0x0A, "ASL", ModeAccumulator, 2, false, aslExec) def(0x06, "ASL", ModeZeroPage, 5, false, aslExec) def(0x16, "ASL", ModeZeroPageX, 6, false, aslExec) def(0x0E, "ASL", ModeAbsolute, 6, false, aslExec) def(0x1E, "ASL", ModeAbsoluteX, 7, false, aslExec) + // logical shift right def(0x4A, "LSR", ModeAccumulator, 2, false, lsrExec) def(0x46, "LSR", ModeZeroPage, 5, false, lsrExec) def(0x56, "LSR", ModeZeroPageX, 6, false, lsrExec) def(0x4E, "LSR", ModeAbsolute, 6, false, lsrExec) def(0x5E, "LSR", ModeAbsoluteX, 7, false, lsrExec) + // rotate left def(0x2A, "ROL", ModeAccumulator, 2, false, rolExec) def(0x26, "ROL", ModeZeroPage, 5, false, rolExec) def(0x36, "ROL", ModeZeroPageX, 6, false, rolExec) def(0x2E, "ROL", ModeAbsolute, 6, false, rolExec) def(0x3E, "ROL", ModeAbsoluteX, 7, false, rolExec) + // rotate right def(0x6A, "ROR", ModeAccumulator, 2, false, rorExec) def(0x66, "ROR", ModeZeroPage, 5, false, rorExec) def(0x76, "ROR", ModeZeroPageX, 6, false, rorExec) def(0x6E, "ROR", ModeAbsolute, 6, false, rorExec) def(0x7E, "ROR", ModeAbsoluteX, 7, false, rorExec) + // increment def(0xE6, "INC", ModeZeroPage, 5, false, incExec) def(0xF6, "INC", ModeZeroPageX, 6, false, incExec) def(0xEE, "INC", ModeAbsolute, 6, false, incExec) def(0xFE, "INC", ModeAbsoluteX, 7, false, incExec) + // decrement def(0xC6, "DEC", ModeZeroPage, 5, false, decExec) def(0xD6, "DEC", ModeZeroPageX, 6, false, decExec) def(0xCE, "DEC", ModeAbsolute, 6, false, decExec) def(0xDE, "DEC", ModeAbsoluteX, 7, false, decExec) + // increment x def(0xE8, "INX", ModeImplied, 2, false, inxExec) + + // decrement x def(0xCA, "DEX", ModeImplied, 2, false, dexExec) + + // increment y def(0xC8, "INY", ModeImplied, 2, false, inyExec) + + // decrement y def(0x88, "DEY", ModeImplied, 2, false, deyExec) + // compare (with accumulator) def(0xC9, "CMP", ModeImmediate, 2, false, cmpExec) def(0xC5, "CMP", ModeZeroPage, 3, false, cmpExec) def(0xD5, "CMP", ModeZeroPageX, 4, false, cmpExec) @@ -173,40 +219,79 @@ func init() { def(0xC1, "CMP", ModeIndirectX, 6, false, cmpExec) def(0xD1, "CMP", ModeIndirectY, 5, true, cmpExec) + // compare with X def(0xE0, "CPX", ModeImmediate, 2, false, cpxExec) def(0xE4, "CPX", ModeZeroPage, 3, false, cpxExec) def(0xEC, "CPX", ModeAbsolute, 4, false, cpxExec) + // compare with y def(0xC0, "CPY", ModeImmediate, 2, false, cpyExec) def(0xC4, "CPY", ModeZeroPage, 3, false, cpyExec) def(0xCC, "CPY", ModeAbsolute, 4, false, cpyExec) + // branch on carry clear def(0x90, "BCC", ModeRelative, 2, false, bccExec) + + // branch on carry set def(0xB0, "BCS", ModeRelative, 2, false, bcsExec) + + // branch on not equal (zero clear) def(0xD0, "BNE", ModeRelative, 2, false, bneExec) + + // branch on equal (zero set) def(0xF0, "BEQ", ModeRelative, 2, false, beqExec) + + // branch on plus (negative clear) def(0x10, "BPL", ModeRelative, 2, false, bplExec) + + // branch on minus (negative set) def(0x30, "BMI", ModeRelative, 2, false, bmiExec) + + // branch on overflow clear def(0x50, "BVC", ModeRelative, 2, false, bvcExec) + + // branch on overflow set def(0x70, "BVS", ModeRelative, 2, false, bvsExec) + // jump def(0x4C, "JMP", ModeAbsolute, 3, false, jmpExec) def(0x6C, "JMP", ModeIndirect, 5, false, jmpExec) + + // jump subroutine def(0x20, "JSR", ModeAbsolute, 6, false, jsrExec) + + // return from subroutine def(0x60, "RTS", ModeImplied, 6, false, rtsExec) + + // return from interrupt def(0x40, "RTI", ModeImplied, 6, false, rtiExec) + // clear carry def(0x18, "CLC", ModeImplied, 2, false, clcExec) + + // set carry def(0x38, "SEC", ModeImplied, 2, false, secExec) + + // clear interrupt disable def(0x58, "CLI", ModeImplied, 2, false, cliExec) + + // set interrupt disable def(0x78, "SEI", ModeImplied, 2, false, seiExec) + + // clear decimal def(0xD8, "CLD", ModeImplied, 2, false, cldExec) + + // set decimal def(0xF8, "SED", ModeImplied, 2, false, sedExec) + + // clear overflow def(0xB8, "CLV", ModeImplied, 2, false, clvExec) - def(0xEA, "NOP", ModeImplied, 2, false, nopExec) + // break / interrupt def(0x00, "BRK", ModeImplied, 7, false, brkExec) + // no operation + def(0xEA, "NOP", ModeImplied, 2, false, nopExec) def(0x1A, "NOP", ModeImplied, 2, false, nopExec) def(0x3A, "NOP", ModeImplied, 2, false, nopExec) def(0x5A, "NOP", ModeImplied, 2, false, nopExec) @@ -235,6 +320,7 @@ func init() { def(0xDC, "NOP", ModeAbsoluteX, 4, true, nopExec) def(0xFC, "NOP", ModeAbsoluteX, 4, true, nopExec) + // JAM is sometimes also referred to as HLT or KIL def(0x02, "JAM", ModeImplied, 2, false, jamExec) def(0x12, "JAM", ModeImplied, 2, false, jamExec) def(0x22, "JAM", ModeImplied, 2, false, jamExec) @@ -248,8 +334,7 @@ func init() { def(0xD2, "JAM", ModeImplied, 2, false, jamExec) def(0xF2, "JAM", ModeImplied, 2, false, jamExec) - def(0xEB, "SBC", ModeImmediate, 2, false, sbcExec) - + // illegal / undocumented instructions def(0xA7, "LAX", ModeZeroPage, 3, false, laxExec) def(0xB7, "LAX", ModeZeroPageY, 4, false, laxExec) def(0xAF, "LAX", ModeAbsolute, 4, false, laxExec) |