ASMB,R,L,C EIG FOR HP2100 BY E.J.W. JULY 1975 * MODIFIED BY G.L.M OCT 1977 * * EXTENDED INSTRUCTION GROUP OF THE 21MX SERIES * EMULATED ON THE 2100 INSTRUCTION SET * BY EUGENE J. WONG * JULY 1975 * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * **************************************************************** * NAM .CBT,7 92064-16081 REV.1940 790717 ENT .CBT,.LBT,.MBT,.SBT,.SFB * * * SOURCE - 92064-18017 * RELOCATABLE - 92064-16081 * .A NOP A-REGISTER .B NOP B-REGISTER .EO NOP E,O REGISTERS * * COMPARE BYTES ROUTINE * * (A) = STRING1 BYTE ADDRESS * (B) = STRING2 BYTE ADDRESS * P JSB .CBT * P+1 DEF COUNT NUMBER OF BYTES * P+2 NOP TEMP. STORAGE FOR ROUTINE * P+3 (A)=STRING1 BYTE ADDR + COUNT * P+4 (A)=STRING1 BYTE ADDR WHERE STOPPED * P+5 STRING2> (A)=STRING1 BYTE ADDR WHERE STOPPED * (B)=STRING2 BYTE ADDR + COUNT * .CBT NOP DST .A SAVE A,B REGS ERA,ALS SAVE E,O REGS SOC C INA STA .EO LDA .CBT,I GET COUNT ADDR LDA 0,I GET COUNT ADA 1 CALC. ADDR+1 OF LAST STA STOP BYTE IN STRING2 LDA .CBT,I GET COUNT ADDR AGAIN LDA 0,I NEGATE BYTE COUNT CMA,INA,SZA,RSS FOR LOOP JMP RTN RETURN EQUAL IF ZERO COUNT ISZ .CBT GET ADDR OF USER TEMP WORD STA .CBT,I SAVE NEGATIVE COUNT * LOOP LDB .A GET ADDR OF STRING1 BYTE JSB LBT GET THE BYTE STB .A SAVE ADDR OF NEXT STRING1 BYTE CMA,INA STA TEST NEGATE AND SAVE LDB .B GET ADDR OF STRING2 BYTE JSB LBT GET THE BYTE STB .B SAVE ADDR OF NEXT STRING1 BYTE ADA TEST SUBTRACT STRING1 BYTE SSA JMP MORE STRING1 > STRING2 SZA JMP LESS STRING1 < STRING2 ISZ .CBT,I JMP LOOP NOT DONE YET * JMP RTN IF FALL THROUGH, EQUAL! MORE ISZ .CBT LESS ISZ .CBT RTN CCA SUBTRACT ONE FOR BYTE ADDR ADA .A (A)=BYTE ADDR OF LAST COMPARE ISZ .CBT OR ADDR OF NEXT IF EQUAL STRINGS LDB .EO RESTORE E,O REGS SLB,ELB STO LDB STOP SET UP B-REG JMP .CBT,I RETURN * * LOAD BYTE ROUTINE * .LBT NOP ERA,ALS SAVE E,O REGS SOC C INA STA .EO JSB LBT CALL LOCAL ROUTINE TO DO IT STB .B SAVE B-REG TEMPORARILY LDB .EO RESTORE E,O REGS SLB,ELB STO LDB .B RESTORE B-REG JMP .LBT,I RETURN * * MOVE BYTES ROUTINE * * (A) = SOURCE ADDRESS * (B) = DESTINATION ADDRESS * P JSB .MBT * P+1 DEF N BYTE COUNT * P+2 NOP TEMP FOR .MBT * P+3 * (A) = ADDR+1 OF LAST SOURCE BYTE * (B) = ADDR+1 OF LAST DESTINATION WORD * .MBT NOP DST .A SAVE A,B REGS ERA,ALS SAVE E,O REGS SOC C INA STA .EO * LDA .MBT,I GET ADDR OF COUNT ISZ .MBT LDA 0,I GET BYTE COUNT CMA,INA,SZA,RSS JMP RMBT EXIT IF COUNT=0 STA .MBT,I ELSE SAVE NEGATIVE COUNT * MBTL LDB .A GET SOURCE ADDR JSB LBT GET THE BYTE STB .A SAVE NEW SOURCE ADDR LDB .B GET DESTINATION ADDR JSB SBT STORE THE BYTE STB .B SAVE NEW DESTINATION ADDR ISZ .MBT,I INCREMENT THE COUNT JMP MBTL MOVE SOME MORE IF NOT DONE. * RMBT ISZ .MBT INCREMENT RETURN ADDR LDA .EO RESTORE E,O REGS SLA,ELA STO DLD .A SET NEW BYTE ADDRS IN A,B REGS JMP .MBT,I RETURN * * STORE BYTE ROUTINE * .SBT NOP STA .A SAVE A-REG ERA,ALS SAVE E,O REGS SOC C INA STA .EO LDA .A KEEP ONLY LOW HALF AND B377 JSB SBT CALL LOCAL ROUTINE TO DO IT LDA .EO RESTORE E,O REGS SLA,ELA STO LDA .A RESTORE A-REG JMP .SBT,I RETURN * * SEARCH FOR BYTES ROUTINE * * A=STOP BYTE-TEST BYTE * B=FIRST BYTE ADDRESS OF SEARCH * P JSB .SFB * P+1 (B)=BYTE ADDR OF MATCH * P+2 (B)=BYTE ADDR+1 OF STOP * .SFB NOP STA .A SAVE A-REG ERA,ALS SAVE E,O REGS SOC C INA STA .EO * LDA .A AND B377 STA TEST SAVE TEST BYTE XOR .A ALF,ALF STA STOP SAVE STOP BYTE * SFBL LDA .A SET A IN CASE OF WRAP-AROUND JSB LBT FETCH A BYTE CPA TEST DOES IT MATCH TEST BYTE? JMP MATCH YES, EXIT CPA STOP MATCH STOP BYTE? RSS YES JMP SFBL NO, KEEP SEARCHING * * IF WRAP-AROUND OCCURRED, A-REG ISZ .SFB WOULD MATCH STOP BYTE. INCRE RETURN RSS MATCH ADB N1 ADJUST BYTE ADDRESS FOR MATCH LDA .EO RESTORE E,O REGS SLA,ELA STO LDA .A RESTORE A-REG JMP .SFB,I RETURN * TEST NOP STOP NOP N1 OCT -1 * * * ************************************** * LOCAL ROUTINES FOR BYTE LOAD/STORE * LBT NOP CLE,ERB SET (B) TO WORD ADDR LDA 1,I GET WORD AND SHIFT ACCORDING TO ELB (SLB) CONTAINING EVEN/ODD POSITION SLB,INB,RSS ALSO BUMP BYTE COUNT ALF,ALF IT WAS EVEN. AND B377 KEEP BYTE JMP LBT,I RETURN BYTE IN (A) * B377 OCT 377 C377 OCT 177400 CHAR NOP * SBT NOP STA CHAR SAVE NEW BYTE TEMPORARILY CLE,ERB SET (B) TO WORD ADDR LDA 1,I GET WORD ANDSHIFT ACCORDING TO SEZ,RSS ROTATE IF ODD CHAR ALF,ALF IT WAS EVEN. AND C377 KEEP HALF WHICH IS STAYING IOR CHAR FILL IN NEW BYTE SEZ,RSS ALF,ALF SHIFT IF NEEDED STA 1,I SAVE NEW WORD ELB RESTORE BYTE ADDR INB INCREMENT TO NEXT BYTE ADDR JMP SBT,I RETURN * * END