Core War programs are written in a programming language known as Redcode. Redcode does not have access to direct input or output.
Opcodes
Each opcode in Corewar contains three components: The instruction, register A, and register B. In the core, each memory section contains exactly one opcode, and provides no independent numbers.
The registers A and B are relative addresses, described in the Address modes below.
| Opcode | Description |
|---|---|
| DAT A,B | Data; executing this instruction kills the task. |
| MOV #A,B | If one is immediate, copied immediate number to B. |
| MOV A,B | Moves instruction at A to B. However, if A is immediate, copies the immediate number to B. |
| ADD A,B | Adds A to B. |
| SUB A,B | Subtracts A from B. |
| MUL A,B | Multiplies A and B to produce the result. |
| DIV A,B | Divides B by A. Division by zero kills the process. |
| MOD A,B | Modulus of B in A. Division by zero kills the process. |
| JMP A,B | Jumps to A. |
| JMZ A B | If *B is 0, jumps to A. |
| JMN A,B | If *B is not 0, jumps to A. |
| DJN A,B | Decreases *b. If non zero, jumps to A. |
| CMP A,B | If *a == *B (or if immediate, #A == *B), skips an instruction |
| SPL A,B | Creates a new task, which starts at B. Newer task starts first. |
| SEQ A,B | Skips past the next instruction if A and B are equal. |
| SNE A,B | Skips past the next instruction if A and B are not-equal. |
| SLT A,B | Skips if *A < *B. (88 only) |
| XCH A,B | At A, swaps A and B. (extended only) |
| PCT A,B | At A, Protects operands from changing, until an instruction is written to that address. |
| NOP A,B | Has no special effect (although operands are still evaluates.) |
| STP A,B | Stores A into P-Space at location specified by B. |
| LDP A,B | Retrieves data from P-Space at location specified by B into A. |
Address modes
Each opcode listed above contains two registers. These registers are composed of both a number and an address mode:
| # | Immediate. The number is directly in the opcode. |
| $ (or none) | Direct. The opcode points to a cell relative to the current cell. |
| @ | Indirect. The opcode points to a cell relative to the current cell. That cell's B value is added to the indirect pointer, to provide the target. |
| < | Indirect, but the intermediate register is decreased before use. |
| > | Indirect, the intermediate register is increased after use. |
| * | A-field Indirect. The opcode points to a cell relative to the current cell. That cell's A value is added to the indirect pointer, to provide the target. |
| { | A-field Indirect, but the intermediate register is decreased before use. |
| } | A-field Indirect, the intermediate register is increased after use. |
Special commands
| END | Stops compilation, further lines are treated as comments. |
| ORG | Takes one parameter, which identifies the start location. |
| PIN | Specifies P-Space identifier. If equal, the two programs share P-Space. |
| <label> EQU <A> | Replaces all instances of <label> with <A>. |
Instruction modifiers
| .A | A -> A |
| .B | B -> B |
| .AB | A -> B |
| .BA | B -> A |
| .F | A->A and B->B |
| .X | A->B and B->A |
| .I | Entire instruction. |
P-Space
P-Space is a private storage used by programs across multiple runs of a program, that cannot be directly accessed by the opponent. However, attacks by programs can trick other programs into corrupting the P-Space region
In the opcode listing above, there are two instructions that can read and write to P-Space: STP and LDP.