# Changing the processor flags

As seen in the [previous chapter](flags), 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                                         |
