kvisc/ka/usr/cmd/dir.k

122 lines
2.0 KiB
Plaintext
Raw Normal View History

2019-07-10 17:17:45 +02:00
; The OS/K Team licenses this file to you under the MIT license.
; See the LICENSE file in the project root for more information.
2019-07-01 13:16:17 +02:00
NAME_MAX := 256
2019-07-10 17:17:45 +02:00
builtins.dir:
2019-07-22 13:18:13 +02:00
push rbp
mov rbp, rsp
2019-07-01 13:16:17 +02:00
2019-07-22 13:18:13 +02:00
push r12
mov r12, zero # no. of files found
2019-07-01 13:16:17 +02:00
2019-07-02 20:13:05 +02:00
mov rcx, STRLEN_MAX
mov rdx, .dirmsg
prns.rep.nz rdx
2019-07-01 13:16:17 +02:00
2019-07-01 14:04:32 +02:00
.dirmsg = "Directory of C:\\\n\n"
2019-07-01 13:16:17 +02:00
.first:
2019-07-10 12:26:15 +02:00
mov rax, Sys.FindFirst
2019-07-01 13:16:17 +02:00
mov ax0, .buf
mov ax1, NAME_MAX
2019-07-10 12:26:15 +02:00
trap 0
2019-07-01 13:16:17 +02:00
jmp .list
.next:
2019-07-10 12:26:15 +02:00
mov rax, Sys.FindNext
2019-07-01 13:16:17 +02:00
mov ax0, .buf
mov ax1, NAME_MAX
2019-07-10 12:26:15 +02:00
trap 0
2019-07-01 13:16:17 +02:00
.list:
2019-07-22 14:41:50 +02:00
jmp.axz .end
2019-07-01 13:16:17 +02:00
; found something
2019-07-22 13:18:13 +02:00
add r12, r12, 1
2019-07-01 13:16:17 +02:00
; separate extension from file name
mov rcx, NAME_MAX
2019-07-22 13:18:13 +02:00
mov rsi, .buf
mov rdi, rsi
scasb.rep.nz rsi, '.'
2019-07-01 13:16:17 +02:00
2019-07-02 20:13:05 +02:00
; print file name
2019-07-22 13:18:13 +02:00
sub rcx, rsi, rdi
prns.rep rdi
2019-07-01 13:16:17 +02:00
; calculate where to put extension
2019-07-22 13:18:13 +02:00
sub rdi, rsi, .buf
sub rdi, rdi, 1
2019-07-01 13:16:17 +02:00
.ext_pad:
; print at least 11 non-space characters before extension
2019-07-22 13:18:13 +02:00
b.ae rdi, 11, .print_ext
2019-07-01 13:16:17 +02:00
prn ' '
2019-07-22 13:18:13 +02:00
add rdi, rdi, 1
2019-07-01 13:16:17 +02:00
jmp .ext_pad
.print_ext:
; here we print at least 4 characters excluding '.'
mov rcx, 4
prn ' '
2019-07-22 13:18:13 +02:00
cmp b[rsi], '.'
add.z rsi, rsi, 1
2019-07-01 13:16:17 +02:00
.print_ext.1:
2019-07-22 13:18:13 +02:00
b.z b[rsi], 0, .print_ext.2
2019-07-01 13:16:17 +02:00
; print and decrease rcx, unless it's already 0
2019-07-22 13:18:13 +02:00
mov rbx, b[rsi]
prn rbx
add rsi, rsi, 1
2019-07-18 22:49:31 +02:00
sub.cxnz rcx, rcx, 1
2019-07-01 13:16:17 +02:00
jmp .print_ext.1
.print_ext.2:
; did we print at least 4 bytes?
2019-07-17 22:25:50 +02:00
jmp.cxz .print_bytes ; yes, carry on
2019-07-01 13:16:17 +02:00
prn.rep ' '
.print_bytes:
; print file size in bytes
prn ' '
prn ' '
prn ' '
2019-07-05 14:06:14 +02:00
shr rax, rdx, 10
2019-07-17 22:25:50 +02:00
and rdx, rdx, 1023
2019-07-01 13:16:17 +02:00
push rdx
push rax
2019-07-18 22:49:31 +02:00
call printf, .bytesstr
2019-07-17 22:25:50 +02:00
add rsp, rsp, 16
2019-07-01 13:16:17 +02:00
.bytesstr = "%d kilobytes + %d bytes"
.prepare_next:
; go find next entry
prn 10
jmp .next
.end:
2019-07-22 13:18:13 +02:00
push r12
2019-07-18 22:49:31 +02:00
call printf, .endstr1
2019-07-17 22:25:50 +02:00
add rsp, rsp, 8
2019-07-01 13:16:17 +02:00
2019-07-18 22:49:31 +02:00
call print, .endstr2
2019-07-01 13:16:17 +02:00
2019-07-22 13:18:13 +02:00
pop r12
leave
2019-07-01 13:16:17 +02:00
ret
.buf = [256]
.endstr1 = " %d file(s)\n"
.endstr2 = " 0 dir(s)\n"
2019-07-01 14:04:32 +02:00