.TITLE CASES CASE STATEMENT .SBTTL GENERAL INFORMATION .IDENT /01/ .LIST ME ;+ ; AUTHOR: KERRY WYCKOFF ;- ;+ ; CHANGES: NONE ;- ;+ ; MODULE FUNCTION: ; ; THIS ROUTINE COMPARES A SPECIFIED INDEX TO ; EACH OF N VALUES UNTIL IT FINDS ONE WHICH ; IS EQUAL. IT THEN EXECUTES THE ASSOCIATED ; SUBROUTINE. ; IF NO EQUAL VALUE IS FOUND, THE ROUTINE ; SIMPLY RETURNS. ; IN EITHER CASE, THE ROUTINE RETURNS THE ; NUMBER WHICH CORRESPONDS TO THE EXECUTED ; SUBROUTINE, OR 0 IF NO EQUAL VALUE WAS ; FOUND. ; ;- ;+ ; ASSEMBLY INSTRUCTIONS: ; ; MAC CASES=CASES ; ;- ;+ ; CALL FORMAT: ; ; 1) CALL CASES(INDEX,VALUE 1,SUB 1,...,VALUE N, SUB N) ; 2) I=CASES(INDEX,VALUE 1,SUB 1,...,VALUE N,SUB N) ; ;- .PAGE .SBTTL SYMBOL, MACRO, DATA DEFINITIONS ;+ ; LOCAL SYMBOL DEFINITIONS: NONE ;- ;+ ; LOCAL MACROS: NONE ;- ;+ ; LOCAL DATA BLOCKS: NONE ;- .PAGE .SBTTL FUNCTION DETAILS ;+ ; FUNCTION DETAILS: ; ; ; INPUTS: ; ; R5 CONTAINS THE ADDRESS OF THE PARAMETER LIST ; 1) WORD: NUMBER OF PARAMETERS ; 2) WORD: ADDRESS OF INDEX ; 3) WORD: VALUE 1 ; 4) WORD: SUBROUTINE 1 ; 5) WORD: VALUE N ; 6) WORD: SUBROUTINE N ; ; OUTPUTS: ; ; R0=THE NUMBER CORRESPONDING TO THE EXECUTED SUBROUTINE ; ; SIDE EFFECTS: ; ; R5 HAS BEEN ALTERED TO INCREASE SPEED ; ;- .PAGE .SBTTL CODE SECTION .PSECT W13COD .ENABL LSB CASES:: CLR R1 ; R1=COUNTER MOV (R5)+,R0 ; R0=# OF PARAMETERS ASR R0 ; PARAMETERS COME IN PAIRS BCC 98$ ; TRAP INVALID # BEQ 99$ ; IF EQ 0, RETURN MOV @(R5)+,R3 ; R3=INDEX 1$: INC R1 ; BUMP COUNTER CMP @(R5)+,R3 ; VALUE=INDEX ? BEQ 2$ ; IF EQ, EXECUTE SUBROUTINE TST (R5)+ ; BUMP R5 SOB R0,1$ ; LOOP UNTIL DONE RTS PC ; RETURN 2$: MOV R1,-(SP) ; SAVE COUNTER JSR PC,@(R5)+ ; EXECUTE SUBROUTINE MOV (SP)+,R0 ; RESTORE COUNTER RTS PC ; RETURN 98$: TRAP 80.+128. ; FORTRAN ERROR 80 99$: RTS PC ; RETURN .END