COREDUEL

СПРАВКА ПО REDCODE

CoreDuel реализует стандарт ICWS'94 с расширениями pMARS (p-space, FOR/ROF, выражения в EQU). Если вы знакомы с pMARS, здесь всё будет привычно.

0. Что это за игра

Вы пишете небольшие программы — ботов — и отправляете их на Арену сражаться с другими ботами. Бот написан на Redcode, ассемблероподобном языке из 19 инструкций. Все боты матча загружаются в одну общую память — ядро: кольцо из 8000 ячеек (конец переходит в начало) внутри простого эмулируемого компьютера MARS. Больше в этом компьютере ничего нет: ни экрана, ни файлов, только инструкции в ячейках и несколько процессов, которые их выполняют.

Каждый бот начинает с одним процессом в случайном месте, не ближе 100 ячеек от остальных. Эмулятор даёт ботам ходы по кругу; в свой ход бот выполняет одну инструкцию одного из своих процессов. Процесс погибает, выполнив инструкцию DAT (или разделив на ноль); бот погибает, когда не остаётся ни одного его процесса. Память общая, поэтому побеждают так: затирают код противника бомбами DAT, ищут его сканированием или заливают ядро своими копиями — и при этом сохраняют собственный код живым.

Раунд заканчивается, когда остаётся один бот, или через 80000 циклов. Матч — один или несколько раундов; выжившие в раунде получают очки, побеждает лучшая сумма. Вот и вся игра: напишите программу лучше, чем у соперника.

С чего начать:

1. Ядро

Ядро — это кольцо из 8000 ячеек. В каждой ячейке лежит одна инструкция. Адреса зациклены: ячейка 7999 + 1 = ячейка 0. Абсолютных адресов в Redcode нет: любой адрес отсчитывается от инструкции, которая его использует.

Перед раундом каждая ячейка содержит DAT.F $0, $0. Воины размещаются в случайных позициях на расстоянии не менее MINDISTANCE (100) ячеек друг от друга. Каждый воин начинает с одного процесса, стоящего на его ORG.

Процессы ходят по очереди: воин A выполняет одну инструкцию, затем воин B, и так далее. Если у воина несколько процессов, они выполняются по кругу, по одному за ход.

Процесс погибает, когда выполняет DAT или делит на ноль. Воин погибает, когда погибает его последний процесс. Раунд заканчивается, когда остаётся один воин, или через MAXCYCLES (80000) циклов.

2. Структура программы

;redcode-94
;name Dwarf
;author A. K. Dewdney
;strategy Bombs every 4th cell.
;assert CORESIZE == 8000
        ORG     start
target  DAT.F   #0, #0
start   ADD.AB  #4, target
        MOV.AB  #0, @target
        JMP     start
        END

3. Синтаксис инструкции

label   OPCODE.MOD   A-mode A-value, B-mode B-value   ; comment

У каждой инструкции есть опкод, модификатор, операнд A и операнд B. Каждый операнд — это режим адресации плюс значение. Значения — это выражения (см. 8), которые вычисляются относительно адреса самой инструкции.

Если указать только один операнд, ассемблер дополнит второй:

4. Режимы адресации

До выполнения опкода каждый операнд разрешается в указатель (адрес ячейки). Оба операнда вычисляются всегда, сначала A, даже если опкод один из них игнорирует. Поэтому побочные эффекты пре-/постинкремента срабатывают даже в JMP.

Примечание: в ICWS'94 у непосредственного операнда тоже есть указатель — сама инструкция. MOV.I #0, 1 копирует всю инструкцию на одну ячейку вперёд. Это классический Imp.

5. Модификаторы

Модификатор определяет, какие поля опкод читает и записывает. Для инструкции с A-указателем a и B-указателем b:

Модификатор по умолчанию, если он не указан:

6. Опкоды

Вся арифметика ведётся по модулю CORESIZE. Числа в ядре всегда лежат в диапазоне 0..7999; -1 хранится как 7999.

7. Директивы

        ORG     loop
loop    FOR     3
        MOV.I   #0, &loop
        ROF

8. Выражения

Операторы, от высшего приоритета к низшему: унарные - + !, затем * / % (целочисленные, с отбрасыванием дробной части), затем + -, затем сравнения == != < > <= >=, затем && и ||. Скобки допускаются. Сравнения дают 1 или 0.

Предопределённые константы: CORESIZE, MAXCYCLES, MAXPROCESSES, MAXLENGTH, MINDISTANCE, PSPACESIZE, ROUNDS, WARRIORS (2), VERSION (92), CURLINE (индекс текущей инструкции).

Метка в выражении означает расстояние от текущей инструкции до неё, поэтому label+1 — это ячейка после label, а start-target — просто число ячеек.

9. P-space

У каждого воина есть личный массив из PSPACESIZE (500) ячеек, который сохраняется между раундами матча. Индексы зациклены. Ячейка 0 особая и всегда личная: в начале каждого раунда в ней лежит предыдущий результат — 0, если воин погиб, иначе число выживших воинов (1 = победа, 2 = ничья). В первом раунде в ней CORESIZE-1.

LDP.AB #0, x загружает этот результат в поле B ячейки x. STP.B x, #1 сохраняет поле B ячейки x в ячейку 1. Так воин может сменить стратегию после поражения.

10. Правила матча

11. Типовые приёмы