rrq/jonasforth.git
4 years agoAdd alternative Linux backend
Jonas Hvid [Sun, 4 Oct 2020 01:08:51 +0000 (03:08 +0200)]
Add alternative Linux backend

You can now run:

    make main && ./main

To run the interpreter without needing to boot up a virtual machine.

Note that this mode uses per-line buffering by default, so you may have to press
enter where you would normally only need a space.

4 years agoImplement Linux backend
Jonas Hvid [Sun, 4 Oct 2020 01:07:25 +0000 (03:07 +0200)]
Implement Linux backend

You can now run:

    make main && ./main

To run the interpreter without needing to boot up a virtual machine.

Note that this mode uses per-line buffering by default, so you may have to press
enter where you would normally only need a space.

4 years agoAdd placeholder implementation of Linux backend
Jonas Hvid [Sun, 4 Oct 2020 00:14:04 +0000 (02:14 +0200)]
Add placeholder implementation of Linux backend

4 years agoClean up OS interface
Jonas Hvid [Sun, 4 Oct 2020 00:02:42 +0000 (02:02 +0200)]
Clean up OS interface

We got rid of those weird macros that would try to preserve a bunch of registers
for no reason. The OS interface was changes slightly to allow for simpler
implementation and usage.

4 years agoRename UEFI procedures to generic naming scheme
Jonas Hvid [Sat, 3 Oct 2020 23:40:36 +0000 (01:40 +0200)]
Rename UEFI procedures to generic naming scheme

4 years agoSupply UEFI module path as environment variable
Jonas Hvid [Sat, 3 Oct 2020 23:25:48 +0000 (01:25 +0200)]
Supply UEFI module path as environment variable

We'd like to have multiple backends -- e.g. Linux instead of UEFI. That would
make testing less cumbersome.

Also remove an outdated comment.

4 years agoMake S" work inside compiled words
Jonas Hvid [Sat, 3 Oct 2020 23:06:21 +0000 (01:06 +0200)]
Make S" work inside compiled words

The approach we're using here is kinda silly and cause by the fact that I
wasn't/still aren't very familiar with Forth outside of trying to implement it
myself.

From doing a bit of reading, it sounds like S" is primarily intended to be used
inside definitions -- not at runtime. So now we use the old, weird S" (that has a
single static buffer and only works at runtime) to bootstrap the system, then
replace it with a more sensible S" that only works at compile time.

4 years agoImplement '\'-style comments
Jonas Hvid [Sat, 3 Oct 2020 22:33:07 +0000 (00:33 +0200)]
Implement '\'-style comments

4 years agoImplement the 'KEY' primitive for user input
Jonas Hvid [Sat, 3 Oct 2020 18:32:39 +0000 (20:32 +0200)]
Implement the 'KEY' primitive for user input

This is a lower-level primitive for getting user input. We now also use this to
implement READ-WORD.

4 years agoClarify some explanations in the README
Jonas Hvid [Sat, 3 Oct 2020 17:15:36 +0000 (19:15 +0200)]
Clarify some explanations in the README

4 years agoUpdate README with link to UEFI tutorial
Jonas Hvid [Sat, 25 Apr 2020 23:41:54 +0000 (01:41 +0200)]
Update README with link to UEFI tutorial

4 years agoAdd instructions for running on real hardware
Jonas Hvid [Fri, 20 Mar 2020 18:32:15 +0000 (19:32 +0100)]
Add instructions for running on real hardware

4 years agoImprove build instructions in README
Jonas Hvid [Sat, 14 Mar 2020 20:38:43 +0000 (21:38 +0100)]
Improve build instructions in README

4 years agoHandle newlines (in both input and output)
Jonas Hvid [Mon, 9 Mar 2020 16:22:19 +0000 (17:22 +0100)]
Handle newlines (in both input and output)

4 years agoShow the user's input on screen as they are typing
Jonas Hvid [Mon, 9 Mar 2020 16:01:33 +0000 (17:01 +0100)]
Show the user's input on screen as they are typing

4 years agoMake it run on UEFI!
Jonas Hvid [Mon, 9 Mar 2020 14:13:34 +0000 (15:13 +0100)]
Make it run on UEFI!

The program is now usable, albeit barely, running inside QEMU, with the only
dependency being UEFI! Very cool!

Right now, no output is printed to the screen when you type characters, newlines
aren't printed correctly, and the program doesn't accept Enter as valid
whitespace when reading input.

4 years agoGet rid of remaining "loose" syscalls
Jonas Hvid [Mon, 9 Mar 2020 13:50:45 +0000 (14:50 +0100)]
Get rid of remaining "loose" syscalls

