.origin 0
.entrypoint START

#define PRU0_PRU1_INTERRUPT 18

#define GPIO1 				0x4804c000		// The adress of the GPIO1
#define GPIO_OE	                0x134
#define GPIO_CLEARDATAOUT 	0x190
#define GPIO_SETDATAOUT 	0x194

#define LED0		(1<<5)
#define LED1		(1<<6)
#define LED2		(1<<7)
#define LED3		(1<<0)

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, 0
    OR r4.b2, r4.b2, LED0
    OR r4.b2, r4.b2, LED1
    OR r4.b2, r4.b2, LED2
    OR r4.b3, r4.b3, LED3
    NOT r4, r4
    AND r2, r2, r4
    SBBO &r2, r3, 0, 4

BLINK:
    MOV r2, 15<<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, 15<<21
    MOV r3, GPIO1 | GPIO_CLEARDATAOUT
    SBBO &r2, r3, 0, 4

    MOV R31.b0, PRU0_PRU1_INTERRUPT+16
HALT
