From 8bea7c39b41c9b52b7b9e5f4225262eafde16611 Mon Sep 17 00:00:00 2001 From: Ry Date: Thu, 30 Mar 2023 22:16:31 -0700 Subject: [PATCH] kernel + sh: Another stream overhaul Certain streams can now be opened by name by prefixing the name with a colon (':'). The only supported named stream at the moment is :fb, which streams to/from the background framebuffer. A new syscall called `get_size` was also added, which should be used instead of `ryfs_get_size`. This new syscall supports getting the size of streams. --- applications/sh/commands/dir.asm | 2 +- applications/sh/commands/type.asm | 2 +- applications/sh/launch.asm | 2 +- fox32os.def | 1 + kernel/fxf/launch.asm | 2 +- kernel/main.asm | 7 +-- kernel/vfs/fb.asm | 60 +++++++++++++++++++++ kernel/{ => vfs}/vfs.asm | 89 ++++++++++++++++++++++++++----- 8 files changed, 145 insertions(+), 20 deletions(-) create mode 100644 kernel/vfs/fb.asm rename kernel/{ => vfs}/vfs.asm (73%) diff --git a/applications/sh/commands/dir.asm b/applications/sh/commands/dir.asm index fc4b371..61d6ad4 100644 --- a/applications/sh/commands/dir.asm +++ b/applications/sh/commands/dir.asm @@ -63,7 +63,7 @@ shell_dir_command_loop: cmp r0, 0 ifz jmp shell_dir_command_failed_to_open_file mov r0, shell_dir_command_temp_file_struct - call ryfs_get_size + call get_size call print_decimal_to_terminal shell_dir_command_failed_to_open_file: ; new line diff --git a/applications/sh/commands/type.asm b/applications/sh/commands/type.asm index e7c7020..3d3ba68 100644 --- a/applications/sh/commands/type.asm +++ b/applications/sh/commands/type.asm @@ -16,7 +16,7 @@ shell_type_command: ifz jmp shell_type_command_file_not_found mov r0, shell_type_command_file_struct - call ryfs_get_size + call get_size mov r31, r0 shell_type_command_loop: mov r0, 1 diff --git a/applications/sh/launch.asm b/applications/sh/launch.asm index 3c4ac59..4f8fa5d 100644 --- a/applications/sh/launch.asm +++ b/applications/sh/launch.asm @@ -45,7 +45,7 @@ launch_fxf_name_loop_done: ; allocate memory for the binary mov r0, launch_fxf_struct - call ryfs_get_size + call get_size call allocate_memory cmp r0, 0 ifz jmp allocate_error diff --git a/fox32os.def b/fox32os.def index 4c26c00..40676b1 100644 --- a/fox32os.def +++ b/fox32os.def @@ -42,6 +42,7 @@ seek: jmp [0x00000D14] tell: jmp [0x00000D18] read: jmp [0x00000D1C] write: jmp [0x00000D20] +get_size: jmp [0x00000D24] ; widget jump table draw_widgets_to_window: jmp [0x00000E10] diff --git a/kernel/fxf/launch.asm b/kernel/fxf/launch.asm index dee5d67..c99dd8c 100644 --- a/kernel/fxf/launch.asm +++ b/kernel/fxf/launch.asm @@ -33,7 +33,7 @@ launch_fxf_from_disk: ; allocate memory for the binary mov r0, launch_fxf_struct - call ryfs_get_size + call get_size call allocate_memory cmp r0, 0 ifz jmp launch_fxf_from_disk_allocate_error diff --git a/kernel/main.asm b/kernel/main.asm index d1d93aa..5a33549 100644 --- a/kernel/main.asm +++ b/kernel/main.asm @@ -65,6 +65,7 @@ jump_table: data.32 tell data.32 read data.32 write + data.32 get_size ; widget jump table org.pad 0x00000610 @@ -204,7 +205,7 @@ load_startup_task: ; allocate memory for the startup file mov r0, startup_file_struct - call ryfs_get_size + call get_size call allocate_memory cmp r0, 0 ifz jmp memory_error @@ -239,7 +240,7 @@ load_startup_task: ; we do this by checking to see if the size of startup.cfg is less than or equal to 12 * next_task_id bytes inc.8 [next_task_id] mov r0, startup_cfg_struct - call ryfs_get_size + call get_size movz.8 r1, [next_task_id] mul r1, 12 cmp r0, r1 @@ -385,9 +386,9 @@ get_os_api_version: #include "allocator.asm" #include "fxf/fxf.asm" #include "task.asm" + #include "vfs/vfs.asm" #include "widget/widget.asm" #include "window/window.asm" - #include "vfs.asm" bottom_bar_str_0: data.strz "FOX" bottom_bar_str_1: data.strz "32" diff --git a/kernel/vfs/fb.asm b/kernel/vfs/fb.asm new file mode 100644 index 0000000..43db938 --- /dev/null +++ b/kernel/vfs/fb.asm @@ -0,0 +1,60 @@ +; framebuffer vfs stream routines + +framebuffer_vfs_stream_name: data.strz "fb" + +; open a framebuffer stream +; inputs: +; r2: file struct: pointer to a blank file struct (stream) +; outputs: +; r0: non-zero +open_stream_fb: + push r2 + + mov.8 [r2], 0 ; write file_reserved_1 + inc r2 + mov.16 [r2], 0 ; write file_reserved_2 + add r2, 2 + mov [r2], 0 ; write file_seek_offset + add r2, 4 + mov.8 [r2], 1 ; write file_system_type + inc r2 + mov [r2], fb_stream_read ; write file_read_call + add r2, 4 + mov [r2], fb_stream_write ; write file_write_call + add r2, 4 + mov [r2], 0x0012C000 ; write file_size + add r2, 4 + mov [r2], 0 ; write file_reserved_3 + add r2, 4 + mov [r2], 0 ; write file_reserved_4 + add r2, 4 + mov [r2], 0 ; write file_reserved_5 + + pop r2 + mov r0, 1 + ret + +; read a byte from the framebuffer +; inputs: +; r0: seek offset +; outputs: +; r0: byte +fb_stream_read: + add r0, 0x02000000 + cmp r0, 0x0212C000 + ifgteq mov r0, 0x0212BFFF + movz.8 r0, [r0] + ret + +; write a byte to the framebuffer +; inputs: +; r0: pointer to source buffer +; r1: seek offset +; outputs: +; none +fb_stream_write: + add r1, 0x02000000 + cmp r1, 0x0212C000 + ifgteq mov r1, 0x0212BFFF + mov.8 [r1], [r0] + ret diff --git a/kernel/vfs.asm b/kernel/vfs/vfs.asm similarity index 73% rename from kernel/vfs.asm rename to kernel/vfs/vfs.asm index 2a5967c..e322e92 100644 --- a/kernel/vfs.asm +++ b/kernel/vfs/vfs.asm @@ -5,6 +5,12 @@ ; file_first_sector: 2 bytes ; file_seek_offset: 4 bytes ; file_system_type: 1 byte (0x00 for RYFS) +; file_reserved_1: 4 bytes +; file_reserved_2: 4 bytes +; file_reserved_3: 4 bytes +; file_reserved_4: 4 bytes +; file_reserved_5: 4 bytes +; file_reserved_6: 4 bytes ; file struct for stream: ; file_reserved_1: 1 byte @@ -13,19 +19,40 @@ ; file_system_type: 1 byte (0x01 for stream) ; file_read_call: 4 bytes ; file_write_call: 4 bytes +; file_size: 4 bytes +; file_reserved_3: 4 bytes +; file_reserved_4: 4 bytes +; file_reserved_5: 4 bytes -; open a file from a RYFS-formatted disk +; open a file from a RYFS-formatted disk, or a named stream ; inputs: -; r0: pointer to file name string (8.3 format, for example "testfile.txt" or "test.txt") -; r1: disk ID -; r2: file struct: pointer to a blank file struct +; r0: pointer to file name string (8.3 format if file, for example "testfile.txt" or "test.txt") +; r1: disk ID (ignored if stream) +; r2: file struct: pointer to a blank file struct (8 bytes if file, 16 bytes if stream) ; outputs: -; r0: first file sector, or zero if file wasn't found +; r0: if file: first file sector, or zero if file wasn't found +; if stream: non-zero if stream opened, or zero if not open: + cmp.8 [r0], ':' + ifz jmp open_stream call convert_filename cmp r0, 0 ifz ret jmp ryfs_open +open_stream: + push r1 + + inc r0 + + ; fb + mov r1, framebuffer_vfs_stream_name + call compare_string + ifz pop r1 + ifz jmp open_stream_fb + + pop r1 + mov r0, 0 + ret ; seek specified file to the specified offset ; inputs: @@ -44,13 +71,38 @@ seek: tell: jmp ryfs_tell +; get the exact size of the specified file +; inputs: +; r0: pointer to file struct +; outputs: +; r0: size in bytes +get_size: + push r1 + push r0 + add r0, 7 + movz.8 r1, [r0] + pop r0 + cmp.8 r1, 0x00 + ifz pop r1 + ifz jmp ryfs_get_size + cmp.8 r1, 0x01 + ifz pop r1 + ifz jmp stream_get_size + pop r1 + ret +stream_get_size: + add r0, 16 + mov r0, [r0] + + ret + ; read specified number of bytes into the specified buffer ; inputs: ; r0: number of bytes to read ; r1: pointer to file struct ; r2: pointer to destination buffer ; outputs: -; r0: number of bytes left to read (streams can read short) +; none read: push r3 push r1 @@ -66,25 +118,26 @@ read: pop r3 ret stream_read: + push r0 push r1 push r2 - stream_read_loop: call stream_read_char - call yield_task - cmp.8 [r2], 0 - ifz jmp stream_read_out + push r0 + push r2 + call yield_task + pop r2 + pop r0 inc r2 dec r0 ifnz jmp stream_read_loop -stream_read_out: pop r2 pop r1 + pop r0 ret - stream_read_char: push r0 push r1 @@ -100,6 +153,10 @@ stream_read_char: pop r2 mov.8 [r2], r0 + ; increment the seek offset + sub r1, 6 + inc [r1] + pop r1 pop r0 ret @@ -138,7 +195,6 @@ stream_write_loop: pop r2 pop r31 ret - stream_write_char: push r0 push r1 @@ -152,6 +208,10 @@ stream_write_char: add r3, 10 call [r3] + ; increment the seek offset + sub r3, 10 + inc [r3] + pop r3 pop r1 pop r0 @@ -239,3 +299,6 @@ convert_filename_fail: pop r1 ret convert_filename_output_string: data.fill 0, 12 + + ; named streams + #include "vfs/fb.asm"