Scott Dattalo and Dmitry Kiryashov
;ascii1 and ascii2 are the tens and ones digit of a number we wish
;to convert to binary
;
; In C:
;
; binary = (ascii1 & 0xf) * 10 + (ascii2 & 0xf);
;
; (I'd be interested to see how a compiler would generate the asm for this.)
;
;Clear the upper nibble of the one's digit
mov W, #$0f
and ascii2, W
;Multiply the tens digit by 10.
mov W, <<ascii1 ;2*tens
;Note that the carry is also cleared because
;ascii1 is an ASCII number between 0x30-0x39
and W, #$1e ;Clear upper nibble of tens digit
;In addition, we clear the shifted in carry
mov ascii1, W ;W = ascii1 = 2*original ascii1
rl ascii1 ;ascii1 = 4*original ascii1
rl ascii1 ;ascii1 = 8*original ascii1
add W, ascii1 ;W = 2*original ascii1 + 8 *original ascii1
; = 10*original ascii1
;add the one's digit
add W, ascii2 ;
; Or use this one that preserves input:
mov W, <<tens
and W, #$1e ;w=2*tens
mov temp, W
rl temp ;temp=4*tens
rl temp ;temp=8*tens
add temp, W ;temp=8*tens+2*tens=10*tens
mov W, #-'0' ;convert one's digit from ASCII to decimal
add W, ones ;w=ones
add W, temp ;w=ones+10*tens
;Dmitry Kiryashov [zews at AHA.RU] says:
;Destructive way to save one more clock ;-)
mov W, tens ;*1 w=0x30..0x39
add tens, W ;*2 tens=0x60..0x72
rl tens ;*4 tens=0xC0..0xE4
add tens, W ;*5 tens=0xF0..0x1ED
mov W, #(-11*'0') & $FF ;low byte of -48*11
add W, ones
add W, tens ;add two times tens=5*original_tens
add W, tens
;Why so ? tens is '0' + x , ones is '0' + y , where x and y are in range
;of 0..9 So finally '0'*(10+1)=48.*11.=528.=0x210 . it is constant so we
;can subtract it back from result. Here we gone ;)
| file: /Techref/scenix/lib/math/radix/a2b-2d8b-sd_sx.htm, 2KB, , updated: 2004/6/10 14:40, local time: 2025/10/24 15:33,
216.73.216.22,10-3-83-201:LOG IN
|
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://www.piclist.com/techref/scenix/lib/math/radix/a2b-2d8b-sd_sx.htm"> SX Microcontroller Radix Math Method ASCII decimal to Binary</A> |
| Did you find what you needed? |
|
o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. |
|
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.