Moved NovaForth into a crate with a build script

This commit is contained in:
2024-08-11 21:08:21 -05:00
parent bd54ae1ef0
commit 98c95b55f4
23 changed files with 2209 additions and 19 deletions
+106
View File
@@ -0,0 +1,106 @@
input_number:
loadw cursor
call nova_word
loadw heap
loadw is_number_hook
call
ret
; Prints a number, using whatever the current itoa_hook is
print_number:
loadw itoa_hook
jmp
; Print the number on top of the stack, in decimal, with a
; leading '-' if it's negative
; TODO: refactor this to use macros
itoa: ; ( num -- )
dup
alt 0 ; We less than 0?
brz @itoa_pos
xor 0xffffff ; Less than zero, so negate it
add 1
push 45 ; 45 is '-', print a leading dash
call nova_emit
itoa_pos: ; ( num -- )
loadw heap ; Gonna build the string on the heap
dup
swap 0
store
add 1
pushr
itoa_loop:
dup ; ( num num ) [ arr ]
mod 10
dup
alt 0
#if
xor 0xffffff
add 1
#end
dup
add 48 ; ( num mod ch )
peekr ; ( num mod ch arr ) [ arr ]
store
popr ; ( num mod arr ) [ ]
add 1
pushr ; ( num mod ) [ arr+1 ]
sub
div 10
dup
brnz @itoa_loop
pop
; Got the array of digits in reverse order, print them out:
popr
sub 1
itoa_print_loop:
dup
load
call nova_emit
sub 1
dup
load
brnz @itoa_print_loop
pop
ret
; Print the number on top of the stack, in hex
hex_itoa: ; ( num -- )
loadw heap ; Build the string on the heap, but don't allot the space
dup
swap 0
store ; Store a null terminator as the first char
add 1 ; Look at the next char
pushr ; Put this on the r stack to be used later
#while
dup
#do
dup
and 0xf ; ( num low-nibble )
dup
lt 10
#if
add 48 ; It's 0-9, so add a '0'
#else
add 87 ; It's a-f, so add an 'a' - 10
#end
peekr
store
popr
add 1
pushr
rshift 4
#end
pop
popr
sub 1
#while
dup
load
call dupnz
#do
call nova_emit
sub 1
#end
pop
ret