		.file	"startup.S"
	
		.section .rodata
		.data
argv0:		.asciz		"\"This-MIPS-program\""
argv:		.word		argv0	

		.text
		.section .start, "ax"
		.extern _init
		.extern dbg_init
		.extern _exc_vect_start
		.extern _xcpt_handler
		.align	2
		.globl _start
_start:
		.set	noreorder
		j	init
		nop		
		.set	reorder

		.text
		.set	noreorder
init:
		# Set stack pointer 
		la $sp, stack_ptr
		# Set global pointer 
		la $gp, _gp

		# zero bss
		la $8, __bss_start
		la $9, _end
$zeroise:		
		sw $0, 0($8)
		bne $8, $9, $zeroise
		addiu	$8, 4

		# Install exception vector jump code
		la $t1, _exc_vect_copy_start
		la $t2, _exc_vect_copy_end
		la $t0, _exc_vect_start

$install:	lw	$v0, 0($t1)
		addiu	$t1, 4
		sw	$v0, 0($t0)
		bne	$t1, $t2, $install
		addiu	$t0, 4
		
		# Call _init
		la $k0, _init
		jalr $k0
		nop
		
		# Call dbg_init
		la $k0, dbg_init
		jalr $k0
		nop

		# Set user-mode
		mfc0	$a0, $12
		li	$a1, 3
		or	$a0, $a1
		mtc0	$a0, $12
		
		# Set environment
		li	$a0, 1
		la	$a1, argv

		# Call main
		la $k0, main
		jalr $k0
		nop

		# Terminate after main returns
_terminate:	
		nop
		la $t0, exit
		jalr $t0
		move $a0, $v0

_exc_vect_copy_start:
		la $k0, _xcpt_handler
		jr $k0
		nop
_exc_vect_copy_end:
		
		.set	reorder
