v6502
The MOS 6502 Virtual Machine and Toolchain Infrastructure
Karnaugh Map Analysis

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

 000102030405060708090a0b0c0d0e0f
00brk impora X,ind??? ---??? ---??? zpgora zpgasl zpg??? ---php impora #asl A??? A??? absora absasl abs??? abs
10bpl relora ind,Y??? ---??? ---??? zpg,Xora zpg,Xasl zpg,X??? ---clc impora abs,Y??? A??? A??? abs,Xora abs,Xasl abs,X??? abs,X
20jsr absand X,ind??? ---??? ---bit zpgand zpgrol zpg??? ---plp impand #rol A??? Abit absand absrol abs??? abs
30bmi reland ind,Y??? ---??? ---??? zpg,Xand zpg,Xrol zpg,X??? ---sec impand abs,Y??? A??? A??? abs,Xand abs,Xrol abs,X??? abs,X
40rti impeor X,ind??? ---??? ---??? zpgeor zpglsr zpg??? ---pha impeor #lsr A??? Ajmp abseor abslsr abs??? abs
50bvc releor ind,Y??? ---??? ---??? zpg,Xeor zpg,Xlsr zpg,X??? ---cli impeor abs,Y??? A??? A??? abs,Xeor abs,Xlsr abs,X??? abs,X
60rts impadc X,ind??? ---??? ---??? zpgadc zpgror zpg??? ---pla impadc #ror A??? Ajmp indadc absror abs??? abs
70bvs reladc ind,Y??? ---??? ---??? zpg,Xadc zpg,Xror zpg,X??? ---sei impadc abs,Y??? A??? A??? abs,Xadc abs,Xror abs,X??? abs,X
80??? #sta X,ind??? ---??? ---sty zpgsta zpgstx zpg??? ---dey imp??? #txa imp??? impsty abssta absstx abs??? abs
90bcc relsta ind,Y??? ---??? ---sty zpg,Xsta zpg,Xstx zpg,Y??? ---tya impsta abs,Ytxs imp??? imp??? abs,Xsta abs,X??? abs,X??? abs,X
a0ldy #lda X,indldx #??? ---ldy zpglda zpgldx zpg??? ---tay implda #tax imp??? impldy abslda absldx abs??? abs
b0bcs rellda ind,Y??? ---??? ---ldy zpg,Xlda zpg,Xldx zpg,Y??? ---clv implda abs,Ytsx imp??? impldy abs,Xlda abs,Xldx abs,Y??? abs,X
c0cpy #cmp X,ind??? ---??? ---cpy zpgcmp zpgdec zpg??? ---iny impcmp #dex impwai impcpy abscmp absdec abs??? abs
d0bne relcmp ind,Y??? ---??? ---??? zpg,Xcmp zpg,Xdec zpg,X??? ---cld impcmp abs,Y??? imp??? imp??? abs,Xcmp abs,Xdec abs,X??? abs,X
e0cpx #sbc X,ind??? ---??? ---cpx zpgsbc zpginc zpg??? ---inx impsbc #nop imp??? impcpx abssbc absinc abs??? abs
f0beq relsbc ind,Y??? ---??? ---??? zpg,Xsbc zpg,Xinc zpg,X??? ---sed impsbc abs,Y??? imp??? imp??? abs,Xsbc abs,Xinc abs,X??? abs,X

Instruction Length

 000102030405060708090a0b0c0d0e0f
