// Sys.vm. Tested by the NestedCall test script. // Consists of three functions: Sys.init, Sys.main, and Sys.add12. // Calls Sys.main() and stores a return value in temp 1. // Does not return (enters infinite loop). // The VM implementation starts running the Sys.init function, by default. function Sys.init 0 push constant 4000 // tests that THIS and THAT are handled correctly pop pointer 0 push constant 5000 pop pointer 1 call Sys.main 0 pop temp 1 label LOOP goto LOOP // Sets locals 1, 2 and 3 to some values. Leaves locals 0 and 4 unchanged, // to test that the 'function' VM command initliazes them to 0 (the test // script sets them to -1 before this code starts running). // Calls Sys.add12(123) and stores the return value (should be 135) in temp 0. // Returns local 0 + local 1 + local 2 + local 3 + local 4 (should be 456), to // confirm that locals were not mangled by the function call. function Sys.main 5 push constant 4001 pop pointer 0 push constant 5001 pop pointer 1 push constant 200 pop local 1 push constant 40 pop local 2 push constant 6 pop local 3 push constant 123 call Sys.add12 1 pop temp 0 push local 0 push local 1 push local 2 push local 3 push local 4 add add add add return // Returns (argument 0) + 12. function Sys.add12 0 push constant 4002 pop pointer 0 push constant 5002 pop pointer 1 push argument 0 push constant 12 add return