Introducción a Core War

Que es Core War?

Un juego creado en 1984 en el que dos programas warriors, luchan por el control de un ordenador virtual.

Los programas se encuentran escritos en un lenguaje similar a ensamblador, redcode y para ganar deben conseguir que el oponente ejecute una instrucción no válida.

Como lo podemos jugar?

Las máquinas virtuales donde corren los warriors se llaman MARS.

Existen multiples implementaciones, como pMars

(https://sourceforge.net/projects/corewar/)

Para compilarlo solo tendríamos que descomprimirlo y hacer:

# Nos movemos al directorio de código
$ cd src
# Lo compilamos
$ make
# Para probarlo lo lanzamos con un par de ejemplos
$ ./pmars ../warriors/aeka.red ../warriors/aeka.red

pmars.png

Warriors simples

Ahora que podemos hacer pruebas vamos a ver dos programas simples para ir tomando contacto con el lenguaje.

Imp

;name Imp
;author Walter Hofmann

mov 0,1

El primer programa, copia su unica instrucción a la siguiente posición de memoria, que repite el proceso.

imp.png

mov 0, 1 ; Mueve el byte 0 (el actual) al 1 (el siguiente)

Duro de matar, pero incapaz de eliminar al contrincante.

Dwarf

;name Dwarf
;author A. K. Dewdney
dwarf  add #4, bomb
mov    bomb, @bomb
jmp    dwarf

bomb   dat #0

Bombardea la memoria con bloques de datos

dwarf.png

Dwarf, por pasos

En cada ciclo

dwarf  add #4, bomb  ; Incrementa en 4 el valor de “bomb”

Dwarf y bomb son etiquetas, permiten no tener que escribir las direcciones relativas de las instrucciones manualmente.

mov bomb, @bomb  ; Copia el bloque de datos “bomb” a la dirección a la que apunta
jmp dwarf  ; Vuelve al principio del bucle
dat #0     ; Un bloque de memoria, que estará inicializado a 0

Enfrentados, posibles resultados

Hay 3 posibles resultados si se enfrenta un imp y un dwarf.

Ninguno gana, territorio para el dwarf

dwarf-vs-imp-mostred.png

El dwarf cae en una instrucción del imp y lo persigue, quedandose toda la memoria.

Ninguno gana, territorio para el imp

dwarf-vs-imp-mostgreen.png

El dwarf cae en una instrucción del imp antes de que este la ejecute, imp se queda la memoria.

Gana el dwarf

dwarf-vs-imp-winsdwarf.png

El dwarf cae pisa el mov que va a ejecutar el imp y lo elimina.

Instrucciones, hasta ahora

  • mov dirección origen, dirección destino: copia un byte de la memoria
  • add valor, /dirección: añade un valor a una dirección
  • jmp dirección destino: hace saltar la ejecución
  • dat valor inicial: bloque de datos (no se puede ejecutar)

Pero hay bastantes más, la lista completa está en https://esolangs.org/wiki/Redcode#Instructions

Los campos pueden ser de varios tipos

  • directos o relativos: 0, 1, … (se indican precedidos de un $, es opcional)
  • inmediatos: parecido, pero para datos (se indican precedidos de un #)
  • indirectos: dependiendo toman el valor del campo A o B de la instrucción que indican
Campo Indirecto Indirecto con predecremento Indirecto con postincremento
A * { }
B @ < >