Subskin
Subskin is an OISC variant with a very short (148 bytes of code) Ruby implementation written by Jannis Harder in 2005. Subskin is an abbreviation for "subtract and skip if negative", which is the only instruction.
The machine
The instruction
Each instruction has 3 words called (AP BP RP).
The instruction is
if( (memory[IP[2]]=memory[IP[0]]-memory[IP[1]]) < 0) skip();
or
if( (*RP = *AP - *BP) <0) skip();
Negative memory offsets result in undefined behavior.
Memory
The memory consists of an infinitely large array of signed bignums. If an undefined memory value is read, the program terminates.
Registers
There are 3 memory mapped registers
- IP (Instruction Pointer) at position 0.
- OR (Output Register) at position 1. If >= 0 it is written as character. Values >= 256 result in termination of the program. After printing the character it is set to -1.
- IR (Input Register) at position 2. If < 0 a byte from STDIN is read and written into the register. On EOF a 256 is written into IR.
The Register actions for Input and Output are evaluated before the instruction.
The implementation
The implementation is 148 bytes of Ruby code released into the public domain.
Source code
m=readlines.map{|e|e.hex};loop{m[1]<0||$><<m[1].chr&&m[1]=-1;m[2]<0&&m[2]= STDIN.getc||256;a,b,c=m[m[0],3];q=(m[c]=m[a]-m[b])<0?6:3;m[0]+=q}rescue 0
File format
Subskin code files (.subskin) contain one word of memory on each line in hex representation. Empty lines / lines without hex numbers are counted as zeros. The hex number has to be the first non-space character on the line, all characters after the first hex number are ignored.
Examples
Cat program
3
-1
0
6
7
2
0
1
0
2
6
1
D
3
0
Hello, world!
4
48
0
10
3
2
7
0
2
1
3
1
3
8
9
0
65
6c
6c
6f
2c
20
77
6f
72
6c
64
21
a
100
Hello, world! 2 (Improved)
3
48
0
c
2
1
3
1
3
0
0
0
65
6c
6c
6f
2c
20
77
6f
72
6c
64
21
a
100
Hello, world! 3 (Improved again)
See Hello world program in esoteric languages#Subskin