Skip to content

Commit 3a5aa87

Browse files
committed
implement JSTR
1 parent 33bcdd6 commit 3a5aa87

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

src/main/java/com/falsepattern/jfunge/interpreter/instructions/Funge98.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.FPSP;
1515
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.HRTI;
1616
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.INDV;
17+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.JSTR;
1718
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODE;
1819
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODU;
1920
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.NULL;
@@ -63,6 +64,7 @@ public class Funge98 implements InstructionSet {
6364
addFingerprint(FIXP.INSTANCE);
6465
addFingerprint(HRTI.INSTANCE);
6566
addFingerprint(INDV.INSTANCE);
67+
addFingerprint(JSTR.INSTANCE);
6668
addFingerprint(MODE.INSTANCE);
6769
addFingerprint(MODU.INSTANCE);
6870
addFingerprint(NULL.INSTANCE);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.falsepattern.jfunge.interpreter.instructions.fingerprints;
2+
3+
import com.falsepattern.jfunge.interpreter.ExecutionContext;
4+
import com.falsepattern.jfunge.interpreter.instructions.Fingerprint;
5+
import com.falsepattern.jfunge.util.MemoryStack;
6+
import lombok.AccessLevel;
7+
import lombok.Cleanup;
8+
import lombok.NoArgsConstructor;
9+
import lombok.val;
10+
11+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
12+
public class JSTR implements Fingerprint {
13+
public static final JSTR INSTANCE = new JSTR();
14+
@Override
15+
public int code() {
16+
return 0x4a535452;
17+
}
18+
19+
@Instr('P')
20+
public static void putString(ExecutionContext ctx) {
21+
val stack = ctx.stack();
22+
val ip = ctx.IP();
23+
val fs = ctx.fungeSpace();
24+
@Cleanup val mStack = MemoryStack.stackPush();
25+
val position = mStack.vec3i();
26+
val delta = mStack.vec3i();
27+
28+
val count = stack.pop();
29+
stack.popVecDimProof(ctx.dimensions(), position);
30+
stack.popVecDimProof(ctx.dimensions(), delta);
31+
32+
position.add(ip.storageOffset());
33+
for (int i = 0; i < count; i++) {
34+
fs.set(position, stack.pop());
35+
position.add(delta);
36+
}
37+
}
38+
39+
@Instr('G')
40+
public static void getString(ExecutionContext ctx) {
41+
val stack = ctx.stack();
42+
val ip = ctx.IP();
43+
val fs = ctx.fungeSpace();
44+
@Cleanup val mStack = MemoryStack.stackPush();
45+
val position = mStack.vec3i();
46+
val delta = mStack.vec3i();
47+
48+
val count = stack.pop();
49+
stack.popVecDimProof(ctx.dimensions(), position);
50+
stack.popVecDimProof(ctx.dimensions(), delta);
51+
52+
position.add(ip.storageOffset());
53+
stack.push(0);
54+
for (int i = 0; i < count; i++) {
55+
stack.push(fs.get(position));
56+
position.add(delta);
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)