Mode Spam

From Esolang
Jump to navigation Jump to search

Mode Spam is an esoteric programming language where there are different modes. They all affect commands, input, and output in some way.

This is still a work in progress. It may be changed in the future.

Language overview

Mode Spam uses a 2-dimensional grid as its memory. It is infinitely long in every direction. Along with that, Mode Spam has an accumulator which you can store values to. Mode Spam uses .modespam file extensions.

Modes

Mode Brief description
1. Basic Math and Memory Move around the memory grid and use commands to manipulate it. Store and retrieve numbers from the accumulator and memory. Do basic math operations, like adding and subtracting.
2. Pixel Grid Move around the memory grid and a 256x256 pixel grid (which is a form of output) and change pixel colors.
3. Input Move around the memory grid and take input from the user. Includes number and character input.
4. Output Move around the memory grid and output values.
5. Data Retrieval Move around the memory grid and retrieve all sorts of data, like the current Unix timestamp.

By default the program will start in the first mode.

Pixel grid colors

Here are all the colors. Each color is associated with a number that will be used when changing or reading a pixel's color.

Black (#000000)   0
Red (#FF2626)   1
Orange (#FF8026)   2
Yellow (#FFFF26)   3
Green (#26FF26)   4
Blue (#2626FF)   5
Purple (#8026FF)   6
Pink (#FF26FF)   7
White (#FFFFFF)   8

Instructions

Universal instructions

These are instructions that work in any mode.

Opcode Description
> < ^ v Move the memory pointer one cell. This is available in all modes.
, . Increment/decrement the active cell by one.
[ ] brainfuck-style loops. They function the same way.
z Switch between modes. Switches to the mode number of the active cell's value mod 6.

1. Basic math and memory mode

The accumulator can only be accessed in this mode.

Opcode Description
} Memory to accumulator. Loads the active cell's value into the accumulator.
{ Accumulator to memory. Replaces the active memory cell's value with the value of the accumulator.
+ Accumulator = accumulator + active memory cell
- Accumulator = accumulator - active memory cell
* Accumulator = accumulator * active memory cell
/ Accumulator = accumulator / active memory cell. Does float division.
% Accumulator = accumulator mod active memory cell. Does division but returns only the remainder.
\ Accumulator = accumulator ^ active memory cell.
r Rounds the accumulator to the closest integer.
R Rounds the accumulator up.
? Sets the accumulator to a random integer between the accumulator and the active memory cell, inclusive.
s Swaps the accumulator and active memory cell's value.

2. Pixel grid mode

The pixel grid is a 256x256 grid where each pixel can have 9 different colors. The pixel pointer (the one that chooses which pixel is active) starts in the upper-left corner. If the pixel pointer moves out of bounds, then it will wrap around to the other side.

Opcode Description
w a s d Move the pixel pointer up, left, down, or right one pixel in the pixel grid.
} Memory to pixel. Changes the color of the current pixel to the value of the active memory cell's value mod 9.
{ Pixel to memory. Sets the value of the active memory cell to the color value of the current pixel.
? Sets the current pixel to a random color.
f Flips the current pixel. Black will become white and vice versa. This only works if the pixel is either black or white.

3. Input mode

If an input operation receives nothing, then it will default to 0.

Opcode Description
i Take one number as input and store it in the active cell.
I Take one character as input and store its Unicode value in the active cell.

4. Output mode

Opcode Description
o Outputs the active cell's value as a number
O Outputs the active cell's value as a Unicode character.

5. Data Retrieval mode

This mode is optional for interpreters. So far, this is all that I've added, and more may be added. This is kind of the little joke section, where there are many random things to retrieve that don't really have a real purpose.

Opcode Description
t Sets the active cell's value to the current Unix timestamp.
l Sets the active cell's value to the length of the program (excluding whitespace)
L Sets the active cell's value to the current program counter.

Examples

Hello, world!

brainfuck-style

It's possible to copy over a program and modify it to output values correctly.

Brainfuck program: (this is pretty unoptimized but I made it this way so that it's easier to output)

>++++++++++
[>+++++++>++++++++++>+++++++++++>+++++++++++>+++++++++++>++++>+++>
+++++++++>+++++++++++>+++++++++++>+++++++++++>++++++++++>+++<[<]>-]
>++>+>-->-->+>++++>++>--->+>++++>-->>+++
[<]>[.>]

Mode Spam version

For the Mode Spam version, all you have to do is change the . to O, change the + and - to , and ., and change to output mode.

>,,,,,,,,,,
[>,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,>,,,>
,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,>,,,<[<]>.]
>,,>,>..>..>,>,,,,>,,>...>,>,,,,>..>>,,, // gets all the values for outputting
[<]
,,,,z // switch to output mode
>[O>]

A + B Problem

,,, z  // to input mode
i>i    // take the 2 inputs
>,z    // to basic mode
<}     // store second value to accumulator
<+     // add
{      // store back to cell
<,,,,z // to output mode
> o    // output

Cat program (one time)

,,, z   // input mode
I       // input (char)
>,,,, z // output mode
< O     // output (char)

Cat program (indefinite)

,,,^,,,, // input mode top, output mode bottom
vz       // input mode
>,       // 1
[
    <z>>I<<^zv>>O< // I think this will work
] // loop indefinetly