4 years agoRemove old code from example.f
Jonas Hvid [Mon, 9 Mar 2020 13:41:33 +0000 (14:41 +0100)]
Remove old code from example.f

4 years agoImprove README and update information about sys.f
Jonas Hvid [Mon, 9 Mar 2020 13:34:34 +0000 (14:34 +0100)]
Improve README and update information about sys.f

4 years agoFinish implementing embedded sys.f
Jonas Hvid [Sun, 8 Mar 2020 18:32:16 +0000 (19:32 +0100)]
Finish implementing embedded sys.f

OK, this works... barely!

We have to omit the final newline in sys.f for it to work. We should probably
take another look at that.

But, it does technically work: We can now run just ./main, and the sys.f file
will be run automatically from inside the program. Very cool!

4 years agoUse a different approach to reading from buffers
Jonas Hvid [Sun, 8 Mar 2020 18:17:02 +0000 (19:17 +0100)]
Use a different approach to reading from buffers

We now store INPUT-BUFFER as a global variable. Words like S" and READ-WORD
automatically use this INPUT-BUFFER if it's available.

Our program currently segfaults on startup, which is probably because of at
least one of the following:

1. We don't handle the case where an input buffer ends in whitespace in
   INTERPRET-STRING.
2. We don't do anything to resume reading from user input when the buffer has
   been exhausted.

4 years agoImplement BUF"
Jonas Hvid [Sun, 8 Mar 2020 17:42:47 +0000 (18:42 +0100)]
Implement BUF"

This still doesn't actually work, because our definition of : doesn't make sense
when we're reading input from the buffer.

4 years agoImplement INTERPRET-STRING
Jonas Hvid [Sun, 8 Mar 2020 17:12:07 +0000 (18:12 +0100)]
Implement INTERPRET-STRING

INTERPRET-STRING works, but the program crashes on startup, because sys.f uses
words that assume that they are being run with user input, for example S" and
READ-WORD.

4 years agoImplement POP-WORD
Jonas Hvid [Sun, 8 Mar 2020 14:48:18 +0000 (15:48 +0100)]
Implement POP-WORD

4 years agoEmbed sys.f into binary and start working on POP-WORD
Jonas Hvid [Sun, 8 Mar 2020 14:27:49 +0000 (15:27 +0100)]
Embed sys.f into binary and start working on POP-WORD

4 years agoRefactor INTERPRET so we also have INTERPRET-WORD
Jonas Hvid [Sun, 8 Mar 2020 13:57:05 +0000 (14:57 +0100)]
Refactor INTERPRET so we also have INTERPRET-WORD

4 years agoAdd notes about loading files from disk
Jonas Hvid [Sun, 8 Mar 2020 13:39:22 +0000 (14:39 +0100)]
Add notes about loading files from disk

4 years agoMove some Forth words to separate 'bootstrap.asm' file
Jonas Hvid [Sun, 8 Mar 2020 13:19:27 +0000 (14:19 +0100)]
Move some Forth words to separate 'bootstrap.asm' file

4 years agoMove printing syscall to a macro
Jonas Hvid [Sat, 7 Mar 2020 19:08:13 +0000 (20:08 +0100)]
Move printing syscall to a macro

This will allow us to more easily replace it with the UEFI
implementation.

4 years agoAdd syntax=fasm to FASM files
Jonas Hvid [Sat, 7 Mar 2020 18:30:40 +0000 (19:30 +0100)]
Add syntax=fasm to FASM files

4 years agoImplement subroutine to read character
Jonas Hvid [Sat, 7 Mar 2020 17:18:54 +0000 (18:18 +0100)]
Implement subroutine to read character

4 years agoImplement a subroutine to print a byte-string of a given length
Jonas Hvid [Sat, 7 Mar 2020 16:33:41 +0000 (17:33 +0100)]
Implement a subroutine to print a byte-string of a given length

4 years agoAdd "Hello world" UEFI application
Jonas Hvid [Fri, 6 Mar 2020 17:15:15 +0000 (18:15 +0100)]
Add "Hello world" UEFI application

4 years agoSet up QEMU and add some notes on UEFI
Jonas Hvid [Fri, 6 Mar 2020 13:44:09 +0000 (14:44 +0100)]
Set up QEMU and add some notes on UEFI

4 years agoSeparate example code from sys.f and add build instructions
Jonas Hvid [Fri, 6 Mar 2020 13:12:18 +0000 (14:12 +0100)]
Separate example code from sys.f and add build instructions

