PRINT ON,NOGEN 80000010 AIF (NOT &$EXINT).EINONE L 83002000 TITLE '*** ECBRSTKD - DSECT FOR THE EXT'D INT BRANCH STACK' 83004000 **--> DSECT: ECBRSTKD SINGLE ENTRY FOR THE BRANCH STACK . . . . . 83006000 *. . 83008000 *. THIS DSECT MIRRORS THE ECSTACKD DSECT BUT IS . 83010000 *. USED BY THE EXTENDED INTERPRETER FOR THE . 83012000 *. SUCCESSFUL-BRANCH STACK. . 83014000 *. . 83016000 *.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83018000 SPACE 2 83020000 ECBRSTKD DSECT 83022000 ECBSTENT DS 0CL16 BRANCH STACK ENTRY 83024000 ECBSLINK DS F @ OF THE NEXT STACK ENTRY (LINK) 83026000 ECBSIADD DS F BRANCH INSTRUCTION ADDRESS 83028000 ECBSCCPM DS H CC AND PM 83030000 SPACE 83032000 ECBSINST DS 0CL6 UP TO 6 BYTES OF INSTRUCTION 83034000 ECBSOP DS C OPCODE 83036000 ECBSB2 DS C 2ND BYTE OF INSTRUCTION 83038000 ECBSBD DS H 1ST OR ONLY BASE/DISPLACEMENT 83040000 ECBSB2D2 DS H 2ND BASE/DISPLACEMENT 83042000 TITLE '*** EXECUT- EXTENDED INTERPRETER SECTION' 83044000 **--> CSECT: EXECUT EXTENDED INTERPRETER SECTION . . . . . . . . 83046000 *. . 83048000 *. EXTENDED INTERPRETER FOR ASSIST . 83050000 *. . 83052000 *.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83054000 SPACE 5 83056000 ****************** REGISTER USAGE IN EXECUT *********************** 83058000 * * 83060000 * REG # USAGE IN EXECUT * 83062000 * ----- --------------- * 83064000 * * 83066000 * R0 GENERAL WORK REG * 83068000 * R1 TEMPORARY BASE / GENERAL WORK REG * 83070000 * R2 BYTE REG / TEMPORARY WORK REG * 83072000 * R3 BASE REG FOR THE INSTRUCTION STACK * 83074000 * R4 INSTRUCTION ADDRESS REGISTER & OPERAND * 83076000 * ADDRESS REGISTER * 83078000 * R5 CONDITION CODE REG * 83080000 * R6 BASE REGISTER FOR DSECT -> ECONTROL * 83082000 * R7-R9 DECODING AND GENERAL WORK REGS * 83084000 * R10 DECODING REG & OPERAND ADDRESS REGISTER * 83086000 * R11 CONTAINS RELOCATION VALUE (RARELY USED AS * 83088000 * A WORK REG - BUT ALWAYS RESTORED) * 83090000 * R12 & R13 BASE REGISTERS FOR EXECUT * 83092000 * R14 WORK REG / INTERNAL LINKAGE REG * 83094000 * R15 CONTAINS OPCODE OF CURRENT INSTRUCTION * 83096000 * * 83098000 *********************************************************************** 83100000 EXECUT CSECT 83102000 RWK0 EQU R0 83104000 RWK1 EQU R1 83106000 RSTK EQU R3 83108000 RIA EQU R4 83110000 RAD1 EQU RIA 83112000 RAD2 EQU R10 83114000 RCC EQU R5 83116000 REC EQU R6 83118000 RMEM EQU R11 83120000 RLINK EQU R14 83122000 RWK14 EQU R14 83124000 ROP EQU R15 83126000 TITLE '*** EXECUT - INITIALIZATION PHASE' 83128000 *********************************************************************** 83130000 * * 83132000 * INITIALIZATION CODE FOR EXECUT * 83134000 * * 83136000 *********************************************************************** 83138000 SPACE 5 83140000 $SAVE RGS=(R14-R12),BR=(R13,R12),SA=EIECSAVE 83142000 LR REC,R10 MOVE ECONTROL POINTER OVER 83144000 USING ECONTROL,REC NOTE ECONTROL USAGE 83146000 SPACE 2 83148000 * INSTRUCTION STACK ZEROING AND CHAINING 83150000 SR R1,R1 CLEAR FOR ZEROING 83152000 SR R2,R2 DITTO 83154000 SR R3,R3 DITTO 83156000 LA R4,L'ECSTENT VAL OF SINGLE STACK ENTRY 83158000 LA R5,ECINSTAC+L'ECINSTAC*(EC$STACK-1) GET ENDING LIMIT 83160000 LA R7,ECINSTAC GET BEGINNING @ OF STACK AREA 83162000 USING ECSTACKD,R7 SET UP TEMPORARY USING 83164000 LA R0,ECINSTAC+L'ECINSTAC GET @ OF THE 2ND ELEMENT 83166000 EINITIST EQU * 83168000 STM R0,R3,ECSTENT ZERO ONE TABLE ENTRY 83170000 LR R7,R0 UPDATE POINTER TO STACK ENTRY 83172000 BXLE R0,R4,EINITIST CONTINUE LOOPING 83174000 SPACE 83176000 LA R0,ECINSTAC ADDRESS FOR WRAP-AROUND 83178000 STM R0,R3,ECSTENT STORE IN LAST ENTRY 83180000 ST R7,ECRSTK SAVE WHERE CAN BE PICKED UP 83182000 DROP R7 DROP TEMP REG 83184000 SPACE 2 83186000 * BRANCH STACK ZEROING AND CHAINING 83188000 LA R4,L'ECBSTENT VAL OF SINGLE BRANCH STACK ENTRY 83190000 LA R5,ECBRSTAC+L'ECBRSTAC*(EC$BRSTC-1) GET ENDING LIMIT 83192000 LA R7,ECBRSTAC GET BEGINNING @ OF STACK AREA 83194000 USING ECBRSTKD,R7 SET UP TEMPORARY USING 83196000 LA R0,ECBRSTAC+L'ECBSTENT GET @ OF 2ND ELEMENT 83198000 EINITBST EQU * 83200000 STM R0,R3,ECBSTENT ZERO ONE TABLE ENTRY 83202000 LR R7,R0 UPDATE POINTER TO STACK ENTRY 83204000 BXLE R0,R4,EINITBST CONTINUE LOOPING 83206000 SPACE 83208000 LA R0,ECBRSTAC ADDRESS FOR WRAP-AROUND 83210000 STM R0,R3,ECBSTENT STORE IN LAST ENTRY 83212000 ST R7,ECBSTK SAVE WHERE CAN BE PICKED UP 83214000 ST R7,ECBCUR SAVE FOR EIFINB LIST MANIPULATION 83216000 DROP R7 DROP TEMP REG 83218000 SPACE 2 83220000 * MORE INITIALIZATION 83222000 MVC ECILCMSK(4),ECFENTER MAKE ENTRY POINT THE PSW 83224000 MVC ECR14SAV,ECREG14 SAVE FOR ORIGINAL RETURN @ 83226000 MVC ECILIMT,ECILIMP MOVE PERMENANT TO TEMPORARY L 83228000 SPACE 2 83230000 * ADDRESS CALCULATION SECTION 83232000 * THE BELOW FAKE HIGH ADDRESS CALCULATION IS A DUPLICATION 83232100 * OF THE ADDRESS CALCULATIONS DONE IN ASSIST MAIN CONTROL 83232200 * REMOVING THIS CODE HOWEVER CAUSES THE HIGH ADDRESS TO 83232300 * TO END UP VERY WRONG WHEN IT GETS TO THE INTERPRETER 83232400 EICONTIN EQU * 83234000 L R0,ECRADH GET REAL HIGH ADDRESS LIMIT 83236000 S R0,ECRADL GET LENGTH OF USER PROGRAM 83238000 A R0,ECFADL ADD TO FAKE LOW ADDRESS 83240000 ST R0,ECFADH STORE IN FAKE HIGHEST ADDR 83242000 SPACE 2 83244000 * SET UP SPIE CODE 83252000 EISPIEGO EQU * 83254000 TM ECFLAG0,$ECSPIEA IS OUR SPIE ALREADY IN EFFECT 83256000 BO EISPIEA YES, WE DON'T HAVE TO RE-SPIE 83258000 $SPIE EISPIERT,((1,15)),CE=EISPIEXT,ACTION=CR CATCH ALL INTRP 83260000 ST R1,ECPICA SAVE PREVIOUS PICA, IF ANY 83262000 OI ECFLAG0,$ECSPIEA SHOW OUR SPIE IS IN CONTROL 83264000 SPACE 2 83266000 EISPIEA EQU * 83278000 * INITIALIZE THE PRCB FOR THIS RUN 83280000 * (ALL DEFAULT ADDRESSES, FLAGS, ETC SET) 83282000 MVC ECPRFLG1(8),EIDFAULT MOVE DEFAULT VALS TO PRCB 83284000 MVC ECPRWORK(4),ECFADL SET UP HIGH AND LOW DEFAULT M 83286000 MVC ECPRWORK+4(4),ECFADH ADDRESSES IN WORK AREA M 83288000 MVC ECPRTRAL(8),ECPRWORK SET TRACE LIMIT ADDRS M 83290000 MVC ECPRMODL(8),ECPRWORK SET MOD CHK LIMIT ADDRS M 83292000 MVC ECPRICL(8),ECPRWORK SET IECF LIMIT ADDRESSES M 83294000 MVC ECPRCLOK(4),ECILIMP SET INSTR COUNTER (CLOCK) 83296000 MVC ECPRCMPR(4),=F'-1' DISARM INTERRUPT CLOCK 83298000 MVI EITSTMSK+1,ECEM370 ITIALIZE INVALID OP CODE TEST 83300000 SPACE 2 83302000 * SET UP USINGS, REGS, ETC. FOR THIS RUN 83304000 L RSTK,ECRSTK GET PTR TO STACK FOR BASE 83306000 USING ECSTACKD,RSTK SET UP PERMANENT USING 83308000 L RMEM,ECRELOC GET RELOCATION VAL IN REG 83310000 SR R2,R2 CLEAR BYTE REG 83312000 STH R2,ECINTCOD SET THE INTERRUPT CODE TO 0 83314000 SR ROP,ROP CLEAR OPCODE REG FOR CONSTANT IC'S 83316000 L RIA,ECILCMSK LOAD INSTR @ REG FOR EIFINB 83318000 LR RCC,RIA PLACE CC AND MASK OVER 83320000 SPM RCC INIT REAL CC = FAKE CC 83322000 AIF (NOT &$FLOTE).EINOFL1 SKIP IF NOT DOING FL 83324000 LD F0,ECFPREGS GET FP REG 83326000 LD F2,ECFPREGS+8 GET FP REG 83328000 LD F4,ECFPREGS+16 GET FP REG 83330000 LD F6,ECFPREGS+24 GET FP REG 83332000 .EINOFL1 ANOP 83334000 B EIFINB BEGIN MAIN LOOP INTERPRETATION 83336000 SPACE 5 83338000 * DEFAULT PRCB FLAGS 83340000 EIDFAULT DC AL1(0) ECPRFLG1 DEFAULT 83342000 DC AL1(ECEM370+ECALNCHK) ECPRFLG2 DEFAULT 83344000 DC XL6'0' ECPRFLG3-ECPRFLG8 DEFAULT 83346000 EJECT 83348000 * * * * * * * * * * * OCX INTERRUPT EXITS * * * * * * * * * * * * * 83350000 *********************************************************************** 83352000 SPACE 2 83354000 EIOC1 EQU * 83356000 LA R0,1 SHOW OPERATION INTERRUPT 83358000 B EIEXITI EXIT POINT FOR INTERRUPTS 83360000 EIOC2 EQU * 83362000 LA R0,2 SHOW PRIVILEGED OPERATION 83364000 B EIEXITI EXIT POINT FOR INTERRUPTS 83366000 EIOC3 EQU * 83368000 LA R0,3 EXECUTE INTERRUPT 83370000 B EIEXITI EXIT POINT FOR INTERRUPTS 83372000 EIOC4 EQU * 83374000 LA R0,4 PROTECTION INTERRUPT 83378000 B EIEXITI EXIT POINT FOR INTERRUPTS 83380000 *EIOC5 EQU * 83382000 * LA R0,5 ADDRESSING INTERRUPT 83384000 * B EIEXITI EXIT POINT FOR INTERRUPTS 83386000 EIOC6A EQU * NO NEED FOR SEPARATE CASES CEH 83388000 EIOC6 EQU * 83390000 LA R0,6 SPECIFICATION INTERRUPT 83392000 B EIEXITI EXIT POINT FOR INTERRUPTS 83394000 *EIOC7 EQU * 83396000 * LA R0,7 DATA EXCEPTION 83398000 * B EIEXITI EXIT POINT FOR INTERRUPTS 83400000 EIOCA EQU * 83402000 LA R0,10 DECIMAL OVERFLOW 83404000 B EIEXITI EXIT POINT FOR INTERRUPTS 83406000 SPACE 5 83408000 * ENTERED WHEN PROGRAM BRANCHES OUT OF RANGE 83410000 EIIAOUT EQU * 83412000 MVI ECFLAG1,$ECBRN14 HOPE FOR NORMAL RETURN 83414000 L R14,ECR14SAV GET RETURN @, ORIGINAL 83416000 LA R14,0(R14) REMOVE LEADING BYTE 83418000 CR RIA,R14 WAS BRANCH TO THIS ADDR ? 83420000 BE EIITAILC YES, PERFORM A NORMAL RETURN M 83422000 MVI ECFLAG1,$ECBROUT WAS ACTUAL BRANCH OUT OF PROG 83424000 LA R1,EICCBROU SHOW @ BRANCHED OUT 83426000 NI ECPRFLG3,ECNOSPI MAKE SURE SPIE IS OFF FOR SAFETY 83427000 B EIITIA GO, HAVE @ STORED, QUIT M 83428000 EJECT 83430000 *********************************************************************** 83432000 * * 83434000 * INTERRUPT HANDLER * 83436000 * * 83438000 *********************************************************************** 83440000 SPACE 2 83442000 EISPIEXT EQU * 83444000 USING *,R15 83446000 MVC ECINTCOD(2),2(R1) SAVE INTERRUPT CODE 83448000 BR R14 RETURN TO OS CONTROL 83450000 DROP R15 DROP TEMP REG 83452000 SPACE 83454000 SPACE 5 83456000 *********************************************************************** 83458000 * EXIT AND RETURN CODE * 83460000 *********************************************************************** 83462000 SPACE 2 83464000 EIEXITI EQU * 83466000 STH R0,ECINTCOD SAVE INTO INTERRUPT CODE 83468000 EISPIERT EQU * 83470000 MVI ECFLAG1,0 RESET, NEEDED BY REPLACE MONITOR 83472000 LH R1,ECINTCOD NOTE:NEED THIS WHEN ENTERED AT EISPIERT L 83474000 ALR R1,R1 DOUBLE FOR HALFWORD INDEX L 83476000 LH R1,EICOFFS(R1) GET OFFSET TO MESSAGE BLOCK 83478000 LA R1,EICC0(R1) GET @ OF MESSAGE 83480000 EIITIA EQU * 83482000 ST R1,ECERRAD STORE @ IN ECONTROL 83484000 MVC ECBSTK(4),ECBCUR SAVE THE CURRENT BR STK PNTR 83485000 ST RSTK,ECRSTK SAVE THE STACK POINTER 83486000 N RCC,=XL4'3F000000' REMOVE @ & ILC (WHICH IS WRONG) 83488000 L RIA,EIRIA RELOAD ADDR. OF NEXT INSTR. CEH 83489000 ALR RCC,RIA PUT THE @ AND CC TOGETHER 83490000 IC RIA,EICTB2 GET ILC FROM LAST INST L 83492000 SLL RIA,29 SHIFT ILC TO EXTREME LEFT L 83494000 OR RCC,RIA COMPLETE PSW IN RCC L 83496000 ST RCC,ECILCMSK SAVE INTO THE PSW 83498000 SPACE 5 83500000 * THIS SECTION TESTS FOR AN XOPC SPIE BEING SET 83502000 * IF AN INTERRUPT OCCURS AND AN XOPC SPIE HAS NOT BEEN 83504000 * SET ABNORMAL USER TERMINATION IS PERFORMED. IF A SPIE 83506000 * HAS BEEN SET AND THE INTERPRETER IS NOT ALREADY CATCH- 83508000 * ING AN INTERRUPT, THE SPIE EXIT ADDRESS BECOMES THE 83510000 * ADDRESS OF THE NEXT INSTRUCTION AND EXECUTION CONTINUES 83512000 EITSTST EQU * 83516000 TM ECPRFLG3,ECINHDST TEST IF ALREADY HANDLING AN INTERUPT 83518000 BO EIITAILC IF SO, GO AHEAD AND TERMINATE 83520000 TM ECPRFLG3,ECSPISET TEST IF CATCHING INTERRUPTS 83522000 BNO EIITAILC IF NO SPIE SET, TERMINATE 83524000 LH R1,ECINTCOD GET THE INTERRUPT CODE IN A REGISTER 83526000 LA R1,16(R1) SHIFT 16 MORE THAN INTRPT CODE 83527000 STC R1,EISPISFT+3 STORE INTERRUPT CODE IN SHIFT INSTR 83528000 L R1,ECPRSCDE GET THE INT CODES TO BE CAUGHT 83530000 EISPISFT SLL R1,$ SHIFT TO SEE IF THIS INT CAUGHT 83532000 LTR R1,R1 COMPARE SHIFTED REGISTER TO ITSELF 83534000 BNM EIITAILC IF RESULT NOT MINUS DO NOT CATCH 83536000 MVC ECPRIRGS(8),ECREG0 SAVE USER REGS 0 AND 1 83538000 MVC ECREG0(8),ECPSW SAVE PSW IN USER REGS 0 AND 1 83540000 L RIA,ECPRSPIE PUT SPIE EXIT ADDR FOR BRANCH 83542000 OI ECPRFLG3,B'01000000' NOW IN INTERRUPT HANDLING STATE 83544000 B EIFINB TREAT AS HAVING EXECUTED BRANCH INST 83546000 EIITAILC EQU * 83548000 AIF (NOT &$FLOTE).EINOFL3 SKIP IF NO FLOATINGS 83550000 STD F0,ECFPREGS STORE FP REGS 83552000 STD F2,ECFPREGS+8 STORE FP REGS 83554000 STD F4,ECFPREGS+16 STORE FP REGS 83556000 STD F6,ECFPREGS+24 STORE FP REGS 83558000 .EINOFL3 ANOP 83560000 TM ECFLAG0,$ECSPIEB DO WE NEED TO UNDO SPIE 83562000 BZ EIECRET NO, RETURN 83564000 L R1,ECPICA GET PICA ADDR BACK 83566000 $SPIE ACTION=(RS,(1)) RESTORE PREVIOUS XSPIEBLK 83568000 NI ECFLAG0,255-$ECSPIEA WE WILL HAVE TO RESPIE 83570000 EIECRET EQU * 83572000 $RETURN RGS=(R14-R12) 83574000 TITLE '*** EXECUT - MAIN INSTRUCTION FETCH AND DECODING LOOP' 83576000 *********************************************************************** 83578000 * * 83580000 * MAIN INTERPRETER LOOP HEAD * 83582000 * * 83584000 * ALL SUCCESSFUL BRANCHES PASS THROUGH EIFINB, WHERE * 83586000 * CHECKING FOR ILLEGAL BRANCHES IS DONE. CHECKING IS * 83588000 * ALSO DONE FOR TIMER RUNOUT. * 83590000 * * 83592000 * OTHER INSTRUCTIONS (UNSUCCESSFUL BRANCHES INCLUDED) * 83594000 * PASS THROUGH EIFIN OR EIFINRR AS APPROPRIATE. * 83596000 * * 83598000 *********************************************************************** 83600000 SPACE 4 83602000 EIFINB EQU * 83604000 * MOVE INSTRUCTION TO BRANCH STACK 83606000 L R1,ECBCUR GET POINTER TO PRES STK SLOT 83608000 USING ECBRSTKD,R1 SET UP TEMPORARY USING 83610000 L R1,ECBSLINK GET POINTER TO NEXT AVAILABLE SLOT 83611000 MVC ECBSTENT+4(L'ECBSTENT-4),ECSTENT+4 MOVE ENTRY OVER 83612000 ST R1,ECBCUR SAVE ADDRESS OF THIS SLOT FOR LATER 83614000 DROP R1 DROP TEMP REG 83616000 SPACE 83618000 * CHECK IF BRANCH IS LEGAL 83620000 LA RIA,0(RIA) REMOVE 1ST BYTE OF BRANCH @ 83622000 ST RIA,EIRIA SAVE CURRENT INSTR. ADDR. CEH 83623000 C RIA,ECFADL CMPR FOR BELOW LOWEST FAKE 83624000 BL EIIAOUT BRANCH IF OUT OF RANGE - ERROR 83626000 C RIA,ECFADH CMPR FOR OVER HIGHEST FAKE 83628000 BNL EIIAOUT BRANCH IF OUT OF RANGE - ERROR 83630000 AIF (NOT &$ALIGN).EIFT1 SKIP IF MACHINE REQUIRES ALIGNMENT 83632000 ST RIA,ECTSAVE SAVE @: MUST DO CHECK SLOW WAY 83634000 TM ECTSAVE+3,EIALHALF DO WE HAVE HALFWORD ALIGN ? 83636000 BO EIOC6 NO - SPEC. ERROR 83638000 AGO .EIFT2 SKIP OTHER ALIGN CODE 83640000 .EIFT1 ANOP 83642000 LH R0,0(RIA,RMEM) QUICK ALIGN CHECK 83644000 .EIFT2 ANOP 83646000 SPACE 83648000 * IF TIMER RUNOUT OCCURS, ASSIST SETS ECFLAG1=$ECTIMEX. 83650000 * EXECUT DISCOVERS THIS NEXT TIME BRANCH IS SUCCESSFUL. 83652000 AIF (&$TIMER EQ 0).EINOTOA SKIP IF NO TIMER AT ALL 83654000 CLI ECFLAG1,$ECTIMEX IS TIMER RUNOUT FLAG SET ? 83656000 BNE EIFINRR NO - FETCH AND PROCESS INSTR AT NEW X83658000 BRANCH ADDRESS 83660000 * TIMER RUNOUT HAS OCCURRED - FLAG IT. ECFLAG1 83662000 * ALREADY SET. 83664000 LA R1,EICCTIMB SHOW @ OF OVER TIME MESSAGE 83666000 B EIITIA JUMP TO EXIT SECTION M 83668000 AGO .EINOTOB 83670000 .EINOTOA ANOP 83672000 B EIFINRR BRANCH TO FETCH AND PROCESS INSTR 83674000 .EINOTOB ANOP 83676000 SPACE 4 83678000 *********************************************************************** 83680000 * * 83682000 * HERE BEGINS THE PRIMARY INSTR FETCH AND * 83684000 * DECODING SECTION. * 83686000 * * 83688000 *********************************************************************** 83690000 SPACE 3 83692000 * CHECK FOR EXCEEDING TOTAL INSTRUCTION COUNT -- 83694000 * 83696000 * CONTROL IS PASSED TO EIFIN AFTER INTERPRETATION OF 83698000 * ALL INSTRUCTIONS EXCEPT SUCCESSFUL BRANCHES AND RR 83700000 * INSTRUCTIONS. CONTROL IS PASSED TO EIFINRR AFTER 83702000 * RR'S, AND TO EIFINB AFTER SUCCESSFUL BRANCHES. 83704000 EIFIN EQU * 83706000 L RIA,EIRIA RESTORE INSTR @ REG 83708000 EIFINRR EQU EIFIN RR NOW MERGES WITH OTHER CEH 83710000 L R0,ECILIMT GET INSTRUCTION COUNTER 83712000 BCT R0,EIGO DECREMENT COUNTER 83714000 * COUNTER LIMIT EXCEEDED -- BR TO INTERRUPT ROUTINE 83716000 EICNTINT EQU * 83718000 ST R0,ECILIMT RESTORE INSTR LIMIT FOR STATS 83720000 MVI ECFLAG1,$ECTIMEX SHOW INSTR LIMIT EXCEEDED 83722000 LA R1,EICCTIME GET @ OF TIME MESSAGE 83724000 NI ECPRFLG3,ECNOSPI MAKE SURE SPIE IS OFF FOR SAFETY 83725000 B EIITIA BR TO EXIT ROUTINE M 83726000 EIGO EQU * 83728000 C R0,ECPRCMPR CMPR CLOCK AGAINST USER LIMIT 83730000 BNE EICLKOK CONTINUE ON IF NO COUNT LIMIT EXCEED 83732000 TM ECPRFLG4,ECLKADR TEST TO SEE IF CLOCK EXIT ADDR GIVEN 83732100 BNO EICNTINT IF NO ADDR GIVEN - DO TIMER EXIT 83732200 L RIA,ECPRCLEA PREPARE BRANCH TO GIVEN EXIT ADDR 83732300 MVC ECPRCMPR(4),=F'-1' DISARM THE CLOCK FROM FURTHER INTRPS 83732400 B EIFINB TREAT AS BR INST SINCE CAUSE OF INTR 83732500 EICLKOK EQU * NO CLOCK INTERRUPT HAS OCCURED 83732600 ST R0,ECILIMT RESTORE COUNTER 83734000 SPACE 2 83736000 * PRIMARY INSTRUCTION FETCH 83738000 LA RWK14,0(RIA,RMEM) OBTAIN PHYSICAL REAL ADDRESS 83740000 L RSTK,ECSTLINK OBTAIN ADDRESS OF NEXT STACK SLOT 83742000 STM RIA,RCC,ECSTIADD SAVE INSTRUCTION ADDRESS, CC, MASK 83744000 MVC ECSTINST,0(RWK14) MOVE 6 BYTES INTO THE NEXT SLOT 83746000 IC ROP,ECOP GET OPCODE INTO A REGISTER 83748000 SPACE 2 83750000 * FETCH MAIN TABLE ENTRY BY OPCODE INDEXING 83752000 EIEXPEN EQU * 83754000 SR R1,R1 R1 IS ZERO FOR IC 83756000 IC R1,EIOPCDTB(ROP) FETCH POINTER TO MAIN TABLE 83758000 SLL R1,3 MULTIPLY BY 8 FOR MAIN TAB INDEX 83760000 LA R1,EICONTAB(R1) GET @ OF CONTROL TABLE ENTRY 83762000 MVC EICTNTRY(EICTE$L),0(R1) MOVE TABLE ENTRY TO WORK AREA 83764000 TM EICTB1,EIEXOPCD DOES OPCODE TELL ALL ? 83766000 BZ EICHKF$A IF YES, BR TO CHK FACILITIES ON 83768000 SPACE 2 83770000 * OPCODE DOES NOT TELL ALL - - - GET TABLE ENTRY 83772000 * FOR EXTENDED OPCODE INSTRUCTION 83774000 L R1,EIEXTTAB GET ADDRESS OF TOP SEC TABLE 83776000 MVC EISHFTIN+3(1),EI#SHIFT(R1) PUT SHIFT # INTO INST. L 83778000 IC R2,ECOPEX GET OPCODE EXTENSION BYTE 83780000 * THE FOLLOWING SHIFT INSTRUCTION WILL BE MODIFIED DURING 83782000 * EXECUTION TO SHIFT THE CORRECT AMOUNT FOR EACH 83784000 * DIFFERENT EXTENDED OPCODE. 83786000 EISHFTIN SRL R2,$ SHIFT FOR INDEX INTO BYTE TABLE 83788000 C R2,EIMAXIND(R1) CMPR SHFT VALUE TO MAX 83790000 BH EIOC1 BR IF OPCODE IS BAD 83792000 IC R2,EICTE$L(R2,R1) GET BYTE TABLE ENTRY 83794000 LTR R2,R2 TEST FOR LEGAL EXTENDED OP CODE 83796000 BZ EIOC1 BRANCH IF INVALID OPCODE 83798000 LA R1,0(R2,R1) GET ADDRESS OF TABLE ENTRY 83800000 MVC EICTNTRY(EICTE$L),0(R1) FETCH EXTENDED OPCD TAB ENTRY 83802000 SPACE 2 83804000 * CHECK FOR INSTRUCTION TRACE AND IECF 83806000 EICHKF$A EQU * 83808000 TM ECPRFLG1,ECPROPON CHECK IF ANY OPTIONS = ON 83810000 BNZ EITRIC BRANCH IF TRACE OR IECF ON 83812000 SPACE 2 83814000 * INCREMENT INSTRUCTION ADDRESS REGISTER 83816000 * 83818000 * ** NOTE ** DO NOT CHANGE THE ORDER OF THE NEXT FEW 83820000 * INSTRUCTIONS WITHOUT FIRST SEEING AND MODIFYING THE 83822000 * EX INSTR CODE (EIEX) 83824000 EIINCPSW EQU * 83826000 SR R2,R2 ZERO FOR IC INST L 83828000 IC R2,EICTB2 GET THE LENGTH OF THE INSTRUCTION 83830000 AR RIA,R2 INCREMENT INSTRUCTION ADDRESS REG 83832000 SPACE 2 83834000 * CHECK IF OPCODE IS LEGAL ON THE MACHINE 83836000 * PRESENTLY BEING EMULATED 83838000 * NOTE: THE MASK FOR THE FOLLOWING TM INSTRUCTION WAS 83840000 * INSERTED EARLIER, EITHER AT INITIALIZATION (AS 370) 83842000 * OR WHEN EVER AN XOPC INSTRUCTION IS EXECUTED WHICH COULD 83844000 * CHANGE THE MACHINE EMULATION FLAGS IN THE PRCB 83846000 EITSTMSK TM EICTB1,$ TEST TAB ENTRY FOR VALID OP CODE 83848000 ST RIA,EIRIA SAVE FOR RESTORING LATER CEH 83849000 BZ EIOC1 BRANCH TO INTER ROUTINE IF INVALID 83850000 SPACE 2 83852000 * CHECK IF THIS IS A PRIVILEGED INSTRUCTION 83854000 EIOPOK EQU * 83856000 TM EICTB1,EIPRIVOP IS THIS A PRIV INSTR ? 83858000 BO EICHKST IF YES, BRANCH TO CHECK STATE 83860000 SPACE 2 83862000 * THE FOLLOWING SECTION DECODES THE SECOND BYTE OF THE 83864000 * INSTRUCTION AND PERFORMS A MULTI-WAY BRANCH TO GET 83866000 * THE NEEDED INFORMATION IN THE PROPER PLACES 83868000 * EXPECTED LATER IN THE SPECIAL ROUTINES. 83870000 EI2BDECD EQU * 83872000 CLI ECOP,X'E1' CHECK FOR ONLY REGISTER XDUMP 83874000 BE EIXIOSR SKIP EXTRANEOUS DECODEING FOR XDUMPR 83876000 SR R7,R7 CLEAR BYTE REGISTER 83878000 IC R7,ECI2 GET 2ND BYTE OF INSTR 83880000 TM EICTB3,EIB2IORL TEST TO DETERMINE DECODING NEEDED 83882000 BZ EIRRX4 2 REGS - MULT BY 4 FOR INDEX 83884000 BO EI2BMERG IF IMMED OR LENGTH, DONE 83886000 SPACE 2 83888000 * PROCESS 2ND BYTE AS LL X 1 83890000 LR R9,R7 COPY 2ND BYTE OF INSTR 83892000 SRL R7,4 R7 = L1 83894000 N R9,=XL4'0F' R9 = L2 83896000 B EI2BMERG BRANCH TO MERGE BACK 83898000 SPACE 2 83900000 * PROCESS 2ND BYTE AS RR X 4 83902000 * (EVEN/ODD REGISTER CHECKING DONE ALSO) 83904000 EIRRX4 EQU * 83906000 SPACE 2 83908000 * THIS SECTION TESTS FOR EVEN ODD REGISTERS WHEN 83910000 * THEY ARE NEEDED IN AN INSTRUCTION. 83912000 MVC *+7(1),EICTB5 MOVE TABLE BYTE 5 INTO TM INST 83914000 TM ECR1R2,$ TEST EVEN/ODD REG ** MASK MOVED IN** 83916000 BNZ EIOC6 IF RESULT NOT ZERO SOC 6 INT 83918000 EIRRX4A EQU * 83920000 LR R9,R7 COPY 2ND BYTE OF INSTR 83922000 N R9,=F'15' REMOVE 1ST REG, LEAVING 2ND ONLY 83924000 SLL R9,2 GET R2 FIELD*4 FOR INDEXING 83926000 SRL R7,4 GET R1 FIELD*4 83928000 SLL R7,2 FOR INDEXING 83930000 L R8,ECREGS(R7) GET VALUE IN USER REG (R1) 83932000 L R10,ECREGS(R9) GET VALUE IN USER REG (R2) 83934000 SPACE 2 83936000 *********************************************************************** 83938000 * * 83940000 * AT THIS POINT IN THE DECODING, THE FOLLOWING INFORMATION * 83942000 * IS CONTAINED IN REGISTERS R7 - R10: * 83944000 * * 83946000 * --2 REGS SPECIFIED IN INSTR+1 * 83948000 * * 83950000 * R7 = # OF THE 1ST REG MULT BY 4 * 83952000 * R8 = CONTENTS OF THE 1ST REG * 83954000 * R9 = # OF THE 2ND REG MULT BY 4 * 83956000 * R10 = CONTENTS OF THE 2ND REG * 83958000 * * 83960000 * --2 LENGTHS OR IMMED FIELDS SPEC IN INSTR+1 * 83962000 * * 83964000 * R7 = THE 1ST LENGTH OR IMMED FIELD * 83966000 * R8 = UNUSED * 83968000 * R9 = THE 2ND LENGTH OR IMMED FIELD * 83970000 * R10 = UNUSED * 83972000 * * 83974000 * --1 LENGTH OR IMMED FIELD SPEC IN INSTR+1 * 83976000 * * 83978000 * R7 = THE LENGTH OR IMMED FIELD * 83980000 * R8 = UNUSED * 83982000 * R9 = UNUSED * 83984000 * R10 = UNUSED * 83986000 * * 83988000 *********************************************************************** 83990000 SPACE 2 83992000 * MERGE BACK AFTER 2ND BYTE DECODING -- CHECK IF 83994000 * THIS IS AN RR INSTR; IF SO, BRANCH TO PROCESS 83996000 EI2BMERG EQU * 83998000 TM EICTB1,EIRR IS THIS AN RR INSTR ? 84000000 BNO EI2HDECD IF NOT, BR TO DECODE 2ND HALFWORD 84002000 LH R1,EICTDISP GET DISP TO SPECIAL ROUTINE 84004000 B EISPEJMP(R1) BRANCH TO SPECIAL ROUTINE 84006000 SPACE 2 84008000 * DECODE 2ND HALFWORD OF THE INSTRUCTION. INFORMATION 84010000 * IS PUT WHERE EXPECTED LATER. ADDRESS IS CHECKED FOR 84012000 * ALIGNMENT ERROR. 84014000 EI2HDECD EQU * 84016000 LH RWK0,ECBD LOAD 1ST B1D1 IN WORK REG FOR INSUB 84022000 BAL RLINK,EIBASDSP HAVE INSUB EVALUATE B1D1 84024000 LR RAD1,RWK0 COPY ADDR INTO 1ST ADDR REG 84026000 TM EICTB3,EIH2NODX CHECK IF INDEX REG NEEDED 84028000 BO EINODX BRANCH IF B/D ONLY 84030000 LTR R9,R9 TEST IF INDEX REG = 0 84032000 BZ EINODX BRANCH IF ZERO 84034000 LA RAD1,0(RAD1,R10) ZERO OUT HIGH ORDER BYTE 84036000 SPACE 2 84038000 * THIS SECTION CHECKS FOR AND PERFORMS OPERAND ALIGNMENT 84040000 * CHECKING IF NEEDED 84042000 EINODX EQU * 84044000 TM ECPRFLG2,ECALNCHK IS ALIGNMENT CHECKING = ON ? 84046000 BNO EINOCHK BRANCH IF NOT 84048000 MVC EITSMK+1(1),EICTB4 MOVE MASK INTO TM INSTR 84050000 STC RAD1,EIWORK ST LOW ORDER BYTE OF @ IN WORK AREA 84052000 EITSMK TM EIWORK,$ TEST FOR ALGN ERR **MASK MOVED IN** 84054000 BNZ EIOC6A BRANCH & RESET RIA ON ALGN ERROR L 84056000 SPACE 2 84058000 * CHECK 1ST OPRND ADDR FOR PROPER RANGE AND 84060000 * STORAGE MODIFICATION. 84062000 EINOCHK EQU * 84064000 MVC EIWORK(1),EICTB3 STORE CONTROL BYTE IN WORK CPP 84065000 TM EICTB1,EINOCNOW DO WE CHECK MOD STOR RANGE NOW 84066000 BNO EI2HEND BRANCH IF NOT 84068000 IC R2,EICTB6 GET MOD STORE LENGTH BYTE 84072000 LTR RWK0,R2 GET LENGTH IN RIGHT REG 84074000 BNZ EIHAVLEN BRANCH IF RWK0 HAS LENGTH 84076000 LA RWK0,1(R7) GET LENGTH FROM THE INSTR 84078000 EIHAVLEN EQU * 84080000 LR RWK1,RAD1 COPY ADDR TO BE CHECKED 84082000 BAL RLINK,EIMSFCHK BR TO ADDR CHECKING ROUTINE 84084000 SPACE 2 84086000 *********************************************************************** 84088000 * * 84090000 * AT THIS POINT IN THE DECODING PROCESS, THE FOLLOWING * 84092000 * INFORMATION IS CONTAINED IN THE SPECIFIED REGISTERS: * 84094000 * * 84096000 * (NOTE: NO RR-TYPE INSTRS IF HERE) * 84098000 * * 84100000 * R7 - SAME AS IN COMMENT BLOCK ABOVE * 84102000 * R8 - SAME AS IN COMMENT BLOCK ABOVE * 84104000 * R9 - SAME AS IN COMMENT BLOCK ABOVE * 84106000 * R10 - SAME AS IN COMMENT BLOCK ABOVE * 84108000 * RAD1 - CONTAINS THE CALCULATED RELATIVE ADDRESS FROM THE * 84110000 * 2ND HALFWORD OF THE INSTR (B1-D1 OR I1-B1-D1) * 84112000 * * 84114000 * NOTE: RAD1 IS RELOCATED TO REAL IFF THIS IS NOT A BRANCH * 84116000 * INSTRUCTION. --- * 84118000 * * 84120000 *********************************************************************** 84122000 SPACE 2 84124000 EI2HEND EQU * 84126000 TM EICTB2,EILEN6 IS INSTR LENGTH = 6 ? 84128000 BO EI3HDECD BRANCH IF YES 84130000 TM EICTB3,EIBRINST IS THIS A BRANCH INSTRUCTION ? 84132000 BO EI4JUMP YES - DON'T RELOCATE RAD1 84134000 ALR RAD1,RMEM RELOCATE ADDRESS TO REAL 84136000 AIF (&$S370 NE 2).EITRX SKIP IF ON A REAL 370 84138000 * 84140000 * IF FAKING ALIGNMENT IS NECESSARY, DO IT ! 84142000 * 84144000 TM ECPRFLG2,ECALNCHK IS ALIGNMENT CHECKING ON ? 84146000 BZ EI4JUMP NO - SKIP FAKING CODE 84148000 TM EICTB4,EIALDOBL DOES THIS INSTR NEED ALIGN ? 84150000 BZ EI4JUMP NO - SKIP FAKING CODE 84152000 CLI ECOP,X'90' IS THIS A STM? CPP 84152100 BE EI4JUMP IF YES SKIP FAKING CODE CPP 84152200 CLI ECOP,X'98' IS THIS AN LM? CPP 84152300 BE EI4JUMP IF YES, SKIP FAKING CODE CPP 84152400 CLI ECOP,X'44' IS THIS AN EX? CPP 84152500 BE EI4JUMP IF YES, SKIP FAKING CODE CPP 84152600 LTR RWK14,RAD1 SAVE FOR LATER, SET CC ^= 0 84154000 MVC EIDUBLWD(8),0(RAD1) MOVE A MAX OF 8 BYTES OVER 84156000 LA RAD1,EIDUBLWD LOAD @ OF ALIGNED FIELD 84158000 .EITRX ANOP 84160000 EI4JUMP EQU * 84162000 LH RWK1,EICTDISP GET DISP FOR BR TO SPECIAL ROUTINE 84164000 B EISPEJMP(RWK1) BRANCH TO SPECIAL ROUTINE 84166000 AIF (&$S370 NE 2).EITRXA SKIP IF ON A REAL 370 84168000 EIDUBLWD DC D'0' USED FOR FAKING 360 ALIGNMENT 84170000 .EITRXA ANOP 84172000 SPACE 2 84174000 * THIS SECTION DECODES THE THIRD HALFWORD OF THE 6 BYTE 84176000 * SS-TYPE INSTRUCTION, AND THEN BRANCHES TO A SPECIAL 84178000 * ROUTINE TO COMPLETE PROCESSING. 84180000 EI3HDECD EQU * 84182000 LH RWK0,ECB2D2 GET 3RD HALFWORD OF THE INSTR 84184000 BAL RLINK,EIBASDSP CALCULATE RELATIVE ADDR (B2D2) 84186000 LR RAD2,RWK0 COPY ADDR INTO 2ND ADDR REG 84188000 SPACE 2 84190000 * CHECK 2ND OPRND ADDRESS FOR PROPER RANGE 84192000 TM ECFLAG0,$ECPROT IS ABSOLUTE PROTECT FLAG ON ? 84194000 BZ EI3HEND IF NOT, BRANCH AROUND INSUB CALL 84196000 CLI ECOP,X'E0' IS THIS AN X-PSEUDO INSTR ? 84198000 BE EI3HEND YES - DON'T CHECK THIS ADDRESS 84200000 LR RWK1,RAD2 COPY ADDRESS FOR CHECKING 84202000 LR RWK0,R7 ASSUME ONE LENGTH FOR OPERANDS 84204000 TM EICTB3,EIB2IORL TEST TO FIND LENGTH TYPE 84206000 BO *+6 IF ONE LENGTH BRANCH AROUND 84208000 LR RWK0,R9 GET RIGHT LENGTH 84210000 ALR RWK0,RWK1 GET @ OF HIGHEST BYTE ACCESSED 84212000 BAL RLINK,EIFTHCHK CHECK ADDR FOR FETCH RANGE 84214000 *********************************************************************** 84216000 * * 84218000 * REGISTER USAGE FOR SS-TYPE INSTRUCTIONS IS AS FOLLOWS: * 84220000 * * 84222000 * R7 - CONTAINS EITHER: * 84224000 * A. THE LENGTH OR IMMED FIELD AS A FULL BYTE, OR * 84226000 * B. THE 1ST OF 2 LENGTHS OR IMMED FIELDS * 84228000 * R8 - IS UNUSED * 84230000 * R9 - IS EITHER UNUSED OR CONTAINS THE 2ND OF 2 LENGTHS OR * 84232000 * IMMEDIATE FIELDS * 84234000 * RAD1 - CONTAINS THE 1ST RELATIVE ADDRESS (B1D1) * 84236000 * RAD2 - CONTAINS THE 2ND RELATIVE ADDRESS (B2D2) * 84238000 * * 84240000 * NOTE: THE ADDRESSES IN RAD1 AND RAD2 ARE RELOCATED FOR * 84242000 * ASSIST. --- * 84244000 * * 84246000 *********************************************************************** 84248000 SPACE 2 84250000 EI3HEND EQU * 84252000 AR RAD1,RMEM RELOCATE 1ST FAKE @ TO REAL 84254000 AR RAD2,RMEM RELOCATE 2ND FAKE @ TO REAL 84256000 MVC EIQSS(2),ECOP MOVE OPCODE & LENGTH(S) INTO INSTR 84258000 LH RWK1,EICTDISP GET DISP FOR BR TO SPECIAL ROUTINE 84260000 B EISPEJMP(RWK1) BRANCH TO SPECIAL ROUTINE 84262000 SPACE 1 84264000 EIRIA DC F'0' SAVE AREA FOR INSTRUCTION ADDR 84266000 SPACE 5 84268000 EISPEJMP EQU * USED TO CALCULATED JUMP ADDRESS 84270000 * 84272000 *------------> THIS MARKS THE END OF THE PRIMARY FETCH/DECODE LOOP 84274000 TITLE '*** EXECUT - CODE CALLED FROM MAIN FETCH/DECODE LOOP' 84276000 * THE FOLLOWING CODE COMPRISES SOME OUT-OF-LINE 84278000 * ROUTINES BRANCHED TO FROM THE ABOVE PRIMARY FETCH 84280000 * AND DECODING LOOP: 84282000 SPACE 2 84284000 * CHECK STATE ---- PRIV OPCODE WAS ENCOUNTERED 84286000 EICHKST EQU * 84288000 TM ECPRFLG2,ECSUPRST ARE WE IN SUPERVISOR STATE ? 84290000 BO EI2BDECD IF IN SUPER STATE BRANCH TO DECODE 84292000 B EIOC2 IF NOT IN SUPER STATE SOC 2 FLAGGED 84294000 SPACE 2 84296000 * THIS SECTION PROCESSES INSTRUCTION TRACE AND 84298000 * COUNTING FACILITIES 84300000 SPACE 2 84302000 * INCREMENT THE INSTRUCTION EXECUTION COUNT FACILITY 84304000 * COUNTERS 84306000 EITRIC EQU * 84306500 TM ECPRFLG1,ECPRIECF IS THE IECF ACTIVE NOW? 84308000 BNO EITRICB IF NOT ON GO SEE IF TRACE IS ON 84310000 C RIA,ECPRICH CMPR INSTR @ WITH HIGH ADDR LIMIT 84312000 BH EITRICB BRANCH IF OUT OF RANGE 84314000 C RIA,ECPRICL CMPR INSTR @ WITH LOW ADDR LIMIT 84316000 BL EITRICB BRANCH IF OUT OF RANGE 84318000 LR RWK1,RIA MOVE INSTR @ REG TO WORKABLE REG 84320000 S RWK1,ECFADL SUBTRACT FOR INSTRUCTION OFFSET 84322000 L R7,ECPRICA GET BEGINNING ADDRESS OF COUNT AREA 84324000 LH RWK14,0(RWK1,R7) LOAD THE PROPER HALFWORD COUNTER 84326000 LA RWK14,1(RWK14) INCREMENT THE INSTRUCTION COUNTER 84328000 STH RWK14,0(RWK1,R7) RESTORE THE INCREMENTED COUNTER 84330000 * PROCESS ----> TRACE FACILITY 84348000 EITRICB EQU * 84350000 TM ECPRFLG1,ECPRTRCE IS THE TRACE FACILITY ON 84352000 BNO EIINCPSW BRANCH IF FACILITY NOT ON 84354000 C RIA,ECPRTRAH COMPARE INSTR @ WITH HIGH LIMIT 84356000 BH EIINCPSW BRANCH IF OUT OF RANGE 84358000 C RIA,ECPRTRAL CMPR INSTR @ WITH LOW LIMIT 84360000 BL EIINCPSW BRANCH IF OUT OF RANGE 84362000 MVC EITRMSIN+4(10),EIBLANKS BLANK OUT INSTR AREA 84364000 XHEXO RIA,EITRMSAD CONVERT INSTR @ TO HEX 84366000 MVC EITRMSAD(2),EIBLANKS BLANK OUT 1ST TWO BYTE OF @ 84368000 LM R0,R1,ECSTCCPM FETCH INSTR FROM INSTR STACK 84370000 SLDL R0,16 RR AND RX CODE IN REG 0 84372000 XHEXO R0,EIWORK CONVERT INSTR TO HEX (4 BYTES) 84374000 TM ECSTINST,EISSINST IS THIS AN SS INSTR ? 84376000 BNO EINOTSS BRANCH IF NOT 84378000 XHEXO R1,EIWORK+8 CONVERT INSTR TO HEX (LAST 2 BYTES) 84380000 EINOTSS EQU * 84382000 LA RWK1,EITRMSIN GET @ OF HEX INSTR 84384000 BAL R2,EIMOVINS MOVE HEX INSTR INTO FORMAT 84386000 $PRNT EITRMSG,EITRMSGL,EICNTEXC PRINT INSTR FOR TRACE AND BR X84388000 OUT IF LINE COUNT EXCEEDED 84390000 B EIINCPSW RETURN TO MAIN PROGRAM LOOP 84392000 * WORK AREAS USED BY THE TRACE FACILITY 84394000 EITRMSG DC C' TRACE--> INSTR ADDR:' TRACE MESSAGE 84396000 EITRMSAD DC 8C' ' TRACE MESSAGE 84398000 DC C' INSTR: ' TRACE MESSAGE 84400000 EITRMSIN DC 14C' ' TRACE MESSAGE 84402000 EITRMSGL EQU *-EITRMSG LENGTH OF THE TRACE MESSAGE 84404000 EIWORK DC 16C' ' WORK AREA 84406000 EIBLANKS DC 10C' ' BLANKS USED IN TRACE 84408000 TITLE '*** EXECUT - RR PROCESSING ROUTINES' 84410000 *********************************************************************** 84412000 * * 84414000 * RR INSTRUCTION PROCESSING ROUTINES * 84416000 * * 84418000 *********************************************************************** 84420000 SPACE 5 84422000 * ********** NORMAL RR INSTRUCTION PROCESSING ********** 84424000 * 84426000 * 2 ENTRIES TO SEQUENCE --> 84428000 * LR SEPARATE SINCE CURRENT CC NOT CHANGED 84430000 * NR,CLR,OR,XR,CR,AR,SR,ALR,SLR,LPR,LNR,LCR,LTR NORMAL 84432000 SPACE 1 84434000 EILR EQU * LOAD REGISTER INST 84436000 ST R10,ECREGS(R7) LOAD R1 WITH VALUE FROM R2 84438000 B EIFINRR RETURN FOR NEXT INSTR 84440000 SPACE 1 84442000 EINORMRR EQU * NORMAL RR INSTRS 84444000 STC ROP,EIQRR PLACE ACTUAL OPCODE INTO INSTR 84446000 EIQRR LR $+R8,R10 EXECUTE RIGHT INSTRUCTION X84448000 ***** OPCODE MOVED IN ***** 84450000 ST R8,ECREGS(R7) SAVE RESULT IN OPERAND LOCATION 84452000 BAL RCC,EIFINRR GET CC, RETURN FOR NEXT INSTR 84454000 SPACE 2 84456000 * THIS SECTION PROCESSES THE BALR INSTRUCTION 84458000 EIBALR EQU * 84460000 LR RWK1,RIA COPY ADDR NEXT INSTR OVER 84462000 N RCC,=XL4'3F000000' LEAVE ONLY CC-PM IN RCC 84464000 AL RCC,=XL4'40000000' ADD ILC INTO PSW BEING BUILT 84466000 ALR RWK1,RCC NOW HAVE ILC-CC-PM-IA FIELDS 84468000 ST RWK1,ECREGS(R7) FAKE REGISTER GETS BUILT PSW 84470000 LTR R9,R9 TEST FOR NO BRANCHING R2 = 0 84472000 BZ EIFINRR NO BRANCH TREAT AS REG RR GET NEXT X84474000 INSTRUCTION 84476000 LR RIA,R10 PUT BRANCH ADDRESS IN PROPER REG 84478000 B EIFINB PROCESS SUCCESSFUL BRANCH 84480000 SPACE 2 84482000 * BRANCH ON COUNT REGISTER (BCTR) 84484000 EIBCTR EQU * 84486000 BCTR R8,0 DECREMENT VALUE IN FAKE R1 84488000 ST R8,ECREGS(R7) RESTORE VALUE TO FAKE REG 84490000 LTR R9,R9 IS R2 = 0 ? 84492000 BZ EIFINRR IF ZERO, NO BRANCH 84494000 LTR R8,R8 IS DECREMENTED VALUE = 0 ? 84496000 BZ EIFINRR IF ZERO, NO BRANCH 84498000 LR RIA,R10 PUT BRANCH @ IN RIGHT REG 84500000 B EIFINB PROCESS SUCCESSFUL BRANCH 84502000 SPACE 2 84504000 * BRANCH ON CONDITION REGISTER (BCR) 84506000 EIBCR EQU * 84508000 LTR R9,R9 IS R2 = 0 ? 84510000 BZ EIFINRR IF ZERO, NO BRANCH 84512000 SLL R7,2 GET MASK IN RIGHT SPOT 84514000 STC R7,EIQBCR+1 STORE MASK INTO INSTR 84516000 LR RWK1,RIA COPY @ OF NEXT SEQ INSTR 84518000 LR RIA,R10 PUT BRANCH ADDR IN RIGHT REG 84520000 SPM RCC SET REAL CC = FAKE CC 84522000 EIQBCR BC $,EIFINB *** MASK STORED IN *** 84524000 LR RIA,RWK1 RESTORE INSTR @ REG 84526000 B EIFINRR BRANCH FAILED 84528000 SPACE 1 84530000 * CHECK FOR FLOATING-POINT INSTR OR EXT FLOATING POINT 84532000 AIF (&$FLOTEX).EIXFPRR GO GENER CODE IF XFP IS OK 84534000 EIXFPRR EQU EIOC1 NOTE XFP INVAL OP IF NOT ALLOWED 84536000 AIF (&$FLOTE).EIFPRR GO GENERATE IF FLOAT PNT INST OK 84538000 EIFPRR EQU EIOC1 NOTE NOT ALLOWING FLOATINGS 84540000 AGO .EIFPRR2 84542000 .EIXFPRR ANOP 84544000 EIXFPRR EQU * CODE FOR XFP SAME AS FOR REGULAR FP 84546000 .EIFPRR ANOP 84548000 SPACE 2 84550000 * RR FLOATING POINT INSTRUCTIONS EXECUTED 84552000 EIFPRR EQU * FLOATING-PNT RR'S ENTER HERE 84554000 SPM RCC SET OUR CC SAME AS USER'S 84556000 EX R0,ECOP EXECUTE ACTUAL INSTR FROM THE STACK 84558000 BAL RCC,EIFINRR GET CC AND RETURN FOR NEXT INSTR 84560000 .EIFPRR2 ANOP 84562000 SPACE 2 84564000 * THE FOLLOWING CODE PROCESSES THE CLCL, MVCL 84566000 * INSTRUCTIONS 84568000 * 84570000 * ADDRESS CHECKING CODE FOR CLCL AND MVCL 84572000 EILONG EQU * 84574000 L RWK0,ECREGS+4(R7) GET LENGTH VALUE OF REG 2 PAIR 1 84576000 N R8,EILONGMK ZAP OUT UPPER BYTE OF ADDRESS 84578000 N RWK0,EILONGMK ZAP OUT UPPER BYTE OF LENGTH 84580000 BZ EILONG1 IF LENGTH = 0 DON'T CHECK ADDRESS 84582000 MVC EIWORK(1),EICTB3 STORE CONTROL BYTE IN WORK AREA 84584000 LR RWK1,R8 COPY ADDRESS TO BE CHECKED 84586000 BAL RLINK,EIMSFCHK BRANCH TO ROUTINE CHECK FIRST @ 84588000 SPACE 2 84590000 * FIRST ADDRESS IS OKAY --- CHECK THE SECOND 84592000 EILONG1 EQU * 84594000 L RWK0,ECREGS+4(R9) GET VALUE (LENGTH) OF 2ND REG PAIR 2 84596000 N R10,EILONGMK ZAP OUT UPPER BYTE OF SECOND ADDRESS 84598000 N RWK0,EILONGMK ZAP OUT UPPER BYTE OF SECONG LENGTH 84600000 BZ EILONG2 IF LENGTH 0 DON'T CHECK ADDRESS 84602000 IC RWK1,EICTB3 GET CONTROL BYTE 84604000 SLL RWK1,2 SHIFT BECAUSE WOKING ON SECOND OPRND 84606000 STC RWK1,EIWORK PUT TAB ENTRY IN INSUB WORK AREA 84608000 LR RWK1,R10 PUT ADDR WHERE INSUB EXPECTS IT 84610000 BAL RLINK,EIMSFCHK BRANCH TO INSUB CHECK 2ND ADDRESS 84612000 SPACE 2 84614000 * BOTH ADDRESSES ARE OK --- RELOCATE THEM AND PERFORM 84616000 * THE APPROPRIATE COMMAND 84618000 EILONG2 EQU * 84620000 ALR R8,RMEM RELOCATE 1ST ADDRESS TO REAL ADDRESS 84622000 ALR R10,RMEM RELOCATE 2ND ADDRESS TO ACTUAL 84624000 SPACE 2 84626000 AIF (&$S370 NE 1).EILONG1 SKIP IF NOT ON REAL 370 84628000 STC ROP,EIQLONG STORE OPCODE IN INSTRUCTION 84630000 LR RWK1,R9 SAVE SECOND OPERAND REG NUMBER 84632000 LR RWK0,RMEM SAVE RELOCATION REGISTER 84634000 L R9,ECREGS+4(R7) GET LENGTH OF FIRST OPERAND 84636000 L R11,ECREGS+4(RWK1) GET LENGTH OF SECOND OPERAND 84638000 EIQLONG CLCL R8,R10 **** OPCODE MOVED IN DURING EXEC*** 84640000 BALR RCC,0 PICK UP THE CONDITION CODE 84642000 SLR R8,RWK0 DE-RELOCATE FINAL ADDRESSES 84644000 * *** THE INSTRUCTIONS ON EITHER SIDE OF THIS COMMENT 84646000 * *** BLOCK ARE USING RWK0 INSTEAD OF RMEM DUE TO 84648000 * *** TEMPORARY REGISTER SHIFTING ***** 84650000 SLR R10,RWK0 DE-RELOCATE FINAL ADDRESSES 84652000 N R8,EILONGMK ZAP UPPER BYTE OF ADDRESS REG 84654000 N R10,EILONGMK ZAP UPPER BYTE OF ADDRESS REGISTER 84656000 ST R8,ECREGS(R7) PUT REGISTERS BACK INTO CORE 84658000 ST R9,ECREGS+4(R7) PUT REGISTERS BACK INTO CORE 84660000 ST R10,ECREGS(RWK1) PUT REGISTERS BACK INTO CORE 84662000 ST R11,ECREGS+4(RWK1) PUT REGISTERS BACK INTO CORE 84664000 LR RMEM,RWK0 RELOAD RELOCATION REGISTER 84666000 B EIFINRR GET NEXT INSTR PSU. 84668000 AGO .EILONG2 84670000 .EILONG1 ANOP 84672000 SPACE 2 84674000 * CHECK WHICH INSTRUCTION TO SIMULATE (MVCL OR CLCL) 84676000 LA RWK14,1 SET UP INCREMENT REGISTER 84678000 IC RWK1,ECREGS+4(R9) GET PAD BYTE FROM INSTR 84680000 STC RWK1,EIPAD STORE PAD BYTE IN WORK AREA 84682000 L RWK1,ECREGS+4(R7) GET 1ST OPERAND LENGTH 84684000 L R2,ECREGS+4(R9) GET SECOND OPERAND LENGTH 84686000 N RWK1,EILONGMK ZAP OUT HIGH ORDER BYTE LENGTH 1 84688000 N R2,EILONGMK ZAP OUT HIGH ORDER BYTE LENGTH 2 84690000 CLI ECOP,X'0E' IS THIS AN MVCL COMMAND 84692000 BE EIMVCL IF SO BRANCH TO ROUTINE 84694000 SPACE 2 84696000 * CODE FOR THE CLCL COMMAND 84698000 EICLCL EQU * 84700000 LTR R2,R2 TEST SECOND LENGTH = 0? 84702000 BZ EICLCL6 BRANCH IF SECOND LENGTH 0 84704000 LTR RWK1,RWK1 TEST 1ST LENGTH = 0 ? 84706000 BZ EICLCL2 YES, BRANCH TO USE PAD AND OPRND 2 84708000 EICLCL1 EQU * 84710000 CLC 0(1,R8),0(R10) COMPARE A CHARACTER FROM EACH FIELD 84712000 BNE EICLCL5 IF NOT EQUAL WE ARE DONE BRANCH 84714000 AR R10,RWK14 INCREMENT POINTERS 84716000 AR R8,RWK14 INCREMENT POINTERS 84718000 BCT RWK1,EICLCL3 DECREMENT 1ST LENGTH - BRANCH ^= 0 84720000 B EICLCL7 LENGTH = 0, BRANCH INTO PAD LOOP 84722000 EICLCL2 EQU * 84724000 CLC EIPAD(1),0(R10) COMPARE PAD TO OPERAND 2 84726000 BNE EICLCL5 IF NOT EQUAL WE ARE DONE -- BRANCH 84728000 AR R10,RWK14 INCREMENT OPERAND 2 POINTER 84730000 EICLCL7 EQU * 84732000 BCT R2,EICLCL2 DECREMENT 2ND COUNT BR IF ^= 0 84734000 B EICLCL5 IF LENGTH = 0 OPRNDS = WE'RE DONE 84736000 EICLCL3 EQU * 84738000 BCT R2,EICLCL1 DECREMENT 2ND LENGTH BR IF ^=0 84740000 EICLCL4 EQU * 84742000 CLC 0(1,R8),EIPAD COMPARE FIRST OPERAND AND PAD CHAR 84744000 BNE EICLCL5 IF NOT = WE ARE DONE BRANCH 84746000 AR R8,RWK14 INCREMENT POINTER 84748000 BCT RWK1,EICLCL4 DECREMENT LENGTH, BRANCH IF ^= 0 84750000 EICLCL5 EQU * 84752000 BAL RCC,EILONG5 CAPTURE CONDITION CODE AND RETURN 84754000 EICLCL6 EQU * 84756000 LTR RWK1,RWK1 FIRST LENGTH = 0? 84758000 BNZ EICLCL4 NO, USE 1ST OPRND AND PAD 84760000 BAL RCC,EILONG5 GET CC (=0) AND RETURN 84762000 SPACE 2 84764000 * CODE FOR THE MVCL COMMAND 84766000 EIMVCL EQU * 84768000 LR RWK0,RWK1 ASSUME FIRST LENGTH SMALLEST 84770000 CR RWK1,R2 COMPARE THE LENGTHS 84772000 BALR RCC,0 CAPTURE THE CC 84774000 BL *+6 IF 1ST LENGTH LOWER, BRANCH 84776000 LR RWK0,R2 2ND LENGTH MUST BE SMALLER 84778000 LTR RWK0,RWK0 IS SMALLEST LENGTH = 0? 84780000 BZ EIMVCL3 IF SMALLER = 0, BRANCH 84782000 SPACE 2 84784000 * FOLLOWING CODE CHECKS FOR DESTRUCTIVE OVERLAP 84786000 CR R8,R10 IS FIRST FIELD AFTER 2ND 84788000 BNH EIMVCL1 IF NO OVERLAP, BRANCH 84790000 LR RWK14,R10 COPY OVER 2ND ADDRESS 84792000 LA RWK14,0(R2,RMEM) COMPUTE HIGHEST @, RELOCATED + 1 84794000 BCTR RWK14,0 COMPUTE HIGHEST ADDRESS 84796000 CR R8,RWK14 IS 1ST FIELD AFTER END OF SECOND 84798000 BNL EIMVCL1 YES -- NO OVERLAP, SO BRANCH 84800000 TM *+1,1 SET CC = 3 84802000 BAL RCC,EILONG5 GET CC AND RETURN 84804000 SPACE 2 84806000 EIMVCL1 EQU * 84808000 SR RWK1,RWK0 DECREMENT LENGTH BY SMALLEST 84810000 SR R2,RWK0 DECREMENT LENGTH BY SMALLEST 84812000 LA RWK14,1 LOAD INCREMENT REGISTER 84814000 EIMVCL2 EQU * 84816000 MVC 0(1,R8),0(R10) MOVE 1 BYTE !!!!!! 84818000 AR R8,RWK14 INCREMENT POINTER BY 1 84820000 AR R10,RWK14 INCREMENT POINTER BY 1 84822000 BCT RWK0,EIMVCL2 DECREMENT LENGTH, ^= 0 BRANCH 84824000 EIMVCL3 EQU * 84826000 LTR RWK1,RWK1 DO WE NEED PADDING 84828000 BZ EILONG5 NO --- DONE, SO BRANCH 84830000 EIMVCL4 MVI 0(R8),$ MOVE PAD TO FIRST OPERAND 84832000 AR R8,RWK14 INCREMENT POINTER BY 1 84834000 BCT RWK1,EIMVCL4 DECREMENT LENGTH, ^= 0 BRANCH 84836000 SPACE 2 84838000 EILONG5 EQU * 84840000 LA RWK14,ECREGS(R7) GET ADDRESS OF 1ST REG PAIR 84842000 XC 5(3,RWK14),5(RWK14) ZAP LOWER PART OF LENGTH IN CORE 84844000 O RWK1,4(,RWK14) PUT UPPER BYTE BACK INTO USER REG 84846000 LA RWK14,ECREGS(R9) GET ADDR OF SECOND REGISTER PAIR 84848000 XC 5(3,RWK14),5(RWK14) ZAP LOWER PART OF LENGTH IN CORE 84850000 O R2,4(,R2) PUT UPPER BYTE BACK INTO REGISTER 84852000 * OPERATION COMPLETE ----- RESTORE REGISTERS AND RETURN 84854000 SLR R8,RMEM DE-RELOCATE FINAL ADDRESSES 84856000 SLR R10,RMEM DE-RELOCATE FINAL ADDRESSES 84858000 N R8,EILONGMK ZAP UPPER BYTES OF ADDRESS REGS 84860000 N R10,EILONGMK ZAP UPPER BYTES OF ADDRESS REGS 84862000 ST R8,ECREGS(R7) PUT REGISTERS BACK INTO CORE 84864000 ST RWK1,ECREGS+4(R7) PUT REGISTERS BACK INTO CORE 84866000 ST R10,ECREGS(R9) PUT REGISTERS BACK INTO CORE 84868000 ST R2,ECREGS+4(R9) PUT REGISTERS BACK INTO CORE 84870000 SR R2,R2 RESTORE R2 AS A BYTE REGISTER 84872000 B EIFINRR RETURN FOR NEXT INSTR. CEH 84874000 EIPAD EQU EIMVCL4+1 MVCL/CLCL PAD BYTE IS MOVED HERE 84876000 .EILONG2 ANOP 84878000 EILONGMK DC 0F'0',XL4'00FFFFFF' USED TO CLEAR UPPER BYTE OF REGS 84880000 SPACE 2 84882000 * THE FOLLOWING CODE PROCESSES SET PROGRAM MASK 84884000 EISPM EQU * 84886000 L RCC,ECREGS(R7) PLACE SPECIFIED REG INTO CC REG 84888000 SPM RCC SET REAL CC-PM TO FAKE CC-PM 84890000 B EIFINRR RETURN FOR NEXT INSTRUCTION 84892000 SPACE 1 84894000 * THESE TWO PRIVILEGED INSTRUCTIONS ARE NOT IMPLEMENTED 84896000 * AT THE PRESENT TIME. THE HOOKS ARE PROVIDED HOWEVER, 84898000 * IF IT SHOULD BECOME POSSIBLE TO IMPLEMENT THEM IN THE 84900000 * FUTURE 84902000 EISSK EQU EIOC2 84904000 EIISK EQU EIOC2 84906000 SPACE 2 84908000 * THE FOLLOWING CODE PROCESSES THE SVC INSTRUCTION 84910000 * CONTROL IS PASSED HERE FROM THE MAIN DECODONG LOOP 84912000 * WHEN AN SVC OPCODE IS ENCOUNTERED. AT THIS POINT 84914000 * REGISTER 7 CONTAINS THE SECOND BYTE OF THE INSTRUCTION 84916000 * AND REGISTER ROP CONTAINS THE INSTRUCTION OPCODE. THIS 84918000 * INSTRUCTIONS IS PRESENTLY FLAGGED AS AN OC2 EXCEPTION. 84920000 * IN THE FUTURE, CODE MAY BE PLACED HERE TO ACTUALLY 84922000 * PERFORM OR SIMULATE THE SCV. IT SHOULD BE NOTED THAT 84924000 * REGISTERS RWK0, RWK1, R8, R9, R10 AND R14 ARE AVAILABLE 84926000 * FOR USE HERE. R2 CAN ALSO BE USED AS A BYTE REGISTER OR 84928000 * RESTORED TO A BYTE REGISTER IF USED FOR ANOTHER PURPOSE. 84930000 * NO OTHER REGISTERS SHOULD BE USED HERE. 84932000 * FOLLOWING ANY FUTURE SVC PROCESSING, CONTROL MUST BE 84934000 * PASSED TO LABEL EIFINRR TO FETCH AND PROCESS THE NEXT 84936000 * INSTRUCTION. 84938000 SPACE 2 84940000 EISVC EQU EIOC2 84942000 SPACE 2 84944000 * THIS CODE IS USED TO PERFORM THE MR AND DR INSTRS 84946000 EIMRDR EQU * 84948000 STC ROP,EIQMRDR STORE PROPER OPCODE IN INSTRUCTION 84950000 LA RWK1,ECREGS(R7) GET ADDRESS OF FAKE REGISTER PAIR 84952000 L R9,ECREGS+4(R7) GET CONTENTS OF SECOND REG OF PAIR 84954000 EIQMRDR MR $+R8,R10 ****OPCODE MOVED IN DURING EXEC**** 84956000 STM R8,R9,0(RWK1) STORE CHANGED REGS INTO FAKE REGS 84958000 B EIFINRR BRANCH AND RETURN FOR NEXT INSTR 84960000 TITLE '*** EXECUT - RX PROCESSING ROUTINES' 84962000 *********************************************************************** 84964000 * * 84966000 * RX TYPE INSTRUCTION INTERPRETING SECTION * 84968000 * * 84970000 * * 84972000 *********************************************************************** 84974000 * * 84976000 * RX NORMAL PROCESSING * 84978000 * (IC,CH,AH,SH,MH,N,CL,O,X,C,A,S,AL,SL,L,LH,CVB) * 84980000 EINORMRX EQU * 84982000 STC ROP,EINRMRX MOVE PROPER OP CODE TO INSTRUCTION 84984000 SPM RCC SET OUR CONDITION CODE TO USERS 84986000 EINRMRX IC $+R8,0(RAD1) ** PROPER OP CODE WILL BE MOVED IN** 84988000 ST R8,ECREGS(R7) STORE RESULT IN PROPER USER REGISTER 84990000 BAL RCC,EIFIN GET CC AND RETURN FOR NEXT INSTR 84992000 SPACE 2 84994000 * THIS SECTION PROCESSES THE BAL INSTRUCTION 84996000 EIBAL EQU * 84998000 L RWK1,EIRIA GET @ OF NEXT SEQUENTIAL INSTR 85000000 N RCC,=XL4'3F000000' LEAVE ONLY CC-PM IN RCC 85002000 AL RCC,=XL4'80000000' ADD ILC TO PSW BEING BUILT 85004000 ALR RWK1,RCC NOW HAVE ILC-CC-PM-IA FIELDS 85006000 ST RWK1,ECREGS(R7) FAKE REGISTER GETS BUILT PSW 85008000 * ** NOTE ** RAD1 HAS BRANCH ADDRESS VALUE 85010000 B EIFINB PROCESS SUCCESSFUL BRANCH INSTRS 85012000 SPACE 2 85014000 * BRANCH ON COUNT (BCT) 85016000 EIBCT EQU * 85018000 BCTR R8,0 DECREMENT VALUE IN REG 85020000 ST R8,ECREGS(R7) STORE DECREMENTED VALUE IN FAKE REG 85022000 LTR R8,R8 VALUE = 0 ? 85024000 BNZ EIFINB IF NOT ZERO, SUCCESSFUL BRANCH 85026000 B EIFIN BRANCH FAILED, GET NEXT INSTR 85028000 SPACE 2 85030000 * BRANCH ON CONDITION (BC) 85032000 EIBC EQU * 85034000 SLL R7,2 GET MASK IN RIGHT SPOT 85036000 STC R7,EIQBC+1 STORE MASK INTO INSTR 85038000 SPM RCC REAL CC = FAKE CC 85040000 EIQBC BC $,EIFINB *** MASK STORED IN *** 85042000 B EIFIN BRANCH FAILED 85044000 SPACE 2 85046000 * PROCESS THE LA INSTRUCTION (LOAD ADDRESS) 85048000 EILA EQU * 85050000 SLR RAD1,RMEM DE-RELOCATE ADDRESS FOR USER 85052000 ST RAD1,ECREGS(R7) STORE RESULT IN FAKE REG 85054000 B EIFIN BRANCH TO GET NEXT INSTR 85056000 SPACE 2 85058000 * INTERPRETATION OF THE EXECUTE INSTRUCTION (EX) 85060000 EIEX EQU * 85062000 CLI 0(RAD1),X'44' MAKE SURE NOT AN EXECUTE 85064000 BE EIOC3 EXECUTE INTERRUPT 85066000 * FETCH INSTRUCTION AND PUT IN STACK 85068000 L RSTK,ECSTLINK GET @ OF NEXT STACK SLOT 85070000 ST RCC,ECSTCCPM SAVE CC AND PROG MASK IN STACK 85072000 MVC ECSTINST,0(RAD1) GET UP TO 6 BYTES OF INSTR 85074000 IC ROP,ECOP GET OPCODE INTO REGISTER 85076000 SR RAD1,RMEM DE-RELOCATE INSTR ADDR 85078000 ST RAD1,ECSTIADD SAVE INSTR ADDR FOR DUMP 85080000 MVC EIINCPSW+2(4),EIEXMBR ** CHANGE INSTR IN MAIN LOOP TO X85082000 RETURN TO EXECUTE CODE ** 85084000 * OR BYTE INTO INSTR AS NEEDED - THEN BRANCH TO PROCESS 85086000 LTR R7,R7 CHECK IF BYTE SHOULD BE OR'ED IN 85088000 BZ EIEXPEN BRANCH TO PROCESS IF NOT 85090000 LA R9,ECREGS+3(R7) GET @ OF BYTE TO BE OR'ED IN 85092000 OC ECR1R2(1),0(R9) OR BYTE INTO INSTRUCTION (IN STACK) 85094000 B EIEXPEN BRANCH TO PROCESS INSTR 85096000 * ***** RETURNED HERE TO FIX UP THE ADDRESS OF THE NEXT 85098000 * ***** INSTRUCTION (AFTER THE THE INSTR EXECUTED BY THE 85100000 * ***** EX INSTR) 85102000 EIEXRET EQU * 85104000 L RIA,EIRIA RELOAD CORRECT NEXT INSTR @ 85106000 MVC EIINCPSW+2(4),EIEXRSTR RESTORE IC INSTR IN MAIN LOOP 85108000 B EITSTMSK BRANCH TO CONTINUE PROCESSING 85110000 * THE FOLLOWING INSTRUCTIONS ARE MOVED INTO THE MAIN LOOP 85112000 * TO MODIFY OR RESTORE CODE AS NEEDED BY THE EX INSTR 85114000 EIEXMBR B EIEXRET 85116000 EIEXRSTR IC R2,EICTB2 85118000 SPACE 2 85120000 * THIS CODE IS USED TO PERFORM THE M AND D COMMANDS 85122000 EIMD EQU * 85124000 STC ROP,EIQMD STORE PROPER OPCODE IN INSTRUCTION 85126000 LA RWK1,ECREGS(R7) GET ADDRESS OF FAKE REGISTER PAIR 85128000 L R9,ECREGS+4(R7) GET CONTENTS OF SECOND REG OF PAIR 85130000 EIQMD M $+R8,0(RAD1) ****OPCODE MOVED DURING EXEC **** 85132000 STM R8,R9,0(RWK1) RESTORE CHANGED REGS INTO FAKE REGS 85134000 B EIFIN BRANCH AND RETURN FOR NEXT INSTR 85136000 SPACE 2 85138000 * THIS SECTION PROCESSES RX STORE OPERATIONS 85140000 * (NO CC SETTING) (STH,CVD,STC,ST) 85142000 EISTORS EQU * 85144000 STC ROP,EIQSTORS STORE OPCODE IN INSTRUCTION 85146000 EIQSTORS ST $+R8,0(RAD1) **** OPCODE CHANGED DURING EXEC **** 85148000 AIF (&$S370 NE 2).EISTORS SKIP IF ON S370 85150000 BZ EIFIN IF NOT FAKING ALIGNMENT RETURN 85152000 MVC 0(8,RWK14),EIDUBLWD PUT ALTERED CORE BACK IN PLACE 85154000 .EISTORS ANOP 85156000 B EIFIN BRANCH BACK FOR NEXT INSTRUCTION 85158000 SPACE 2 85160000 * THIS CODE PROCESSES FLOATING POINT RX INSTRUCTIONS 85162000 AIF (&$FLOTEX).EIXFPRX SKIP IF WE HAVE EXTENDED FP 85164000 EIXFPRX EQU EIOC1 NOTE XFP INSTRS NOT ALLOWED 85166000 AIF (&$FLOTE).EIFPRX GO GEN IF FLOATINGS ARE ALLOWED 85168000 EIFPRX EQU EIOC1 NOTE FLOATINGS NOT ALLOWED 85170000 EIFPRXST EQU EIOC1 NOTE FLOATINGS NOT ALLOWED 85172000 AGO .EIFPRX2 SKIP OVER GENERATION 85174000 .EIXFPRX ANOP 85176000 EIXFPRX EQU * 85178000 .EIFPRX ANOP 85180000 SPACE 1 85182000 * THE FLOATING POINT RX INSTRUCTIONS 85184000 EIFPRX EQU * 85186000 STC ROP,EIQFPRX STORE OPCODE IN INSTRUCTION 85188000 SLL R7,2 GET R1 FIELD BACK INTO PLACE 85190000 STC R7,EIQFPRX+1 STORE R1 FIELD INTO INSTRUCTION ALSO 85192000 SPM RCC SET THE CONDITION CODE 85194000 EIQFPRX STD $,0(,RAD1) ** OPCODE AND R1 FIELDS STORED IN ** 85196000 BAL RCC,EIFIN GET CC AND RETURN FOR NEXT INSTR 85198000 SPACE 2 85200000 * CODE FOR FLOATING POINT STORES 85202000 AIF (&$S370 EQ 2).EIFPRX1 SKIP IF ON A 360 85204000 EIFPRXST EQU EIFPRX CODE FOR STORES SAME AS OTHERS 85206000 AGO .EIFPRX2 SKIP AROUND CODE GENERATION 85208000 .EIFPRX1 ANOP 85210000 SPACE 2 85212000 * CODE FOR FLOATING POINT STORES WHEN FAKING ALIGNMENT 85214000 EIFPRXST EQU * 85216000 STC ROP,EIQFPRXS STORE OPCODE INTO INSTRUCTION 85218000 SLL R7,2 GET R1 FIELD BACK 85220000 STC R7,EIQFPRXS+1 STORE R1 FIELD INTO INSTRUCTION ALSO 85222000 EIQFPRXS STD $,0(,RAD1) **OPCODE AND R1 FIELDS STORED IN *** 85224000 BZ EIFIN IN NO ALIGNMENT CHECKING, RETURN 85226000 MVC 0(8,RWK14),EIDUBLWD PUT ALTERED CORE BACK IN PLACE 85228000 B EIFIN RETURN 85230000 .EIFPRX2 ANOP 85232000 SPACE 2 85234000 AIF (NOT &$XIOS).EINOXD SKIP IF NO XMACROS 85236000 * XDECO - EXTENDED DECIMAL OUTPUT INSTRUCTION * 85238000 * SPECIAL RX INSTRUCTION CONVERTS REGISTER VALUE TO * 85240000 * EDITED 12 - BYTE DECIMAL FIELD. (X'52' OPCODE) * 85242000 SPACE 1 85244000 EIXDECO EQU * 85246000 XDECO R8,0(RAD1) CONVERT AND MOVE THE VALUE 85248000 B EIFIN RETURN FOR THE NEXT INSTR 85250000 SPACE 2 85252000 * XDECI - EXTENDED DECIMAL INPUT INSTRUCTION * 85254000 * SPECIAL INPUT CONVERTER, SCANS 1 - 9 DIGITS, SIGNED * 85256000 * UNSIGNED DECIMAL NUMBERS WITH ANY # OF PRECEDING * 85258000 * BLANKS. SETS CC TO 0,1,2 ACCORDING TO VALUE OF * 85260000 * RESULT. CC = ; IF > 9 DIGITS OR 1ST CHARACTER * 85262000 * NOT +, -, DIGIT, OR + OR - WITHOUT DIGIT FOLLOWING * 85264000 * OPCODE IS X'53' WITH THE RX FORMAT * 85266000 SPACE 1 85268000 EIXDECI EQU * 85270000 XDECI RWK0,0(RAD1) CONVERT AND SCAN THE VALUE 85272000 BALR RCC,0 SAVE THE CONDITION CODE 85274000 BO *+8 SKIP STORE IF VALUE WAS BAD 85276000 ST RWK0,ECREGS(R7) SAVE THE CONVERTED VALUE IF OK 85278000 SR RWK1,RMEM DE-RELOCATE THE SCAN PTR VALUE 85280000 ST R1,ECREG1 PUT SCAN PTR IN USER REG 1 85282000 B EIFIN RETURN FOR THE NEXT INSTR 85284000 .EINOXD ANOP 85286000 AIF (NOT &$XIOS).EICONT SKIP IF NO XMACROS 85288000 AIF (NOT &$HEXI).EINOHXI SKIP IF NO XHEXI 85290000 SPACE 2 85292000 * XHEXI - EXTENDED HEXADECIMAL INPUT INSTRUCTION * 85294000 * SPECIAL INPUT MACRO, SCANS 1-8 DIGITS . SKIPS LEADING * 85296000 * BLANKS. SETS CONDITION CODE TO 3 IF ILLEGAL HEX * 85298000 * CHARACTER IS FOUND. IF GREATER THAN 8 DIGITS FOUND R1 * 85300000 * POINTS TO THE 9TH ELSE R1 POINTS TO FIRST NON-HEX * 85302000 * IN STRING. * 85304000 * OPCODE IS X'61' IN THE RX FORMAT. * 85306000 SPACE 1 85308000 EIXHEXI EQU * 85310000 XHEXI RWK0,0(RAD1) CONVERT AND SCAN VALUE 85312000 BALR RCC,0 SAVE THE CONDITION CODE 85314000 BO *+8 SKIP STORE IF VALUE WAS BAD 85316000 ST RWK0,ECREGS(R7) STORE CONVERTED VLUE IF OK 85318000 SR RWK1,RMEM DE-RELOCATE SCAN POINTER VALUE 85320000 ST RWK1,ECREG1 SAVE SCAN POINTER IN USER REG 1 85322000 B EIFIN RETURN FOR THE NEXT INSTRUCTION 85324000 AGO .EICKHXO CHECK IF XHEXO ALLOWED 85326000 .EINOHXI ANOP 85328000 EIXHEXI EQU EIOC1 NOTE XHEXI NOT ALLOWED -- INVALID OP 85330000 .EICKHXO AIF (NOT &$HEXO).EINOHXO SKIP IF XHEXO NOT ALLOWED 85332000 SPACE 2 85334000 * XHEXO - EXTENDED HEXADECIMAL OUTPUT MACRO * 85336000 * SPECIAL RX INSTRUCTION CONVERTS REGISTER VALUE TO * 85338000 * OUTPUT 8 BYTE FORM. OPCODE IS X'62'. * 85340000 SPACE 2 85342000 EIXHEXO EQU * 85344000 XHEXO R8,0(RAD1) CONVERT VALUE AND MOVE TO USER AREA 85346000 B EIFIN RETURN FOR THE NEXT INSTRUCTION 85348000 AGO .EICONT 85350000 .EINOHXO ANOP 85352000 EIXHEXO EQU EIOC1 NOTE XHEXO INVALID OPCODE 85354000 .EICONT ANOP 85356000 TITLE '*** EXECUT - SI PROCESSING ROUTINES' 85358000 *********************************************************************** 85360000 * * 85362000 * SI TYPE INSTRUCTION INTERPRETING SECTION * 85364000 * * 85366000 *********************************************************************** 85368000 * * 85370000 * SI NORMAL PROCESSING * 85372000 * (TM,MVI,NI,CLI,OI,XI - OP D(B),I2) * 85374000 SPACE 2 85376000 EINORMSI EQU * 85378000 STC ROP,EIQSI MOVE OPCODE INTO INSTRUCTION 85380000 STC R7,EIQSI+1 MOVE I2 FIELD INTO INSTRUCTION 85382000 SPM RCC SET REAL COND-CODE = TO FAKE ONE 85384000 EIQSI TM 0(RAD1),$ *** OPCODE AND I2 WILL BE MOVED IN** 85386000 BAL RCC,EIFIN CAPTURE CC, RETURN FOR NEXT INSTR 85388000 SPACE 1 85390000 * DIAG - PSEUDO SI INSTRUCTION USED FOR DEBUGGING PURPOSE 85392000 EIDIAG EQU * 85394000 MVC ECFLAG2,ECI2 SUPPLY CONTROL FLAG TO BYTE 85396000 B EIFIN RETURN FOR NEXT INSTRUCTION 85398000 SPACE 2 85400000 * THE FOLLOWING ARE THE GROUP OF S360 / S370 PRIVILEGED 85402000 * OPERATIONS. CONTROL IS PASSED HERE FROM THE MAIN 85404000 * DECODING LOOP WITH ROP CONTAINING THE OPCODE AND R7 85406000 * CONTAINING THE FIRST REGISTER OR IMMEDIATE FIELD. AT 85408000 * THE PRESENT TIME ALL OF THESE INSTRUCTIONS ARE FLAGGED 85410000 * WITH OC2 EXCEPTIONS. THE HOOKS ARE ALL PROVIDED HOWEVER 85412000 * FOR THEIR FUTURE IMPLEMENTATION. 85414000 SPACE 2 85416000 EILCTL EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85418000 EISTCTL EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85420000 EIP370 EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85422000 EISIO EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85424000 EITIO EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85426000 EIHIO EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85428000 EISSM EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85430000 EITCH EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85432000 EILPSW EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85434000 EIWRD EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85436000 EIRDD EQU EIOC2 NO PRIVILEGED OPS ALLOWED AT PRESENT 85438000 SPACE 2 85440000 AIF (&$REPL GT 0).EINREPO SKIP IF REPL OPTION ALLOWED 85442000 EIXREPL EQU EIOC1 NO REPLACEMENT: MAKE ILLEGAL OP 85444000 .EINREPO AIF (&$REPL EQ 0).EINREPL SKIP IF NO REPLACEMENT ALLOWED 85446000 SPACE 2 85448000 * CODE FOR THE XREPL COMMAND 85450000 EIXREPL EQU * 85452000 CLI ECI2,0 WAS IT A SET RFLAG TYPE XREPL 85454000 BH EIXREPL1 NO, SKIP TO NEXT TYPE 85456000 MVC ECRFLAG,0(RAD1) SET RFLAG FROM USER LOCATION 85458000 B EIFIN RETURN FOR THE NEXT INSTRUCTION 85460000 SPACE 1 85462000 EIXREPL1 CLI ECI2,1 WAS IT A FETCH RFLAG TYPE 85464000 BH EIXREPL2 O, SKIP TO NEXT TYPE 85466000 MVC 0(L'ECRFLAG,RAD1),ECRFLAG FETCH THE FLAG TO USER AREA 85468000 B EIFIN RETURN FOR THE NEXT INSTR 85470000 SPACE 1 85472000 EIXREPL2 CLI ECI2,2 WAS IT INSTRUCTION COUNT 85474000 BH EIXREPL3 NO, GO ON TO NEXT 85476000 MVC 0(4,RAD1),ECILIMT MOVE TEMP INSTR COUNT OVER 85478000 B EIFIN RETURN FOR THE NEXT INSTRUCTION 85480000 EIXREPL3 EQU EIFIN ILLEGAL I2 FIELD IGNORE AND RETURN 85482000 .EINREPL ANOP 85484000 TITLE '*** EXECUT - RS PROCESSING ROUTINES' 85486000 *********************************************************************** 85488000 * * 85490000 * RS INSTRUCTION PROCESSING ROUTINES * 85492000 * * 85494000 *********************************************************************** 85496000 SPACE 5 85498000 * BRANCH ON INDEX (BXH,BXLE) 85500000 EIRSBX EQU * 85502000 STC ROP,EIQRSBX STORE OPCODE INTO INSTRUCTION 85504000 L RWK1,ECREGS+4(R9) GET NEXT REGISTER BEYOND R3 85506000 LR RWK0,R10 COPY R3 VALUE IN EXPECTED REGISTER 85508000 TM ECR1R3,X'1' WAS REGISTER ODD 85510000 BZ EIQRSBX IF EVEN REG,SET UP OK SKIP NEXT INST 85512000 LR RWK1,RWK0 R3 WAS ODD SO USE SAME VALUE 85514000 EIQRSBX BXH R8,RWK0,EIRSBX1 **CHANGED TO EITHER BXH-BXLE ******* 85516000 ST R8,ECREGS(R7) BRANCH FAILED BUT STORE REG BACK 85518000 B EIFIN RETURN FOR NEXT INSTR 85520000 EIRSBX1 ST R8,ECREGS(R7) BRANCH SUCCESSFULL BUT RESTORE REG 85522000 B EIFINB RETURN TO BR'D TO INSTR 85524000 SPACE 2 85526000 * LOAD & STORE MULTIPLE (LM,STM) *CODE MAY NOT BE OBVIOUS 85528000 EILMSTM EQU * 85530000 AIF (&$S370 NE 2).EILMSTM CHECK IF NOT ON A 370 85532000 TM ECPRFLG2,ECALNCHK SHOULD ALIGNMENT BE CHECKED 85534000 BZ *+8 NO ALIGNMENT CHECK BRANCH AROUND 85536000 L R0,0(RAD1) QUICK CHECK FOR FULL WORD ALIGNMENT 85538000 .EILMSTM ANOP 85540000 SLR RAD1,RMEM DE-RELOCATE THE ADDRESS 85542000 LA RWK0,4(R9) OBTAIN PART 1 OF LENGTH VALUE 85544000 LR RWK1,RAD1 PUT ADDR TO BE CHECKED WHERE EXPECT 85546000 CR R7,R9 IS R1 FIELD <= R3 FIELD 85548000 BNH EILMSTM1 SKIP OVER IF EASY CASE (R1 MOVE TO DO NR 85740000 BZ 6(,RWK14) IF 0, WE ARE ALL DONE RETURN 85742000 EX 0,0(,RWK14) PERFORM SUPPLIED OPERATION 85744000 LA RAD1,1(RAD1) INCERMENT CORE AREA POINTER 85746000 EIMSKC EQU *+1 POSITION OF MASK CHANGED BY CLM 85748000 BC $+15,EIMSK1 USUALLY BRANCH TO LOOP (BE FOR CLM) 85750000 B 6(,RWK14) IF UNEQUAL COMPARE FOR CLM, RETURN 85752000 .EIMASK3 ANOP 85754000 TITLE '*** EXECUT - SS PROCESSING ROUTINES' 85756000 *********************************************************************** 85758000 * * 85760000 * SS TYPE INTERPRETING SECTION * 85762000 * * 85764000 *********************************************************************** 85766000 SPACE 5 85768000 * MOVES,TR,PACK,LOGICALS & DECIMALS (DON'T CHANGE REGS) 85770000 EIMOVES EQU * 85772000 EILOGS EQU EIMOVES 85774000 EIDECS EQU EIMOVES 85776000 SPM RCC SET REAL CC = FAKE CC 85778000 EIQSS MVN 0($,RAD1),0(RAD2) ** OPCODE & LENGTH(S) MOVED IN ** 85780000 BAL RCC,EIFIN RETURN FOR NEXT INSTR 85782000 SPACE 2 85784000 * TRT AND EDMK - CHANGE CC & POSSIBLY REGS R1 & R2 85786000 EITRT EQU * 85788000 EIEDMK EQU EITRT 85790000 LM R1,R2,ECREG1 GET FAKE R1 & R2 85792000 LA R1,0(R1,RMEM) CLEAR UPPER BYTE & RELOCATE 85794000 EX 0,EIQSS EXECUTE TNE INSTRUCTION 85796000 BALR RCC,0 SCOOP UP THE CC 85798000 SLR R1,RMEM CONVERT BACK TO FAKE ADDR 85800000 AIF (&$S370 NE 1).EITRT1 SKIP IF NOT ON A REAL 370 85802000 ICM R1,8,ECREG1 GET 1ST BYTE IF FAKE REG1 85804000 AGO .EITRT2 85806000 .EITRT1 ANOP 85808000 XC ECREG1+1(3),ECREG1+1 CLEAR 3 BYTES OF FAKE REG1 85810000 O R1,ECREG1 GET FAKE REG1 BACK TOGETHER 85812000 .EITRT2 ANOP 85814000 STM R1,R2,ECREG1 REPLACE FAKE REGS R1 & R2 85816000 SR R2,R2 RECLEAR BYTE REG 85818000 B EIFIN RETURN FOR NEXT INSTR 85820000 SPACE 2 85822000 * CODE FOR THE SRP COMMAND (SHIFT AND ROUND) 85824000 EISRP EQU * 85826000 SR RAD2,RMEM REMOVE RELOCATION DONE EARLIER 85828000 IC R2,ECB2D2 GET B2 BASE REG 85830000 SRA R2,4 REMOVE UNNEEDED BITS 85832000 AIF (&$S370 NE 1).EISRP1 SKIP IF NOT ON A REAL 370 85834000 BZ EIDECS BRANCH TO EXECUTE THE INSTRUCTION 85836000 SLL R2,2 B2 * 4 FOR INDEX 85838000 S RAD2,ECREGS(R2) DON'T WANT VALUE OF BASE REG 85840000 B EIDECS BRANCH TO EXECUTE THE INSTRUCTION 85842000 AGO .EISRP2 85844000 .EISRP1 ANOP 85846000 BZ EISRPA NO BASE REG ADDED IN, SKIP OVER 85848000 SLL R2,2 B2 * 4 FOR INDEX 85850000 S RAD2,ECREGS(R2) DON'T WANT VALUE OF BASE REG 85852000 EISRPA EQU * 85854000 LR R8,R7 COPY LENGTH FIELD OVER 85856000 SLL R8,4 GET LENGTH * 16 85858000 OR R8,R7 SET UP REG WITH 2 LENGTHS 85860000 SPACE 85862000 MVO EISRPRND(1),ECL1I3(1) MOVE IMMEDIATE OVER 85864000 ZAP EISRPRND(1),ECL1I3(1) CHECK IMMEDIATE 85866000 EX R7,EISRPZP1 CHECK USER NUMBER 85868000 BZ EISRPLF5 IF NUMBER=0, WERE DONE 85870000 SPACE 85872000 SLL RAD2,26 EXTEND BIT 26 AS IF 85874000 SRA RAD2,26 IT IS A SIGN BIT 85876000 BZ EISRPLF3 IF SHIFT IS ZERO, WERE DONE 85878000 BP EISRPLF IF SHIFT IS POS, ITS LEFT 85880000 SPACE 85882000 * RIGHT SHIFT CODE 85884000 EISRPRT EQU * 85886000 LPR RAD2,RAD2 RIGHT SHIFT, GET POS SHIFT 85888000 B EISRPRT2 BRANCH INTO LOOP 85890000 EISRPRT1 EQU * 85892000 MVO EISRPSHF(16),EISRPSHF(15) SHIFT ALL BUT LAST NIBBLE 85894000 EISRPRT2 EQU * 85896000 BCT RAD2,EISRPRT1 CONTINUE LOOP (DECMT COUNT) 85898000 SLL R7,4 SHIFT LENGTH TO L1 FIELD 85900000 MVN EISRPSHF+15(1),EISRPRND MAKE SIGN POSITIVE 85902000 AP EISRPSHF(16),EISRPRND(1) ADD IN ROUNDING FACTOR 85904000 EX R7,EISRPMV1 MOVE TO USER, DOING LAST SHIFT 85906000 B EISRPLF3 GO TO SET CC AND RETURN 85908000 SPACE 85910000 * LEFT SHIFT CODE 85912000 EISRPLF EQU * 85914000 STC R8,EISRPLF2+1 PUT LEN INTO MVO INSTR 85916000 LA RWK1,0(R7,RAD1) GET @ OF LAST BYTE OF USER # 85918000 OI *+1,0 SET CC = 0 85920000 EISRPLF1 EQU * 85922000 BNZ EISRPLF2 IF OVERFLOW HAS OCCURRED, BRANCH 85924000 TM 0(RAD1),X'F0' CHECK 1ST NIBBLE FOR NON ZERO 85926000 EISRPLF2 EQU * 85928000 MVO 0($,RAD1),0($,RAD1) SHIFT LEFT ** LENGTHS STORED IN** 85930000 MVZ 0(1,RWK1),EISRPPK0 MOVE ZERO TO PROPAGATED SIGN 85932000 BCT RAD2,EISRPLF1 DECREMENT COUNT AND BRANCH 85934000 BNZ EISRPLF4 OVERFLOW, BRANCH TO CHECK FOR OCA 85936000 EISRPLF3 EQU * 85938000 EX R8,EISRPZP2 SET CC FOR +, - OR 0 85940000 BAL RCC,EIFIN CAPTURE CC AND RETURN FOR NEXT INSTR 85942000 EISRPLF4 EQU * 85944000 TM ECSTCCPM,X'04' CAPTURE MASK BIT 85946000 BO EIOCA OVERFLOW HAS OCCURRED -- ERROR 85948000 TM *+1,1 SET CC TO OVERFLOW 85950000 EISRPLF5 EQU * 85952000 BAL RCC,EIFIN CAPTURE CC AND RETURN FOR NEXT INSTR 85954000 SPACE 1 85956000 EISRPZP1 ZAP EISRPSHF(16),0($,RAD1) CHECK AND MOVE USER # 85958000 EISRPZP2 ZAP 0($,RAD1),0($,RAD1) SET CC TO +, -, OR 0 85960000 EISRPMV1 MVO 0($,RAD1),EISRPSHF(15) MOVE BACK TO USER AREA 85962000 SPACE 1 85964000 EISRPRND DC PL1'0' AREA FOR SRP ROUNDING FACTOR 85966000 EISRPSHF DC PL16'0' AREA FOR SHIFTING USER # 85968000 EISRPPK0 DC PL1'0' USED TO SET SIGN 85970000 .EISRP2 ANOP 85972000 SPACE 2 85974000 * CHECK IF GENERATION OF XIO'S IS ON 85976000 AIF (&$XIOS).EIXIOS SKIP TO GENERATE CODE IF EXISTS 85978000 EIXIOS EQU EIOC1 THESE INSTRUCTIONS DO NOT EXIST 85980000 AGO .EINOXIO 85982000 .EIXIOS ANOP 85984000 SPACE 2 85986000 * PSEUDO RX - SS EXTENDED MNEMONICS - XREAD, XPRNT, XPNCH, IO'S* 85988000 * PSEUDO DUMP ROUTINE - XDUMP * 85990000 * ** NOTE ** BECAUSE OF NO-STANDARD ADDRESSING DONE BY THESE * 85992000 * INSTRUCTIONS, THEY DO THEIR OWN ADDRESS CHECKING AND THUS * 85994000 * HAVE A PROTECTION BYTE OF X'00' SO THE INITIAL SS SECTION * 85996000 * DOESN'T STOP THEM. THEY THEN FAKE THE PROTECTION BYTES OF * 85998000 * EITHER STM (X'C0'-XREAD),OR TM(X'80'-XPRNT,XDUMP,XPNCH). * 86000000 SPACE 1 86002000 EIXIOSR ST RIA,EIRIA XDUMPR SHORT CUT L 86004000 EIXIOS EQU * SECTION FOR X-MACRO I/O INSTRS 86006000 N RCC,=XL4'3F000000' REMOVE ALL BUT CC - PM BITS 86008000 AL RCC,EIRIA PUT CC - PM PROG ADDR TOGETHER 86010000 ST RCC,ECILCMSK STORE RESULTING PSW 86012000 OI ECILCMSK,X'C0' SET ILC = 3, FOR LENGTH OF X-INST 86014000 CLI ECOP,X'E1' SEE IF IT WAS A REGS TYPE XDUMP 86016000 BE EIXDUMPR YES, GO DUMP REGS ONLY 86018000 SR RAD2,RMEM REMOVE SPERIOUS RELOCATION 86020000 BNZ EIXLOK LENGTH OK IF NOT ZERO 86022000 L RAD2,ECREGS GET VALUE OF FAKE ZERO 86024000 EIXLOK EQU * 86026000 LR RWK1,RAD2 SAVE THE LENGTH TO BE DONE 86028000 SRL R7,3 GET MASK VALUE IN PLACE FOR INDEX 86030000 ALR R7,R7 SHIFT LEFT FOR MULTIPLE OF 2 86032000 LH R9,EIXIOJ(R7) GET ADDRESS VALUE 86034000 B EISPEJMP(R9) GO TO RIGHT SECTION OF CODE 86036000 SPACE 2 86038000 * XREAD PREUDO INSTRUCTION 86040000 EIXREAD EQU * 86042000 TM ECFLAG0,$ECEOF HAS THERE BEEN AN EOF ALREADY 86044000 BO EIXREOF YES, USER TRYING TO GO PAST 86046000 $READ 0(RAD1),(RWK1),EIXREOFA ACTUALLY READ A CARD 86048000 BAL RCC,EIFIN CAPTURE CC AND RETURN FOR NEXT INSTR 86050000 SPACE 1 86052000 EIXREOFA OI ECFLAG0,$ECEOF FLAG END OF FILE 86054000 BAL RCC,EIFIN GET COND CODE AND RETURN 86056000 SPACE 1 86058000 EIXREOF MVI ECFLAG1,$ECREADR SHOW READ BEYOND END OF FILE 86060000 LA R1,EICCREAD SHOW EOF OCCURRED M 86062000 NI ECPRFLG3,ECNOSPI MAKE SURE SPIE IS OFF FOR SAFETY M 86063000 B EIITIA GO TO EXIT ROUTINE M 86064000 SPACE 2 86066000 * XPRNT PSEUDO INSTRUCTION - PRINT A LINE 86068000 EIXPRNT EQU * 86070000 $PRNT 0(RAD1),(RWK1),EIXRECEX PRINT THE LINE 86072000 B EIFIN RETURN FOR THE NEXT INSTRUCTION 86074000 SPACE 2 86076000 * XPNCH PSEUDO INSTRUCTION - PUNCH A CARD 86078000 EIXPNCH EQU * 86080000 $PNCH 0(RAD1),(RWK1),EIXRECEX PUNCH THE CARD 86082000 B EIFIN RETURN FOR NEXT INST 86084000 SPACE 2 86086000 AIF (&$XXIOS).EIXIOS1 SKIP IF NOT ALLOWED XGET , XP T 86088000 * XGET PSEUDO INSTRUCTION INPUT 86090000 EIXGET EQU * 86092000 $GET 0(RAD1),(RAD2) DO GET INPUT CEH 86094000 BAL RCC,EIFIN GET CC AND RETURN 86096000 SPACE 2 86098000 * XPUT PSEUDO INSTRUCTION DO OUTPUT 86100000 EIXPUT EQU * 86102000 $PUT 0(RAD1),(RAD2) DO PUT OUTPUT CEH 86104000 BAL RCC,EIFIN GET CC AND RETURN FOR NEXT INSTR 86106000 AGO .EIXIOS2 SKIP LABEL SAVING 86108000 .EIXIOS1 ANOP 86110000 EIXGET EQU EIOC1 MAKE XGET AN ERROR CPP 86112000 EIXPUT EQU EIOC1 MAKE XPUT AN ERROR CPP 86114000 .EIXIOS2 ANOP 86116000 SPACE 2 86118000 EIXRECHK CLI ECFLAG1,$ECRECEX DID XXXXSNAP SET FLAG? 86120000 BNE EIFIN NO,SO DON'T BOMB USER OUT 86122000 EIXRECEX MVI ECFLAG1,$ECRECEX SET RECORDS EXCEEDED FLAG 86124000 EICNTEXC LA R1,EICCRECE SHOW RECORDS EXCEEDED MESSAGE 86126000 NI ECPRFLG3,ECNOSPI MAKE SURE SPIE IS OFF FOR SAFETY M 86127000 B EIITIA GO TO FINISH UP AND RETURN 86128000 SPACE 2 86130000 * XDUMP PSEUDO INSTRUCTION - DUMP STORAGE AND REGISTERS 86132000 EIXDUMP EQU * ENTRY LABEL FOR STORAGE XDUMP 86134000 LR R10,REC MOVE ECONTROL POINTER FOR XXXXSNAP 86136000 XSNAP T=(NO,,1),LABEL='USER STORAGE',STORAGE=(*0(RAD1),*0(RWK1X86138000 ,RAD1)) 86140000 B EIXRECHK GO CHECK FOR RECORD OVERFLOW 86142000 SPACE 2 86144000 EIXDUMPR EQU * 86146000 LR R10,REC MOVE ECONTROL POINTER FOR XXXXSNAP 86148000 XSNAP T=(PR,,1),LABEL='USER REGISTERS' 86150000 B EIXRECHK GO CHECK FOR RECORD OVERFLOW 86152000 SPACE 2 86154000 * XLIMD PSEUDO INSTRUCTION -- LIMIT DUMP AREA 86156000 EIXLIMD EQU * 86158000 LA RAD2,0(RWK1,RAD1) GET SECOND LIMIT REAL ADDRESS 86160000 BCT RWK1,*+8 IF RWK1=1 (OMITTED) USE END OF PROG 86162000 L RAD2,ECRADH LENGTH=1 USE HIGHEST @ INSTEAD 86164000 ST RAD1,ECRDLIML ECRDLIML - ECRDLIMH - NEW LIMITS 86166000 ST RAD2,ECRDLIML+4 STORE NEW LIMITS 86168000 B EIFIN RETURN FOR NEXT INSTRUCTION 86170000 EJECT 86172000 * THE FOLLOWING CODE INTERPRETS THE XOPC PSEUDO INSTRS 86174000 SPACE 5 86176000 * CHECK IF LEGAL CODE # IS SPECIFIED IN THE IMMED FIELD 86178000 * OF THE INSTR -- IF OK, BRANCH TO INDIVIDUAL XOPC 86180000 * ROUTINES. 86182000 EIXOPC EQU * 86184000 C R7,=A(EC#XOPC) IS CODE # LEGAL ? 86186000 BNH EIXOPCOK YES, BR AROUND ERROR CODE 86188000 TM *+1,1 SET CC = 3 TO NOTE ERROR 86190000 BAL RCC,EIFINRR GET CC, FETCH NEXT INSTR 86192000 EIXOPCOK EQU * 86194000 LR RWK1,R7 COPY CODE # FOR OFFSET INDEX 86196000 ALR RWK1,RWK1 GET INDEX INTO OFFSET TABLE 86198000 LH RWK1,EIOPCJMP(RWK1) GET BRANCH OFFSET TO ROUTINE 86200000 B EIXOPC(RWK1) BRANCH TO ROUTINE 86202000 SPACE 5 86204000 * THE FOLLOWING CODE PROCESSES THE INDIVIDUAL XOPC 86206000 * PSEUDO INSTRUCTIONS 86208000 SPACE 2 86210000 * XOPC 0 (SET UP PSEUDO SPIE) 86212000 EIOPC0 EQU * 86214000 L RWK1,ECREG1 GET USER SPECIFIED EXIT @ 86216000 LA RWK0,1 ASSUME LENGTH-1 = 1 86218000 BAL RLINK,EIXOPCHK CHECK GIVEN ADDRESS FOR CORRECTNESS 86220000 ST RWK1,ECPRSPIE SET USER SPIE EXIT ADDR 86222000 MVC ECPRSCDE(4),ECREG0 SET USER SPIE CODE MASK 86224000 OI ECPRFLG3,B'10000000' TURN ON FLAG NOTE SPIE IS SET 86226000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86228000 SPACE 2 86230000 * INSTRUCTION TRACE XOPC INSTRUCTIONS 86232000 * 86234000 * CHECK AND SET LIMIT ADDRESSES FOR TRACE 86236000 EIOPC1 EQU * 86238000 EIOPC3 EQU EIOPC1 86240000 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR TRACE 86242000 CR RWK0,RWK1 ARE ADDRESSES RELATIVELY CORRECT ? 86244000 BNL EIXOPCC1 BRANCH IF NOT 86246000 BAL RLINK,EIXOPCHA CHECK ADDRESSES FOR LEGALITY 86248000 STM RWK0,RWK1,ECPRTRAL SET TRACE ADDRESS LIMITS IN PRCB 86250000 BCTR R7,0 XOPC CODE# = CODE#-1 86252000 LTR R7,R7 IS CODE = 1 (R7 = 0) ? 86254000 BZ EIXOPCC0 YES, DOING XOPC 1 - FINISHED 86256000 * TURN ON INSTRUCTION TRACE FACILITY 86258000 EIOPC2 EQU * 86260000 OI ECPRFLG1,ECPRTRCE TURN ON TRACE FACILITY 86262000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86264000 * TURN OFF INSTRUCTION TRACE FACILITY 86266000 EIOPC4 EQU * 86268000 NI ECPRFLG1,255-ECPRTRCE TURN OFF TRACE FACILITY 86270000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86272000 SPACE 2 86274000 * STORAGE MODIFICATION CHECK XOPC INSTRUCTIONS 86276000 * 86278000 * CHECK AND SET LIMIT ADDRESSES FOR MOD CHECK 86280000 EIOPC5 EQU * 86282000 EIOPC7 EQU EIOPC5 86284000 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR MOD CHK 86286000 CR RWK0,RWK1 ARE ADDRS RELATIVELY CORRECT ? 86288000 BNL EIXOPCC1 BRANCH IF NOT 86290000 BAL RLINK,EIXOPCHA CHECK IF ADDRESSES ARE LEGAL 86292000 STM RWK0,RWK1,ECPRMODL SET MOD CHECK ADDRESSES 86294000 LA RWK1,5 LOAD CODE # COMPARATOR 86296000 CR R7,RWK1 IS THIS AN XOPC 5 INSTR ? 86298000 BE EIXOPCC0 YES - FINISHED 86300000 * TURN ON MODIFICATION CHECK FACILITY 86302000 EIOPC6 EQU * 86304000 OI ECPRFLG1,ECPRMODC TURN ON MOD CHECKING 86306000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86308000 * TURN OFF MODIFICATION CHECKING FACILITY 86310000 EIOPC8 EQU * 86312000 NI ECPRFLG1,255-ECPRMODC TURN OFF MOD CHECKING 86314000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86316000 SPACE 2 86318000 * TURN ON ALIGNMENT CHECKING (360 STYLE) 86320000 * (OC-6 ALIGNMENT INTERRUPTS ALLOWED) 86322000 EIOPC9 EQU * 86324000 OI ECPRFLG2,ECALNCHK TURN ON CHECKING 86326000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86328000 * TURN OFF ALIGNMENT CHECKING (370 STYLE) 86330000 * (OC-6 ALIGNMENT INTERRUPTS NOT ALLOWED) 86332000 EIOPC10 EQU * 86334000 NI ECPRFLG2,255-ECALNCHK TURN OFF CHECKING 86336000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86338000 SPACE 2 86340000 * XOPC 11 (FETCH INSTRUCTION COUNT) 86342000 EIOPC11 EQU * 86344000 MVC ECREG0(4),ECILIMT PUT COUNT IN USER REG 0 86346000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86348000 SPACE 2 86350000 * XOPC 12 - EMULATE SYSTEM 360 86352000 EIOPC12 EQU * 86354000 NI ECPRFLG2,B'11110011' SHUT OFF ALL EMULATION BITS 86355000 OI ECPRFLG2,ECEM360 SHOW NOW EMULATING A 360 86355500 MVI EITSTMSK+1,ECEM360 SET TM INSTR FOR NO 370 INSTRS 86356000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86358000 SPACE 2 86360000 * XOPC 13 - EMULATE SYSTEM 370 86362000 EIOPC13 EQU * 86364000 NI ECPRFLG2,B'11110011' SHUT OFF ALLL EMULATION BITS 86365000 OI ECPRFLG2,ECEM370 SHOW NOW EMULATING A 370 86365500 MVI EITSTMSK+1,ECEM370 SET TM INSTR FOR BOTH 370 AND 360 86366000 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86368000 SPACE 2 86520000 * XOPC 14 - SET INTERRUPT COUNT 86522000 EIOPC14 EQU * 86524000 MVC ECPRCMPR(4),ECREG0 MOVE GIVEN VALUE TO PRCB 86526000 B EIXOPCC0 BRANCH TO COMMON EXIT CODE 86528000 SPACE 2 86530000 * XOPC 15 - SET COUNT EXIT ADDRESS 86532000 EIOPC15 EQU * 86534000 MVC ECPRCLEA(4),ECREG0 MOVE GIVEN EXIT ADDRESS PRCB 86536000 OI ECPRFLG4,ECLKADR TURN ON FLAG TO NOTE CLOCK EXIT ADDR 86537000 B EIXOPCC0 BRANCH TO COMMON EXIT CODE 86538000 SPACE 3 86538100 * INSTRUCTION EXECUTION COUNT FACILITY INSTRUCTIONS 86538105 * 86538110 * XOPC 17 AND XOPC 18 86538112 * CHECK AND SET LIMIT ADDRESSES FOR COUNT FACILITY 86538115 EIOPC17 EQU * 86538120 EIOPC18 EQU * 86538125 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR COUNT 86538135 CR RWK0,RWK1 ARE ADDRESSES RELATIVELY CORRECT ? 86538140 BNL EIXOPCC1 BRANCH IF NOT SET CC = 1 86538145 BAL RLINK,EIXOPCHA CHECK ADDRESSES FOR LEGALITY 86538150 STM RWK0,RWK1,ECPRICL SET COUNT LIMIT ADDRESSES IN PRCB 86538155 CLI R7,X'11' IS XOPC CODE 17 OR 18? 86538160 BE EIXOPCC0 IS 17, SO FINISHED 86538165 SPACE 3 86538167 * TURN ON THE INSTRUCTION EXECUTION COUNT FACILITY 86538170 EIOPC16 EQU * 86538180 TM ECPRFLG1,ECPRNOSP TEST PRCB FOR NO COUNTING SPACE AVAL 86538190 BO EIXOPCC1 NO SPACE AVAILABLE, QUIT 86538200 TM ECPRFLG1,ECPRCTON HAS SPACE FOR COUNT ALREADY ALLOCED 86538210 BO EINOALL SPACE ALREADY ALLOCATED 86538220 L RWK0,ECFADH GET HIGH PROG ADDR IN REG 0 86538230 S RWK0,ECFADL SUBTRACT TO FIND CORE LENGTH NEEDED 86538240 LA R9,ECPRICA GET ADDR IECF AREAS IN ECONTROL 86538270 GETMAIN EC,LV=(0),A=(R9),SP=1 TRY GET LENGTH USER PROG 86538280 LTR R15,R15 TEST TO SEE IF WE GOT WHAT WE NEEDED 86538290 BZ EISPCOK IF CC=0, WE GOT WHAT WE NEEDED 86538300 OI ECPRFLG1,ECPRNOSP IF NOT, NOT ENOUGH SPACE - SET FLAG. 86538310 B EIXOPCC1 AND QUIT. 86538320 EISPCOK EQU * 86538330 ST RWK0,ECPRICAL GOT AMOUNT NEEDED STORE LENGTH 86538335 OI ECPRFLG1,ECPRCTON NOTE ALLOCATION OF COUNTER SPACE 86538340 EINOALL EQU * 86538350 OI ECPRFLG1,ECPRIECF NOTE THAT THE COUNT FACILITY IS ON 86538360 B EIXOPCC0 BRANCH TO COMMON XOPC RETURN CODE 86538370 SPACE 3 86538375 * XOPC 19 86538377 * TURN OFF THE INSTRUCTION EXECUTION COUNT FACILITY 86538380 EIOPC19 EQU * 86538390 NI ECPRFLG1,255-ECPRIECF TURN OFF THE COUNT FACILITY FLAG 86538400 B EIXOPCC0 BRANCH TO COMMON XOPC RETURN CODE 86538410 SPACE 3 86538415 * XOPC 20 86538417 * CLEAR INSTRUCTION EXECUTION COUNT FACILITY COUNT AREAS 86538420 EIOPC20 EQU * 86538430 TM ECPRFLG1,ECPRCTON TEST FOR COUNT SPACE ALLOCATION 86538440 BNO EIXOPCC1 IF NOT ALLOCATED, CANNOT CLEAR IT 86538450 L RWK1,ECPRICA GET ADDRESS OF CORE TO BE CLEARED 86538460 L R9,ECPRICAL GET LENGTH OF CORE TO BE CLEARED 86538470 BCTR R9,0 GET LENGTH IN WORKABLE FORM 86538480 C R9,=XL4'000000FF' IS LENGTH > 256 BYTES 86538490 BNH EIREMAIN IF NOT > 256 BYTES CLEAR USING EX 86538500 XR R8,R8 ZERO OUT R8 FOR DIVIDE 86538505 D R8,=XL4'00000100' DIVIDE LEN BY 256 GIVING REMAINDER 86538510 EIOPCLP EQU * 86538520 XC 0(256,RWK1),0(RWK1) ZERO OUT 256 BYTE AREA 86538530 LA RWK1,256(RWK1) MOVE ADDRESS POINTER OVER 86538540 BCT R9,EIOPCLP GO BACK AND GET NEXT 256 BYTE AREA 86538550 LTR R9,R8 PUT REMNDR WHERE NEEDED BY EXECUTE 86538560 BZ EIXOPCC0 IF REMAINDER IS 0 WE ARE DONE 86538570 EIREMAIN EQU * 86538580 EX R9,EIXOPCXC EXECUTE XC TO DO REMAINING BYTES 86538590 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86538600 EIXOPCXC XC 0(0,RWK1),0(RWK1) ZERO OUT REMAINING BYTES IN COUNT 86538610 SPACE 3 86538615 * XOPC 21 (RETURN FROM INTERRUPT HANDLING STATE) 86540000 EIOPC21 EQU * 86542000 TM ECPRFLG3,ECINHDST TEST SEE IF IN INTERRUPT HANDLING 86544000 BO EIOPC21A IF WE ARE CONTINUE XOPC INSTR 86546000 TM *,X'FF' SET CC=1 TO DENOTE ERROR 86548000 BAL RCC,EIFINRR GET CC, FETCH NEXT INSTR 86550000 EIOPC21A EQU * 86552000 L RIA,ECREG1 GET RESUMING ADDR FROM USER REG 1 86554000 MVC ECREG0(8),ECPRIRGS RELOAD USER REGISTERS 0 AND 1 86556000 NI ECPRFLG3,B'10111111' TURN OFF INTERRUPT HANDLING FLAG 86558000 SR RWK1,RWK1 SET CC = 0 TO NOTE OKAY EXEC 86560000 BAL RCC,EIFINB GET NEXT INSTR TREAT XOPC 21 AS BR 86560050 SPACE 5 86560060 * XOPC 22 - DUMP INSTRUCTION EXECUTION COUNT STATISTICS 86560070 SPACE 2 86560075 * THIS SECTION PRINTS THE STATISTICAL REPORT FOR THE 86560080 * INSTRUCTION EXECUTION COUNT FACILITY. DUE TO THE TABLE 86560081 * DESIGN OF IECF, MANY POINTERS ARE USED AND REGISTER 86560082 * USAGE DIFFERS A LITTLE FROM THAT IN THE REST OF THE 86560083 * EXTENDED INTERPRETER. REGISTER USAGE IN THIS SECTION IS 86560084 * AS FOLLOWS: RWK0 - GENERAL WORK REGISTER 86560085 * RWK1 - OFFSET POINTER IN COUNT TABLE 86560086 * R7 - GENERAL WORK REGISTER 86560087 * R8 - THE CURRENT INSTRUCTION COUNT 86560088 * R9 - BASE ADDRESS OF COUNTING AREA 86560089 * R10 - BASE ADDRESS OF USER PROGRAM AREA 86560090 * RWK14 - CURRENT PROGRAM RELATIVE ADDRESS 86560091 * BEING INSPECTED 86560092 * IT SHOULD BE NOTED THAT THIS SECTION IS VERY INSTRUCTION 86560093 * LENGTH DEPENDENT. ANY NEW INSTRUCTION DIFFERING IN THE 86560094 * TRADITIONAL LENGTH CODES WILL DRASTICALLY EFFECT THIS 86560095 * SECTION. 86560096 SPACE 3 86560097 EIOPC22 EQU * 86560100 TM ECPRFLG1,ECPRCTON TEST COUNT SPACE ALLOCATION 86560120 BNO EIXOPCC1 IF NEVER ALLOCATED CANNOT DUMP IT 86560130 L RWK1,ECFADL GET FAKE BEGIN INSTR ADDR 86560140 LA R10,0(RMEM,RWK1) GET PHYSICAL REAL STARTING INSTR ADR 86560150 L RWK1,ECPRICL GET BEGINNING COUNTABLE FAKE INSTR 86560155 ST RWK1,EISAV22 SAVE FIST OFFSET AS BEG LOOP ADDR 86560160 LR RWK14,RWK1 SAVE FIRST ADDR FOR LATER USE 86560165 S RWK1,ECFADL SET OFFSET POINTER AT BEG 86560170 SR R8,R8 ZERO OUT COUNT SAVING REGISTER 86560180 L R9,ECPRICA GET STARTING ADDRESS OF COUNT SPACE 86560190 SPACE 2 86560195 EILOP22 EQU * 86560200 CH R8,0(RWK1,R9) IS THE NEW COUNT THE SAME AS OLD? 86560210 BE EIMVPNTR IF SAME, MOVE POINTER OVER 86560220 SPACE 2 86560225 * THIS SECTION ACTUALLY PRINTS THE STATISTICS LINE 86560230 LTR R8,R8 WAS THE OLD COUNT ZERO? 86560240 BZ EINEWCT IF OLD WAS ZERO, JUST SAVE & RETURN 86560250 L RWK0,EIEND22 GET ENDING ADDR OF THIS LOOP 86560260 XHEXO RWK0,EISTEND CONVERT ENDING ADDR TO HEX 86560270 L RWK0,EISAV22 SET BEGINNING ADDR OF THIS LOOP 86560280 XHEXO RWK0,EISTBEG CONVERT BEGINNING ADDR TO HEX 86560290 XDECO R8,EISTCNT CONVERT INSTR COUNT TO DECIMAL 86560300 MVC EISTBEG(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 86560310 MVC EISTEND(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 86560320 $PRNT EISTMSG,EISTMSGL,EICNTEXC PRINT STATISTICAL LINE 86560330 SPACE 2 86560335 EINEWCT EQU * 86560340 ST RWK14,EISAV22 SAVE BEGINNING LOOP ADDRESS 86560350 LH R8,0(RWK1,R9) REPLACE OLD COUNT WITH NEW 86560360 SPACE 2 86560365 EIMVPNTR EQU * 86560370 ST RWK14,EIEND22 SAVE ENDING LOOP ADDRESS 86560380 LTR R8,R8 TEST FOR ZERO COUNT 86560390 BZ EIRR22 ASSUME 2 BYTE LENGTH INSTRS ON H-WRD 86560400 LA R7,0(RWK1,R10) GET ADDRESS OPCODE OF PRES INSTR 86560410 TM 0(R7),X'C0' TEST OPCODE FOR LENGTH 86560420 BM EIRXSI22 BRANCH IF LENGTH EQUAL 4 86560430 BO EISS22 BRANCH IF AN SS INSTR LENGTH = 6 86560440 SPACE 2 86560445 EIRR22 EQU * 86560450 LA RWK1,2(RWK1) LENGTH = 2 INCERMENT AND CHECK DONE 86560460 B EICHK22 BRANCH CHECK IF DONE 86560470 SPACE 2 86560475 EIRXSI22 EQU * RX OR SI THEN LENGTH =4 86560480 LA RWK1,4(RWK1) LENGTH = 4 INCERMENT AND CHECK 86560490 B EICHK22 CHECK FOR FINISHED 86560500 SPACE 2 86560503 EISS22 EQU * LENGTH = 6 86560505 LA RWK1,6(RWK1) INCERMENT OFFSET AND CHECK 86560510 EICHK22 EQU * 86560520 LR RWK14,RWK1 MOVE OFFSET FOR ADDR CALCULATION 86560530 A RWK14,ECFADL ADD TO GET NEW USER PROGRAM ADDR 86560540 C RWK14,ECPRICH TEST TO SEE IF OUT OF COUNTING RANGE 86560550 BL EILOP22 IF NOT OUT OF RANGE CONTINUE 86560560 LTR R8,R8 IF FINISHED CHECK LAST COUNT 86560570 BZ EIXOPCC0 IF ZERO, DONE, BRANCH COMMON CODE 86560580 L RWK0,EIEND22 GET LAST ENDING ADDRESS 86560590 SPACE 2 86560592 * THIS SECTION PRINTS THE LAST STATISTICS LINE 86560595 XHEXO RWK0,EISTEND CONVERT ENDING ADDRESS TO HEX 86560600 L RWK0,EISAV22 SET BEGINNING ADDR OF THIS LOOP 86560610 XHEXO RWK0,EISTBEG CONVERT BEGINNING ADDRESS TO HEX 86560620 XDECO R8,EISTCNT CONVERT INSTR "OUNT TO DECIMAL 86560630 MVC EISTBEG(2),EISTBLK BLANK OUT FORST TWO BYTES OF ADDR 86560640 MVC EISTEND(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 86560650 $PRNT EISTMSG,EISTMSGL,EICNTEXC PRINT STATISTICAL LINE 86560660 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 86560670 SPACE 2 86560675 EISTMSG DC C' STATS--> BEGIN ADDR:' STATISTICS MESSAGE 86560680 EISTBEG DC 8C' ' STATS MESSAGE 86560690 DC C' END ADDR:' STATS MESSAGE 86560700 EISTEND DC 8C' ' STATS MESSAGE 86560710 DC C' INSTRUCTION COUNT:' STATS MESSAGE 86560720 EISTCNT DC 12C' ' STATS MESSAGE 86560730 EISTMSGL EQU *-EISTMSG LENGTH OF STATISTICAL MESSAGE 86560740 EISTBLK DC 2C' ' BLANK AREA 86560750 EIEND22 DS F ENDING LOOP ADDRESS 86560760 EISAV22 DS F BEGINNING LOOP ADDRESS 86560770 SPACE 2 86562000 * THIS IS THE XOPC COMMON EXIT CODE 86564000 EIXOPCC0 EQU * 86566000 SR RWK1,RWK1 SET CC=0 NOTE OK EXECUTION 86568000 BAL RCC,EIFINRR BRANCH BACK AND FETCH NEXT INSTR 86569000 SPACE 2 86570000 * THIS IS THE XOPC EXIT CODE FOR CC = 1 86571000 EIXOPCC1 EQU * 86571050 O RWK1,=XL4'11' SET CC=1 TO NOTE USER ERROR 86571100 BAL RCC,EIFINRR GET CC AND BRANCH TO FETCH NXT INSTR 86571200 SPACE 3 86571300 **--> INSUB: EIBASDSP CALCULATE BASE/DISPLACEMENT + + + + + + + + 86572000 *+ + 86574000 *+ ENTRY CONDS: + 86576000 *+ RWK0 - MUST CONTAIN THE APPROPRIATE HALFWORD OF THE + 86578000 *+ INSTRUCTION + 86580000 *+ EXIT CONDS: + 86582000 *+ RWK0 - CONTAINS THE CALCULATED RELATIVE ADDRESS + 86584000 *+ (NOT RELOCATED FOR ASSIST) + 86586000 *+ RWK1 - CONTENTS ARE DESTROYED + 86588000 *+ + 86590000 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 86592000 SPACE 2 86594000 EIBASDSP EQU * 86596000 LR RWK1,RWK0 COPY B/D OVER 86598000 N RWK0,=XL4'FFF' REMOVE BASE, LEAVING DISP 86600000 N RWK1,=XL4'F000' REMOVE DISP, LEAVING BASE 86602000 BCR Z,RLINK IF NO BASE, RETURN 86604000 SRL RWK1,10 MULT BASE REG BY 4 FOR INDEX 86606000 AL RWK0,ECREGS(RWK1) ADD IN BASE REG'S VALUE 86608000 N RWK0,EILONGMK ZERO OUT HIGH ORDER BYTE 86610000 BR RLINK RETURN TO CALLER 86612000 SPACE 5 86614000 **--> INSUB: EIMSFCHK MODIFICATION & RANGE CHECKING ROUTINE + + + 86616000 *+ + 86618000 *+ THIS ROUTINE CHECKS THE ADDRESS IN RWK1 FOR BEING WITHIN + 86620000 *+ THE ALLOWABLE RANGE. MODIFICATION CHECKING IS ALSO + 86622000 *+ PERFORMED IF THE INSTRUCTION MODIFIES STORAGE. + 86624000 *+ + 86626000 *+ ENTRY CONDS: + 86628000 *+ RWK1 - CONTAINS THE ADDRESS TO BE CHECKED + 86630000 *+ RWK0 - CONTAINS THE LENGTH OF STORAGE AFFECTED + 86632000 *+ RLINK - CONTAINS THE RETURN ADDRESS + 86634000 *+ EIWORK - IS A STORAGE AREA THAT MUST CONTAIN THE CONTROL + 86636000 *+ BYTE EICTB3 (SHIFTED LEFT 2 BITS IF 2ND OPRND) + 86638000 *+ EXIT CONDS: + 86640000 *+ RWK0 - IS DESTROYED + 86642000 *+ RWK1 - IS DESTROYED + 86644000 *+ + 86646000 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 86648000 SPACE 2 86650000 EIMSFCHK EQU * 86652000 * DETERMINE WHAT CHECKING TO PERFORM 86654000 BCTR RWK0,0 RWK0 CONTAINS LENGTH-1 86656000 ALR RWK0,RWK1 GET @ OF HIGHEST BYTE ACCESSED 86658000 TM EIWORK,EI1STORE WHAT CHECKING IS TO BE DONE ? 86660000 BCR Z,RLINK RETURN IF NO CHECKING 86662000 BO EISTRCHK BRANCH TO DO STORE CHECKING 86664000 * PERFORM FETCH CHECKING 86666000 TM ECFLAG0,$ECPROT IS ABSOLUTE PROTECT MODE ON ? 86668000 BCR Z,RLINK RETURN IF NOT 86670000 EIFTHCHK EQU * 86672000 C RWK1,ECFADL IS BEGINNING @ TOO LOW ? 86674000 BL EIOC4 YES, SO ERROR 86676000 C RWK0,ECFADH IS ENDING @ TOO HIGH ? 86678000 BCR L,RLINK RETURN IF NOT (ADDR IS OK) 86680000 B EIOC4 @ IS TOO HIGH, SO ERROR 86682000 * PERFORM STORE CHECKING 86684000 EISTRCHK EQU * 86686000 C RWK1,ECFADL IS BEGINNING @ TOO LOW ? 86688000 BL EIOC4 YES, SO ERROR 86690000 C RWK0,ECFADH IS ENDING @ TOO HIGH ? 86692000 BH EIOC4 YES, SO ERROR 86694000 * PERFORM MODIFICATION CHECKING 86696000 TM ECPRFLG1,ECPRMODC IS MOD CHECK OPTION ON ? 86698000 BCR Z,RLINK NO, SO RETURN TO CALLER 86700000 C RWK1,ECPRMODH IS BEGINNING @ HIGHER THAN CHK AREA? 86702000 BCR H,RLINK RETURN IF YES 86704000 C RWK0,ECPRMODL IS ENDING @ LOWER THAN CHECK AREA ? 86706000 BCR L,RLINK RETURN IF YES 86708000 * IF HERE, THE INSTRUCTION MODIFIES STORAGE WITHIN THE 86710000 * CHECKING AREA. PERTINENT INFORMATION IS PRINTED FOR THE 86712000 * USER PROGRAMMER. 86714000 XHEXO RWK0,EICKHIGH CONVERT HIGH @ TO HEX FOR PRINTING 86716000 MVC EICKHIGH(2),EIBLANKS BLANK OUT 1ST 2 DIGITS 86718000 XHEXO RWK1,EICKLOW CONVERT LOW @ TO HEX FOR PRINTING 86720000 MVC EICKLOW(2),EIBLANKS BLANK OUT 1ST 2 DIGITS 86722000 L RWK1,ECSTIADD GET INSTRUCTION ADDR 86724000 XHEXO RWK1,EICKINAD CONVERT INSTR ADDR TO HEX FOR PRNT 86726000 MVC EICKINAD(2),EIBLANKS BLANK OUT 1ST 2 DIGITS 86728000 MVC EICKINST+4(10),EIBLANKS BLANK OUT INSTR AREA 86730000 LM RWK0,RWK1,ECSTCCPM FETCH INSTR FROM INSTR STACK 86732000 SLDL R0,16 RR AND RX CODE IN REG 0 86734000 XHEXO RWK0,EIWORK CONVERT 1ST 4 BYTES TO HEX 86736000 TM ECSTINST,EISSINST IS THISAN SS INSTR ? 86738000 BNO EINOTSSI BRANCH IF NOT 86740000 XHEXO RWK1,EIWORK+8 CONVERT LAST 2 BYTES TO HEX 86742000 EINOTSSI EQU * 86744000 LA RWK1,EICKINST GET @ OF THE HEX INSTR 86746000 BAL R2,EIMOVINS MOVE HEX INSTR TO PRINT FORMAT 86748000 $PRNT EICHKMSG,EICHKMSL,EICNTEXC PRINT INSTR FOR MOD CHK, X86750000 BR OUT IF COUNT EXCEEDED 86752000 BR RLINK RETURN TO CALLER 86754000 * THE FOLLOWING STORAGE IS USED AS A PRINT FORMAT AREA BY 86756000 * THE MODIFICATION CHECK FACILITY 86758000 EICHKMSG DC C' CHECK--> INSTR ADDR:' 86760000 EICKINAD DC 8C' ' 86762000 DC C' INSTR: ' 86764000 EICKINST DC 14C' ' 86766000 DC C' MODIFICATION LIMIT ADDRS--> LOW:' 86768000 EICKLOW DC 8C' ' 86770000 DC C' HIGH:' 86772000 EICKHIGH DC 8C' ' 86774000 EICHKMSL EQU *-EICHKMSG LENGTH OF PRINT MESSAGE 86776000 SPACE 5 86778000 **--> INSUB: EIMOVINS MOVE HEX INSTR TO PRINT FORMAT + + + + + + + 86780000 *+ + 86782000 *+ THIS INSUB MOVES A HEXIDECIMAL INSTRUCTION TO A + 86784000 *+ SPECIFIED AREA WITH BLANKS INSERTED TO RESEMBLE + 86786000 *+ SOURCE CODE LISTING FORMAT. + 86788000 *+ + 86790000 *+ ENTRY CONDS: + 86792000 *+ RWK1 - CONTAINS THE TARGET ADDRESS FOR THE MOVE + 86794000 *+ R2 - USED AS THE BAL LINK REG + 86796000 *+ EIWORK- ASSUMED TO BE THE FETCH AREA FOR THE MOVE + 86798000 *+ EXIT CONDS: + 86800000 *+ R2 - IS RE-CLEARED AS A BYTE REG + 86802000 *+ RWK0 & + 86804000 *+ RWK1 - CONTENTS DESTROYED + 86806000 *+ + 86808000 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 86810000 SPACE 2 86812000 EIMOVINS DS 0H 86814000 ST R2,EIMOVSAV SAVE RETURN ADDR 86816000 SR RWK0,RWK0 CLEAR LOOP COUNTER REG 86818000 IC RWK0,EICTB2 GET INSTR LEN FOR LOOP COUNT 86820000 SRL RWK0,1 DIVIDE LENGTH BY 2 FOR LOOP CTR 86822000 LA R2,EIWORK GET @ OF FETCH AREA 86824000 EIMOVEIN EQU * 86826000 MVC 0(4,RWK1),0(R2) MOVE 4 HEX BYTES 86828000 LA RWK1,5(RWK1) INCREMENT TARGET ADDRESS 86830000 LA R2,4(R2) INCREMENT FETCH ADDRESS 86832000 BCT RWK0,EIMOVEIN IF CTR ^= 0, CONTINUE LOOP 86834000 L RWK1,EIMOVSAV GET RETURN ADDRESS 86836000 SR R2,R2 CLEAR BYTE REG 86838000 BR RWK1 RETURN TO CALLER 86840000 EIMOVSAV DC F'0' RET ADDR SAVED HERE 86842000 SPACE 5 86844000 **--> INSUB: EIXOPCHK CHECK ADDRESSES FOR XOPC INSTRUCTIONS + + + 86846000 *+ + 86848000 *+ ENTRY CONDITIONS: + 86850000 *+ RWK1 - CONTAINS THE ADDRESS TO BE CHECKED (LOW @) + 86852000 *+ RWK0 - CONTAINS LENGTH-1 OF STORAGE AFFECTED + 86854000 *+ RLINK - INTERNAL LINK REGISTER + 86856000 *+ EXIT CONDITIONS: + 86858000 *+ RWK0 - CONTENTS (LENGTH) DESTROYED, UNLESS + 86860000 *+ EIXOPCHA IS CALLED WITH RWK0 CONTAINING + 86862000 *+ THE HIGH ADDRESS --> (LOW @ + LENGTH - 1) + 86864000 *+ + 86866000 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 86868000 SPACE 2 86870000 EIXOPCHK EQU * 86872000 ALR RWK0,RWK1 COMPUTE HIGH ADDRESS 86874000 EIXOPCHA EQU * 86876000 C RWK1,ECFADL IS LOW ADDRESS IN RANGE ? 86878000 BL EIXOPCC1 NO, BRANCH TO NOTE ERROR 86880000 C RWK0,ECFADH IS HIGH ADDRESS IN RANGE ? 86882000 BCR L,RLINK YES, SO RETURN 86884000 B EIXOPCC1 NO, BRANCH TO NOTE ERROR 86886000 LTORG 86890000 SPACE 2 86892000 * TABLE FOR THE XOPC INSTRUCTION DISPLACEMENTS 86894000 EIOPCJMP $AL2 EIXOPC,(EIOPC0,EIOPC1,EIOPC2,EIOPC3,EIOPC4,EIOPC5,EIOPC6X86896000 ,EIOPC7,EIOPC8,EIOPC9,EIOPC10,EIOPC11,EIOPC12,EIOPC13,EIX86898000 OPC14,EIOPC15,EIOPC16,EIOPC17,EIOPC18,EIOPC19,EIOPC20,EIX86900000 OPC21,EIOPC22) 86900100 SPACE 2 86902000 * TABLE FOR EXTENDED I/I INSTRUCTION DISPLACEME1T 86904000 EIXIOJ $AL2 EISPEJMP,(EIXREAD,EIXPRNT,EIXPNCH,EIXDUMP,EIXLIMD,EIXGETX86906000 ,EIXPUT,EIOC1) 86908000 .EINOXIO ANOP 86910000 SPACE 2 86912000 * OFF SETS TO COMPLETION CODE MESSAGES 86914000 EICOFFS $AL2 EICC0,(EICC1,EICC2,EICC3,EICC4,EICC5,EICC6,EICC7,EICC8,EX86916000 ICC9,EICCA,EICCB),-2 STANDARD INTERRUPT POINTERS 86918000 AIF (NOT &$FLOTE).EIFL6 SKI1IF NO FLOATING INTERRUPTS 86920000 $AL2 EICC0,(EICCC,EICCD,EICCE,EICCF) FLOATING INTERS 86922000 .EIFL6 ANOP 86924000 SPACE 2 86926000 * COMPLETION CODE MESSAGES 86928000 EICC0 EQU * 86930000 EICC1 $ERCGN 0C1,'OPERATION' 86932000 EICC2 $ERCGN 0C2,'PRIVILEGED OP)RATION' 86934000 EICC3 $ERCGN 0C3,'EXECUTE' 86936000 EICC4 $ERCGN 0C4,'PROTECTION' 86938000 EICC5 $ERCGN 0C5,'ADDRESSING' 86940000 EICC6 $ERCGN 0C6,'SPECIFICATION' 86942000 EICC7 $ERCGN 0C7,'DATA' 86944000 EICC8 $ERCGN 0C8,'FIXED-POINT OVERFLOW' 86946000 EICC9 $ERCGN 0C9,'FIXED-POINT DIVIDE' 86948000 EICCA $ERCGN 0CA,'DECIMAL OVERFLOW' 86950000 EICCB $ERCGN 0CB,'DECIMAL DIVIDE' 86952000 AIF (NOT &$FLOTE).EIFL8 SKIP MESSAGES FOR FLOATING PNT 86954000 EICCC $ERCGN 0CC,'EXPONENT OVERFLOW' 86956000 EICCD $ERCGN 0CD,'EXPONENT UNDERFLOW' 86958000 EICCE $ERCGN 0CE,'SIGNIFICANCE' 86960000 EICCF $ERCGN 0CF,'FLOATING-POINT DIVIDE' 86962000 .EIFL8 ANOP 86964000 SPACE 1 86966000 EICCREAD $ERCGN 220,'ATTEMPTED READ PAST END-FILE',TYPE=ASSIST 86968000 EICCTIME $ERCGN 221,'INSTRUCTION LIMIT EXCEEDED',TYPE=ASSIST 86970000 EICCRECE $ERCGN 222,'RECORD LIMIT EXCEEDED',TYPE=ASSIST 86972000 AIF (&$TIMER EQ 0).EINOTOC SKIP IF NO TIMER AT ALL 86974000 EICCTIMB $ERCGN 223,'TIME LIMIT EXCEEDED',TYPE=ASSIST 86976000 .EINOTOC ANOP 86978000 EICCBROU $ERCGN 224,'BRANCH OUT OF PROGRAM AREA',TYPE=ASSIST 86980000 SPACE 2 86982000 * THE FOLLOWING IS THE 256 SECONDARY CONTROL TABLE 86984000 * WHICH CONTAINS INDICES INTO THE MAIN CONTROL TABLE 86986000 EIOPCDTB EQU * 86988000 EIXTAB 2,XOPC,2,2,SPM,BALR,BCTR,BCR M 86990000 EIXTAB PRIVH,PRIVH,PRIVH,2,2,2,MVCL,CLCL M 86992000 EIXTAB NMRR,NMRR,NMRR,NMRR,NMRR,NMRR,NMRR,NMRR 86994000 EIXTAB LR,NMRR,NMRR,NMRR,MRDR,MRDR,NMRR,NMRR 86996000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR 86998000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR 87000000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR 87002000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR 87004000 EIXTAB STH,LA,STC,IC,EX,BAL,BCT,BC 87006000 EIXTAB NMRXH,NMRXH,NMRXH,NMRXH,NMRXH,4,CVD,CVB 87008000 EIXTAB ST,4,DECO,DECI,NMRXF,NMRXF,NMRXF,NMRXF 87010000 EIXTAB NMRXF,NMRXF,NMRXF,NMRXF,MD,MD,NMRXF,NMRXF 87012000 EIXTAB FPRS,HEXI,HEXO,4,4,4,4,XFPRF 87014000 EIXTAB FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF 87016000 EIXTAB FPRS,4,4,4,4,4,4,4 87018000 EIXTAB FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF 87020000 EIXTAB PRIVF,4,PRIVF,DIAG,PRIVF,PRIVF,BXH,BXLE M 87022000 EIXTAB SHFTS,SHFTS,SHFTS,SHFTS,SHFTD,SHFTD,SHFTD,SHFTD 87024000 EIXTAB STM,NMSIF,NMSIS,NMSIS,NMSIS,NMSIF,NMSIS,NMSIS 87026000 EIXTAB LM,4,4,4,PRIVF,PRIVF,PRIVF,PRIVF M 87028000 EIXTAB 4,4,4,4,4,4,4,4 87030000 EIXTAB 4,4,4,4,PRIVF,PRIVF,4,PRIVF M 87032000 EIXTAB 4,PRIVF,PRIVF,4,4,4,PRIVF,PRIVF M 87034000 EIXTAB 4,4,4,4,4,CLM,STCM,ICM 87036000 EIXTAB 6,6,6,6,6,6,6,6 87038000 EIXTAB 6,6,6,6,6,6,6,6 87040000 EIXTAB 6,MOVES,MOVES,MOVES,LOGS,LOGFS,LOGS,LOGS 87042000 EIXTAB 6,6,6,6,TR,TRT,MOVES,EDMK 87044000 EIXTAB XTND,DUMPR,6,6,6,6,6,6 L 87046000 EIXTAB 6,6,6,6,6,6,6,6 87048000 EIXTAB SRP,MVO,PACK,UNPK,6,6,6,6 87050000 EIXTAB DECS,CP,DECS,DECS,DECS,DECS,6,6 87052000 TITLE '*** EXECUT - MAIN CONTROL TABLE' 87054000 * THE FOLLOWING IS THE MAIN CONTROL TABLE FOR THE 87056000 * EXTENDED INTERPRETER 87058000 EICONTAB DS 0F L 87060000 EIT2 DC X'00020000',4X'00' L 87062000 EIT4 DC X'00040000',4X'00' L 87064000 EIT6 DC X'00060000',4X'00' L 87066000 EITAB NMRR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EINORMRR 87068000 EITAB LR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EILR 87070000 EITAB BALR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EIBALR 87072000 EITAB BCTR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EIBCTR 87074000 EITAB BCR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EIBCR 87076000 EITAB FPRR,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EIFPRR 87078000 EITAB CLCL,370,2,*,NO,NM,NO,F,F,RR4,**,***,E,E,EILONG 87080000 EITAB MVCL,370,2,*,NO,NM,NO,S,F,RR4,**,***,E,E,EILONG 87082000 EITAB SPM,360,2,*,NO,NM,**,*,*,RR4,**,***,O,O,EISPM 87084000 EITAB MRDR,360,2,*,NO,NM,**,*,*,RR4,**,***,E,O,EIMRDR 87086000 EITAB PRIVH,360,2,*,PR,NM,**,*,*,IOL,**,***,O,O,EILCTL M 87087000 EITAB NMRXF,360,4,4,NO,NM,CK,F,*,RR4,IX,FUL,O,O,EINORMRX 87088000 EITAB IC,360,4,1,NO,NM,CK,F,*,RR4,IX,NON,O,O,EINORMRX 87090000 EITAB NMRXH,360,4,2,NO,NM,CK,F,*,RR4,IX,HAF,O,O,EINORMRX 87092000 EITAB CVB,360,4,8,NO,NM,CK,F,*,RR4,IX,DBL,O,O,EINORMRX 87094000 EITAB BAL,360,4,*,NO,NM,NO,*,*,RR4,IX,NON,O,O,EIBAL 87096000 EITAB BCT,360,4,*,NO,NM,NO,*,*,RR4,IX,NON,O,O,EIBCT 87098000 EITAB BC,360,4,*,NO,NM,NO,*,*,RR4,IX,NON,O,O,EIBC 87100000 EITAB LA,360,4,*,NO,NM,CK,*,*,RR4,IX,NON,O,O,EILA 87102000 EITAB EX,360,4,*,NO,NM,CK,F,*,RR4,IX,HAF,O,O,EIEX 87104000 EITAB MD,360,4,4,NO,NM,CK,F,*,RR4,IX,FUL,E,O,EIMD 87106000 EITAB STH,360,4,2,NO,NM,CK,S,*,RR4,IX,HAF,O,O,EISTORS 87108000 EITAB CVD,360,4,8,NO,NM,CK,S,*,RR4,IX,DBL,O,O,EISTORS 87110000 EITAB STC,360,4,1,NO,NM,CK,S,*,RR4,IX,NON,O,O,EISTORS 87112000 EITAB ST,360,4,4,NO,NM,CK,S,*,RR4,IX,FUL,O,O,EISTORS 87114000 EITAB FPRF,360,4,4,NO,NM,CK,F,*,RR4,IX,FUL,E,O,EIFPRX 87116000 EITAB FPRS,360,4,4,NO,NM,CK,S,*,RR4,IX,FUL,E,O,EIFPRXST CEH 87118000 EITAB XFPRF,360,4,8,NO,NM,CK,F,*,RR4,IX,DBL,E,O,EIFPRX 87120000 EITAB XFPRS,360,4,8,NO,NM,CK,S,*,RR4,IX,DBL,E,O,EIFPRXST CEH 87122000 EITAB NMSIS,360,4,1,NO,NM,CK,S,*,IOL,BD,NON,*,*,EINORMSI 87124000 EITAB NMSIF,360,4,1,NO,NM,CK,F,*,IOL,BD,NON,*,*,EINORMSI 87126000 EITAB DIAG,360,4,1,NO,NM,NO,*,*,IOL,BD,NON,*,*,EIDIAG 87128000 EITAB BXH,360,4,*,NO,NM,NO,N,*,RR4,BD,NON,O,O,EIRSBX 87130000 EITAB BXLE,360,4,*,NO,NM,NO,N,*,RR4,BD,NON,O,O,EIRSBX 87132000 EITAB LM,360,4,*,NO,NM,NO,F,*,RR4,BD,FUL,O,O,EILMSTM 87134000 EITAB STM,360,4,*,NO,NM,NO,S,*,RR4,BD,FUL,O,O,EILMSTM 87136000 EITAB SHFTS,360,4,*,NO,NM,NO,N,*,RR4,BD,NON,O,O,EISHIFT 87138000 EITAB SHFTD,360,4,*,NO,NM,NO,N,*,RR4,BD,NON,E,O,EISHIFT 87140000 EITAB ICM,370,4,4,NO,NM,CK,F,*,RR4,BD,NON,O,O,EIICM 87142000 EITAB STCM,370,4,4,NO,NM,CK,S,*,RR4,BD,NON,O,O,EISTCM 87144000 EITAB CLM,370,4,4,NO,NM,CK,F,*,RR4,BD,NON,O,O,EICLM 87146000 EITAB PRIVF,360,4,*,PR,NM,**,*,*,IOL,**,***,O,O,EILCTL M 87147000 EITAB MOVES,360,6,0,NO,NM,CK,S,F,IOL,BD,NON,*,*,EIMOVES 87148000 EITAB MVO,360,6,0,NO,NM,CK,S,F,LL1,BD,NON,*,*,EIMOVES 87150000 EITAB LOGS,360,6,0,NO,NM,CK,S,F,IOL,BD,NON,*,*,EILOGS 87152000 EITAB LOGFS,360,6,0,NO,NM,CK,F,F,IOL,BD,NON,*,*,EILOGS 87153000 EITAB TR,360,6,0,NO,NM,CK,S,F,IOL,BD,NON,*,*,EIMOVES 87154000 EITAB PACK,360,6,0,NO,NM,CK,S,F,LL1,BD,NON,*,*,EIMOVES 87156000 EITAB UNPK,360,6,0,NO,NM,CK,S,F,LL1,BD,NON,*,*,EIMOVES 87158000 EITAB DECS,360,6,0,NO,NM,CK,S,F,LL1,BD,NON,*,*,EIDECS 87160000 EITAB CP,360,6,0,NO,NM,CK,F,F,LL1,BD,NON,*,*,EIDECS 87162000 EITAB TRT,360,6,0,NO,NM,CK,F,F,IOL,BD,NON,*,*,EITRT 87164000 EITAB EDMK,360,6,0,NO,NM,CK,S,F,IOL,BD,NON,*,*,EIEDMK 87166000 EITAB SRP,370,6,0,NO,NM,CK,S,N,LL1,BD,NON,*,*,EISRP 87168000 EITAB XTND,*,*,*,*,EX,*,*,*,*,*,*,*,*,EI2EXTAB 87170000 * ONLY LENGTH AND OPCODE REQ FOR REGISTER XDUMP L 87172000 EITAB DUMPR,360,6,*,NO,NM,**,*,*,*,*,*,*,*,EIXDUMPR L 87174000 EITAB HEXI,360,4,8,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXHEXI M 87176000 EITAB HEXO,360,4,8,NO,NM,CK,S,*,RR4,IX,NON,O,O,EIXHEXO M 87178000 EITAB DECI,360,4,8,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXDECI M 87180000 EITAB DECO,360,4,12,NO,NM,CK,S,*,RR4,IX,NON,O,O,EIXDECO M 87182000 EITAB XOPC,360,2,*,NO,NM,**,*,*,IOL,**,***,*,*,EIXOPC M 87184000 *********************************************************************** 87186000 * * 87188000 * THE FOLLOWING BLOCK OF STMTS DESCRIBES A SINGLE ENTRY * 87190000 * OF THE OPTIONAL INTERPRETER MAIN CONTROL TABLE * 87192000 * * 87194000 *********************************************************************** 87196000 * * 87198000 * NOTES ON THE DESIGN OF THE MAIN INTERPRETER TABLE * 87200000 * ------------------------------------------------- * 87202000 * (AND SUB-TABLES) * 87204000 * * 87206000 * => IMPORTANT: THIS SHOULD BE REQUIRED READING FOR ANYONE * 87208000 * NEEDING TO UNDERSTAND AND/OR MODIFY THIS TABLE SCHEME. * 87210000 * * 87212000 * A 256 BYTE TABLE (1 BYTE PER POSSIBLE OPCODE) OF * 87214000 * POINTERS ALLOW EASY ACCESS TO INSTRUCTION DECODING * 87216000 * INFORMATION BY INDEXING INTO A LARGER MAIN TABLE * 87218000 * DESCRIBED BELOW. * 87220000 * THE OPTIONAL ASSIST INTERPRETER'S MAIN CONTROL TABLE * 87222000 * (NAMED: EICONTAB) CONTAINS ONE ENTRY FOR EACH POSSIBLE * 87224000 * TYPE OF INSTRUCTION DECODING. EACH 8 BYTE ENTRY CONTAINS * 87226000 * APPROPRIATE FLAGS AND OTHER INFORMATION (AS DESCRIBED * 87228000 * BELOW) TO CONTROL EACH STEP OF THE SPECIFIC INSTRUCTION * 87230000 * DECODING PROCESS. * 87232000 * THE FIRST THREE COMPLETE ENTRIES OF EICONTAB WILL * 87234000 * BE ALL ZEROS EXCEPT THE INSTRUCTION LENGTH BITS. THE * 87236000 * FIRST ENTRY'S INSTRUCTION LENGTH WILL BE EQUAL TO TWO, * 87238000 * THE SECOND'S WILL EQUAL FOUR AND THE THIRD'S WILL EQUAL * 87240000 * SIX. ALL ILLEGAL OPCODES (IN EIOPCDTB, THE 256 BYTE * 87242000 * TABLE DESCRIBED ABOVE) WILL POINT TO THE ENTRY WHOSE * 87244000 * INSTRUCTION LENGTH CORRESPONDS TO THE HIGH ORDER TWO BITS * 87246000 * OF THE OPCODE ITSELF. * 87248000 * FOR EXTENDED OPCODES (S-TYPE & PSEUDO-INSTRUCTIONS) * 87250000 * THE ENTRY IN EICONTAB WILL BE MARKED 'OPCODE-DOES-NOT- * 87252000 * TELL-ALL' AND WILL CONTAIN INFORMATION CONCERNING ACCESS * 87254000 * TO A SUB-TABLE GIVING ALL NECESSARY INFORMATION ABOUT * 87256000 * INSTRUCTION DECODING. SEE EQUATES BELOW. * 87258000 * * 87260000 *********************************************************************** 87262000 * 87264000 EICTNTRY DS 0D MOVE CONTROL TABLE ENTRY HERE 87266000 * FLAG BYTES -- CONTAIN INSTR DECODING INFORMATION AS 87268000 * DESCRIBED BY EQUATES BELOW 87270000 EICTB1 DS B FLAG BYTE 1 87272000 EICTB2 DS B FLAG BYTE 2 87274000 EICTB3 DS B FLAG BYTE 3 87276000 EICTB4 DS B FLAG BYTE 4 87278000 EICTB5 DS B FLAG BYTE 5 87280000 EICTB6 DS B FLAG BYTE 6 87282000 EICTDISP DS H DISPLACEMENT FOR BRANCHING TO X87284000 SPECIAL ROUTINE 87286000 EICTE$L EQU *-EICTNTRY LENGTH OF A SINGLE TABLE ENTRY 87288000 * MISCELLANEOUS EQUATES 87290000 EIEXTTAB EQU EICTB5 ADDRESS OF EXTENDED OP CODE TABLE 87292000 EI360PLS EQU B'00001100' (EICTB1)==> 360 & 370 INSTR 87294000 EI370ONL EQU B'00001000' (EICTB1)==> 370 INSTR ONLY 87296000 EIRR EQU B'00100000' (EICTB1)==> THIS IS AN RR INSTR 87298000 EIPRIVOP EQU B'01000000' (EICTB1)==> THIS IS A PRIVILEGED X87300000 INSTRUCTION 87302000 EIEXOPCD EQU B'10000000' (EICTB1)==> OPCODE DOES NOT TELL X87304000 ALL (EXTENDED OPCODE) 87306000 EINOCNOW EQU B'00010000' (EICTB1)==> DO PERFORM MOD/ST/FTCH X87308000 CHECKING AT EINOCHK 87310000 * EQUATES FOR INSTRUCTION LENGTH CODE 87312000 * **** NOTE **** NO OTHER FLAGS CAN BE ADDED TO EICTB2 87314000 EILEN2 EQU B'00000010' (EICTB2)==> LENGTH=2 BYTES 87316000 EILEN4 EQU B'00000100' (EICTB2)==> LENGTH=4 BYTES 87318000 EILEN6 EQU B'00000110' (EICTB2)==> LENGTH=6 BYTES 87320000 * EQUATES FOR MODIFICATION OR FETCH CHECKING 87322000 * --- FOR FIRST OPERAND 87324000 EI1NOCHK EQU B'00000000' (EICTB3)==> NO CHECKING 87326000 EI1FETCH EQU B'01000000' (EICTB3)==> FETCH CHECKING 87328000 EI1STORE EQU B'11000000' (EICTB3)==> STORE CHECKING 87330000 * --- FOR SECOND OPERAND 87332000 EI2NOCHK EQU B'00000000' (EICTB3)==> NO CHECKING 87334000 EI2FETCH EQU B'00010000' (EICTB3)==> FETCH CHECKING 87336000 EI2STORE EQU B'00110000' (EICTB3)==> STORE CHECKING 87338000 * EQUATES FOR INSTR DECODING (2ND BYTE OF INSTR) 87340000 EIB2RRX4 EQU B'00000000' (EICTB3)==> 2 REGS (MULT BY 4) 87342000 EIB2LLX1 EQU B'00000001' (EICTB3)==> 2 LENGTHS (NO MULT) 87344000 EIB2IORL EQU B'00000011' (EICTB3)==> 1 LENGTH OR IMMED FLD 87346000 * EQUATES FOR INSTR DECODING (2ND HALFWORD OF INSTR) 87348000 EIH2NODX EQU B'00000100' (EICTB3)==> BASE+DISP ONLY (OTHER- X87350000 WISE INDEX+(BASE+DISP)) 87352000 * NOTE IF THIS IS A BRANCH INSTRUCTION 87354000 EIBRINST EQU B'00001000' (EICTB3)==> THIS IS A NON-RR BR INST 87356000 * EQUATES FOR OPERAND ALIGNMENT 87358000 * ***** NO OTHER FLAGS ALLOWED IN EICTB4 ***** 87360000 EIALNONE EQU B'00000000' (EICTB4)==> NO ALIGNMENT NEEDED 87362000 EIALHALF EQU B'00000001' (EICTB4)==> HALFWORD ALIGNMENT 87364000 EIALFULL EQU B'00000011' (EICTB4)==> FULLWORD ALIGNMENT 87366000 EIALDOBL EQU B'00000111' (EICTB4)==> DOUBLE-WORD ALIGNMENT 87368000 * EQUATES FOR EVEN/ODD REGISTER CHECKING 87370000 * (THIS BYTE CAN NOT CONTAIN ANY OTHER FLAGS) 87372000 EINEREG1 EQU B'00000000' (EICTB5)==> REG1 CAN BE ODD 87374000 EIEVREG1 EQU B'00010000' (EICTB5)==> REG1 MUST BE EVEN 87376000 EINEREG2 EQU B'00000000' (EICTB5)==> REG2 CAN BE ODD 87378000 EIEVREG2 EQU B'00000001' (EICTB5)==> REG 2 MUST BE EVEN 87380000 * EQUATES FOR INSTR MOD/FETCH LENGTH 87382000 * 87384000 * NOTE ***** THE UPPER NIBBLE OF THIS BYTE SHOULD ONLY 87386000 * BE USED WHEN ABSOLUTELY NECESSARY. IF IT IS USED, 87388000 * THEN THE FOLLOWING INSTR MUST BE PLACED BETWEEN THE 87390000 * IC AND LTR INSTRS FOLLOWING LABEL => EINOCHK: 87392000 * N R2,=XL4'0F' 87394000 * 87396000 EIMFLENG EQU B'00001111' (EICTB6)==> LOWER NIBBLE HAS LENGTH 87398000 * 87400000 *********************************************************************** 87402000 * * 87404000 * THE FOLLOWING EQUATES ARE USED FOR EXTENDED OPCODE * 87406000 * TABLE ENTRY FETCHING: * 87408000 * * 87410000 *********************************************************************** 87412000 * * 87414000 ******** IMPORTANT NOTES FOR EXTENDED OPCODE INSTRUCTIONS ************* 87416000 * * 87418000 * THE MAIN TABLE (EICONTAB) ENTRY FOR AN EXTENDED OPCODE * 87420000 * WILL CONTAIN THE ACTUAL 4 BYTE ADDRESS OF THE SECONDARY * 87422000 * TABLE CONTAINING DECODING ENTRIES FOR THE EXTENDED OPCODE * 87424000 * INSTRUCTION. * 87426000 * * 87428000 * THE FIRST 8 BYTE ENTRY OF THE SECONDARY TABLE WILL * 87430000 * CONTAIN A BYTE HAVING THE # OF BITS TO SHIFT THE 2ND * 87432000 * BYTE OF THE INSTRUCTION TO OBTAIN AN INDEX INTO THE * 87434000 * BYTE TABLE FOLLOWING THE 1ST ENTRY. ALSO IN THE 1ST ENTRY * 87436000 * WILL BE A FULLWORD COMPARATOR GIVING THE MAXIMUM INDEX * 87438000 * VALUE THAT IS LEGAL. * 87440000 * * 87442000 * THE BYTE TABLE FOLLOWING THE 1ST ENTRY WILL CONTAIN AS * 87444000 * MANY SINGLE BYTE ENTRIES AS NECESSARY. EACH ENTRY WILL BE * 87446000 * A DISPLACEMENT FROM THE BEGINNING OF THE TABLE TO THE * 87448000 * CORRECT TABLE ENTRY FOR THE PARTICULAR INSTRUCTION. IF * 87450000 * THE BYTE IS ZERO THEN THE INSTRUCTION IS NOT IMPLEMENTED * 87452000 * AND AN OC-1 INTERRUPT WILL BE FLAGGED. * 87454000 * * 87456000 *********************************************************************** 87458000 * 87460000 * SECONDARY EXTENDED OPCODE TABLE * 87462000 * THIS TABLE IS AN EXTENSION OF THE MAIN DECODING TABLE AND IS * 87464000 * STRICTLY RESERVED FOR THE EXTENDED OPCODE INSTRUCTIONS -- THOSE * 87466000 * WITH AN OPCODE OF 'EO'. BY SHIFTING THE SECOND BYTE OF THE * 87468000 * INSTRUCTIONS 5 BITS TO THE RIGHT, AN INBEX TO BYTE TABLE -- SECOND * 87470000 * 8 BYTES OF THIS TABLE -- IS ESTABLISHED WHERE A DISPLACEMENT TO * 87472000 * THE PROPER INSTRUCTION DECODING ENTRY IS LOCATED. THE FIRST 8 BYTES* 87474000 * OF THE SECONDARY DECODING TABLE IS EXPLAINED ABOVE. * 87476000 SPACE 2 87478000 EI2EXTAB DS 0F SECONDARY EXTENDED DECODING TABLE 87480000 * EXTENDED OPCODE TABLE EQUATES 87482000 * --> 1ST 8 BYTE ENTRY 87484000 EIMAXIND EQU 4 POSITION OF MAX INDEX VALUE ALLOWED X87486000 (THIS IS A FULLWORD) 87488000 EI#SHIFT EQU 3 POS OF SHIFT BYTE IN 1ST TAB ENTRY 87490000 DC XL3'0',X'5' BYTE 3 = # BITS TO SHIFT MASK 87492000 DC F'8' MAXIMUM INDEX LIMIT 87494000 DC X'1018202830384000' DISPLACEMENTS FROM EI2EXTAB 87496000 EITAB READ,360,6,0,NO,NM,CK,S,*,RR4,IX,NON,O,O,EIXIOS 87498000 EITAB PRNT,360,6,0,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXIOS 87500000 EITAB PNCH,360,6,0,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXIOS 87502000 EITAB DUMP,360,6,0,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXIOS 87504000 EITAB LIMD,360,6,0,NO,NM,CK,*,*,RR4,IX,NON,O,O,EIXIOS 87506000 EITAB GET,360,6,0,NO,NM,CK,S,*,RR4,IX,NON,O,O,EIXIOS 87508000 EITAB PUT,360,6,0,NO,NM,CK,F,*,RR4,IX,NON,O,O,EIXIOS 87510000 .EINONE ANOP 89999999