// Equates for assignments struct
assignment_one = 0	// offset from base array of assignments struct
assignment_two = 4	// offset from base array of assignments struct
assignment_three = 8	// offset from base array of assignments struct
assignment_four = 12	// offset from base array of assignments struct
assignment_five = 16	// offset from base array of assignments struct

// Equates for final_grade
final_grade_assignments = 0	// offset from base array of final_grade struct
final_grade_midterm = 20	// assignments struct is 20 bytes, so next variable starts at offset 20
final_grade_final = 24
final_grade_size = 28		// 20 bytes for assignments, 4 bytes for midterm, 4 bytes for final, total is 28 bytes


// Equates for main()
grade_size = final_grade_size
alloc = -(16 + grade_size) & -16
dealloc = -alloc
grade_s = 16

	// printf format strings
fmtgrades: .string	"[FINAL GRADES // CPSC 355]\nASSIGNMENTS\n\tAssignment 1: %d\n\tAssignment 2: %d\n\tAssignment 3: %d\n\tAssignment 4: %d\n\tAssignment 5: %d\nMIDTERM: %d\nFINAL EXAM: %d\n"


	.balign 4
	.global main
main: 	stp x29, x30, [sp, alloc]!
	mov x29, sp

init:	// Initialize a final_grade struct
	str	wzr, [x29, grade_s + final_grade_assignments + assignment_one]
	str	wzr, [x29, grade_s + final_grade_assignments + assignment_two]
	str	wzr, [x29, grade_s + final_grade_assignments + assignment_three]
	str	wzr, [x29, grade_s + final_grade_assignments + assignment_four]
	str	wzr, [x29, grade_s + final_grade_assignments + assignment_five]

	str	wzr, [x29, grade_s + final_grade_midterm]
	str	wzr, [x29, grade_s + final_grade_final]

update:	// Update the grades with some numbers
	mov	w19, 100
	str	w19, [x29, grade_s + final_grade_assignments + assignment_one]
	mov	w19, 95
	str	w19, [x29, grade_s + final_grade_assignments + assignment_two]
	mov	w19, 96
	str	w19, [x29, grade_s + final_grade_assignments + assignment_three]
	mov	w19, 100
	str	w19, [x29, grade_s + final_grade_assignments + assignment_four]
	mov	w19, 100
	str	w19, [x29, grade_s + final_grade_assignments + assignment_five]

	mov	w19, 90
	str	w19, [x29, grade_s + final_grade_midterm]
	mov	w19, 95
	str	w19, [x29, grade_s + final_grade_final]

print:	// Load the grades and print them
	adrp	x0, fmtgrades
	add	x0, x0, :lo12:fmtgrades

	ldr	w1, [x29, grade_s + final_grade_assignments + assignment_one]
	ldr	w2, [x29, grade_s + final_grade_assignments + assignment_two]
	ldr	w3, [x29, grade_s + final_grade_assignments + assignment_three]
	ldr	w4, [x29, grade_s + final_grade_assignments + assignment_four]
	ldr	w5, [x29, grade_s + final_grade_assignments + assignment_five]

	ldr	w6, [x29, grade_s + final_grade_midterm]
	ldr	w7, [x29, grade_s + final_grade_final]

	bl printf

done:	mov w0, 0

	ldp x29, x30, [sp], dealloc
	ret
