; bindec.inc ; 05.05.2021 #ifndef _BINDEC_ #define _BINDEC_ ; Cycles mit rcall und ret angegeben ; Bytes ohne rcall ;#define _BINDEC8_ ; bin 1 byte -> dec 2 byte ; bindec8 - unsigned, max. 255 = 0xFF max. 75 c, Durchschn. 59 c ; bindec8s - signed, max. 127 = 0x7F max. 76 c, Durchschn. 60 c ; min.-128 = 0x80 56 bytes ; B0 ; S D1 D0 ; R12 R3 R2 #define _BINDEC16_ ; bin 2 byte -> dec 3 byte ; bindec16 - unsigned, max. 65535 = 0xFFFF max. 223 c, Durchschn. 167 c ; bindec16s - signed, max. 32767 = 0x7FFF max. 218 c, Durchschn. 162 c ; min.-32768 = 0x8000 128 bytes ; B1 B0 ; S D2 D1 D0 ; R12 R4 R3 R2 #define _BINDEC24_ ; bin 3 byte -> dec 4 byte ; bindec24 - unsigned, max. 16777215 = 0xFFFFFF max. 432 c, Durchschn. 328 c ; bindec24s - signed, max. 8388607 = 0x7FFFFF max. 414 c, Durchschn. 334 c ; min.-8388608 = 0x800000 190 bytes ; B2 B1 B0 ; S D3 D2 D1 D0 ; R12 R5 R4 R3 R2 #define _BINDEC32_ ; bin 4 byte -> dec 5 byte ; bindec32 - unsigned, max. 4294967295 = 0xFFFFFFFF max. 646 c, Durchschn. 476 c ; bindec32s - signed, max. 2147483647 = 0x7FFFFFFF max. 653 c, Durchschn. 476 c ; min.-2147483648 = 0x80000000 258 bytes ; B3 B2 B1 B0 ; S D4 D3 D2 D1 D0 ; R12 R6 R5 R4 R3 R2 #define _BINDEC40_ ; bin 6 byte -> dec 10 byte ; bindec48 - unsigned, max. 281474976710655 = 0xFFFFFFFFFFFF max. 954 c, Durchschn. 674 c ; bindec48s - signed, max. 140737488355327 = 0x7FFFFFFFFFFF max. 930 c, Durchschn. 682 c ; min.-140737488355328 = 0x800000000000 350 bytes ; B5 B4 B3 B2 B1 B0 ; S D7 D6 D5 D4 D3 D2 D1 D0 ; R12 R9 R8 R7 R6 R5 R4 R3 R2 #define _BINDEC48_ ; bin 6 byte -> dec 10 byte ; bindec48 - unsigned, max. 281474976710655 = 0xFFFFFFFFFFFF max. 1200 c, Durchschn. 857 c ; bindec48s - signed, max. 140737488355327 = 0x7FFFFFFFFFFF max. 1209 c, Durchschn. 857 c ; min.-140737488355328 = 0x800000000000 434 bytes ; B5 B4 B3 B2 B1 B0 ; S D7 D6 D5 D4 D3 D2 D1 D0 ; R12 R9 R8 R7 R6 R5 R4 R3 R2 #define _BINDEC56_ ; bin 7 byte -> dec 9 byte ; bindec56 - unsigned, max. 72057594037927935 = 0xFFFFFFFFFFFFFF max. 1512 c, Durchschn. 1070 c ; bindec56s - signed, max. 36028797018963967 = 0x7FFFFFFFFFFFFF max. 1493 c, Durchschn. 1071 c ; min.-36028797018963968 = 0x80000000000000 528 bytes ; B6 B5 B4 B3 B2 B1 B0 ; S D8 D7 D6 D5 D4 D3 D2 D1 D0 ; R12 R10 R9 R8 R7 R6 R5 R4 R3 R2 #define _BINDEC64_ ; bin 8 byte -> dec 10 byte ; bindec64 - unsigned, max. 18446744073709551615 = 0xFFFFFFFFFFFFFFFF max. 1866 c, Durchschn. 1313 c ; bindec64s - signed, max. 9223372036854775807 = 0x7FFFFFFFFFFFFFFF max. 1811 c, Durchschn. 1335 c ; min. -9223372036854775808 = 0x8000000000000000 652 bytes ; B7 B6 B5 B4 B3 B2 B1 B0 ; S D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 ; R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 #ifndef BYTE_H #define BYTE_H #define byte5(x) (x>>32)&0xff #define byte6(x) (x>>40)&0xff #define byte7(x) (x>>48)&0xff #define byte8(x) (x>>56)&0xff #endif /* BYTE_H */ #define bindec_zif1 10 #define bindec_zif2 100 #define bindec_zif3 1000 #define bindec_zif4 10000 #define bindec_zif5 100000 #define bindec_zif6 1000000 #define bindec_zif7 10000000 #define bindec_zif8 100000000 #define bindec_zif9 1000000000 #define bindec_zif10 10000000000 #define bindec_zif11 100000000000 #define bindec_zif12 1000000000000 #define bindec_zif13 10000000000000 #define bindec_zif14 100000000000000 #define bindec_zif15 1000000000000000 #define bindec_zif16 10000000000000000 #define bindec_zif17 100000000000000000 #define bindec_zif18 1000000000000000000 #define bindec_zif19 10000000000000000000 ;======================================================================== ; bin 1 byte -> dec 2 byte = ; = ; B0 = ; S D1 D0 = ; R12 R3 R2 = ; = ; bindec16 - unsigned, max. 255 = 0xFF = ; = ; bindec16s - signed, max. 127 = 0x7F = ; R12=0: + min.-128 = 0x80 = ; R12=0xff: - = ; Max.75 cycles (mit rcall und ret) bei 199 (unsign) = ; Max.76 cycles (mit rcall und ret) bei -99 (sign) = ; Durchschn. 59 cycles "" "" bei 155 (unsign) = ; Durchschn. 60 cycles "" "" bei -55 (sign) = ; 56 bytes = ;======================================================================== #ifdef _BINDEC8_ bindec8s: ; mit Vorzeichen. clr r12 sbrs r2,7 rjmp bindec8 neg r2 ; wenn negativ dec r12 bindec8: push r17 push r18 ; Zif 2 ldi r18, bindec_zif2 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 push r17 ; Zif 1 ldi r18, bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r18 pop r17 ret #endif /* _BINDEC8_ */ ;======================================================================== ; bin 2 byte -> dec 3 byte = ; = ; B1 B0 = ; S D2 D1 D0 = ; R12 R4 R3 R2 = ; = ; bindec16 - unsigned, max. 65535 = 0xFFFF = ; = ; bindec16s - signed, max. 32767 = 0x7FFF = ; R12=0: + min.-32768 = 0x8000 = ; R12=0xff: - = ; Max.223 cycles (mit rcall und ret) bei 59999 (unsign) = ; Max.218 cycles (mit rcall und ret) bei -29999 (sign) = ; Durchschn. 167 cycles "" "" bei 55555 (unsign) = ; Durchschn. 162 cycles "" "" bei -25555 (sign) = ; 128 bytes = ;======================================================================== #ifdef _BINDEC16_ bindec16s: ; mit Vorzeichen. clr r12 sbrs r3,7 rjmp bindec16 com r2 ; wenn negativ com r3 ldi r17,1 clr r5 add r2,r17 adc r3,r5 dec r12 bindec16: push r17 push r18 push r19 ; Zif 4 ldi r18, low(bindec_zif4) ldi r19, high(bindec_zif4) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 3 ldi r18, low(bindec_zif3) ldi r19, high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18, bindec_zif2 clr r19 clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18, bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r19 pop r18 pop r17 ret #endif /* _BINDEC16_ */ ;======================================================================== ; bin 3 byte -> dec 4 byte = ; = ; B2 B1 B0 = ; S D3 D2 D1 D0 = ; R12 R5 R4 R3 R2 = ; = ; bindec24 - unsigned, max. 16777215 = 0xFFFFFF = ; = ; bindec24s - signed, max. 8388607 = 0x7FFFFF = ; R12=0: + min.-8388608 = 0x800000 = ; R12=0xff: - = ; Max.432 cycles (mit rcall und ret) bei 15999999 (unsign) = ; Max.414 cycles (mit rcall und ret) bei -8299999 (sign) = ; Durchschn. 328 cycles "" "" bei 15555555 (unsign) = ; Durchschn. 334 cycles "" "" bei -5555555 (sign) = ; 190 bytes = ;======================================================================== #ifdef _BINDEC24_ #define _BINDEC_SUBADD3_ bindec24s: ; mit Vorzeichen. clr r12 sbrs r4,7 rjmp bindec24 com r2 ; wenn negativ com r3 com r4 ldi r17,1 clr r5 add r2,r17 adc r3,r5 adc r4,r5 dec r12 bindec24: push r17 push r18 push r19 push r20 ; Zif 7 ldi r18, low(bindec_zif7) ldi r19, high(bindec_zif7) ldi r20, byte3(bindec_zif7) rcall bindec_subadd3 push r17 ; Zif 6 ldi r18, low(bindec_zif6) ldi r19, high(bindec_zif6) ldi r20, byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18, low(bindec_zif5) ldi r19, high(bindec_zif5) ldi r20, byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18, low(bindec_zif4) ldi r19, high(bindec_zif4) ldi r20, byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18, low(bindec_zif3) ldi r19, high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18, low(bindec_zif2) ldi r19, high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18, bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r20 pop r19 pop r18 pop r17 ret #endif /* _BINDEC24_ */ ;======================================================================== ; bin 4 byte -> dec 5 byte = ; = ; B3 B2 B1 B0 = ; S D4 D3 D2 D1 D0 = ; R12 R6 R5 R4 R3 R2 = ; = ; bindec32 - unsigned, max. 4294967295 = 0xFFFFFFFF = ; = ; bindec32s - signed, max. 2147483647 = 0x7FFFFFFF = ; R12=0: + min.-2147483648 = 0x80000000 = ; R12=0xff: - = ; Max.646 cycles (mit rcall und ret) bei 1999999999 (unsign) = ; Max.653 cycles (mit rcall und ret) bei -999999999 (sign) = ; Durchschn. 476 cycles "" "" bei 3555555555 (unsign) = ; Durchschn. 476 cycles "" "" bei -1555555555 (sign) = ; 258 bytes = ;======================================================================== #ifdef _BINDEC32_ #define _BINDEC_SUBADD3_ #define _BINDEC_SUBADD4_ bindec32s: ; mit Vorzeichen. clr r12 sbrs r5,7 rjmp bindec32 ; wenn negativ com r2 com r3 com r4 com r5 ldi r17,1 clr r6 add r2,r17 adc r3,r6 adc r4,r6 adc r5,r6 dec r12 bindec32: push r17 push r18 push r19 push r20 push r21 ; Zif 9 ldi r18,low(bindec_zif9) ldi r19,high(bindec_zif9) ldi r20,byte3(bindec_zif9) ldi r21,byte4(bindec_zif9) rcall bindec_subadd4 push r17 ; Zif 8 ldi r18,low(bindec_zif8) ldi r19,high(bindec_zif8) ldi r20,byte3(bindec_zif8) ldi r21,byte4(bindec_zif8) rcall bindec_subadd4 push r17 ; Zif 7 ldi r18,low(bindec_zif7) ldi r19,high(bindec_zif7) ldi r20,byte3(bindec_zif7) ldi r21,byte4(bindec_zif7) rcall bindec_subadd4 push r17 ; Zif 6 ldi r18,low(bindec_zif6) ldi r19,high(bindec_zif6) ldi r20,byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18,low(bindec_zif5) ldi r19,high(bindec_zif5) ldi r20,byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18,low(bindec_zif4) ldi r19,high(bindec_zif4) ldi r20,byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18,low(bindec_zif3) ldi r19,high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18,low(bindec_zif2) ldi r19,high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18,bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r6 pop r17 swap r17 or r6,r17 pop r21 pop r20 pop r19 pop r18 pop r17 ret #endif /* _BINDEC32_ */ ;======================================================================== ; bin 5 byte -> dec 5 byte = ; = ; B4 B3 B2 B1 B0 = ; S D6 D5 D4 D3 D2 D1 D0 = ; R12 R8 R7 R6 R5 R4 R3 R2 = ; = ; bindec40 - unsigned, max. 1099511627775 = 0xFFFFFFFFFF = ; = ; bindec40s - signed, max. 549755813887 = 0x7FFFFFFFFF = ; R12=0: + min.-549755813888 = 0x8000000000 = ; R12=0xff: - = ; Max.954 cycles (mit rcall und ret) bei 999999999999 (unsign) = ; Max.930 cycles (mit rcall und ret) bei -499999999999 (sign) = ; Durchschn. 674 cycles "" "" bei 555555555555 (unsign) = ; Durchschn. 682 cycles "" "" bei -455555555555 (sign) = ; 350 bytes = ;======================================================================== #ifdef _BINDEC40_ #define _BINDEC_SUBADD3_ #define _BINDEC_SUBADD4_ #define _BINDEC_SUBADD5_ bindec40s: ; mit Vorzeichen. clr r12 sbrs r6,7 rjmp bindec40 ; wenn negativ com r2 com r3 com r4 com r5 com r6 ldi r17,1 clr r7 add r2,r17 adc r3,r7 adc r4,r7 adc r5,r7 adc r6,r7 dec r12 bindec40: push r17 push r18 push r19 push r20 push r21 push r22 ; Zif 12 ldi r18,low(bindec_zif12) ldi r19,high(bindec_zif12) ldi r20,byte3(bindec_zif12) ldi r21,byte4(bindec_zif12) ldi r22,byte5(bindec_zif12) rcall bindec_subadd5 push r17 ; Zif 11 ldi r18,low(bindec_zif11) ldi r19,high(bindec_zif11) ldi r20,byte3(bindec_zif11) ldi r21,byte4(bindec_zif11) ldi r22,byte5(bindec_zif11) rcall bindec_subadd5 push r17 ; Zif 10 ldi r18,low(bindec_zif10) ldi r19,high(bindec_zif10) ldi r20,byte3(bindec_zif10) ldi r21,byte4(bindec_zif10) ldi r22,byte5(bindec_zif10) rcall bindec_subadd5 push r17 ; Zif 9 ldi r18,low(bindec_zif9) ldi r19,high(bindec_zif9) ldi r20,byte3(bindec_zif9) ldi r21,byte4(bindec_zif9) ldi r22,byte5(bindec_zif9) rcall bindec_subadd5 push r17 ; Zif 8 ldi r18,low(bindec_zif8) ldi r19,high(bindec_zif8) ldi r20,byte3(bindec_zif8) ldi r21,byte4(bindec_zif8) rcall bindec_subadd4 push r17 ; Zif 7 ldi r18,low(bindec_zif7) ldi r19,high(bindec_zif7) ldi r20,byte3(bindec_zif7) ldi r21,byte4(bindec_zif7) rcall bindec_subadd4 push r17 ; Zif 6 ldi r18,low(bindec_zif6) ldi r19,high(bindec_zif6) ldi r20,byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18,low(bindec_zif5) ldi r19,high(bindec_zif5) ldi r20,byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18,low(bindec_zif4) ldi r19,high(bindec_zif4) ldi r20,byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18,low(bindec_zif3) ldi r19,high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18,low(bindec_zif2) ldi r19,high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18,bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r6 pop r17 swap r17 or r6,r17 pop r7 pop r17 swap r17 or r7,r17 pop r8 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 ret #endif /* _BINDEC40_ */ ;======================================================================== ; bin 6 byte -> dec 10 byte = ; = ; B5 B4 B3 B2 B1 B0 = ; S D7 D6 D5 D4 D3 D2 D1 D0 = ; R12 R9 R8 R7 R6 R5 R4 R3 R2 = ; = ; bindec48 - unsigned, max. 281474976710655 = 0xFFFFFFFFFFFF = ; = ; bindec48s - signed, max. 140737488355327 = 0x7FFFFFFFFFFF = ; R12=0: + min.-140737488355328 = 0x800000000000 = ; R12=0xff: - = ; Max.1200 cycles (mit rcall und ret) bei 199999999999999 (unsign) = ; Max.1209 cycles (mit rcall und ret) bei -99999999999999 (sign) = ; Durchschn. 857 cycles "" "" bei 255555555555555 (unsign) = ; Durchschn. 857 cycles "" "" bei -136555555555555 (sign) = ; 434 bytes = ;======================================================================== #ifdef _BINDEC48_ #define _BINDEC_SUBADD3_ #define _BINDEC_SUBADD4_ #define _BINDEC_SUBADD5_ #define _BINDEC_SUBADD6_ bindec48s: ; mit Vorzeichen. clr r12 sbrs r7,7 rjmp bindec48 ; wenn negativ com r2 com r3 com r4 com r5 com r6 com r7 ldi r17,1 clr r8 add r2,r17 adc r3,r8 adc r4,r8 adc r5,r8 adc r6,r8 adc r7,r8 dec r12 bindec48: push r17 push r18 push r19 push r20 push r21 push r22 push r23 ; Zif 14 ldi r18,low(bindec_zif14) ldi r19,high(bindec_zif14) ldi r20,byte3(bindec_zif14) ldi r21,byte4(bindec_zif14) ldi r22,byte5(bindec_zif14) ldi r23,byte6(bindec_zif14) rcall bindec_subadd6 push r17 ; Zif 13 ldi r18,low(bindec_zif13) ldi r19,high(bindec_zif13) ldi r20,byte3(bindec_zif13) ldi r21,byte4(bindec_zif13) ldi r22,byte5(bindec_zif13) ldi r23,byte6(bindec_zif13) rcall bindec_subadd6 push r17 ; Zif 12 ldi r18,low(bindec_zif12) ldi r19,high(bindec_zif12) ldi r20,byte3(bindec_zif12) ldi r21,byte4(bindec_zif12) ldi r22,byte5(bindec_zif12) ldi r23,byte6(bindec_zif12) rcall bindec_subadd6 push r17 ; Zif 11 ldi r18,low(bindec_zif11) ldi r19,high(bindec_zif11) ldi r20,byte3(bindec_zif11) ldi r21,byte4(bindec_zif11) ldi r22,byte5(bindec_zif11) rcall bindec_subadd5 push r17 ; Zif 10 ldi r18,low(bindec_zif10) ldi r19,high(bindec_zif10) ldi r20,byte3(bindec_zif10) ldi r21,byte4(bindec_zif10) ldi r22,byte5(bindec_zif10) rcall bindec_subadd5 push r17 ; Zif 9 ldi r18,low(bindec_zif9) ldi r19,high(bindec_zif9) ldi r20,byte3(bindec_zif9) ldi r21,byte4(bindec_zif9) ldi r22,byte5(bindec_zif9) rcall bindec_subadd5 push r17 ; Zif 8 ldi r18,low(bindec_zif8) ldi r19,high(bindec_zif8) ldi r20,byte3(bindec_zif8) ldi r21,byte4(bindec_zif8) rcall bindec_subadd4 push r17 ; Zif 7 ldi r18,low(bindec_zif7) ldi r19,high(bindec_zif7) ldi r20,byte3(bindec_zif7) ldi r21,byte4(bindec_zif7) rcall bindec_subadd4 push r17 ; Zif 6 ldi r18,low(bindec_zif6) ldi r19,high(bindec_zif6) ldi r20,byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18,low(bindec_zif5) ldi r19,high(bindec_zif5) ldi r20,byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18,low(bindec_zif4) ldi r19,high(bindec_zif4) ldi r20,byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18,low(bindec_zif3) ldi r19,high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18,low(bindec_zif2) ldi r19,high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18,bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r6 pop r17 swap r17 or r6,r17 pop r7 pop r17 swap r17 or r7,r17 pop r8 pop r17 swap r17 or r8,r17 pop r9 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 ret #endif /* _BINDEC48_ */ ;======================================================================== ; bin 7 byte -> dec 9 byte = ; = ; B6 B5 B4 B3 B2 B1 B0 = ; S D8 D7 D6 D5 D4 D3 D2 D1 D0 = ; R12 R10 R9 R8 R7 R6 R5 R4 R3 R2 = ; = ; bindec56 - unsigned, max. 72057594037927935 = 0xFFFFFFFFFFFFFF = ; = ; bindec56s - signed, max. 36028797018963967 = 0x7FFFFFFFFFFFFF = ; R12=0: + min.-36028797018963968 = 0x80000000000000 = ; R12=0xff: - = ; Max.1512 cycles (mit rcall und ret) bei 69999999999999999 (unsign) = ; Max.1493 cycles (mit rcall und ret) bei -29999999999999999 (sign) = ; Durchschn. 1070 cycles "" "" bei 55555555555555555 (unsign) = ; Durchschn. 1071 cycles "" "" bei -35555555555555555 (sign) = ; 528 bytes = ;======================================================================== #ifdef _BINDEC56_ #define _BINDEC_SUBADD3_ #define _BINDEC_SUBADD4_ #define _BINDEC_SUBADD5_ #define _BINDEC_SUBADD6_ #define _BINDEC_SUBADD7_ bindec56s: ; mit Vorzeichen. clr r12 sbrs r8,7 rjmp bindec56 ; wenn negativ com r2 com r3 com r4 com r5 com r6 com r7 com r8 ldi r17,1 clr r9 add r2,r17 adc r3,r9 adc r4,r9 adc r5,r9 adc r6,r9 adc r7,r9 adc r8,r9 adc r9,r9 dec r12 bindec56: push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 ; Zif 16 ldi r18,low(bindec_zif16) ldi r19,high(bindec_zif16) ldi r20,byte3(bindec_zif16) ldi r21,byte4(bindec_zif16) ldi r22,byte5(bindec_zif16) ldi r23,byte6(bindec_zif16) ldi r24,byte7(bindec_zif16) rcall bindec_subadd7 push r17 ; Zif 15 ldi r18,low(bindec_zif15) ldi r19,high(bindec_zif15) ldi r20,byte3(bindec_zif15) ldi r21,byte4(bindec_zif15) ldi r22,byte5(bindec_zif15) ldi r23,byte6(bindec_zif15) ldi r24,byte7(bindec_zif15) rcall bindec_subadd7 push r17 ; Zif 14 ldi r18,low(bindec_zif14) ldi r19,high(bindec_zif14) ldi r20,byte3(bindec_zif14) ldi r21,byte4(bindec_zif14) ldi r22,byte5(bindec_zif14) ldi r23,byte6(bindec_zif14) ldi r24,byte7(bindec_zif14) rcall bindec_subadd7 push r17 ; Zif 13 ldi r18,low(bindec_zif13) ldi r19,high(bindec_zif13) ldi r20,byte3(bindec_zif13) ldi r21,byte4(bindec_zif13) ldi r22,byte5(bindec_zif13) ldi r23,byte6(bindec_zif13) rcall bindec_subadd6 push r17 ; Zif 12 ldi r18,low(bindec_zif12) ldi r19,high(bindec_zif12) ldi r20,byte3(bindec_zif12) ldi r21,byte4(bindec_zif12) ldi r22,byte5(bindec_zif12) ldi r23,byte6(bindec_zif12) rcall bindec_subadd6 push r17 ; Zif 11 ldi r18,low(bindec_zif11) ldi r19,high(bindec_zif11) ldi r20,byte3(bindec_zif11) ldi r21,byte4(bindec_zif11) ldi r22,byte5(bindec_zif11) rcall bindec_subadd5 push r17 ; Zif 10 ldi r18,low(bindec_zif10) ldi r19,high(bindec_zif10) ldi r20,byte3(bindec_zif10) ldi r21,byte4(bindec_zif10) ldi r22,byte5(bindec_zif10) rcall bindec_subadd5 push r17 ; Zif 9 ldi r18,low(bindec_zif9) ldi r19,high(bindec_zif9) ldi r20,byte3(bindec_zif9) ldi r21,byte4(bindec_zif9) ldi r22,byte5(bindec_zif9) rcall bindec_subadd5 push r17 ; Zif 8 ldi r18,low(bindec_zif8) ldi r19,high(bindec_zif8) ldi r20,byte3(bindec_zif8) ldi r21,byte4(bindec_zif8) rcall bindec_subadd4 push r17 ; Zif 7 ldi r18,low(bindec_zif7) ldi r19,high(bindec_zif7) ldi r20,byte3(bindec_zif7) ldi r21,byte4(bindec_zif7) rcall bindec_subadd4 push r17 ; Zif 6 ldi r18,low(bindec_zif6) ldi r19,high(bindec_zif6) ldi r20,byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18,low(bindec_zif5) ldi r19,high(bindec_zif5) ldi r20,byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18,low(bindec_zif4) ldi r19,high(bindec_zif4) ldi r20,byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18,low(bindec_zif3) ldi r19,high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18,low(bindec_zif2) ldi r19,high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18,bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r6 pop r17 swap r17 or r6,r17 pop r7 pop r17 swap r17 or r7,r17 pop r8 pop r17 swap r17 or r8,r17 pop r9 pop r17 swap r17 or r9,r17 pop r10 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 ret #endif /* _BINDEC56_ */ ;======================================================================== ; bin 8 byte -> dec 10 byte = ; = ; B7 B6 B5 B4 B3 B2 B1 B0 = ; S D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 = ; R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 = ; = ; bindec64 - unsigned, max. 18446744073709551615 = 0xFFFFFFFFFFFFFFFF = ; = ; bindec64s - signed, max. 9223372036854775807 = 0x7FFFFFFFFFFFFFFF = ; R12=0: + min. -9223372036854775808 = 0x8000000000000000 = ; R12=0xff: - = ; Max.1866 cycles (mit rcall und ret) bei 17999999999999999999 (unsign) = ; Max.1811 cycles (mit rcall und ret) bei -9199999999999999999 (sign) = ; Durchschn. 1313 cycles "" "" bei 5555555555555555555 (unsign) = ; Durchschn. 1335 cycles "" "" bei -5555555555555555555 (sign) = ; 652 bytes = ;======================================================================== #ifdef _BINDEC64_ #define _BINDEC_SUBADD3_ #define _BINDEC_SUBADD4_ #define _BINDEC_SUBADD5_ #define _BINDEC_SUBADD6_ #define _BINDEC_SUBADD7_ bindec64s: ; mit Vorzeichen. clr r12 sbrs r9,7 rjmp bindec64 ; wenn negativ com r2 com r3 com r4 com r5 com r6 com r7 com r8 com r9 ldi r17,1 clr r10 add r2,r17 adc r3,r10 adc r4,r10 adc r5,r10 adc r6,r10 adc r7,r10 adc r8,r10 adc r9,r10 dec r12 bindec64: push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 ; Zif 19 ldi r18,low(bindec_zif19) ldi r19,high(bindec_zif19) ldi r20,byte3(bindec_zif19) ldi r21,byte4(bindec_zif19) ldi r22,byte5(bindec_zif19) ldi r23,byte6(bindec_zif19) ldi r24,byte7(bindec_zif19) ldi r25,byte8(bindec_zif19) rcall bindec_subadd8 push r17 ; Zif 18 ldi r18,low(bindec_zif18) ldi r19,high(bindec_zif18) ldi r20,byte3(bindec_zif18) ldi r21,byte4(bindec_zif18) ldi r22,byte5(bindec_zif18) ldi r23,byte6(bindec_zif18) ldi r24,byte7(bindec_zif18) ldi r25,byte8(bindec_zif18) rcall bindec_subadd8 push r17 ; Zif 17 ldi r18,low(bindec_zif17) ldi r19,high(bindec_zif17) ldi r20,byte3(bindec_zif17) ldi r21,byte4(bindec_zif17) ldi r22,byte5(bindec_zif17) ldi r23,byte6(bindec_zif17) ldi r24,byte7(bindec_zif17) ldi r25,byte8(bindec_zif17) rcall bindec_subadd8 push r17 ; Zif 16 ldi r18,low(bindec_zif16) ldi r19,high(bindec_zif16) ldi r20,byte3(bindec_zif16) ldi r21,byte4(bindec_zif16) ldi r22,byte5(bindec_zif16) ldi r23,byte6(bindec_zif16) ldi r24,byte7(bindec_zif16) ldi r25,byte8(bindec_zif16) rcall bindec_subadd8 push r17 ; Zif 15 ldi r18,low(bindec_zif15) ldi r19,high(bindec_zif15) ldi r20,byte3(bindec_zif15) ldi r21,byte4(bindec_zif15) ldi r22,byte5(bindec_zif15) ldi r23,byte6(bindec_zif15) ldi r24,byte7(bindec_zif15) rcall bindec_subadd7 push r17 ; Zif 14 ldi r18,low(bindec_zif14) ldi r19,high(bindec_zif14) ldi r20,byte3(bindec_zif14) ldi r21,byte4(bindec_zif14) ldi r22,byte5(bindec_zif14) ldi r23,byte6(bindec_zif14) ldi r24,byte7(bindec_zif14) rcall bindec_subadd7 push r17 ; Zif 13 ldi r18,low(bindec_zif13) ldi r19,high(bindec_zif13) ldi r20,byte3(bindec_zif13) ldi r21,byte4(bindec_zif13) ldi r22,byte5(bindec_zif13) ldi r23,byte6(bindec_zif13) rcall bindec_subadd6 push r17 ; Zif 12 ldi r18,low(bindec_zif12) ldi r19,high(bindec_zif12) ldi r20,byte3(bindec_zif12) ldi r21,byte4(bindec_zif12) ldi r22,byte5(bindec_zif12) ldi r23,byte6(bindec_zif12) rcall bindec_subadd6 push r17 ; Zif 11 ldi r18,low(bindec_zif11) ldi r19,high(bindec_zif11) ldi r20,byte3(bindec_zif11) ldi r21,byte4(bindec_zif11) ldi r22,byte5(bindec_zif11) rcall bindec_subadd5 push r17 ; Zif 10 ldi r18,low(bindec_zif10) ldi r19,high(bindec_zif10) ldi r20,byte3(bindec_zif10) ldi r21,byte4(bindec_zif10) ldi r22,byte5(bindec_zif10) rcall bindec_subadd5 push r17 ; Zif 9 ldi r18,low(bindec_zif9) ldi r19,high(bindec_zif9) ldi r20,byte3(bindec_zif9) ldi r21,byte4(bindec_zif9) ldi r22,byte5(bindec_zif9) rcall bindec_subadd5 push r17 ; Zif 8 ldi r18,low(bindec_zif8) ldi r19,high(bindec_zif8) ldi r20,byte3(bindec_zif8) ldi r21,byte4(bindec_zif8) rcall bindec_subadd4 push r17 ; Zif 7 ldi r18,low(bindec_zif7) ldi r19,high(bindec_zif7) ldi r20,byte3(bindec_zif7) ldi r21,byte4(bindec_zif7) rcall bindec_subadd4 push r17 ; Zif 6 ldi r18,low(bindec_zif6) ldi r19,high(bindec_zif6) ldi r20,byte3(bindec_zif6) rcall bindec_subadd3 push r17 ; Zif 5 ldi r18,low(bindec_zif5) ldi r19,high(bindec_zif5) ldi r20,byte3(bindec_zif5) rcall bindec_subadd3 push r17 ; Zif 4 ldi r18,low(bindec_zif4) ldi r19,high(bindec_zif4) ldi r20,byte3(bindec_zif4) rcall bindec_subadd3 push r17 ; Zif 3 ldi r18,low(bindec_zif3) ldi r19,high(bindec_zif3) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 2 ldi r18,low(bindec_zif2) ldi r19,high(bindec_zif2) clr r17 inc r17 sub r2,r18 sbc r3,r19 brcc PC-3 dec r17 add r2,r18 adc r3,r19 push r17 ; Zif 1 ldi r18,bindec_zif1 clr r17 inc r17 sub r2,r18 brcc PC-2 dec r17 add r2,r18 swap r17 or r2,r17 pop r3 pop r17 swap r17 or r3,r17 pop r4 pop r17 swap r17 or r4,r17 pop r5 pop r17 swap r17 or r5,r17 pop r6 pop r17 swap r17 or r6,r17 pop r7 pop r17 swap r17 or r7,r17 pop r8 pop r17 swap r17 or r8,r17 pop r9 pop r17 swap r17 or r9,r17 pop r10 pop r17 swap r17 or r10,r17 pop r11 pop r17 swap r17 or r11,r17 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 ret bindec_subadd8: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 sbc r5,r21 sbc r6,r22 sbc r7,r23 sbc r8,r24 sbc r9,r25 brcc PC-9 dec r17 add r2,r18 adc r3,r19 adc r4,r20 adc r5,r21 adc r6,r22 adc r7,r23 adc r8,r24 adc r9,r25 ret #endif /* _BINDEC64_ */ #ifdef _BINDEC_SUBADD7_ bindec_subadd7: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 sbc r5,r21 sbc r6,r22 sbc r7,r23 sbc r8,r24 brcc PC-8 dec r17 add r2,r18 adc r3,r19 adc r4,r20 adc r5,r21 adc r6,r22 adc r7,r23 adc r8,r24 ret #endif /* _BINDEC_SUBADD7_ */ #ifdef _BINDEC_SUBADD6_ bindec_subadd6: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 sbc r5,r21 sbc r6,r22 sbc r7,r23 brcc PC-7 dec r17 add r2,r18 adc r3,r19 adc r4,r20 adc r5,r21 adc r6,r22 adc r7,r23 ret #endif /* _BINDEC_SUBADD6_ */ #ifdef _BINDEC_SUBADD5_ bindec_subadd5: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 sbc r5,r21 sbc r6,r22 brcc PC-6 dec r17 add r2,r18 adc r3,r19 adc r4,r20 adc r5,r21 adc r6,r22 ret #endif /* _BINDEC_SUBADD5_ */ #ifdef _BINDEC_SUBADD4_ bindec_subadd4: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 sbc r5,r21 brcc PC-5 dec r17 add r2,r18 adc r3,r19 adc r4,r20 adc r5,r21 ret #endif /* _BINDEC_SUBADD4_ */ #ifdef _BINDEC_SUBADD3_ bindec_subadd3: clr r17 inc r17 sub r2,r18 sbc r3,r19 sbc r4,r20 brcc PC-4 dec r17 add r2,r18 adc r3,r19 adc r4,r20 ret #endif /* _BINDEC_SUBADD3_ */ #endif /* _BINDEC_ */