[video member=pervognsen stream_platform=twitch project=bitwise title="Forth Implementation, Part 2" vod_platform=youtube id=SPErnyotJrk annotator=Miblo] [0:08][Recap and set the stage for the day][:speech] [0:52][Review the off-stream work on next and the addition of do_twice and docol with indirect :threading in our FORTH implementation][:asm :research] [7:51][Describe our test program and its control flow][:asm :research] [11:33][Demo the program][:asm :emulation :run] [12:25][A few words on :threading in JONESFORTH[ref site=GitHub page="nornagon / jonesforth" url=https://github.com/nornagon/jonesforth]][:asm :speech] [13:15][Implement user-defined words with indirect :threading][:asm] [16:53][:Run it and hit an "Expected instruction or command" error][:asm :emulation] [17:11][Change do_twice and do_jump to use .org + 8][:asm] [17:38][:Run it and hit an "Operand must be constant" error][:asm :emulation] [18:11][Enable cmd_org() to parse address offsets][:parsing] [18:49][:Run it to see that it still works, recapping that change][:asm :emulation] [19:35][Rename the existing defword to defcode, and introduce a new defword to handle user-defined words][:asm] [20:51][:Run it to see that it still works][:asm] [21:01][Up- / downsides of user-defined words][:asm :speech] [23:44][Change defcode and defword to an indirect :threading scheme][:asm] [24:56][:Run it to see that it does work][:asm] [25:05][The minimum set of FORTH runtime semantics][:asm :speech] [26:27][FORTH dictionary][:asm :speech] [31:57][Defining a dictionary in FORTH, including its \: and ; syntax][:asm :language :speech] [33:45][Set up to implement dictionary][:asm :speech] [34:51][Introduce cmd_str() and cmd_str() in the assembler] [36:42][Begin to implement dictionary entry][:asm] [39:26][Enable defcode and defword to support definition naming][:asm] [43:04][:Run it and hit an "Unexpected token (null) in expression" error][:asm] [44:35][Add TOKEN_STR to the token_kind_names table][:parsing] [45:07][:Run it and step through to investigate the bug][:asm] [47:55][Fix defcode and defword to use $label rather than $name][:asm] [48:14][:Run it to find that it doesn't still work][:asm :emulation] [50:23][Reorganise docol and fix init to initialise the rsp (return stack pointer)][:asm] [52:36][:Run it to find that it handles our input][:asm :emulation] [53:37][Make defcode print the address and name][:asm] [54:21][:Run it to see our defined codes, that reg 4 contains an odd-numbered address, and we get to an ILLEGAL instruction][:asm] [56:17][Note that JALR rounds to two-byte boundaries, and enable defcode to align 4 after the .str instruction] [57:58][:Run it and step through the :emulation to still see unaligned address][:asm] [59:03][Fix defcode to correctly compute the alignment][:memory] [59:22][:Run it to find that our addresses are aligned, but our input is not being handled][:asm :emulation] [1:00:36][Fix both defword and defcode to compute the alignment in such a way that enables :"input handling" to work][:asm] [1:01:24][:Run it to see that it works][:asm :emulation] [1:01:35][Initialise our dictionary's latest field, introducing defentry and a find routine][:asm] [1:18:25][Spec out a find routine in pseudo-C code to use as a template for the assembly][:asm :speech] [1:35:26][Paste this find routine into our FORTH implementation][:asm] [1:42:42][:Run it to find that it assembled][:asm] [1:43:01][Try out our find routine][:asm] [1:45:58][:Run it and step through the :emulation][:asm] [1:47:12][Fix temp_str_len to be a constant, not a label][:asm] [1:47:31][Step through our find routine to find garbage in x11][:asm :emulation :run] [1:49:37][Fix find to compare t2 (rather than t3) with t4][:asm] [1:49:44][Step through our find routine][:asm :emulation :run] [1:51:09][Fix find to load into t4 using lbu rather than lw][:asm] [1:51:29][:Run it to see that x11 contains 3][:asm :emulation] [1:53:05][Fix the alignment computation in defentry][:asm] [1:53:56][Step through our find routine to find garbage in x14][:asm :emulation :run] [1:55:27][Fix find to load into t7 and t8 using lbu][:asm] [1:56:33][Step through find to find that it found a match][:asm :emulation :run] [1:58:39][Define _putdigit and _getdigit to provide a pause-point][:asm :"input handling"] [1:59:55][:Run it to find that it always prints 4][:asm :emulation] [2:00:16][Define a drop word][:asm] [2:00:56][:Run it to find that it still prints 4][:asm :emulation] [2:01:14][Fix find to push t1 correctly onto the stack][:asm] [2:01:26][:Run it to find that it correctly prints 1][:asm :emulation] [2:01:32][Change temp_str to push "\@" rather than "!"][:asm] [2:01:40][:Run it to find that it seems to work on all our test strings][:asm :emulation] [2:02:13][Enable find to push two strings][:asm] [2:03:19][:Run it to determine that it works, with a few words on adapting pseudo-C to assembly][:asm :emulation] [2:04:41][Glimpse into making a command interpreter and compiler][:asm :speech] [2:05:31][@nodist_io][What's ion in your bitwise repo?] [2:06:07][That was it for today][:speech] [/video]