Made from 100% programmer art.

Support Me

Related Posts

How to Write Emulator - Fetch Decode Execute Cycle
The beating heart of any CPU is the fetch-decode-execute cycle. It is the same for our simulator
Read More…
How to Write Emulator - Automating Tedious Programming with Excel
Sometimes you have to type out almost identical lines of code, and it’s either time consuming or error prone. Here’s how to avoid it all by using some clever Excel techniques.
Read More…
How to Write Emulator - Opcodes Jumptables
How to efficiently store and execute many small functions, without using a single if statement or switch
Read More…

How to Write Emulator - Intro

To begin, this isn’t technically an emulator, the system I’m trying to model isn’t real. This is more of a simulator, but that’s less of a catchy search word on the Internet.

What is Core War

“Core War is a 1984 programming game created by D. G. Jones and A. K. Dewdney in which two or more battle programs (called “warriors”) compete for control of a virtual computer. These battle programs are written in an abstract assembly language called Redcode.” Wikipedia

There are some terms that are helpful to know, and which I will probably end up mixing together

  • Core War - This is the programming game itself
  • Warrior - A program written in Redcode
  • Redcode - The assembly language
  • MARS - Memory Array Redcode Simulator. The actual simulator.
  • Core - The memory where the programs run

What I’m Making

I’m making a version of the MARS in C++, which can run and interpret the Redcode programming language. The aim being to create a simulator that can load and execute Redcode programs, displaying the state of the simulator and possibly allow running programs to be debugged.

Redcode

Redcode is a type of assembly language, modelled after CISC assembly languages of the 1980s. It looks like this:

ADD.AB  #   4, $   3
MOV.F   $   2, @   2
JMP.B   $  -2, $   0
DAT.F   #   0, #   0

Each instruction contains an opcode and two operands. The opcode can have an optional modifier, and the operands can have optional addressing modes. The combination of the simple opcodes with the modifiers and addressing modes allows complex “Warriors” to be created. The aim being to write a warrior that will outlast all the other running warriors in the simulation.

Steps Required

To make this work, I need to create the following sections

  • A simulation of the machine’s RAM (called the “core”). This is 8000 bytes of contiguous memory which is treated as a circular array. The ends wrap around.
  • The MARS itself. A Redcode simulator follows a well defined Fetch-Decode-Execute cycle where each instruction takes one cycle to complete.
  • A file parser for source code. A programmable machine is of no use if there’s no way to get code into it, after all!
  • Visual display. Most CoreWar simulators show the core as a grid of blocks so you can watch the programs running. Some allow programs to be disassembled or stepped through.

Did you like this post?

if you did, it'd be really nice if you shared it, or left a comment below

Leave comments here!