16
個人的に作った、プロシージャを紹介しましょう、数回前に書いた16進数>10進数変換ですが、あれは値がでかくなってくると急激に遅くなってしまって使い物にならないので、かなり高速に動くものを作りました。が、プログラムサイズが10倍になりましたが、速度は45倍になりました。;高速高容量版;16進数を10進数五桁表示の4bit値x5こに変換する;r31:r30に16進16bit値 十進r25五桁 r24四桁 r23三桁 r22二桁 r21一桁HENKAN: push r0 push r1 push r2 push r3 push r4 push r5 push r6 push r7 push r8 push r9 push r28 push r30 push r31 ldi r21,0x00 mov r22,r21 mov r23,r21 mov r24,r21 mov r25,r21 mov r0,r21 ;r15以下はldが使えないので inc r21 ;1 mov r1,r21 inc r21 ;2 mov r2,r21 inc r21 ;3 mov r3,r21 inc r21 ;4 mov r4,r21 inc r21 ;5 mov r5,r21 inc r21 ;6 mov r6,r21 inc r21 ;7 mov r7,r21 inc r21 ;8 mov r8,r21 inc r21 ;9 mov r9,r21 ldi r21,0x00brock04: mov r28,r31 ;上8ビットの処理 andi r28,0xF0 ;上下4ビットの削除 brne brock14 ;上々4ビットが0なら上下4ビットに jmp brock03brock14: cpi r28,0x10 brne brock24 ldi r24,0x04 ldi r22,0x09 ldi r21,0x06 jmp brock03brock24: cpi r28,0x20 brne brock34 ldi r24,0x08 ldi r23,0x01 ldi r22,0x09 ldi r21,0x02 jmp brock03brock34: cpi r28,0x30 brne brock44 ldi r25,0x01 ldi r24,0x02 ldi r23,0x02 ldi r22,0x08 ldi r21,0x08 jmp brock03brock44: cpi r28,0x40 brne brock54 ldi r25,0x01 ldi r24,0x06 ldi r23,0x03 ldi r22,0x08 ldi r21,0x04 jmp brock03brock54: cpi r28,0x50 brne brock64 ldi r25,0x02 ldi r23,0x04 ldi r22,0x08 jmp brock03brock64: cpi r28,0x60 brne brock74 ldi r25,0x02 ldi r24,0x04 ldi r23,0x05 ldi r22,0x07 ldi r21,0x06 jmp brock03brock74: cpi r28,0x70 brne brock84 ldi r25,0x02 ldi r24,0x08 ldi r23,0x06 ldi r22,0x07 ldi r21,0x02 jmp brock03brock84: cpi r28,0x80 brne brock94 ldi r25,0x03 ldi r24,0x02 ldi r23,0x07 ldi r22,0x06 ldi r21,0x08 jmp brock03brock94: cpi r28,0x90 brne brockA4 ldi r25,0x03 ldi r24,0x06 ldi r23,0x08 ldi r22,0x06 ldi r21,0x04 jmp brock03brockA4: cpi r28,0xa0 brne brockB4 ldi r25,0x04 ldi r23,0x09 ldi r22,0x06 jmp brock03brockB4: cpi r28,0xb0 brne brockC4 ldi r25,0x04 ldi r24,0x05 ldi r22,0x05 ldi r21,0x06 jmp brock03brockC4: cpi r28,0xc0 brne brockD4 ldi r25,0x04 ldi r24,0x09 ldi r23,0x01 ldi r22,0x05 ldi r21,0x02 jmp brock03brockD4: cpi r28,0xd0 brne brockE4 ldi r25,0x05 ldi r24,0x03 ldi r23,0x02 ldi r22,0x04 ldi r21,0x08 jmp brock03brockE4: cpi r28,0xe0 brne brockF4 ldi r25,0x05 ldi r24,0x07 ldi r23,0x03 ldi r22,0x04 ldi r21,0x04 jmp brock03brockF4: ldi r25,0x06 ldi r24,0x01 ldi r23,0x04 ldi r22,0x04brock03: andi r31,0x0F ;上上4ビットの削除 brne brock13 jmp brock02brock13: cpi r31,0x01 brne brock23 add r23,r2 add r22,r5 add r21,r6 jmp brock02brock23: cpi r31,0x02 brne brock33 add r23,r5 add r22,r1 add r21,r2 jmp brock02brock33: cpi r31,0x03 brne brock43 add r23,r7 add r22,r6 add r21,r8 jmp brock02brock43: cpi r31,0x04 brne brock53 add r24,r1 add r22,r2 add r21,r4 jmp brock02brock53: cpi r31,0x05 brne brock63 add r24,r1 add r23,r2 add r22,r8 jmp brock02brock63: cpi r31,0x06 brne brock73 add r24,r1 add r23,r5 add r22,r3 add r21,r6 jmp brock02brock73: cpi r31,0x07 brne brock83 add r24,r1 add r23,r7 add r22,r9 add r21,r2 jmp brock02brock83: cpi r31,0x08 brne brock93 add r24,r2 add r22,r4 add r21,r8 jmp brock02brock93: cpi r31,0x09 brne brockA3 add r24,r2 add r23,r3 add r21,r4 jmp brock02brockA3: cpi r31,0x0A brne brockB3 add r24,r2 add r23,r5 add r22,r6 jmp brock02brockB3: cpi r31,0x0B brne brockC3 add r24,r2 add r23,r8 add r22,r1 add r21,r6 jmp brock02brockC3: cpi r31,0x0C brne brockD3 add r24,r3 add r22,r7 add r21,r2 jmp brock02brockD3: cpi r31,0x0D brne brockE3 add r24,r3 add r23,r3 add r22,r2 add r21,r8 jmp brock02brockE3: cpi r31,0x0E brne brockF3 add r24,r3 add r23,r5 add r22,r8 add r21,r4 jmp brock02brockF3: add r24,r3 add r23,r8 add r22,r4brock02: mov r28,r30 ;下8ビットの処理 andi r28,0xF0 ;上下4ビットの削除 brne brock12 ;上々4ビットが0なら上下4ビットに jmp brock01brock12: cpi r28,0x10 brne brock22 add r22,r1 add r21,r6 jmp brock01brock22: cpi r28,0x20 brne brock32 add r22,r3 add r21,r2 jmp brock01brock32: cpi r28,0x30 brne brock42 add r22,r4 add r21,r8 jmp brock01brock42: cpi r28,0x40 brne brock52 add r22,r6 add r21,r4 jmp brock01brock52: cpi r28,0x50 brne brock62 add r22,r8 jmp brock01brock62: cpi r28,0x60 brne brock72 add r22,r9 add r21,r6 jmp brock01brock72: cpi r28,0x70 brne brock82 add r23,r1 add r22,r1 add r21,r2 jmp brock01brock82: cpi r28,0x80 brne brock92 add r23,r1 add r22,r2 add r21,r8 jmp brock01brock92: cpi r28,0x90 brne brockA2 add r23,r1 add r22,r4 add r21,r4 jmp brock01brockA2: cpi r28,0xA0 brne brockB2 add r23,r1 add r22,r6 jmp brock01brockB2: cpi r28,0xB0 brne brockC2 add r23,r1 add r22,r7 add r21,r6 jmp brock01brockC2: cpi r28,0xC0 brne brockD2 add r23,r1 add r22,r9 add r21,r2 jmp brock01brockD2: cpi r28,0xD0 brne brockE2 add r23,r2 add r21,r8 jmp brock01brockE2: cpi r28,0xE0 brne brockF2 add r23,r2 add r22,r2 add r21,r4 jmp brock01brockF2: add r23,r2 add r22,r4brock01: andi r30,0x0F ;下下4ビットの削除 add r21,r30block21: cpi r21,0x0A brlt block22 subi r21,0x0A inc r22 jmp block21block22: cpi r22,0x0A brlt block23 subi r22,0x0A inc r23 jmp block22block23: cpi r23,0x0A brlt block24 subi r23,0x0A inc r24 jmp block23block24: cpi r24,0x0A brlt block25 subi r24,0x0A inc r25 jmp block24block25: pop r31 pop r30 pop r28 pop r9 pop r8 pop r7 pop r6 pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 RET ;