mov r11, 0x7f
mov r13, 0x1
lsft r11, r11, r13
add r11, r11, r13   @ r11 = 0x00FF


mov r0, 0x80
mov r1, 0x08
lsft r0, r0, r1      @ r0 = 0x8000
mov r15, 0x10
add r15, r0, r15     @ input address
mov r2, 0x01         @row stride
mov r3, 0x08         @shift amoun
mov r12, 0x10        
b .smiley 

.smiley:

@row0
mov  r5, 0x03        @ high byte
mov  r6, 0xC0        @ low byte
and  r6, r6, r11
lsft r4, r5, r3      
add  r4, r4, r6      
str  r4, [r0]        
add  r0, r0, r2      

@row1
mov  r5, 0x0C        @ high byte
mov  r6, 0x30        @ low byte
and  r6, r6, r11
lsft r4, r5, r3      
add  r4, r4, r6      
str  r4, [r0]        
add  r0, r0, r2      

@row2
mov  r5, 0x10        @ high byte
mov  r6, 0x08        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row3
mov  r5, 0x20        @ high byte
mov  r6, 0x04        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2  

@row4
mov  r5, 0x40        @ high byte
mov  r6, 0x02        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row5
mov  r5, 0x40        @ high byte
mov  r6, 0x02        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row6
mov  r5, 0x8C        @ high byte
mov  r6, 0x31        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row7
mov  r5, 0x8C        @ high byte
mov  r6, 0x31        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row8
mov  r5, 0x80        @ high byte
mov  r6, 0x01        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row9
mov  r5, 0x80        @ high byte
mov  r6, 0x01        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row10
mov  r5, 0x48        @ high byte
mov  r6, 0x12        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row11
mov  r5, 0x44        @ high byte
mov  r6, 0x22        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row12
mov  r5, 0x23        @ high byte
mov  r6, 0xC4        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row13
mov  r5, 0x10        @ high byte
mov  r6, 0x08        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row14
mov  r5, 0x0C        @ high byte
mov  r6, 0x30        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     

@row15
mov  r5, 0x03        @ high byte
mov  r6, 0xC0        @ low byte
and  r6, r6, r11
lsft r4, r5, r3    
add  r4, r4, r6    
str  r4, [r0]    
add  r0, r0, r2     
@ reset r0 back to top (16 rows)
sub  r0, r0, r12

.wait_press_smile:
    ldr r14, [r15]
    and r14, r14, r2     @isolate button bit
    bz  r14, .wait_press_smile   @stay until button = 1

.wait_release_smile:
    ldr r14, [r15]
    and r14, r14, r2
    bnz r14, .wait_release_smile @stay while still pressed

    b .frowny       @toggle to frown

.trampoline:
    b .smiley


.frowny:

    @ row0: 
    mov  r5, 0xFC
    mov  r6, 0x3F
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row1: 
    mov  r5, 0xF3
    mov  r6, 0xCF
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row2: 
    mov  r5, 0xEF
    mov  r6, 0xF7
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row3: 
    mov  r5, 0xDF
    mov  r6, 0xFB
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row4: 
    mov  r5, 0xBF
    mov  r6, 0xFD
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row5: 
    mov  r5, 0xBF
    mov  r6, 0xFD
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row6: 
    mov  r5, 0x73
    mov  r6, 0xCE
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row7: 
    mov  r5, 0x73
    mov  r6, 0xCE
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row8: 
    mov  r5, 0x7F
    mov  r6, 0xFE
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row9: 
    mov  r5, 0x7F
    mov  r6, 0xFE
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row10:  
    mov  r5, 0xBC
    mov  r6, 0x3D
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row11: 
    mov  r5, 0xBB
    mov  r6, 0xDD
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row12:  
    mov  r5, 0xD7
    mov  r6, 0xEB
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row13: 
    mov  r5, 0xEF
    mov  r6, 0xF7
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row14: 
    mov  r5, 0xF3
    mov  r6, 0xCF
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add  r0, r0, r2

    @ row15: 
    mov  r5, 0xFC
    mov  r6, 0x3F
and  r6, r6, r11
    lsft r4, r5, r3
    add  r4, r4, r6
    str  r4, [r0]
    add r0, r0, r2

    @ reset r0 back to top (16 rows)
    sub  r0, r0, r12

.wait_press_frown:
    ldr r14, [r15]
    and r14, r14, r2     @isolate button bit
    bz  r14, .wait_press_frown   @stay until button = 1

.wait_release_frown:
    ldr r14, [r15]
    and r14, r14, r2
    bnz r14, .wait_release_frown @ stay while still pressed

    b .trampoline @toggle to bounce -> smiley

