Gopher2600/hardware/cpu/definitions.csv
steve 4c530bf7a7 o initial commit
- 6502 implementation is basically correct but does not handle
        - interrupts
        - pre-fetch cycle
        - anything less fine grained than instruction stepping
      - memory sub-system sketched in

    o retroactive adding of GPL copyright notice
2020-01-05 18:58:12 +00:00

7.3 KiB

1# instructions are defined with the following fields:
2#
3# opcode, mnemonic, cycles, addressing mode, page sensitivity, [effect category]
4#
5#
6# effect category can be one of three types (READ is the default if no effect category is given)
7#
8# 1. READ (instruction only reads from memory - or not at all in the case of IMPLIED instructions
9# 2. WRITE (instruction changes memory)
10# 3. RMW (instruction reads, modifies and writes to memory)
11# 4. FLOW (instruction explicitely affects the program counter)
12# 5. SUB-ROUTINE (like FLOW but also writes to the stack)
13#
14# in the 6502 all instructions are considered to read from memory, even register only
15# instructions (the IMPLIED addressing mode). in the hardware, this meant that the chip could forego
16# on manufacturing costs.
17#
18# only some instructions however, ever *write* to memory. in the 6502 this is accomplished with a
19# as well as read. in our emulation, we mark the instructions that write to memory by specifying
20# the WRITE effect category
21#
22# a small class of instructions read AND write to memory (using the same address), these
23# are the RMW class of instructions.
24#
25#
26# note that the addressing mode /implies/ the number of bytes each instruction requires:
27# (including the 1 byte required for the opcode)
28#
29# IMPLIED = 1
30# IMMEDIATE = 2
31# ZERO PAGE = 2
32# all others = 3
33#
34# TODO: maybe the number of cycles can be inferred in a similar way
35# no operation
360xea, NOP, 2, IMPLIED, False
370x04, NOP, 3, ZERO_PAGE, False
38# status flags
390x58, CLI, 2, IMPLIED, False
400x78, SEI, 2, IMPLIED, False
410x18, CLC, 2, IMPLIED, False
420x38, SEC, 2, IMPLIED, False
430xd8, CLD, 2, IMPLIED, False
440xf8, SED, 2, IMPLIED, False
450xb8, CLV, 2, IMPLIED, False
46# stack
470x48, PHA, 2, IMPLIED, False, WRITE
480x68, PLA, 3, IMPLIED, False
490x08, PHP, 2, IMPLIED, False, WRITE
500x28, PLP, 3, IMPLIED, False
51# register transfer
520x8a, TXA, 2, IMPLIED, False
530xaa, TAX, 2, IMPLIED, False
540xa8, TAY, 2, IMPLIED, False
550x98, TYA, 2, IMPLIED, False
560xba, TSX, 2, IMPLIED, False
570x9a, TXS, 2, IMPLIED, False
58# bitwise operations
590x49, EOR, 2, IMMEDIATE, False
600x45, EOR, 3, ZERO_PAGE, False
610x55, EOR, 4, INDEXED_ZERO_PAGE_X, False
620x4d, EOR, 4, ABSOLUTE, False
630x5d, EOR, 4, ABSOLUTE_INDEXED_X, True
640x59, EOR, 4, ABSOLUTE_INDEXED_Y, True
650x41, EOR, 6, PRE_INDEX_INDIRECT, False
660x51, EOR, 5, POST_INDEX_INDIRECT, True
670x09, ORA, 2, IMMEDIATE, False
680x05, ORA, 3, ZERO_PAGE, False
690x15, ORA, 4, INDEXED_ZERO_PAGE_X, False
700x0d, ORA, 4, ABSOLUTE, False
710x1d, ORA, 4, ABSOLUTE_INDEXED_X, True
720x10, ORA, 4, ABSOLUTE_INDEXED_Y, True
730x01, ORA, 6, PRE_INDEX_INDIRECT, False
740x11, ORA, 5, POST_INDEX_INDIRECT, True
750x29, AND, 2, IMMEDIATE, False
760x25, AND, 3, ZERO_PAGE, False
770x35, AND, 4, INDEXED_ZERO_PAGE_X, False
780x2d, AND, 4, ABSOLUTE, False
790x3d, AND, 4, ABSOLUTE_INDEXED_X, True
800x39, AND, 4, ABSOLUTE_INDEXED_Y, True
810x21, AND, 6, PRE_INDEX_INDIRECT, False
820x31, AND, 5, POST_INDEX_INDIRECT, True
83# load register
840xa9, LDA, 2, IMMEDIATE, False
850xa5, LDA, 3, ZERO_PAGE, False
860xb5, LDA, 4, INDEXED_ZERO_PAGE_X, False
870xad, LDA, 4, ABSOLUTE, False
880xbd, LDA, 4, ABSOLUTE_INDEXED_X, True
890xb9, LDA, 4, ABSOLUTE_INDEXED_Y, True
900xa1, LDA, 6, PRE_INDEX_INDIRECT, False
910xb1, LDA, 5, POST_INDEX_INDIRECT, True
920xa2, LDX, 2, IMMEDIATE, False
930xa6, LDX, 3, ZERO_PAGE, False
940xb6, LDX, 4, INDEXED_ZERO_PAGE_Y, False
950xae, LDX, 4, ABSOLUTE, False
960xbe, LDX, 4, ABSOLUTE_INDEXED_Y, True
970xa0, LDY, 2, IMMEDIATE, False
980xa4, LDY, 3, ZERO_PAGE, False
990xb4, LDY, 4, INDEXED_ZERO_PAGE_X, False
1000xac, LDY, 4, ABSOLUTE, False
1010xbc, LDY, 4, ABSOLUTE_INDEXED_X, True
102# register operations
1030xe8, INX, 2, IMPLIED, False
1040xc8, INY, 2, IMPLIED, False
1050xca, DEX, 2, IMPLIED, False
1060x88, DEY, 2, IMPLIED, False
1070x0a, ASL, 2, IMPLIED, False
1080x06, ASL, 5, ZERO_PAGE, False
1090x16, ASL, 6, INDEXED_ZERO_PAGE_X, False
1100x0e, ASL, 6, ABSOLUTE, False
1110x1e, ASL, 7, ABSOLUTE_INDEXED_X, False
1120x4a, LSR, 2, IMPLIED, False
1130x46, LSR, 5, ZERO_PAGE, False
1140x56, LSR, 6, INDEXED_ZERO_PAGE_X, False
1150x4e, LSR, 6, ABSOLUTE, False
1160x5e, LSR, 7, ABSOLUTE_INDEXED_X, False
1170x69, ADC, 2, IMMEDIATE, False
1180x65, ADC, 3, ZERO_PAGE, False
1190x75, ADC, 4, INDEXED_ZERO_PAGE_X, False
1200x6d, ADC, 4, ABSOLUTE, False
1210x7d, ADC, 4, ABSOLUTE_INDEXED_X, True
1220x79, ADC, 4, ABSOLUTE_INDEXED_Y, True
1230x61, ADC, 6, PRE_INDEX_INDIRECT, False
1240x71, ADC, 5, POST_INDEX_INDIRECT, True
1250xe9, SBC, 2, IMMEDIATE, False
1260xe5, SBC, 3, ZERO_PAGE, False
1270xf5, SBC, 4, INDEXED_ZERO_PAGE_X, False
1280xed, SBC, 4, ABSOLUTE, False
1290xfd, SBC, 4, ABSOLUTE_INDEXED_X, True
1300xf9, SBC, 4, ABSOLUTE_INDEXED_Y, True
1310xe1, SBC, 6, PRE_INDEX_INDIRECT, False
1320xf1, SBC, 5, POST_INDEX_INDIRECT, True
1330x6a, ROR, 2, IMPLIED, False
1340x66, ROR, 5, ZERO_PAGE, False
1350x76, ROR, 6, INDEXED_ZERO_PAGE_X, False
1360x6e, ROR, 6, ABSOLUTE, False
1370x7e, ROR, 7, ABSOLUTE_INDEXED_X, False
1380x2a, ROL, 2, IMPLIED, False
1390x26, ROL, 5, ZERO_PAGE, False
1400x36, ROL, 6, INDEXED_ZERO_PAGE_X, False
1410x2e, ROL, 6, ABSOLUTE, False
1420x3e, ROL, 7, ABSOLUTE_INDEXED_X, False
143# compare instructions
1440xc9, CMP, 3, IMMEDIATE, False
1450xc5, CMP, 3, ZERO_PAGE, False
1460xd5, CMP, 4, INDEXED_ZERO_PAGE_X, False
1470xcd, CMP, 4, ABSOLUTE, False
1480xdd, CMP, 4, ABSOLUTE_INDEXED_X, True
1490xd9, CMP, 4, ABSOLUTE_INDEXED_Y, True
1500xc1, CMP, 6, PRE_INDEX_INDIRECT, False
1510xd1, CMP, 5, POST_INDEX_INDIRECT, True
1520xe0, CPX, 2, IMMEDIATE, False
1530xe4, CPX, 3, ZERO_PAGE, False
1540xec, CPX, 4, ABSOLUTE, False
1550xc0, CPY, 2, IMMEDIATE, False
1560xc4, CPY, 3, ZERO_PAGE, False
1570xcc, CPY, 4, ABSOLUTE, False
1580x24, BIT, 3, ZERO_PAGE, False
1590x2c, BIT, 4, ABSOLUTE, False
160# store register
1610x85, STA, 3, ZERO_PAGE, False, WRITE
1620x95, STA, 4, INDEXED_ZERO_PAGE_X, False, WRITE
1630x8d, STA, 4, ABSOLUTE, False, WRITE
1640x9d, STA, 5, ABSOLUTE_INDEXED_X, False, WRITE
1650x99, STA, 5, ABSOLUTE_INDEXED_Y, False, WRITE
1660x81, STA, 6, PRE_INDEX_INDIRECT, False, WRITE
1670x91, STA, 6, POST_INDEX_INDIRECT, False, WRITE
1680x86, STX, 3, ZERO_PAGE, False, WRITE
1690x96, STX, 4, INDEXED_ZERO_PAGE_Y, False, WRITE
1700x8e, STX, 4, ABSOLUTE, False, WRITE
1710x84, STY, 3, ZERO_PAGE, False, WRITE
1720x94, STY, 4, INDEXED_ZERO_PAGE_X, False, WRITE
1730x8c, STY, 4, ABSOLUTE, False, WRITE
174# memory instructions
1750xe6, INC, 5, ZERO_PAGE, False, RMW
1760xf6, INC, 6, INDEXED_ZERO_PAGE_X, False, RMW
1770xee, INC, 6, ABSOLUTE, False, RMW
1780xfe, INC, 7, ABSOLUTE_INDEXED_X, False, RMW
1790xc6, DEC, 5, ZERO_PAGE, False, RMW
1800xd6, DEC, 6, INDEXED_ZERO_PAGE_X, False, RMW
1810xce, DEC, 6, ABSOLUTE, False, RMW
1820xde, DEC, 7, ABSOLUTE_INDEXED_X, False, RMW
183# flow control
1840x4c, JMP, 3, ABSOLUTE, False, FLOW
1850x6c, JMP, 5, INDIRECT, False, FLOW
186# flow control (branch instructions) -- machine cycles count column is the fail count
187# ie. when the branch condition isfalse and the PC allowed to advance as normal. if the
188# branch succeeds then the PC is adjusted, taking an additional cycle.
1890x90, BCC, 2, RELATIVE, False, FLOW
1900xb0, BCS, 2, RELATIVE, False, FLOW
1910xf0, BEQ, 2, RELATIVE, False, FLOW
1920x30, BMI, 2, RELATIVE, False, FLOW
1930xd0, BNE, 2, RELATIVE, False, FLOW
1940x10, BPL, 2, RELATIVE, False, FLOW
1950x50, BVC, 2, RELATIVE, False, FLOW
1960x70, BVS, 2, RELATIVE, False, FLOW
1970x20, JSR, 2, ABSOLUTE, False, SUB-ROUTINE
1980x60, RTS, 3, IMPLIED, False, SUB-ROUTINE
199# interrupts
2000x00, BRK, 7, IMPLIED, False, WRITE
2010x40, RTI, 6, IMPLIED, False