4 years agoAdd support for comments
Jonas Hvid [Tue, 10 Dec 2019 17:40:58 +0000 (18:40 +0100)]
Add support for comments

4 years agoReimplement HELLO in Forth
Jonas Hvid [Tue, 10 Dec 2019 17:21:41 +0000 (18:21 +0100)]
Reimplement HELLO in Forth

This implementation is a bit awkward right now, but we should be able to clean
it up later.

4 years agoImplement looping words and add fibonacci example
Jonas Hvid [Tue, 10 Dec 2019 15:58:14 +0000 (16:58 +0100)]
Implement looping words and add fibonacci example

4 years agoDefine ELSE
Jonas Hvid [Tue, 10 Dec 2019 15:28:35 +0000 (16:28 +0100)]
Define ELSE

4 years agoDefine IF and THEN
Jonas Hvid [Tue, 10 Dec 2019 15:26:36 +0000 (16:26 +0100)]
Define IF and THEN

4 years agoAdd error handling to parse_number
Jonas Hvid [Tue, 10 Dec 2019 14:51:24 +0000 (15:51 +0100)]
Add error handling to parse_number

4 years agoFix bug in interface of parse_number
Jonas Hvid [Tue, 10 Dec 2019 14:36:11 +0000 (15:36 +0100)]
Fix bug in interface of parse_number

This procedure did not actually do what it claimed to be doing. It just happened
to work with the way it was called.

4 years agoImplement some arithmetic words
Jonas Hvid [Mon, 9 Dec 2019 17:09:38 +0000 (18:09 +0100)]
Implement some arithmetic words

4 years agoDefine ':' and ';' in Forth
Jonas Hvid [Sun, 8 Dec 2019 20:51:08 +0000 (21:51 +0100)]
Define ':' and ';' in Forth

4 years agoSupport compilation mode in INTERPRET
Jonas Hvid [Sun, 8 Dec 2019 18:28:29 +0000 (19:28 +0100)]
Support compilation mode in INTERPRET

