%ifndef FILE_INC %define FILE_INC %define FBUF_DEFAULT_SIZE 16 %define FBUF_ALLOC_SIZE 1024*32 %ifndef SYS_INC %include "sys.inc" %endif %ifndef ALLOC_INC %include "alloc.inc" %endif %ifndef ZSTRING_INC %include "zstring.inc" %endif struc FileData fname: resq 1 buffer: resq 1 size: resq 1 fd: resq 1 endstruc %macro make_fbuffer 3 ;; %1 = File Name ;; %2 = Buffer Name ;; %3 = Buffer Size section .data %2_fname: db %1,0 %2_buffer: times %3 db 0 %2_bufferLen: equ $ - %2_buffer db 0 section .bss %2_fd: resq 1 section .data %2_filedata: istruc FileData at fname, dq %2_fname at buffer, dq %2_buffer at size, dq %2_bufferLen at fd, dq %2_fd iend %endm %macro fopen 1 mov rax, SYS_OPEN lea rdi, [rel %1_fname] xor rsi, rsi ; READ-ONLY syscall mov [rel %1_fd], rax %endm %macro flen 1 mov rax, SYS_LSEEK mov rdi, [rel %1_fd] mov rsi, 0 mov rdx, 2 syscall %endm %macro fbegin 1 mov rax, SYS_LSEEK mov rdi, [rel %1_fd] mov rsi, 0 mov rdx, 0 syscall %endm %macro fread 1 mov rax, SYS_READ mov rdi, [rel %1_fd] lea rsi, [rel %1_buffer] mov rdx, %1_bufferLen syscall %endm %macro fclose 1 mov rax, SYS_CLOSE mov rdi, [rel %1_fd] syscall %endm ffopen: push rbp mov rbp, rsp ;; RAX = filedata push rax mov rdi, [rax + fname] mov rax, SYS_OPEN xor rsi, rsi syscall pop rdx mov rcx, rdx mov rdx, [rdx + fd] mov [rdx], rax mov rax, rcx ;; mov rsp, rbp pop rbp ret ffread: push rbp mov rbp, rsp mov rdi, [rax + fd] mov rdi, [rdi] mov rsi, [rax + buffer] mov rdx, [rax + size] mov rax, SYS_READ syscall ;; mov rsp, rbp pop rbp ret print_filedata: push rbp mov rbp, rsp ;; RAX = filedata push rax mov rax, [rax + buffer] call print_zstring pop rax mov rsp, rbp pop rbp ret %endif