mov w, #$C3 ;try 50,000 / 256 against Hi call nextHi mov w, #$50 snc ;if that wasn't too big call nextLo ;try 50,000 mod 256 against Lo mov w, #5 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 5 mov w, #$75 ;try 30,000 / 256 against Hi call nextHi mov w, #$30 snc ;if that wasn't too big call nextLo ;try 30,000 mod 256 against Lo mov w, #3 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 3 more mov w, #$27 ;try 10,000 / 256 against Hi call nextHi mov w, #$10 snc ;if that wasn't too big call nextLo ;try 10,000 mod 256 against Lo mov w, #1 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 1 more call SerOut ;get rid of the digit. clr digit mov w, #$13 ;try 5,000 / 256 against Hi call nextHi mov w, #$88 snc ;if that wasn't too big call nextLo ;try 5,000 mod 256 against Lo mov w, #5 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 5 mov w, #$0B ;try 3,000 / 256 against Hi call nextHi mov w, #$B8 snc ;if that wasn't too big call nextLo ;try 3,000 mod 256 against Lo mov w, #3 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 3 more mov w, #$03 ;try 1,000 / 256 against Hi call nextHi mov w, #$E8 snc ;if that wasn't too big call nextLo ;try 1,000 mod 256 against Lo mov w, #1 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 1 more call SerOut ;get rid of the digit. clr digit mov w, #$01 ;try 500 / 256 against Hi call nextHi mov w, #$F4 snc ;if that wasn't too big call nextLo ;try 500 mod 256 against Lo mov w, #5 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 5 mov w, #$C8 call nextLo ;try 200 mod 256 against Lo mov w, #2 snc ;and if both of those were not too big add digit, w ;we know the first digit is at least 5 Loop: smaller: ;mov w, #$C3 ret nextHi: mov w, Hi-w sc jmp smaller ;if the high byte is less than our value, the whole thing must be smaller. ;Carry not set so parent will skip nextLo and continue with nextHi snz mov Hi, w ;if its not zero and its not smaller, save the subtraction ;mov w, #$50 ;but in either case, get the next value ret ;since carry is set parent will do nextLo nextLo: sz jmp larger ;if the high byte was exactly equal to our value, then is the low byte smaller? mov w, Lo-w sc jmp smaller ;the low byte was smaller so the whole thing was smaller after all. ;Carry not set so parent will not add this digit value to output and continue with nextHi. clr Hi ;the low byte was larger so we are subtracting and the high byte was the same so we zero it. mov Lo, w ;and save the subtraction from Lo jmp Loop ;The low byte was larger but it's now smaller and since carry is set, parent will add ;this digit value to output and continue with nextHi larger: sub Lo, w snc dec Hi stc ;The high byte was larger but now both are smaller and since carry is set, parent will add ;this digit value to output and continue with nextHi jmp Loop ;smaller: ; clc ; jmp Loop