/* ASM program to implement External Interrupt INT1 in AVR
* intasm.asm written by Anand IE Lab
*
*/
         .nolist ; turn list file generation OFF
         .include "m8def.inc"
         .list /* turn it ON again */
         .org 0 ; set program origin
         rjmp reset ; on reset, program starts here
         .org 0x0004 ;
         rjmp int1_ISR;
reset:
         ldi R16, 0x70 ;
         out spl, R16
         ldi R16, 0x00 /* Guess, why it is done ??? */
         out sph, R16
         ldi R16, 0x02             ; make PB1 output
         out DDRB, ..........; /* fill in here */
         ldi R16, ......... ; fill in here
         out DDRD, R16 ; make PORTD input
         ldi R16,0x08 ;          /* enable internal pull-up resistor. This avoids the high impe */
         out PORTD, R16 ;        /* -dance state while reading data from external world */
         in R16, MCUCR         ;
         ori R16, 0x08 ; why it is Ored?
         out MCUCR, R16 ;
         in R16, GICR ; enable INT1 interrupt
         ori R16, 0x80 ;
         out GICR, ..... ; /* fill in here */
         ldi R16, 0x00 ;
         out PORTB, R16 ;
         sei ; /* what does it do? */
         indefiniteloop: rjmp indefiniteloop /* Stay here. Expecting interrupt? */
          /* reset – the main - loop ends here */
int1_ISR: ; INT1 interrupt handler or ISR
       in R16, SREG ; save status register SREG
       PUSH ...... ; /* Fill in here. save the status register contents into the stack memory. */
            /* StckPntr decremented. StckPntr tracks the lower end of ACTIVE stack. PC is */
           /* PUSHed automatically, by default. No need for explicit instruction */
         ldi R16,0x0a ; blink led 10 times by storing R0 a value of 10 & decrementing
         mov R0, R16 /* to zero realises the LED blinking 10 times */
back5: ldi R16,0x02 ; Turn on LED
       out PORTB, R16 /* LED connected to penultimate bit (B1) of PORTB */
delay1:LDI R16,0xFF ; delay
back2: LDI R17,0xFF ; /* back2 loop starts.. adds delay */
back1: DEC ....... /* fill in. Innermost delay loop. Each execution cycle is of T_clk */
       BRNE back1 /* branch if not equal – means go on in loop till R* goes 0 */
       DEC R16 /* for each inner loop run, an equal amount of delay in outer loop */
       BRNE back2 /* how many clock cycles for ON period? */
       /* Till this time LED is ON. First part of duty cycle ends */
       ldi R16,0x00 ; Turn off LED
       out PORTB, .... ;    /* fill-in here */
delay2:LDI R16,0xFF ; delay – OFF period. Second part of duty cycle starts
back3: LDI R17,0xFF
back4: DEC R7
       BRNE back4
       DEC R16
       BRNE back3
       DEC ...... /* Fill in here. Initially R0 = 10. Completes ONE duty cycle */
       BRNE back5 ; /* R0-- till 0. 10 times blinking */
       POP R16 ; retrieve status register. The stack’s lower end is incremented
       out SREG, R16 /* meaning stckPntr++; In “pop R16” instruction, the topend
       /* stack location’s value is espewed out and is stored in R16 */
RETI ; go back to main program and set I = 1 (enabling interrupts as the current ISR is executed)