PIC Microcontoller Radix Math Method

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
 Addr Opcode    ;source
 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

Old