fox32os/launcher/launch.asm
2022-08-28 22:23:54 -07:00

77 lines
1.9 KiB
NASM

; FXF launcher helper routines
; launch an FXF binary from a menu item
; inputs:
; r3: Launcher menu item
; outputs:
; none, does not return (jumps to `entry` when task ends)
launch_fxf:
mov r0, menu_items_launcher_list
add r0, 3 ; point to the first launcher item string
mul r3, 10
add r0, r3 ; r0 now points to the name of the FXF file to load
; copy the name into the launch_fxf_name buffer
mov r1, launch_fxf_name
mov r2, 8
call copy_memory_bytes
; disable the menu bar
call disable_menu_bar
; open the file
mov r0, launch_fxf_name
mov r1, 0
mov r2, launch_fxf_struct
call ryfs_open
; allocate memory for the binary
mov r0, launch_fxf_struct
call ryfs_get_size
call allocate_memory
cmp r0, 0
ifz jmp allocate_error
mov [launch_fxf_binary_ptr], r0
; read the file into memory
mov r0, launch_fxf_struct
mov r1, [launch_fxf_binary_ptr]
call ryfs_read_whole_file
; allocate a 64KiB stack
mov r0, 65536
call allocate_memory
cmp r0, 0
ifz jmp allocate_error
mov [launch_fxf_stack_ptr], r0
; relocate the binary
mov r0, [launch_fxf_binary_ptr]
call parse_fxf_binary
; create a new task
mov r1, r0
call get_unused_task_id
mov.8 [launch_fxf_task_id], r0
mov r2, [launch_fxf_stack_ptr]
add r2, 65536 ; point to the end of the stack (stack grows down!!)
mov r3, [launch_fxf_binary_ptr]
mov r4, [launch_fxf_stack_ptr]
call new_task
; fall-through to launch_fxf_yield_loop
; loop until the launched task ends
launch_fxf_yield_loop:
movz.8 r0, [launch_fxf_task_id]
call is_task_id_used
ifz jmp entry
call yield_task
rjmp launch_fxf_yield_loop
launch_fxf_name: data.str " fxf"
launch_fxf_struct: data.32 0 data.32 0
launch_fxf_task_id: data.8 0
launch_fxf_binary_ptr: data.32 0
launch_fxf_stack_ptr: data.32 0