summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-12-03 10:55:49 -0500
committerSacha Chua <sacha@sachachua.com>2022-12-03 10:55:49 -0500
commit402dfec174810deb984ef56107be224a63bb6681 (patch)
tree19434699476d372a0f5ee6e11cabfa8a7456a74b
parent57edd1a38e35c901fc853aed63525ea46dc48b39 (diff)
downloademacsconf-wiki-402dfec174810deb984ef56107be224a63bb6681.tar.xz
emacsconf-wiki-402dfec174810deb984ef56107be224a63bb6681.zip
Automated commit
-rw-r--r--2022/info/asmblox-after.md296
-rw-r--r--2022/info/asmblox-before.md29
2 files changed, 324 insertions, 1 deletions
diff --git a/2022/info/asmblox-after.md b/2022/info/asmblox-after.md
index 144edc9f..14927f3f 100644
--- a/2022/info/asmblox-after.md
+++ b/2022/info/asmblox-after.md
@@ -1,6 +1,302 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="asmblox-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hi, I'm Zach and today I'll be giving" start="00:00:00.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="a presentation on asm-blox," start="00:00:03.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="a programming game inspired by WebAssembly." start="00:00:05.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So programming games came into prominence" start="00:00:08.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="about a decade ago and are loved for providing" start="00:00:10.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="interesting programming challenges" start="00:00:13.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="without all the messiness of real world programming." start="00:00:14.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="I wanted to make a programming game" start="00:00:17.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and I decided to base it off of TIS-100," start="00:00:19.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="having a pretty basic UI." start="00:00:24.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It seemed pretty doable in Emacs." start="00:00:28.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="TIS 100 is a programming game" start="00:00:30.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="where you write a fictional assembly language" start="00:00:33.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="into a grid of cells which can each" start="00:00:35.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="communicate with one another," start="00:00:37.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="you're tasked with solving" start="00:00:39.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="fairly simple CS 101 like problems." start="00:00:41.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="To mix things up a bit I decided to base" start="00:00:44.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the language of asm-blox off of" start="00:00:48.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="WebAssembly, which is stack based," start="00:00:49.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="as opposed to TIS-100 which is registered based." start="00:00:52.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here you can see the same program" start="00:00:55.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="written in the game TIS-100," start="00:00:59.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="what it looks like in asm-blox," start="00:01:01.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and the original WebAssembly that it's based off of." start="00:01:03.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="With that said, let's get into a demo." start="00:01:08.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This is the game board." start="00:01:10.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's a 4 by 3 grid." start="00:01:12.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Each cell has a stack of size 4." start="00:01:14.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="First off, I'll show some of the stack editing commands." start="00:01:16.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can add a value with the const function." start="00:01:20.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here we're adding two values to this stack" start="00:01:23.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="to get added, and eventually the stack gets overflowed." start="00:01:27.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can fix that as follows with the clear command," start="00:01:33.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="so that clears the stack." start="00:01:37.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can duplicate values on the stack." start="00:01:40.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This duplicates the item at the bottom of the stack." start="00:01:43.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="10 gets put on, 20 gets put on," start="00:01:45.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="then 10 will get duplicated" start="00:01:48.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and put on the top of the stack." start="00:01:50.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can increment. For example, this increments" start="00:01:52.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the second to bottom, the second to bottom" start="00:01:55.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="from the stack." start="00:01:58.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So 10, 20, increment that, clear." start="00:01:59.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="That's basic stack operations." start="00:02:04.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Next up, we have numeric commands." start="00:02:07.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="For example, here, if we add &quot;add&quot;," start="00:02:11.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it pops two values off the stack," start="00:02:12.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="adds them, and pushes the result on." start="00:02:14.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Another way we can write this is as follows." start="00:02:17.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can have the add here" start="00:02:20.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then nest the two constants," start="00:02:22.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then this does the same thing." start="00:02:26.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="First, the inner constant operations run," start="00:02:28.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then the outer add operation runs." start="00:02:31.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can nest as deeply as we want." start="00:02:35.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="There's also subtraction, multiplication, and whatnot." start="00:02:40.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Next up are Boolean operations." start="00:02:44.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Zero counts as true." start="00:02:46.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Anything else--sorry, zero counts as false." start="00:02:49.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Anything else is true." start="00:02:51.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="For example, this would give us false and true," start="00:02:52.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="so that result should be false." start="00:03:01.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Zero gets put on the stack," start="00:03:04.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="one gets put on, and then the &quot;and&quot; operation." start="00:03:06.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So there's also or, not," start="00:03:08.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and various numerical comparison operations" start="00:03:12.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="like greater than and less than." start="00:03:17.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Next up are the port operations." start="00:03:21.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can send values to other cells as follows." start="00:03:22.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here we create a value" start="00:03:27.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then send it right." start="00:03:29.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let's run this." start="00:03:33.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The 10 goes on the stack," start="00:03:35.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then it gets sent to the right." start="00:03:37.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here it's waiting for this cell to pick it up." start="00:03:38.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It can pick it up just as follows." start="00:03:41.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So left... and then why don't we have it" start="00:03:44.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="drop that value after it gets it." start="00:03:47.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So the 10 gets sent to the right." start="00:03:49.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This one picks it up and drops it." start="00:03:53.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Lastly, we have control flow," start="00:04:00.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="which is a bit tricky," start="00:04:03.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but with this visual," start="00:04:04.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it helps explain it." start="00:04:06.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="There are two block constructs, &quot;block&quot; and &quot;loop&quot;," start="00:04:08.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and there's two jumping constructs, &quot;br&quot; and &quot;brif&quot;." start="00:04:12.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So if &quot;loop&quot; is jumped to," start="00:04:16.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the control flow goes to the beginning," start="00:04:23.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the top of the loop." start="00:04:25.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If a block is jumped to," start="00:04:26.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it goes to the end of the block," start="00:04:28.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and these various blocks" start="00:04:31.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="are identified by their level of nestedness." start="00:04:33.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="From the point of view of this jump statement," start="00:04:36.520" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="this &quot;br&quot; statement, this is block level 0," start="00:04:40.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="this is 1, this is 2." start="00:04:45.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So here, &quot;br 1&quot; would be referring to this loop." start="00:04:46.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="What this [br 1] would do is," start="00:04:49.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it would jump to this loop right here." start="00:04:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If we were to do this [br 2], what this would do is," start="00:04:54.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="this would jump past this block right here." start="00:04:57.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So as another example, this right here," start="00:05:02.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="this is a loop that generates increasing numbers." start="00:05:09.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Let's see. Next up, we have modules." start="00:05:15.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This is an example of a stack module." start="00:05:22.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="In addition to stack, there's also heaps." start="00:05:26.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="What this does is it allows us to create" start="00:05:28.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="an extra stack that we can push and pop items onto." start="00:05:34.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This one can have as large size as we need." start="00:05:38.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here it has a size of 20." start="00:05:41.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's taking values from up" start="00:05:43.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and exposing those values on the left." start="00:05:46.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This loop right here, it generates numbers," start="00:05:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and it's putting them onto the stack." start="00:05:57.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We can see here that those numbers" start="00:05:59.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="are being exposed to this cell right here." start="00:06:00.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's just taking values, and eventually," start="00:06:03.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it's going to overflow and cause an error." start="00:06:07.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="That finishes the basic commands." start="00:06:11.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Why don't we try solving this puzzle." start="00:06:14.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The puzzle description is right here." start="00:06:16.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We want to read a value from I." start="00:06:21.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Send 1 to G if I is greater than 0." start="00:06:23.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Send 1 to E if it's equal to 0." start="00:06:28.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Send 1 to L if it's less than 0." start="00:06:30.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="And then all the other ones, we send 0 to." start="00:06:32.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="First things first, let's send the value we get" start="00:06:35.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="from the input down as follows." start="00:06:40.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let's send that value right." start="00:06:44.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="You get from up." start="00:06:49.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Okay. So next, we're getting a value on the left." start="00:06:51.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Now we want to compare if this number is greater than 0." start="00:06:54.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If it's greater than 0, we send 1 to G." start="00:06:58.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let's perform the greater than operation" start="00:06:59.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="on that item we just got, and we're comparing it to 0." start="00:07:03.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Now that result, we're going to send down," start="00:07:08.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and we're going to send this original value" start="00:07:11.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="we got from here to the right." start="00:07:13.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here, we do a similar step." start="00:07:16.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We get the value from the left," start="00:07:19.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but this time, we have to do an equal operation." start="00:07:20.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Is that number we got equal to 0?" start="00:07:22.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We send that result down," start="00:07:25.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then send this number to the right." start="00:07:28.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Lastly, we get this number from the left." start="00:07:32.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here, we need to compare if it's less than 0." start="00:07:38.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We send that result down," start="00:07:42.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and now lastly, we drop that remaining value." start="00:07:45.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Okay, let's--oh, and then lastly," start="00:07:50.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="we need to send down the value we get up." start="00:07:53.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Send down, up, send down, up." start="00:07:56.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Okay, so let's try running this." start="00:08:02.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let's see. We notice that" start="00:08:04.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the numbers are coming in from I." start="00:08:08.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="They're going through our various conditions" start="00:08:10.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and should be sending all the correct values." start="00:08:14.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It looks like we're not getting any errors so far." start="00:08:18.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let's speed this up." start="00:08:23.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="That completes the puzzle." start="00:08:26.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Now let's get into some of the implementation details." start="00:08:33.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The first thing is the game loop." start="00:08:42.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The game loop is... So this is actually extremely simple." start="00:08:46.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="All the state for the entire game" start="00:08:50.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="is stored in just a few variables." start="00:08:52.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="There's one variable storing" start="00:08:54.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the text of each cell as a vector of strings." start="00:08:56.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="There's a single function" start="00:09:01.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="that renders the entire game, the entire board." start="00:09:06.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="There's a single function that would render" start="00:09:09.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="this entire screen based off of the state," start="00:09:11.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then the game waits for you to press a key." start="00:09:13.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The key usually, depending on what action you perform," start="00:09:19.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="updates the state and causes a re-render." start="00:09:24.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's an extremely simple game loop," start="00:09:27.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but it makes implementing it pretty easy." start="00:09:29.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="To demonstrate how this game loop works," start="00:09:32.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="I have a simple demo prepared." start="00:09:35.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This is a game of tic-tac-toe." start="00:09:38.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Let me show this real fast." start="00:09:41.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's an extremely simple implementation," start="00:09:44.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but it follows the same principles" start="00:09:49.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="that I used in asm-blox." start="00:09:51.466" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="First, we have the state defined in variables." start="00:09:53.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Here we have two pieces of state." start="00:09:57.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We have which player's turn it is" start="00:09:59.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and the state of the game board." start="00:10:01.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The player turn can be nil if it's empty," start="00:10:03.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the string &quot;x&quot; or the string &quot;o&quot;." start="00:10:06.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Then the game board is a list of nine board elements." start="00:10:08.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So that's the state." start="00:10:14.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Then we have a helper function." start="00:10:16.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="You can go into the details," start="00:10:18.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but it just returns true" start="00:10:19.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="if the board has a winning player." start="00:10:21.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Part two is the rendering function." start="00:10:25.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Only based off of the game state," start="00:10:30.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="we have a function that erases the buffer" start="00:10:32.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and draws this from scratch." start="00:10:36.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="That's this part right here." start="00:10:40.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Lastly, we have the action." start="00:10:45.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="We have one action which is bound to RET," start="00:10:46.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and it places a player token." start="00:10:51.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Once it places a player token," start="00:10:55.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it rerenders the board," start="00:10:59.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and all the rerendering is handled by this function." start="00:11:03.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Then we have just creating of the mode" start="00:11:06.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and initialization function." start="00:11:12.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="With these three steps" start="00:11:14.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it clearly separates out all of the state," start="00:11:16.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="the rendering, and the actions," start="00:11:20.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and it makes implementing it very simple." start="00:11:22.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="One trick that's used here and that I use" start="00:11:25.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="in my asm-blox game is that" start="00:11:29.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="when I render the board," start="00:11:32.383" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="I propertize the text to contain extra information." start="00:11:33.317" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="For example, here, each cell has" start="00:11:40.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="a tic-tac-toe index to indicate which number cell it is." start="00:11:45.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="This has index 0, 1, 2, all the way up to 8." start="00:11:49.400" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="That way, for placing, the only thing it has to do" start="00:11:53.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="is just look at its position" start="00:11:58.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="based off of the text property." start="00:12:01.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It makes implementation extremely simple." start="00:12:04.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Next up, we have the implementation of the code cells." start="00:12:07.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If you notice, here it's kind of weird" start="00:12:14.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="how it's like a buffer, but each cell kind of acts" start="00:12:16.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="like its own buffer, and it has its own limits." start="00:12:21.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="All of the Emacs editing--" start="00:12:25.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="well, some of the Emacs editing commands kind of work," start="00:12:27.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="like beginning-of-line, end-of-line, end-of-buffer." start="00:12:30.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="How is that done?" start="00:12:35.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Well, it's all just a trick, actually." start="00:12:38.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Each cell has text properties of which line it's at" start="00:12:41.760" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and its cell coordinates." start="00:12:47.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Whenever a key is pressed for editing, moving lines--" start="00:12:48.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="there's even kind of more complicated things" start="00:12:54.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="like switching cells around--" start="00:12:58.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="so all of that," start="00:13:00.600" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it knows which position it's in," start="00:13:03.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it knows what cell it's in," start="00:13:05.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then it copies the text of the cell," start="00:13:08.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="because remember, the contents of the cell" start="00:13:12.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="are stored in internal state." start="00:13:16.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It copies that cell contents into a temporary buffer." start="00:13:18.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It then moves the point to whichever line it was" start="00:13:23.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="in the game board." start="00:13:27.960" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It performs the action." start="00:13:31.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It makes sure that the resulting text isn't" start="00:13:33.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="longer than the cell width or the cell height." start="00:13:36.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If everything checks out," start="00:13:40.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="it updates the state and calls a re-render." start="00:13:42.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So there's nothing going on in here" start="00:13:45.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="that's, like, actually inserting a letter A." start="00:13:48.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It's all updating the state and causing a re-render." start="00:13:51.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="So this makes things like certain" start="00:14:00.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="internal Emacs editing constructs" start="00:14:03.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="pretty hard to use, like undoing." start="00:14:06.480" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Normally the undoing construct" start="00:14:09.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="works off the contents of the buffer." start="00:14:12.200" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="But if your buffer is actually just" start="00:14:15.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="a reflection of the internal state," start="00:14:17.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="then how does undoing work?" start="00:14:20.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Well, it pretty much is kind of a hack." start="00:14:21.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="I mean, undoing is here," start="00:14:24.880" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="but it's pretty much redone" start="00:14:27.040" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="in a not so configurable, not so modifiable way." start="00:14:32.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Pretty much everything is like that," start="00:14:37.560" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="from these parentheses highlighting..." start="00:14:40.080" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Normally, parentheses highlighting" start="00:14:42.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="would be kind of weird," start="00:14:46.320" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="with cross-line parentheses and everything." start="00:14:47.244" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="All of that had to be redone." start="00:14:49.840" video="mainVideo-asmblox" id="subtitle"]]
+[[!template new="1" text="Another point about how this is implemented" start="00:14:52.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="is the assembly text to executable code." start="00:14:58.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="If you're familiar with WebAssembly" start="00:15:02.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="you might have encountered a tool wat-wasm." start="00:15:05.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It basically converts the WebAssembly text format" start="00:15:10.720" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="to byte code." start="00:15:16.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="And what I do here... It goes through a similar process." start="00:15:18.280" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Normally, when you're writing this text format," start="00:15:22.440" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="you can nest things as deeply as you want." start="00:15:28.000" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Basically, what happens is it flattens out everything." start="00:15:30.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It kind of knows the order" start="00:15:33.800" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="that all these things are going to get executed," start="00:15:35.920" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and then it puts it into one single line" start="00:15:38.160" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="that it can just run through and execute." start="00:15:40.680" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="The same thing for the loops and blocks." start="00:15:44.120" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="It internally generates labels and jump statements." start="00:15:48.360" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="So that concludes this presentation." start="00:15:52.240" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="Thank you for listening," start="00:15:58.640" video="mainVideo-asmblox" id="subtitle"]]
+[[!template text="and I hope you enjoy the rest of the conference." start="00:15:59.667" video="mainVideo-asmblox" id="subtitle"]]
+
+
Questions or comments? Please e-mail [zacromero@posteo.net](mailto:zacromero@posteo.net?subject=Comment%20for%20EmacsConf%202022%20asmblox%3A%20asm-blox%3A%20a%20game%20based%20on%20WebAssembly%20that%20no%20one%20asked%20for)
diff --git a/2022/info/asmblox-before.md b/2022/info/asmblox-before.md
index 9b6ba11c..f12370c9 100644
--- a/2022/info/asmblox-before.md
+++ b/2022/info/asmblox-before.md
@@ -10,9 +10,36 @@ The following image shows where the talk is in the schedule for Sat 2022-12-03.
Format: 17-min talk followed by live Q&A (<https://emacsconf.org/current/asmblox/room>)
Etherpad: <https://pad.emacsconf.org/2022-asmblox>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Talk captioned
+Status: Now playing on the conference livestream
<div>Times in different timezones:</div><div class="times" start="2022-12-03T15:55:00Z" end="2022-12-03T16:15:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~10:55 AM - 11:15 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~9:55 AM - 10:15 AM CST (US/Central)<br />Saturday, Dec 3 2022, ~8:55 AM - 9:15 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~7:55 AM - 8:15 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~3:55 PM - 4:15 PM UTC <br />Saturday, Dec 3 2022, ~4:55 PM - 5:15 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~5:55 PM - 6:15 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~9:25 PM - 9:45 PM IST (Asia/Kolkata)<br />Saturday, Dec 3 2022, ~11:55 PM - 12:15 AM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~12:55 AM - 1:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+[[!template id="vid" vidid="asmblox-mainVideo" src="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.webm" poster="https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt" default />"""
+size="240M" duration="16:07" other_resources="""[Download --main.webm (238MB)](https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.webm)
+[Download --main.vtt](https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2022/emacsconf-2022-asmblox--asmblox-a-game-based-on-webassembly-that-no-one-asked-for--zachary-romero--main--chapters.vtt)
+[View transcript](https://emacsconf.org/2022/talks/asmblox#asmblox-mainVideo-transcript)
+[View on Toobnix](https://toobnix.org/w/rfZ2V1DZNgpMh18gKrsXmY)
+"""]]
+[[!template id="chapters" vidid="asmblox-mainVideo" data="""
+00:00:00.000 Introduction
+00:30.680 TIS-100
+00:44.960 WebAssembly
+01:08.040 Basic stack operations
+02:07.640 Numeric commands
+02:44.680 Boolean operations
+03:21.400 Port operations
+04:00.240 Control flow
+05:15.720 Modules
+06:14.480 Puzzle
+08:33.040 The game loop
+09:35.200 Tic-tac-toe
+11:25.880 Text properties
+12:07.800 Code cells
+14:00.920 Undo
+14:37.560 Parentheses
+14:52.360 Assembly text to executable code
+
+"""]]
# Description