.origin 0
.entrypoint START

#define PRU0_ARM_INTERRUPT 19

#define GPIO1 				0x4804c000		// The adress of the GPIO1
#define GPIO_OE	0x134
#define GPIO_CLEARDATAOUT 	0x190
#define GPIO_SETDATAOUT 	0x194
#define INTERRUPT_BIT           (1<<6)

#define LED0		        (1<<5)

START:
    LBCO r0, C4, 4, 4					// Load Bytes Constant Offset (?)
    CLR  r0, r0, 4						// Clear bit 4 in reg 0
    SBCO r0, C4, 4, 4					// Store Bytes Constant Offset
	
ENABLE:
    MOV r3, GPIO1 | GPIO_OE
    LBBO &r2, r3, 0, 4
    MOV r4, r2
    OR r4.b2, r4.b2, LED0
    NOT r4, r4
    AND r2, r2, r4
    SBBO &r2, r3, 0, 4

BLINK:
    MOV r2, 1<<21
    MOV r3, GPIO1 | GPIO_SETDATAOUT
    SBBO &r2, r3, 0, 4

    MOV r0, 0x00a00000
DELAY:
    SUB r0, r0, 1
    QBNE DELAY, r0, 0

    MOV r2, 1<<21
    MOV r3, GPIO1 | GPIO_CLEARDATAOUT
    SBBO &r2, r3, 0, 4

    MOV r0, 0x00a00000
DELAY2:
    SUB r0, r0, 1
    QBNE DELAY2, r0, 0

    AND r5, r31.b3, INTERRUPT_BIT
    QBEQ BLINK, r5, 0

HALT
