#ifndef VVS_STDLIB_MATH #define VVS_STDLIB_MATH @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ random (10000) @ Description: @ Returns a kinda-random number. @ Before using for the first time, seed heap[0] with a value. @ Call Stack: @ empty @ Return Stack: @ random number <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSN | Mark: 10000 (random) @ Generate the next seed value SSSSN | PUSH 0 (ptr) TTT | LOAD SSSTSSSSSTTTSSSTTSSTSSTTTSSTTSTTSTN | PUSH 1103515245 TSSN | MULTIPLY SSSTTSSSSSSTTTSSTN | PUSH 12345 TSSS | ADD @ Store the next seed value but keep a copy on the stack. SNS | DUP SSSSN | PUSH 0 (ptr) SNT | SWAP TTS | STORE @ Calculate the random number and return. SSSTSSSSSSSSSSSSSSSSN | PUSH 65536 TSTS | DIVIDE SSSTSSSSSSSSSSSSSSSN | PUSH 32768 TSTT | MODULO NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ abs (10001) @ Description: @ Returns the absolute value of its argument @ Call Stack: @ signed number <-- TOS @ Return Stack: @ abs(signed number) <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSTN | Mark: 10001 (absolute value) @ Catch -(2^63) as a special case since its absolute value will overflow @ a twos-complement 64-bit word. Return zero as though the absolute value @ overflowed to the bottom of the non-negative integers rather than @ overflowing back to the most negative integer. SNS | DUP SSTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSN | -(2^63) TSST | SUBTRACT NTSSSSTSSSTSSSSSSTSN | BRZ > 00010001 00000010 @ Handle all the other numbers. SNS | DUP NTTSSSTSSSTSSSSSSSSN | BMI > 00010001 00000000 NSNSSSTSSSTSSSSSSSTN | JMP > 00010001 00000001 NSSVSSSTSSSTSSSSSSSSN | Mark: 00010001 00000000 SSTTN | PUSH -1 TSSN | MULTIPLY NSSVSSSTSSSTSSSSSSSTN | Mark: 00010001 00000001 NTN | RTS @ Special case: Push 0 and return. NSSVSSSTSSSTSSSSSSTSN | Mark: 00010001 00000010 SNN | DROP SSSSN | PUSH 0 NTN | RTS #endif