fox32os/applications/sh/commands/dir.asm
Ry 8bea7c39b4 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.
2023-03-30 22:18:23 -07:00

88 lines
2.3 KiB
NASM

; dir command
shell_dir_command_string: data.strz "dir"
shell_dir_command:
mov r0, shell_dir_command_header_string
call print_str_to_terminal
call get_current_disk_id
mov r1, r0
mov r0, shell_dir_command_list_buffer
call ryfs_get_file_list
cmp r0, 0
ifz ret
mov r31, r0
mov r3, 0
shell_dir_command_loop:
; copy one file name from the list buffer to the file buffer
mov r0, shell_dir_command_list_buffer
add r0, r3
mov r1, shell_dir_command_file_buffer
mov r2, 8
call copy_memory_bytes
add r1, 8
mov.8 [r1], 0
; copy file type from the list buffer to the type buffer
mov r0, shell_dir_command_list_buffer
add r0, r3
add r0, 8
mov r1, shell_dir_command_type_buffer
mov r2, 3
call copy_memory_bytes
add r1, 3
mov.8 [r1], 0
; print the file name to the terminal
mov r0, shell_dir_command_file_buffer
call print_str_to_terminal
; space
mov r0, ' '
call print_character_to_terminal
; print the file type to the terminal
mov r0, shell_dir_command_type_buffer
call print_str_to_terminal
; two spaces
mov r0, ' '
call print_character_to_terminal
call print_character_to_terminal
; get and print the file size
; call ryfs_open instead of open because this uses the internal filename style
call get_current_disk_id
mov r1, r0
mov r0, shell_dir_command_list_buffer
add r0, r3
mov r2, shell_dir_command_temp_file_struct
call ryfs_open
cmp r0, 0
ifz jmp shell_dir_command_failed_to_open_file
mov r0, shell_dir_command_temp_file_struct
call get_size
call print_decimal_to_terminal
shell_dir_command_failed_to_open_file:
; new line
mov r0, 10
call print_character_to_terminal
; point to next file name in the buffer
add r3, 11
loop shell_dir_command_loop
ret
shell_dir_command_list_buffer: data.fill 0, 341
shell_dir_command_file_buffer: data.fill 0, 9
shell_dir_command_type_buffer: data.fill 0, 4
shell_dir_command_temp_file_struct: data.fill 0, 32
shell_dir_command_header_string:
data.8 SET_COLOR data.8 0x20 data.8 1 ; set the color to green
data.str "file type size" data.8 10
data.8 SET_COLOR data.8 0x70 data.8 1 ; set the color to white
data.8 0