TITLE "MP4 by Douglas Jones, pre-order version" ; plots the /\ first, then the subtrees ; to plot a tree, pass the coordinates of the root ; fits the window size by repeated division by two USE "hawk.h" USE "stdio.h" INT MAIN S MAIN ; activation record for PLOTTREE ;RETAD = 0 SAVER8 = 4 SAVER9 = 8 SAVER10 = 12 SAVER11 = 16 ARSIZE = 20 PLOTTREE: ; expects R3 = size -- vertical size of this tree node ; R4 = x -- x coordinate of root ; R5 = y -- y coordinate of root STORES R1,R2 STORE R8,R2,SAVER8 STORE R9,R2,SAVER9 STORE R10,R2,SAVER10 STORE R11,R2,SAVER11 ADDI R2,R2,ARSIZE MOVE R8,R3 ; -- move size into place MOVE R9,R4 ; -- move x into place MOVE R10,R5 ; -- move y into place TESTR R8 BZS PLOTQT ; if (size >= 1) { LIS R11,0 ; int i = 0 PLOTLP: ; do { -- output size rows of /\ MOVE R3,R9 ; -- parameter x MOVE R4,R10 ; -- parameter y LIL R1,PUTAT JSRS R1,R1 ; putat( x, y ) LIS R3,'/' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( '/' ) MOVE R3,R9 ADD R3,R3,R11 ADD R3,R3,R11 ADDSI R3,1 ; -- parameter x + 2i + 1 MOVE R4,R10 ; -- parameter y LIL R1,PUTAT JSRS R1,R1 ; putat( x + 2i + 1, y ) LIS R3,'\' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( '\' ) ADDSI R9,-1 ; x = x - 1 ADDSI R10,1 ; y = y + 1 -- move down diagonal ADDSI R11,1 ; i = i - 1 CMP R11,R8 BLT PLOTLP ; } while (i < size) MOVE R3,R8 SR R3,1 ; -- parameter size/2 MOVE R4,R9 ; -- parameter x MOVE R5,R10 ; -- parameter y JSR R1,PLOTTREE ; plottree( size/2, x, y ) MOVE R3,R8 SR R3,1 ; -- parameter size/2 MOVE R4,R9 ADD R4,R4,R8 ADD R4,R4,R8 ; -- parameter x + 2size MOVE R5,R10 ; -- parameter y JSR R1,PLOTTREE ; plottree( size/2, x + 2size, y ) PLOTQT: ; } ADDI R2,R2,-ARSIZE LOAD R8,R2,SAVER8 LOAD R9,R2,SAVER9 LOAD R10,R2,SAVER10 LOAD R11,R2,SAVER11 LOADS PC,R2 ; activation record for MAIN ;RETAD = 0 ARSIZE = 4 MAIN: STORES R1,R2 ADDSI R2,ARSIZE LIL R3,TERMINFO ; -- problem 1, what size fits? ; here R3 = terminfo ; R4 = width ; -- will change as we see what fits ; R5 = height ; -- will change as we see what fits ; R6 = size LOAD R4,R3,TERMCOLS SR R4,1 ; width = termcols/2 LOAD R5,R3,TERMROWS ; height = termrows LIS R6,1 ; size = 1 -- always a power of 2 SIZELP: ; for (;;) { SRU R4,1 ; width = width/2 BEQ SIZEQT ; if (width == 0) break SRU R5,1 ; height = height/2 BEQ SIZEQT ; if (height == 0) break SL R6,1 ; size = size * 2 BR SIZELP SIZEQT: ; } LOAD R4,R3,TERMCOLS LOAD R5,R3,TERMROWS ; height = termrows MOVE R3,R6 SR R3,1 ; -- parameter size = size/2 SR R4,1 ADDSI R4,-1 ; -- parameter x = termcols/2 - 1 SR R5,1 SUB R5,R5,R3 ADDSI R5,1 ; -- parameter y = termcols/2- size + 1 JSR R1,PLOTTREE ; plottree( size, x, y ) ADDSI R2,-ARSIZE LOADS PC,R2 ; return END