2019-05-30 18:31:50 +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-06-20 12:31:36 +02:00
|
|
|
; void itoa(char *buf, int num, int base)
|
2019-06-17 20:59:30 +02:00
|
|
|
;
|
|
|
|
itoa:
|
2019-06-23 20:56:04 +02:00
|
|
|
mov ax3, 1
|
|
|
|
jmp ltostr
|
|
|
|
|
|
|
|
;
|
|
|
|
; void utoa(char *buf, int num, int base)
|
|
|
|
;
|
2019-06-26 21:25:59 +02:00
|
|
|
utoa:
|
2019-07-05 14:06:14 +02:00
|
|
|
xor ax3, ax3
|
2019-06-23 20:56:04 +02:00
|
|
|
jmp ltostr
|
|
|
|
|
|
|
|
;
|
|
|
|
; void ltostr(char *buf, int num, int base, bool signed)
|
|
|
|
;
|
|
|
|
ltostr:
|
2019-06-05 22:11:45 +02:00
|
|
|
mov rax, ax0
|
2019-07-11 18:34:21 +02:00
|
|
|
xor r11, r11
|
2019-06-05 22:11:45 +02:00
|
|
|
|
|
|
|
; make sure base is in [2, 32]
|
2019-07-02 20:13:05 +02:00
|
|
|
b.b ax2, 2, .bad
|
|
|
|
b.a ax2, 36, .bad
|
2019-06-05 22:11:45 +02:00
|
|
|
|
|
|
|
; deal with zero
|
2019-07-02 20:13:05 +02:00
|
|
|
b.e ax1, 0, .zero
|
2019-06-05 22:11:45 +02:00
|
|
|
|
|
|
|
; deal with base 10 signedness
|
|
|
|
|
2019-06-23 20:56:04 +02:00
|
|
|
test ax3, ax3
|
|
|
|
cmp.nz ax2, 10 ; base 10
|
2019-06-18 12:58:26 +02:00
|
|
|
j.nz .conv
|
2019-06-05 22:11:45 +02:00
|
|
|
|
2019-07-11 18:34:21 +02:00
|
|
|
sgn r11, ax1 ; extract ax1 sign
|
2019-06-05 22:11:45 +02:00
|
|
|
|
2019-07-11 18:34:21 +02:00
|
|
|
cmp r11, -1 ; negative?
|
2019-07-04 18:41:05 +02:00
|
|
|
neg.z ax1, ax1
|
2019-06-05 22:11:45 +02:00
|
|
|
|
|
|
|
; main loop
|
|
|
|
.conv:
|
2019-07-02 20:13:05 +02:00
|
|
|
b.e ax1, 0, .fini
|
2019-06-05 22:11:45 +02:00
|
|
|
|
2019-07-05 14:06:14 +02:00
|
|
|
rem r10, ax1, ax2 ; ax1 % base
|
2019-06-05 22:11:45 +02:00
|
|
|
|
2019-07-02 20:13:05 +02:00
|
|
|
b.a r10, 9, .nondec ; r10 > 9 ?
|
2019-06-05 22:11:45 +02:00
|
|
|
|
2019-07-01 00:45:08 +02:00
|
|
|
add r10, '0'
|
2019-06-05 22:59:32 +02:00
|
|
|
jmp .next
|
|
|
|
|
|
|
|
.nondec:
|
2019-07-01 00:45:08 +02:00
|
|
|
add r10, 55 ; 'A' - 10
|
2019-06-05 22:11:45 +02:00
|
|
|
|
|
|
|
.next:
|
2019-07-01 00:45:08 +02:00
|
|
|
mov b[ax0], r10
|
2019-06-05 22:11:45 +02:00
|
|
|
inc ax0
|
|
|
|
|
|
|
|
div ax1, ax2
|
|
|
|
jmp .conv
|
|
|
|
|
2019-06-05 22:59:32 +02:00
|
|
|
; add minus flag, null-terminate and reverse
|
2019-06-05 22:11:45 +02:00
|
|
|
.fini:
|
2019-07-11 18:34:21 +02:00
|
|
|
cmp r11, -1
|
2019-06-17 20:59:30 +02:00
|
|
|
mov.z b[ax0], '-'
|
2019-06-06 22:07:34 +02:00
|
|
|
inc.z ax0
|
2019-06-05 22:59:32 +02:00
|
|
|
|
2019-06-05 22:11:45 +02:00
|
|
|
mov b[ax0], 0
|
2019-06-05 22:59:32 +02:00
|
|
|
|
|
|
|
mov ax0, rax
|
|
|
|
call strrev2
|
|
|
|
|
2019-06-05 22:11:45 +02:00
|
|
|
ret
|
|
|
|
|
|
|
|
;
|
|
|
|
; exceptional cases
|
|
|
|
;
|
|
|
|
.bad:
|
|
|
|
mov q[errno], EINVAL
|
2019-06-15 20:21:38 +02:00
|
|
|
mov b[ax0], 0
|
2019-06-05 22:11:45 +02:00
|
|
|
ret
|
|
|
|
|
|
|
|
.zero:
|
|
|
|
mov b[ax0], 48 ; '0'
|
|
|
|
mov b[ax0+1], 0
|
|
|
|
ret
|
|
|
|
|