00brk impora X,ind??? ---??? ---??? zpgora zpgasl zpg??? ---php impora #asl A??? A??? absora absasl abs??? abs
10bpl relora ind,Y??? ---??? ---??? zpg,Xora zpg,Xasl zpg,X??? ---clc impora abs,Y??? A??? A??? abs,Xora abs,Xasl abs,X??? abs,X
20jsr absand X,ind??? ---??? ---bit zpgand zpgrol zpg??? ---plp impand #rol A??? Abit absand absrol abs??? abs
30bmi reland ind,Y??? ---??? ---??? zpg,Xand zpg,Xrol zpg,X??? ---sec impand abs,Y??? A??? A??? abs,Xand abs,Xrol abs,X??? abs,X
40rti impeor X,ind??? ---??? ---??? zpgeor zpglsr zpg??? ---pha impeor #lsr A??? Ajmp abseor abslsr abs??? abs
50bvc releor ind,Y??? ---??? ---??? zpg,Xeor zpg,Xlsr zpg,X??? ---cli impeor abs,Y??? A??? A??? abs,Xeor abs,Xlsr abs,X??? abs,X
60rts impadc X,ind??? ---??? ---??? zpgadc zpgror zpg??? ---pla impadc #ror A??? Ajmp indadc absror abs??? abs
70bvs reladc ind,Y??? ---??? ---??? zpg,Xadc zpg,Xror zpg,X??? ---sei impadc abs,Y??? A??? A??? abs,Xadc abs,Xror abs,X??? abs,X
80??? #sta X,ind??? ---??? ---sty zpgsta zpgstx zpg??? ---dey imp??? #txa imp??? impsty abssta absstx abs??? abs
90bcc relsta ind,Y??? ---??? ---sty zpg,Xsta zpg,Xstx zpg,Y??? ---tya impsta abs,Ytxs imp??? imp??? abs,Xsta abs,X??? abs,X??? abs,X
a0ldy #lda X,indldx #??? ---ldy zpglda zpgldx zpg??? ---tay implda #tax imp??? impldy abslda absldx abs??? abs
b0bcs rellda ind,Y??? ---??? ---ldy zpg,Xlda zpg,Xldx zpg,Y??? ---clv implda abs,Ytsx imp??? impldy abs,Xlda abs,Xldx abs,Y??? abs,X
c0cpy #cmp X,ind??? ---??? ---cpy zpgcmp zpgdec zpg??? ---iny impcmp #dex impwai impcpy abscmp absdec abs??? abs
d0bne relcmp ind,Y??? ---??? ---??? zpg,Xcmp zpg,Xdec zpg,X??? ---cld impcmp abs,Y??? imp??? imp??? abs,Xcmp abs,Xdec abs,X??? abs,X
e0cpx #sbc X,ind??? ---??? ---cpx zpgsbc zpginc zpg??? ---inx impsbc #nop imp??? impcpx abssbc absinc abs??? abs
f0beq relsbc ind,Y??? ---??? ---??? zpg,Xsbc zpg,Xinc zpg,X??? ---sed impsbc abs,Y??? imp??? imp??? abs,Xsbc abs,Xinc abs,X??? abs,X

1 byte2 bytes3 bytes

Instruction Type

 000102030405060708090a0b0c0d0e0f
00brk impora X,ind??? ---??? ---??? zpgora zpgasl zpg??? ---php impora #asl A??? A??? absora absasl abs??? abs
10bpl relora ind,Y??? ---??? ---??? zpg,Xora zpg,Xasl zpg,X??? ---clc impora abs,Y??? A??? A??? abs,Xora abs,Xasl abs,X??? abs,X
20jsr absand X,ind??? ---??? ---bit zpgand zpgrol zpg??? ---plp impand #rol A??? Abit absand absrol abs??? abs
30bmi reland ind,Y??? ---??? ---??? zpg,Xand zpg,Xrol zpg,X??? ---sec impand abs,Y??? A??? A??? abs,Xand abs,Xrol abs,X??? abs,X
40rti impeor X,ind??? ---??? ---??? zpgeor zpglsr zpg??? ---pha impeor #lsr A??? Ajmp abseor abslsr abs??? abs
50bvc releor ind,Y??? ---??? ---??? zpg,Xeor zpg,Xlsr zpg,X??? ---cli impeor abs,Y??? A??? A??? abs,Xeor abs,Xlsr abs,X??? abs,X
60rts impadc X,ind??? ---??? ---??? zpgadc zpgror zpg??? ---pla impadc #ror A??? Ajmp indadc absror abs??? abs
70bvs reladc ind,Y??? ---??? ---??? zpg,Xadc zpg,Xror zpg,X??? ---sei impadc abs,Y??? A??? A??? abs,Xadc abs,Xror abs,X??? abs,X
80??? #sta X,ind??? ---??? ---sty zpgsta zpgstx zpg??? ---dey imp??? #txa imp??? impsty abssta absstx abs??? abs
90bcc relsta ind,Y??? ---??? ---sty zpg,Xsta zpg,Xstx zpg,Y??? ---tya impsta abs,Ytxs imp??? imp??? abs,Xsta abs,X??? abs,X??? abs,X
a0ldy #lda X,indldx #??? ---ldy zpglda zpgldx zpg??? ---tay implda #tax imp??? impldy abslda absldx abs??? abs
b0bcs rellda ind,Y??? ---??? ---ldy zpg,Xlda zpg,Xldx zpg,Y??? ---clv implda abs,Ytsx imp??? impldy abs,Xlda abs,Xldx abs,Y??? abs,X
c0cpy #cmp X,ind??? ---??? ---cpy zpgcmp zpgdec zpg??? ---iny impcmp #dex impwai impcpy abscmp absdec abs??? abs
d0bne relcmp ind,Y??? ---??? ---??? zpg,Xcmp zpg,Xdec zpg,X??? ---cld impcmp abs,Y??? imp??? imp??? abs,Xcmp abs,Xdec abs,X??? abs,X
e0cpx #sbc X,ind??? ---??? ---cpx zpgsbc zpginc zpg??? ---inx impsbc #nop imp??? impcpx abssbc absinc abs??? abs
f0beq relsbc ind,Y??? ---??? ---??? zpg,Xsbc zpg,Xinc zpg,X??? ---sed impsbc abs,Y??? imp??? imp??? abs,Xsbc abs,Xinc abs,X??? abs,X

