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.
|
|
|
|
|
|
|
|
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-08-03 17:41:44 +02:00
|
|
|
call print, .dirmsg
|
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
|
2019-08-03 18:20:36 +02:00
|
|
|
mov ax1, FNAME_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
|
2019-08-03 18:20:36 +02:00
|
|
|
mov ax1, FNAME_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-08-03 17:41:44 +02:00
|
|
|
inc r12, 1
|
2019-07-01 13:16:17 +02:00
|
|
|
|
|
|
|
; separate extension from file name
|
2019-08-03 18:20:36 +02:00
|
|
|
mov rcx, FNAME_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
|
2019-08-03 17:41:44 +02:00
|
|
|
dec 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-08-03 17:41:44 +02:00
|
|
|
inc 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], '.'
|
2019-08-03 19:01:12 +02:00
|
|
|
inc.z 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-08-03 17:41:44 +02:00
|
|
|
prn b[rsi]
|
|
|
|
inc rsi, 1
|
|
|
|
dec.cxnz 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
|
2019-08-03 17:41:44 +02:00
|
|
|
mov rcx, 3
|
|
|
|
prn.rep ' '
|
2019-07-01 13:16:17 +02:00
|
|
|
|
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-08-03 17:41:44 +02:00
|
|
|
inc 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-08-03 17:41:44 +02:00
|
|
|
inc 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
|
|
|
|
|
2019-08-03 18:20:36 +02:00
|
|
|
.buf = [FNAME_MAX]
|
2019-07-01 13:16:17 +02:00
|
|
|
.endstr1 = " %d file(s)\n"
|
|
|
|
.endstr2 = " 0 dir(s)\n"
|
2019-07-01 14:04:32 +02:00
|
|
|
|