#The C++ Program
#
#/*-----------------------------------------------------------------------
#
#	Assignment #1
#	
#	Program to convert numbers from one radix to another
#	
#
#					Ashish Gupta
#					98131
#					CS212	
#					Group 3
#-------------------------------------------------------------------------*/
#
#
##include <iostream.h>
##include <process.h>
##include <stdio.h>
#
#void Print_Error();
#
#void main()
#{
#
#int r1,r2;
#char n1[34],n2[34];
#long middleman=0;
#
#//______________Get user input___________________
#cout << endl << endl <<"Please enter r1 :";
#cin >> r1;
#if(r1<2 || r1>36) Print_Error();

#cout << endl << "Plese enter r2 :";
#cin >> r2;
#if(r2<2 || r2>36) Print_Error();
#
#cout << endl <<  "Please enter the number : ";
#gets(n1);
#cout << endl;
#
#//____________Converts number from r1 to binary ( middleman )_____
#int i=0,j;
#while(n1[i])
#{
#	j=-1;
#	if(n1[i]>=48 && n1[i]<=57) j=n1[i]-48;
#	else if(n1[i]>=65 && n1[i]<=90) j=n1[i]-65+10;
#	else if(j<0 || j>=r1)
#	{
#		cout << endl << "Error ";
#		exit(0);
#	}
#	middleman*=r1;
#	middleman+=j;
#	i++;
#}
#
#//__________Convert middleman to base r2_______________
#i=33;
#n2[i]=0;
#i--;
#do
#{
#	j=middleman % r2;
#
#	if(j<10) n2[i]=j+48;
#	else n2[i]=j-10+65;
#	i--;
#} while(middleman/=r2);
#n2[i]=0;
#
#//___________________Print the result__________________
#cout << "Answer is : " << &n2[i+1];
#
#}
#
#void Print_Error()
#{
#	cout << endl << "Error ";
#	exit(0);
#}
#
#______________END OF C++ PROGRAM____________


#______________START OF ASSEMBLY PROGRAM_____
.data

n1:
.ascii "this is a buffer                                    "
n2:
.ascii "this is a buffer                                    "

blank:
.byte 10,0

m1:
.asciiz "Please Enter the Radix 1: "

m2:
.asciiz "Please Enter the Radix 2: "

m3:
.asciiz "Please Enter the number in Radix 1: "

m4:
.asciiz "The answer is : "

m5:
.asciiz "Want to convert another number (y/n) ?"

m6:
.asciiz "Thank you for using this program :-)"


error_message:
.asciiz "Error in Input !!"

w1:
.asciiz "Welcome to the Radix Converter Program"

w2:
.asciiz "**************************************"

#_________________START OF CODE______________

.text
main:

	#___________Load addresses____________
	addi $s5,$zero,0;
	la $s2,n1;
	la $s3,n2;


	#_____________Print Welcome Message______________
	jal print_blank

	jal print_blank
	la $a0,w2
	jal print_string


	jal print_blank
	la $a0,w1
	jal print_string

	jal print_blank
	la $a0,w2
	jal print_string
	
	jal print_blank
	jal print_blank


	#____________Start taking Input_____________

	# _______________read r1

	la $a0,m1
	jal print_string

	li $v0,5
	syscall
	move $s0,$v0

	move $a0,$s0
	jal check_for_radix


	# _______________read r2
	la $a0,m2
	jal print_string

	li $v0,5
	syscall
	move $s1,$v0

	move $a0,$s1
	jal check_for_radix



	# _______________read n1
	la $a0,m3
	jal print_string

	li $v0,8
	move $a0,$s2
	li $a1,32
	syscall

	# _________call rtob______
	move $a0,$s0
	move $a1,$s2
	jal rtob

	move $s5,$v0


	jal print_blank

	# _________call btor______
	move $a0,$s5
	move $a1,$s3
	move $a2,$s1
	jal btor


	#___________Print the answer___________
	jal print_blank
	la $a0,m4
	jal print_string

	
	#_______print the string
	move $a0,$v0
	li $v0,4
	syscall


LOOP_AGAIN:
#________________Loop Again________________

	#______Print Message______
	jal print_blank
	


	jal print_blank
	la $a0,m5
	jal print_string


	# _______________read n1
	li $v0,8
	move $a0,$s2
	li $a1,2
	syscall

	
	#__________Check for y/Y__________
	lb $t6,0($s2)

	addi $t7,$zero,89
	beq $t6,$t7, START

	
	addi $t7,$zero,121
	beq $t6,$t7, START

	la $a0,m1
	li $v0,5
	syscall
	
	j EXIT
	
START: 	
	la $a0,m1
	li $v0,5
	syscall

	j main

		
EXIT:


	#____________Exit________________


	#______Print Goodbye Message______
	jal print_blank

	jal print_blank
	la $a0,w2
	jal print_string

	jal print_blank
	la $a0,m6
	jal print_string

	jal print_blank
	la $a0,w2
	jal print_string

	li $v0,10 	 #______Sycall for exit
	syscall

#___________________________________________________________
#____________Start of rtob_________________________________




rtob:

	move $t2,$zero	#______i=0___

	addi $t3,$zero,10  #_______t3=10____
	move $v0,$zero  #_________middleman=0

L1:
	lb $t2,0($a1)  #_______t2=int(each character)

	beq $t2,$t3,L5  #____if(n1[i]==10) end proc
	beqz $t2,L5

	addi $t1,$zero,-1     #______j=-1


         #_________if(n1[i]>=48 && n1[i]<=57) j=n1[i]-48;
	addi $t7,$zero,48
	blt $t2,$t7,L2
	addi $t7,$zero,57
	bgt $t2,$t7,L2


	addi $t1,$t2,-48;

	j L3

L2:	#_________if(n1[i]>=65 && n1[i]<=90) j=n1[i]-55;
	addi $t7,$zero,65
	blt $t2,$t7,L2_1
	addi $t7,$zero,90
	bgt $t2,$t7,L2_1


	addi $t1,$t2,-55;


	j L3

L2_1:	#_________if(n1[i]>=97 && n1[i]<=122) j=n1[i]-87;
	addi $t7,$zero,97
	blt $t2,$t7,L3
	addi $t7,$zero,122
	bgt $t2,$t7,L3


	addi $t1,$t2,-87;


	j L3


L3:  	
         #________if(j<0 || j>=r1)
	bltz $t1, T1
	bge $t1,$a0,T1
	
	j L4

	
T1:	#___________Error handler for invalid input_________

	#____________Print Error Message_______	
	jal print_blank
	la $a0,w2
	jal print_string

	jal print_blank
	la $a0,error_message
	jal print_string

	jal print_blank
	la $a0,w2
	jal print_string

	j LOOP_AGAIN


L4:
	mul $v0,$v0,$a0  #______middleman*=r1;
	add $v0,$v0,$t1   #______middleman+=j;

	addi $a1,$a1,1    #____    i++;

	j L1   #________go back to while loop


L5:
	jr $ra


#___________________________________________________________
#____________Start of btor_________________________________

btor:
	
	addi $a1,$a1,32     #___________i=i+20
	
	move $t7,$zero 
	sb $t7,0($a1)       #________________n2[i]=0
	addi $a1,$a1,-1;    #___________i--___________



L6:
	rem $t1,$a0,$a2      #________  j=middleman % r2;

	#___________if(j<10) n2[i]=j+48;_______
	addi $t7,$zero,10	
	bge $t1,$t7,L7

	addi $t7,$t1,48
	sb $t7,0($a1)

	j L8


	#__________else n2[i]=j-10+65;
L7:

	addi $t7,$t1,55
	sb $t7,0($a1)
	

L8:
	addi $a1,$a1,-1  #____________i--;

	div $a0,$a0,$a2
	bnez $a0,L6    #_________ while(middleman/=r2);

#____________return

	addi $a1,$a1,1
	move $v0,$a1
	jr $ra	



print_blank:  	#______________Moves to the next line___________
	
	move $t0,$a0
	move $t1,$v0
	
	la $a0,blank
	li $v0,4
	syscall

	move $a0,$t0
	move $v0,$t1

	jr $ra


#___________Prints a string_______________
#___________address in $a0_____________
print_string:
	

	addi $sp,$sp,-4
	sw $v0,0($sp)
	

	
	li $v0,4
	syscall

	lw $v0,0($sp)
	addi $sp,$sp,4	
	

	jr $ra


#______________Check for validity of Radix values ( 1 < r < 37 )
check_for_radix:

	addi $t7,$zero,2
	blt $a0,$t7,T1


	addi $t7,$zero,36
	bgt $a0,$t7,T1
		
	jr $ra
	
	
	
#____________________FINISHED__________________





