# 4 bits, 8 bytes

4 bits, 8 bytes is an assembly language invented by User:TheBigH for a 4-bit CPU. It is inspired by 2 Bits, 1 Byte.

## Commands

Command (Binary) Command (Disassembled) What it does
0000 NOP Do nothing (a NOP)
0001 ACT ACTion. Given value in memory, completely mix it up according to the following:

0000 -> 1100 -> 0110 -> 0010 -> 0111 -> 1000 -> 0001 -> 1011 -> 0100 -> 0011 -> 1110 -> 0101 -> 1001 -> 1010 -> 1101 -> 1111 -> 0000

0010 INC Given value in memory, INCrease given value (wraps)
0011 DEC Given value in memory, DECrease given value (wraps)
0101 NEG NEGate given address by flipping all of it's bits.
0110 REV Given value in memory, REVerse it's bits. For example, 0001 becomes 1000.
1000 CJZ Conditional Jump but Zero. Like CJM except zero instead of nonzero.
1001 LSH Given value in memory, perform a logical Left SHift on it.
1010 RSH Given value in memory, perform a logical Right SHift on it.
1011 SWP Given two addresses, SWaP the values of them.
1100 NND Given three addresses, NaND the first two addresses together and store the result in the third.
1101 OUT Given a 4 bit number, OUTput the value of that byte as a char*. If the number is more than 7, 8 gets subtracted from it.
1110 OUB OUtputs all Bytes as chars*.
1111 TEM TErMinates the program.
```*This uses a modified version of Windows-1252. Here's a chart:
0123456789abcdef

0 ○■↑↓→←║═╔╗╚╝░▒►◄
1 │─┌┐└┘├┤┴┬♦┼█▄▀▬
2 ▓!"#\$%&'()*+,-./
3 0123456789:;<=>?
4 @ABCDEFGHIJKLMNO
5 PQRSTUVWXYZ[\]^_
6 `abcdefghijklmno
7 pqrstuvwxyz{|}~√
8 €‚ƒ„…†‡ˆ‰Š‹ŒŽ♣♥♠
9 ‘’“”•–—˜™š›œž↊↋Ÿ
b °±²³´µ¶·¸¹º»¼½¾¿
c ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
d ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
e àáâãäåæçèéêëìíîï
f ðñòóôõö÷øùúûüýþÿ
```

The instruction pointer can wrap around, thus allowing more "complicated" programs. Since the memory is 8 bytes, you can represent the entire program with just 8 characters. For example:

```AAAAAAAA
```

becomes:

```0100000101000001010000010100000101000001010000010100000101000001
```

which, when disassembled, becomes:

```JMP 0x1
JMP 0x1
JMP 0x1
JMP 0x1
JMP 0x1
JMP 0x1
JMP 0x1
JMP 0x1
```

## Programs

### Quine

Any program beginning with ï is a quine, for example

```ïAmQuine
```

because when disassembled, ï becomes:

```OUB
TEM
```

also

```►aQuine◄
```

is a self-referential Quine.

### Output any 3 characters

```ÕÖ×ð○???
```

where the ??? is replaced with the 3 characters. When disassembled, this becomes:

```OUT 0x5
OUT 0x6
OUT 0x7
TEM
NOP
NOP
NOP
?
```

### Output N forever

```uÎ♠HNÜŽ´ (a randomly generated program)
```

### Truth Machine

```√m√×F○○?
```

where the ? is replaced with 0 or 1 (number or char). When disassembled, this becomes:

```CJM 0xF 0x6
OUT 0x7
TEM
OUT 0x7
JMP 0x6
NOP
NOP
NOP
NOP
?
```

### Infinite loop

```○○○○○○○○
```