Branch InstructionLoad InstructionStore InstructionTransfer InstructionSpecial InstructionArithmetic Instruction

Address Mode by Register

 000102030405060708090a0b0c0d0e0f
00brk impora X,ind??? ---??? ---??? zpgora zpgasl zpg??? ---php impora #asl A??? A??? absora absasl abs??? abs
10bpl relora ind,Y??? ---??? ---??? zpg,Xora zpg,Xasl zpg,X??? ---clc impora abs,Y??? A??? A??? abs,Xora abs,Xasl abs,X??? abs,X
20jsr absand X,ind??? ---??? ---bit zpgand zpgrol zpg??? ---plp impand #rol A??? Abit absand absrol abs??? abs
30bmi reland ind,Y??? ---??? ---??? zpg,Xand zpg,Xrol zpg,X??? ---sec impand abs,Y??? A??? A??? abs,Xand abs,Xrol abs,X??? abs,X
40rti impeor X,ind??? ---??? ---??? zpgeor zpglsr zpg??? ---pha impeor #lsr A??? Ajmp abseor abslsr abs??? abs
50bvc releor ind,Y??? ---??? ---??? zpg,Xeor zpg,Xlsr zpg,X??? ---cli impeor abs,Y??? A??? A??? abs,Xeor abs,Xlsr abs,X??? abs,X
60rts impadc X,ind??? ---??? ---??? zpgadc zpgror zpg??? ---pla impadc #ror A??? Ajmp indadc absror abs??? abs
70bvs reladc ind,Y??? ---??? ---??? zpg,Xadc zpg,Xror zpg,X??? ---sei impadc abs,Y??? A??? A??? abs,Xadc abs,Xror abs,X??? abs,X
80??? #sta X,ind??? ---??? ---sty zpgsta zpgstx zpg??? ---dey imp??? #txa imp??? impsty abssta absstx abs??? abs
90bcc relsta ind,Y??? ---??? ---sty zpg,Xsta zpg,Xstx zpg,Y??? ---tya impsta abs,Ytxs imp??? imp??? abs,Xsta abs,X??? abs,X??? abs,X
a0ldy #lda X,indldx #??? ---ldy zpglda zpgldx zpg??? ---tay implda #tax imp??? impldy abslda absldx abs??? abs
b0bcs rellda ind,Y??? ---??? ---ldy zpg,Xlda zpg,Xldx zpg,Y??? ---clv implda abs,Ytsx imp??? impldy abs,Xlda abs,Xldx abs,Y??? abs,X
c0cpy #cmp X,ind??? ---??? ---cpy zpgcmp zpgdec zpg??? ---iny impcmp #dex impwai impcpy abscmp absdec abs??? abs
d0bne relcmp ind,Y??? ---??? ---??? zpg,Xcmp zpg,Xdec zpg,X??? ---cld impcmp abs,Y??? imp??? imp??? abs,Xcmp abs,Xdec abs,X??? abs,X
e0cpx #sbc X,ind??? ---??? ---cpx zpgsbc zpginc zpg??? ---inx impsbc #nop imp??? impcpx abssbc absinc abs??? abs
f0beq relsbc ind,Y??? ---??? ---??? zpg,Xsbc zpg,Xinc zpg,X??? ---sed impsbc abs,Y??? imp??? imp??? abs,Xsbc abs,Xinc abs,X??? abs,X

