Różne procedury | Kompilacja |
WEJŚCIOWE | WYJŚCIE DANYCH | STOSU | ||
ConBD | Konwersja bajtu do systemu DEC-ASCIIZ | R16 | sbuf | - |
ConBDs | Konwersja bajtu do systemu DEC-ASCIIZ (szybka) | R16 | sbuf | - |
Con8D | Konwersja 8-bitów do systemu DEC-ASCIIZ | R22 | sbuf | - |
Con16D | Konwersja 16-bitów do systemu DEC-ASCIIZ | [R22:R23] | sbuf | - |
Con24D | Konwersja 24-bitów do systemu DEC-ASCIIZ | [R22:R23:R24] | sbuf | - |
Con32D | Konwersja 32-bitów do systemu DEC-ASCIIZ | [R22:R23:R24:R25] | sbuf | - |
ConBO | Konwersja bajtu do systemu OCT-ASCIIZ | R16 | sbuf | - |
ConBOs | Konwersja bajtu do systemu OCT-ASCIIZ (szybka) | R16 | sbuf | - |
Con8O | Konwersja 8-bitów do systemu OCT-ASCIIZ | R22 | sbuf | - |
Con16O | Konwersja 16-bitów do systemu OCT-ASCIIZ | [R22:R23] | sbuf | - |
Con24O | Konwersja 24-bitów do systemu OCT-ASCIIZ | [R22:R23:R24] | sbuf | - |
Con32O | Konwersja 32-bitów do systemu OCT-ASCIIZ | [R22:R23:R24:R25] | sbuf | - |
ConBH | Konwersja bajtu do systemu HEX-ASCIIZ | R16 | sbuf | - |
ConBB | Konwersja bajtu do systemu BIN-ASCIIZ | R16 | sbuf | - |
WEJŚCIOWE | DANYCH | STOSU | ||
Add168 | Dodawanie bajtu NN do słowa: [16] + [8] = [16] | [R22:R23] + R18 | [R22:R23] | - |
Add1616 | Dodawanie 2 słów: [16] + [16] = [16] | [R22:R23] + [R18:R19] | [R22:R23] | - |
Add248 | Dodawanie bajtu NN do wartości 24-bitowej: [24] + [8] = [24] | [R22:R23:R24] + R18 | [R22:R23:R24] | - |
Add2416 | Dodawanie słowa do wartości 24-bitowej: [24] + [16] = [24] | [R22:R23:R24] + [R18:R19] | [R22:R23:R24] | - |
Add2424 | Dodawanie 2 wartości 24-bitowych: [24] + [24] = [24] | [R22:R23:R24] + [R18:R19:R20] | [R22:R23:R24] | - |
Add328 | Dodawanie bajtu NN do wartości 32-bitowej: [32] + [8] = [32] | [R22:R23:R24:R25] + R18 | [R22:R23:R24:R25] | - |
Add3216 | Dodawanie słowa do wartości 32-bitowej: [32] + [16] = [32] | [R22:R23:R24:R25] + [R18:R19] | [R22:R23:R24:R25] | - |
Add3224 | Dodawanie wartości 24-bitowej do wartości 32-bitowej: [32] + [24] = [32] | [R22:R23:R24:R25] + [R18:R19:R20] | [R22:R23:R24:R25] | - |
Add3232 | Dodawanie 2 wartości 32-bitowych: [32] + [32] = [32] | [R22:R23:R24:R25] + [R18:R19:R20:R21] | [R22:R23:R24:R25] | - |
Sub168 | Odejmowanie bajtu NN od słowa: [16] - [8] = [16] | [R22:R23] - R18 | [R22:R23] | - |
Sub1616 | Odejmowanie 2 słów: [16] - [16] = [16] | [R22:R23] - [R18:R19] | [R22:R23] | - |
Sub248 | Odejmowanie bajtu NN od wartości 24-bitowej: [24] - [8] = [24] | [R22:R23:R24] - R18 | [R22:R23:R24] | - |
Sub2416 | Odejmowanie słowa od wartości 24-bitowej: [24] - [16] = [24] | [R22:R23:R24] - [R18:R19] | [R22:R23:R24] | - |
Sub2424 | Odejmowanie 2 wartości 24-bitowych: [24] - [24] = [24] | [R22:R23:R24] - [R18:R19:R20] | [R22:R23:R24] | - |
Sub328 | Odejmowanie bajtu NN od wartości 32-bitowej: [32] - [8] = [32] | [R22:R23:R24:R25] - R18 | [R22:R23:R24:R25] | - |
Sub3216 | Odejmowanie słowa od wartości 32-bitowej: [32] - [16] = [32] | [R22:R23:R24:R25] - [R18:R19] | [R22:R23:R24:R25] | - |
Sub3224 | Odejmowanie wartości 24-bitowej od wartości 32-bitowej: [32] - [24] = [32] | [R22:R23:R24:R25] - [R18:R19:R20] | [R22:R23:R24:R25] | - |
Sub3232 | Odejmowanie 2 wartości 32-bitowych: [32] - [32] = [32] | [R22:R23:R24:R25] - [R18:R19:R20:R21] | [R22:R23:R24:R25] | - |
Mul88 | Mnożenie 2 bajtów: [8] * [8] = [16] | R18 * R23 | [R22:R23] | - |
Mul88s | Mnożenie 2 bajtów: [8] * [8] = [16] (szybka) | R18 * R23 | [R22:R23] | - |
Mul168s | Mnożenie słowa przez bajt NN: [16] * [8] = [24] (szybka) | [R18:R19] * R20 | [R22:R23:R24] | - |
Mul1616 | Mnożenie 2 słów: [16] * [16] = [32] | [R18:R19] * [R24:R25] | [R22:R23:R24:R25] | - |
Mul1616s | Mnożenie 2 słów: [16] * [16] = [32] (szybka) | [R18:R19] * [R20:R21] | [R22:R23:R24:R25] | - |
Div88 | Dzielenie 2 bajtów: [8] / [8] = [8] + [8] | R22 / R18 | R22 + R2 | - |
Div1616 | Dzielenie 2 słów: [16] / [16] = [16] + [16] | [R22:R23] / [R18:R19] | [R22:R23] + [R2:R3] | - |
ARGUMENTY WEJŚCIOWE | WYJŚCIE DANYCH | STOSU | ||
L8 | Pętla opóźniająca o 3-768 cykli zegarowych: X = A*3, A=0: X=768 | R16 | - | - |
L16 | Pętla opóźniająca o 5-262145 cykli zegarowych: X = A*4+1, A=0: X=262145 | [XH:XL] | - | - |
L88 | Pętla opóźniająca o 6-197376 cykli zegarowych: X = A*(B*6-(B-1)*3), A=0/B=0: X=197376 | R16, R17 | - | - |
L816 | Pętla opóźniająca o 8-67109888 cykli zegarowych: X = A*(B*8-(B-1)*4), A=0/B=0: X=67109888 | R16, [XH:XL] | - | - |
L168 | Pętla opóźniająca o 8-50593793 cykli zegarowych: X = A*(B*8-(B-1)*5)-(A-1), A=0/B=0: X=50593793 | [XH:XL], R16 | - | - |
L1616 | Pętla opóźniająca o 10-17180196865 cykli zegarowych: X = A*(B*10-(B-1)*5)-(A*B-1), A=0/B=0: X=17180196865 | [XH:XL], [YH:YL] | - | - |
Wait | Pętla opóźniająca o zadany czas: 100us - 25.5ms | R15, R16 | - | - |
WaitM | Pętla opóźniająca o zadany czas: 10ms - 2.55s | R15, R16 | - | - |
ARGUMENTY WEJŚCIOWE | WYJŚCIE DANYCH | STOSU | ||
LenStr | Liczenie znaków w ciągu ASCIIZ z pamięci SRAM | sbuf | R16 | - |
LenStf | Liczenie znaków w ciągu ASCIIZ z pamięci FLASH | fbuf | R16 | - |
DelZero | Usuwanie zbędnych zer z wartości ASCIIZ | sbuf | sbuf | - |
ClrZero | Zamienianie zbędnych zer w wartości ASCIIZ na spacje | sbuf | sbuf | - |
FuseBit | Generowanie ciągu ASCIIZ z szesnastkowymi wartościami fuse/lock bitów: "FL:LB:FE:FH" | - | sbuf | - |
RegSREG | Generowanie ciągu ASCIIZ z wartościami flag rejestru SREG | SREG | sbuf | - |
ScalXY | Podwajanie wymiarów bitmapy 8x8 pikseli z pamięci FLASH | fbuf | sbuf | - |
[RxH:RxL] - |
wartość 16-bitowa tworzona przez parę rejestrów (starszy:młodszy bajt). W pętlach opóźniających można używać tylko tych par, które są obsługiwane przez instrukcję odejmowania SBIW: [R25:R24], [R27:R26] (XH:XL), [R29:R28] (YH:YL), [R31:R30] (ZH:ZL). |
ConBD: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$64 ConBD0: ldi R18,$2F ConBD1: inc R18 sub R16,R17 brcc ConBD1 add R16,R17 st Z+,R18 lsr R17 lsr R17 lsr R17 breq ConBD2 brcc ConBD0 subi R17,$02 rjmp ConBD0 ConBD2: st Z,R17 ret ;Maksymalna wartość liczby wyjściowej: "255" ($FF) ;Rozmiar: 38 B, linii kodu: 19
ConBDs: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$3A ldi R18,$2F ConBDs0: inc R18 subi R16,$64 brcc ConBDs0 ConBDs1: dec R17 subi R16,$F6 brmi ConBDs1 subi R16,$D0 st Z+,R18 st Z+,R17 st Z+,R16 clr R16 st Z,R16 ret ;Maksymalna wartość liczby wyjściowej: "255" ($FF) ;Rozmiar: 36 B, linii kodu: 18
Con8D: ldi R22,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$03 st Z,R16 ldi R17,$03 ;maksymalna liczba cyfr Con8D0: ldi R18,$08 ;liczba bitów do konwersji sub R16,R16 Con8D1: rol R16 cpi R16,$0A brcs Con8D2 subi R16,$0A sec rjmp Con8D3 Con8D2: clc Con8D3: rol R22 dec R18 brpl Con8D1 subi R16,$D0 st -Z,R16 dec R17 brne Con8D0 ret ;Maksymalna wartość liczby wyjściowej: "255" ($FF) ;Rozmiar: 48 B, linii kodu: 24
Con16D: ldi R22,$00 ;starszy bajt do konwersji ldi R23,$00 ;młodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$05 st Z,R16 ldi R17,$05 ;maksymalna liczba cyfr Con16D0: ldi R18,$10 ;liczba bitów do konwersji sub R16,R16 Con16D1: rol R16 cpi R16,$0A brcs Con16D2 subi R16,$0A sec rjmp Con16D3 Con16D2: clc Con16D3: rol R23 rol R22 dec R18 brpl Con16D1 subi R16,$D0 st -Z,R16 dec R17 brne Con16D0 ret ;Maksymalna wartość liczby wyjściowej: "65535" ($FFFF) ;Rozmiar: 52 B, linii kodu: 26
Con24D: ldi R22,$00 ;najstarszy bajt do konwersji ldi R23,$00 ldi R24,$00 ;najmłodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$08 st Z,R16 ldi R17,$08 ;maksymalna liczba cyfr Con24D0: ldi R18,$18 ;liczba bitów do konwersji sub R16,R16 Con24D1: rol R16 cpi R16,$0A brcs Con24D2 subi R16,$0A sec rjmp Con24D3 Con24D2: clc Con24D3: rol R24 rol R23 rol R22 dec R18 brpl Con24D1 subi R16,$D0 st -Z,R16 dec R17 brne Con24D0 ret ;Maksymalna wartość liczby wyjściowej: "16777215" ($FFFFFF) ;Rozmiar: 56 B, linii kodu: 28
Con32D: ldi R22,$00 ;najstarszy bajt do konwersji ldi R23,$00 ldi R24,$00 ldi R25,$00 ;najmłodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$0A st Z,R16 ldi R17,$0A ;maksymalna liczba cyfr Con32D0: ldi R18,$20 ;liczba bitów do konwersji sub R16,R16 Con32D1: rol R16 cpi R16,$0A brcs Con32D2 subi R16,$0A sec rjmp Con32D3 Con32D2: clc Con32D3: rol R25 rol R24 rol R23 rol R22 dec R18 brpl Con32D1 subi R16,$D0 st -Z,R16 dec R17 brne Con32D0 ret ;Maksymalna wartość liczby wyjściowej: "4294967295" ($FFFFFFFF) ;Rozmiar: 60 B, linii kodu: 30
ConBO: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$40 ConBO0: ldi R18,$2F ConBO1: inc R18 sub R16,R17 brcc ConBO1 add R16,R17 st Z+,R18 lsr R17 lsr R17 lsr R17 brne ConBO0 st Z,R17 ret ;Maksymalna wartość liczby wyjściowej: "377" ($FF) ;Rozmiar: 32 B, linii kodu: 16
ConBOs: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$38 ldi R18,$2F ConBOs0: inc R18 subi R16,$40 brcc ConBOs0 ConBOs1: dec R17 subi R16,$F8 brmi ConBOs1 subi R16,$D0 st Z+,R18 st Z+,R17 st Z+,R16 clr R16 st Z,R16 ret ;Maksymalna wartość liczby wyjściowej: "377" ($FF) ;Rozmiar: 36 B, linii kodu: 18
Con8O: ldi R22,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$03 st Z,R16 ldi R17,$03 ;maksymalna liczba cyfr Con8O0: ldi R18,$08 ;liczba bitów do konwersji sub R16,R16 Con8O1: rol R16 cpi R16,$08 brcs Con8O2 subi R16,$08 sec rjmp Con8O3 Con8O2: clc Con8O3: rol R22 dec R18 brpl Con8O1 subi R16,$D0 st -Z,R16 dec R17 brne Con8O0 ret ;Maksymalna wartość liczby wyjściowej: "377" ($FF) ;Rozmiar: 48 B, linii kodu: 24
Con16O: ldi R22,$00 ;starszy bajt do konwersji ldi R23,$00 ;młodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$06 st Z,R16 ldi R17,$06 ;maksymalna liczba cyfr Con16O0: ldi R18,$10 ;liczba bitów do konwersji sub R16,R16 Con16O1: rol R16 cpi R16,$08 brcs Con16O2 subi R16,$08 sec rjmp Con16O3 Con16O2: clc Con16O3: rol R23 rol R22 dec R18 brpl Con16O1 subi R16,$D0 st -Z,R16 dec R17 brne Con16O0 ret ;Maksymalna wartość liczby wyjściowej: "177777" ($FFFF) ;Rozmiar: 52 B, linii kodu: 26
Con24O: ldi R22,$00 ;najstarszy bajt do konwersji ldi R23,$00 ldi R24,$00 ;najmłodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$08 st Z,R16 ldi R17,$08 ;maksymalna liczba cyfr Con24O0: ldi R18,$18 ;liczba bitów do konwersji sub R16,R16 Con24O1: rol R16 cpi R16,$08 brcs Con24O2 subi R16,$08 sec rjmp Con24O3 Con24O2: clc Con24O3: rol R24 rol R23 rol R22 dec R18 brpl Con24O1 subi R16,$D0 st -Z,R16 dec R17 brne Con24O0 ret ;Maksymalna wartość liczby wyjściowej: "77777777" ($FFFFFF) ;Rozmiar: 56 B, linii kodu: 28
Con32O: ldi R22,$00 ;najstarszy bajt do konwersji ldi R23,$00 ldi R24,$00 ldi R25,$00 ;najmłodszy bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych clr R16 adiw ZL,$0B st Z,R16 ldi R17,$0B ;maksymalna liczba cyfr Con32O0: ldi R18,$20 ;liczba bitów do konwersji sub R16,R16 Con32O1: rol R16 cpi R16,$08 brcs Con32O2 subi R16,$08 sec rjmp Con32O3 Con32O2: clc Con32O3: rol R25 rol R24 rol R23 rol R22 dec R18 brpl Con32O1 subi R16,$D0 st -Z,R16 dec R17 brne Con32O0 ret ;Maksymalna wartość liczby wyjściowej: "37777777777" ($FFFFFFFF) ;Rozmiar: 60 B, linii kodu: 30
ConBH: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$02 ConBH0: swap R16 mov R18,R16 andi R18,$0F subi R18,$D0 cpi R18,$3A brlt ConBH1 subi R18,$F9 ;subi R18,$D9 - małe litery (a-f) ConBH1: st Z+,R18 dec R17 brne ConBH0 st Z,R17 ret ;Maksymalna wartość liczby wyjściowej: "FF" ($FF) ;Procedura generuje duże lub małe litery (a-f) ;Rozmiar: 32 B, linii kodu: 16
ConBB: ldi R16,$00 ;bajt do konwersji ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wyjścia danych ldi R17,$08 ;liczba bitów do konwersji ConBB0: ldi R18,$30 lsl R16 brcc ConBB1 inc R18 ConBB1: st Z+,R18 dec R17 brne ConBB0 st Z,R17 ret ;Maksymalna wartość liczby wyjściowej: "11111111" ($FF) ;Rozmiar: 26 B, linii kodu: 13
Add168: clr R2 add R23,R18 ;młodszy bajt słowa/wyniku, bajt NN adc R22,R2 ;starszy bajt słowa/wyniku ret ;C=1 jeśli wynik >65535 ;Rozmiar: 8 B, linii kodu: 4
Add1616: add R23,R19 ;młodszy bajt 1 słowa/wyniku, młodszy bajt 2 słowa adc R22,R18 ;starszy bajt 1 słowa/wyniku, starszy bajt 2 słowa ret ;C=1 jeśli wynik >65535 ;Rozmiar: 6 B, linii kodu: 3
Add248: clr R2 add R24,R18 ;najmłodszy bajt wartości/wyniku, bajt NN adc R23,R2 adc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik >16777215 ;Rozmiar: 10 B, linii kodu: 5
Add2416: clr R2 add R24,R19 ;najmłodszy bajt wartości/wyniku, młodszy bajt słowa adc R23,R18 ;starszy bajt słowa adc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik >16777215 ;Rozmiar: 10 B, linii kodu: 5
Add2424: add R24,R20 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości adc R23,R19 adc R22,R18 ;najstarszy bajt 1 wartości/wyniku, najstarszy bajt 2 wartości ret ;C=1 jeśli wynik >16777215 ;Rozmiar: 8 B, linii kodu: 4
Add328: clr R2 add R25,R18 ;najmłodszy bajt wartości/wyniku, bajt NN adc R24,R2 adc R23,R2 adc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik >4294967295 ;Rozmiar: 12 B, linii kodu: 6
Add3216: clr R2 add R25,R19 ;najmłodszy bajt wartości/wyniku, młodszy bajt słowa adc R24,R18 ;starszy bajt słowa adc R23,R2 adc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik >4294967295 ;Rozmiar: 12 B, linii kodu: 6
Add3224: clr R2 add R25,R20 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości adc R24,R19 adc R23,R18 ;najstarszy bajt 2 wartości adc R22,R2 ;najstarszy bajt 1 wartości/wyniku ret ;C=1 jeśli wynik >4294967295 ;Rozmiar: 12 B, linii kodu: 6
Add3232: add R25,R21 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości adc R24,R20 adc R23,R19 adc R22,R18 ;najstarszy bajt 1 wartości/wyniku, najstarszy bajt 2 wartości ret ;C=1 jeśli wynik >4294967295 ;Rozmiar: 10 B, linii kodu: 5
Sub168: clr R2 sub R23,R18 ;młodszy bajt słowa/wyniku, bajt NN sbc R22,R2 ;starszy bajt słowa/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 8 B, linii kodu: 4
Sub1616: sub R23,R19 ;młodszy bajt 1 słowa/wyniku, młodszy bajt 2 słowa sbc R22,R18 ;starszy bajt 1 słowa/wyniku, starszy bajt 2 słowa ret ;C=1 jeśli wynik <0 ;Rozmiar: 6 B, linii kodu: 3
Sub248: clr R2 sub R24,R18 ;najmłodszy bajt wartości/wyniku, bajt NN sbc R23,R2 sbc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 10 B, linii kodu: 5
Sub2416: clr R2 sub R24,R19 ;najmłodszy bajt wartości/wyniku, młodszy bajt słowa sbc R23,R18 ;starszy bajt słowa sbc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 10 B, linii kodu: 5
Sub2424: sub R24,R20 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości sbc R23,R19 sbc R22,R18 ;najstarszy bajt 1 wartości/wyniku, najstarszy bajt 2 wartości ret ;C=1 jeśli wynik <0 ;Rozmiar: 8 B, linii kodu: 4
Sub328: clr R2 sub R25,R18 ;najmłodszy bajt wartości/wyniku, bajt NN sbc R24,R2 sbc R23,R2 sbc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 12 B, linii kodu: 6
Sub3216: clr R2 sub R25,R19 ;najmłodszy bajt wartości/wyniku, młodszy bajt słowa sbc R24,R18 ;starszy bajt słowa sbc R23,R2 sbc R22,R2 ;najstarszy bajt wartości/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 12 B, linii kodu: 6
Sub3224: clr R2 sub R25,R20 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości sbc R24,R19 sbc R23,R18 ;najstarszy bajt 2 wartości sbc R22,R2 ;najstarszy bajt 1 wartości/wyniku ret ;C=1 jeśli wynik <0 ;Rozmiar: 12 B, linii kodu: 6
Sub3232: sub R25,R21 ;najmłodszy bajt 1 wartości/wyniku, najmłodszy bajt 2 wartości sbc R24,R20 sbc R23,R19 sbc R22,R18 ;najstarszy bajt 1 wartości/wyniku, najstarszy bajt 2 wartości ret ;C=1 jeśli wynik <0 ;Rozmiar: 10 B, linii kodu: 5
Mul88: sub R22,R22 ldi R16,$08 Mul88a: brcc Mul88b add R22,R18 ;bajt 1 Mul88b: ror R22 ;starszy bajt wyniku ror R23 ;bajt 2, młodszy bajt wyniku dec R16 brpl Mul88a ret ;Rozmiar: 18 B, linii kodu: 9
Mul88s: mul R18,R23 ;bajt 1, bajt 2 mov R23,R0 ;młodszy bajt wyniku mov R22,R1 ;starszy bajt wyniku ret ;Rozmiar: 8 B, linii kodu: 4
Mul168s: mul R19,R20 ;młodszy bajt słowa, bajt NN mov R24,R0 ;najmłodszy bajt wyniku mov R23,R1 mul R18,R20 ;starszy bajt słowa add R23,R0 adc R22,R1 ;najstarszy bajt wyniku ret ;Rozmiar: 14 B, linii kodu: 7
Mul1616: clr R22 sub R23,R23 ldi R16,$10 Mul1616a: brcc Mul1616b add R23,R19 ;młodszy bajt 1 słowa adc R22,R18 ;starszy bajt 1 słowa Mul1616b: ror R22 ;najstarszy bajt wyniku ror R23 ror R24 ;starszy bajt 2 słowa ror R25 ;młodszy bajt 2 słowa, najmłodszy bajt wyniku dec R16 brpl Mul1616a ret ;Rozmiar: 26 B, linii kodu: 13
Mul1616s: clr R2 mul R19,R21 mov R25,R0 ;najmłodszy bajt wyniku mov R24,R1 mul R18,R20 mov R23,R0 mov R22,R1 mul R19,R20 ;młodszy bajt 1 słowa, starszy bajt 2 słowa add R24,R0 adc R23,R1 adc R22,R2 mul R18,R21 ;starszy bajt 1 słowa, młodszy bajt 2 słowa add R24,R0 adc R23,R1 adc R22,R2 ;najstarszy bajt wyniku ret ;Rozmiar: 32 B, linii kodu: 16
Div88: clr R2 ldi R16,$08 Div88a: lsl R22 ;bajt 1, bajt wyniku rol R2 ;bajt z niepodzieloną resztą cp R2,R18 ;bajt 2 brcs Div88b inc R22 sub R2,R18 Div88b: dec R16 brne Div88a ret ;Jeśli R18 (bajt 2) > R22 (bajt 1): wynik = $00, reszta = R22 (bajt 1). ;Po dzieleniu przez 0: wynik = $FF, reszta = R22 (bajt 1) (0/0 i 255/1 dają taki sam rezultat). ;Rozmiar: 22 B, linii kodu: 11
Div1616: clr R2 clr R3 ldi R16,$10 Div1616a: lsl R23 ;młodszy bajt 1 słowa/wyniku rol R22 ;starszy bajt 1 słowa/wyniku rol R3 ;młodszy bajt słowa z niepodzieloną resztą rol R2 ;starszy bajt słowa z niepodzieloną resztą cp R3,R19 ;młodszy bajt 2 słowa cpc R2,R18 ;starszy bajt 2 słowa brcs Div1616b inc R23 sub R3,R19 sbc R2,R18 Div1616b: dec R16 brne Div1616a ret ;Jeśli [R18:R19] (słowo 2) > [R22:R23] (słowo 1): wynik = $0000, reszta = [R22:R23] (słowo 1). ;Po dzieleniu przez 0: wynik = $FFFF, reszta = [R22:R23] (słowo 1) (0/0 i 65535/1 dają taki sam ;rezultat). ;Rozmiar: 32 B, linii kodu: 16
L8: ldi R16,$01 ;liczba A L8a: dec R16 brne L8a ;Rozmiar: 6 B, linii kodu: 3
L16: ldi XH,$00 ;starszy bajt liczby A ldi XL,$01 ;młodszy bajt liczby A L16a: sbiw XL,$01 brne L16a ;Rozmiar: 8 B, linii kodu: 4
L88: ldi R16,$01 ;liczba A L88a: ldi R17,$01 ;liczba B L88b: dec R17 brne L88b dec R16 brne L88a ;Rozmiar: 12 B, linii kodu: 6
L816: ldi R16,$01 ;liczba A L816a: ldi XH,$00 ;starszy bajt liczby B ldi XL,$01 ;młodszy bajt liczby B L816b: sbiw XL,$01 brne L816b dec R16 brne L816a ;Rozmiar: 14 B, linii kodu: 7
L168: ldi XH,$00 ;starszy bajt liczby A ldi XL,$01 ;młodszy bajt liczby A L168a: ldi R16,$01 ;liczba B L168b: dec R16 brne L168b sbiw XL,$01 brne L168a ;Rozmiar: 14 B, linii kodu: 7
L1616: ldi XH,$00 ;starszy bajt liczby A ldi XL,$01 ;młodszy bajt liczby A L1616a: ldi YH,$00 ;starszy bajt liczby B ldi YL,$01 ;młodszy bajt liczby B L1616b: sbiw YL,$01 brne L1616b sbiw XL,$01 brne L1616a ;Rozmiar: 16 B, linii kodu: 8
Wait: ldi R17,$19 mul R16,R17 ;wartość opóźnienia: $01-$FF (100us-25.5ms) Wait0: movw R24,R0 Wait1: sbiw R24,$01 brne Wait1 dec R15 ;częstotliwość pracy mikrokontrolera: $01-$14 (1-20 MHz) brne Wait0 ret ;Rozmiar: 16 B, linii kodu: 8
WaitM: ldi R17,$19 mul R16,R17 ;wartość opóźnienia: $01-$FF (10ms-2.55s) WaitM0: ldi R18,$64 WaitM1: movw R24,R0 WaitM2: sbiw R24,$01 brne WaitM2 dec R18 brne WaitM1 dec R15 ;częstotliwość pracy mikrokontrolera: $01-$14 (1-20 MHz) brne WaitM0 ret ;Rozmiar: 22 B, linii kodu: 11
LenStr: ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wejścia danych ser R16 LenStr0: inc R16 ;liczba znaków (maks. 255) ld R17,Z+ ;odczyt znaku z pamięci SRAM tst R17 brne LenStr0 ret ;Rozmiar: 16 B, linii kodu: 8
LenStf: ldi ZL,LOW(fbuf<<1) ldi ZH,HIGH(fbuf<<1) ;adres wejścia danych ser R16 LenStf0: inc R16 ;liczba znaków (maks. 255) lpm R17,Z+ ;odczyt znaku z pamięci FLASH tst R17 brne LenStf0 ret ;Rozmiar: 16 B, linii kodu: 8
DelZero: ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wejścia/wyjścia danych movw YL,ZL DelZero0: ld R16,Y+ tst R16 breq DelZero3 cpi R16,$30 breq DelZero0 sbiw YL,$01 cp YL,ZL cpc YH,ZH breq DelZero2 DelZero1: ld R16,Y+ st Z+,R16 tst R16 brne DelZero1 DelZero2: ret DelZero3: std Z+1,R16 ret ;Rozmiar: 38 B, linii kodu: 19
ClrZero: ldi ZL,LOW(sbuf) ldi ZH,HIGH(sbuf) ;adres wejścia/wyjścia danych ldi R17,$20 ;znak spacji ld R16,Z ClrZero0: cpi R16,$30 breq ClrZero1 ret ClrZero1: st Z+,R17 ld R16,Z tst R16 brne ClrZero0 ldi R16,$30 st -Z,R16 ret ;Rozmiar: 28 B, linii kodu: 14
FuseBit: ldi YL,LOW(sbuf) ldi YH,HIGH(sbuf) ;adres wyjścia danych clr ZL clr ZH ldi R18,$3A FuseBit0: lds R16,$57 ;odczyt rejestru SPMCSR ori R16,$09 ;ustawienie bitów BLBSET i SELFPRGEN sts $57,R16 ;zapis rejestru SPMCSR lpm R2,Z+ ;odczyt fuse/lock bitów ;W zależności od wartości adresu [ZH:ZL] są odczytywane: ; $0000 - Fuse bits Low byte (FL) ; $0001 - Lock Bits (LB) ; $0002 - Fuse bits Extended byte (FE) ; $0003 - Fuse bits High byte (FH) ldi R16,$02 FuseBit1: swap R2 mov R17,R2 andi R17,$0F subi R17,$D0 cpi R17,$3A brlt FuseBit2 subi R17,$F9 FuseBit2: st Y+,R17 dec R16 brne FuseBit1 st Y+,R18 cpi ZL,$04 brne FuseBit0 st -Y,R16 ret ;Rozmiar: 54 B, linii kodu: 25
RegSREG: lds R16,$5F ;odczyt rejestru SREG ldi YL,LOW(sbuf) ldi YH,HIGH(sbuf) ;adres wyjścia danych ldi ZL,LOW(RegSREG2<<1) ldi ZH,HIGH(RegSREG2<<1) ldi R17,$08 ldi R18,$20 ldi R19,$3A RegSREG0: lpm R20,Z+ st Y+,R20 st Y+,R19 ldi R20,$30 lsl R16 brcc RegSREG1 inc R20 RegSREG1: st Y+,R20 st Y+,R18 dec R17 brne RegSREG0 st -Y,R17 ret RegSREG2: .db "ITHSVNZC" ;Rozmiar: 52 B, linii kodu: 22
ScalXY: ldi XL,LOW(fbuf<<1) ldi XH,HIGH(fbuf<<1) ;adres wejścia danych (bitmapa 8x8 = 8 bajtów) ldi YL,LOW(sbuf) ldi YH,HIGH(sbuf) ;adres wyjścia danych (bitmapa 16x16 = 32 bajty) clr R2 ldi R17,$08 ScalXY0: movw ZL,XL lpm R16,Z+ ;odczyt kolejnego bajtu bitmapy z pamięci FLASH movw XL,ZL ldi R18,$02 ScalXY1: mov R19,R16 andi R19,$0F ;pionowe podwajanie 4 pikseli (najpierw młodsze bity) swap R16 ldi ZL,LOW(ScalXY2<<1) ldi ZH,HIGH(ScalXY2<<1) ;adres tablicy do pionowego podwajania 4 pikseli add ZL,R19 adc ZH,R2 lpm R19,Z st Y+,R19 ;zapis bajtu z pionowo podwojonymi 4 pikselami (najpierw górne piksele) st Y,R19 ;zapis drugiej identycznej kolumny pikseli - podwajanie poziome adiw YL,$0F ;przejście do drugiego wiersza obrazu (dolne kolumny pikseli) dec R18 brne ScalXY1 sbiw YL,$1E ;powrót do pierwszego wiersza obrazu (górne kolumny pikseli) dec R17 brne ScalXY0 ret ScalXY2: .db $00,$03,$0C,$0F,$30,$33,$3C,$3F,$C0,$C3,$CC,$CF,$F0,$F3,$FC,$FF ;Rozmiar: 70 B, linii kodu: 28 ;Monochromatyczna bitmapa 8x8 pikseli, której każdy bajt to kolejna pionowa kolumna 8 pikseli obrazu ;(najmłodszy bit LSB to górny piksel kolumny). Taki format zapisu jest używany przez wyświetlacze OLED ;ze sterownikiem SSD1306. fbuf: .db $00,$7C,$7E,$13,$13,$7E,$7C,$00 ;litera "A"