X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/ae1f85a178241c826a0b6a72ace12049b9907561..23d1724712fae7dc9645d862d57d030cf3e2e764:/stdlib/heap.pvvs diff --git a/stdlib/heap.pvvs b/stdlib/heap.pvvs index 3fa352c..4953fad 100644 --- a/stdlib/heap.pvvs +++ b/stdlib/heap.pvvs @@ -277,7 +277,10 @@ NTN | RTS @ TOS+1 -> heap[2] @ ... @ TOS+n -> heap[count] -@ This is the only stdlib function which uses heap[0] for storage. +@ This function uses heap[15] for temporary storage, thus limiting the total +@ registers to 14 since heap[0] is reserved. Since this function populates +@ the registers, encoding the value here seems a natural location to document +@ the limit. TODO: Should this be turned into a CPP define? @ Call Stack: @ data-words @ ... @@ -288,28 +291,32 @@ NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSSTN | Mark: 1000001 (spewreg) -@ Create a counter in heap[0] that doubles as a destination pointer generator. -SSSSN | PUSH 0 (ptr) +@ To simplify other functions, sprewreg shall accept 0 as a valid count value. +SNS | DUP +NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001 + +@ Create a counter in heap[15] that doubles as a destination pointer generator. +SSSTTTTN | PUSH 15 (ptr) SSSTN | PUSH 1 TTS | STORE @ Store one word to heap on each pass. NSSVSTSSSSSTSSSSSSSSN | Mark: 01000001 00000000 SNT | SWAP -SSSSN | PUSH 0 (ptr) +SSSTTTTN | PUSH 15 (ptr) TTT | LOAD SNT | SWAP TTS | STORE @ Check for loop completion. SNS | DUP -SSSSN | PUSH 0 (ptr) +SSSTTTTN | PUSH 15 (ptr) TTT | LOAD TSST | SUBTRACT NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001 -@ Increment heap[0] if continuing. -SSSSN | PUSH 0 (ptr) +@ Increment heap[15] if continuing. +SSSTTTTN | PUSH 15 (ptr) SNS | DUP TTT | LOAD SSSTN | PUSH 1 @@ -337,30 +344,30 @@ NTN | RTS @ heap[address] <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTTTSN | Mark: 11110 (slurp) -SSSTSN | PUSH 2 -NSTTSSSSSTN | JSR > 1000001 (spewreg) @ Load one word from heap on each pass. -NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000 -SSSTN | PUSH 1 (ptr) -TTT | LOAD -SSSTSN | PUSH 2 (ptr) -TTT | LOAD +SNS | DUP +SSSTTN | PUSH 3 +NSTTSTSN | JSR > 1010 (stackrotate) +SNT | SWAP +SNS | DUP +SSSTTN | PUSH 3 +NSTTSTSN | JSR > 1010 (stackrotate) TSSS | ADD TTT | LOAD +SSSTTN | PUSH 3 +NSTTSTSN | JSR > 1010 (stackrotate) +SNT | SWAP @ Check for loop completion. -@ As a side effect, prepare the next address. -SSSTN | PUSH 1 (ptr) SNS | DUP -TTT | LOAD -SNS | DUP -NTSSSSTTTTSSSSSSSSTN | BRZ > 00011110 00000001 +NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000 SSSTN | PUSH 1 TSST | SUBTRACT -TTS | STORE -NSNSSSTTTTSSSSSSSSSN | JMP > 00011110 00000000 -NSSVSSSTTTTSSSSSSSSTN | Mark: 00011110 00000001 +NSNTTTTSN | JMP > 11110 (slurp) + +@ Clean up and return. +NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000 SNN | DROP SNN | DROP NTN | RTS