MakarafaC

From Esolang
Jump to navigation Jump to search
FUUUCK!! I HATE IT!!
MakarafaP's profile picture but i drew it in two minutes

MakarafaC is an esolang designed by User:Dtp09. It is a non-textual, 8-bit language invented as an inside joke between a discord server about Vocaloid Lost Media.

MakarafaC reads programs as various images that come from different songs in what is known as "The Heart Series", a set of 13 songs made by a producer known as MakarafaP. Every song within the heart series is accompanied with a video, and each video contains a single heart that persists throughout the whole song. In the context of MakarafaC, only 11 of these hearts are used, excluding the 2 remasters (those being the ones with the black heart and white background.)

The name MakarafaC is a combination of MakarafaP (producer of the heart series) and C, as in the programming language C.

Specifications

  • 2^16 hearts of ROM (this is the program)
  • 64kb addressable RAM initialized to 0
    • $0000-$DEFF: work RAM
    • $DF00-$DFFF: 256 byte stack
    • $E000-$EFFF: 4096 bytes user input in ASCII
    • $F000-$FFFF: 4096 bytes output in ASCII
    • ALL 64kb is usable!
  • Stack pointer initialized to 0 and ascends
  • 16 bit address register to access RAM. Writing a byte to this register will write to either the higher byte (if "The Bit" is 0) or the lower byte (if "The Bit" is 1), and then flip "The Bit".
  • "The Bit" is used as a compare flag for conditional jumping, as well as determines to write to the high or low byte of address register, and also determines which operation the math instruction will preform. "The Bit" is is flipped on every write to address register, and initialized to 0 (first write to address register is to the high byte).
  • 8 bit Accumulator register

Instructions

Heart Instruction
Load immediate to accumulator/
Load value at address to accumulator
Pull from stack to accumulator
Push from accumulator to stack
Write accumulator to address register
Write accumulator to stack pointer
Set "The Bit" if accumulator == top stack value
NAND accumulator with top stack value
Pull from stack, if "The Bit" is set, add to accumulator. else, subtract.
Jump to address in ROM if "The Bit" is set
Set "The Bit" if accumulator > top stack value (unsigned)

Load immediate to accumulator

Immediate values are written as a three heart wide operand, with each heart treated as three bits, totaling a nine bit operand.

Load Instruction
Heart 1 Heart 2 Heart 3
8 7 6 5 4 3 2 1 0
Heart Values
Heart Binary
000
001
010
011
100
101
110
111

The lower of the 8 bits represent the value being loaded. The eighth bit (in red) will determine where the value will be loaded.

  • 8th bit clear: load to accumulator
  • 8th bit set: terminate the programe lol

"The Bit"

"The Bit" is the greatest obstacle one can face while programming for MakarafaC. As such, it must be spelled with double quotes and capital letters, and cannot be used in the third person too often. "The Bit" is used for writing to the address register, jumping, and arithmetic, and may only be flipped (writing to the address register) and set/clear (with a comparison) which both rely on the accumulator to be in the right state, or the program may fail.

Depending on the context in which you would need to set/clear "The Bit", there may be a shorter method possible (such as overwriting a known byte of address register), but both of these should work in basically any case, if need be.

Setting "The Bit"

  • Push the accumulator to the stack
  • Top of stack == accumulator (always true)
  • Pull from the stack (accumulator left unchanged, stack position restored)

Clearing "The Bit"

  • Push the accumulator to the stack
  • Push 0 to the stack
  • Load 1 to accumulator
  • Top of stack == accumulator (0 != 1, bit is cleared)
  • Pull twice, restoring original accumulator.