@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ Program part 0: initial declarations
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.globl _start

.equ RXFE, 0x10
.equ TXFF, 0x20

.equ OFFSET_FR, 0x018
.equ IO_ADDRESS, 0x101f1000

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ Program part 1: definition of main.
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


@main program
_start:        
	mov sp,#0x100000		@ set up stack

	ldr r4,=0x101f1000	
	@ ASCII codes stored at [r4] get printed

main_loop:
	bl get_int
	cmp r0, -999
	beq my_exit

	mov r5, r0
	bl get_int
	mov r6, r0

	mov r0, r5
	mov r1, r6
	bl div
	bl print10
	mov r0, r1
	bl print10
	b main_loop	

my_exit: 			@ print "END" on a new line
	mov r1, #'\r'
	str r1, [r4]		
	mov r1, #'\n'		
	str r1, [r4]		
	mov r1, #'E'		
	str r1, [r4]		
	mov r1, #'N'		
	str r1, [r4]		
	mov r1, #'D'		
	str r1, [r4]

the_end:			@ do infinite loop at the end
	b the_end	

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ Program part 2: definition of functions
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ r0 should be a buffer that can receive the data. 
@ The buffer should have size at least 1000 bytes.
get_int:
	@preamble
	push {r4, r5, r6, r7, lr}
	
	@ main body
	ldr r4, =IO_ADDRESS
	mov r5, #0
	mov r6, #10

	mov r7, #1
	bl get_char
	cmp r0, #'-'
	moveq r7, #-1
	beq get_int_loop
	cmp r0, #'0'
	blt get_int_exit
	cmp r0, #'9'
	bgt get_int_exit
	sub r5, r0, #'0'
	
get_int_loop:
	bl get_char
	cmp r0, #'0'
	blt get_int_exit
	cmp r0, #'9'
	bgt get_int_exit
	
	sub r0, r0, #'0'
	mul r5, r6, r5
	add r5, r5, r0
	
	b get_int_loop
	
get_int_exit:
	mul r0, r5, r7
	mov r5, #13
	str r5, [r4]
	mov r5, #10
	str r5, [r4]
	
	@ wrap-up
	pop {r4, r5, r6, r7, lr}
	bx lr

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

get_char:
	@preamble
	push {r2, r3, r4, lr}

	@ main body
	ldr r4,=IO_ADDRESS		@ r4 := 0x 101f 1000

get_char_wait:
	ldr r2,[r4,#OFFSET_FR]		@ load IO flag register to r2
	and r3,r2,#RXFE			@ mask non receive fifo empty bits
	cmp r3, #0			@ check if r3 == 0
	bne get_char_wait		@ wait if not ready (if r3 != 0)
	
	ldr r0,[r4]
	str r0, [r4]
	
	@ wrap-up
	pop {r2, r3, r4, lr}
	bx lr
	
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ author: Brandon Lawrence
@
@ div: computes result of integer division r0/r1
@
@ results: r0 = r0/r1
@          r1 = r0 mod r1
	
div:
@preamble
	push {r2, r3, r4, r5, r6, r7, r8, lr}

div_main:
	@r0 holds numerator
	@r1 holds denominator

	mov r4, #1
	mov r5, #-1
	
	cmp r1, #0
	moveq r3, #0
	beq div_exit
	mullt r6, r4, r5
	movlt r4, r6
	mullt r6, r1, r5
	movlt r1, r6
	
	cmp r0, #0
	mullt r6, r4, r5
	movlt r4, r6
	mullt r6, r0, r5
	movlt r0, r6
	
	mov r7, r0
	mov r8, r1
	
	mov r3,#0
	mov r2,r1


div_counter:		@sets r2 to the largest multiple
	cmp r2,r0	@of 2 smaller than r0
	lsrgt r2,r2,#1	
	bge div_loop
	lsl r2,r2,#1
	b div_counter

div_loop:		
	cmp r2,r1
	blt div_exit
	
	lsl r3,r3,#1	@r3 stores result
	cmp r0,r2
	subge r0,r0,r2
	addge r3,r3,#1
	
	lsr r2,r2,#1
	b div_loop

div_exit:
	mul r0,r3,r4
	mul r6, r3, r8
	sub r1, r7, r6
	
@wrap-up
	pop {r2, r3, r4, r5, r6, r7, r8, lr}
	bx lr

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

print10:	
	@ print10 preamble
	sub sp, sp, #28
	str lr, [sp, #0]
	str r0, [sp, #4]
	str r1, [sp, #8]
	str r4, [sp, #12]
	str r5, [sp, #16]
	str r6, [sp, #20]
	str r7, [sp, #24]

	@ print10 main body
	ldr r4,=0x101f1000	
	@ ASCII codes stored 
	@ at [r4] get printed

	mov r5, r0
	cmp r5, #0
	movlt r6, #'-'
	strlt r6, [r4]
	movlt r7, #-1
	mullt r0, r5, r7
	
	bl print10_helper

	@ print newline
	mov r5, #13
	str r5, [r4]		
	mov r5, #10		
	str r5, [r4]		

	@ print_number wrap-up
	ldr lr, [sp, #0]
	ldr r0, [sp, #4]
	ldr r1, [sp, #8]
	ldr r4, [sp, #12]
	ldr r5, [sp, #16]
	ldr r6, [sp, #20]
	ldr r7, [sp, #24]

	add sp, sp, #28
	bx lr
	
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

print10_helper:	
	@ print10_helper preamble
	sub sp, sp, #28
	str lr, [sp, #0]
	str r0, [sp, #4]
	str r1, [sp, #8]
	str r4, [sp, #12]
	str r5, [sp, #16]
	str r6, [sp, #20]
	str r7, [sp, #24]

	@ print10_helper main body
	ldr r4,=0x101f1000	
	@ ASCII codes stored 
	@ at [r4] get printed

	cmp r0, #10
	addlt r6, r0, #'0'
	strlt r6, [r4]
	blt print10_helper_exit
	
	mov r1, #10
	bl div
	bl print10_helper
	add r6, r1, #'0'
	str r6, [r4]

print10_helper_exit:
	@ print10_helper wrap-up
	ldr lr, [sp, #0]
	ldr r0, [sp, #4]
	ldr r1, [sp, #8]
	ldr r4, [sp, #12]
	ldr r5, [sp, #16]
	ldr r6, [sp, #20]
	ldr r7, [sp, #24]

	add sp, sp, #28
	bx lr

