TITLE "mp2 by Douglas Jones" ; a program to outline the screen with x marks USE "hawk.h" USE "monitor.h" INT MAIN S MAIN SUBTITLE "MAIN program" ; activation record ;RETAD = 0 WIDTH = 4 ; screen width HEIGHT = 8 ; screen height ARSIZE = 12 MAIN: ; expects R3 = width, the screen width ; R4 = height, the screen height STORES R1,R2 STORE R3,R2,WIDTH STORE R4,R2,HEIGHT ; -- parameters saved ; -- top horizontal line LIS R3,0 ; -- parameter x = 0 LIS R4,0 ; -- parameter y = 0 LIS R5,1 ; -- parameter dx = 1 LIS R6,0 ; -- parameter dy = 0 LOAD R7,R2,WIDTH ; -- parameter n = width ADDI R2,R2,ARSIZE JSR R1,MAKEROW ; makerow( 0,0,1,0,width ) ADDI R2,R2,-ARSIZE ; -- right vertical line LOAD R3,R2,WIDTH ADDSI R3,-1 ; -- parameter x = width-1 LIS R4,0 ; -- parameter y = 0 LIS R5,0 ; -- parameter dx = 0 LIS R6,1 ; -- parameter dy = 1 LOAD R7,R2,HEIGHT ; -- parameter n = height ADDI R2,R2,ARSIZE JSR R1,MAKEROW ; makerow( width-1,0,0,1,height) ADDI R2,R2,-ARSIZE ; -- bottom horizontal line LIS R3,0 ; -- parameter x = 0 LOAD R4,R2,HEIGHT ADDSI R4,-1 ; -- parameter y = height-1 LIS R5,1 ; -- parameter dx = 1 LIS R6,0 ; -- parameter dy = 0 LOAD R7,R2,WIDTH ; -- parameter n = width ADDI R2,R2,ARSIZE JSR R1,MAKEROW ; makerow( 0,height-1,1,0,width ) ADDI R2,R2,-ARSIZE ; -- left vertical line LIS R3,0 ; -- parameter x = 0 LIS R4,0 ; -- parameter y = 0 LIS R5,0 ; -- parameter dx = 0 LIS R6,1 ; -- parameter dy = 1 LOAD R7,R2,HEIGHT ; -- parameter n = height ADDI R2,R2,ARSIZE JSR R1,MAKEROW ; makerow( 0,0,0,1,height ) ADDI R2,R2,-ARSIZE LOADS R1,R2 JUMPS R1 ; return SUBTITLE "MAKEROW routine" ; activation record ;RETAD = 0 SAVER8 = 4 ; save locations for registers SAVER9 = 8 SAVER10 = 12 SAVER11 = 16 SAVER12 = 20 ARSIZE = 24 MAKEROW:; expects R3 = x ; R4 = y, origin coordinates for the row ; R5 = dx ; R6 = dy, increment for the row ; R7 = n, number of 'x' marks in the row STORES R1,R2 STORE R8,R2,SAVER8 STORE R9,R2,SAVER9 STORE R10,R2,SAVER10 STORE R11,R2,SAVER11 STORE R12,R2,SAVER12 ; -- save what must be restored MOVE R8,R3 MOVE R9,R4 ; -- move x and y MOVE R10,R5 MOVE R11,R6 ; -- move dx and dy MOVE R13,R7 ; -- move n MRLOOP: TESTR R13 BLE MRQUIT ; while (n > 0) { MOVE R3,R8 ; -- parameter x MOVE R4,R9 ; -- parameter y ADDI R2,R2,ARSIZE LIL R1,PUTAT JSRS R1,R1 ; putat( x,y ) ADDI R2,R2,-ARSIZE LIS R3,'x' ; -- parameter 'x' ADDI R2,R2,ARSIZE LIL R1,PUTCHAR JSRS R1,R1 ; putchar( 'x' ) ADDI R2,R2,-ARSIZE ADD R8,R8,R10 ; x = x + dx ADD R9,R9,R11 ; y = y + dy ADDSI R13,-1 ; n = n - 1 BR MRLOOP MRQUIT: ; } LOAD R8,R2,SAVER8 LOAD R9,R2,SAVER9 LOAD R10,R2,SAVER10 LOAD R11,R2,SAVER11 LOAD R12,R2,SAVER12 ; -- restore what was saved LOADS R1,R2 JUMPS R1 ; return