Le langage Red Code

Le langage Red Code permet de programmer les adversaires qui vont s'affronter dans la mémoire de l'ordinateur. Il est très simple et proche d'un langage d'assemblage (il ressemble beaucoup à l'assembleur des microprocesseurs de la famille x86 d'Intel).

La mémoire de l'ordinateur est constituée de 4096 cases (8000 dans la version originale de Dewdney, ce nombre a été diminué pour une raison expliquée par la suite). La mémoire est "bouclée" : la case après la dernière (d'adresse 4095) est la première case (d'adresse 0). Ainsi, l'adresse 4100 est équivalente à l'adresse 4 (4100 - 4096 = 4) et -3 est équivalente à 4093.

Trois méthodes d'adressage de la mémoire sont possibles dans une instruction :

  1. Relatif : C'est le mode par défaut. Il est relatif à la case de l'instruction en cours d'exécution. Par exemple, 3 pointe vers la troisième case après la case de l'instruction en cours d'exécution.
  2. Indirect : Est indiqué par un signe @. L'adresse après le signe @ n'est pas l'adresse pointée mais l'adresse de l'adresse pointée. Par exemple @3 pointe vers la case dont l'adresse est 3 cases après celle de l'instruction en cours. Attention, la case contenant l'adresse doit etre du type DAT (cf plus loin) sans quoi, le programme s'arrete sur une erreur d'indirection.
  3. Immédiat : Est indiqué par un signe # avant l'argument. Indique une valeur numérique, sans référence d'adresse. Donc #3 est la valeur numérique 3.

Un programme est constitué d'une suite d'instructions contigues en mémoire. Chaque instruction occupant une case mémoire. Après l'exécution d'une instruction, la suiavnte dans la mémoire est exécutée (sauf si l'instruction est une instruction de saut). Les instructions sont au nombre de 9 :

Voici un tableau récapitulatif des instructions de Red Code :

Instruction argument A argument B description
DAT ? - Donnée
MOV relatif, indirect, immédiat relatif, indirect Recopie le contenu de A vers B
ADD relatif, indirect, immédiat relatif, indirect Ajoute le contenu de A dans B
SUB relatif, indirect, immédiat relatif, indirect Soustrait le contenu de A à B
JMP relatif, indirect - Saute à l'adresse A
JMZ relatif, indirect relatif, indirect Saute vers A si B est nul
JMG relatif, indirect relatif, indirect Saute vers A si B est supérieur à 0
DJZ relatif, indirect relatif, indirect Décrémente B et saute vers A si le résultat est nul
CMP relatif, indirect, immédiat relatif, indirect, immédiat Décrémente B et saute vers A si le résultat est nul

Exemples de programmes :

Un exemple vallant mieux qu'un long discours, voici quelques programmes simples permettant de se faire une idée plus claire du langage Red Code :

IMP

IMP est un programme très simple, il ne comporte qu'une seule instruction !

  MOV  0  1

Il se recopie à la case mémoire suivante qui est exécutée après cette instruction. On obtient donc un programme autorépliquant très simple qui se comporte comme un rouleau compresseur et qui écrase toutes les cases mémoire de la mémoire. Cependant ce programme est très primaire et ne peut pour ainsi dire pas planter son adversaire dans la mesure où si son adversaire est amené à exécuter une de ses instructions, il se transforme lui meme en IMP !

DWARF

Ce programme (comme le précédent d'ailleurs) a été proposé par Dewdney dans son premier article sur Core War (il est donc en quelque sorte d'intéret historique). Il est aussi très simple, mais toutefois plus efficace que le précédent, dans la mesure ou il peut effectivement planter l'adversaire.

  JMP  2
  DAT  -1
  ADD  #5  -1
  MOV  #0  @-2
  JMP  -2

Ce programme est une sorte de bombardier : il boucle indéfiniment et bombarde une case de la mémoire avec un DAT 0 (pour planter un programme qui serait amené à exécuter cette instruction) à chaque itération. L'adresse est incrémentée à chaque boucle de 5 cases (ADD #5 -1) de manière à balayer la mémoire. DAT -1 est le compteur de l'adresse de la case visée par le projectile, l'instruction MOV #0 @-2 y fait référence comme adresse de destination.

GEMINI

Ce programme est aussi un exemple tiré du premier article de Dewdney. Son intéret est qu'il se reproduit (de manière plus efficace que IMP). Il doit etre vu comme une partie de code d'un programme plus vaste (qui comporterait entre autre une fonction vraiment offensive) ayant la possibilité de se reproduire en mémoire.

  jmp  3
  dat  0
  dat  99
  mov  @-2 @-1
  cmp  -3  #9
  jmp  4
  add  #1  -5
  add  #1  -5
  jmp  -5
  mov  #99 93
  jmp  93

Dans un premier temps, il se reproduit par copie des cases mémoire de son propre code, puis il saute à sa copie.

Le plus simple pour étudier ces programmes est de les charger dans le moteur de Core Warrior et de les exécuter pas à pas pour voir l'effet de chaque instruction.

Vous en savez maintenant assez pour créer vos premiers guerriers ! Pour ce faire, je ne saurait que vous recommander d'installer et lancer l'éditeur de Core Warrior (lancé par le script moteur ou moteur.bat).


Michel CASABIANCA
Last modified: Sun Nov 29 22:46:45 CET 1998