Public feed #890987

Untitled

public text v1 · immutable
Raw Edit
·published 2008-02-04 06:43 UTC
rendered paste body
register map
{
t0 M
t1 Q (Q in high)	(QQQQ QQQQ  QQQQ QQQQ   (b0)000 0000  0000 0000 b)
t2 A (A in high)	(AAAA AAAA  AAAA AAAA   0000 0000  0000 0000 b)
t3 B1
t4 B0
t5 C (counter)
t6 TEMP
t7 1
t8 0
}

start
{
//t7 = constant 1
	or	t7,t7, 1
	and	t7,t7, 1
//t8 = constant 0
	and	t8,t8, 0

//INPUT: t5	C	counter	(16)
	lh	t5, C

//INPUT: t0	M	multiplicand
	lh	t0, M

//INPUT: t1	Q	(multiplier) (in high)
	lh	t1, Q
	sll	t1,t1, 16

//INPUT: t2	A	(zero) (in high)
	lh	t2, A
	sll	t2,t2, 16
	
	j booth_mult[test]
}

booth_mult
{

	test
	{
	//checks b1 b0
	//b1 is t1 bit 16 (Q bit 0)
	//b0 is t1 bit 15
	//	case 00,11	-> shift
	//	case 10		-> substract && shift
	//	case 01		-> add && shift
		and t3,t1 1   0000 0000  0000 0000 b
		srl t3,t3, 16	//t3 = b1
		
		and t4,t1, 1000 0000  0000 0000 b
		srl t4,t4, 15	//t4 = b0
		
		beq t3,t4, shiftstep	//jumps if (00 or 11)
		beq t3,t7, step1minus	//jumps if 10
		j step1plus				//jumps if 01
	}
	
	step1minus
	{
	//A = t2 high
	//M = t0
	//new A = A - M
		srl t6,t2, 16	//temp = A
		sub t6,t6,t0	//temp = temp - M
		sll t2,t6, 16	//A = temp
		j shiftstep
	}
	
	step1plus
	{
	//A = t2 high
	//M = t0
	//new A = A + M
		srl t6,t2, 16	//temp = A
		add t6,t6,t0	//temp = temp + M
		sll t2,t6, 16	//A = temp
		j shiftstep
	}
	
	shiftstep
	{
	//treat A,Q,b0 as 1 reg and arithmeticshift it
	sra t2,t2, 1	//arithm. shift A
					//since A is in high , bit 15 is carrity
	and t6,t2, 1000 0000  0000 0000 b	//bit 15 of temp = carrity
	srl t6,t6, 15	//bit 0 of temp = carrity
	and t2,t2, 1111 1111  1111 1111   0000 0000  0000 0000 b	//tidy A(t2) reset carrity
	
	srl t1,t1, 1	//shift Q
					//bit 15 of Q(t1) = carrity
					//= new value of b0
	sll t6,t6, 31	//temp LSB shifts into temp MSB = carrity
	or t1,t1,t6		//propagate carrity A -> Q
	
	sub t5,t5,t7	//counter(t5) = counter - 1
	bne t5,t8, test	//counter > 0 -> test
	j finished	//... else -> finished
	}
	
	finished
	{
	//halt / nop
	}
	
}