*================================================================ * FILE: factorial.asm * DESCRIPTION: Factorial test program for the URISC processor model. * As Multiply iterative adds are used * Register use: * r[0] = iport * r[1] = -1 * r[2-5] = temp * r[6] = fac * r[8] = k counter for multiplier * r[9] = loop counter * r[15] = oport *================================================================ .global _EXIT .text ********* dst-=src, PC=? ********* Initialize the fn values L00: URISC r[6], r[6], +1 * r[6]=0 URISC r[6], r[1], +1 * fac=1 URISC r[9], r[9], +1 * loop-counter=0 *********** Load the iport value in r[4] L01: URISC r[3], r[3], +1 * r[3]=0 URISC r[3], r[0], +1 * r[3]=-iport URISC r[3], r[1], +1 * iport-- URISC r[4], r[4], +1 * r[4]=0 URISC r[4], r[3], +1 * r[4]= iport ************* inc iport for loop test LISA 2007 iport=0 default; remove for product version ************* URISC r[4], r[1], +1 * r[4]++ URISC r[9], r[1], +1 * loop-counter+=1 URISC r[4], r[9], @L03 * done if iport= l => done URISC r[4], r[8], @L01 * done if l < k URISC r[6], r[2], +1 * r[6] += -(-fac) URISC r[8], r[1], +1 * k=k+1 *********** Do one more iteration JMP L02 URISC r[3], r[3], +1 * r[2]=0 URISC r[1], r[3], @L02 * -1+0 always < 0 *********** Move fac to outport L03: URISC r[2], r[2], +1 * r[2]=0 URISC r[2], r[6], +1 * r[2]=-fac URISC r[15], r[15], +1 * oport=0 URISC r[15], r[2], +1 * oport=fac *********** JMP L00 URISC r[2], r[2], +1 * r[2]=0 URISC r[1], r[2], @L00 * -1+0 always < 0 ********** Add a few NOPs URISC r[0], r[0], +1 URISC r[0], r[0], +1 URISC r[0], r[0], +1 .end