cinera_handmade.network/pervognsen/bitwise/bitwise/bitwise038_1.hmml

105 lines
6.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[video member=pervognsen stream_platform=twitch project=bitwise title="Forth Implementation, Part 4" vod_platform=youtube id=asW2hkGnsyM annotator=Miblo]
[0:08][Recap and set the stage for the day][:speech]
[1:48][Review the addition of "key" word and renaming of "xt" to ">cfa"][:asm :research]
[5:42][:Run it to demo the FORTH program execution][:asm]
[6:39][Modes in FORTH: immediate vs compilation][:asm :speech]
[11:43][Mode-agnostic immediate words][:asm :speech]
[12:52][Dive into implementing modes][:asm]
[13:36][Introduce a _push_latest word that initialises variables][:asm]
[15:19][Introduce mode and cp labels, and "cp" word, establishing the convention that all constants are upper case][:asm]
[20:01][Dive into implementing the ability to dynamically define dictionary entries, introducing "here" and "allot" words, and "c\@" and "c!" for byte-wise loads and stores][:asm]
[25:54][Spec out our dynamic dictionary entry definition implementation][:asm]
[27:48][The "," helper word][:asm :speech]
[28:49][Continue to spec out our dynamic dictionary entry definition implementation][:asm]
[35:15][Introduce "swap" word][:asm]
[36:10][Spec out a "cmove" word, as if we have all the facilities for it][:asm :memory]
[43:11][Introduce "rot" and "-rot" words][:asm]
[45:17][Expand our cmove spec to FORTH][:asm]
[49:38][Introduce branch][:asm]
[49:57][@sci4me][Uh, that doesn't duplicate the top two elements, that duplicates the top element twice]
[50:01][Introduce "over" word][:asm]
[51:12][Expand "2dup"][:asm]
[51:50][@rygorous][@pervognsen I'm gonna go out on a limb here and say you should write a small bootstrapping tool that converts those basic definitions into assembly, because transcribing that is gonna get old fast][:asm]
[52:23][Fix 2dup][:asm]
[52:57][Expand "branch"][:asm]
[54:21][Introduce "mux" for "branch" to use][:asm]
[59:11][@rygorous][@pervognsen x ^ ((y ^ x) & mask)]
[59:49][Move our newly defined words into the FORTH implementation][:asm]
[1:04:35][Test mux][:asm]
[1:05:45][:Run it to see that the mux test fails][:asm]
[1:06:04][Remove the mux from our input_buf][:asm]
[1:06:08][:Run it to see 0 as expected][:asm]
[1:06:16][Reinsert mux into our input_buf, and endeavour to fix its definition, introducing a "neg" word][:asm]
[1:07:44][:Run it to see that it never prints anything][:asm]
[1:09:18][Fix the definitions of our new words as words, rather than codes][:asm]
[1:09:32][:Run it to see that it prints "0"][:asm]
[1:09:38][Re-enable some of the "mux" definition][:asm]
[1:09:44][:Run it to see that it prints "0"][:asm]
[1:09:53][Change our mux test to use 1][:asm]
[1:09:56][:Run it to see that it prints "/" in lieu of a -1][:asm]
[1:10:21][Change our mux test to use 4][:asm]
[1:10:25][:Run it to see that it prints "/" in lieu of a 4][:asm]
[1:10:32][Re-enable our entire "mux" definition][:asm]
[1:10:48][:Run it to see that it prints "0"][:asm]
[1:11:10][Flesh out of "mux" word spec, introducing "xor" and "not" words][:asm]
[1:13:43][:Run it to see that it prints "."][:asm]
[1:13:52][Scrutinise our "mux" definition, and consider the need for better debugging functionality][:asm :research]
[1:16:25][Fix "xor"][:asm]
[1:16:32][Continue to scrutinise the words called by "mux"]
[1:17:33][Break down our mux test][:asm]
[1:18:25][Introduce "show" word, and enable cmd_loop() in the assembler to quit when "q" is pressed][:asm :"input handling"]
[1:21:57][:Run it, crash in step() and investigate why][:asm]
[1:27:28][Fix the uintptr_t definition in Ion]
[1:28:01][:Run it, successfully hit our breakpoint and inspect the workings of "mux"][:asm]
[1:29:36][Inline our mux definition][:asm]
[1:30:47][Step through our FORTH program to find that the "<>0" didn't work][:asm :run]
[1:32:47][Fix "<>0" to "0<>" in our input stream][:asm]
[1:32:57][Step through our FORTH program to find that the rotation is incorrect][:asm :run]
[1:34:34][Fix our "-rot" definition][:asm]
[1:34:39][Step through our FORTH program to find that the entire routine works][:asm :run]
[1:36:30][Implement "branch"][:asm]
[1:37:26][Test "branch" out on a toggle program][:asm]
[1:41:18][:Run it to see how it works][:asm]
[1:41:39][Make the program echo the input before doing the branch][:asm]
[1:41:54][:Run it to determine that the branching may be busted, and investigate why][:asm]
[1:42:30][Test to find that the infinite loop is indeed working][:asm :programming :run]
[1:42:50][Scrutinise our "branch" definition][:asm :research]
[1:45:32][Make the program call "show" before and after branching][:asm]
[1:45:48][Step in to our program and crash in bus_load_word()][:asm :run]
[1:46:39][Try a variant of "branch" that should unconditionally fall through][:asm]
[1:47:04][:Run it to find that it is unconditionally falling through][:asm]
[1:47:23][Try a variant of "branch" testing that the offset is correct][:asm]
[1:47:31][:Run it to confirm that the branch offset is correct][:asm]
[1:48:00][Fix "branch" to swap between add and load][:asm]
[1:49:10][:Run it to find that it works now][:asm]
[1:50:07][Implement "cmove" from our spec][:asm :memory]
[1:55:16][Determine to test our "cmove"][:asm :speech]
[1:55:53][@sci4me][That's not quite right. You're storing to the wrong location, I think]
[1:56:11][Scrutinise our "cmove" spec][:asm :research]
[1:57:24][Loft out some of "cmove" into a "cmove1" word, introducing "1+" and "1-"][:asm]
[2:01:48][Conjugation][:speech]
[2:04:19][@miotatsu][My introduction to conjugation as well as commutators was Rubik's cubes, fun stuff]
[2:05:48][Implement "create" from our spec][:asm]
[2:08:30][Spec out "aligned" and "align"][:asm]
[2:09:59][Implement "aligned" from our spec, and "2" and "3" literals][:asm]
[2:11:20][Test "aligned" (also implementing "align" from our spec)][:asm]
[2:12:36][:Run it to see that it looks good][:asm]
[2:13:33][Break][:admin]
[2:13:54][:afk]
[2:14:43][Return and enable "create" to set the cfa field, introducing "docol"][:asm]
[2:16:53][Introduce "'" word][:asm]
[2:18:44][Test "create" on an "8" word, based on 4 × 2][:asm]
[2:22:34][Step in to our program to see that the "create" has worked][:asm :run]
[2:25:41][Test "create" on a "twice" word][:asm]
[2:26:54][:Run it to find that it's not working, and investigate why][:asm]
[2:29:57][Assert that there is space on the stack for a new dictionary entry][:asm :memory]
[2:33:14][Investigate the stack effects of "create"][:asm :memory :research]
[2:35:23][Make "cmove" drop its arguments, introducing "2drop" and "3drop"][:asm :memory]
[2:36:39][Step through it until we crash in bus_load_word()][:asm :memory :run]
[2:37:25][Verify that multi-character definitions do not work][:asm :programming :memory :run]
[2:37:53][Try creating a 3-character dictionary entry][:asm :memory]
[2:38:29][:Run it to determine that it could be an alignment or length issue][:asm :memory]
[2:40:11][Scrutinise "cmove1", "cmove" and "create"][:asm :memory :research]
[2:41:56][Cut off the stream][:speech]
[/video]