# Changing the processor flags

As seen in the [previous chapter](/assembly-for-the-snes/processor-flags-and-registers/flags.md), 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                                         |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ersanio.gitbook.io/assembly-for-the-snes/processor-flags-and-registers/repsep.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
