TITLE "times.a, output some products" USE "hawk.h" USE "stdio.h" USE "ascii.h" SUBTITLE "MAIN -- output multiplication table" INT MAIN S MAIN ; activation record for MAIN ;RETAD = 0 ARSIZE = 4 MAIN: ; uses R8,R9 for i, j -- loop counters STORES R1,R2 ADDSI R2,ARSIZE LIS R8,0 ; i = 0 -- row number in table MANLP1: ; do { -- for each row LIS R9,0 ; j = 0 -- column number in table MANLP2: ; do { -- for each column MOVE R3,R8 ; -- parameter i MOVE R4,R9 ; -- parameter j JSR R1,TIMES ; temp = i * j ; -- parameter temp LIS R4,5 ; -- parameter 5 LIL R1,PUTDEC JSRS R1,R1 ; putdec( temp, 5 ) ADDI R9,R9,10 ; j = j + 10 CMPI R9,100 BLTU MANLP2 ; } while (j < 100) LIS R3,LF ; -- parameter LF LIL R1,PUTCHAR JSRS R1,R1 ; putchar( LF ) ADDI R8,R8,10 ; i = i + 10 CMPI R8,100 BLTU MANLP1 ; } while (i < 100) ADDSI R2,-ARSIZE LOADS PC,R2 ; return SUBTITLE "TIMES -- multiply" ; does not use an activation record TIMES: ; expects R3 = ier -- the multiplier ; R4 = cand -- the multiplicand ; returns R3 = prod -- the product of ier, icand ; uses R5 = ier -- copy of multiplier MOVE R5,R3 ; -- move ier LIS R3,0 ; prod = 0 TIMLP: ; do { TESTR R5 BEQ TIMLX ; if (ier = 0) break SRU R5,1 ; ier = ier >> 1 BCR TIMEIF ; if (ier was odd) { ; -- add partial product ADD R3,R3,R4 ; prod = prod + cand TIMEIF: ; } SL R4,1 ; cand = cand << 1 BR TIMLP TIMLX: ; } until break JSRS R1,R1 ; return prod END