/*---------------------------------------------*/ /* Jan Dvořák (dvoraj19) ÚT 11:00 (8.12.2008) */ /*---------------------------------------------*/ ;program umí NÁSOBIT a DĚLIT i ZÁPORNÁ ČÍSLA ;program kontroluje dělení nulou ;upravy v znaky.inc: místo znaku '?' se zobrazuje podrtžítko ; místo znaku ',' se zobrazuje = , důvod je prostý ; ',' je jako ostatní operátory v asc pod 0, tudíž ; se pak snáze vyhodnocuje je li znak číslem nebo operátorem .include "m169def.inc" .cseg .org 0x0000 jmp start .org 0x0006; přerušení od joysticku jmp prazdne_preruseni .org 0x000A jmp int_T2 .org 0x0100 .dseg ;pomocné proměnné sekundy: .byte 1 ;proměnná pro čítač /pole velikosti 1 joys: .byte 1 ;výsledek joysticku zadani: .byte 256 ;zadání - řetezec delka: .byte 1 ;počet zadaných číslic blika: .byte 1 ;zobrazit znak, nebo _ (blikání) nepis: .byte 1 ;zobrazen výsledek, nepiš na výstup ; .cseg ;výchozí zadání vy_zadani: .db "@@@@@@0", 0 ; použitelné znaky symboly: .db "0123456789/*,-+0123456789/*,-+", 0 ; 2x abych nemusel dělat cykl posun ; start: .include "znaky.inc" ;soubor ASCII ;vynulování čítače; joytisku, délky zadání, blikání ldi r16, 0 sts sekundy, r16 sts joys, r16 sts blika, r16 sts nepis, r16 ldi r16, 1 sts delka, r16 /*--------------------------------------------*/ ;inicializace zasobniku ldi r16, 0x00 out SPL, r16 ldi r16, 0x04 out SPH, r16 ;inicializace displaye call init_disp call smaz_disp ;inicializace čítače cli ; globální zakázání přerušení ldi r16, 0b00001000 sts ASSR, r16 ; vyber hodiny od oscilátoru 32768 Hz ldi r16, 0b00000001 sts TIMSK2, r16 ; povolení přerušení od časovače 2 ldi r16, 0b000100 sts TCCR2A, r16 ; spuštění sei ; povolení přerušení (globální) ;inicializace joysticku in r17, DDRE andi r17, 0b11110011 in r16, PORTE ori r16, 0b00001100 out DDRE, r17 out PORTE, r16 ldi r16, 0b00000000 sts DIDR1, r16 in r17, DDRB andi r17, 0b00101111 in r16, PORTB ori r16, 0b11010000 out DDRB, r17 out PORTB, r16 /*--------------------------------------------*/ ;načtení výchozího zadání do paměti ldi r30, low(vy_zadani<<1); nastavíme registr Z ldi r31, high(vy_zadani<<1) ldi r28, low(zadani); registr Y ldi r29, high(zadani) nacti_cyklus: ;nakopíruje výchozé zadání lpm st Y+, r0 adiw r30, 1 tst r0 brne nacti_cyklus /*--------------------------------------------*/ ldi r19, 1; obluha přerušení - pokud byla změna smycka: lds r16, sekundy ;porovnáme jestli na display je stejná hodnota jako v v sekundy cp r19, r16 breq smycka mov r19, r16; akuální hodnota /*--------------------------------------------*/ ;načtení joysticku , do r16 call nacti_joystick /*--------------------------------------------*/ lds r18, nepis ;kontrola jestli nezobrazujeme výsledek subi r18, 0 breq sm_dal ;nezobrazujeme, čekáme na joystick subi r16, 0 breq sm_dal ;vypneme zobrazení výsledku call spust ; sm_dal: ; nahoru cpi r16, 64 breq joy_nahoru ;dolu cpi r16, 128 breq joy_dolu ;doleva cpi r16, 4 breq joy_doleva ;doprava cpi r16, 8 breq joy_doprava ;else jmp smycka_pokr /*--------------------------------------------*/ joy_nahoru: lds r16, delka subi r16, 0 breq smycka_pokr; kontrola jestli needitujeme nultý znak ldi r16, 14 ; posun o 1 výš call posun_symbol jmp smycka_pokr /*--------------------------------------------*/ joy_dolu: lds r16, delka subi r16, 0 breq smycka_pokr ldi r16, 1 ; posun o 1 znak call posun_symbol jmp smycka_pokr /*--------------------------------------------*/ joy_doleva: lds r16, delka subi r16, 0 breq smycka_pokr; kontrola jestli nemažeme nultý znak dec r16 sts delka, r16 ;nulování blikání ldi r16, 0 sts blika, r16 jmp smycka_pokr /*--------------------------------------------*/ joy_doprava: ldi r16,0 call posun_symbol ; zapíšeme nulu na konec jmp smycka_pokr /*--------------------------------------------*/ ; smycka_pokr: lds r16, nepis subi r16, 0 brne smycka ;je zobrazen výsledek, nic nedělej call zobraz_radek; zobrazení na disp rjmp smycka ;konec programu /*----------------------------------*/ /* Zobraz číslo 16BIT */ /*----------------------------------*/ zobraz_cislo16bit: ;ZOBRAZÍ ČÍSO NA DISP, vstup r17, r16 push r18 push r19 push r20 push r21 push r23 push r24 ;znaménko clr r24 ;indikace jestli už bylo zobrazeno číslo ldi r23, 0b10000000 and r23, r17 ;znaménko čísla ;pokud záporné cpi r23, 0b10000000 brne cislo_nezn ;první má znaménko, obrátíme hodnotu na kladnou call znamenko1716 push r16 push r17 ldi r17, 1 ldi r16, '-' call zobraz_znak pop r17 pop r16 cislo_nezn: ;nakopírujeme do r21 20 mov r21, r17 mov r20, r16 ;vlastní zobrazení ;desetiticíce ldi r17, 0x27 ;jmenovatel 10 000 ldi r16, 0x10 mov r19, r21 ;čitatel mov r18, r20 call vydel16bit; výsledek 17 16, zbytek 19 18 ;nulu nezobrazujeme push r16 push r17 ldi r23, 48 ;výpočet znaku add r16, r23 inc r24 ;je číslo cpi r16, 48 ;kontrola nuly brne z16a ldi r16, '@' ;prázdný znak dec r24 ;nezobrazeno číslo z16a: ldi r17, 2 call zobraz_znak pop r17 pop r16 ;tisíce ldi r17, 0x03 ;jmenovatel 1000 ldi r16, 0xE8 call vydel16bit; výsledek 17 16, zbytek 19 18 ;nulu nezobrazujeme push r16 push r17 ldi r23, 48 ;výpočet znaku add r16, r23 inc r24 cpi r16, 48 ;kontrola nuly brne z16b cpi r24, 1 brne z16b ldi r16, '@' ;prázdný znak dec r24 z16b: ldi r17, 3 call zobraz_znak pop r17 pop r16 ;sta ldi r17, 0x00 ;jmenovatel 100 ldi r16, 100 call vydel16bit; výsledek 17 16, zbytek 19 18 ;nulu nezobrazujeme push r16 push r17 ldi r23, 48 ;výpočet znaku add r16, r23 inc r24 cpi r16, 48 ;kontrola nuly brne z16c cpi r24, 1 brne z16c ldi r16, '@' ;prázdný znak dec r24 z16c: ldi r17, 4 call zobraz_znak pop r17 pop r16 ;desítky ldi r17, 0x00 ;jmenovatel 10 ldi r16, 10 call vydel16bit; výsledek 17 16, zbytek 19 18 ;nulu nezobrazujeme push r16 push r17 ldi r23, 48 ;výpočet znaku add r16, r23 inc r24 cpi r16, 48 ;kontrola nuly brne z16d cpi r24, 1 brne z16d ldi r16, '@' ;prázdný znak dec r24 z16d: ldi r17, 5 call zobraz_znak pop r17 pop r16 ;jenotky ldi r17, 6 mov r16, r18 ldi r23, 48 add r16, r23 call zobraz_znak ; pop r24 pop r23 pop r21 pop r20 pop r19 pop r18 ret /*----------------------------------*/ /* Děleni 16BIT */ /*----------------------------------*/ vydel16bit: ;vstup r17, r16;jmenovatel r19, r18, čitatel ;;;; výstup r17, r16 , zbytek t19, r18 push r20 push r21 push r22 push r23 push r24 ; ;R23 R24 znaménka u operátorů ldi r23, 0b10000000 ldi r24, 0b10000000 and r23, r17 ;znaménko jmenovatele and r24, r19 ;znaménko čitatele cpi r23, 0b10000000 brne delznamenko_druhy ;první má znaménko, obrátíme hodnotu na kladnou call znamenko1716 delznamenko_druhy: cpi r24, 0b10000000 brne delznamenka_hotova ;druhý má znaménko, obrátíme call znamenko1918 delznamenka_hotova: ;vlastní dělení ldi r22, 16; prúchodu ldi r20, 0 ldi r21, 0 lsl r18 ; posun o byt - vynásobení 2 rol r19 dcyklus_del: rol r20; rotace zbytku rol r21 cp r21, r17 brlo ddel_preskoc cp r17, r21 brne dodecti cp r20, r16 brlo ddel_preskoc dodecti: sub r20, r16 sbc r21, r17 ddel_preskoc: rol r18 rol r19 dec r22 brne dcyklus_del ;výsledek mezi com r19 com r18 ;výsledek mov r17, r19; podíl mov r16, r18 mov r18, r20; zbytek mov r19, r21 ;vynulujeme znamínkový bit andi r17, 0b01111111 andi r19, 0b01111111 ;výpočet konečného znaménka add r23, r24 ; sečtu, pokud 1 tak záporný jinak kladný breq nemen_znamenko call znamenko1716 del_nemen_znamenko: pop r24 pop r23 pop r22 pop r21 pop r20 ret /*----------------------------------*/ /* Násobení 16BIT */ /*----------------------------------*/ nasob16bit: ;vstup r17, r16; r19, r18, výstup r17, r16 push r20 push r21 push r22 push r23 push r24 ; clr r21 clr r20 ;R23 R24 znaménka u operátorů ldi r23, 0b10000000 ldi r24, 0b10000000 and r23, r17 ;znaménko prvního činitele and r24, r19 ;znaménko druhého činitele cpi r23, 0b10000000 brne znamenko_druhy ;první má znaménko, obrátíme hodnotu na kladnou call znamenko1716 znamenko_druhy: cpi r24, 0b10000000 brne znamenka_hotova ;druhý má znaménko, obrátíme call znamenko1918 znamenka_hotova: ; ldi r22, 16 ;režije cyklu - násobíme 15 míst, 16 je znamémko ;posunu dolní doprava nas_start: dec r22 breq nas_konec lsr r19 ror r18 brcc nas_pokr ;je carry byt -> násobení jedničkou: přičtu do registru, posunu add r20, r16 adc r21, r17 lsl r16 rol r17 jmp nas_start nas_pokr: ;není carry jen posunu lsl r16 rol r17 jmp nas_start nas_konec: mov r16, r20 mov r17, r21 ;výpočet konečného znaménka add r23, r24 ; sečtu, pokud 1 tak záporný jinak kladný breq nemen_znamenko call znamenko1716 nemen_znamenko: pop r24 pop r23 pop r22 pop r21 pop r20 ret /*----------------------------------*/ /* Změn znamenko 16BIT */ /*----------------------------------*/ znamenko1716: push r20 push r21 ;práce v doplnkovým kodu, převedeme na sčítání com r17; provedeme negace com r16 ldi r20, 1 ldi r21, 0 add r16, r20 ;přičteme jedničku adc r17, r21 pop r21 pop r20 ret znamenko1918: push r20 push r21 ;práce v doplnkovým kodu, převedeme na sčítání com r19; provedeme negace com r18 ldi r20, 1 ldi r21, 0 add r18, r20 ;přičteme jedničku adc r19, r21 pop r21 pop r20 ret /*----------------------------------*/ /* Sčítání odčítání 16BIT */ /*----------------------------------*/ secti16bit: ;vstup r17, r16; r19, r18, výstup r17, r16 add r16, r18 adc r17, r19 ret odecti16bit: ;vstup r17, r16; r19, r18, výstup r17, r16 call znamenko1716 ; odečetní = přičtení záporné hodnoty call secti16bit ret /*----------------------------------*/ /* Vypočti výsledek, zobraz */ /*----------------------------------*/ vypocti: push r0 push r1 push r16 push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r25 push r28 push r29 ;zakážeme zobrazování disp ldi r16, 1 sts nepis, r16 ;načteme posloupnost znaků z paměti, kontrolujeme není li operátor ldi r28, low(zadani) ldi r29, high(zadani) ldi r21, 0 ; hodnota operátoru; 0 = první operátor clr r16 clr r17 clr r18 clr r19 ; !!! R23 R22 pomocné na výsledek ; R21 - předchozé operand ;překočíme mezery ldi r20, 6 mezera: ld r0, Y+ dec r20 brne mezera ; vyp_start: ld r0, Y+ ldi r20, 47 sub r20, r0 ;kontrola znaku, pokud záporný tak jde o číslo brpl vyp_operator ;zobrazeno číslo, posuneme registr přičteme do registru r17, r16, ldi r19, 0 ldi r18, 10 ; vynásobíme deseti, přičteme call nasob16bit ldi r19, 0 mov r18, r0 subi r18, 48 call secti16bit jmp vyp_start vyp_operator: ;zobrazen operátor cpi r21, 0 breq op_prvni ;2 a více operátor ;vypočteme, výsldek zůstane v r17, r16 mov r19, r23 ;hodnoty druhého operandu mov r18, r22 ;sčítání ldi r20, '+' cp r21, r20 breq vyp_secti ;očítání ldi r20, '-' cp r21, r20 breq vyp_odecti ;násobení ldi r20, '*' cp r21, r20 breq vyp_nasob ;dělení ldi r20, '/' cp r21, r20 breq vyp_vydel ; jmp vyp_konec vyp_secti: call secti16bit jmp vyp_vypoceteno vyp_odecti: call odecti16bit jmp vyp_vypoceteno vyp_nasob: call nasob16bit jmp vyp_vypoceteno vyp_vydel: ;kontrola dělení nulou mov r25, r17 or r25, r16 cpi r25, 0 breq vyp_chyba ; call vydel16bit jmp vyp_vypoceteno vyp_vypoceteno: ;nakopríjeme výsledek do ,,schránky" mov r23, r17 ;výsledky mov r22, r16 mov r21, r0 ;operátor clr r16 clr r17 jmp vyp_start op_prvni: ;první operátor (ještě není co počítat), jen překopírujeme registry mov r21, r0 mov r23, r17 mov r22, r16 clr r16 clr r17 jmp vyp_start vyp_konec: ;výsledek v r17 r16 mov r17, r19 mov r16, r18 call smaz_disp call zobraz_cislo16bit jmp vyp_uvolni ; vyp_chyba: ; ldi r17, 1 ldi r16, 'C' call zobraz_znak inc r17 ldi r16, 'H' call zobraz_znak inc r17 ldi r16, 'Y' call zobraz_znak inc r17 ldi r16, 'B' call zobraz_znak inc r17 ldi r16, 'A' call zobraz_znak inc r17 ldi r16, '*' call zobraz_znak vyp_uvolni: ; pop r29 pop r28 pop r25 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 pop r1 pop r0 ret /*----------------------------------*/ /* Posun dolů / nahoru / přidej */ /*----------------------------------*/ posun_symbol: ;načteme znak na pozici ;parametr R16 - o kolik znaku posunout ;pokud je R16==0 tak přidej pozici tj nastav na delka znak 0 ; push r0 push r17 push r18 push r19 push r26 push r27 push r30 push r31 ; lds r19, delka ldi r17, 6 add r19, r17 ldi r26, low(zadani) ldi r27, high(zadani) ldi r30, low(symboly<<1) ldi r31, high(symboly<<1) ;posuneme o r19 pd_posun: ld r17, X+ dec r19 brne pd_posun ;nyní máme v r17 editovaný znak ;přidáváme znak? subi r16, 0 brne pd_regZ ;r16 je nula, zvolíme znak nuly ;pokud poslední znak = tak vyhodnot ldi r16, ',' ; moje umělé rovnítko cp r17, r16 brne pd_pridej_nulu ;zvoláme vyhodnocení, skočíme nakonec call vypocti jmp pd_skok_konec ; pd_pridej_nulu: ;zvyš délku lds r16, delka inc r16 sts delka, r16 ld r17, X+ ;posun v registru inc r19 ;cyklus správa ldi r16, '0' mov r0, r16 jmp pd_pos_preskoc ;nalezneme stejný znak v symbolech (registr z) pd_regZ: lpm adiw r30, 1 cp r17, r0 brne pd_regZ ;posuneme se na další znak pd_pos_sym: lpm adiw r30, 1 dec r16 brne pd_pos_sym pd_pos_preskoc: st -X, r0 ;nastavíme neblikací znak ldi r19,0 sts blika, r19 ; pd_skok_konec: pop r31 pop r30 pop r27 pop r26 pop r19 pop r18 pop r17 pop r0 ; ret /*----------------------------------*/ /* Zobraz řádek */ /*----------------------------------*/ zobraz_radek: ;zobrazí řádek z paměti dat, 6 pozic push r16 push r17 push r18 push r26 push r27 ; ldi r17, 1 ;začínáme na prví pozici na display ldi r26, low(zadani) ldi r27, high(zadani) ;posun na pozici podle délky zadání lds r18, delka subi r18, 0 ; nastavení příznaku Z breq preskoc_posun ; radek_posun: ld r16, X+ dec r18 brne radek_posun ; preskoc_posun: ldi r18, 5 ;oblsuha cyklu ; radek_pismeno: ;načteme písmeno, zobrazíme na display ld r16, X+ ;načtení znaku z paměti call zobraz_znak inc r17 ; dec r18 brne radek_pismeno ;zobrazení 6 místa lds r18, blika inc r18 cpi r18, 2 breq blik_nuluj ld r16, X+ ;načtení znaku z paměti jmp blik_zobraz ; blik_nuluj: ldi r18, 0 ldi r16, '?' ; zobrazujeme znak _ - efekt blikání blik_zobraz: sts blika, r18 call zobraz_znak ; pop r27 pop r26 pop r18 pop r17 pop r16 ret /*----------------------------------*/ /* Obsluha přerušení */ /*----------------------------------*/ int_T2: push r16 in r16, SREG push r16 lds r16, sekundy inc r16 ;vynulování pro větší než 9 cpi r16,10 brlo pres ldi r16, 0 pres: ; sts sekundy, r16 pop r16 out SREG, r16 pop r16 ; reti /*----------------------------------*/ /* Inicializuj display */ /*----------------------------------*/ init_disp: ldi r16, 0xB7 sts LCDCRB, r16 ldi r16, 0x10 sts LCDFRR, r16 ldi r16, 0x0F sts LCDCCR, r16 ldi r16, 0x80 sts LCDCRA, r16 ret /*----------------------------------*/ /* Smazat display */ /*----------------------------------*/ smaz_disp: push r16 ldi r16,0 ;pozice 1 2 sts LCDDR0, r16 sts LCDDR0 + 5, r16 sts LCDDR0 + 10, r16 sts LCDDR0 + 15, r16 ;pozice 3 4 sts LCDDR1, r16 sts LCDDR1 + 5, r16 sts LCDDR1 + 10, r16 sts LCDDR1 + 15, r16 ;pozice 5 6 sts LCDDR2, r16 sts LCDDR2 + 5, r16 sts LCDDR2 + 10, r16 sts LCDDR2 + 15, r16 ;ostatni segmenty sts LCDDR3, r16 sts LCDDR3 + 5, r16 sts LCDDR3 + 10, r16 sts LCDDR3 + 15, r16 pop r16 ret /*----------------------------------*/ /* Zobrazit znak ASCII */ /*----------------------------------*/ zobraz_znak: ;používám R16-R21, R0,1 R26 R27(X) R30 R31(Z) ;zobrazení znaku: r16 znak; r17 pozice ;pomocné proměné - zachování pvodních v zásobíku push r0 ;operátor mul push r1 push r16 push r17 push r18 push r19 push r20 push r21 push r26 ;X push r27 push r30 ;Z push r31 ;výpočet znaku (4*ASC()-42) subi r16, 42 lsl r16 lsl r16 ;výpočet pozice ;odečteme 1, vydělíme 2 - display po 2 znacích, zjistíme levou - pravou pozici ldi r19,0 ;R19 : levost pravost uložení informace dec r17 lsr r17 ;určení vlevo - v pravo-carry bit při dělení dvěma - liché číslo; brcc preskoc ldi r19, 1 ; informace o pozici segmentu preskoc: ;adresa na display ldi r26,LCDDR0; X registr clr r27 ; jen tak pro jistotu add r26,r17 ;pozice ;načtení znaků - registr Z ldi r30, low(znaky<<1) ldi r31, high(znaky<<1) add r30, r16; přesun na pozici znaku ;provedeme cyklus ve kterém načteme data z druhého segmentu ;a přidáme data nová, posuneme se na další řádek ldi r21, 4; cyklus: ;LCDR ld r18, X; načteme aktuální stav a vynulujeme příslušné byty - horní nebo dolní lpm r20, Z+ ; načteme z registru Z, zvětšíme o 1 - posun na další čtveřici v souboru subi r19, 0; kontrola R19 - jestli byl carry bit v dělení - pravost levost breq neposun posun: ;posun o 4 bity - levý segment lsl r20 lsl r20 lsl r20 lsl r20 ;vynulujem horní byty andi r18, 0b00001111 jmp pokracuj neposun: andi r18, 0b11110000 ;nulujeme spodní byty pokracuj: add r18, r20 mov r0, r18 st X, r0 adiw r26,5 ; posun v registru dec r21 ;správa cyklu brne cyklus; pokračuejem v cyklu dokud r21 není nula ;navrácení hodnot do záobníku registrům pop r31 pop r30 pop r27 pop r26 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 pop r1 pop r0 ret /*----------------------------------*/ /* Zobraz číslo */ /*----------------------------------*/ zobraz_cislo: ;číslo z regitru R16; další používané R17, R18 ;rozdělíme výpočet na výpočet stovek, desítek a jednotek, pak pomocí ;zobraz znak zobazíme na display (zobrazujeme zprava) push r17; uchování registrů push r18 ;stovky ldi r17, 100 call vydel_cisla ; výsledek v R16, zbytek R17 mov r18, r17 ; uchování zbytku ;mod nezobrazuj nuly, pokud zapoznámkujeme řádky s hvězdičkama, zobrazíme nuly brne mod2a ;*********************** ldi r16, '@' ;*********************** jmp mod2b ;*********************** mod2a: ;*********************** subi r16, 16 ; výpočet hodnoty pro zobrazznak (ASCII) mod2b: ;*********************** ldi r17, 4 call zobraz_znak ;desítky ldi r17, 10 mov r16, r18 call vydel_cisla mov r18, r17 ;mod nezobrazuj nuly brne mod2aa ;*********************** ldi r16, '@' ;*********************** jmp mod2ab ;*********************** mod2aa: ;*********************** subi r16, 16 ; výpočet hodnoty pro zobrazznak (ASCII) mod2ab: ;*********************** ldi r17, 5 call zobraz_znak ;jednotky mov r16, r18; přesun zbytku po delení 10 ldi r17, 6 subi r16, 16 ; výpočet hodnoty pro zobrazznak (ASCII) call zobraz_znak ;navrácení registrům pvodní hodnoty pop r18 pop r17 ; ret /*----------------------------------*/ /* Vyděl čísla */ /*----------------------------------*/ vydel_cisla: ;číslo z registru 16 čílem z registru 17 ;výsledek: r16 ;používané registry: R18, R19 push r18 ; uchování v zásobníku push r19; zbytek po deleni ldi r18, 8; 8 bitová čísla - režije cyklu ldi r19, 0 lsl r16 ; posun o byt - vynásobení 2 cyklus_del: rol r19 cp r19, r17 brlo del_preskoc sub r19, r17 del_preskoc: rol r16 dec r18 brne cyklus_del com r16 mov r17, r19 ;promenné ze zásobníku pop r19 pop r18 ; ret ;//////////////////////////////////// spust: ;nastavení hodnoty nepiš na 0 push r16 ldi r16,0 sts nepis, r16 sts sekundy, r16 pop r16 ; clr r16 ;vynulujeme joystick ret ;//////////////////////////////////// prazdne_preruseni: reti /*----------------------------------*/ /* Načti joystick */ /*----------------------------------*/ nacti_joystick: ;načtení joysticku push r18 push r19 push r20 joy_start: in r18, PINB in r19, PINE add r18,r19 ;výpočet hodnoty, zobrazení ori r18, 0b00101111; nastavíme všude jedničky ori r19, 0b11110011; kde není definován com r18; negujeme, tj 1 jen u stisknutého com r19 or r18, r19 mov r20, r18 nop nop nop nop nop nop in r18, PINB in r19, PINE add r18,r19 ;výpočet hodnoty, zobrazení ori r18, 0b00101111; nastavíme všude jedničky ori r19, 0b11110011; kde není definován com r18; negujeme, tj 1 jen u stisknutého com r19 or r18, r19 cp r18, r20 brne joy_start ;konec joysticku ;sts joys, r18 mov r16, r18 pop r20 pop r19 pop r18 ret /*----------------------------------*/