This commit is contained in:
Cadey Ratio 2019-05-30 06:17:49 -04:00
parent ac34337cdb
commit 89d1032671
1 changed files with 13 additions and 3 deletions

View File

@ -102,7 +102,6 @@ Since the vocabulary list is pretty safely not going to change at this point, we
const words = @embedFile("./Vocab.DD"); const words = @embedFile("./Vocab.DD");
const numWordsInFile = 7570; const numWordsInFile = 7570;
const Allocator = mem.Allocator;
var alloc = @import("std").heap.wasm_allocator; var alloc = @import("std").heap.wasm_allocator;
const God = struct { const God = struct {
@ -124,14 +123,18 @@ const God = struct {
} }
fn splitWords(data: []const u8, numWords: u32) ![][]const u8 { fn splitWords(data: []const u8, numWords: u32) ![][]const u8 {
// make a bucket big enough for all of god's words
var result: [][]const u8 = try alloc.alloc([]const u8, numWords); var result: [][]const u8 = try alloc.alloc([]const u8, numWords);
var ctr: usize = 0; var ctr: usize = 0;
// iterate over the wordlist (one word per line)
var itr = mem.separate(data, "\n"); var itr = mem.separate(data, "\n");
var done = false; var done = false;
while (!done) { while (!done) {
var val = itr.next(); var val = itr.next();
// val is of type ?u8, so resolve that
if (val) |str| { if (val) |str| {
// for some reason the last line in the file is a zero-length string
if (str.len == 0) { if (str.len == 0) {
done = true; done = true;
continue; continue;
@ -179,6 +182,8 @@ bits = GodBits(64, "a demo for the blog");
![the result as an i64](/static/blog/tos_2/resp.png) ![the result as an i64](/static/blog/tos_2/resp.png)
This is actually also a generic userspace function that applications can call. [Here's an example of `god` drawing tarot cards](https://github.com/Xe/TempleOS-tools/blob/master/Programs/Tarot.HC).
So let's translate this to Zig: So let's translate this to Zig:
``` ```
@ -187,7 +192,9 @@ So let's translate this to Zig:
fn add_bits(self: *God, num_bits: i64, n: i64) void { fn add_bits(self: *God, num_bits: i64, n: i64) void {
var i: i64 = 0; var i: i64 = 0;
var nn = n; var nn = n;
// loop over each bit in n, up to num_bits
while (i < num_bits) : (i += 1) { while (i < num_bits) : (i += 1) {
// create the new stack node (== to pushing to the fifo)
var node = alloc.create(Stack(u8).Node) catch unreachable; var node = alloc.create(Stack(u8).Node) catch unreachable;
node.* = Stack(u8).Node { node.* = Stack(u8).Node {
.next = undefined, .next = undefined,
@ -210,6 +217,8 @@ So let's translate this to Zig:
while (i < num_bits) : (i += 1) { while (i < num_bits) : (i += 1) {
const n = self.bits.pop(); const n = self.bits.pop();
// n is an optional (type: ?*Stack(u8).Node), so resolve it
// TODO(Xe): automatically refill data if stack is empty
if (n) |nn| { if (n) |nn| {
result = result + @intCast(i64, nn.data); result = result + @intCast(i64, nn.data);
result = result << 1; result = result << 1;
@ -230,11 +239,12 @@ const Resource = olin.resource.Resource;
fn main() !void { fn main() !void {
var god = try God.init(); var god = try God.init();
// open standard output for writing
const stdout = try Resource.stdout(); const stdout = try Resource.stdout();
const nl = "\n"; const nl = "\n";
god.add_bits(32, olin.random.int32()); god.add_bits(32, olin.random.int32());
// I copypasted this a few times in the original code // I copypasted this a few times (16) in the original code
// to ensure sufficient entropy // to ensure sufficient entropy
const w = god.get_word(); const w = god.get_word();
@ -258,7 +268,7 @@ uncultivated
2019/05/29 20:43:43 memory pages: 3 2019/05/29 20:43:43 memory pages: 3
``` ```
Yikes! Loading the wordlist is expensive (alternatively: my arbitrary gas limit is set way too low), so it's a good thing it's only done once and at boot. Still, regardless of this TempleOS boots in only a few seconds anyways. Yikes! Loading the wordlist is expensive (alternatively: my arbitrary gas limit is set way too low), so it's a good thing it's only done once and at boot. Still, regardless of this TempleOS boots in [only a few seconds anyways](https://i.imgur.com/O3FFsqA.png).
The final product is runnable via [this link](/static/blog/tos_2/wasm_exec.html). Please note that this is not currently supported on big-endian CPU's in browsers because Mozilla and Google have totally dropped the ball in this court, and trying to load that link will probably crash your browser. The final product is runnable via [this link](/static/blog/tos_2/wasm_exec.html). Please note that this is not currently supported on big-endian CPU's in browsers because Mozilla and Google have totally dropped the ball in this court, and trying to load that link will probably crash your browser.