This repo is a minimalist implementation of the Conway's Game of Life in IA-32 Assembly using
ANSI/TERM to handle the "graphics". Until now it was written to run on the following platforms:
This project is just a try of writing a multi-platform software in pure ASSEMBLY (fully functional) which takes advantage of LIBC.
You can also find more details about some specific parts of this code in my article for BSD Magazine.
Pretty simple:
you@IA32BOX:~/src# git clone https://github.com/rafael-santiago/life life
Done.
I have built it using the GNU Assembler (a.k.a gas). You can use the build system or do it
on your own (in this case my code is using the libc). If you are on Windows the
MINGW is also needed because we use it to link, otherwise the linking would be much harder.
This tiny project uses my own build system. After following
all steps to make hefesto work in your system, you should "teach" your build system copy how to handle the
GNU Assembler. You need three commands:
root@IA32BOX:~/src# git clone https://github.com/rafael-santiago/helios helios
root@IA32BOX:~/src# cd helios
root@IA32BOX:~/src/helios# hefesto --install=gnu-asm-toolset
Done.
After doing it your hefesto copy will know how to handle the assembler that we need. By the way, your
helios copy can be deleted.
Now, inside your life copy, move to the src sub-directory and just call hefesto from there.
you@IA32BOX:~/src/life# cd src
you@IA32BOX:~/src/life/src# hefesto
An ELF called life will be created under the path ../bin and that's it.
If for some reason you are wanting a debug version of it:
you@IA32BOX:~/src/life/src# hefesto --compile-model=debug
...and good luck! ;)
If you prefer/need to inform your dynamic loader path, try to use the option --ld-path when calling hefesto:
you@IA32BOX:~/src/life/src# hefesto --ld-path=/usr/libexec/ld-elf.so.1
If you are facing some problems related with the target architecture, you should try:
you@IA32BOX:~/src/life/src# hefesto --address-model=32
I think that ASSEMBLY people are not choosy, so build it by hand is pretty straightforward to them. Even so I took care
to write all this stuff in one single file (src/life.s). If you are on a platform listed in Table 1 you should add to
the as command line the option -dsym SYMBOL=1. In Table 1 you can find the correct symbol to your current
platform.
AFAIK, on Solaris the as is related to its native assembler, due to it you should call gcc or "gas".
Table 1: A thing that you probably already know.
| Platform | SYMBOL |
|---|---|
![]() |
__FreeBSD__ |
![]() |
__OpenBSD__ |
![]() |
__NetBSD__ |
![]() |
_WIN32 |
Yes! The same macros that we commonly use when writing C programs... ;)
If everything else has failed when trying to compile it... Give a try with GCC:
you@IA32BOX:~/src/life/src# gcc -nostartfiles life.s -olife
The command above should be executed in 32-bit machines, for 64-bit machines:
you@IA64BOX:~/src/life/src# gcc -m32 -nostartfiles life.s -olife
Yes, instead of using -dsym SYMBOL=1 you should use -DSYMBOL=1 when trying with GCC.
Being under the src sub-directory you should do the following:
you@IA32BOX:~/src/life/src# hefesto --install
If your UNIX-like has the directory /usr/games, life will be installed there. On some UNIXes this directory
is not exported, so you should call /usr/games/life instead of life. On Windows it will be installed on C:\life.
The path is not exported on Windows, do it yourself (google about how to do it, if you do not know).
If you want to uninstall:
you@IA32BOX:~/src/life/src# hefesto --uninstall
This application works based on command line, if you call on your console just life without passing any argument, as a result
you will see a black screen. You need to inform the initial state of the board and also can inform other things if you want to. Take a look
at the Table 2 to see more about the command line options.
Table 2: Supported command line options until now.
| Option | Description | Passing sample |
|---|---|---|
--interactive |
Indicates that before each new generation an ENTER is expected |
life --interactive |
--alive-color=color |
Defines the color for representing alive cells. The colors should be: black, red, green, blue, magenta, cyan or white |
life --alive-color=cyan |
--dead-color=color |
Defines the color for representing dead cells. The colors should be: black, red, green, blue, magenta, cyan or white |
life --alive-dead=green |
--delay=milliseconds |
Indicates the amount of time (in milliseconds) to wait before the next generation | life --delay=1000 |
--generation-nr=n |
Sets a limit for the game loop | life --generation=100 |
--board-size=n |
Defines the size of the square shaped board. The values should be between 2 and 45 |
life --board-size=10 |
--y,x. |
Makes a cell under (y;x) coordinate alive | life --0,0. |
--no-ansi-term |
Inhibits the usage of ANSI/TERM resources |
life --no-ansi-term |
On Windows is possible to get a colored output if you run the program from MSYS or Cygwin. Still on Windows if you are
using a normal command prompt, the program will detect it and use --no-ansi-term automatically, you do not have to worry about.
Now let's see some practical command line samples... Let's start with a block at the beginning of the board:
you@IA32BOX:~/src/life/src# life --0,0. --0,1. \
> --1,0. --1,1.
A blinker, using the color magenta for the alive cells:
you@IA32BOX:~/src/life/src# life --2,1. \
> --2,3. --2,4. --alive-color=magenta
Well, I think that you understood.
The Table 3 gathers famous patterns.
Table 3: Some oscillators.
| Pattern | Sample |
|---|---|
Blinker |
![]() |
Beacon |
|
Toad |
![]() |
Pulsar |
![]() |
For example, to produce the Pulsar oscillator in Table 3, I have used the following command line:
you@IA32BOX:~/src/life/src# life --2,4. --2,5. --2,6. \
> --4,2. --5,2. --6,2. \
> --4,7. --5,7. --6,7. \
> --7,4. --7,5. --7,6. \
> --2,10. --2,11. --2,12. \
> --4,9. --5,9. --6,9. \
> --7,10. --7,11. --7,12. \
> --4,14. --5,14. --6,14. \
> --9,4. --9,5. --9,6. \
> --10,2. --11,2. --12,2. \
> --14,4. --14,5. --14,6. \
> --10,7. --11,7. --12,7. \
> --9,10. --9,11. --9,12. \
> --10,9. --11,9. --12,9. \
> --14,10. --14,11. --14,12. \
> --10,14. --11,14. --12,14. \
> --delay=500 --alive-color=cyan
Yes, it is not for cowards..
To exit the program you should hit CTRL + c. In some shell types you must confirm it with an ENTER.









