;;; ======================================== ;;; Dynamic memory management. Allocated with MALLOC and released with ;;; MUNMAP (see below) ;; ( size -- addr ) ;; Allocates memory (using brk) WORD p_malloc,'MALLOC',fasm pushr rsi ; pretend it's a FORTH word since it ; ends via sys_mmap_asm pop rax push qword 0 ; address of mapping (suggestion) push rax ; length of mapping push qword 3 ; protection mode PROT_READ | PROT_WRITE push qword 8226 ; flags PRIVATE | ANONYMOUS | LOCKED push qword -1 ; fd -1 push qword 0 ; offset jmp sys_mmap_asm ; exit via sys_mmap ;;; ======================================== ;;; Mapping files ;; ( fd -- address ) ;; Request memory mapping of a file WORD p_mmap,'MMAP',fasm pushr rsi ; pretend it's a FORTH word since it ; ends via sys_mmap_asm pop rax push qword 0 ; address of mapping (suggestion) push qword 10240 ; length of mapping push qword 1 ; protection mode PROT_READ push qword 2 ; flags MAP_PRIVATE push rax ; fd push qword 0 ; offset jmp sys_mmap_asm ; exit via sys_mmap ;;; ======================================== ;;; Input stream handling. An input stream has a stream buffer that is ;;; gradually filled on needs basis. The stream buffer includes a ;;; header portion with: ;;; * size of buffer (excluding the 32 byte head) ;;; * source file descriptor ;;; * current fill ;;; * current read position WORD p_stream,'STREAM', ;; ( fd size -- addr ) ;; Allocates a stream buffer of the given size and initializes ;; it to be filled from the given input file descriptor. dq p_dup ; ( fd size size ) dq p_malloc ; ( fd size addr ) dq p_2dup ; ( fd size addr size addr ) dq p_swap ; ( fd size addr addr size ) dq p_erase ; ( fd size addr ) ENDFORTH pop rax ; ( fd size ) pop rbx ; ( fd ) sub rbx,32 mov [rax],rbx pop rbx mov [rax+8],rbx push rax jmp exit WORD p_read_stream_char,'READ-STREAM-CHAR',fasm ;; ( stream -- ch ) pushr rsi mov rax,qword [rsp] mov rbx,[rax+16] ; fill p_read_stream_char.READ: mov rcx,[rax+24] ; current cmp rbx,rcx jg p_read_stream_char.CHAR push qword [rax+8] ; fd lea rbx,[rax+32] push rbx ; buffer push qword [rax] ; size mov qword[rax+16],0 mov qword[rax+24],0 DOFORTH sys_read pop rbx mov rax,qword [rsp] cmp rbx,0 jle p_read_stream_char.EOF mov qword[rax+16],rbx jmp p_read_stream_char.READ p_read_stream_char.EOF: mov qword [rsp],-1 popr rsi next p_read_stream_char.CHAR: inc qword [rax+24] add rcx,32 mov qword [rsp],0 mov bl,[rax+rcx] mov byte [rsp],bl popr rsi next WORD p_line_buffer,'LINE-BUFFER',dovariable ;; A buffer for holding a text line rb 1024 WORD p_read_word,'READ-WORD',fasm ;; ( stream -- addr length ) ;; Read a text line from the stream into the line buffer pushr rsi pop rax push qword p_line_buffer_DFA push qword 0 push rax p_read_word_skipblanks: FORTH dq p_dup dq p_read_stream_char ENDFORTH pop rbx cmp bl,0 jl p_read_word_nomore cmp bl,' ' jle p_read_word_skipblanks p_read_word_readword: FORTH dq p_dup dq p_read_stream_char ENDFORTH pop rbx cmp bl,0 jl p_read_word_nomore cmp bl,' ' jle p_read_word_nomore ;; ( buffer length stream ) mov rax,qword [rsp+16] mov rcx,qword [rsp+8] mov [rax+rcx],bl inc qword [rsp+8] jmp p_read_word_readword p_read_word_nomore: pop rax popr rsi next