projects
/
rrq
/
jonasforth.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Implement Linux backend
[rrq/jonasforth.git]
/
main.asm
diff --git
a/main.asm
b/main.asm
index 0190d18ae34525e0cb67aa3bb7e29827f484efa7..93e576fe684543b77547aa936a2b74a109e34116 100644
(file)
--- a/
main.asm
+++ b/
main.asm
@@
-1,56
+1,31
@@
;; vim: syntax=fasm
;; vim: syntax=fasm
-include '%OS_INCLUDE%'
-
-;;
Print a string of a given length
.
+;; At compile-time we load the module given by the environment variable
+;; OS_INCLUDE. All of the following these procedures should preserve the value
+;;
of RSI and RSP. They may use other registers as they like
.
;;
;;
-;; Input:
-;; - RCX = Pointer to buffer
-;; - RDX = Buffer length
+;; The module should provide the following:
;;
;;
-;; Clobbers: RAX, RCX, R11, RDI, RSI
-macro sys_print_string {
- push r8
- push r9
- push r10
-
- call uefi_print_string
-
- pop r10
- pop r9
- pop r8
-}
-
-;; Read a character from the user into the given buffer.
+;; os_code_section
+;; Macro to start the text segment.
;;
;;
-;;
Input:
-;;
- RSI = Character buffer
+;;
os_data_section
+;;
Macro to start the data segment.
;;
;;
-;;
Output:
-;;
- BYTE [RSI] = Character
+;;
os_initialize
+;;
Called at initialization.
;;
;;
-;; Clobbers: RAX, RCX, R11, RDI, RSI, RDX
-macro sys_read_char {
- push rbx
- push r8
- push r9
- push r10
- push r15
-
- mov rcx, rsi
- call uefi_read_char
-
- pop r15
- pop r10
- pop r9
- pop r8
- pop rbx
-}
-
-macro sys_terminate code {
- mov rax, code
- call uefi_terminate
-}
+;; os_print_string
+;; Takes a string buffer in RCX and the length in RDX, and prints the string
+;; to the console.
+;;
+;; os_read_char
+;; Wait for the user to type a key, and then put the corresponding ASCII byte
+;; into RAX.
+;;
+;; os_terminate
+;; Shut down the system, returning the error code given in RAX.
+include '%OS_INCLUDE%'
;; The code in this macro is placed at the end of each Forth word. When we are
;; executing a definition, this code is what causes execution to resume at the
;; The code in this macro is placed at the end of each Forth word. When we are
;; executing a definition, this code is what causes execution to resume at the
@@
-109,16
+84,16
@@
macro forth_asm label, name, immediate {
.start:
}
.start:
}
-section '.text' code readable executable
-
include "impl.asm" ; Misc. subroutines
include "bootstrap.asm" ; Forth words encoded in Assembly
include "impl.asm" ; Misc. subroutines
include "bootstrap.asm" ; Forth words encoded in Assembly
+os_code_section
+
main:
cld ; Clear direction flag so LODSQ does the right thing.
mov rbp, return_stack_top ; Initialize return stack
main:
cld ; Clear direction flag so LODSQ does the right thing.
mov rbp, return_stack_top ; Initialize return stack
- call
uefi
_initialize
+ call
os
_initialize
mov rax, MAIN
jmp qword [rax]
mov rax, MAIN
jmp qword [rax]
@@
-221,7
+196,7
@@
forth_asm EMIT, 'EMIT'
lea rcx, [rsp]
mov rdx, 1
lea rcx, [rsp]
mov rdx, 1
-
sy
s_print_string
+
call o
s_print_string
add rsp, 8
popr rax
add rsp, 8
popr rax
@@
-246,12
+221,7
@@
forth_asm KEY, 'KEY'
jne .from_buffer
;; Reading user input
jne .from_buffer
;; Reading user input
- push rsi
- mov rsi, .buffer
- sys_read_char
- pop rsi
-
- movzx rax, byte [.buffer]
+ call os_read_char
ret
.from_buffer:
ret
.from_buffer:
@@
-322,7
+292,7
@@
forth_asm TELL, 'TELL'
pop rdx ; Length
pop rcx ; Buffer
pop rdx ; Length
pop rcx ; Buffer
-
sy
s_print_string
+
call o
s_print_string
popr rsi
popr rax
popr rsi
popr rax
@@
-330,7
+300,8
@@
forth_asm TELL, 'TELL'
;; Exit the program cleanly.
forth_asm TERMINATE, 'TERMINATE'
;; Exit the program cleanly.
forth_asm TERMINATE, 'TERMINATE'
- sys_terminate 0
+ mov rax, 0
+ call os_terminate
;; Duplicate a pair of elements.
forth_asm PAIRDUP, '2DUP'
;; Duplicate a pair of elements.
forth_asm PAIRDUP, '2DUP'
@@
-419,7
+390,7
@@
forth_asm DOTU, '.U'
;; Print the buffer
mov rcx, .buffer
mov rdx, [.printed_length]
;; Print the buffer
mov rcx, .buffer
mov rdx, [.printed_length]
-
sy
s_print_string
+
call o
s_print_string
;; Restore RSI and continue execution
pop rsi
;; Restore RSI and continue execution
pop rsi
@@
-492,10
+463,7
@@
forth_asm READ_STRING, 'S"'
mov [.length], 0
.read_char:
mov [.length], 0
.read_char:
- mov rsi, .char_buffer
- sys_read_char
-
- mov al, [.char_buffer]
+ call os_read_char
cmp al, '"'
je .done
cmp al, '"'
je .done
@@
-647,7
+615,7
@@
forth INPUT_LENGTH, 'INPUT-LENGTH'
dq LIT, input_buffer_length
dq EXIT
dq LIT, input_buffer_length
dq EXIT
-section '.data' readable writable
+os_data_section
;; The LATEST variable holds a pointer to the word that was last added to the
;; dictionary. This pointer is updated as new words are added, and its value is
;; The LATEST variable holds a pointer to the word that was last added to the
;; dictionary. This pointer is updated as new words are added, and its value is
@@
-695,6
+663,8
@@
return_stack_top:
;; We store some Forth code in sys.f that defined common words that the user
;; would expect to have available at startup. To execute these words, we just
;; include the file directly in the binary, and then interpret it at startup.
;; We store some Forth code in sys.f that defined common words that the user
;; would expect to have available at startup. To execute these words, we just
;; include the file directly in the binary, and then interpret it at startup.
-sysf file 'sys.f'
+sysf:
+file 'sys.f'
+file 'example.f'
sysf.len = $ - sysf
sysf.len = $ - sysf