TITLE "mp4.a by Douglas Jones, Oct. 20, 2014" ; "based on mp3.a by Douglas Jones, Oct. 5, 2014" ; draws a the largest centered Sierpinski triangle ; that will fit on the plotting area USE "hawk.h" USE "monitor.h" ; Global variables shared by TRIANG and FILL COMMON GLOBAL,GLOBSIZ BUFFER = 0 ; the plotting buffer COLUMNS = 4 ; the plotting buffer ROWS = 8 ; the plotting buffer GLOBSIZ = 12 SUBTITLE "Sierpinski triangle plotter" ; activation record format ;RETAD = 0 H = 4 ; height of the triangle; for order o, h = 2**(o - 1) X = 8 ; x coordinate of left edge Y = 12 ; y coordinate of top edge ARSIZE = 16 TRIANG: ; given: R3 = h -- note, h must be a power of two ; R4 = x ; R5 = y STORES R1,R2 STORE R3,R2,H STORE R4,R2,X STORE R5,R2,Y ADDI R2,R2,ARSIZE ; -- activation record optimized CMPI R3,1 BGT TRIELS ; if (h == 1) { -- simple case ; -- parameter y already in R5 LIL R7,GLOBAL LOAD R4,R7,COLUMNS ; -- parameter columns LIL R1,TIMESU JSRS R1,R1 ; -- get y * columns LOAD R4,R2,X-ARSIZE ADD R3,R3,R4 ; -- get x + (y*columns) LOAD R4,R7,BUFFER ADD R3,R3,R4 ; -- get buffer + x + (y*columns) = buffer[y,x] LIS R4,'_' LOADS R5,R3 STUFFB R5,R4,R3 STORES R5,R3 ; buffer[y,x] = '_' ADDSI R3,1 LOADS R5,R3 STUFFB R5,R4,R3 STORES R5,R3 ; buffer[y,x+1] = '_' ADDSI R3,-1 LOAD R4,R7,COLUMNS ADD R3,R3,R4 LIS R4,'\' LOADS R5,R3 STUFFB R5,R4,R3 STORES R5,R3 ; buffer[y+columns,x] = '\' ADDSI R3,1 LIS R4,'/' LOADS R5,R3 STUFFB R5,R4,R3 STORES R5,R3 ; buffer[y,x+1] = '/' ; MOVE R3,R4 ; -- parameter 1: x -- values still in regs! ; MOVE R4,R5 ; -- parameter 2: y ; LIL R1,PUTAT ; JSRS R1,R1 ; setat( x, y ) ; LEA R3,TRIS1 ; -- parameter 1: s1 = "__" ; LIL R1,PUTS ; JSRS R1,R1 ; puts( "__" ) ; LOAD R3,R2,X-ARSIZE ; -- parameter 1: x ; LOAD R4,R2,Y-ARSIZE ; ADDSI R4,1 ; -- parameter 2: y + 1 ; LIL R1,PUTAT ; JSRS R1,R1 ; setat( x, y + 1 ) ; LEA R3,TRIS2 ; -- parameter 1: s1 = "\/" ; LIL R1,PUTS ; JSRS R1,R1 ; puts( "\/" ) BR TRIEND TRIELS: ; } else { -- recursive case ; -- bottom triangle LOAD R3,R2,H-ARSIZE SR R3,1 ; -- parameter 1: h/2 = 2**(o - 2) LOAD R4,R2,X-ARSIZE ADD R4,R4,R3 ; -- parameter 2: x + h/2 LOAD R5,R2,Y-ARSIZE ADD R5,R5,R3 ; -- parameter 3: y + h/2 JSR R1,TRIANG ; triang( h/2, x + h/2, y + h/2 ) ; -- left triangle LOAD R3,R2,H-ARSIZE SR R3,1 ; -- parameter 1: h/2 = 2**(o - 2) LOAD R4,R2,X-ARSIZE ; -- parameter 2: x LOAD R5,R2,Y-ARSIZE ; -- parameter 3: y JSR R1,TRIANG ; triang( h/2, x, y ) ; -- right triangle LOAD R3,R2,H-ARSIZE LOAD R4,R2,X-ARSIZE ADD R4,R4,R3 ; -- parameter 2: x + h = x + 2**(o - 1) SR R3,1 ; -- parameter 1: h/2 = 2**(o - 2) LOAD R5,R2,Y-ARSIZE ; -- parameter 3: y JSR R1,TRIANG ; -- triang( h/2, x + h, y ) TRIEND: ; } ADDI R2,R2,-ARSIZE ; -- activation record optimized LOADS R1,R2 JUMPS R1 TRIS1: ASCII "__",0 TRIS2: ASCII "\/",0 ALIGN 2 SUBTITLE "main program" INT FILL ;RETAD = 0 ARSIZE = 4 FILL: ; given: R3 = p -- pointer to buffer ; R4 = c -- number of columns ; R5 = r -- number of rows STORES R1,R2 ADDI R2,R2,ARSIZE ; -- activation record optimized LIL R7,GLOBAL STORE R3,R7,BUFFER ; buffer = p STORE R4,R7,COLUMNS ; columns = c STORE R5,R7,ROWS ; rows = r -- all parameters saved ; -- does r or c set the size maximum m? SR R4,1 ; m = c/2 ADDSI R5,-1 ; -- r-1 CMP R4,R5 BLE MAIEI ; if (c/2 > (r-1)) { MOVE R4,R5 ; m = r-1 MAIEI: ; } ; -- what power of 2 th is <= m? LIS R3,1 ; th = 1 MAILP: ; do { SL R3,1 ; th = 2*h CMP R3,R4 BLE MAILP ; } while (th <= m) SR R3,1 ; th = th/2 ; -- parameter 1: w = th (triangle height) LOAD R4,R7,COLUMNS SR R4,1 SUB R4,R4,R3 ; -- parameter 2: x = columns/2 - th LOAD R5,R7,ROWS SUB R5,R5,R3 SR R5,1 ; -- parameter 3: y = rows/2-th/2 = (rows-th)/2 JSR R1,TRIANG ; triang( h, columns/2 - th, rows/2 - th/2 ) ADDI R2,R2,-ARSIZE ; -- activation record optimized LOADS R1,R2 JUMPS R1 END