; knihovna na predmet SKD ; ======================= ; ; Registry: ; R0..R31 = 8-bit registry ; X (R26, R27) = 16-bit ; Y (R28, R29) = 16-bit ; Z (R30, R31) = 16-bit ; SP = 16-bit - ukazatel zásobníku ; PC = 16-bit - programový čítač ; SREG = speciální registry ; ; Paměť programu ; 16kB - data po 8 bitech, instrukce po 16 bitech ; ; lpm - načte do R0 data z adresy Z ; ; Paměť dat ; ; 1 kB - po 8 bitech ; ; ld Rd, x+ ; d = 0..31 ; ld Rd, -y ; d = 0..31 ; ld Rd, z ; d = 0..31 ; ldd Rd, z+q ; d = 0..31, q = 0..63, JEN PRO Y a Z !!! ; ; st x+, Rr ; r = 0..31 ; st -y, Rr ; r = 0..31 ; st z, Rr ; r = 0..31 ; std z+q, Rr ; r = 0..31, q = 0..63, JEN PRO Y a Z !!! ; sts adresa+offset, R0 ; ; Manipulace s registry ; ; clr r0 ; vynuluje obsah registru ; ldi r16, 15 ; načte kladnou konstantu, pouze registry r16-r31 !!! ; ldi r16, -15 ; načte zápornou konstantu ; ldi r16, 0x0F ; hexa ; ldi r16, 0b00001000 ; binárně ; mov r0, r1 ; zkopíruje obsah registru ; add r16, r18 ; součet - nastaví Z,C,N,V,H ; adc r17, r19 ; součet + carry ; sub r0, r1 ; rozdíl ; subi r16, 5 ; dekrementace o 5 ; inc r16 ; +1 ; dec r16 ; -1 ; ; adiw XH:XL, 1 ; přičte k X jedničku ; sbiw XH:XL, 1 ; odečte od X jedničku ; ; lsl r0 ; L rotace, vstup = 0, výstup = C ; lsr r0 ; R rotace, vstup = 0, výstup = C ; rol r0 ; L rotace, vstup = C, výstup = C ; ror r0 ; R rotace, vstup = C, výstup = C ; asr r0 ; R rotace, vstup = bit 7, výstup = C ; ; ori r16, 0x0F ; OR ; andi r16, 0x0F ; AND ; or r1, r2 ; OR ; and r1, r2 ; AND ; com r16 ; NOT ; neg r16 ; dvojkový doplněk ; eor r16, r17 ; XOR ; ; Porovnávání ; cpi r16, 10 ; porovnání ; cp r1, r2 ; porování ; cpc r1, r2 ; porovnání r1, r2 a carry ; ; Skoky ; ; breq rel ;Z=1 rovnost ; brne rel ;Z=0 nerovnost ; brsh rel ;C=0 větší nebo rovno ; brlo rel ;C=1 menší ; brmi rel ;N=1 mínus (záporné) ; brpl rel ;N=0 plus (nezáporné) ; brge rel ; větší nebo rovno ; brlt rel ; menší ; ; jmp adresa ; skok ; ; call ; volání podprogramu ; ret ; návrat z podprogramu ; ijmp ; skočí na adresu v registru Z ; vynásobí dvě 8-bitová čísla (R16 a R18) ; a 16-bitový výsledek uloží do R17 a R16 ; ničí obsah registru r19 mul8: ldi r19, 9 mul8_cykl: lsr r17 ror r16 brsh mul8_nula add r17, r18 mul8_nula: dec r19 cpi r19, 0 brne mul8_cykl ret ; vynásobí dvě 8-bitová čísla na zásobníku ; a 16-bitový výsledek uloží do zásobníku (pop H, pop L) ; neničí obsah žádných registrů mul8stack: push r28 ; Y(L) push r29 ; Y(H) push r16 push r17 push r18 push r19 in r28, SPL in r29, SPH ldd r16, Y+10 ; parametr 1 ldd r18, Y+9 ; parametr 2 call mul8 std Y+10, r16 ; výsledek (L) std Y+ 9, r17 ; výsledek (H) pop r19 pop r18 pop r17 pop r16 pop r29 pop r28 ret ; vypočítá faktoriál 8-bitového čísla v zásobníku ; výsledek (8-bitový) uloží do zásobníku ; nepoškozuje obsah žádných registrů fact: ; uložím do zásobníku používané registry push r28 ; Y(L) push r29 ; Y(H) push r16 ; načtu parametr ze zásobníku (do r16) in r28, SPL in r29, SPH ldd r16, Y+6 ; parametr ; vypočítám faktoriál r16 (do r16) cpi r16, 1 breq fact_jedna dec r16 push r16 ; n-1 call fact ; (n-1)! inc r16 push r16 ; n call mul8stack ; n * (n-1)! pop r16 ; H (nezajímá mě) pop r16 ; L fact_jedna: ; uložím výsledek do zásobníku std Y+6, r16 ; obnovím použité registry pop r16 pop r29 pop r28 ret fib: ; uložím do zásobníku používané registry push r28 ; Y(L) push r29 ; Y(H) push r16 push r17 ; načtu parametr ze zásobníku (do r16) in r28, SPL in r29, SPH ldd r16, Y+7 ; parametr ; vypočítám fibonačiho číslo r16 (do r17) ldi r17, 1 ; výsledek cpi r16, 2 brlo fib_nula_jedna dec r16 push r16 ; n-1 call fib ; fib(n-1) pop r17 dec r16 push r16 ; n-2 call fib ; fib(n-2) pop r16 add r17, r16; fib(n-1) + fib(n-2) fib_nula_jedna: ; uložím výsledek do zásobníku std Y+7, r17 ; obnovím použité registry pop r17 pop r16 pop r29 pop r28 ret