summary refs log tree commit diff
AgeCommit message (Collapse)Author
12 daysadd a rough draft of a self-hosted "interpret"Irene Knapp
Force-Push: yes Change-Id: I063232ca7d840237f53dc805bc896c7b452cedc8
12 dayshandle more cases in the vim syntaxIrene Knapp
Force-Push: yes Change-Id: I82794426013d33715decd2c86e00fe2367aab7c8
12 daysadd a rough draft of a self-hosted evokeIrene Knapp
Force-Push: yes Change-Id: Icf69cdfe7cf31fda07031bbc848c3ce2acb8cca1
12 daysoops, also needed mov-reg64-disp32-reg64Irene Knapp
Force-Push: yes Change-Id: I352537e52cb12d1c96f84cdaa794bd854d8ab1aa
12 daysformatting changesIrene Knapp
Force-Push: yes Change-Id: Iba125ccfd005151822d31af050ea3b4e2907d853
12 daysoops. didn't have a fully bootstrapped lea-reg64-disp32-reg64.Irene Knapp
the cold-start routine needs it... Force-Push: yes Change-Id: I6c0d80fc2bbb634f4b25aa96bd4ed5351361b8c9
12 daysadd a vim syntaxIrene Knapp
it was time. it was really impressively broken without one. Force-Push: yes Change-Id: Id26c551dcf43b37577ac96796627b6658a040cf4
12 daysdocument labels.e; also clean up elf.eIrene Knapp
the documentation in labels.e is entirely new, synthesized from informal private discussions. this is also intended as a final pass to make sure all the comments and nuances in the ELF code from quine.asm are incorporated in elf.e. also this uses the new `L@'` and `L!'` facilities for terseness Force-Push: yes Change-Id: Ieabb2bb26f4b83260f0072dcdcd0950f9aa9fab2
12 daysadd new words L@' and L!'Irene Knapp
wow it feels strange having a clear meaning associated with line noise like that Force-Push: yes Change-Id: If3d101234a9b8798c88f6b90090479b2866f5406
12 daysrefactored the label code and ELF template into their own filesIrene Knapp
nice, right? :) modular programming! :D Force-Push: yes Change-Id: I56dd219fd2147850a0bb5b4a8cb3f9760e787215
12 dayscompute the fixed point of the label addressesIrene Knapp
yay this is everything important that flatassembler was doing for us, so now it's time to rewrite Evocation itself, wow! Force-Push: yes Change-Id: Ifc2a901801d3edcc6d81b063a0a7c3efacdd255e
13 daysmake-hello.e works nowIrene Knapp
wow did labels turn out to be handy Force-Push: yes Change-Id: Iba8d57aed2e5baab5df44b94cdc1d57891b846a9
13 daysa comprehensive label system is now implementedIrene Knapp
it doesn't actually resolve their real values yet though Change-Id: Ib8fa0f73dfa37ec9e593f5cf17adc825a42ba53b Force-Push: yes
13 days"word" no longer consumes the terminating whitespaceIrene Knapp
this fixes a "bug" where a "~" as the last thing on a line would comment the following line this is a user-visible API change, but the only thing that needed to be modified right now was s" Force-Push: yes Change-Id: Iad062581dfdd8603ab75d58b1ca304ea6eb55c37
13 daysrefactor key into the separate parts peek and consumeIrene Knapp
Change-Id: I203ec08f02bff6f3fc7c82e359941449ca02a04c Force-Push: yes
2026-05-04implement create-in which is used for independent dictionariesIrene Knapp
also some important TODOs have been discovered Force-Push: yes Change-Id: I8efe7d0074700d6f5c78d4a591e5b590f57f47a9
2026-05-04add an exploration towards moving code generation to its own fileIrene Knapp
this is re-tracing some steps from way back in the beginning, to see what they look like in a post-flatassembler context :) it doesn't, like, do anything yet, other than print out some introspection Force-Push: yes Change-Id: I8913edffc075de313870367ef56278b1c8f50a06
2026-05-04make it slightly more readable lolIrene Knapp
Force-Push: yes Change-Id: I19a63a15b0058393719c0903bcabbb9b1389e2a1
2026-05-04add a program in Evocation which outputs itself (yay :))Irene Knapp
Force-Push: yes Change-Id: Ifda674d7bdd6243bf879ad5964b56791c6f33b90
2026-05-04octal and binary literalsIrene Knapp
that was easy :) Force-Push: yes Change-Id: I43933b373566d83e1c8a7dd12f5e7d203952fcc2
2026-05-04hexadecimal literals are implemented!Irene Knapp
yay they use C-style syntax. also, the number lexing code is better organized now. Force-Push: yes Change-Id: Ibe28ba553e4970e76eb562dddd4e2387ba0090f4
2026-05-03add commentsIrene Knapp
also .", which reads a string and prints it immediately Force-Push: yes Change-Id: I70ed0aea25d79b45ff11f587a8ff328d5dc28db3
2026-05-03running from stdin works!!!!!!!!Irene Knapp
Force-Push: yes Change-Id: I1939d287b4aa2d7e17d60d9af67dc41049847a6e
2026-05-03okay, all the cases for buffer refill work nowIrene Knapp
the word "key" is now implemented in terms of the new "key-from", to give a way to work with buffers other than the main one Force-Push: yes Change-Id: Ib62ed8c7890611a552b0ce6c2a2b8610092e1b6e
2026-05-03the heavy lifting of refilling a circular buffer is implemented nowIrene Knapp
it's not hooked up to the read logic yet, and some of the finicky cases aren't fully tested yet because it will be necessary to alternate reads and refills a bit to exercise them. Force-Push: yes Change-Id: Ic7442787068ea4ae985832ae597531d7d7bdcea9
2026-05-01change the circular buffers to use start/length rather than start/endIrene Knapp
this avoids the problem where there's no way to represent most entirely-full states because they would be the same as the empty states Force-Push: yes Change-Id: Ia38a57d756b62ad1c8301603cb9d9a99f2a1dbc4
2026-04-28implement sys-read; rename show-hex* to hexdump*Irene Knapp
it's easier to remember that way Force-Push: yes Change-Id: I205a49a03209c882eab80db7296d502bfcb206d9
2026-04-27minor formatting change; some commentsIrene Knapp
Force-Push: yes Change-Id: I28ccd83524de7baeaaf9e942006a892d7411c2aa
2026-04-27better at describing certain dictionary entry typesIrene Knapp
also, an important fix for string literals that matters inside curly braces Force-Push: yes Change-Id: Ia32d827a830e3ec847e5b8898e1c4a23e475e43b
2026-04-27now we have string literals! yay :)Irene Knapp
Force-Push: yes Change-Id: Ie797f38a0b83096a960d1f0019f5322a1f7884c3
2026-04-26get hex dumps basically workingIrene Knapp
still needs character visualization also implement ndup ndrop and some similar stuff Force-Push: yes Change-Id: I8f0ccdc9643afcd5b9a216b835b74c2c729d1d12
2026-04-26rename the bitwise operations to C-style, and add logical onesIrene Knapp
heresy etc etc Force-Push: yes Change-Id: I3ba75447d9a5f67c8739bed82826ac04e5d952ad
2026-04-26some exploratory work towards "describe"Irene Knapp
I'm reimplementing it, instead of hooking into the early implementation, because it's just SO much easier to read in the real syntax. also it's not really needed during bootstrapping, so probably that one can eventually be removed. Force-Push: yes Change-Id: If3d25eba1b280e14ee418d86d5098efcc069a529
2026-04-26unlink all the static stuff from the ELF from the dictionaryIrene Knapp
this ensures we don't accidentally use it going forward Force-Push: yes Change-Id: Id2ae7248d25f4090540a7ca795f13e0523f24c74
2026-04-26implement a bunch more stuff (checking in so people can look at it)Irene Knapp
Force-Push: yes Change-Id: I170967f44d9256c49716866afd39e0ab3b6d992a
2026-04-26implement forever and whileIrene Knapp
yay! Force-Push: yes Change-Id: I07aaeb486bf448ed736bd86ea5e495731a1da732
2026-04-26implement if-elseIrene Knapp
yay. that went faster than "if" did. Force-Push: yes Change-Id: Iba1c2867eed48f483928eafe9a5f90f547715bde
2026-04-25implement a whole bunch of Forth words, most notably "if"Irene Knapp
we decided to do flow control in a fun suffix-y way. so we introduced words { and } which track code blocks while compiling them, and the new word "if" uses memmove to slide that block around to insert a branch before it. memmove is also new, implemented in flatassembler also "if" relies on "'" which itself wants to be able to quote the word "lit", so the flatassembler word "literal" is introduced to break the cycle Force-Push: yes Change-Id: Iff17a15a1e748fe536e73ad05b1d4b06725a9f78
2026-04-25implement "quit", the top level wordIrene Knapp
this is a real milestone, wow. this required changing a few things in "interpret". first and simplest, it wasn't properly dropping the word string when processing a number in compile mode. second, "word" wasn't properly skipping whitespace - it was still becoming part of the word, which resulted in lookup failures. third and most interesting, "interpret" no longer loops, it relies on "quit" to do that. that means that instead of cold_start handing off to "interpret" as it previously did, cold_start now hands off to a trampoline it creates that calls "interpret" just enough times to create and invoke "quit". Force-Push: yes Change-Id: Iff826c6ef7e58c1e014688ae7508ab13e89c3c28
2026-04-24add word-defining words. implement the immediate-mode flag.Irene Knapp
these are the idiomatic Forth words [, ], :, and ;. also, comma already existed. an example of defining and calling a word at runtime is in the boot source Force-Push: yes!!!!! Change-Id: I5e5f66649616d9928600482fb7e504cd8bfe0d48
2026-04-24add a compile mode to the interpreterIrene Knapp
heh, ironic and stuff Force-Push: yes Change-Id: I607ac3b158c4ac6d3475727b278a4570e4570220
2026-04-24refactor all the stack-string stuff to work the right way roundIrene Knapp
yeahhhhhhh the strings tried to grow downwards in memory. strings don't do that. on the plus side, the new implementation feels way more elegant. Force-Push: yes Change-Id: I836e1348273035299afbd3a793a77327180666f0
2026-04-21add a variable for interpreter stateIrene Knapp
it's not used yet; this uncovered a problem with the stack string buffers, which needs to be fixed first. they grow in the wrong direction. Force-Push: yes Change-Id: I208897f9008d956996493b28fff831e04a67a366
2026-04-21re-verify that nothing on the heap depends on the text segmentIrene Knapp
this was done with early_describe_all, as before. both word addresses and string addresses were checked. there were a couple fixes needed to make that run properly; they have been applied Force-Push: yes Change-Id: Idb89d04ab0deb42ef14220b2ef0e958657d75c63
2026-04-21oops, it checks integer syntax nowIrene Knapp
oops :) so the no-such-word error condition can happen now, which is good Force-Push: yes Change-Id: If0095253c0c247ea7ff13a9b6b49a5698ef8243f
2026-04-20it can interpret integer literals now!!!! yayIrene Knapp
only decimal tho Force-Push: yes Change-Id: I79cfbdee7beb927855e1b32869ac760754af062d
2026-04-20print an error message when there's no wordIrene Knapp
Force-Push: yes Change-Id: I2c7eb0c842c930be17bdff2d0e270c53fb996f86
2026-04-20and now it can lex Forth code!Irene Knapp
well, sort of. no literals yet. Force-Push: yessssssss!!! Change-Id: I91156554934659ea285cf18def5ed66ce09a1171
2026-04-19implement "key", which reads a byte of input from the bufferIrene Knapp
sweeeeeeeet nearly there now also, fetch8 (aka 8@) and the 16- and 32-bit equivalents never actually returned their results. oops. fixed. Force-Push: yes Change-Id: I35e48036951e829625cc37ce99d789e97d98100b
2026-04-17some stuff for dealing with circular buffers, implemented as heap wordsIrene Knapp
by putting this directly on the heap, we allow it to work in the easy, obvious ways, at the cost of extreme verbosity. the core abstractions here are "buffer", "input buffer", and "buffer metadata". the metadata struct is distinct from the backing store, though there is a convenience word to allocate them together. for communication purposes, the buffer "is" the metadata struct, and the "backing store" is where things are actually read from. all input buffers are buffers but someday not all buffers will be input buffers; note carefully how the various word names make this distinction. Force-Push: yes Change-Id: Ib85a74af046b42c8959c6edf93b83e2ad7f21be4