We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS

Emulation Mode Flag: Difference between revisions

From SnesLab
Jump to: navigation, search
(opcode matrix note)
(see also SA-1)
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
The '''Emulation Mode Flag''' (E) controls whether the [[65c816]] is behaving like a 6502.
The '''Emulation Mode Flag''' (E) controls whether the [[65c816]] is behaving like a 6502:
 
* When clear, the '816 is in '''65c816 native mode.'''
When clear, the MPU is in '''65c816 native mode.'''
* When set, the '816 is in '''6502 emulation mode.'''
 
When set, the MPU is in '''6502 emulation mode.'''


This flag cannot be modified directly and is normally hidden from the programmer.  To modify it, use the [[XCE]] instruction to swap its value with the [[carry flag]]'s value.  This treats the [[status register]] bits as a game of musical chairs.
This flag cannot be modified directly and is normally hidden from the programmer.  To modify it, use the [[XCE]] instruction to swap its value with the [[carry flag]]'s value.  This treats the [[status register]] bits as a game of musical chairs.
Line 11: Line 9:
The flag is set when a [[RESET]] interrupt is fired. In other words, the CPU always starts in emulation mode at boot and after a reset.
The flag is set when a [[RESET]] interrupt is fired. In other words, the CPU always starts in emulation mode at boot and after a reset.


The 65c816 does not attempt to emulate the illegal 6502 opcodes because its [[65c816 Opcode Matrix|opcode matrix]] is already full.
The 65c816 does not attempt to emulate the illegal 6502 opcodes because its [[65c816 Opcode Matrix|opcode matrix]] is already full. All 256 opcodes work in both native and emulation mode, but many are less useful in emulation mode.<sup>[3]</sup>


For writing new SNES code it is recommended to always stay in native mode even if dealing with 8 bit data.  One reason is page boundary crossings incur a one cycle penalty in emulation mode.  Emulation mode emulates the NMOS 6502 cycle counts.
For writing new SNES code it is recommended to always stay in native mode even if dealing with 8 bit data.  One reason is page boundary crossings incur a one cycle penalty in emulation mode.  Emulation mode emulates the NMOS 6502 cycle counts.
Line 18: Line 16:


In emulation mode, the [[stack pointer]]'s high byte is always one.
In emulation mode, the [[stack pointer]]'s high byte is always one.
=== See Also ===
* [[SA-1]]


=== References ===
=== References ===
* Figure 17.3, [[Eyes & Lichty]] page 377, https://archive.org/details/0893037893ProgrammingThe65816/page/377
# Figure 17.3, [[Eyes & Lichty]], [https://archive.org/details/0893037893ProgrammingThe65816/page/377 page 377]
* Clark, Bruce. http://www.6502.org/tutorials/65c816opcodes.html#APPENDIX
# Clark, Bruce. http://www.6502.org/tutorials/65c816opcodes.html#APPENDIX
# section 7.8 of 65c816 datasheet: https://www.westerndesigncenter.com/wdc/documentation/w65c816s.pdf


[[Category:SNES Hardware]]
[[Category:SNES Hardware]]
[[Category:ASM]]
[[Category:ASM]]
[[Category:Flags]]
[[Category:Flags]]

Latest revision as of 19:07, 12 August 2024

The Emulation Mode Flag (E) controls whether the 65c816 is behaving like a 6502:

  • When clear, the '816 is in 65c816 native mode.
  • When set, the '816 is in 6502 emulation mode.

This flag cannot be modified directly and is normally hidden from the programmer. To modify it, use the XCE instruction to swap its value with the carry flag's value. This treats the status register bits as a game of musical chairs.

The designers likely omitted CLE and SEE opcodes to set or clear it directly because dedicating two opcodes to such a rare operation is overkill.

The flag is set when a RESET interrupt is fired. In other words, the CPU always starts in emulation mode at boot and after a reset.

The 65c816 does not attempt to emulate the illegal 6502 opcodes because its opcode matrix is already full. All 256 opcodes work in both native and emulation mode, but many are less useful in emulation mode.[3]

For writing new SNES code it is recommended to always stay in native mode even if dealing with 8 bit data. One reason is page boundary crossings incur a one cycle penalty in emulation mode. Emulation mode emulates the NMOS 6502 cycle counts.

Emulation code need not be in bank 0.

In emulation mode, the stack pointer's high byte is always one.

See Also

References

  1. Figure 17.3, Eyes & Lichty, page 377
  2. Clark, Bruce. http://www.6502.org/tutorials/65c816opcodes.html#APPENDIX
  3. section 7.8 of 65c816 datasheet: https://www.westerndesigncenter.com/wdc/documentation/w65c816s.pdf