# PICMicrocontoller Radix MathMethod

## Binary to ASCII, 16 bit to 5 digits (1 at a time) with one temp register

```;by James Newton
;Listing from SX Key IDE
;Parallax menomics (sorry!)
;76 instructions and about 25x5x4=500 worst case instructions executed. About (11*4+4)*5+4=100 best case.
watch   ptr,8,udec              ;set watch for regis
watch   Hi,8,uhex               ;set watch for regis
watch   Lo,8,uhex               ;set watch for regis
watch   Lo,16,udec              ;set watch for regis
watch   Hic,8,uhex              ;set watch for regis
watch   Loc,8,uhex              ;set watch for regis
watch   Loc,16,udec             ;set watch for regis
watch   Digit,8,udec            ;set watch for regis
watch   d1,8,udec               ;set watch for regis
watch   d2,8,udec               ;set watch for regis
watch   d3,8,udec               ;set watch for regis
watch   d4,8,udec               ;set watch for regis
watch   d5,8,udec               ;set watch for regis

device  PINS28,PAGES4,BANKS8,TURBO, stackx, optionx
7FF- A13                        reset   start
008-                    org 8
;temp register to point to table
008-            ptr     ds 1
;input value
009-            Lo      ds 1
00A-            Hi      ds 1
;output value
00B-            Digit   ds 1

;variables used for testing
00C-            Loc     ds 1
00D-            Hic     ds 1
00E-            d1      ds 1
00F-            d2      ds 1
010-            d3      ds 1
011-            d4      ds 1
012-            d5      ds 1

;This code just exists to test the routine at entry
013-            start
013- 06E                clr d1
014- 06F                clr d2
015- 070                clr d3
016- 071                clr d4
017- 072                clr d5
018- 06C                clr Loc
019- 06D                clr Hic
01A- 068                clr ptr
01B- 06B                clr digit

01C-            mainloop
01C- C0E 024            mov fsr,#d1
01E- 20D 02A            mov Hi, Hic
020- 20C 029            mov Lo,Loc
022- 967                call entry
023- C12 024            mov fsr,#d5
025-            :inc10
025- 2A0                inc ind
026- C0A 080            cjb ind, #10, :next
028- 703 A30
02A- 060                clr ind
02B- 0E4                dec fsr
02C- CF2 1C4            cja fsr, #d1-1, :inc10
02E- 603 A25
030-            :next
030- 2AC                inc Loc
031- 643                snz
032- 2AD                inc Hic
033- A1C                jmp mainloop

;This is the subroutine called to get rid of a result digit
;For testing, it just compairs the value to the decimal count
;pointed to by fsr
034-            SendOutByte
034- 200 08B            cje Digit, ind, :exit
036- 643 A3A
038-            :error
038-                    break
038- 010                page :error
039- A38                jmp :error
03A-            :exit
03A- 2A4                inc fsr
03B- 00C                ret

;this is the beginning of the routines code.
03C-            nextHi
03C- 208                mov w, ptr
03D- 1E2                jmp pc+w
03E- 8C3                retw \$C3 ; 0 50,000
03F- 875                retw \$75 ; 1 30,000
040- 827                retw \$27 ; 2 10,000
041- 827                retw \$27 ; 3 10,000
042- 813                retw \$13 ; 4  5,000
043- 80B                retw \$0B ; 5  3,000
044- 803                retw \$03 ; 6  1,000
045- 803                retw \$03 ; 7  1,000
046- 801                retw \$01 ; 8    500
047- 801                retw \$01 ; 9    300
048- 800                retw \$00 ;10    100
049- 800                retw \$00 ;11    100
04A- 800                retw \$00 ;12     50
04B- 800                retw \$00 ;13     30
04C- 800                retw \$00 ;14     10
04D- 800                retw \$00 ;15     10

04E-            nextLo
04E- 208                mov w, ptr
04F- 1E2                jmp pc+w
050- 850                retw \$50 ; 0 50,000
051- 830                retw \$30 ; 1 30,000
052- 810                retw \$10 ; 2 10,000
053- 810                retw \$10 ; 3 10,000
054- 888                retw \$88 ; 4  5,000
055- 8B8                retw \$B8 ; 5  3,000
056- 8E8                retw \$E8 ; 6  1,000
057- 8E8                retw \$E8 ; 7  1,000
058- 8F4                retw \$F4 ; 8    500
059- 82C                retw \$2C ; 9    300
05A- 864                retw \$64 ;10    100
05B- 864                retw \$64 ;11    100
05C- 832                retw \$32 ;12     50
05D- 81E                retw \$1E ;13     30
05E- 80A                retw \$0A ;14     10
05F- 80A                retw \$0A ;15     10

060-                    ror
060-            nextDg
060- 208                mov w, ptr
061- E03                and w, #%00000011
062- 1E2                jmp pc+w
063- 805                retw \$5
064- 803                retw \$3
065- 801                retw \$1
066- 801                retw \$1

;this is the entry point for the conversion routine
067-            entry
067- 068                clr ptr
068- 06B                clr digit

069-            Loop
069- 93C                call nextHi     ;get the next value
06A- 08A                mov w, Hi-w
06B- 703                sc
06C- A7D                jmp smaller
;if the high byte is less than our value, the whole thing must be sm
;Carry not set so parent will skip nextLo and continue with nextHi
06D- 743                sz
06E- A76                jmp largerHi
;if the high byte was exactly equal to our value, then is the low by
06F- 94E                call nextLo     ;get the next value
070- 089                mov w, Lo-w
071- 703                sc
;the low byte was smaller so the whole thing was smaller after all.
072- A7D                jmp smaller
073- 06A                clr Hi
;the low byte was larger so we are subtracting and the high byte was
074- 029                mov Lo, w       ;and save the subtraction from Lo
075- A7B                jmp larger
;The low byte was larger but it's now smaller and since carry is set
;this digit value to output and continue with nextHi
076-            largerHi
076- 02A                mov Hi, w       ;if its not zero and its not smaller, save t
077- 94E                call nextLo     ;in either case, get the next value
078- 0A9                sub Lo, w
079- 703                sc
07A- 0EA                dec Hi
07B-            larger
;The value was larger but is now smaller
;add this digit value to output and continue
07B- 960                call nextDg
;       break
07C- 1EB                add Digit, w
07D-            smaller
07D- 2A8                inc ptr
07E- 708                sb ptr.0
07F- 628                snb ptr.1
080- A69                jmp Loop
081- 934                call SendOutByte
082- 06B                clr Digit
083- 788                sb ptr.4
084- A69                jmp Loop
085- 209 02B            mov Digit, Lo
087- 934                call SendOutByte
088- 00C                ret

END

```
Decimal Hex Binary
50,000 C350 1100 0011 0101 0000
30,000 7530 0111 0101 0011 0000
20,000 4E20 0100 1110 0010 0000
10,000 2710 0010 0111 0001 0000
5000 1388 0001 0011 1000 1000
3000 0BB8 0000 1011 1011 1000
2000 07D0 0000 0111 1101 0000
1000 03E8 0000 0011 1110 1000
500 01F4 0000 0001 1111 0100
300 012C 0000 0001 0010 1100
200 C8 1100 1000
100 64 0110 0100
50 32 0011 0010
30 1E 0001 1110
20 14 0001 0100
10 A 0000 1010

 file: /Techref/microchip/math/radix/b2a-16b5alzs.htm, 9KB, , updated: 2000/3/10 09:41, local time: 2023/2/7 07:44, TOP NEW HELP FIND:  34.225.194.102:LOG IN

 ©2023 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?Please DO link to this page! Digg it! / MAKE! PIC Microcontoller Radix Math Method

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here:
if you want a response, please enter your email address:
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
 Did you find what you needed? "No. I'm looking for: " "No. Take me to the search page." "No. Take me to the top so I can drill down by catagory" "No. I'm willing to pay for help, please refer me to a qualified consultant"

.