# SEQ0
	.section	.config_BFC0FFFC, code, keep, address(0xBFC0FFFC)
	.type	__config_BFC0FFFC, @object
	.size	__config_BFC0FFFC, 4
__config_BFC0FFFC:
	.word	0xFFFFFFFF
	# DEVCP0
	.section	.config_BFC0FFDC, code, keep, address(0xBFC0FFDC)
	.type	__config_BFC0FFDC, @object
	.size	__config_BFC0FFDC, 4
__config_BFC0FFDC:
	.word	0xFFFFFFFF
	# DEVCFG0
	.section	.config_BFC0FFCC, code, keep, address(0xBFC0FFCC)
	.type	__config_BFC0FFCC, @object
	.size	__config_BFC0FFCC, 4
__config_BFC0FFCC:
	.word	0xFFFFFFDB
	# DEVCFG1
	.section	.config_BFC0FFC8, code, keep, address(0xBFC0FFC8)
	.type	__config_BFC0FFC8, @object
	.size	__config_BFC0FFC8, 4
__config_BFC0FFC8:
	.word	0x5F74FF39
	# DEVCFG2
	.section	.config_BFC0FFC4, code, keep, address(0xBFC0FFC4)
	.type	__config_BFC0FFC4, @object
	.size	__config_BFC0FFC4, 4
__config_BFC0FFC4:
	.word	0x7FF9B198 # SPLL is 8MHz (FRC) / 1 * 50 / 2 = 200MHz
	# DEVCFG3
	.section	.config_BFC0FFC0, code, keep, address(0xBFC0FFC0)
	.type	__config_BFC0FFC0, @object
	.size	__config_BFC0FFC0, 4
__config_BFC0FFC0:
	.word	0xBFFFFFFF

	.section	.sdata,data
	.type	string, @object
string:
	.ascii	"Hello, world!\0"
	.size	string, .-string

	.section	.text,code
	.align	2

	.set	nomips16
	.set	nomicromips
	.set	noreorder
	.set	nomacro

	.globl	main
	.ent	main
	.type	main, @function
main:
	# Unlock
	di	$2
	ehb
	lui	$2,%hi(SYSKEY)
	sw	$0,%lo(SYSKEY)($2)
	lui	$3,0xaa99
	ori	$3,0x6655
	sw	$3,%lo(SYSKEY)($2)
	lui	$3,0x5566
	ori	$3,0x99aa
	sw	$3,%lo(SYSKEY)($2)
	# PB7DIV := 0x00008800 (CPU clock: enable; SPLL / 1 = 200MHz)
	lui	$2,%hi(PB7DIV)
	xor	$3,$3
	ori	$3,0x8800
	sw	$3,%lo(PB7DIV)($2)
	# PB2DIV := 0x00008818 (UART clock: enable; SPLL / 25 = 8MHz)
	lui	$2,%hi(PB2DIV)
	xor	$3,$3
	ori	$3,0x8818
	sw	$3,%lo(PB2DIV)($2)
	# Lock
	lui	$2,%hi(SYSKEY)
	sw	$0,%lo(SYSKEY)($2)
	ei	$2
	ehb

	# TRISB := 0
	lui	$2,%hi(TRISB)
	sw	$0,%lo(TRISB)($2)

	# Remappable pins
	# RPG7 is U1TX
	xor	$3,$3
	ori	$3,1
	lui	$2,%hi(RPG7R)
	sw	$3,%lo(RPG7R)($2)
	# RPG8 is U1RX
	lui	$2,%hi(U1RXR)
	sw	$3,%lo(U1RXR)($2)
	# TRISG
	xor	$3,$3
	ori	$3,0xfff7
	lui	$2,%hi(TRISG)
	sw	$3,%lo(TRISG)($2)

	# UART
	xor	$3,$3
	ori	$3,0x1400
	lui	$2,%hi(U1STA)
	sw	$3,%lo(U1STA)($2)
	# BRG := 0; with 8MHz peripheral clock gives baud rate 500000
	xor	$3,$3
	lui	$2,%hi(U1BRG)
	sw	$3,%lo(U1BRG)($2)
	xor	$3,$3
	ori	$3,0x8000
	lui	$2,%hi(U1MODE)
	sw	$3,%lo(U1MODE)($2)

	# Prepare main loop
	lui	$10,%hi(LATB)
	lui	$11,%hi(U1STA)
	lui	$12,%hi(U1TXREG)
	lui	$13,%hi(string)
	ori	$13,%lo(string)
	# Main loop
main_loop:
	# Toggle LED at LATB.B15
	lw	$4,%lo(LATB)($10)
	andi	$6,$4,0x8000
	andi	$4,$4,0x7fff
	xori	$6,0x8000
	or	$4,$4,$6
	sh	$4,%lo(LATB)($10)

	# Wait for UART buffer to empty
	lw	$4,%lo(U1STA)($11)
main_loop_tx_buffer_full:
	andi	$4,$4,0x200 # UTXBF
	bne	$4,$0,main_loop_tx_buffer_full
	lw	$4,%lo(U1STA)($11)

	# Write one character of the string to U1TXREG
	lb	$4,($13)
	bne	$4,$0,main_loop_no_end_of_string
	addi	$13,1
	lui	$13,%hi(string)
	ori	$13,%lo(string)
	li	$4,10 # \n
main_loop_no_end_of_string:
	sw	$4,%lo(U1TXREG)($12)

	# Busy wait delay loop
	lui	$2,0xff
	ori	$5,0xffff
main_loop_delay:
	bne	$2,$0,main_loop_delay
	addiu	$2,-1
	j	main_loop
	nop

	.end	main
	.size	main, .-main