;by James Newton
;Listing from SX Key IDE ;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 |