TITLE "mp3.a by Douglas Jones, less optimized" USE "hawk.h" USE "stdio.h" S MAIN INT MAIN COMMON ADDCOUNT,4 ; global count of adds done by trib ; R8: count -- controls loop iteration ; activation record structure RETAD = 0 ; the return address ARSIZE = 4 MAIN: ; uses R8 -- count, controls loop iteration STORE R1,R2,RETAD ADDSI R2,ARSIZE ; -- receiving sequence LIS R8,0 ; count = 0 LOOP: ; for (;;) { -- loop exit is 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 LOAD PC,R2,RETAD ; return ; activation record format for the TRIBONACCI function RETAD = 0 ; the return address VALUE = 4 ; the parameter and later return value TRIB1 = 8 ; tribonacci(value-1) TRIB2 = 12 ; tribonacci(value-2) TRIB3 = 16 ; tribonacci(value-3) ARSIZE = 20 TRIBONACCI: ; expects R3 -- i, an unsigned integer ; returns R3 -- trib(i), the ith tribonacci number STORE R1,R2,RETAD ; -- save the return address STORE R3,R2,VALUE ; value = i LOAD R3,R2,VALUE CMPI R3,2 BGTU TRBELSE ; if (value <= 2) { -- basis case TESTR R3 BEQ TRBEIF1 ; if (value != 0) { ADDSI R3,-1 STORE R3,R2,VALUE ; value = value - 1; TRBEIF1: ; } BR TRBENDF ; TRBELSE: ; } else { -- recursive case LOAD R3,R2,VALUE ADDSI R3,-1 ; -- parameter value - 1 ADDI R2,R2,ARSIZE JSR R1,TRIBONACCI ; -- call tribonacci ADDI R2,R2,-ARSIZE STORE R3,R2,TRIB1 ; trib1 = tribonacci( value - 1 ) LOAD R3,R2,VALUE ADDSI R3,-2 ; -- parameter value - 2 ADDI R2,R2,ARSIZE JSR R1,TRIBONACCI ; -- call tribonacci ADDI R2,R2,-ARSIZE STORE R3,R2,TRIB2 ; trib2 = tribonacci( value - 2 ) LOAD R3,R2,VALUE ADDSI R3,-3 ; -- parameter value - 3 ADDI R2,R2,ARSIZE JSR R1,TRIBONACCI ; -- call tribonacci ADDI R2,R2,-ARSIZE STORE R3,R2,TRIB3 ; trib3 = tribonacci( value - 3 ) LIL R1,ADDCOUNT LOADS R3,R1 ADDSI R3,2 STORES R3,R1 ; addcount = addcount + 2 LOAD R3,R2,TRIB3 ; trib3 = tribonacci( value - 3 ) LOAD R4,R2,TRIB2 ; -- get trib2 LOAD R5,R2,TRIB1 ; -- get trib1 ADD R3,R3,R4 ADD R3,R3,R5 STORE R3,R2,VALUE ; value = trib1 + trib2 + trib3 TRBENDF: ; } LOAD R3,R2,VALUE LOAD PC,R2,RETAD ; return value END