TITLE "mp6 test program by Douglas Jones" ; test the new MOVEM instruction that is defined by ; the trap handler implemented as a solution to MP6 USE "hawk.h" USE "monitor.h" ; how to assemble the new Hawk MOVEM instruction MACRO MOVEM dst,src B #10 | (dst - qREGISTERq) B #80 | (src - qREGISTERq) ENDMAC ; an illegal address ILLEGAL = #88888888 ; a global variable COMMON AGLOBAL, 4 ; the main program activation record ;RETAD = 0 ALOCAL = 4 ; a local variable ARSIZE = 8 INT MAIN S MAIN MAIN: ; entry point STORES R1,R2 LIW R3,ILLEGAL ; -- registers hold illegal memory addresses MOVE R4,R3 ; -- so if the wrong register gets used MOVE R5,R3 ; -- result will be an immediate trap. MOVE R6,R3 MOVE R7,R3 MOVE R8,R3 MOVE R9,R3 MOVE R10,R3 MOVE R11,R3 MOVE R12,R3 MOVE R13,R3 MOVE R14,R3 MOVE R15,R3 LIL R4,AGLOBAL STORES R0,R4 ; aglobal = 0 LEA R8,R2,ALOCAL MOVEM R8,R4 ; alocal = aglobal -- using R8 and R4 LOAD R4,R2,ALOCAL ADDSI R4,1 STORE R4,R2,ALOCAL ; alocal = alocal + 1 MOVE R4,R15 MOVE R8,R15 ; -- restore illegal pointers everywhere LIL R10,AGLOBAL LEA R5,R2,ALOCAL MOVEM R10,R5 ; aglobal = alocal -- using R10 and R5 LIL R5,AGLOBAL LOADS R10,R5 ADDSI R10,2 ; aglobal = aglobal + 2 STORES R10,R5 MOVE R5,R14 MOVE R10,R14 ; -- restore illegal pointers everywhere LIL R6,AGLOBAL LEA R12,R2,ALOCAL MOVEM R12,R6 ; alocal = aglobal -- using R12 and R6 LOAD R6,R2,ALOCAL ADDSI R6,4 STORE R6,R2,ALOCAL ; alocal = alocal + 4 MOVE R6,R13 MOVE R12,R13 ; -- restore illegal pointers everywhere LIL R7,AGLOBAL LEA R14,R2,ALOCAL MOVEM R7,R14 ; aglobal = alocal -- using R7 and R14 LIL R7,AGLOBAL LOADS R14,R7 ADDSI R14,8 ; aglobal = aglobal + 8 STORES R14,R7 MOVE R7,R12 MOVE R14,R12 ; -- restore illegal pointers everywhere LIL R15,AGLOBAL LEA R3,R2,ALOCAL MOVEM R3,R15 ; alocal = aglobal -- using R3 and R15 ADDI R3,R3,-ALOCAL CMP R3,R2 BEQ ENDIF1 ; if (R3-ALOCAL != R2) { -- bug report LEA R3,WIPDST ; -- parameter ADDI R2,R2,ARSIZE LIL R1,PUTS JSRS R1,R1 ; puts( "MOVEM wiped out dst addr. " ); ADDI R2,R2,-ARSIZE ENDIF1: ; } LIL R3,AGLOBAL CMP R3,R15 BEQ ENDIF2 ; if (R15 != AGLOBAL) { -- bug report LEA R3,WIPSRC ; -- parameter ADDI R2,R2,ARSIZE LIL R1,PUTS JSRS R1,R1 ; puts( "MOVEM wiped out src addr. " ); ADDI R2,R2,-ARSIZE ENDIF2: ; } LOAD R3,R2,ALOCAL CMPI R3,15 BEQ ENDIF3 ; if (alocal != 15) { -- bug report LEA R3,WIPOPR ; -- parameter ADDI R2,R2,ARSIZE LIL R1,PUTS JSRS R1,R1 ; puts( "MOVEM corrupted the operand. " ); ADDI R2,R2,-ARSIZE ENDIF3: ; } LIW R3,ILLEGAL CMP R3,R14 BNE BUG ; if ((R14 != ILLEGAL) CMP R3,R13 BNE BUG ; && (R13 != ILLEGAL) CMP R3,R12 BNE BUG ; && (R12 != ILLEGAL) CMP R3,R11 BNE BUG ; && (R11 != ILLEGAL) CMP R3,R10 BNE BUG ; && (R10 != ILLEGAL) CMP R3,R9 BNE BUG ; && (R9 != ILLEGAL) CMP R3,R8 BEQ ENDIF4 ; && (R8 != ILLEGAL)) { BUG: LEA R3,WIPOTH ; -- parameter ADDI R2,R2,ARSIZE LIL R1,PUTS JSRS R1,R1 ; puts( "MOVEM corrupted other register. " ); ADDI R2,R2,-ARSIZE ENDIF4: ; } ADDI R2,R2,ARSIZE LEA R3,DONMSG ; -- parameter LIL R1,PUTS JSRS R1,R1 ; puts( "MOVEM tests complete." ); ADDI R2,R2,-ARSIZE LOADS R1,R2 JUMPS R1 ; return ; --- begin aplication constants --- WIPDST: ASCII "MOVEM wiped out dst addr. ",0 WIPSRC: ASCII "MOVEM wiped out src addr. ",0 WIPOPR: ASCII "MOVEM corrupted the operand. ",0 WIPOTH: ASCII "MOVEM corrupted other register. ",0 DONMSG: ASCII "MOVEM tests complete. ",0 END