Add UVM32_SYSCALL_RAND to get a "true" random number from the host, as I want to play zigtris and not have it be the same every time.

This commit is contained in:
Toby Jaffey 2025-12-17 20:19:31 +00:00
parent 3d83844d5c
commit d780c4e69d
6 changed files with 18 additions and 1 deletions

View file

@ -50,6 +50,7 @@ static uint32_t syscall(uint32_t id, uint32_t param1, uint32_t param2) {
#define printbuf(x, y) syscall_cast(UVM32_SYSCALL_PRINTBUF, x, y) #define printbuf(x, y) syscall_cast(UVM32_SYSCALL_PRINTBUF, x, y)
#define render(x, y) syscall_cast(UVM32_SYSCALL_RENDER, x, y) #define render(x, y) syscall_cast(UVM32_SYSCALL_RENDER, x, y)
#define getkey() syscall_cast(UVM32_SYSCALL_GETKEY, 0, 0) #define getkey() syscall_cast(UVM32_SYSCALL_GETKEY, 0, 0)
#define rand() syscall_cast(UVM32_SYSCALL_RAND, 0, 0)
extern char _estack; extern char _estack;

View file

@ -10,7 +10,7 @@ export fn main() void {
var gameRunning = true; var gameRunning = true;
var lastUpdate:u32 = 0; var lastUpdate:u32 = 0;
zigtris.gamesetup(console, uvm.millis()) catch |err| { zigtris.gamesetup(console, uvm.rand()) catch |err| {
_ = console.print("err {any}\n", .{err}) catch 0; _ = console.print("err {any}\n", .{err}) catch 0;
_ = console.flush() catch 0; _ = console.flush() catch 0;
return; return;

View file

@ -27,6 +27,10 @@ pub inline fn millis() u32 {
return syscall(uvm32.UVM32_SYSCALL_MILLIS, 0, 0); return syscall(uvm32.UVM32_SYSCALL_MILLIS, 0, 0);
} }
pub inline fn rand() u32 {
return syscall(uvm32.UVM32_SYSCALL_RAND, 0, 0);
}
// dupeZ would be better, but want to avoid using an allocator // dupeZ would be better, but want to avoid using an allocator
// this is of course, unsafe... // this is of course, unsafe...
var termination_buf:[128]u8 = undefined; var termination_buf:[128]u8 = undefined;

View file

@ -14,4 +14,6 @@
#define UVM32_SYSCALL_GETKEY 0x00000009 #define UVM32_SYSCALL_GETKEY 0x00000009
#define UVM32_SYSCALL_RENDERAUDIO 0x0000000A #define UVM32_SYSCALL_RENDERAUDIO 0x0000000A
#define UVM32_SYSCALL_CANRENDERAUDIO 0x0000000B #define UVM32_SYSCALL_CANRENDERAUDIO 0x0000000B
#define UVM32_SYSCALL_RAND 0x0000000C

View file

@ -241,6 +241,8 @@ int main(int argc, char *argv[]) {
return 1; return 1;
} }
srand(clock());
uvm32_init(vmst); uvm32_init(vmst);
if (!uvm32_load(vmst, rom, romlen)) { if (!uvm32_load(vmst, rom, romlen)) {
@ -374,6 +376,9 @@ int main(int argc, char *argv[]) {
case UVM32_SYSCALL_MILLIS: { case UVM32_SYSCALL_MILLIS: {
uvm32_arg_setval(vmst, &evt, RET, SDL_GetTicks()); uvm32_arg_setval(vmst, &evt, RET, SDL_GetTicks());
} break; } break;
case UVM32_SYSCALL_RAND:
uvm32_arg_setval(&vmst, &evt, RET, rand());
break;
case UVM32_SYSCALL_GETC: { case UVM32_SYSCALL_GETC: {
uvm32_arg_setval(vmst, &evt, RET, 0xFFFFFFFF); uvm32_arg_setval(vmst, &evt, RET, 0xFFFFFFFF);
} break; } break;

View file

@ -190,6 +190,8 @@ int main(int argc, char *argv[]) {
return 1; return 1;
} }
srand(clock());
uvm32_init(&vmst); uvm32_init(&vmst);
if (!uvm32_load(&vmst, rom, romlen)) { if (!uvm32_load(&vmst, rom, romlen)) {
@ -264,6 +266,9 @@ int main(int argc, char *argv[]) {
case UVM32_SYSCALL_PRINTHEX: case UVM32_SYSCALL_PRINTHEX:
printf("%08x", uvm32_arg_getval(&vmst, &evt, ARG0)); printf("%08x", uvm32_arg_getval(&vmst, &evt, ARG0));
break; break;
case UVM32_SYSCALL_RAND:
uvm32_arg_setval(&vmst, &evt, RET, rand());
break;
case UVM32_SYSCALL_MILLIS: { case UVM32_SYSCALL_MILLIS: {
clock_t now = clock() / (CLOCKS_PER_SEC / 1000); clock_t now = clock() / (CLOCKS_PER_SEC / 1000);
uvm32_arg_setval(&vmst, &evt, RET, now - start_time); uvm32_arg_setval(&vmst, &evt, RET, now - start_time);