diff --git a/as/k-as.py b/as/k-as.py index 8c40abb..59d728a 100755 --- a/as/k-as.py +++ b/as/k-as.py @@ -438,9 +438,6 @@ pref2len = { } i_aliases = { - "j_1" : "jmp_1", - "m_2" : "mov_2", - "b_3" : "bch_3", "inc_2" : "add_2", "dec_2" : "sub_2", } diff --git a/ka/crt/crt.k b/ka/crt/crt.k index 6088c01..8813b0c 100644 --- a/ka/crt/crt.k +++ b/ka/crt/crt.k @@ -45,7 +45,6 @@ include "crt/fmt/format.k" include "crt/str/string.k" include "crt/mem/memory.k" include "crt/lib/time.k" -include "crt/lib/arith128.k" abort: crash diff --git a/ka/crt/fmt/doprnt.k b/ka/crt/fmt/doprnt.k index d1467e1..f01353e 100644 --- a/ka/crt/fmt/doprnt.k +++ b/ka/crt/fmt/doprnt.k @@ -26,7 +26,7 @@ doprnt: ; everything below r13 is a regular character; print it .print_regular: - b.z r12, r13, .check_modf + beq r12, r13, .check_modf call .doput, b[r12] @@ -36,20 +36,20 @@ doprnt: .check_modf: ; did we find a '%' ? ; if not, then we found fmt's null-terminator; we're done - b.nz b[r12], '%', .epilogue + bne b[r12], '%', .epilogue ; we did find a modifier / '%' mov rax, b[r12+1] inc r12, 2 - b.z rax, 's', .modf_s - b.z rax, 'c', .modf_c - b.z rax, 'p', .modf_p - b.z rax, 'x', .modf_x - b.z rax, 'd', .modf_d - b.z rax, 'o', .modf_o - b.z rax, 'b', .modf_b - b.z rax, '%', .modf_percent + beq rax, 's', .modf_s + beq rax, 'c', .modf_c + beq rax, 'p', .modf_p + beq rax, 'x', .modf_x + beq rax, 'd', .modf_d + beq rax, 'o', .modf_o + beq rax, 'b', .modf_b + beq rax, '%', .modf_percent ; unrecognized jmp .bad_modifier @@ -59,11 +59,11 @@ doprnt: mov r13, q[r14] inc r14, 8 - b.z r13, zero, .nullstring + bzr r13, .nullstring .print_string: mov ax0, b[r13] - b.z ax0, zero, .main_loop + bzr ax0, .main_loop inc r13, 1 call .doput @@ -109,14 +109,16 @@ doprnt: .print_itoa_buf: mov ax0, b[r13] - cmp ax0, zero - inc.z rsp, 80 - jmp.z .main_loop - + bzr ax0, .pib_end_loop inc r13, 1 + call .doput jmp .print_itoa_buf +.pib_end_loop: + inc rsp, 80 + jmp .main_loop + .modf_percent: call .doput, '%' jmp .main_loop @@ -158,15 +160,18 @@ doprnt: ; we follow the C convention that sprintf()-like functions ; should return the number of characters that would have ; been printed/written if 'n' were big enough - cmp r15, zero - ret.z + bzr r15, .r ; decrement n and print dec r15, 1 call r17 - - ; did putc fail? - mov.axnz r15, zero ; yes, so artificially set n=0 + ; did putc fail? + jraxz .r + + ; yes, so artificially set n=0 + mov r15, zero + +.r: ret diff --git a/ka/crt/fmt/ltostr.k b/ka/crt/fmt/ltostr.k index f1b9fdb..304cd8c 100644 --- a/ka/crt/fmt/ltostr.k +++ b/ka/crt/fmt/ltostr.k @@ -23,27 +23,29 @@ ltostr: mov rcx, zero ; make sure base is in [2, 32] - b.b ax2, 2, .bad - b.a ax2, 36, .bad + bltu ax2, 2, .bad + bltu 36, ax2, .bad ; deal with zero - b.z ax1, zero, .is_zero + bzr ax1, .is_zero ; deal with base 10 signedness - b.z ax3, zero, .conv - b.nz ax2, 10, .conv ; base 10 + bzr ax3, .conv + bne ax2, 10, .conv ; base 10 shr rcx, ax1, 63 ; extract ax1 sign - sub.cxnz ax1, zero, ax1 ; NEG if negative + jrcxz .conv + + sub ax1, zero, ax1 ; NEG if negative ; main loop .conv: - b.z ax1, zero, .fini + bzr ax1, .fini - rem rdx, ax1, ax2 ; ax1 % base + rem rdx, ax1, ax2 ; ax1 % base - b.a rdx, 9, .nondec ; rdx > 9 ? + blt 9, rdx, .nondec ; rdx > 9 ? inc rdx, '0' jmp .next @@ -61,13 +63,14 @@ ltostr: ; add minus flag, null-terminate and reverse .fini: - mov.cxnz b[ax0], '-' - inc.cxnz ax0, 1 + jrcxz .cxz + mov b[ax0], '-' + inc ax0, 1 +.cxz: mov b[ax0], zero call strrev2, rax - ret ; diff --git a/ka/crt/fmt/printf.k b/ka/crt/fmt/printf.k index 9e76e01..02a8fbd 100644 --- a/ka/crt/fmt/printf.k +++ b/ka/crt/fmt/printf.k @@ -33,10 +33,16 @@ nprintf: ; Guaranteed to only affect rcx and ax0 ; print: - mov rcx, STRLEN_MAX - b.z b[ax0], zero, .1 - prns.rep.nz ax0 -.1: +.l: + movzx rax, b[ax0] + jraxz .r + + prn rax + inc ax0, 1 + + jmp .l + +.r: ret ; @@ -44,8 +50,12 @@ print: ; nprint: mov rcx, ax1 - b.z b[ax0], zero, .1 - prns.rep.nz ax0 -.1: + jrcxz .r + +.l: + prn b[ax0] + inc ax0, 1 + loop .l +.r: ret diff --git a/ka/crt/fmt/strtol.k b/ka/crt/fmt/strtol.k index 66f09dd..9494a4d 100644 --- a/ka/crt/fmt/strtol.k +++ b/ka/crt/fmt/strtol.k @@ -28,49 +28,49 @@ strtoul: ; strtoq: mov rax, zero + mov rsi, zero mov rdx, ax0 ; make sure base is in [2, 32] - b.z ax1, 1, .bad - b.a ax1, 36, .bad + beq ax1, 1, .bad + bltu 36, ax1, .bad ; empty string? - b.z b[rdx], zero, .done + bzr b[rdx], .done .skip_spc: - cmp b[rdx], ' ' - inc.z rdx, 1 - jmp.z .skip_spc + bne b[rdx], ' ', .no_spc + inc rdx, 1 + jmp .skip_spc +.no_spc: ; skip + - cmp b[rdx], '+' - inc.z rdx, 1 + bne b[rdx], '+', .no_plus + inc rdx, 1 - ; signed? - cmp ax2, zero - mov.z rsi, zero - jmp.z .unsigned +.no_plus: + ; unsigned? + bzr ax2, .unsigned ; parse '-' - cmp b[rdx], '-' - inc.z rdx, 1 - mov.z rsi, 1 - mov.nz rsi, zero + bne b[rdx], '-', .unsigned + inc rdx, 1 + mov rsi, 1 .unsigned: ; base 0 - b.z ax1, 0, .base_0 + bzr ax1, .base_0 ; base prefix? - b.nz b[rdx], '0', .main_loop + bne b[rdx], '0', .main_loop inc rdx, 1 movzx rcx, b[rdx] ; "0x"/"0b" prefix - jmp.cxz .done ; "0" - b.z rcx, 'x', .parsed_0x - b.z rcx, 'b', .parsed_0b + jrcxz .done ; "0" + beq rcx, 'x', .parsed_0x + beq rcx, 'b', .parsed_0b ; may be octal, but we don't care ; we accept "0110101010" (despite base=2) for instance @@ -79,7 +79,7 @@ strtoq: .parsed_0x: ; are we in base 16? ; if not, leave rax = 0 and *rdx = 'x' - b.nz ax1, 16, .done + bne ax1, 16, .done ; else inc rdx, 1 jmp .main_loop @@ -87,7 +87,7 @@ strtoq: .parsed_0b: ; are we in base 2? ; if not, leave rax = 0 and *rdx = 'b' - b.nz ax1, 2, .done + bne ax1, 2, .done ; else inc rdx, 1 jmp .main_loop @@ -95,47 +95,59 @@ strtoq: .base_0: ; guess base - cmp b[rdx], '0' - mov.nz ax1, 10 - jmp.nz .main_loop + beq b[rdx], '0', .b0_not10 + + ; must be base 10 + mov ax1, 10 + jmp .main_loop + +.b0_not10: inc rdx, 1 - cmp b[rdx], 'x' - inc.z rdx, 1 - mov.z ax1, 16 - jmp.z .main_loop + bne b[rdx], 'x', .b0_not16 + inc rdx, 1 + mov ax1, 16 + jmp .main_loop - cmp b[rdx], 'b' - inc.z rdx, 1 - mov.z ax1, 2 - jmp.z .main_loop +.b0_not16: + bne b[rdx], 'b', .b0_not2 + inc rdx, 1 + mov ax1, 2 + jmp .main_loop +.b0_not2: + ; take octal by default mov ax1, 8 .main_loop: movzx rcx, b[rdx] inc rdx, 1 - cmp rcx, '0' - jmp.b .done - cmp.ae rcx, '9' - dec.be rcx, '0' - jmp.be .next + ; between 0 and 9? + bltu rcx, '0', .done + bltu '9', rcx, .not_digit10 - cmp rcx, 'A' - cmp.ae rcx, 'Z' - dec.be rcx, 55 ; 'A' - 10 - jmp.be .next + ; yes + dec rcx, '0' + jmp .next - cmp rcx, 'a' - jmp.b .next - cmp.ae rcx, 'z' - dec.be rcx, 87 ; 'a' - 10 - jmp.be .next +.not_digit10: + bltu rcx, 'A', .done + bltu 'Z', rcx, .not_digitAZ + + dec rcx, 55 ; 'A' - 10 + jmp .next + +.not_digitAZ: + bltu rcx, 'a', .done + bltu 'z', rcx, .done + + dec rcx, 87 ; 'a' - 10 + jmp .next .next: ; too large for base? - b.ae rcx, ax1, .done + blteu ax1, rcx, .done mul rax, ax1 inc rax, rcx @@ -143,11 +155,12 @@ strtoq: .done: ; negative? - cmp rsi, zero - ret.z + bzr rsi, .r ; yes sub rax, zero, rax + +.r: ret .bad: diff --git a/ka/crt/lib/arith128.k b/ka/crt/lib/arith128.k deleted file mode 100644 index 4b0ca66..0000000 --- a/ka/crt/lib/arith128.k +++ /dev/null @@ -1,59 +0,0 @@ -; The OS/K Team licenses this file to you under the MIT license. -; See the LICENSE file in the project root for more information. - -; -; int:int add_lq_q(int:int x, int y) -; -add_lq_q: - addf rax, ax0, ax2 - adcx rdx, ax1, zero - ret - -; -; int:int add_lq_lq(int:int x, int:int y) -; -add_lq_lq: - addf rax, ax0, ax2 - adcx rdx, ax1, ax3 - ret - -; -; int:int sub_lq_q(int:int x, int y) -; -sub_lq_q: - subf rax, ax0, ax2 - sbbx rdx, ax1, zero - ret - -; -; int:int sub_q_lq(int x, int:int y) -; -sub_q_lq: - subf rax, ax0, ax1 - sbbx rdx, zero, ax2 - ret - -; -; int:int sub_lq_lq(int:int x, int:int y) -; -sub_lq_lq: - subf rax, ax0, ax2 - sbbx rdx, ax1, ax3 - ret - -; -; int:int mul_q_q(int x, int y) -; -mul_q_q: - mov rax, ax0 - mulhi rdx, rax, ax1 - ret - -; -; int:int imul_q_q(int x, int y) -; -imul_q_q: - mov rax, ax0 - imulhi rdx, rax, ax1 - ret - diff --git a/ka/crt/lib/time.k b/ka/crt/lib/time.k index 78b7bba..da6d0e2 100644 --- a/ka/crt/lib/time.k +++ b/ka/crt/lib/time.k @@ -25,15 +25,15 @@ DaysInYear: ; divisible by 4? rem rcx, ax0, 4 - jmp.cxnz .end + jrcxnz .end ; divisible by 100? rem rcx, ax0, 100 - jmp.cxnz .leap + jrcxnz .leap ; divisible by 400? rem rcx, ax0, 400 - jmp.cxnz .end + jrcxnz .end .leap: inc rax, 1 diff --git a/ka/crt/mem/memcpy.k b/ka/crt/mem/memcpy.k deleted file mode 100644 index 9056b37..0000000 --- a/ka/crt/mem/memcpy.k +++ /dev/null @@ -1,16 +0,0 @@ -; The OS/K Team licenses this file to you under the MIT license. -; See the LICENSE file in the project root for more information. - -; -; void memcpy(void *, const void *, int) -; -memcpy: - mov rcx, ax2 - ret.cxz - -.l: - sub rdx, ax2, rcx - mov b[ax0+rdx], b[ax1+rdx] - loop .l - ret - diff --git a/ka/crt/mem/memory.k b/ka/crt/mem/memory.k index c6034d5..6004199 100644 --- a/ka/crt/mem/memory.k +++ b/ka/crt/mem/memory.k @@ -1,5 +1,34 @@ ; The OS/K Team licenses this file to you under the MIT license. ; See the LICENSE file in the project root for more information. -include "crt/mem/memcpy.k" +; +; void memcpy(void *, const void *, int) +; +memcpy: + mov rcx, ax2 + jrcxz .r + +.l: + sub rdx, ax2, rcx + mov b[ax0+rdx], b[ax1+rdx] + loop .l + +.r: + ret + +; +; void memzero(void *, int) +; +memzero: + mov rcx, ax1 + jrcxz .r + +.l: + mov b[ax0], zero + inc ax0, 1 + loop .l + +.r: + ret + diff --git a/ka/crt/str/strchr.k b/ka/crt/str/strchr.k index 985d500..e3d3967 100644 --- a/ka/crt/str/strchr.k +++ b/ka/crt/str/strchr.k @@ -18,9 +18,10 @@ strchr: mov rcx, STRLEN_MAX scasb.rep.nz ax0, ax1 - cmp b[ax0], zero - mov.z rax, zero - ret.z + bnz b[ax0], .r + mov rax, zero + ret +.r: mov rax, ax0 ret diff --git a/ka/crt/str/strcmp.k b/ka/crt/str/strcmp.k index a148b13..57f87a4 100644 --- a/ka/crt/str/strcmp.k +++ b/ka/crt/str/strcmp.k @@ -10,19 +10,18 @@ ; <0 if the first character that does not match has a lower value in str1 than in str2 ; strcmp: - mov rcx, zero + mov rsi, zero .l: - movzx rax, b[ax0+rcx] - movzx rdx, b[ax1+rcx] + movzx rax, b[ax0+rsi] + movzx rdx, b[ax1+rsi] - cmp rax, rdx - jmp.nz .r + bne rax, rdx, .r ; both zero? - add rbx, rax, rdx - jmp.bxz .r + add rcx, rax, rdx + jrcxz .r - inc rcx, 1 + inc rsi, 1 jmp .l .r: @@ -34,14 +33,13 @@ strcmp: ; strncmp: mov rcx, ax2 - jmp.cxz .r + jrcxz .r .l: movzx rax, b[ax0] movzx rdx, b[ax1] - cmp rax, rdx - jmp.nz .r + bne rax, rdx, .r inc ax0, 1 inc ax1, 1 diff --git a/ka/crt/str/strcpy.k b/ka/crt/str/strcpy.k index d15d34f..10e395c 100644 --- a/ka/crt/str/strcpy.k +++ b/ka/crt/str/strcpy.k @@ -9,19 +9,22 @@ strcpy: mov rcx, b[ax1] mov b[ax0], rcx - ret.cxz + jrcxz .r inc ax0, 1 inc ax1, 1 jmp .l +.r: + ret + ; ; void strncpy(char *, const char *, int) ; strncpy: mov rcx, ax2 - ret.cxz + jrcxz .r .l: mov b[ax0], b[ax1] @@ -30,6 +33,8 @@ strncpy: inc ax1, 1 loop .l + +.r: ret ; @@ -37,13 +42,13 @@ strncpy: ; strnzcpy: mov rcx, ax2 - ret.cxz + jrcxz .r .l: mov rax, b[ax1] mov b[ax0], rax - jmp.axz .r + jraxz .r inc ax0, 1 inc ax1, 1 diff --git a/ka/crt/str/strrev.k b/ka/crt/str/strrev.k index 9911319..cbc97f1 100644 --- a/ka/crt/str/strrev.k +++ b/ka/crt/str/strrev.k @@ -7,9 +7,7 @@ ; buf and src must NOT overlap ; strrev: - cmp b[ax1], zero - mov.z b[ax0], zero - ret.z + bzr b[ax1], .z ; save str's location mov rsi, ax1 @@ -20,19 +18,24 @@ strrev: scasb.rep.nz ax1, zero dec ax1, 1 -.2: +.l: ; copy, going backward though str ; and forward through buf mov b[ax0], b[ax1] - cmp ax1, rsi - mov.z b[ax0+1], zero - ret.z + beq ax1, rsi, .r inc ax0, 1 dec ax1, 1 - jmp .2 + jmp .l +.r: + mov b[ax0+1], zero + ret + +.z: + mov b[ax0], zero + ret ; ; void strrev2(char *str) @@ -40,8 +43,7 @@ strrev: ; Inverses str ; strrev2: - cmp b[ax0], zero - ret.z + bzr b[ax0], .r mov ax1, ax0 @@ -52,16 +54,16 @@ strrev2: dec ax1, 1 ; increase ax0 while decreasing ax1, performing exchanges -.2: - b.ae ax0, ax1, .3 +.l: + blteu ax1, ax0, .r xchg b[ax0], b[ax1] inc ax0, 1 dec ax1, 1 - jmp .2 + jmp .l -.3: +.r: ret diff --git a/ka/doskrnl.k b/ka/doskrnl.k index a20e61a..8a3b711 100644 --- a/ka/doskrnl.k +++ b/ka/doskrnl.k @@ -26,7 +26,7 @@ start: mov rsp, DOSKRNL_STACK mov rbp, zero - ;dump + ; dump call main diff --git a/ka/sys/intr/common.k b/ka/sys/intr/common.k index c8304bf..8a62597 100644 --- a/ka/sys/intr/common.k +++ b/ka/sys/intr/common.k @@ -13,12 +13,12 @@ ScreenOfDeath: call printf, .scr1 pop zero - b.nz r14, zero, .not_con + bnz r14, .not_con push .scr2_con jmp .do_print .not_con: - b.l r14, 4, .not_krn + blt r14, 4, .not_krn push .scr2_krn jmp .do_print @@ -40,10 +40,10 @@ ScreenOfDeath: pause scan rax - jmp.axz .loop + jraxz .loop - b.z rax, 0x0A, DefaultTrapHandler.handle_Exit - b.z rax, 0x1B, DefaultTrapHandler.handle_Shutdown + beq rax, 0x0A, DefaultTrapHandler.handle_Exit + beq rax, 0x1B, DefaultTrapHandler.handle_Shutdown jmp .loop diff --git a/ka/sys/intr/excepts.k b/ka/sys/intr/excepts.k index 7742829..6ca83c5 100644 --- a/ka/sys/intr/excepts.k +++ b/ka/sys/intr/excepts.k @@ -5,8 +5,8 @@ DefaultExceptionHandler: mov rsp, EXCT0_STACK mov ax1, r12 - b.z r12, zero, DefaultTrapHandler.handle_Shutdown - b.a r12, 11, .unknown + bzr r12, DefaultTrapHandler.handle_Shutdown + bltu 11, r12, .unknown mov rsi, .err_ukn lea ax0, b[rsi + r12 * 32] diff --git a/ka/sys/intr/trap0.k b/ka/sys/intr/trap0.k index 3cd2cad..a03ff79 100644 --- a/ka/sys/intr/trap0.k +++ b/ka/sys/intr/trap0.k @@ -40,16 +40,16 @@ DefaultTrapHandler: call RFS.LoadReg, r14, $rax call RFS.LoadArgs, r14 - jmp.axz .handle_Shutdown - b.z rax, Sys.Exit, .handle_Exit - b.z rax, Sys.ReadFile, .handle_ReadFile - b.z rax, Sys.OpenFile, .handle_OpenFile - b.z rax, Sys.CloseFile, .handle_CloseFile - b.z rax, Sys.CreateFile, .handle_CreateFile - b.z rax, Sys.RemoveFile, .handle_RemoveFile - b.z rax, Sys.FindNext, .handle_FindNext - b.z rax, Sys.FindFirst, .handle_FindFirst - b.z rax, Sys.EnterHaltMode, .handle_HaltMode + jraxz .handle_Shutdown + beq rax, Sys.Exit, .handle_Exit + beq rax, Sys.ReadFile, .handle_ReadFile + beq rax, Sys.OpenFile, .handle_OpenFile + beq rax, Sys.CloseFile, .handle_CloseFile + beq rax, Sys.CreateFile, .handle_CreateFile + beq rax, Sys.RemoveFile, .handle_RemoveFile + beq rax, Sys.FindNext, .handle_FindNext + beq rax, Sys.FindFirst, .handle_FindFirst + beq rax, Sys.EnterHaltMode, .handle_HaltMode call ScreenOfDeath, .badsyscall, r13 @@ -75,8 +75,7 @@ DefaultTrapHandler: call DISK.OpenFile, .cmdcom ; Crash on failure - cmp rax, zero - crash.l + bltz rax, abort ; Load at CMDCOM_LOADP mov ax1, CMDCOM_LOADP @@ -86,7 +85,7 @@ DefaultTrapHandler: ; Assume that COMMAND.COM being ; less then 4KB means something ; went wrong - b.l rax, 0x1000, abort + blt rax, 0x1000, abort ; Close the handle call DISK.CloseFile, rax @@ -158,13 +157,13 @@ DefaultTrapHandler: ; Misc. ; .handle_Shutdown: - mov ax0, zero - call IDT.DelHandler + call IDT.DelHandler, zero stop .handle_HaltMode: - mov rcx, -1 - hlt.rep - stop + pause + pause + hlt + jmp .handle_HaltMode diff --git a/ka/sys/main.k b/ka/sys/main.k index 4bde9e4..2c38b69 100644 --- a/ka/sys/main.k +++ b/ka/sys/main.k @@ -11,8 +11,7 @@ PrintBootMsg: ; Initialize TRAP handlers ; InitSyscalls: - mov ax0, 1 - call RFS.ActivateFrame + call RFS.ActivateFrame, 1 mov ax1, $rip mov ax2, DefaultTrapHandler @@ -25,16 +24,13 @@ InitSyscalls: ret InitExcepts: - mov ax0, 2 - call RFS.ActivateFrame + call RFS.ActivateFrame, 2 mov ax1, $rip mov ax2, DefaultExceptionHandler call RFS.StoreReg - mov ax0, zero - mov ax1, 2 - call IDT.AddHandler + call IDT.AddHandler, zero, 2 SwitchToCMD: mov rax, Sys.Exit diff --git a/ka/usr/cmd/dir.k b/ka/usr/cmd/dir.k index ee6feee..affb0ef 100644 --- a/ka/usr/cmd/dir.k +++ b/ka/usr/cmd/dir.k @@ -31,13 +31,13 @@ builtins.dir: trap 0 .list: - jmp.axz .end + jraxz .end - mov r15, rcx # file size + mov r15, rcx ; file size inc r14, rcx ; directory? - jmp.dxnz .is_dir + bnz rdx, .is_dir ; found a file inc r12, 1 @@ -49,8 +49,9 @@ builtins.dir: scasb.rep.nz rsi, '.' ; print file name - sub rcx, rsi, rdi - prns.rep rdi + sub ax1, rsi, rdi + dec ax1, 1 + call nprint, rdi ; calculate where to put extension sub rdi, rsi, .buf @@ -58,7 +59,7 @@ builtins.dir: .ext_pad: ; print at least N non-space characters before extension - b.ae rdi, N, .print_ext + blte N, rdi, .print_ext prn ' ' inc rdi, 1 jmp .ext_pad @@ -68,35 +69,38 @@ builtins.dir: mov rcx, 4 prn ' ' - cmp b[rsi], '.' - inc.z rsi, 1 + bne b[rsi], '.', .print_ext.1 + inc rsi, 1 .print_ext.1: - b.z b[rsi], 0, .print_ext.2 + bzr b[rsi], .print_ext.2 ; print and decrease rcx, unless it's already 0 prn b[rsi] inc rsi, 1 - dec.cxnz rcx, 1 + jrcxz .print_ext.1 + dec rcx, 1 jmp .print_ext.1 .print_ext.2: ; did we print at least 4 bytes? - jmp.cxz .print_bytes ; yes, carry on + jrcxz .print_bytes ; yes, carry on - prn.rep ' ' +.pe2.l: + prn ' ' + loop .pe2.l .print_bytes: ; print file size in bytes - mov rcx, 3 - prn.rep ' ' + prn ' ' + prn ' ' + prn ' ' shr rax, r15, 10 - and r15, r15, 1023 + and r15, 1023 - push r15 - push rax + push r15, rax call printf, .bytesstr inc rsp, 16 @@ -129,20 +133,26 @@ builtins.dir: .is_dir: inc r13, 1 - mov rcx, STRLEN_MAX - mov rdx, .buf - prns.rep.nz rdx + ; use printf instead of print + ; because it returns # of printed + ; characters + call printf, .buf - sub rcx, STRLEN_MAX, rcx - sub rcx, N, rcx - prn.rep ' ' + blte N, rax, .dir_no_pad + sub rcx, N, rax + dec rcx, 1 +.dir.l: + prn ' ' + loop .dir.l + +.dir_no_pad: call print, .dir_ext jmp .print_bytes .buf = [FNAME_MAX] -.dir_ext = "