-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvm.test.zig
65 lines (58 loc) · 1.47 KB
/
vm.test.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const std = @import("std");
// const thing = @import("thi.ng");
const builtin = @import("builtin");
const vm = @import("vm.zig");
const testing = std.testing;
const Op = vm.Op;
// pub const std_options: std.Options = .{
// .log_level = .debug,
// .logFn = std.log.defaultLog,
// };
export fn vm_trap(base: *anyopaque, trapID: u8) bool {
const task = @as(*vm.VM.Task, @alignCast(@ptrCast(base)));
_ = task;
std.log.info("trap task {d} #{d}\n", .{ @offsetOf(vm.VM.Task, "ds"), trapID });
return false;
}
test "vm" {
std.testing.log_level = std.log.Level.debug;
vm.vm.init();
std.log.info("task size {d}", .{@sizeOf(vm.VM.Task)});
std.mem.copyForwards(u8, vm.vm.mem[0x1000..], &[_]u8{
@intFromEnum(Op.push16),
0x10,
0x20,
@intFromEnum(Op.call),
0x09,
0x10,
@intFromEnum(Op.push),
0x50,
// pad
0,
// subroutine
@intFromEnum(Op.push),
0x30,
@intFromEnum(Op.jump),
0x10,
0x10,
// pad
0,
0,
@intFromEnum(Op.push),
0x40,
@intFromEnum(Op.trap),
0x55,
0x31,
1,
});
const id = vm.vm.addTask(0x1000);
const tasks = vm.vm.taskList();
std.log.info("tasklist: {}", .{tasks});
vm.vm.run();
vm.vm.run();
const task = vm.vm.taskForID(id);
std.log.info("ds: {d} rs: {d}\n", .{
task.ds[0..task.dsp],
task.rs[0..task.rsp],
});
}