@ stackrotate
@ Description:
@ Maximum rotation depth is 14. Stomps on heap[1]-heap[15].
+@ Assumes rotation depth is at least 2.
@ Call Stack:
@ stack word n
@ ...
@ For the convenience of other functions, modulo the
@ rotation depth by the available registers.
-SSSTTTSN | PUSH 14
+SSSTTTTN | PUSH 15
TSTT | MODULO
@ Use heap[15] for generating register addresses.
+@ TODO: Switch to using heap[1] so number of registers is limited only by user.
SSSTTTTN | PUSH 15 (ptr)
SSSSN | PUSH 0
TTS | STORE
@ stackrotatereverse
@ Description:
@ Maximum rotation depth is 14. Stomps on heap[1]-heap[15].
+@ Assumes rotation depth is at least 2.
@ Call Stack:
@ stack word n
@ ...
@ For the convenience of other functions, modulo the
@ rotation depth by the available registers.
-SSSTTTSN | PUSH 14
+SSSTTTTN | PUSH 15
TSTT | MODULO
@ Use heap[15] for generating register addresses.
+@ TODO: Switch to using heap[1] so number of registers is limited only by user.
SSSTTTTN | PUSH 15 (ptr)
SSSSN | PUSH 0
TTS | STORE
--- /dev/null
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTTTTSTSSN | PUSH 244
+SSSTTTTSSTTN | PUSH 243
+SSSTTTTSSTSN | PUSH 242
+
+SSSTTTSN | PUSH 14
+NSTTSTSN | JSR > 1010 (stackrotate)
+SSSTSSSN | PUSH 8
+NSTTSTSN | JSR > 1010 (stackrotate)
+SSSTSN | PUSH 2
+NSTTSTSN | JSR > 1010 (stackrotate)
+
+SSSTTSTN | PUSH 13
+NSTTTTSSTN | JSR > 111001 (dumpstack)
+NNN | DIE
+
+#include <stack.pvvs>
+#include <debug.pvvs>
--- /dev/null
+SSSTTTTSTSSN | PUSH 244
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+
+SSSTTTSN | PUSH 14
+NSTTSTTN | JSR > 1011 (stackrotatereverse)
+SSSTSN | PUSH 2
+NSTTSTTN | JSR > 1011 (stackrotatereverse)
+
+SSSTTSTN | PUSH 13
+NSTTTTSSTN | JSR > 111001 (dumpstack)
+NNN | DIE
+
+#include <stack.pvvs>
+#include <debug.pvvs>
--- /dev/null
+SSSTTTTSTSSN | PUSH 244
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+SSSTN | PUSH 1
+
+@SSSTTTSN | PUSH 14
+SSSTTSTN | PUSH 13
+NSTTTSSN | JSR > 1100 (deepdup)
+SSSTSN | PUSH 2
+NSTTTSSN | JSR > 1100 (deepdup)
+
+SSSTTTSN | PUSH 14
+NSTTTTSSTN | JSR > 111001 (dumpstack)
+NNN | DIE
+
+#include <stack.pvvs>
+#include <debug.pvvs>
# Format: ['filename_without_extension', 'string for stdin', 'string for expected stdout']
['0001_dumpstack', '', 'TOS:\n1:\t+42\n0:\t+255\n'],
['0002_dumpheap', '', '32:\t+255\n33:\t+42\n'],
+ ['1001_stackrotate', '', 'TOS:\n13:\t+1\n12:\t+244\n11:\t+1\n10:\t+1\n9:\t+1\n8:\t+1\n7:\t+1\n6:\t+243\n5:\t+1\n4:\t+1\n3:\t+1\n2:\t+1\n1:\t+1\n0:\t+242\n'],
+ ['1002_stackrotatereverse', '', 'TOS:\n13:\t+1\n12:\t+244\n11:\t+1\n10:\t+1\n9:\t+1\n8:\t+1\n7:\t+1\n6:\t+1\n5:\t+1\n4:\t+1\n3:\t+1\n2:\t+1\n1:\t+1\n0:\t+1\n'],
+ ['1003_deepdup', '', 'TOS:\n14:\t+1\n13:\t+244\n12:\t+1\n11:\t+1\n10:\t+1\n9:\t+1\n8:\t+1\n7:\t+1\n6:\t+1\n5:\t+1\n4:\t+1\n3:\t+1\n2:\t+1\n1:\t+1\n0:\t+244\n'],
]
for test in tests: