TITLE "mp3.a by Douglas Jones, more optimized" USE "hawk.h" USE "stdio.h" S MAIN INT MAIN COMMON ADDCOUNT,4 ; global count of adds done by trib ; register usage in main program: ; activation record structure ;RETAD = 0 ; the return address ARSIZE = 4 MAIN: ; uses R8 -- count, controls loop iteration STORES R1,R2 ADDSI R2,ARSIZE ; -- receiving sequence LIS R8,0 ; count = 0 LOOP: ; for (;;) { -- loop exit in mid loop LIL R1,ADDCOUNT STORES R0,R1 ; addcount = 0 MOVE R3,R8 ; -- parameter count JSR R1,TRIBONACCI ; temp = tribonacci( count ) ; -- parameter temp LIS R4,1 ; -- parameter width LIL R1,PUTDECU JSRS R1,R1 ; putdecu( temp, 1 ) LIS R3,':' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( ':' ) LIL R1,ADDCOUNT LOADS R3,R1 ; -- parameter addcount LIS R4,1 ; -- parameter width LIL R1,PUTDECU JSRS R1,R1 ; putdecu( addcount, 1 ) ADDSI R8,1 ; count = count + 1 CMPI R8,15 BGE QUIT ; if (count >= 15) break; LIS R3,',' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( ',' ) BR LOOP QUIT: ; } ADDSI R2,-ARSIZE LOADS PC,R2 ; return ; activation record format for the TRIBONACCI function ;RETAD = 0 ; the return address VALUE = 4 ; the saved parameter i TRIB1 = 8 ; tribonacci(value-1) TRIB2 = 12 ; tribonacci(value-2) ARSIZE = 16 TRIBONACCI: ; expects R3 -- i, an unsigned integer ; returns R3 -- trib(i), the ith tribonacci number STORES R1,R2 ; -- save the return address ADDI R2,R2,ARSIZE ; -- optimized stack CMPI R3,2 ; -- note value = i is in R3 BGTU TRBELSE ; if (value <= 2) { -- basis case TESTR R3 BEQ TRBENDF ; if (value != 0) { ADDSI R3,-1 ; value = value - 1 ; } BR TRBENDF ; -- note, value is in R3 TRBELSE: ; } else { -- recursive case STORE R3,R2,VALUE-ARSIZE ; value = i ; -- note, value is in R3 ADDSI R3,-1 ; -- parameter value - 1 JSR R1,TRIBONACCI ; -- call tribonacci STORE R3,R2,TRIB1-ARSIZE ; trib1 = tribonacci( value - 1 ) LOAD R3,R2,VALUE-ARSIZE ADDSI R3,-2 ; -- parameter value - 2 JSR R1,TRIBONACCI ; -- call tribonacci STORE R3,R2,TRIB2-ARSIZE ; trib2 = tribonacci( value - 2 ) LOAD R3,R2,VALUE-ARSIZE ADDSI R3,-3 ; -- parameter value - 3 JSR R1,TRIBONACCI ; trib3 = tribonacci( value - 3 ) LIL R1,ADDCOUNT LOADS R4,R1 ; -- note R3 holds trib3 here ADDSI R4,2 STORES R4,R1 ; addcount = addcount + 2 LOAD R4,R2,TRIB2-ARSIZE ; -- get trib2 ADD R3,R3,R4 ; -- add trib2 + trib3 LOAD R4,R2,TRIB1-ARSIZE ; -- get trib1 ADD R3,R3,R4 ; value = trib1 + (trib2 + trib3) TRBENDF: ; } ; -- return value is already in R3 ADDI R2,R2,-ARSIZE ; -- optimized stack LOADS PC,R2 ; return value END