AccumulatorNon-RegisterX RegisterY Register

Address Mode by Operand

 000102030405060708090a0b0c0d0e0f
00brk impora X,ind??? ---??? ---??? zpgora zpgasl zpg??? ---php impora #asl A??? A??? absora absasl abs??? abs
10bpl relora ind,Y??? ---??? ---??? zpg,Xora zpg,Xasl zpg,X??? ---clc impora abs,Y??? A??? A??? abs,Xora abs,Xasl abs,X??? abs,X
20jsr absand X,ind??? ---??? ---bit zpgand zpgrol zpg??? ---plp impand #rol A??? Abit absand absrol abs??? abs
30bmi reland ind,Y??? ---??? ---??? zpg,Xand zpg,Xrol zpg,X??? ---sec impand abs,Y??? A??? A??? abs,Xand abs,Xrol abs,X??? abs,X
40rti impeor X,ind??? ---??? ---??? zpgeor zpglsr zpg??? ---pha impeor #lsr A??? Ajmp abseor abslsr abs??? abs
50bvc releor ind,Y??? ---??? ---??? zpg,Xeor zpg,Xlsr zpg,X??? ---cli impeor abs,Y??? A??? A??? abs,Xeor abs,Xlsr abs,X??? abs,X
60rts impadc X,ind??? ---??? ---??? zpgadc zpgror zpg??? ---pla impadc #ror A??? Ajmp indadc absror abs??? abs
70bvs reladc ind,Y??? ---??? ---??? zpg,Xadc zpg,Xror zpg,X??? ---sei impadc abs,Y??? A??? A??? abs,Xadc abs,Xror abs,X??? abs,X
80??? #sta X,ind??? ---??? ---sty zpgsta zpgstx zpg??? ---dey imp??? #txa imp??? impsty abssta absstx abs??? abs
90bcc relsta ind,Y??? ---??? ---sty zpg,Xsta zpg,Xstx zpg,Y??? ---tya impsta abs,Ytxs imp??? imp??? abs,Xsta abs,X??? abs,X??? abs,X
a0ldy #lda X,indldx #??? ---ldy zpglda zpgldx zpg??? ---tay implda #tax imp??? impldy abslda absldx abs??? abs
b0bcs rellda ind,Y??? ---??? ---ldy zpg,Xlda zpg,Xldx zpg,Y??? ---clv implda abs,Ytsx imp??? impldy abs,Xlda abs,Xldx abs,Y??? abs,X
c0cpy #cmp X,ind??? ---??? ---cpy zpgcmp zpgdec zpg??? ---iny impcmp #dex impwai impcpy abscmp absdec abs??? abs
d0bne relcmp ind,Y??? ---??? ---??? zpg,Xcmp zpg,Xdec zpg,X??? ---cld impcmp abs,Y??? imp??? imp??? abs,Xcmp abs,Xdec abs,X??? abs,X
e0cpx #sbc X,ind??? ---??? ---cpx zpgsbc zpginc zpg??? ---inx impsbc #nop imp??? impcpx abssbc absinc abs??? abs
f0beq relsbc ind,Y??? ---??? ---??? zpg,Xsbc zpg,Xinc zpg,X??? ---sed impsbc abs,Y??? imp??? imp??? abs,Xsbc abs,Xinc abs,X??? abs,X

Accumulator/ImpliedZeropageRelative/ImmediateAbsoluteIndirect