********************************************************************* * Z390 MAINFRAME ASSEMBLER CODING CONTEST PROBLEM #11. * CODE TWO ROUTINES TO ADD AND FIND OPCODE TABLE ENTRIES. * THE TABLE CONTAINS 856 ENTRIES WITH 8 BYTE MNEMONIC NAMES AND 2 BYTE * OPCODES. THE TABLE IS INCLUDED IN PROGRAM VIA COPY FROM OPCODES.CPY * TO COMPARE THE PERFORMANCE OF SOLUTIONS, USE THIS MODEL PROGRAM * WHICH LOADS TABLE AND THEN FINDS ALL ENTRIES 100 TIMES VERIFYING * THAT MATCHING OPCODE TABLE ENTRY IS RETURNED. THE ROUTINE MUST BE * CODED TO HANDLE RANDOM ACCESS EVEN THOUGH THIS TEST USES SEQUENTIAL * ACCESS. ********************************************************************* * 01/24/08 DSH USE P11FIND2 TO FIND HASH TABLE WITH MAX DUPS/SEARCHES ********************************************************************* P11DSH2 ZMFACC CODE,START,NAME='DON HIGGINS' L R3,=A(TABLE) LOOP1 DS 0H LOAD HASH TABLE BAL R10,ADDOP ADD TABLE ENTRIES TO MY HASH TABLE BNE 1 ABORT IF DUP KEY FOUND DURING LOADING AHI R3,10 CL R3,=A(TABLEEND) BL LOOP1 LA R4,100 LOOP2 DS 0H REPEAT FIND LOOP 100 TIMES L R3,=A(TABLE) LOOP3 DS 0H FIND EACH ENTRY IN TABLE BAL R10,FINDOP FIND TABLE ENTRY FOR NAME AT (R3) CLR R1,R3 VERIFY MATCHING ENTRY BNE 3 ABORT IF TABLE ADDRESS WRONG AHI R3,LENTRY CL R3,=A(TABLEEND) BL LOOP3 BCT R4,LOOP2 ZMFACC CODE,END ZMFACC INPUT,START ZMFACC INPUT,END ZMFACC OUTPUT,START ZMFACC OUTPUT,END * * ADD HASH TABLE ENTRY WITH NAME AT (R3) AND OPCODE AT 8(R3) * AND RETURN VIA R10 * ADDOP DS 0H ZAP TSEARCH,=P'0' LR R11,R10 SAVE RETURN LG R1,0(R3) G1 = 8 BYTE NAME DSG R0,DIVISOR LPGR R2,R0 G1 = POSITIVE REMAINDER SLL R2,2 L R1,HASHTAB(R2) LTR R1,R1 IF NOT ZERO BNZ SEARCH STORE DS 0H ST R3,HASHTAB(R2) ELSE STORE NEW ENTRY BR R11 EXIT SEARCH DS 0H AHI R2,4 L R1,HASHTAB(R2) LTR R1,R1 BZ STORE AP TSEARCH,=P'1' CP TSEARCH,MAXS BNH SEARCH B 1 ABORT DUE TO MAX SEARCH EXCEEDED TSEARCH DC PL4'0' MAXS DC PL4'2' * * FIND HASH TABLE ENTRY WITH NAME AT (R3) AND RETURN ADDRESS OF * ENTRY IN R1 * AND RETURN VIA R10 * FINDOP DS 0H LG R1,0(R3) G1 = 8 BYTE NAME DSG R0,DIVISOR LPGR R2,R0 G1 = POSITIVE REMAINDER SLL R2,2 R2 = HASH TABLE OFFSET NEXT DS 0H L R1,HASHTAB(R2) R1 = A(TABLE ENTRY) CLC 0(8,R1),0(R3) IF KEY MATCHES TABLE ENTRY BER R10 EXIT WITH ADDRESS AHI R2,4 ELSE INC TO NEXT HASH TABLE ENTRY B NEXT GO FETCH AND CHECK NEXT ENTRY LTORG PRINT DATA * * HASH TABLE * DC C'YOUR HASH TABLE DATA AREAS HERE' HASH EQU 3473 SIZE REQUIRED FROM MAXD=160,MAXS=2 P11FIND2.MLC DIVISOR DC 0D,A(0,HASH) 64 BIT DIVISOR HASHTAB DS (HASH+2)F'0' HASH TABLE SIZE FROM P11FIND.MLC * * TABLE OF OPCODE MNEMONICS AND HEX OPCODES * TABLE DS 0D MACRO ZOSOP &HEXOP,&DESC,&OPCODE,&TYPE,&NOP= &TDESC SETC '&DESC'(2,K'&DESC-2) &THEXOP SETC '&HEXOP'(2,K'&HEXOP-2) &THEXOP SETC '&THEXOP.00'(1,4) DC CL8&OPCODE,XL2'&THEXOP' &TDESC MEND LENTRY EQU 8+2 COPY OPCODES TABLEEND EQU * END