;*********** WINDLX Ex.1: Read a positive integer number *************
;*********** (c) 1991 Günther Raidl			 *************
;*********** Modified 1992 Maziar Khosravipour		 *************

;-----------------------------------------------------------------------------
;Subprogram call by symbol "InputUnsigned"
;expect the address of a zero-terminated prompt string in R1
;returns the read value in R1
;changes the contents of registers R1,R13,R14
;-----------------------------------------------------------------------------

		.data

		;*** Data for Read-Trap
ReadBuffer:	.space		80
ReadPar:	.word		0,ReadBuffer,80

		;*** Data for Printf-Trap
PrintfPar:	.space		4

SaveR2:		.space		4
SaveR3:		.space		4
SaveR4:		.space		4
SaveR5:		.space		4


		.text

		.global		InputSigned
InputSigned:	
		;*** save register contents
		sw		SaveR2,r2
		sw		SaveR3,r3
		sw		SaveR4,r4
		sw		SaveR5,r5

		;*** Prompt
		sw		PrintfPar,r1
		addi		r14,r0,PrintfPar
		trap		5

		;*** call Trap-3 to read line
		addi		r14,r0,ReadPar
		trap		3

		;*** determine value
		addi		r2,r0,ReadBuffer
		addi		r1,r0,0
		addi		r4,r0,10	;Decimal system

petla:		;*** reads digits to end of line
		lbu		r3,0(r2)	

;odczytujemy jaki znak stoi na 1 miejscu +,-,czy moze liczba bez znaku
		
		
		snei		r5, r3, #45	;jezeli - to do znakminus		
		beqz		r5, minus	
		snei		r5, r3, #43	;i jesli sa rowne to ustawi sie na 0		
		beqz		r5, plus	
		snei		r5,r3,#10	;LF -> Exit jak wczyta entera to zkaonczy wczytywanie tego ciagu
		beqz		r5,Finish
		subi		r3,r3,#48	;´0´
		multu		r1,r1,r4	;Shift decimal
		add			r1,r1,r3
		addi		r2,r2,#1 	;increment pointer
		snei		r5,r3,#10	;LF -> Exit
		beqz		r5,Finish
		j		petla
		

minus:
		addi		r6,r0,#-1		;zaznaczamy że liczba ujemna
		
		addi		r2,r2,#1		;zwiekszamy increment pointer
		j		petla
plus:
		
		addi 		r2,r2,1		;zwiekszamy increment pointer
		j		petla
ujemna:
		addi		r7,r7,#-1	;ladujemy do r7 -1
		mult		r1,r1,r7	;mnożymy r1 razy -1 zeby otrzymac liczbe ujemna
		addi		r6,r0,#0		;zeruje r6
		addi		r7,r0,#0		;zeruje r7
Finish: 	;*** restore old register contents
		bnez		r6,ujemna
		lw		r2,SaveR2
		lw		r3,SaveR3
		lw		r4,SaveR4
		lw		r5,SaveR5
		jr	r31
		

