Links

Changing the processor flags

As seen in the previous chapter, the SNES supports 9 processor flags. There are ways to affect these processor flags, which are explained in this chapter.

SEP

Opcode
Full name
Explanation
SEP
Set processor flags
Sets specified processor flags to 1
SEP sets the selected processor flag bits to 1.
SEP is used as following:
;nvmxdizc = 0000 0000
SEP #$80 ;= 1000 0000
;Nvmxdizc = 1000 0000
The uppercased letters are the activated processor flags. This code sets the negative flag.

REP

Opcode
Full name
Explanation
REP
Reset processor flags
Sets specified processor flags to 0
REP resets the selected processor flag bits to 0.
REP is used as following:
;NvmxDizc = 1000 1000
REP #$08 ;= 0000 1000
;Nvmxdizc = 1000 0000
In the beginning, the decimal mode was enabled, and the negative flag was set, but after REP #$08, the decimal mode flag got disabled and the negative flag is still set.

XCE and the emulation mode

Because the emulation mode bit is "hidden" above the carry flag, there's a dedicated opcode which exchanges the carry flag with the emulation mode flag.
Opcode
Full name
Explanation
XCE
Exchange carry and emulation
Swaps the values of carry flag and emulation mode flag
You can access the emulation mode by using SEC then XCE, and leave it using CLC then XCE. By default, SNES starts up in emulation mode. This is why you often see the opcodes CLC and XCE among the very first opcodes in disassemblies.

Other opcodes

There are other opcodes which immediately affect a single processor flag.
Opcode
Full name
Explanation
SEI
Set interrupt disable flag
Sets the interrupt disable flag, setting it to 1, thus disabling IRQ
CLI
Clear interrupt disable flag
Clears the interrupt disable flag, setting it to 0, thus enabling IRQ
SED
Set decimal flag
Sets the decimal mode flag, setting it to 1, changing the SNES into decimal mode
CLD
Clear decimal flag
Clears the decimal flag, setting it to 0, changing the SNES into hexadecimal mode
SEC
Set carry flag
Sets the carry flag, setting itt o 1
CLC
Clear carry flag
Clears the carry flag, setting it to 0
CLV
Clear overflow flag
Clears the overflow flag, setting it to 0