Add octal support
This commit is contained in:
+55
-9
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user