	;; 
	;; Author: Bill Slough
	;;
	;; Determines the length of a string, then reverses and displays it.

	.ORIG x3000 

	;; Determine the length of the string X
	LEA	R0,X		; R0 = addr(X)
	AND	R1,R1,#0	; i = 0
LOOP	ADD	R2,R0,R1	; while (X[i] != '\0')
	LDR	R3,R2,#0	;
	BRz	ELOOP		;
	ADD	R1,R1,#1	;	i = i + 1
	BR	LOOP		;
ELOOP				; end while
	ST	R1,N		; N = length(X)

	;; Now reverse the string X
	AND	R0,R0,#0	; low = 0
	
	LD	R1,N
	ADD	R1,R1,#-1	; high = N - 1
	
LOOP2	NOT	R2,R1		; while (low < high)
	ADD	R2,R2,#1	;
	ADD	R2,R0,R2	;
	BRzp	ELOOP2		;

	LEA	R2,X		;
	ADD	R2,R2,R0	;	R2 = addr(X[low])

	LEA	R3,X		;
	ADD	R3,R3,R1	;	R3 = addr(X[high])

	LDR	R4,R2,#0	;	low_char = X[low]
	LDR	R5,R3,#0	;	high_char = X[high]

	STR	R4,R3,#0	;	X[high] = low_char
	STR	R5,R2,#0	;	X[low] = high_char

	ADD	R0,R0,#1	;	low++
	ADD	R1,R1,#-1	;	high--
	BR	LOOP2		; 
ELOOP2				; end while
	LEA	R0,X
	PUTS			; write(X)
STOP	HALT			;
N	.BLKW		1        	
X	.STRINGZ	"Math 3670 is fun!"
	.END
