!--------------------------------------
! hellorw.S
! Low-Level I/O
! Function Return Values
!--------------------------------------

#define STDIN 0
#define STDOUT 1

#define PROMPT_LENGTH 20
#define GREETING_LENGTH 6
#define MAX_NAME_LENGTH 100
#define PERIOD_NEWLINE_LENGTH 2

!--------------------------------------

.section ".rodata"

pcPrompt:
	.asciz "What is your name?  "

pcGreeting:
	.asciz "Hello "

pcPeriodNewline:
	.asciz	".\n"

!--------------------------------------

.section ".data"

!--------------------------------------

.section ".bss"

pcName:
	.skip MAX_NAME_LENGTH

	.align 4
piNameLength:
	.skip 4

!--------------------------------------

.section ".text"

	.align 4
	.global main

main:

	save	%sp, -96, %sp

	! write(STDOUT, "What is your name?  ", PROMPT_LENGTH);
	mov	STDOUT, %o0
	set	pcPrompt, %o1
	mov	PROMPT_LENGTH, %o2
	call	write
	nop

	! iNameLength = read(STDIN, pcName, MAX_NAME_LENGTH);
	mov	STDIN, %o0
	set	pcName, %o1
	mov	MAX_NAME_LENGTH, %o2
	call	read
	nop
	set	piNameLength, %l0
	st 	%o0, [%l0]

	! write(STDOUT, "Hello ", GREETING_LENGTH);
	mov	STDOUT, %o0
	set	pcGreeting, %o1
	mov	GREETING_LENGTH, %o2
	call	write
	nop

	!  write(STDOUT, pcName, iNameLength - 1);
	mov	STDOUT, %o0
	set	pcName, %o1
	set	piNameLength, %o2
	ld 	[%o2], %o2
	dec	%o2
	call	write
	nop

	! write(STDOUT, ".\n", PERIOD_NEWLINE_LENGTH);
	mov	STDOUT, %o0
	set	pcPeriodNewline, %o1
	mov	PERIOD_NEWLINE_LENGTH, %o2
	call	write
	nop
	
	! return 0;
	mov	0, %i0
	ret
	restore

