https://gbdev.gg8.se/wiki/index.php?title=Equivalents_to_6502_instructions&feed=atom&action=history
Equivalents to 6502 instructions - Revision history
2024-03-29T02:24:07Z
Revision history for this page on the wiki
MediaWiki 1.25.1
https://gbdev.gg8.se/wiki/index.php?title=Equivalents_to_6502_instructions&diff=866&oldid=prev
PinoBatch: In #gbdev2: <DarkerBit> Ooops I accidentally 6502
2019-03-29T16:26:54Z
<p>In #gbdev2: <DarkerBit> Ooops I accidentally 6502</p>
<p><b>New page</b></p><div>Many new Game Boy programmers have experience on a platform with a 6502 family (6502, 6507, 6510, 65C02, 65816, or HuC6280) processor. These include Apple II, Atari 8-bit (2600 VCS, 800, 5200, 7800 ProSystem, Lynx), Nintendo (NES/Famicom, Super NES/Super Famicom), and TurboGrafx-16/PC Engine. To help these programmers adapt, this table lists the closest opcode in the Game Boy CPU to each instruction in a WDC/Rockwell 65C02 CPU.<br />
<br />
{| class="wikitable"<br />
! 65C02 instruction || SM83 instruction || Notes<br />
|-<br />
| <code>adc</code> || <code>adc</code> || See also <code>add</code><br />
|-<br />
| <code>and</code> || <code>and</code> || Clears carry<br />
|-<br />
| <code>asl</code> || <code>sla</code>, <code>add a</code> || It always stood for '''A'''dd to '''S'''e'''L'''f<br />
|-<br />
| <code>bbr</code> || <code>bit</code> then <code>jr z</code> || <br />
|-<br />
| <code>bbs</code> || <code>bit</code> then <code>jr nz</code> || <br />
|-<br />
| <code>bcc</code> || <code>jr nc</code> || <br />
|-<br />
| <code>bcs</code> || <code>jr c</code> || <br />
|-<br />
| <code>beq</code> || <code>jr z</code> || <br />
|-<br />
| <code>bit</code> || <code>bit</code> || Tests the argument against a given bit, not the bits set in A<br />
|-<br />
| <code>bmi</code> || <code>bit 7</code> then <code>jr nz</code> || <br />
|-<br />
| <code>bne</code> || <code>jr nz</code> || <br />
|-<br />
| <code>bpl</code> || <code>bit 7</code> then <code>jr z</code> || If using to test a counter for wrapping from $00 to $FF, <code>dec b</code> then <code>jr nz</code> is more commonly used.<br />
|-<br />
| <code>bra</code> || <code>jr</code> || <br />
|-<br />
| <code>brk</code> || <code>rst</code> || <br />
|-<br />
| <code>bvc</code> || No direct equivalent || rowspan="2" | Replacement uses <code>xor</code> and <code>bit 7</code><br />
|-<br />
| <code>bvs</code> || No direct equivalent<br />
|-<br />
| <code>clc</code> || <code>scf</code> then <code>ccf</code> || <code>or a</code> also clears Z. Less needed in general because <code>add</code> exists.<br />
|-<br />
| <code>cld</code> || No direct equivalent || Skip <code>daa</code> after <code>add</code> or <code>sub</code><br />
|-<br />
| <code>cli</code> || <code>ei</code> || Also enables vblank if set in LCDC, as Game Boy does not use NMI<br />
|-<br />
| <code>clv</code> || No direct equivalent || No SO pin. If using with <code>bvc</code> to simulate <code>bra</code>, use <code>jr</code> without a condition.<br />
|-<br />
| <code>cmp</code> || <code>cp</code> || Carry sense is inverted<br />
|-<br />
| <code>cpx</code> || No direct equivalent || rowspan="2" | Load a value into A and compare it to B, C, etc.<br />
|-<br />
| <code>cpy</code> || No direct equivalent<br />
|-<br />
| <code>dec</code> || <code>dec</code> || <br />
|-<br />
| <code>dex</code> || <code>dec b</code> || <br />
|-<br />
| <code>dey</code> || <code>dec c</code> || <br />
|-<br />
| <code>eor</code> || <code>xor</code> || Clears carry<br />
|-<br />
| <code>inc</code> || <code>inc</code> || <br />
|-<br />
| <code>inx</code> || <code>inc b</code> || <br />
|-<br />
| <code>iny</code> || <code>inc c</code> || <br />
|-<br />
| <code>jmp</code> || <code>jp</code> || Can be made conditional<br />
|-<br />
| <code>jsr</code> || <code>call</code> || <br />
|-<br />
| <code>lda</code> || <code>ld a</code> || Does not change Z<br />
|-<br />
| <code>ldx</code> || <code>ld b</code> || rowspan="2" | Does not change Z; accessing arrays is [[Struct|very different]]<br />
|-<br />
| <code>ldy</code> || <code>ld c</code><br />
|-<br />
| <code>lsr</code> || <code>srl</code> || See also <code>sra</code> which copies bit 7 to carry first<br />
|-<br />
| <code>nop</code> || <code>nop</code> || <br />
|-<br />
| <code>ora</code> || <code>or</code> || Clears carry<br />
|-<br />
| <code>pha</code> || <code>push af</code> || rowspan="2" | Only pairs of registers can be pushed or popped. BC, DE, and HL are more commonly pushed or popped.<br />
|-<br />
| <code>php</code> || <code>push af</code><br />
|-<br />
| <code>phx</code> || <code>push bc</code> || <br />
|-<br />
| <code>phy</code> || <code>push bc</code> || <br />
|-<br />
| <code>pla</code> || <code>pop af</code> || <br />
|-<br />
| <code>plp</code> || <code>pop af</code> || <br />
|-<br />
| <code>plx</code> || <code>pop bc</code> || <br />
|-<br />
| <code>ply</code> || <code>pop bc</code> || <br />
|-<br />
| <code>rol</code> || <code>rla</code>, <code>rl</code>, <code>adc a</code> || See also <code>rlc</code> which copies bit 7 to carry first<br />
|-<br />
| <code>rmb</code> || <code>res</code><br />
|-<br />
| <code>ror</code> || <code>rra</code>, <code>rr</code> || See also <code>rrc</code> which copies bit 0 to carry first<br />
|-<br />
| <code>rti</code> || <code>pop af</code> then <code>reti</code> || Interrupt handlers do ''not'' automatically push flags.<br />
|-<br />
| <code>rts</code> || <code>ret</code> || Can be made conditional. See also <code>jp hl</code><br />
|-<br />
| <code>sbc</code> || <code>sbc</code> || Carry sense is inverted; see also <code>sub</code><br />
|-<br />
| <code>sec</code> || <code>scf</code> || <br />
|-<br />
| <code>sed</code> || No direct equivalent || Use <code>daa</code> after <code>add</code> or <code>sub</code><br />
|-<br />
| <code>sei</code> || <code>di</code> || Disables vblank, as Game Boy does not use NMI <br />
|-<br />
| <code>smb</code> || <code>set</code><br />
|-<br />
| <code>sta</code> || <code>ld [destination],a</code> || <br />
|-<br />
| <code>stx</code> || <code>ld [hl], b</code> || rowspan="2" | There are two main ways for data to get in and out of registers: through A or through [HL].<br />
|-<br />
| <code>sty</code> || <code>ld [hl], c</code><br />
|-<br />
| <code>stz</code> || <code>xor a</code> then <code>ld [destination],a</code> || Sets Z, clears carry and A<br />
|-<br />
| <code>tax</code> || <code>ld b, a</code> || Does not change Z<br />
|-<br />
| <code>tay</code> || <code>ld c, a</code> || Does not change Z<br />
|-<br />
| <code>trb</code> || <code>res place, [hl]</code> || <br />
|-<br />
| <code>tsb</code> || <code>set place, [hl]</code> || <br />
|-<br />
| <code>tsx</code> || <code>ld hl, sp+0</code> || Does not change Z<br />
|-<br />
| <code>txa</code> || <code>ld a, b</code> || Does not change Z<br />
|-<br />
| <code>txs</code> || <code>ld sp, hl</code> || <br />
|-<br />
| <code>tya</code> || <code>ld a, c</code> || Does not change Z<br />
|-<br />
| <code>wai</code> || <code>halt</code> || <br />
|}</div>
PinoBatch