205 lines
4.5 KiB
TypeScript
205 lines
4.5 KiB
TypeScript
export const sys = `// 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 initializes 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
|
|
`;
|
|
|
|
export const vm_tst = `// Tests and illustrates how the VM implementation handles function-call-and-return,
|
|
// by executing the functions in Sys.vm in the VM emulator.
|
|
// In particular, loads and runs the functions in Sys.vm.
|
|
|
|
load Sys.vm,
|
|
compare-to NestedCall.cmp,
|
|
output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1;
|
|
|
|
set RAM[0] 261,
|
|
set RAM[1] 261,
|
|
set RAM[2] 256,
|
|
set RAM[3] -3,
|
|
set RAM[4] -4,
|
|
set RAM[5] -1, // test results
|
|
set RAM[6] -1,
|
|
set RAM[256] 1234, // fake stack frame from call Sys.init
|
|
set RAM[257] -1,
|
|
set RAM[258] -2,
|
|
set RAM[259] -3,
|
|
set RAM[260] -4,
|
|
|
|
set RAM[261] -1, // Initialize stack to check for local segment
|
|
set RAM[262] -1, // being cleared to zero.
|
|
set RAM[263] -1,
|
|
set RAM[264] -1,
|
|
set RAM[265] -1,
|
|
set RAM[266] -1,
|
|
set RAM[267] -1,
|
|
set RAM[268] -1,
|
|
set RAM[269] -1,
|
|
set RAM[270] -1,
|
|
set RAM[271] -1,
|
|
set RAM[272] -1,
|
|
set RAM[273] -1,
|
|
set RAM[274] -1,
|
|
set RAM[275] -1,
|
|
set RAM[276] -1,
|
|
set RAM[277] -1,
|
|
set RAM[278] -1,
|
|
set RAM[279] -1,
|
|
set RAM[280] -1,
|
|
set RAM[281] -1,
|
|
set RAM[282] -1,
|
|
set RAM[283] -1,
|
|
set RAM[284] -1,
|
|
set RAM[285] -1,
|
|
set RAM[286] -1,
|
|
set RAM[287] -1,
|
|
set RAM[288] -1,
|
|
set RAM[289] -1,
|
|
set RAM[290] -1,
|
|
set RAM[291] -1,
|
|
set RAM[292] -1,
|
|
set RAM[293] -1,
|
|
set RAM[294] -1,
|
|
set RAM[295] -1,
|
|
set RAM[296] -1,
|
|
set RAM[297] -1,
|
|
set RAM[298] -1,
|
|
set RAM[299] -1,
|
|
|
|
set sp 261,
|
|
set local 261,
|
|
set argument 256,
|
|
set this 3000,
|
|
set that 4000;
|
|
|
|
repeat 50 {
|
|
vmstep;
|
|
}
|
|
output;
|
|
`;
|
|
|
|
export const hdl_tst = `// Tests how the VM implementation handles function-call-and-return,
|
|
// by executing the functions in Sys.vm.
|
|
// In particular, loads and runs NestedCall.asm, which results when
|
|
// the VM translator is applied to the NestedCall folder, which
|
|
// includes only one VM file: Sys.vm.
|
|
|
|
compare-to NestedCall.cmp,
|
|
|
|
set RAM[0] 261,
|
|
set RAM[1] 261,
|
|
set RAM[2] 256,
|
|
set RAM[3] -3,
|
|
set RAM[4] -4,
|
|
set RAM[5] -1, // test results
|
|
set RAM[6] -1,
|
|
set RAM[256] 1234, // fake stack frame from call Sys.init
|
|
set RAM[257] -1,
|
|
set RAM[258] -2,
|
|
set RAM[259] -3,
|
|
set RAM[260] -4,
|
|
|
|
set RAM[261] -1, // Initializes the stack, to check that the local segment
|
|
set RAM[262] -1, // is initialized to zeros by the 'function' VM command.
|
|
set RAM[263] -1,
|
|
set RAM[264] -1,
|
|
set RAM[265] -1,
|
|
set RAM[266] -1,
|
|
set RAM[267] -1,
|
|
set RAM[268] -1,
|
|
set RAM[269] -1,
|
|
set RAM[270] -1,
|
|
set RAM[271] -1,
|
|
set RAM[272] -1,
|
|
set RAM[273] -1,
|
|
set RAM[274] -1,
|
|
set RAM[275] -1,
|
|
set RAM[276] -1,
|
|
set RAM[277] -1,
|
|
set RAM[278] -1,
|
|
set RAM[279] -1,
|
|
set RAM[280] -1,
|
|
set RAM[281] -1,
|
|
set RAM[282] -1,
|
|
set RAM[283] -1,
|
|
set RAM[284] -1,
|
|
set RAM[285] -1,
|
|
set RAM[286] -1,
|
|
set RAM[287] -1,
|
|
set RAM[288] -1,
|
|
set RAM[289] -1,
|
|
set RAM[290] -1,
|
|
set RAM[291] -1,
|
|
set RAM[292] -1,
|
|
set RAM[293] -1,
|
|
set RAM[294] -1,
|
|
set RAM[295] -1,
|
|
set RAM[296] -1,
|
|
set RAM[297] -1,
|
|
set RAM[298] -1,
|
|
set RAM[299] -1,
|
|
|
|
repeat 4000 {
|
|
ticktock;
|
|
}
|
|
|
|
output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1;
|
|
output;
|
|
`;
|
|
|
|
export const cmp = `| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] | RAM[5] | RAM[6] |
|
|
| 261 | 261 | 256 | 4000 | 5000 | 135 | 246 |
|
|
`;
|