base:hex_string_to_integer
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:hex_string_to_integer [2015-04-17 04:32] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Hex String to Integer ====== | ||
+ | |||
+ | |||
+ | This is a very simple routine that converts a string containing a hexadecimal number to the corresponding integer. The string can be any length (up to 128 chars) and the routine will find its end (null-terminated) and start working from the last digit backwards, as the 6502 is backwards (little-endian). The "bmi l4" instruction makes sure the routine exits safely, if a zero-length string is passed in, and everything else should be obvious. | ||
+ | |||
+ | < | ||
+ | ; hexadecimal string to integer conversion routine by FMan/Tropyx | ||
+ | |||
+ | !to " | ||
+ | |||
+ | ; very straight-forward, | ||
+ | ; converts a string containing a hexadecimal number of any length | ||
+ | |||
+ | tmp = $63 ; temporary variable | ||
+ | str = $64 ; pointer to the null-terminated string | ||
+ | out = $1f00 ; address of the output buffer | ||
+ | |||
+ | *=$2000 | ||
+ | |||
+ | ldy #0 ; strlen | ||
+ | l0 lda (str),y | ||
+ | beq l1 | ||
+ | iny | ||
+ | bpl l0 | ||
+ | l1 dey ; set Y to point to the last character of | ||
+ | bmi l4 ; the string (least significant digit) | ||
+ | ldx #0 | ||
+ | l2 lda (str),y ; read digit for low nybble of this byte | ||
+ | jsr hex | ||
+ | dey | ||
+ | bmi l3 | ||
+ | sta tmp ; store it temporarily | ||
+ | lda (str),y | ||
+ | jsr hex ; convert the high nybble of this byte and | ||
+ | asl ; slide it to occupy the corresponding bits | ||
+ | asl | ||
+ | asl | ||
+ | asl | ||
+ | ora tmp ; add the low nybble stored earlier | ||
+ | l3 sta out,x ; write the resulting byte out | ||
+ | inx | ||
+ | dey | ||
+ | bpl l2 ; loop until there is no more input | ||
+ | l4 rts | ||
+ | |||
+ | hex sec ; subroutine that converts a single hex digit | ||
+ | sbc #$30 ; in Akku to the corresponding numeric value | ||
+ | cmp #$a | ||
+ | bcc h0 | ||
+ | sec | ||
+ | sbc #7 | ||
+ | h0 rts | ||
+ | </ | ||
base/hex_string_to_integer.txt · Last modified: 2015-04-17 04:32 by 127.0.0.1