.TITLE FNMAT Match routine address to function number .SBTTL DOCUM .REM " /* FNMAT * Sparce function number matching routine * * Synopsys : * int fnmat(fnumb,ftab,tabz) * int fnumb; /* Function number */ * fdtab ftab; /* ORDERD Table of functions */ * int tabz; /* Number of entrys in table */ * * typedef struct _fdtab { * int fnum; /* Number of the function */ * int (*fadr); /* Function address */ * } fdtab; * * Returns Function address, or -1 for fuction not found */ " .PAGE .SBTTL CODE OFF = 2 FNUMB = 2+OFF FTAB = 4+OFF TABZ = 6+OFF FNMAT:: ; SAVE REG'S MOV R2,-(SP) ; SET END POINTERS MOV FTAB(SP),R0 ; R0 = BEGINNING OF TABLE MOV TABZ(SP),R1 ; R1 = END OF TABLE ASH #-2,R1 ADD R0,R1 30$: ; HAVE THE END POINTERS MET ? CMP R0,R1 BNE 40$ MOV #177777,R0 BR 50$ 40$: ; FIND THE MID-POINT MOV R1,R2 ADD R0,R2 ROR R2 BIC #1,R2 ; COMPARE THIS POINT WITH WHAT WE WANT CMP (R2),FNUMB(SP) BEQ 10$ ; SET THE APROPRITE END POINTER BGT 20$ MOV R2,R1 BR 30$ 20$: MOV R2,R0 BR 30$ ; SET THE RESULT, AND RETURN 10$: MOV 2(R2),R0 50$: MOV (SP)+,R2 RTS PC .END