Redcode y Guerras Nucleares Las guerras nucleares se sit£an en el escenario siguiente: un espacio de memoria, con estructura c¡clica, donde luchan dos programas con el objetivo com£n de destruirse uno al otro. En una memoria c¡clica la instrucci¢n que se esta ejecutando esta siempre en la posici¢n 0, la anterior en la -1, la anterior a ‚sta en la -2, y as¡ sucesivamente. Ejemplo : -3 -2 -1 0 <- se esta ejecutando esta instrucci¢n. 1 2 3 En el Redcode rigen las siguientes reglas: þ Un programa pierde cuando no puede ejecutar una instrucci¢n. þ Una instrucci¢n no se puede ejecutar cuando no es valida, como por ejemplo un dato, una instrucci¢n il¢gica o por ejemplo mover algo a un dato inmediato. Instrucciones RedCode tiene las siguientes instrucciones: þmov a b ( 1 ): Mueve los contenidos de la direcci¢n a a la direcci¢n b. þadd a b ( 2 ): A¤ade los contenidos de la direcci¢n a a la direcci¢n b. þsub a b ( 3 ): Resta los contenidos de la direcci¢n a de la direcci¢n b. þjmp a ( 4 ): Transferir el control a la direcci¢n a. þjmz a b ( 5 ): Transferir el control a la direcci¢n a si el contenido de la direcci¢n b es 0. þjmn a b ( 6 ): Transferir el control a la direcci¢n a si el contenido de la direcci¢n b no es 0. þdjn a b ( 7 ): Sustraer 1 del contenido de la direcci¢n b y transferir el control a la a si el contenido de b no es 0. þcmp a b ( 8 ): Compara los contenidos de las direcciones a y b; si son iguales, no ejecuta la instrucci¢n siguiente. þspl b (9): divide el programa, creando un nuevo punto de ejecuci¢n en b. Esto permite tener varios programas en ejecuci¢n.Cuando se llega a una instruccion SPL se ejecuta donde indica el SPL ejecutando despues la instrucci¢n que sigue al SPL. þdat b ( 0 ): Sentencia no ejecutable; b es el valor del dato. Direccionamientos Estas instrucciones utilizan tres modos de direccionamientos, teniendo en cuenta que es siempre relativo a la direcci¢n en la que se encuentra la instrucci¢n: þDirecto: se accede a la direcci¢n de memoria indicada por a o b. Ejemplo MOV 0 1 mueve el contenido de la posici¢n actual de memoria ( es decir, la propia instrucci¢n ) a la posici¢n siguiente. Es decir, que este programa compuesto por una sola l¡nea se copia a s¡ mismo en la l¡nea siguiente y se sigue ejecutando. Le llamaremos IMP o TRASGO. Ejemplo: ADD 0 1 le suma a la direcci¢n actual el contenido de la direcci¢n siguiente, con lo cual convierte la instrucci¢n actual en algo absolutamente diferente, pero eso le trae sin cuidado, porque luego va a ejecutar la instrucci¢n siguiente. þIndirecto: se indica con @, y lo que se utiliza no es el contenido de la direcci¢n indicada, sino el contenido de la direcci¢n contenida dentro de la misma. Es igual que el direccionamiento indirecto habitual. Ejemplo: ADD #1 @-5: En la direcci¢n -5 ( es decir, la quinta a partir de la actual contando hacia atr s ) est  el n£mero 100. Entonces, le suma 1 al contenido de la direcci¢n 100, contando desde la -5, que es donde estaba el 100. Una variante de este es el indirecto con decremento, que se indica con <, funciona igual que el indirecto pero antes de tomar la direcci¢n que indica b le resta 1. Ejemplo : ADD #1 <-5 : En la direcci¢n -5 hab¡a un 100 pues le resta 1 y se queda en 99, entonces le suma 1 a lo que haya en la 99, contando a partir de donde esta el 99. þInmediato: se indica con #, y no se utiliza una direcci¢n de memoria, sino el n£mero indicado. Ejemplo: ADD #1 1 le a¤ade 1 a la instrucci¢n siguiente, es decir, la contenida en la posici¢n relativa de memoria +1. No se podr  utilizar en muchos casos como segundo campo de la direcci¢n, ya que este es el que indica habitualmente la direcci¢n de destino. C¢digo m quina En c¢digo m quina RedCode, las instrucciones se codifican de la forma siguiente: þUn campo para indicar el c¢digo de operaci¢n (opcode). þOtros dos campos para indicar los dos modos de direccionamiento: 0 inmediato, 1 directo, 2 indirecto, 3 indirecto con decremento. þOtros dos campos para indicar las dos direcciones. Si alguno de los dos est  libre o no existe en esa instrucci¢n, se codifica como 0000. Esto se tiene que codificar en 24 bits. El opcode tendr  4 bits, los modos 4 bits, y las direcciones 16 bits cada una, por ejemplo. Aunque muy bien se puede representar como matrices, y no meterlos en un n£mero de bits m£ltiplo de ocho. Ejemplos ENANO: Es un programa que se dedica a lanzar DAT b, coloc ndolos en posiciones de memoria que var¡an de 5 en 5. DAT -1 ADD #5 -1 MOV -2 @-2 JMP -2 GEMINI: Programa que se copia a s¡ mismo a una nueva posici¢n en la memoria. DAT 7 DAT 99 MOV @-2 @-1 þÄÄ¿ SUB #1 -2 ³ DJN -2 -4 þÄÄÄÙ MOV #99 89 MOV #7 87 JMP 88 Este bicho tiene simplemente un bucle que copia el contenido de una direcci¢n en otra, y luego transfiere el control a la nueva posici¢n del bicho, que estar  88 posiciones m s adelante. En los dos casos los programas empiezan por DAT por lo que no se pueden ejecutar, as¡ que habr  que ponerle un JMP al principio indicando la direcci¢n donde va a empezar o bien al final del programa usar la pseudoinstruccion END indicando a continuaci¢n con una etiqueta donde va a comenzar. Ejemplo : DAT 4 DAT 20 PRINC MOV -1 2 JMP -1 END PRINC Tambi‚n se pueden hacer los programas con etiquetas, por ejemplo el ENANO quedar¡a. CONTAD DAT -1 PRINCP ADD #5 CONTAD MOV CONTAD @CONTAD JMP PRINCP END PRINCP REGLAS 90 1.- Las batallas duraran la ejecucion de 125.000 instrucciones. 2.- El tama¤o de la memoria donde se efectuara la batalla sera de 8 Ks. 3.- El numero maximo de instrucciones por guerrero sera de 64. 4.- No habra limite en la division de los guerreros (producida por SPL).