Giter VIP home page Giter VIP logo

corewar's Introduction

Corewar

Introduction

The Corewar Epitech project is about champion fighting simulation. Pseudo-assembly programs are run in a virtual machine, and the goal is to call last the special instruction live.

The Corewar is the project that ends the first year of Epitech, It is a competition between the different groups of the promotion. The prizes are Corewar sweaters for the best team.

We won !! ๐Ÿ†

Virtual Machine (alias VM)

  • The arene consists of 4096 bytes;
  • The arene is circular, meaning that if a champion try to go out of bounds, he's back on the other side of the arene;
  • Each instruction executes only at the end of its cycle (and waits for its entire duration);

Champions

The bytecode of the champions are made thanks to the asm part of the project. It translate the .s files into .cor binary used by the VM to run the champion.

Usage

A champion program is a pseudo-assembly program, with the following syntax:

# This is a comment
    .name "<champion name>"
    .comment "<champion description>"

label: # This is a label
    live r1 # This is an instruction
    ld %42, r2 # Load the direct value 42 into the register r2
    ld 42, r3 # Load the indirect value at address 42 into the register r3
    zjmp %:label # Jump to the label

You can then compile your champion program with the asm program:

asm/asm champion.s
ls -l champion.cor

You can then use it with the corewar program:

corewar/corewar champion.cor champion.cor champion2.cor

List of Instructions

Here is the translation of the provided mnemonic instructions and their effects into English:

Mnemonic Effects
0x01 (live) Followed by 4 bytes representing the player number. This instruction indicates that this player is alive. (no parameter encoding byte).
0x02 (ld) This instruction takes 2 parameters, the second of which must be a register (not the PC). It loads the value of the first parameter into the register. This operation modifies the carry. ld 34,r3 loads REG_SIZE bytes from the address (PC + (34 % IDX_MOD)) into register r3.
0x03 (st) This instruction takes 2 parameters. It stores (REG_SIZE bytes) the value of the first argument (always a register) into the second. st r4,34 stores the value of r4 at the address (PC + (34 % IDX_MOD)), st r3,r8 copies r3 into r8.
0x04 (add) This instruction takes 3 registers as parameters, adds the contents of the first two, and puts the result into the third. This operation modifies the carry. add r2,r3,r5 adds r2 and r3 and puts the result into r5.
0x05 (sub) Same as add but subtracts.
0x06 (and) p1 & p2 -> p3, where the third parameter is always a register. This operation modifies the carry. and r2,%0,r3 puts r2 & 0 into r3.
0x07 (or) Same as and but with bitwise OR (| in C).
0x08 (xor) Same as and but with bitwise XOR (^ in C).
0x09 (zjmp) This instruction is not followed by bytes to describe parameters. It always takes an index (IND_SIZE) and jumps to that index if the carry is one. If the carry is zero, zjmp does nothing but consumes the same time. zjmp %23 sets (PC + (23 % IDX_MOD)) in the PC if carry == 1.
0x0A (ldi) This operation modifies the carry. ldi 3,%4,r1 reads IND_SIZE bytes at the address: (PC + (3 % IDX_MOD)), adds 4 to this value. Let's call this sum S. It reads REG_SIZE bytes at the address (PC + (S % IDX_MOD)) and copies them into r1. Parameters 1 and 2 are indices.
0x0B (sti) sti r2,%4,%5 sti copies REG_SIZE bytes from r2 to the address (4 + 5). Parameters 2 and 3 are indices. If parameters 2 or 3 are registers, their contents are used as an index.
0x0C (fork) This instruction is not followed by bytes to describe parameters. It always takes an index and creates a new program that runs from the address:(PC + (first parameter % IDX_MOD))
fork %34 creates a new program. The new program inherits various states from the parent.
0x0D (lld) Like ld without %IDX_MOD. This operation modifies the carry.
0x0E (lldi) Like ldi without %IDX_MOD. This operation modifies the carry.
0x0F (lfork) Like fork without %IDX_MOD. This operation modifies the carry.
0x10 (aff) This instruction is followed by a parameter byte to describe the parameters. It takes a register as a parameter and displays the character whose ASCII code is present in that register. (a modulo 256 is applied to the ASCII code, and the character is displayed on the standard output).
Example: ld %42,r3 then aff r3 displays '*' on the standard output.

corewar's People

Contributors

thibauthh avatar neo-diamons avatar neo-jgrec avatar justineloizel avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.