PERIOD = 22000000
#PERIOD = 100

.section .init
.global _start
.type _start, @function

		
_start:
	  # Initialize global pointer
	.option push
	.option norelax
	1:auipc gp, %pcrel_hi(__global_pointer$)
	addi  gp, gp, %pcrel_lo(1b)
	.option pop
	
	li x1, 0
	li x2, 0
	li x4, 0
	li x5, 0
	li x6, 0
	li x7, 0
	li x8, 0
	li x9, 0
	li x10, 0
	li x11, 0
	li x12, 0
	li x13, 0
	li x14, 0
	li x15, 0
	li x16, 0
	li x17, 0
	li x18, 0
	li x19, 0
	li x20, 0
	li x21, 0
	li x22, 0
	li x23, 0
	li x24, 0
	li x25, 0
	li x26, 0
	li x27, 0
	li x28, 0
	li x29, 0
	li x30, 0
	li x31, 0

	# write to gpio
	li	x2, 0xFF
	la	x3, 0x10060000

	# +8 is output enable
	# +C is output value

	addi	x4, x3, 8
	addi	x5, x3, 0xC

	# write initial value of 0xFF to GPO
	sw	x2, 0x0(x5)
	# enable output
	sw	x2, 0x0(x4)

	# before jumping to led loop
	# lets try writting to dram.

	li	x21, 0
	li	x23, 4096*16    # 64KB of data

	li	x22, 0x80000000
	li	x24, 0

write_loop:
	add	x25, x22, x24
	sw	x24, 0(x25)
	addi	x24, x24, 4
	blt	x24, x23, write_loop

	li	x24, 0
read_loop:
	add	x25, x22, x24
	lw	x21, 0(x25)

	# check value
	bne	x21, x24, fail_loop

	addi	x24, x24, 4
	
	#
	blt	x24, x23, read_loop

	

loop:

	# delay
	li	x20, PERIOD
delay1:	
	addi	x20, x20, -1
	bge	x20, x0, delay1

	# new GPO
	addi	x2, x2, 1
	sw	x2, 0x0(x5)

	j	loop


fail_loop:

	# delay
	li	x20, PERIOD/20
fail_delay1:	
	addi	x20, x20, -1
	bge	x20, x0, fail_delay1

	# clear GPO
	sw	x0, 0x0(x5)

	# delay
	li	x20, PERIOD/20
fail_delay2:	
	addi	x20, x20, -1
	bge	x20, x0, fail_delay2

	# write GPO
	sw	x2, 0x0(x5)

	j	fail_loop