Add octal support

This commit is contained in:
PleegWat
2026-09-10 15:33:46 +02:00
parent 40e4272cdd
commit 431e00ca7e
2 changed files with 59 additions and 10 deletions
+55 -9
View File
@@ -13,20 +13,33 @@ include errno
pub auto: pub auto:
cmp r4, 2 cmp r4, 2
je bin je bin
cmp r4, 8
je oct
mov flags, errno.INTTOSTR_BAD_BASE mov flags, errno.INTTOSTR_BAD_BASE
jmp r13 jmp r13
; The output buffer is too small for this integer
badbuffer:
mov flags, errno.INTTOSTR_BAD_BUFFER
jmp r13
; All digits have been output. Null terminate and exit.
done:
store_8 [r2], zr
mov flags, errno.OK
jmp r13
; Convert integer to binary string ; Convert integer to binary string
; Arguments: ; Arguments:
; r1 - Integer ; r1 - Integer
; r2 - Start of buffer (assumed 'big enough') ; r2 - Start of buffer
; r3 - Buffer length (ignored) ; r3 - Buffer length
; Result: ; Result:
; none ; none
; Clobbers: ; Clobbers:
; flags ; flags
; r4 - counter ; r4 - counter
; r5 - result character ; r5 - character
pub bin: pub bin:
mov r4, 31 mov r4, 31
cmp r2, 2 cmp r2, 2
@@ -57,10 +70,43 @@ and r5, r5, 1
sub r4, r4, 1 sub r4, r4, 1
jmp bin_print jmp bin_print
badbuffer: ; Convert integer to octal string
mov flags, errno.INTTOSTR_BAD_BUFFER ; Arguments:
jmp r13 ; r1 - Integer
; r2 - Start of buffer
; r3 - Buffer length
; Result:
; none
; Clobbers:
; flags
; r4 - input counter
; r5 - character
; r6 - output size counter
pub oct:
mov r4, 30
mov r6, 12
done: oct_find_one:
store_8 [r2], zr lsr r5, r1, r4 ; Select bit and advance counter
jmp r13 and r5, r5, 7
sub r4, r4, 3
sub r6, r6, 1
cmp r4, 0 ; Start printing if last bit ...
jl oct_print
cmp r5, zr ; .. or if nonzero
je oct_find_one
cmp r6, r3 ; Check buffer size
ja badbuffer
oct_print:
add r5, r5, 0x30 ; '0' ; Add digit to buffer
store_8 [r2], r5
add r2, r2, 1
cmp r4, 0 ; Done if last bit
jl done
lsr r5, r1, r4 ; Select bit and advance counter
and r5, r5, 7
sub r4, r4, 3
jmp oct_print
+4 -1
View File
@@ -34,6 +34,7 @@ jl next_test
; Done ; Done
halt halt
include ../src/stdlib include ../src/stdlib
@0x20000 @0x20000
@@ -43,7 +44,9 @@ tests:
@0x20000 U32 0b0 U8 2 "0\0" @0x20000 U32 0b0 U8 2 "0\0"
@0x20040 U32 0xFFFFFFFF U8 2 "11111111111111111111111111111111\0" @0x20040 U32 0xFFFFFFFF U8 2 "11111111111111111111111111111111\0"
@0x20080 U32 0b101010 U8 2 "101010\0" @0x20080 U32 0b101010 U8 2 "101010\0"
@0x200c0 @0x200c0 U32 0o640 U8 8 "640\0"
@0x20100 U32 0xFFFFFFFF U8 8 "37777777777\0"
@0x20140
end_of_tests: end_of_tests:
scratch: U1024 0 scratch: U1024 0