diff --git a/ka/crt/sys.k b/ka/crt/sys.k index 1064614..0e6b322 100644 --- a/ka/crt/sys.k +++ b/ka/crt/sys.k @@ -1,10 +1,22 @@ ; The OS/K Team licenses this file to you under the MIT license. ; See the LICENSE file in the project root for more information. +; FIND syscalls +; +; Find file on disk +; +; IN +; ax0 = address of name buffer +; ax1 = size of name buffer +; +; OUT +; rax = # of bytes written in name buffer +; rdx = size of file +; +; +Sys.FindFirst := 0x20 +Sys.FindNext := 0x21 + ; Halt mode Sys.HLT := 0x99 -; DIR syscall -Sys.DIR := 0x100 - - diff --git a/ka/doskrnl.k b/ka/doskrnl.k index f3c79cd..17e40ac 100644 --- a/ka/doskrnl.k +++ b/ka/doskrnl.k @@ -16,10 +16,9 @@ start: call main - mov ax0, Sys.DIR - trap 0 + call CMD.builtins.dir - mov ax0, Sys.HLT + mov rax, Sys.HLT trap 0 crash diff --git a/ka/sys/intr/common.k b/ka/sys/intr/common.k index 0e6cba4..d48e47c 100644 --- a/ka/sys/intr/common.k +++ b/ka/sys/intr/common.k @@ -6,14 +6,25 @@ TrapHandlers.prolog: mov q[rbp-8], r11 mov q[rbp-16], r12 mov q[rbp-24], r13 + xor rdx, rdx - jmp rax ; go back + jmp rcx ; go back TrapHandlers.epilog: mov r13, q[rbp-24] mov r12, q[rbp-16] mov r11, q[rbp-8] + ; TRAP return values: RAX-RDX + + mov ax0, r12 + mov ax1, $rax + mov ax2, rax + call RFS.StoreReg + mov ax1, $rdx + mov ax2, rdx + call RFS.StoreReg + mov ax0, r11 call IDT.DoneHandling iret diff --git a/ka/sys/intr/trap0.k b/ka/sys/intr/trap0.k index 6ef08da..74835d1 100644 --- a/ka/sys/intr/trap0.k +++ b/ka/sys/intr/trap0.k @@ -6,16 +6,19 @@ TRAP0_STACK := 0x300000 trap0_handler: .init: - mov rax, .impl + mov rcx, .impl mov rbp, TRAP0_STACK jmp TrapHandlers.prolog .impl: mov ax0, r12 + mov ax1, $rax + call RFS.LoadReg call RFS.LoadArgs - b.z ax0, Sys.HLT, .handle_HLT - b.z ax0, Sys.DIR, .handle_DIR + b.z rax, Sys.HLT, .handle_HLT + b.z rax, Sys.FindNext, .handle_FindNext + b.z rax, Sys.FindFirst, .handle_FindFirst .fini: jmp TrapHandlers.epilog @@ -24,8 +27,12 @@ trap0_handler: ; Syscall implementations ; -.handle_DIR: - call CMD.builtins.dir +.handle_FindFirst: + call DISK.FindFirst + jmp .fini + +.handle_FindNext: + call DISK.FindNext jmp .fini .handle_HLT: diff --git a/ka/usr/cmd/dir.k b/ka/usr/cmd/dir.k index 543a61d..9e0931a 100644 --- a/ka/usr/cmd/dir.k +++ b/ka/usr/cmd/dir.k @@ -12,15 +12,18 @@ CMD.builtins.dir: .dirmsg = "Directory of C:\\\n\n" .first: + mov rax, Sys.FindFirst mov ax0, .buf mov ax1, NAME_MAX - call DISK.FindFirst + trap 0 + jmp .list .next: + mov rax, Sys.FindNext mov ax0, .buf mov ax1, NAME_MAX - call DISK.FindNext + trap 0 .list: b.z rax, 0, .end