.TITLE SELECT .IDENT /00/ .PSECT CODE,RO ; ; VERSION 00 ; ; TOM GETZINGER 29-DEC-79 ; ; THIS ROUTINE DOES A COMPUTED GOTO OR CALL ; ; CALLING SEQUENCE: ; MOV VALUE,R1 ; LOAD THE VALUE INTO R1 ; CALL SELECT ; DO THE COMPUTED JUMP ; .BYTE LOWVAL,HIVAL ; THESE ARE THE LEGAL LIMITS ; .WORD BADVAL ; IT GOES HERE IF THE VALUE IS ILLEGAL ; .WORD LOWEST ; IT GOES HERE IF VALUE=LOWVAL ; .WORD NEXT ; IT GOES HERE IF VALUE=LOWVAL+1 ; : ; : ; .WORD HIGHEST ; IT GOES HERE IF VALUE=HIVAL ; (NEXT INSTRUCTION) ; ; THE PROCESSOR ADDRESSES (E.G. BADVAL, LOWEST, HIGHEST) ARE ; JUMPED TO IF EVEN. IF ODD, A CALL IS MADE TO THE VALUE-1, WHICH ; RETURNS TO THE INSTRUCTION AFTER THE PROCESSOR ADDRESS LIST. ; SELECT:: MOV R0,-(SP) ; SAVE R0 MOV R1,-(SP) ; SAVE THE VALUE MOV R2,-(SP) ; SAVE R2 MOV 6(SP),R0 ; GET ADDRESS AFTER CALL CMPB R1,(R0) ; IS THE VALUE LEGAL? BLT 10$ ; NO CMPB R1,1(R0) ; MAYBE BGT 10$ ; NO MOVB (R0),R2 ; GET LOW VALUE SUB R2,R1 ; GET OFFSET ASL R1 ; CONVERT TO WORD OFFSET ADD #4,R1 ; R1 = OFFSET TO PROCESSOR ADDRESS BR 20$ ; GO TO THE PROCESSOR 10$: MOV #2,R1 ; R1 = OFFSET TO ILLEGAL VALUE PROCESSOR 20$: ADD R0,R1 ; R1 = ADDRESS OF PROCESSOR ADDRESS BIT #1,(R1) ; SHOULD WE CALL THE PROCESSOR? BNE 30$ ; YES MOV (R1),6(SP) ; NO, SET RETURN ADDRESS TO PROCESSOR ADDRESS MOV (SP)+,R2 ; RESTORE R2 MOV (SP)+,R1 ; RESTORE R1 MOV (SP)+,R0 ; RESTORE R0 RETURN ; GO TO THE PROCESSOR 30$: MOVB 1(R0),R2 ; GET HIGH VALUE MOVB (R0),R0 ; GET LOW VALUE SUB R0,R2 ; GET DIFFERENCE ASL R2 ; DOUBLE IT ADD #6,R2 ; R2 = OFFSET TO NEXT INST AFTER PROC TABLE ADD R2,6(SP) ; CHANGE RETURN ADDRESS MOV (SP)+,R2 ; RESTORE R2 MOV 2(SP),R0 ; RESTORE R0 MOV (R1),2(SP) ; SAVE PROCESSOR ADDRESS MOV (SP)+,R1 ; RESTORE R1 DEC (SP) ; CLEAR "CALL" FLAG RETURN ; CALL THE PROCESSOR .END