Karnaugh Maps are used in v6502's CPU design to optimize and reduce large switch statements, which result in large jump tables, to a small number of bitwise operations. These all also have unit tests to make sure that the K-map reduction is sane. These maps make the hardware design decisions of the MOS 6502 microprocessor very quickly visually apparrent in a way that is easy to reduce based on goal. For example, it is obvious that the length of an instruction only relies on the high nibble if the low nibble is 0 or 9. This reduces what would otherwise be a giant switch statement to a few conditionals.
A tool called kmapgen is included in the project, which generates these K-maps colorized for different goals. It's output can be seen below.
Standard Opcode Table
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
00 | brk imp | ora X,ind | ??? --- | ??? --- | ??? zpg | ora zpg | asl zpg | ??? --- | php imp | ora # | asl A | ??? A | ??? abs | ora abs | asl abs | ??? abs |
10 | bpl rel | ora ind,Y | ??? --- | ??? --- | ??? zpg,X | ora zpg,X | asl zpg,X | ??? --- | clc imp | ora abs,Y | ??? A | ??? A | ??? abs,X | ora abs,X | asl abs,X | ??? abs,X |
20 | jsr abs | and X,ind | ??? --- | ??? --- | bit zpg | and zpg | rol zpg | ??? --- | plp imp | and # | rol A | ??? A | bit abs | and abs | rol abs | ??? abs |
30 | bmi rel | and ind,Y | ??? --- | ??? --- | ??? zpg,X | and zpg,X | rol zpg,X | ??? --- | sec imp | and abs,Y | ??? A | ??? A | ??? abs,X | and abs,X | rol abs,X | ??? abs,X |
40 | rti imp | eor X,ind | ??? --- | ??? --- | ??? zpg | eor zpg | lsr zpg | ??? --- | pha imp | eor # | lsr A | ??? A | jmp abs | eor abs | lsr abs | ??? abs |
50 | bvc rel | eor ind,Y | ??? --- | ??? --- | ??? zpg,X | eor zpg,X | lsr zpg,X | ??? --- | cli imp | eor abs,Y | ??? A | ??? A | ??? abs,X | eor abs,X | lsr abs,X | ??? abs,X |
60 | rts imp | adc X,ind | ??? --- | ??? --- | ??? zpg | adc zpg | ror zpg | ??? --- | pla imp | adc # | ror A | ??? A | jmp ind | adc abs | ror abs | ??? abs |
70 | bvs rel | adc ind,Y | ??? --- | ??? --- | ??? zpg,X | adc zpg,X | ror zpg,X | ??? --- | sei imp | adc abs,Y | ??? A | ??? A | ??? abs,X | adc abs,X | ror abs,X | ??? abs,X |
80 | ??? # | sta X,ind | ??? --- | ??? --- | sty zpg | sta zpg | stx zpg | ??? --- | dey imp | ??? # | txa imp | ??? imp | sty abs | sta abs | stx abs | ??? abs |
90 | bcc rel | sta ind,Y | ??? --- | ??? --- | sty zpg,X | sta zpg,X | stx zpg,Y | ??? --- | tya imp | sta abs,Y | txs imp | ??? imp | ??? abs,X | sta abs,X | ??? abs,X | ??? abs,X |
a0 | ldy # | lda X,ind | ldx # | ??? --- | ldy zpg | lda zpg | ldx zpg | ??? --- | tay imp | lda # | tax imp | ??? imp | ldy abs | lda abs | ldx abs | ??? abs |
b0 | bcs rel | lda ind,Y | ??? --- | ??? --- | ldy zpg,X | lda zpg,X | ldx zpg,Y | ??? --- | clv imp | lda abs,Y | tsx imp | ??? imp | ldy abs,X | lda abs,X | ldx abs,Y | ??? abs,X |
c0 | cpy # | cmp X,ind | ??? --- | ??? --- | cpy zpg | cmp zpg | dec zpg | ??? --- | iny imp | cmp # | dex imp | wai imp | cpy abs | cmp abs | dec abs | ??? abs |
d0 | bne rel | cmp ind,Y | ??? --- | ??? --- | ??? zpg,X | cmp zpg,X | dec zpg,X | ??? --- | cld imp | cmp abs,Y | ??? imp | ??? imp | ??? abs,X | cmp abs,X | dec abs,X | ??? abs,X |
e0 | cpx # | sbc X,ind | ??? --- | ??? --- | cpx zpg | sbc zpg | inc zpg | ??? --- | inx imp | sbc # | nop imp | ??? imp | cpx abs | sbc abs | inc abs | ??? abs |
f0 | beq rel | sbc ind,Y | ??? --- | ??? --- | ??? zpg,X | sbc zpg,X | inc zpg,X | ??? --- | sed imp | sbc abs,Y | ??? imp | ??? imp | ??? abs,X | sbc abs,X | inc abs,X | ??? abs,X |
Instruction Length
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
00 | brk imp | ora X,ind | ??? --- | ??? --- | ??? zpg | ora zpg | asl zpg | ??? --- | php imp | ora # | asl A | ??? A | ??? abs | ora abs | asl abs | ??? abs |
10 | bpl rel | ora ind,Y | ??? --- | ??? --- | ??? zpg,X | ora zpg,X | asl zpg,X | ??? --- | clc imp | ora abs,Y | ??? A | ??? A | ??? abs,X | ora abs,X | asl abs,X | ??? abs,X |
20 | jsr abs | and X,ind | ??? --- | ??? --- | bit zpg | and zpg | rol zpg | ??? --- | plp imp | and # | rol A | ??? A | bit abs | and abs | rol abs | ??? abs |
30 | bmi rel | and ind,Y | ??? --- | ??? --- | ??? zpg,X | and zpg,X | rol zpg,X | ??? --- | sec imp | and abs,Y | ??? A | ??? A | ??? abs,X | and abs,X | rol abs,X | ??? abs,X |
40 | rti imp | eor X,ind | ??? --- | ??? --- | ??? zpg | eor zpg | lsr zpg | ??? --- | pha imp | eor # | lsr A | ??? A | jmp abs | eor abs | lsr abs | ??? abs |
50 | bvc rel | eor ind,Y | ??? --- | ??? --- | ??? zpg,X | eor zpg,X | lsr zpg,X | ??? --- | cli imp | eor abs,Y | ??? A | ??? A | ??? abs,X | eor abs,X | lsr abs,X | ??? abs,X |
60 | rts imp | adc X,ind | ??? --- | ??? --- | ??? zpg | adc zpg | ror zpg | ??? --- | pla imp | adc # | ror A | ??? A | jmp ind | adc abs | ror abs | ??? abs |
70 | bvs rel | adc ind,Y | ??? --- | ??? --- | ??? zpg,X | adc zpg,X | ror zpg,X | ??? --- | sei imp | adc abs,Y | ??? A | ??? A | ??? abs,X | adc abs,X | ror abs,X | ??? abs,X |
80 | ??? # | sta X,ind | ??? --- | ??? --- | sty zpg | sta zpg | stx zpg | ??? --- | dey imp | ??? # | txa imp | ??? imp | sty abs | sta abs | stx abs | ??? abs |
90 | bcc rel | sta ind,Y | ??? --- | ??? --- | sty zpg,X | sta zpg,X | stx zpg,Y | ??? --- | tya imp | sta abs,Y | txs imp | ??? imp | ??? abs,X | sta abs,X | ??? abs,X | ??? abs,X |
a0 | ldy # | lda X,ind | ldx # | ??? --- | ldy zpg | lda zpg | ldx zpg | ??? --- | tay imp | lda # | tax imp | ??? imp | ldy abs | lda abs | ldx abs | ??? abs |
b0 | bcs rel | lda ind,Y | ??? --- | ??? --- | ldy zpg,X | lda zpg,X | ldx zpg,Y | ??? --- | clv imp | lda abs,Y | tsx imp | ??? imp | ldy abs,X | lda abs,X | ldx abs,Y | ??? abs,X |
c0 | cpy # | cmp X,ind | ??? --- | ??? --- | cpy zpg | cmp zpg | dec zpg | ??? --- | iny imp | cmp # | dex imp | wai imp | cpy abs | cmp abs | dec abs | ??? abs |
d0 | bne rel | cmp ind,Y | ??? --- | ??? --- | ??? zpg,X | cmp zpg,X | dec zpg,X | ??? --- | cld imp | cmp abs,Y | ??? imp | ??? imp | ??? abs,X | cmp abs,X | dec abs,X | ??? abs,X |
e0 | cpx # | sbc X,ind | ??? --- | ??? --- | cpx zpg | sbc zpg | inc zpg | ??? --- | inx imp | sbc # | nop imp | ??? imp | cpx abs | sbc abs | inc abs | ??? abs |
f0 | beq rel | sbc ind,Y | ??? --- | ??? --- | ??? zpg,X | sbc zpg,X | inc zpg,X | ??? --- | sed imp | sbc abs,Y | ??? imp | ??? imp | ??? abs,X | sbc abs,X | inc abs,X | ??? abs,X |
Instruction Type
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
00 | brk imp | ora X,ind | ??? --- | ??? --- | ??? zpg | ora zpg | asl zpg | ??? --- | php imp | ora # | asl A | ??? A | ??? abs | ora abs | asl abs | ??? abs |
10 | bpl rel | ora ind,Y | ??? --- | ??? --- | ??? zpg,X | ora zpg,X | asl zpg,X | ??? --- | clc imp | ora abs,Y | ??? A | ??? A | ??? abs,X | ora abs,X | asl abs,X | ??? abs,X |
20 | jsr abs | and X,ind | ??? --- | ??? --- | bit zpg | and zpg | rol zpg | ??? --- | plp imp | and # | rol A | ??? A | bit abs | and abs | rol abs | ??? abs |
30 | bmi rel | and ind,Y | ??? --- | ??? --- | ??? zpg,X | and zpg,X | rol zpg,X | ??? --- | sec imp | and abs,Y | ??? A | ??? A | ??? abs,X | and abs,X | rol abs,X | ??? abs,X |
40 | rti imp | eor X,ind | ??? --- | ??? --- | ??? zpg | eor zpg | lsr zpg | ??? --- | pha imp | eor # | lsr A | ??? A | jmp abs | eor abs | lsr abs | ??? abs |
50 | bvc rel | eor ind,Y | ??? --- | ??? --- | ??? zpg,X | eor zpg,X | lsr zpg,X | ??? --- | cli imp | eor abs,Y | ??? A | ??? A | ??? abs,X | eor abs,X | lsr abs,X | ??? abs,X |
60 | rts imp | adc X,ind | ??? --- | ??? --- | ??? zpg | adc zpg | ror zpg | ??? --- | pla imp | adc # | ror A | ??? A | jmp ind | adc abs | ror abs | ??? abs |
70 | bvs rel | adc ind,Y | ??? --- | ??? --- | ??? zpg,X | adc zpg,X | ror zpg,X | ??? --- | sei imp | adc abs,Y | ??? A | ??? A | ??? abs,X | adc abs,X | ror abs,X | ??? abs,X |
80 | ??? # | sta X,ind | ??? --- | ??? --- | sty zpg | sta zpg | stx zpg | ??? --- | dey imp | ??? # | txa imp | ??? imp | sty abs | sta abs | stx abs | ??? abs |
90 | bcc rel | sta ind,Y | ??? --- | ??? --- | sty zpg,X | sta zpg,X | stx zpg,Y | ??? --- | tya imp | sta abs,Y | txs imp | ??? imp | ??? abs,X | sta abs,X | ??? abs,X | ??? abs,X |
a0 | ldy # | lda X,ind | ldx # | ??? --- | ldy zpg | lda zpg | ldx zpg | ??? --- | tay imp | lda # | tax imp | ??? imp | ldy abs | lda abs | ldx abs | ??? abs |
b0 | bcs rel | lda ind,Y | ??? --- | ??? --- | ldy zpg,X | lda zpg,X | ldx zpg,Y | ??? --- | clv imp | lda abs,Y | tsx imp | ??? imp | ldy abs,X | lda abs,X | ldx abs,Y | ??? abs,X |
c0 | cpy # | cmp X,ind | ??? --- | ??? --- | cpy zpg | cmp zpg | dec zpg | ??? --- | iny imp | cmp # | dex imp | wai imp | cpy abs | cmp abs | dec abs | ??? abs |
d0 | bne rel | cmp ind,Y | ??? --- | ??? --- | ??? zpg,X | cmp zpg,X | dec zpg,X | ??? --- | cld imp | cmp abs,Y | ??? imp | ??? imp | ??? abs,X | cmp abs,X | dec abs,X | ??? abs,X |
e0 | cpx # | sbc X,ind | ??? --- | ??? --- | cpx zpg | sbc zpg | inc zpg | ??? --- | inx imp | sbc # | nop imp | ??? imp | cpx abs | sbc abs | inc abs | ??? abs |
f0 | beq rel | sbc ind,Y | ??? --- | ??? --- | ??? zpg,X | sbc zpg,X | inc zpg,X | ??? --- | sed imp | sbc abs,Y | ??? imp | ??? imp | ??? abs,X | sbc abs,X | inc abs,X | ??? abs,X |
Branch Instruction | Load Instruction | Store Instruction | Transfer Instruction | Special Instruction | Arithmetic Instruction |
Address Mode by Register
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
00 | brk imp | ora X,ind | ??? --- | ??? --- | ??? zpg | ora zpg | asl zpg | ??? --- | php imp | ora # | asl A | ??? A | ??? abs | ora abs | asl abs | ??? abs |
10 | bpl rel | ora ind,Y | ??? --- | ??? --- | ??? zpg,X | ora zpg,X | asl zpg,X | ??? --- | clc imp | ora abs,Y | ??? A | ??? A | ??? abs,X | ora abs,X | asl abs,X | ??? abs,X |
20 | jsr abs | and X,ind | ??? --- | ??? --- | bit zpg | and zpg | rol zpg | ??? --- | plp imp | and # | rol A | ??? A | bit abs | and abs | rol abs | ??? abs |
30 | bmi rel | and ind,Y | ??? --- | ??? --- | ??? zpg,X | and zpg,X | rol zpg,X | ??? --- | sec imp | and abs,Y | ??? A | ??? A | ??? abs,X | and abs,X | rol abs,X | ??? abs,X |
40 | rti imp | eor X,ind | ??? --- | ??? --- | ??? zpg | eor zpg | lsr zpg | ??? --- | pha imp | eor # | lsr A | ??? A | jmp abs | eor abs | lsr abs | ??? abs |
50 | bvc rel | eor ind,Y | ??? --- | ??? --- | ??? zpg,X | eor zpg,X | lsr zpg,X | ??? --- | cli imp | eor abs,Y | ??? A | ??? A | ??? abs,X | eor abs,X | lsr abs,X | ??? abs,X |
60 | rts imp | adc X,ind | ??? --- | ??? --- | ??? zpg | adc zpg | ror zpg | ??? --- | pla imp | adc # | ror A | ??? A | jmp ind | adc abs | ror abs | ??? abs |
70 | bvs rel | adc ind,Y | ??? --- | ??? --- | ??? zpg,X | adc zpg,X | ror zpg,X | ??? --- | sei imp | adc abs,Y | ??? A | ??? A | ??? abs,X | adc abs,X | ror abs,X | ??? abs,X |
80 | ??? # | sta X,ind | ??? --- | ??? --- | sty zpg | sta zpg | stx zpg | ??? --- | dey imp | ??? # | txa imp | ??? imp | sty abs | sta abs | stx abs | ??? abs |
90 | bcc rel | sta ind,Y | ??? --- | ??? --- | sty zpg,X | sta zpg,X | stx zpg,Y | ??? --- | tya imp | sta abs,Y | txs imp | ??? imp | ??? abs,X | sta abs,X | ??? abs,X | ??? abs,X |
a0 | ldy # | lda X,ind | ldx # | ??? --- | ldy zpg | lda zpg | ldx zpg | ??? --- | tay imp | lda # | tax imp | ??? imp | ldy abs | lda abs | ldx abs | ??? abs |
b0 | bcs rel | lda ind,Y | ??? --- | ??? --- | ldy zpg,X | lda zpg,X | ldx zpg,Y | ??? --- | clv imp | lda abs,Y | tsx imp | ??? imp | ldy abs,X | lda abs,X | ldx abs,Y | ??? abs,X |
c0 | cpy # | cmp X,ind | ??? --- | ??? --- | cpy zpg | cmp zpg | dec zpg | ??? --- | iny imp | cmp # | dex imp | wai imp | cpy abs | cmp abs | dec abs | ??? abs |
d0 | bne rel | cmp ind,Y | ??? --- | ??? --- | ??? zpg,X | cmp zpg,X | dec zpg,X | ??? --- | cld imp | cmp abs,Y | ??? imp | ??? imp | ??? abs,X | cmp abs,X | dec abs,X | ??? abs,X |
e0 | cpx # | sbc X,ind | ??? --- | ??? --- | cpx zpg | sbc zpg | inc zpg | ??? --- | inx imp | sbc # | nop imp | ??? imp | cpx abs | sbc abs | inc abs | ??? abs |
f0 | beq rel | sbc ind,Y | ??? --- | ??? --- | ??? zpg,X | sbc zpg,X | inc zpg,X | ??? --- | sed imp | sbc abs,Y | ??? imp | ??? imp | ??? abs,X | sbc abs,X | inc abs,X | ??? abs,X |
Accumulator | Non-Register | X Register | Y Register |
Address Mode by Operand
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
00 | brk imp | ora X,ind | ??? --- | ??? --- | ??? zpg | ora zpg | asl zpg | ??? --- | php imp | ora # | asl A | ??? A | ??? abs | ora abs | asl abs | ??? abs |
10 | bpl rel | ora ind,Y | ??? --- | ??? --- | ??? zpg,X | ora zpg,X | asl zpg,X | ??? --- | clc imp | ora abs,Y | ??? A | ??? A | ??? abs,X | ora abs,X | asl abs,X | ??? abs,X |
20 | jsr abs | and X,ind | ??? --- | ??? --- | bit zpg | and zpg | rol zpg | ??? --- | plp imp | and # | rol A | ??? A | bit abs | and abs | rol abs | ??? abs |
30 | bmi rel | and ind,Y | ??? --- | ??? --- | ??? zpg,X | and zpg,X | rol zpg,X | ??? --- | sec imp | and abs,Y | ??? A | ??? A | ??? abs,X | and abs,X | rol abs,X | ??? abs,X |
40 | rti imp | eor X,ind | ??? --- | ??? --- | ??? zpg | eor zpg | lsr zpg | ??? --- | pha imp | eor # | lsr A | ??? A | jmp abs | eor abs | lsr abs | ??? abs |
50 | bvc rel | eor ind,Y | ??? --- | ??? --- | ??? zpg,X | eor zpg,X | lsr zpg,X | ??? --- | cli imp | eor abs,Y | ??? A | ??? A | ??? abs,X | eor abs,X | lsr abs,X | ??? abs,X |
60 | rts imp | adc X,ind | ??? --- | ??? --- | ??? zpg | adc zpg | ror zpg | ??? --- | pla imp | adc # | ror A | ??? A | jmp ind | adc abs | ror abs | ??? abs |
70 | bvs rel | adc ind,Y | ??? --- | ??? --- | ??? zpg,X | adc zpg,X | ror zpg,X | ??? --- | sei imp | adc abs,Y | ??? A | ??? A | ??? abs,X | adc abs,X | ror abs,X | ??? abs,X |
80 | ??? # | sta X,ind | ??? --- | ??? --- | sty zpg | sta zpg | stx zpg | ??? --- | dey imp | ??? # | txa imp | ??? imp | sty abs | sta abs | stx abs | ??? abs |
90 | bcc rel | sta ind,Y | ??? --- | ??? --- | sty zpg,X | sta zpg,X | stx zpg,Y | ??? --- | tya imp | sta abs,Y | txs imp | ??? imp | ??? abs,X | sta abs,X | ??? abs,X | ??? abs,X |
a0 | ldy # | lda X,ind | ldx # | ??? --- | ldy zpg | lda zpg | ldx zpg | ??? --- | tay imp | lda # | tax imp | ??? imp | ldy abs | lda abs | ldx abs | ??? abs |
b0 | bcs rel | lda ind,Y | ??? --- | ??? --- | ldy zpg,X | lda zpg,X | ldx zpg,Y | ??? --- | clv imp | lda abs,Y | tsx imp | ??? imp | ldy abs,X | lda abs,X | ldx abs,Y | ??? abs,X |
c0 | cpy # | cmp X,ind | ??? --- | ??? --- | cpy zpg | cmp zpg | dec zpg | ??? --- | iny imp | cmp # | dex imp | wai imp | cpy abs | cmp abs | dec abs | ??? abs |
d0 | bne rel | cmp ind,Y | ??? --- | ??? --- | ??? zpg,X | cmp zpg,X | dec zpg,X | ??? --- | cld imp | cmp abs,Y | ??? imp | ??? imp | ??? abs,X | cmp abs,X | dec abs,X | ??? abs,X |
e0 | cpx # | sbc X,ind | ??? --- | ??? --- | cpx zpg | sbc zpg | inc zpg | ??? --- | inx imp | sbc # | nop imp | ??? imp | cpx abs | sbc abs | inc abs | ??? abs |
f0 | beq rel | sbc ind,Y | ??? --- | ??? --- | ??? zpg,X | sbc zpg,X | inc zpg,X | ??? --- | sed imp | sbc abs,Y | ??? imp | ??? imp | ??? abs,X | sbc abs,X | inc abs,X | ??? abs,X |
Accumulator/Implied | Zeropage | Relative/Immediate | Absolute | Indirect |