Now we can do

  S" BOOP" CREATE ] DOCOL HELLO 3 2 + .U NEWLINE EXIT [ BOOP

4 years agoAdd space for immediate flag
Jonas Hvid [Sun, 8 Dec 2019 17:32:21 +0000 (18:32 +0100)]
Add space for immediate flag

We don't actually use this for anything yet.

4 years agoImplement CREATE
Jonas Hvid [Fri, 6 Dec 2019 13:48:12 +0000 (14:48 +0100)]
Implement CREATE

We can now do stuff like:

  S" 3HELLO" CREATE
  S" DOCOL" FIND >CFA ,
  S" HELLO" FIND >CFA ,
  S" HELLO" FIND >CFA ,
  S" HELLO" FIND >CFA ,
  S" EXIT" FIND >CFA ,
  3HELLO

4 years agoImplement ','
Jonas Hvid [Fri, 6 Dec 2019 12:37:07 +0000 (13:37 +0100)]
Implement ','

4 years agoAdd variables 'LATEST' and 'HERE'
Jonas Hvid [Fri, 6 Dec 2019 12:30:54 +0000 (13:30 +0100)]
Add variables 'LATEST' and 'HERE'

These will be used for compilation.

4 years agoAutomatically parse integers in INTERPRET
Jonas Hvid [Tue, 3 Dec 2019 18:54:21 +0000 (19:54 +0100)]
Automatically parse integers in INTERPRET

4 years agoImplement '!' and '@' commands and add 'STATE' variable
Jonas Hvid [Tue, 3 Dec 2019 18:35:51 +0000 (19:35 +0100)]
Implement '!' and '@' commands and add 'STATE' variable

4 years agoRefactor: Create INTERPRET word
Jonas Hvid [Tue, 3 Dec 2019 18:28:17 +0000 (19:28 +0100)]
Refactor: Create INTERPRET word

(We will probably want to write this in assembly when we add more
functionality.)

4 years agoMove some assembly functions to separate module
Jonas Hvid [Sat, 30 Nov 2019 17:35:28 +0000 (18:35 +0100)]
Move some assembly functions to separate module

4 years agoRemove some unused code
Jonas Hvid [Sat, 30 Nov 2019 15:48:44 +0000 (16:48 +0100)]
Remove some unused code

4 years agoSupport executing words that the user enters
Jonas Hvid [Sat, 30 Nov 2019 15:47:04 +0000 (16:47 +0100)]
Support executing words that the user enters

4 years agoAdd metadata to all words using macro
Jonas Hvid [Mon, 25 Nov 2019 19:26:48 +0000 (20:26 +0100)]
Add metadata to all words using macro

4 years agoImplement FIND
Jonas Hvid [Mon, 25 Nov 2019 19:01:49 +0000 (20:01 +0100)]
Implement FIND

I could only be bothered to add some of the words to the dictionary in this
commit. We should probably have a macro for that.

4 years agoImplement word for reading numbers
Jonas Hvid [Sat, 23 Nov 2019 18:07:30 +0000 (19:07 +0100)]
Implement word for reading numbers

4 years agoImplement .U
Jonas Hvid [Sat, 23 Nov 2019 17:00:05 +0000 (18:00 +0100)]
Implement .U

4 years agoAlso implement BRANCH
Jonas Hvid [Sat, 23 Nov 2019 16:21:29 +0000 (17:21 +0100)]
Also implement BRANCH

I feel like we should theoretically be able to implement this in terms of
0BRANCH, but since we don't have a mechanism for getting the "outer" value of
RSI inside the function, we can't just implement it as

  : BRANCH 0 0BRANCH ;

In that case, RSI would point to EXIT when executing 0BRANCH.

4 years agoRename TYPE to TELL
Jonas Hvid [Sat, 23 Nov 2019 16:07:01 +0000 (17:07 +0100)]
Rename TYPE to TELL

This is what jonesforth uses, so we'll use the same convention.

4 years agoImplement 0BRANCH
Jonas Hvid [Sat, 23 Nov 2019 16:05:32 +0000 (17:05 +0100)]
Implement 0BRANCH

5 years agoAdd comments to Forth words that we expect to keep
Jonas Hvid [Thu, 21 Nov 2019 21:55:59 +0000 (22:55 +0100)]
Add comments to Forth words that we expect to keep

5 years agoImplement and use LIT
Jonas Hvid [Thu, 21 Nov 2019 21:11:42 +0000 (22:11 +0100)]
Implement and use LIT

5 years agoImplement READ_WORD
Jonas Hvid [Thu, 21 Nov 2019 18:12:47 +0000 (19:12 +0100)]
Implement READ_WORD

5 years agoImplement TYPE
Jonas Hvid [Thu, 21 Nov 2019 17:32:27 +0000 (18:32 +0100)]
Implement TYPE

5 years agoChange indentation to use 2 spaces
Jonas Hvid [Thu, 21 Nov 2019 17:23:14 +0000 (18:23 +0100)]
Change indentation to use 2 spaces

5 years agoAdd notes on IO and compilation
Jonas Hvid [Tue, 19 Nov 2019 18:50:13 +0000 (19:50 +0100)]
Add notes on IO and compilation

5 years agoAdd list of built-in variables
Jonas Hvid [Mon, 18 Nov 2019 17:47:55 +0000 (18:47 +0100)]
Add list of built-in variables

5 years agoTerminate program correctly
Jonas Hvid [Mon, 18 Nov 2019 17:23:37 +0000 (18:23 +0100)]
Terminate program correctly

5 years agoRemove unused code
Jonas Hvid [Mon, 18 Nov 2019 17:08:20 +0000 (18:08 +0100)]
Remove unused code

5 years agoAdd extension to notes file
Jonas Hvid [Mon, 18 Nov 2019 16:49:25 +0000 (17:49 +0100)]
Add extension to notes file

5 years agoAdd somewhat working hello world
Jonas Hvid [Sat, 16 Nov 2019 20:24:30 +0000 (21:24 +0100)]
Add somewhat working hello world

We exit by segfaulting, which is not very elegant.

5 years agoImplement basic return stack
Jonas Hvid [Thu, 14 Nov 2019 17:47:05 +0000 (18:47 +0100)]
Implement basic return stack

5 years agoAdd notes on how literals are handled
Jonas Hvid [Thu, 14 Nov 2019 17:28:11 +0000 (18:28 +0100)]
Add notes on how literals are handled

5 years agoAdd documentation describing how definitions are stored
Jonas Hvid [Thu, 14 Nov 2019 17:24:35 +0000 (18:24 +0100)]
Add documentation describing how definitions are stored

5 years agoImplement "next" macro and add related notes
Jonas Hvid [Thu, 14 Nov 2019 17:03:42 +0000 (18:03 +0100)]
Implement "next" macro and add related notes

5 years agoAdd notes about dictionary
Jonas Hvid [Thu, 14 Nov 2019 16:32:21 +0000 (17:32 +0100)]
Add notes about dictionary

5 years agoHello world in FASM
Jonas Hvid [Wed, 13 Nov 2019 20:53:45 +0000 (21:53 +0100)]
Hello world in FASM