AIF (NOT &$EXINT).EINONE 80000000 ** ./ DELETE SEQ1=80000010,SEQ2=80000010 80000010 AIF (NOT &$VIRT).VINOIO2 80000040 TITLE '*** VIRTIO: VIRTUAL SIMULATION I/O ROUTINES' 80000060 VIRTIO CSECT 80000080 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80000100 * MAIN ENTRY POINT FOR ALL I/O COMMANDS * 80000120 * AT THIS POINT, RAD1 CONTAINS CHANNEL/DEVICE NUMBER * 80000140 * * 80000160 * REGISTER USAGE * 80000180 * REC POINTER TO ECONTROL * 80000200 * R7 GENERAL WORK REGISTER, ENTRY POINTER * 80000220 * R8 POINTER TO DEVICE TABLE ENTRY FOR SELECTED DEVICE * 80000240 * R9 POINTER TO DEVICE BUFFER (ALSO SEE DSECT VIDABF-- * 80000260 * DSECT FORMATTING FLAGS STORED IN START OF BUFFER) * 80000280 * R10 GENERAL WORK REGISTER * 80000300 * R13 SAVE AREA POINTER, BASE REGISTER * 80000320 * RLINK RETURN POINT, INTERNAL LINK REGISTER * 80000340 * R15 ROP - OPCODE OF INSTRUCTION ON ENTRY * 80000360 * R0 GENERAL WORK * 80000380 * R1 GENERAL WORK * 80000400 * R2 INTERNAL LINK, GENERAL WORK * 80000420 * * 80000440 * ON EXIT: * 80000460 * R7,R8,R9,R10,R1--AND POSSIBLY RCC--CHANGED * 80000480 * R13,R14,R0 AS ON ENTRY * 80000500 * R15 RETURN CODE * 80000520 * R2 ZERO * 80000540 * * 80000560 * I/O COMMAND PROCESSING CONSISTS OF THREE PHASES: * 80000580 * (1) OCCURS WHEN SIO EXECUTED: * 80000600 * ACCEPT COMMAND, TEST IT FOR LEGALITY, DECODE IT, PERFORM * 80000620 * ANTICIPATORY READ (IF A READ), POSITION DIRECT ACCESS DEVICE * 80000640 * AND DETERMINE SIMULATED TIME I/O OPERATION WILL TAKE. * 80000660 * ENQUE DELAY EVENT TO BE NOTIFIED WHEN SIMULATED I/O OPERATION * 80000680 * WILL HAVE OCCURRED. * 80000700 * RETURN TO MAIN INTERPRETER. * 80000720 * (2) (OCCURS WHEN I/O COMPLETION EVENT ARISES) * 80000740 * DETERMINE DEVICE NEEDING SERVICE, DETERMINE LENGTH OF DATA * 80000760 * TRANSFER, TRANSFER DATA TO/FROM USER (READ/WRITE), REPOSITION * 80000780 * DIRECT ACCESS DEVICE, TEST FOR COMMAND OR DATA CHAINING. * 80000800 * IF COMMAND OR DATA CHAINING, RETURN TO STEP 1 TO GET NEW CCW. * 80000820 * IF NO COMMAND OR DATA CHAINING, INDICATE PENDING INTERRUPT FOR * 80000840 * SELECTED DEVICE. * 80000860 * (3) WHEN PENDING INTERRUPT ACCEPTED, PRESENT CSW, CHECK FOR OTHER * 80000880 * PENDING INTERRUPT CAUSES, RETURN. * 80000900 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80000920 EJECT 80000940 USING *,R7 80010000 STM R14,R0,12(R13) SAVE REGISTERS 80010020 ST R12,68(R13) SAVE R12 ALSO (BASE) 80010040 L R9,=A(VIOSAVE) GET FUTURE BASE ADDRESS 80010060 ST R9,8(R13) LINK 80010080 ST R13,4(R9) LINK 80010100 LR R13,R9 SET UP NEW BASE REGISTER 80010120 LA R12,2048(R13) SET UP 2ND BASE 80010140 LA R12,2048(R12) SET UP 2ND BASE 80010160 USING VIOSAVE,R13,R12 SET UP NEW ADDRESSABILITY 80010180 USING LOWCORE@,RMEM USING LOW USER AREA DSECT 80010200 USING ECONTROL,REC NOTE ECONTROL POINTER 80010220 SPACE 2 80010240 * COMMON CODE: INITIALIZE R8, R9 POINTERS * 80010260 MVI VIABFLAG,VIABPAS0 SHOW ENTERING INIT. DECODING PASS 80010280 SLR RAD1,RMEM DERELOCATE CHANNEL ADDRESS 80010300 USING ECSTACKD,RSTK USING TO INSTR. STACK CP 80010320 CLI ECOP,X'9F' CHECK IF THIS IS A TCH 80010340 BE *+8 IF YES, SKIP NEXT POINTER 80010360 BAL RLINK,VIODV# GET POINTER TO DEVICE TABLE 80010380 USING VIDVTABD,R8 NOTE USING 80010400 * THIS ROUTINE DOES NOT RETURN IF CH/DEV @ INVALID * 80010420 SR R9,R9 CLEAR FOR INSERT 80010440 IC R9,ECOP GET OPCODE OF I/O COMMANS 80010460 DROP RSTK POINT NO LONGER IN USE CPP 80010480 ALR R9,R9 DOUBLE FOR TABLE FETCH 80010500 LH R9,VIOJMPTB(R9) GET INDEX FOR PROPER CODE SECTION 80010520 B EIHIO(R9) JUMP TO PROPER SECTION OF CODE 80010540 EJECT 80010560 * * * * * * * * * * * * * * * * * * * * * * 80010580 * * PROCESS HIO - HALT I/O IN PROGRESS * * 80010600 * * * * * * * * * * * * * * * * * * * * * * 80010620 EIHIO EQU * PROCESS HIO - HALT I/O IN PROGRESS 80010640 TM VIDVTST,VIDVIPND TEST IF INTERRUPT PENDING 80010660 BO VICC0 YES, SO RETURN CC=0 80010680 TM VIDVTST,VIDVWORK TEST IF CHANNEL WORKING 80010700 BNO VIHIO2 IF NOT WORKING, IGNORE COMMAND 80010720 OI VIDVTST,VIDVHALT DEVICE IS WORKING; HALT IT LATER 80010740 OC VICRSTAT(1),VIDVCMSK TURN ON BIT TO GUARANTEE CH WORK 80010760 XC VICRSTAT(1),VIDVCMSK TURN BIT OFF TO SHOW HALTED 80010780 B VICC2 SET CC + TO SHOW HALT ACCEPTED 80010800 VIHIO2 XC VICHSST,VICHSST SET STATUS=0 TO SHOW NO HIO 80010820 MVC VICSW,VICHTCSW PRESENT INITIAL CSW 80010840 B VICC1 SET CC - TO SHOW NO HIO ACCEPTED 80010860 SPACE 3 80010880 * * * * * * * * * * * * * * * * * * 80010900 * * PROCESS TCH - TEST CHANNEL * * 80010920 * * * * * * * * * * * * * * * * * * 80010940 EITCH EQU * TEST CHANNEL COMES HERE 80010960 SRL RAD1,8 SHIFT CHANNEL # TO LOW BYTE 80010980 STC RAD1,VITCHCMP+1 STORE FOR COMPARE 80011000 L R9,=A(VICHTAB) GET POINTER TO CHANNEL INFOR TABLE 80011020 LA R10,VICHTAB# GET NUMBER OF CHTAB ENTRIES 80011040 VITCHCMP CLI 0(R9),$ COMPARE CHANNEL # TO TABLE 80011060 BE *+16 FOUND, GOODY 80011080 LA R9,VICHT$L(R9) LOOP TO NEXT 80011100 BCT R10,VITCHCMP LOOP TO COMPARE 80011120 B VICC3 NOT FOUND; ERROR 80011140 TM 1(R9),VICHWORK TEST IF CHANNEL WORKING 80011160 BO VICC1 YES, SET COND. CODE 80011180 TM 1(R9),VICHAVL TEXT IF CHANNEL AVAILABLE 80011200 BO VICC0 YES, SET COND. CODE TO SHOW 80011220 B VICC2 CONTINUE 80011240 SPACE 3 80011260 * * * * * * * * * * * * * * * * 80011280 * * PROCESS TIO - TEST I/O * * 80011300 * * * * * * * * * * * * * * * * 80011320 EITIO EQU * PROCESS TIO COMMAND 80011340 TM VIDVTST,VIDVEOF HAS AN EOF BEEN REACHED? 80011360 BO VICC3 YES,SHOW DEVICE NOT OPERATIONAL 80011380 TM VIDVTST,VIDVOPEN TEST IF OPEN 80011400 BO VIDVOPN2 ALREADY OPEN AND WORKABLE 80011420 SPACE 1 80011440 * DEVICE IS NOT OPEN; ATTEMPT TO OPEN IT * 80011460 TM VIDVTYP,VIDVDA IS THIS A D.A. DEVICE? 80011480 BNO VITIORD NO, TRY UNIT-REC OPEN 80011500 L R9,VIDVBFAD GET POINTER TO BUFFER FOR READ 80011520 BAL RLINK,VISDAOPN TRY TO OPEN DEVICE AND READ 1 TRACK 80011540 BO VICC3 IF OPEN FAILED, SHOW COND CODE=3 80011560 OI VIDVTST,VIDVAVL+VIDVOPEN SHOW DEVICE OPEN & AVAILABLE 80011580 B VICC0 NORMAL END FROM TIO 80011600 VITIORD LA R1,VIDVDDNM POINT TO DEVICE DDNAME 80011620 XC VIDVBFPT,VIDVBFPT CLEAR POINTER WITHIN BUFFER 80011640 TM VIDVTOPS,VIDVRD TEST IF IT IS A READ-ONLY DEVICE 80011660 BNO VITIOPRT NO, IT MUST BE PRINTABLE; TRY XPUT 80011680 XGET (R0),-1 OPEN ONLY; NO READ 80011700 B VITIOPN1 TEST IF OPEN WENT 80011720 VITIOPRT XPUT (R0),-1 OPEN ONLY; NO PRINT 80011740 VITIOPN1 BO VICC3 NOT-OPENABLE ==> CC OVF. 80011760 MVI VIDVTST,VIDVOPEN+VIDVAVL DEVICE IS BOTH OPEN+READY 80011780 B VICC0 SHOW AVAILABLE: CC 0 80011800 SPACE 80011820 * DEVICE PREVIOUSLY OPENED; CHECK CURRENT STATUS * 80011840 VIDVOPN2 TM VIDVTST,VIDVIPND SEE IF DEVICE INT. PEND. 80011860 BO VITIPND HANDLE INT. PENBDING 80011880 TM VIDVTST,VIDVAVL SEE IF DEVICE AVAILABLE 80011900 BO VICC0 SET CC 0 TO SHOW AVAILABLE 80011920 B VICC2 ELSE MUST BE WORKING; SET CC=2 80011940 SPACE 1 80011960 * MUST BE INTERRUPT PENDING; PRESENT CSW AND CLEAR INT. * 80011980 VITIPND L R15,=A(VIOINTFX) GET @ OF INT. HANDLER RTN. 80012000 SR R0,R0 CLEAR BYTE REG 80012020 XC VIPEND(1),VIDVCMSK TURN OFF PENDING INT. 80012040 BAL RLINK,(VIOINFX2-VIOINTFX)(R15) ENTER I/O INT. HANDLER 80012060 B VICC1 SHOW CSW PRESENTED AND INT. CLEAR 80012080 DROP R7 BASE REG. NO LONGER IN USE 80012100 LTORG , 80012120 TITLE 'VIRTUAL I/O SIMULATION - DEVICE / CHANNEL TABLES' 80012140 VIDVINFO DS 0D ALIGN TABLES TO DOUBLEWORD BOUNDARY 80020000 * (NOTE--COMMENTED LINES MAY BE REPLACED BY REAL ENTRIES 80020020 * TO EXPAND DEVICE SET.) 80020040 SPACE 1 80020060 * MULTIPLEXER DEVICES - READERS AND PRINTERS 80020080 VIRTRDR1 VIDVT 00C,MPX,OPS=RD,TIME=256*60/80,BFLN=80 80020100 VIRTRDR2 VIDVT 00D,MPX,OPS=RD,TIME=256*60/80,BFLN=80 80020120 VIRTPRT1 VIDVT 00E,MPX,OPS=(PRT,CTL),TIME=256*60/80,BFLN=132 80020140 VIRTPRT2 VIDVT 00F,MPX,OPS=(PRT,CTL),TIME=256*60/80,BFLN=132 80020160 SPACE 1 80020180 * TERMINAL DEVICES * 80020200 *IRTTRM1 VIDVT 011,TRM,OPS=(RD,WRT,CTL),BFLN=80 80020220 *IRTTRM2 VIDVT 012,TRM,OPS=(RD,WRT,CTL),BFLN=80 80020240 *IRTTRM3 VIDVT 013,TRM,OPS=(RD,WRT,CTL),BFLN=80 80020260 *IRTTRM4 VIDVT 014,TRM,OPS=(RD,WRT,CTL),BFLN=80 80020280 SPACE 1 80020300 * MOVEABLE HEAD DISKS * 80020320 VIRTDSK1 VIDVT 101,DSK,OPS=(RD,WRT,SCH,SK,SFM),BFLN=1692, #80020340 TIME=(1,153),TRKS=(20,4) 80020360 *IRTDSK2 VIDVT 102,DSK,OPS=(RD,WRT,SCH,SK,SFM),BFLN=1692, #80020380 TIME=(1,153),TRKS=(20,4) 80020400 SPACE 1 80020420 * FIXED HEAD DIRECT ACCESS DEVICES * 80020440 VIRTDRM1 VIDVT 201,DRM,OPS=(RD,WRT,SCH,SK,SFM),BFLN=2048, #80020460 TIME=5/8,TRKS=(10,2) 80020480 SPACE 1 80020500 * SPACE RESERVED FOR OTHER DEVICE DECLARATIONS * 80020520 * 80020540 * 80020560 * 80020580 * 80020600 SPACE 2 80020620 VIDVTAB , GENERATE DEVICE TABLE POINTERS 80020640 SPACE 1 80020660 VICHTAB , GENERATE CHANNEL TABLE ENTRIES 80020680 SPACE 2 80020700 * GENERATE BUFFERS FOR DEVICES * 80020720 VIRTRDR1 BUFFER 00C,READER,80,FILL=C 80020740 VIRTRDR2 BUFFER 00D,READER,80,FILL=D 80020760 VIRTPRT1 BUFFER 00E,PRINTER,132,FILL=E 80020780 VIRTPRT2 BUFFER 00F,PRINTER,132,FILL=F 80020800 SPACE 1 80020820 *IRTTRM1 BUFFER 011,TERMINAL,80,FILL=W 80020840 *IRTTRM2 BUFFER 012,TERMINAL,80,FILL=X 80020860 *IRTTRM3 BUFFER 013,TERMINAL,80,FILL=Y 80020880 *IRTTRM4 BUFFER 014,TERMINAL,80,FILL=Z 80020900 SPACE 1 80020920 VIRTDSK1 BUFFER 101,DISK,1692 80020940 *IRTDSK2 BUFFER 102,DISK,1692 80020960 SPACE 1 80020980 VIRTDRM1 BUFFER 201,DRUM,2048 80021000 SPACE 1 80021020 * SPACE RESERVED FOR OTHER DEVICE BUFFERS 80021040 * 80021060 * 80021080 * 80021100 * 80021120 VIBUFEND EQU * 80021140 TITLE 'CHANNEL COMMANDS ACCEPTED' 80021160 VICCTAB EQU * CHANNEL COMMANDS 80021180 VICCT 01,MX,OPS=PRT,TIM=165 80021200 VICCTB$L EQU *-VICCTAB LENGTH OF A TABLE ENTRY 80021220 VICCT 01,TM,OPS=PRT,TIM=30 TERMINAL WRITE 80021240 VICCT 02,MX,OPS=RD,TIM=200 80021260 VICCT 02,TM,OPS=RD TERMINAL READ 80021280 VICCT 03,TM,OPS=CTL TERMINAL NO-OP 80021300 VICCT 05,DA,OPS=WRT WRITE DATA 80021320 VICCT 06,DA,OPS=RD READ DATA 80021340 VICCT 06,TM,OPS=CTL PREPARE 80021360 VICCT 07,DA,OPS=SK SEEK 80021380 VICCT 09,MX,OPS=PRT,TIM=205 80021400 VICCT 0A,TM,OPS=RD READ WITH TIME-OUT INHIBIT 80021420 VICCT 0B,MX,OPS=CTL,TIM=35 80021440 VICCT 0B,DA,OPS=SK SEEK CYLINDER 80021460 VICCT 0D,DA,OPS=WRT WRITE KEY DATA 80021480 VICCT 0E,DA,OPS=RD READ KEY DATA 80021500 VICCT 11,MX,OPS=PRT,TIM=210 80021520 VICCT 12,DA,OPS=RD READ COUNT 80021540 VICCT 13,MX,OPS=CTL,TIM=45 80021560 VICCT 15,DA,OPS=WRT WRITE R0 80021580 VICCT 16,DA,OPS=RD READ RECORD R0 80021600 VICCT 19,MX,OPS=PRT WRITE, SPACE 3 AFTER PRINT 80021620 VICCT 1B,DA,OPS=SK SEEK HEAD 80021640 VICCT 1B,MX,OPS=CTL,TIM=45 SPACE 3 LINES IMMED. 80021660 VICCT 1D,DA,OPS=WRT WRITE COUNT KEY DATA 80021680 VICCT 1E,DA,OPS=RD READ COUNT KEY DATA 80021700 VICCT 1F,DA,OPS=SFM SET FILE MASK 80021720 VICCT 27,TM,OPS=CTL ENABLE 80021740 VICCT 29,DA,OPS=SCH SEARCH KEY = 80021760 VICCT 2F,TM,OPS=CTL,TIM=26/1000 DISABLE 80021780 VICCT 31,DA,OPS=SCH SEARCH ID = 80021800 VICCT 39,DA,OPS=SCH SEARCH HOME ADDR. = 80021820 VICCT 49,DA,OPS=SCH SEARCH KEY > 80021840 VICCT 51,DA,OPS=SCH SEARCH ID > 80021860 VICCT 69,DA,OPS=SCH SEARCH KEY >= 80021880 VICCT 71,DA,OPS=SCH SEARCH ID >= 80021900 VICCT 89,MX,OPS=PRT,TIM=265 80021920 VICCT 8B,MX,OPS=CTL,TIM=100 80021940 VICCT A9,DA,OPS=SCH SEARCH KEY =, MULTI-TRACK 80021960 VICCT B1,DA,OPS=SCH SEARCH ID =, MULTI-TRACK 80021980 VICCT B9,DA,OPS=SCH SEARCH HOME ADDR. =, MULTI-TRACK 80022000 VICCT C9,DA,OPS=SCH SEARCH KEY >, MULTI-TRACK 80022020 VICCT D1,DA,OPS=SCH SEARCH ID >, MULTI-TRACK 80022040 VICCT E9,DA,OPS=SCH SEARCH KEY >=, MULTI-TRACK 80022060 VICCT F1,DA,OPS=SCH SEARCH ID >=, MULTI-TRACK 80022080 VICCTBND EQU * END OF CCW LOOKUP TABLE 80022100 TITLE 'VIRT I/O - SIO COMMAND' 80022120 * * * * * * * * * * * * * * * * * * * * 80030000 * * PROCESS SIO COMMAND : START I/O * * 80030020 * * * * * * * * * * * * * * * * * * * * 80030040 EISIO DS 0H 80030060 B VIOSAVE+18*4 BRANCH OVER SAVE AREA 80030080 VIOSAVE DS 18F SAVE AREA 80030100 L R9,VIDVBFAD PERMANENT BUFFER POINTER 80030120 USING VIDABF,R9 GET USING ONF BUFFER 80030140 TM VIDVTST,VICHAVL CHECK IF CHANNEL AVAILABLE 80030160 BZ VICC2 IF NOT AVAILABLE, THEN NO SIO 80030180 MVC VICHSWD1,VICAW MOVE IN PROTECTION KEY/@ 80030200 MVI VIOFLAG,VICCW1+VIOCCSET SHOW 1ST CCW, COND CODE NOT SET 80030220 NI VIDVTST,VIDVEOF+VIDVOPEN+VICHAVL KEEP ONLY #80030240 EOF, OPEN, AND AVAIL INDICATION 80030260 MVI VIDVTST2,0 SET CHAIN BITS OFF 80030280 TM VIDVTYP,VIDVDA IF FOR DIR. ACCESS DEV, 80030300 BZ VISNCCW THEN CLEAR FILE MASK BYTE 80030320 MVI VIDVTFM,0 SET FILE MASK TO ZERO 80030340 XC VIODLAYT,VIODLAYT SHOW NO ACCUMULATED DELAYS 80030360 EJECT 80030380 * * * * * * * * * * * * * * * * * * * * * * * * * 80030400 * * CHECK FOR LEGAL CCW @ AND FETCH NEXT CCW * * 80030420 * * * * * * * * * * * * * * * * * * * * * * * * * 80030440 VISNCCW MVI VIABFLAG,VIABPAS1 SHOW ENTERING PASS 1-DECODE CYCLE 80030460 L R7,VICHSWD1 GET @ OF NEXT CHANNEL COMMAND 80030480 LA R0,8(R7) CLEAR OFF KEY BYTE, NEXT CCW 80030500 ST R0,VIWORKF1 STORE SO CAN DO MVC FOR LAST 3 BYTES 80030520 MVC VICHSADR,VIWORKF1+1 GET JUST ADDR PORTION 80030540 TM VICHSKEY,X'0F' TEST IF KEY LEGAL (LAST 4 BITS 0'S) 80030560 BNZ VISPGCK1 IF ILLEGAL, PROGRAM CHECK 80030580 TM VICHSADR+2,B'00000111' TEST IF CCW @ LEGAL (DBLWD. BDY) 80030600 BNZ VISPGCK1 NO THEN CREATE PROGRAM CHECK 80030620 $CKEY (R7),(R7),PROT=VISPTCK1,KEY=VICHSKEY,TYPE=F, CHECK IF #80030640 ADDR=VISPGCK1 CCWS REACHABLE (PROT&ADDR) 80030660 SPACE 1 80030680 * HAVE PASSED ALL CHECK PROBLEMS; FETCH NEW OPCODE/CCW * 80030700 ALR R7,RMEM RELOCATE ADDRESS OF CCW 80030720 TM VIDVTST,VIDVCD CHECK IF DATA CHAINING ON 80030740 BO *+10 IF YES, THEN DON'T REPLACE OPCODE 80030760 MVC VICHCCW(1),0(R7) MOVE IN NEW OPCODE IF NO DATA CHN 80030780 MVC VICHCCW+1(7),1(R7) MOVE IN LENGTH, FLAGS WHETHER DATA #80030800 CHAINED OR NOT 80030820 MVC *+7(1),VIDVCMSK PUT MASK TO TEST FOR TRACE OF CCWS 80030840 TM VITRFLG2,$ **CHANGED** TEST IF TRACE CCWS THIS CHAN. 80030860 BNO *+8 NO, SKIP TRACE CALL 80030880 BAL R10,VIOTRC ELSE CALL ROUTINE TO PRINT TRACE 80030900 XC VICHSST,VICHSST ZERO ALL STATUS BYTES 80030920 EJECT 80030940 * * * * * * * * * * * * * * * * * * * * * * 80030960 * * CHECK FOR "TIC"S AND OTHER OPCODES * * 80030980 * * * * * * * * * * * * * * * * * * * * * * 80031000 TM VICHCOPC,X'0F' ARE LAST 4 BITS OF NEW OPCODE 0? 80031020 BZ VISPGCK1 YES, ILLEGAL (X'-0' ILLEGAL) 80031040 TM 0(R7),X'07' TEST IF LAST 3 BITS ZERO 80031060 BNZ VICHLKUP NO, LOOKUP OPCODE 80031080 TM 0(R7),X'08' CHECK IF THIS IS A TIC (X'-8') 80031100 BNO VICHLKUP NO, MUST BE DATA CHN, VICHCOPC OK 80031120 SPACE 2 80031140 * THIS MUST BE A TIC * 80031160 TM VIOFLAG,VICCW1 IS THIS THE FIRST CCW? 80031180 BO VISPGCK1 YES, THEN PGM CHECK CONDITION? 80031200 TM VIOFLAG,VIOFTIC WAS THE LAST COMMAND A TIC? 80031220 BO VISPGCK1 TWO TICS IN A ROW--PROGRAM CHECK 80031240 SPACE 2 80031260 * TIC IS LEGAL NOW; INHIBIT FOR NEXT TIME * 80031280 OI VIOFLAG,VIOFTIC SHOW THIS IS A TIC 80031300 MVC VICHSADR,VICHCADR GET @ TO TIC TO 80031320 B VISNCCW TREAT AS NEW CCW 80031340 EJECT 80031360 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80031380 * * LOOK UP CCW - MATCH DEVICE TYPE AND VERIFY * 80031400 * * OPERATIONS LEGAL ON THAT DEVICE * * 80031420 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80031440 VICHLKUP NI VIOFLAG,255-VIOFTIC-VIOFIMM LAST INSTR NOT TIC, IMM 80031460 MVC VIOPCMP+1(1),VICHCOPC MOVE IN OPCODE FOR LOOKUP 80031480 MVC VICHLKU1+1(1),VIDVTYP TEST FOR PROPER DEVICE TYPE 80031500 L R7,=A(VICCTAB) GET BEGINNING OF TABLE 80031520 LA R0,VICCTB$L GET LENGTH OF A TABLE ENTRY 80031540 L R1,=A(VICCTBND-VICCTB$L) GET @ OF LAST TABLE ENTRY 80031560 SPACE 1 80031580 VIOPCMP CLI 0(R7),$ **CHANGED** LOOK UP CCW OPCODE 80031600 BL VICHLKU2 IF LOW, MORE OF TABLE TO DO; LOOP 80031620 BH VISPGCK1 BUT IF HIGH, ALAS, BAD OPCODE 80031640 VICHLKU1 TM 1(R7),$ **CHANGED** TEST IF THIS IS FOR PROPER DEV. 80031660 BO VIOPFND IF SEEKING RIGHT TYPE, FOUND 80031680 VICHLKU2 BXLE R7,R0,VIOPCMP CONTINUE TO LOOK IF NOT FOUND 80031700 B VISPGCK1 PROGRAM CHECK IF OPCODE ILLEGAL 80031720 SPACE 2 80031740 * CHECK OUT NEW CCW OPCODE FOUND * 80031760 VIOPFND EQU * OPCODE FOUND IN LOOKUP 80031780 LH R10,VICHCCNT GET COUNT AS IN CCW 80031800 STH R10,VICHSCNT STORE AS CSW COUNT UNMOVED 80031820 LTR R10,R10 CHECK FOR COUNT OF ZERO 80031840 BNP VISPGCK1 IF <= 0, PROGRAM CHECK CONDITION 80031860 MVC VISOPS(VICCTB$L-2),2(R7) MOVE FLAGS TO LABELED AREA 80031880 MVC VIOPLKU1(1),VISOPS MOVE ACTIONS TO OCCUR TO TEST 80031900 VIOPLKU1 EQU *+1 TYPES OF ACTIONS TO PERFORM 80031920 TM VIDVTOPS,$ **CHGD** ARE ACTIVITIES LEGAL THIS DEV? 80031940 BNO VISPGCK1 NO, THEN CAUSE PROGRAM CHECK 80031960 NI VIDVTST2,255-VIDV2RD-VIDV2WRT-VIDV2SCH NOT RD,WRT,SCH 80031980 NI VIOPLKU1,VIDV2RD+VIDV2WRT+VIDV2SCH IS IT READ,WRT,SCH? 80032000 BZ *+10 NO, IGNORE 80032020 OC VIDVTST2(1),VIOPLKU1 ELSE SHOW OP TYPE 80032040 AIF (&$VI#DA EQ 0).VINSIO1 80032060 TM VIDVTYP,VIDVDA IS THIS DIRECT ACCESS? 80032080 BNZ VISDVOPN YES, TRY DIRECT OPEN 80032100 .VINSIO1 ANOP 80032120 TM VISOPS,VIDVRD IS THIS A READ OPERATION? 80032140 BO VISCRD YES, THEN TRY ANTICIPATORY READ 80032160 TM VIDVTST,VIDVOPEN IS DEVICE ALREADY OPEN? 80032180 BO VISWRCTL YES, THEN EITHER WRITE OR CONTROL 80032200 B VISIOPN1 80032220 AIF (&$VI#DA EQ 0).VINSIO2 80032240 TITLE 'VIRT I/O - DIRECT ACCESS' 80032260 * * * * * * * * * * * * * * * * * * * * * * * * * 80032280 * * OPEN DEVICE AND CHOOSE TYPE OF OPERATION * * 80032300 * * * * * * * * * * * * * * * * * * * * * * * * * 80032320 VISDVOPN DS 0H 80032340 SR R0,R0 CLEAR FOR LATER USE (CUM. TIME) 80032360 TM VISOPS,VIDVSCH IS THIS A SEARCH OPERATION? 80032380 BO *+8 YES, SKIP FLAG RESETTING 80032400 NI VIDVTST,255-VIDVIX2 NO, THEN TURN OFF INDEX PT. MARK 80032420 TM VIDVTST,VIDVOPEN IS DEVICE ALREADY OPEN? 80032440 BO VISDVOP1 YES, SKIP ATTEMPT TO OPEN 80032460 BAL RLINK,VISDAOPN ELSE CALL ROUTINE TO OPEN 80032480 BO VISRUCHK IF OPEN DIDN'T GO, UNIT CHECK 80032500 OI VIDVTST,VIDVOPEN ELSE SHOW DEVICE NOW OPEN 80032520 VISDVOP1 TM VISOPS,VIDVRD+VIDVWRT+VIDVSCH IS READ,WRT,SRCH? 80032540 BZ VISDASFM NO, MUST BE SEEK OR SFM 80032560 TM VIDVTST,VIDVOPEN IS DEVICE ALREADY OPEN? 80032580 BNZ VISDAROT YES, THEN GO FOR ROT. POSITION 80032600 SPACE 2 80032620 * * * * * * * * * * * * * * 80032640 * * SET FILE MASK (SFM) * * 80032660 * * * * * * * * * * * * * * 80032680 VISDASFM CLI VICHCOPC,X'1F' IS THIS A SET FILE MASK? 80032700 BNE VISDASK0 NO, THEN MUST BE SEEK 80032720 TM VIDVTST2,VIDVFMIH CHECK IF SFM IS STILL LEGAL 80032740 BO VISRUCHK NO, THEN PRESENT UNIT CHECK 80032760 L R7,VICHCWD1 GET @ FROM CCW 80032780 $CKEY (R7),(R7),TYPE=F,KEY=VICHSKEY, IS FILE MASK REACHABLE? #80032800 PROT=VISPTCK1,ADDR=VISPGCK1 80032820 LA R7,0(R7,RMEM) RELOCATE FILE MASK ADDR 80032840 TM 0(R7),B'00100010' BITS 2&6 MUST BE 0 80032860 BNZ VISRUCHK IF NOT, THEN PRESENT UNIT CHECK 80032880 MVC VIDVTFM(1),0(R7) ELSE SET PRESENT FILE MASK 80032900 OI VIDVTST2,VIDVFMIH INHIBIT FUTURE SFMS IN THIS CHAIN 80032920 B VISIMMOP AND TREAT AS IMMED. OPER. 80032940 SPACE 3 80032960 * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80032980 * * SEEK: IF NEW HEAD AND/OR TRACK REQUESTED, MUST * * 80033000 * * PERFORM REAL DIRECT ACCESS I/O TO GET NEW * * 80033020 * * SIMULATED TRACK * * 80033040 * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80033060 VISDASK0 MVC *+7(1),VIDVCMSK GET SYS MASK FOR SEEK TRACE CHECK 80033080 TM VITRFLG1,$ **CHANGED** TEST IF TRACE THIS SEEK 80033100 BNO VISDASK1 NO, THEN SKIP 80033120 MVC *+7(1),VIDVCMSK CHECK IF ALSO FULL CCW TRACE 80033140 TM VITRFLG2,$ **CHANGED** TO PREVENT DOUBLE TRACES 80033160 BO VISDASK1 YES, THEN SKIP THIS TRACE 80033180 L R7,VICHSWD1 GET PTR TO NEXT CCW 80033200 LA R7,0(RMEM,R7) RELOCATE IN USER AREA 80033220 SH R7,=H'8' SUBTRACT TO GET @ CURRENT CCW 80033240 BAL R10,VIOTRC CALL RTN TO FORMAT TRACE 80033260 VISDASK1 L R7,VICHCWD1 GET SEEK ARGUMENT POINTER 80033280 $CKEY 0(R7),5(R7),KEY=VICHSKEY,TYPE=F, CHECK IF REACHABLE #80033300 PROT=VISPTCK1,ADDR=VISPGCK1 ERROR EXITS 80033320 LA R7,0(R7,RMEM) RELOCATE ARG. ADDR. 80033340 MVC VIWORKF1+2(6),0(R7) GET ARGUMENT TO CONVENIENT PLACE 80033360 CLC VIWORKF1+2(2),=H'0' ARE FIRST 2 BYTES 0S? 80033380 BNE VISRUCHK NO, PRESENT UNIT CHECK 80033400 CLC VIWORKF2(2),VIDVMXCY IS CYL # REQ'D TOO HIGH? 80033420 BH VISRUCHK YES, PRESENT UNIT CHECK 80033440 CLC VIWORKF2+2(2),VIDVMXHD IS HEAD # REQ'D TOO HIGH? 80033460 BH VISRUCHK YES, PRESENT UNIT CHECK 80033480 CLC VICHCCNT,=H'6' IS COUNT SUFFICIENT? 80033500 BL VISRUCHK NO, THEN UNIT CHECK 80033520 SPACE 2 80033540 * SEEK IS WELL-FORMED; IS IT LEGAL NOW? * 80033560 TM VIDVTST2,VIDVFMIH HS A FILE MASK EVER BEEN SET? 80033580 BZ VISDASK3 NO, THEN ANY KIND OF SEEK LEGAL 80033600 TM VIDVTFM,B'00011000' ARE NO SEEKS ALLOWED? 80033620 BO VISRUCHK YES, PRESENT UNIT CHECK 80033640 CLI VICHCOPC,X'1B' IS THIS ONLY A HEAD SEEK? 80033660 BNE VISDASK2 NO, THEN CHECK IF CYL SEEKS LEGAL 80033680 MVC VIWORKF2+1(1),VIDVCRCY+1 HEAD SEEK, FORCE CYL = CURR. 80033700 B VISDASK3 GO PERFORM SEEK 80033720 VISDASK2 TM VIDVTFM,B'00010000' ARE CYL SEEKS LEGAL NOW? 80033740 BO VISRUCHK NO, THEN PRESENT UNIT CHECK 80033760 SPACE 1 80033780 * COUNT NUMBER OF SEEKS ON THIS DEVICE * 80033800 VISDASK3 TM VIDVTYP,VIDVDRM IS THIS A FIXED-HEAD DEVICE? 80033820 BO VISDASK4 YES, NO SEEK COUNT 80033840 LH R10,VIDVSCPT GET POINTER TO SEEK, CYL COUNTS 80033860 LA R10,VISTDKSC(R10) GET ADDRESS OF SEEK, CYL COUNTS 80033880 L R1,0(R10) GET COUNT OF SEEKS 80033900 LA R1,1(R1) INCREMENT BY 1 80033920 ST R1,0(R10) RESTORE SEEK COUNT 80033940 SPACE 2 80033960 * GET PROPER TRACK FROM REAL D.A. DEVICE. * 80033980 * IF TRACK WANTED IS CURRENT TRACK, NO READ NEEDED * 80034000 * ELSE WRITE OLD/READ NEW TRACK ON REAL DEVICE * 80034020 VISDASK4 CLC VIWORKF2(4),VIDVCRCY IS SOUGHT HEAD/CYL THE CURR. ONE? 80034040 BE VISRNRM2 YES, THEN SKIP READ ENTIRELY 80034060 SPACE 80034080 * MUST PERFORM WRITE OLD/READ NEW TRACK * 80034100 LH R0,VIWORKF2 GET SOUGHT CYL # 80034120 SH R0,VIDVCRCY HOW FAR IS THAT TRK FROM CURRENT? 80034140 LPR R0,R0 GET ABS. VALUE=# CYLS CROSSED 80034160 BZ VISDASK5 IF ZERO, NO TIME TO SEEK 80034180 TM VIDVTYP,VIDVDRM IS THIS A FIXED-HEAD DEVICE? 80034200 BO VISDASK5 YES, NO SEEK COUNT OR ACCESS TIME 80034220 SPACE 1 80034240 * COUNT NUMBER OF CYLINDERS CROSSED * 80034260 L R1,4(R10) ELSE, GET COUNT OF CYLS. CROSSED 80034280 AR R1,R0 INCREMENT COUNT 80034300 ST R1,4(R10) STORE BACK COUNT 80034320 MH R0,VIDVATIM ELSE, FIGURE ACCESS TIME 80034340 A R0,VIODLAYT ADD TO OTHER ACCUM. DELAYS 80034360 ST R0,VIODLAYT STORE AS NEW ACCUM. DELAY 80034380 VISDASK5 BAL R10,VISDAWRT CALL FOR REAL D.A. WRITE/READ 80034400 LR R1,R0 SAVE AMOUNT OF SEEK, ORIENT. TIME 80034420 B VISENQ2 IF TIME REQUIRED, ENQUE I/O EVENT 80034440 EJECT 80034460 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80034480 * * ROTATING DELAY POSITIONING FOR READ, WRITE, SEARCH * 80034500 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80034520 VISDAROT EQU * 80034540 SR R0,R0 CLEAR REGISTER 80034560 TM VIDVTST,VIDVCD IS DATA CHAINING ON? 80034580 BO VISDART2 YES, THEN SKIP POSITIONING 80034600 SPACE 2 80034620 * SET UP SPECIAL POSITIONING AND CHECK FILE MASK * 80034640 NI VIBFLGS,255-VIBFTOG4 G4==>GO TO INDEX PT (RESET IF #80034660 FORMAT WRITE) 80034680 CLI VICHCOPC,X'16' IS THIS READ R0? 80034700 BE *+12 YES, THEN STOP AT H.A. 80034720 TM VICHCOPC,X'39' IS THIS SEARCH HOME @ =? 80034740 BNO *+12 NO, SKIP 80034760 OI VIBFLGS,VIBFTOHA YES, THEN STOP AT HOME @ POINT 80034780 B VICHNOK AND SKIP OTHER CHAINING TESTS 80034800 SPACE 1 80034820 TM VIDVTST2,VIDV2WRT IS THIS A WRITE? 80034840 BNO VICHNOK NO, THEN NO CHAINING REQUIREMENTS 80034860 SPACE 2 80034880 TM VIDVTFM,B'11000000' ARE ALL WRITES LEGAL? 80034900 BO VICHNWC YES, THEN GO CHECK CHAIN. REQS. 80034920 TM VIDVTFM,B'01000000' ARE ALL WRITES INHIBITED? 80034940 BO VISRUCHK YES, PRESENT UNIT CHECK 80034960 EJECT 80034980 * * * * * * * * * * * * * * * * * * 80035000 * * CHECK CHAINING REQUIREMENTS * * 80035020 * * * * * * * * * * * * * * * * * * 80035040 SPACE 2 80035060 * WRITE C-K-D MUST BE CHAINED FROM WRITE C-K-D, SEARCH * 80035080 * ID=, SEARCH KEY= . * 80035100 VICHNWC CLI VICHCOPC,X'1D' IS THIS WRITE COUNT KEY DATA? 80035120 BNE VICHNWR0 NO, THEN TRY FOR WRITE KEY DATA 80035140 TM VIDVTFM,B'10000000' HAVE FORMAT WRITES BEEN INHIB? 80035160 BNO *+12 NO,TESTING COMPLETE 80035180 TM VIDVTFM,B'01000000' HAVE FORMAT WRITES BEEN INHIB? 80035200 BZ VISRUCHK YES,THEN UNIT CHECK 80035220 TM VIDVTST2,VICHNCKD+VICHNSID+VICHNSKY CHECK CHAINING 80035240 BZ VISRUCHK IF ALL 0'S, THEN IMPROPER CHAINING 80035260 OI VIBFLGS,VIBFTOG4 IF HIT G4 GAP, STAY THERE 80035280 B VICHNOK CHAINING OK, PROCEED TO I/O 80035300 SPACE 2 80035320 * WRITE R0 MUST BE CHAINED FROM SEARCH HOME ADDR. EQUAL * 80035340 VICHNWR0 CLI VICHCOPC,X'15' IS THIS WRITE R0? 80035360 BNE VICHNWKD NO, CHECK FOR WRITE KEY DATA 80035380 TM VIDVTFM,B'11000000' HAS WRITE R0 BEEN INHIBITED? 80035400 BNO VISRUCHK ANY INHIBITED==> NO R0 WRITE 80035420 TM VIDVTST2,VICHNSHA CHAINED FROM SEARCH HOME @ =? 80035440 BZ VISRUCHK NO, UNIT CHECK 80035460 OI VIBFLGS,VIBFTOG4 STAY AT G4 IF HIT IT 80035480 B VICHNOK YES, THEN CHAIN CONDITION MET 80035500 SPACE 2 80035520 * WRITE KEY DATA MUST BE CHAINED FROM SEARCH ID = * 80035540 VICHNWKD CLI VICHCOPC,X'0D' IS THIS A WRITE KEY DATA? 80035560 BNE VICHNWD NO, CHECK IF WRITE DATA 80035580 TM VIDVTST2,VICHNSID WAS CHAINED FROM SEARCH ID= ? 80035600 BZ VISRUCHK NO, PRESENT UNIT CHECK 80035620 B VICHNOK YES, CHAINING REQUIREMENTS MET 80035640 SPACE 2 80035660 * WRITE DATA MUST BE CHAINED FROM SEARCH ID= OR * 80035680 * SEARCH KEY= * 80035700 VICHNWD CLI VICHCOPC,X'05' IS IT WRITE DATA? 80035720 BNE VICHNOK NO, CHAINING DONE 80035740 TM VIDVTST2,VICHNSID+VICHNSKY CHAINING CONDITIONS MET? 80035760 BZ VISRUCHK NO, PRESENT UNIT CHECK 80035780 EJECT 80035800 * * * * * * * * * * * * * * * * * * * * * * * * 80035820 * * UPDATE SIMULATED HEAD POSITION ON TRACK * * 80035840 * * * * * * * * * * * * * * * * * * * * * * * * 80035860 SPACE 1 80035880 * UPDATE POSITION ON BUFFER SINCE LAST KNOW POSITION * 80035900 VICHNOK L R0,VICLOCK GET PRESENT TIME 80035920 BAL RLINK,VIUPDBPT UPDATE BUFFER POINTER 80035940 MH R0,VIDVTTIM GET TIME TO PASS POSITIONING BYTES 80035960 SRA R0,6 SHIFT TO UNSCALE D.A. TRANSFER TIME 80035980 A R0,VIODLAYT ADD OTHER ACCUMULATED DELAYS 80036000 ST R0,VIODLAYT STORE BACK AS NEW ACCUM. DELAY 80036020 SR R2,R2 CLEAR BYTE REGISTER 80036040 LH R1,VIDVBFPT GET BUFFER POINTER 80036060 SPACE 2 80036080 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80036100 * * POSITION AT COUNT, KEY, OR DATA WITHIN ONE RECORD * * 80036120 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80036140 SPACE 1 80036160 * POSITION TO COUNT FIELD * 80036180 TM VICHCOPC,B'00010000' IS THIS A COUNT X X OP? 80036200 BNO VISDRKEY NO, THEN CHECK FOR KEY X 80036220 TM VIBFCKDX,B'00001100' CHECK IF PAST KEY OR DATA PART 80036240 BO *+16 IF AT COUNT FIELD, ALL SET UP 80036260 BM *+8 IF AT DATA FIELD, MUST SKIP THAT 80036280 BAL RLINK,VIROTKEY CALL TO ROTATE PAST KEY PART 80036300 BAL RLINK,VIROTDTA CALL TO ROTATE PAST DATA PART 80036320 B VISDART2 NOW CONTINUE SCAN 80036340 SPACE 1 80036360 * POSITION TO KEY FIELD * 80036380 VISDRKEY TM VICHCOPC,B'00001000' CHECK IF THIS IS KEY X OP? 80036400 BNO VISDRDTA NO, THEN MUST BE DATA OP 80036420 TM VIBFCKDX,B'00001100' PAST KEY OR DATA PART? 80036440 BZ *+16 C00 ==> KEY NEXT, PROPER POSITION 80036460 BO *+8 CKD ==> COUNT NEXT; SKIP IT 80036480 BAL RLINK,VIROTDTA ROTATE PAST DATA PORTION 80036500 BAL RLINK,VIROTCNT ROTATE PAST COUNT FIELD 80036520 B VISDART2 CONTINUE SCAN 80036540 SPACE 1 80036560 * POSITION TO DATA FIELD * 80036580 VISDRDTA TM VIBFCKDX,B'00001100' CHECK IF PAST KEY OR DATA PORTION 80036600 BM *+16 CK0==> DATA NEXT, PROPER SET-UP 80036620 BZ *+8 C00==> KEY NEXT, SKIP IT 80036640 BAL RLINK,VIROTCNT ROTATE PAST COUNT AREA 80036660 BAL RLINK,VIROTKEY ROTATE PAST KEY AREA 80036680 EJECT 80036700 VISDART2 NI VIBFLGS,255-VIBFTOG4 NO LONGER STAY AT G4 80036720 STH R1,VIDVBFPT STORE CURRENT POSITION IN BUFFER 80036740 TM VIDVTST2,VIDV2SCH IS THIS A SEARCH OPCODE? 80036760 BZ VISRNRM2 NO, ENQUE EVENT FOR I/O 80036780 SPACE 2 80036800 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80036820 * * UPDATE INDEX POINT COUNT FOR MULTITRACK SEARCHES * * 80036840 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80036860 TM VIBFLGS,VIBFIXPT HAVE PASSED INDEX POINT? 80036880 BNO VISRNRM2 NO, THEN PROCEED NORMALLY 80036900 NI VIBFLGS,255-VIBFIXPT TURN OFF FLAG SHOWING SEEN IX PT 80036920 TM VICHCOPC,B'10000000' IS THIS A MULTI-TRACK SEARCH? 80036940 BNO VISDART3 NO, THEN CHECK FOR 2 INDEX POINTS 80036960 LH R7,VIDVCRHD GET CURRENT HEAD NUMBER 80036980 LA R7,1(R7) INCREMENT TO SELECT NEXT HEAD 80037000 CH R7,VIDVMXHD CHECK IF HAVE PASSED MAX HEADS 80037020 BH VISRDENT YES, THEN PRESENT INTERRUPT 80037040 STH R7,VIWORKF2+2 NO, THEN GO READ NEW TRACK 80037060 MVC VIWORKF2(2),VIDVCRCY COPY CURRENT CYLINDER NUMBER 80037080 BAL R10,VISDAWRT GO PERFORM DIRECT ACCESS WRITE 80037100 MH R0,VIDVTTIM COMPUTE TIME TO GET NEW TRACK 80037120 SRA R0,6 VIDVTTIM IS TRF. TIME * 64 80037140 A R0,VIODLAYT SAVE TIME OF GET. NEW TRACK/ALIGN 80037160 ST R0,VIODLAYT STORE FOR ACCUMULATED DELAY 80037180 B VISRNRM2 NORMAL COMPLETION OF I/O PASS 1 80037200 SPACE 1 80037220 VISDART3 TM VIDVTST,VIDVIX2 CHECK IF THIS IS THE SECOND INDEX 80037240 BO VISRDENT YES, THEN PRESENT DEVICE END 80037260 OI VIDVTST,VIDVIX2 NO, SHOW 1 INDEX PT. HAS BEEN SEEN 80037280 B VISRNRM2 ENQUE FOR FULL SEARCH 80037300 .VINSIO2 ANOP 80037320 TITLE 'UNIT RECORD DEVICES' 80037340 * * * * * * * * * * * * * 80037360 * * UNIT RECORD WRITE * * 80037380 * * * * * * * * * * * * * 80037400 VISIOPN1 LA R1,VIDVDDNM GET @ OF DDNAME IN CHARACTERS 80037420 TM VIDVTYP,VIDVTRM IF TERMINAL, MUST USE DIFF. DDNAME 80037440 BNO *+8 NO, SKIP 80037460 LA R1,VIDVDDNO ELSE USE DDNAME FOR TERM OUTPUT 80037480 OI VIDVTST,VIDVOPEN GUESS DEVICE IS OPEN 80037500 XPUT *,-1 TRY TO OPEN ONLY 80037520 BO VIDVATN OPEN DID NOT GO--PRESENT ATTENTION 80037540 XC VIDVBFPT,VIDVBFPT ELSE SHOW BUFFER EMPTY 80037560 SPACE 2 80037580 VISWRCTL EQU * PROCEED WITH REST OF WRITE/CONTROL 80037600 TM VIDVTYP,VIDVTRM IS THIS TERMINAL OUTPUT? 80037620 BO VISWRTM YES, GO WRITE TO TERMINAL DEVICE 80037640 TM VIDVTST,VIDVCD TEST IF DATA CHAIN TO THIS COMMAND 80037660 BO VISIMMOP YES, PROCEED TO WRITE 80037680 TM VISOPS,VIDVCTL IS THIS A CONTROL--NOT WRITE? 80037700 BNO VISWRT NO,THEN GO FOR WRITE NOW 80037720 LH R0,VISOPTIM GET DELAY FOR THIS CTL. OP 80037740 A R0,VIODLAYT ADD TO REST OF ACCUM, DELAYS 80037760 ST R0,VIODLAYT SAVE FOR NEXT TIME DELAYS TAKEN 80037780 B VISIMMOP SHOW END OF IMMEDIATE OPERATION 80037800 SPACE 2 80037820 VISWRTM TM VISOPS,VIDVCTL IS THIS A CONTROL OP? 80037840 BNO VISWRTM1 NO, NORMAL WRITE 80037860 LH R1,VISOPTIM GET TIME OF THE OPERATION 80037880 LTR R1,R1 IS IT ZERO TIME OP? 80037900 BZ VISIMMOP YES. THEN TREAT AS IMMEDIATE OP 80037920 B VISENQ2 ELSE DELAY DOESN'T DEPEND ON # BYTES 80037940 SPACE 2 80037960 VISWRTM1 LH R0,VICHCCNT GET COUNT FROM CCW 80037980 LR R1,R0 SAVE THAT COUNT 80038000 SRA R0,3 GET # BYTES DIVIDED BY 8 80038020 AR R1,R0 LENGTH OF TRF + IDLE FOR CARR RET 80038040 MH R1,VISOPTIM MULT. BY TIME PER BYTE MOVEMENT 80038060 SPACE 2 80038080 VISWRTM2 A R1,VIODLAYT ADD ACCUMULATED DELAY TIME 80038100 ST R1,VIODLAYT NOW HAVE NEW DELAY TIME 80038120 SPACE 2 80038140 * MUST CHECK IF CAN ACCESS 1 BYTE--JUSTIFY PRINT TIME * 80038160 VISWRT L R1,VICHCWD1 GET @ TO WHICH TO TRANSFER 80038180 $CKEY (R1),(R1),KEY=VICHSKEY,TYPE=F, CAN TRANSFER DATA? #80038200 PROT=VISPTCK1,ADDR=VISPGCK1 FOR ADDR, PROT CHECK 80038220 SR R1,R1 ZERO FOR TIME DELAY 80038240 B VISUREND SET UP FOR COMMAND END 80038260 EJECT 80038280 * * * * * * * * * * * * * 80038300 * * READ CARD COMMAND * * 80038320 * * * * * * * * * * * * * 80038340 VISCRD EQU * 80038360 TM VIDVTST,VIDVEOF HAS END OF FILE CONDITION OCCURRED? 80038380 BO VIDVATN YES, THEN PRESENT ATTENTION COND. 80038400 TM VIDVTST,VIDVCD CHECK IF DATA CHAININ ON 80038420 BO VISIMMOP 80038440 SPACE 2 80038460 * PERFORM READ SO CAN TRANSFER SOME OR ALL DATA * 80038480 VISREAD LA R1,VIDVDDNM POINT TO PSEUDO-DEVICE DDNAME 80038500 OI VIDVTST,VIDVOPEN SHOW DEVICE IS OPEN 80038520 LH R10,VIDVBFLN GET LENGTH TO READ 80038540 XC VIDVBFPT,VIDVBFPT POINTER TO BEGINNING OF BUFFER 80038560 XGET (R9),(R10) PERFORM READ 80038580 BZ VISCRDND NORMAL I/O TERM. TRANSFER DATA 80038600 BM VISREOF IF READ DID NOT GO, PRESENT AN EOF 80038620 VIDVATN NI VIDVTST,255-VIDVOPEN-VICHWORK NOT OPEN OR WORKING 80038640 OI VIDVTST,VIDVEOF ^OPEN & EOF ==> ATTN 80038660 B VICC3 SHOW DEV. NOT OPERAT. AND RETURN 80038680 SPACE 1 80038700 VISREOF NI VIDVTST,255-VIDVAVL SHOW CHANNEL NOT AVAILABLE 80038720 OI VIDVTST,VIDVWORK+VIDVOPEN+VIDVEOF SHOW HAVE HIT EOF #80038740 AND WORKING, AND OPEN ==> EOF 80038760 B VISUXCPT GO SHOW END OF FILE 80038780 SPACE 2 80038800 VISCRDND TM VIDVTYP,VIDVTRM IS THIS A TERMINAL DEVICE? 80038820 BNO VISUREND NO, PROCESS AS NORMAL U/R END 80038840 LA R1,VITRMCDL-1(R9) YES, FIND END OF MESSAGE READ 80038860 LA R0,VITRMCDL-VITRMTML MAX MSG. LEN=CARD LEN-TIME LEN 80038880 VISRDTM CLI 0(R1),C' ' CHECK FOR A NON-BLANK COLUMN 80038900 BNE VISRDTM1 FOUND, END LOOP 80038920 BCTR R1,0 ELSE BACK UP ONE CARD COLUMN 80038940 BCT R0,VISRDTM AND LOOP UNTIL FIND LAST NON BLANK 80038960 VISRDTM1 SR R1,R9 GET RELATIVE PTR TO LAST NON BLANK 80038980 LA R1,1(R1) ABOVE COMPUTES (LEN-1) OF INPUT 80039000 STH R1,VIDVDTLN STORE POINTER TO LAST DATA POSN 80039020 MVC VIOTRH3(8),0(R9) GET TIME INTO FIXED AREA 80039040 XDECI R0,VIOTRH3 CONVERT TO BINARY 80039060 MH R0,=H'76' CONVERT MILLISECS TO TIMER UNITS 80039080 LR R1,R0 PUT RESULT IN R0 AS EXPECTED 80039100 MVC VIDVBFPT,=AL2(VITRMTML+1) POINT TO FIRST DATA BYTE 80039120 B VISENQ2 ENQUE FOR NORMAL END OF OPERATION 80039140 SPACE 2 80039160 * END OF NORMAL UNIT RECORD OPERATION * 80039180 VISUREND LH R1,VISOPTIM GET TIME FOR OPN 80039200 B VISENQ2 ENQUE FOR I/O EVENT 80039220 TITLE 'ENQUE EVENT AND END PASS 1' 80039240 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80039260 * * ENQUE EVENT FOR DATA TRANSFER TO OCCUR LATER * * 80039280 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80039300 VISRNRM2 LH R1,VICHSCNT GET COUNT TO TRANSFER 80039320 MH R1,VIDVTTIM MULTIPLY TO FIND TIME TO TRF 80039340 TM VIDVTYP,VIDVDA IS THIS D.A. DEVICE? 80039360 BZ VISENQ2 NO, TIME TO TRANSFER CORRECT 80039380 SRA R1,6 ELSE DIVIDE BY 64: DVTTIM=TIME*64 80039400 SPACE 2 80039420 VISENQ2 A R1,VIODLAYT ADD ACCUMULATED OTHER DELAYS 80039440 XC VIODLAYT,VIODLAYT ZERO DELAY TIME FOR LATER 80039460 LTR R1,R1 CHECK IF ANY DELAY TO ENQUE 80039480 BNP VISIMMOP NO, TREAT AS IMMED. OPN. 80039500 BAL RLINK,VINQEVNT GO ENQUE EVENT TO OCCUR 80039520 LA R1,VISRD2 GET @ OF PASS 2 ROUTINE 80039540 ST R1,4(R2) STORE IN EVENT LIST 80039560 MVC 4(1,R2),VIDVTIX PUT IN INDEX OF INTERRUPT 80039580 B *+8 SKIP SHOWING IMMEDIATE OP. 80039600 * TAKE CARE OF OPERATIONS WHICH OCCUR INSTANTANEOUSLY * 80039620 VISIMMOP OI VIOFLAG,VIOFIMM SHOW THIS WAS IMM. OP 80039640 SPACE 2 80039660 * FINISH SHOWING DEVICE BUSY * 80039680 NI VIDVTST,255-VIDVAVL SHOW DEVICE NOT AVAILABLE 80039700 OI VIDVTST,VIDVWORK SHOW DEVICE WORKING 80039720 OI VICHSUST,VICUSBSY SHOW DEVICE BUSY 80039740 L R7,=A(VICHTAB) GET @ OF CHANNEL INFO WORDS 80039760 SR R10,R10 CLEAR FOR INSERT 80039780 IC R10,VICHTIX GET POINTER TO CHANNEL TABLE ENTRY 80039800 ALR R7,R10 R7 = @ OF STATUS WORD THIS CHANNEL 80039820 USING VICHTABD,R7 SHOW USE OF CHANNEL TABLE 80039840 SPACE 2 80039860 * SET NUMBER OF WORKING DEVICES ON CHANNEL * 80039880 TM VIOFLAG,VICCW1 IS THIS FIRST CCW THIS DEVICE? 80039900 BNO VISRPCI NO, THEN GO CHECK FOR PCI 80039920 MVI VICHTST,VICHWORK SHOW CHANNEL WORKING 80039940 OC VICRSTAT(1),VIDVCMSK SHOW CHANNEL CURRENTLY ACTIVE 80039960 IC R10,VICH#BSY INCREMENT # OF DEVICES 80039980 LA R10,1(R10) BUSY ON THIS CHANNEL 80040000 STC R10,VICH#BSY RESTORE # DEVICES BUSY 80040020 SPACE 2 80040040 * CHECK FOR AND PRESENT PROGRAM CONTROLLED INTS. * 80040060 VISRPCI TM VICHCFLG,VICHCPCI CHECK IF THIS IS A PCI 80040080 BZ VINOPCI NO, THEN SKIP 80040100 OI VICHSCST,VICHSPCI SHOW PCI BIT IN CSW 80040120 TM VIDVTST,VIDVIPND IS INT. ALREADY PEND. THIS DEVICE? 80040140 BO VINOPCI YES, DON'T INCREMENT # INTS PEND 80040160 IC R10,VICH#PND GET # DEVICES PENDING THIS CHANNEL 80040180 LA R10,1(R10) INRCREMENT 80040200 STC R10,VICH#PND STORE BACK AGAIN 80040220 OC VIPEND(1),VIDVCMSK SHOW AN INT. IS TO OCCUR 80040240 OI VIDVTST,VIDVIPND SHOW PENDING INT THIS DEVICE 80040260 DROP R7 80040280 SPACE 2 80040300 VINOPCI TM VIOFLAG,VIOFIMM IS THIS AN IMMED. OP? 80040320 BO VISR2GO YES, THEN GO TO PASS 2 80040340 TM VIOFLAG,VIOCCSET HAS COND CODE BEEN SET?? 80040360 BO VICC0 NO, THEN SHOW GOOD CCW ACCEPTED 80040380 B VIORTRN ELSE RETURN 80040400 DROP R12,R13,R8,R9 BASES NO LONGER IN EFFECT 80040420 TITLE 'PASS 2 - DATA TRANSFER' 80040440 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80050000 * * 80050020 * PASS 2 - DATA TRANSFER TO/FROM USER * 80050040 * * 80050060 * EVENT LIST CONTAINS I/O COMPLETION EVENT * 80050080 * FIND PROPER CHANNEL/DEVICE NUMBER * 80050100 * TEST IF HALT HAS BEEN EXECUTED * 80050120 * TRANSFER DATA * 80050140 * CHECK IF EXCEPTIONAL CONDITION, COMMAND CHAIN, * 80050160 * OR DATA CHAIN * 80050180 * SIGNAL INTERRUPT * 80050200 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80050220 SPACE 1 80050240 ENTRY VISRD2 MOVE DATA AFTER TIME FOR TRANSFER 80050260 VISRD2 DS 0H 80050280 USING *,R7 ENTRY IS THROUGH R7 80050300 STM R14,R0,12(R13) STORE REGISTERS 80050320 ST R12,68(R13) SAVE FOR 2ND BASE 80050340 L R8,=A(VIOSAVE) GET ADDR OF NEW SAVE AREA 80050360 DROP R7 BASE REGISTER NO LONGER VALID 80050380 ST R8,8(R13) LINK 80050400 ST R13,4(R8) LINK 80050420 LR R13,R8 SET UP NEW ADDRESSABILITY 80050440 LA R12,2048(R13) SET UP 2ND BASE 80050460 LA R12,2048(R12) SET UP 2ND BASE 80050480 USING VIOSAVE,R13,R12 80050500 SRL R7,24 SHIFT CHANNEL/DEVICE TO LOW HALF 80050520 L R8,=A(VIDVTAB) POINT TO DEVICE TABLE 80050540 L R8,0(R7,R8) GET @ OF CURRENT DDEV TAB. ENTRY 80050560 USING VIDVTABD,R8 SHOW POINTER IN USE 80050580 SPACE 2 80050600 VISR2GO MVI VIABFLAG,VIABPAS2 SHOW BEGINNING OF PASS 2: DATA TRF. 80050620 CLI VICHCOPC,X'1E' IS THIS READ C-K-D; MAY BE CHNED 80050640 BE *+8 W/OUT DESTROYING CHAINING REQS. 80050660 NI VIDVTST2,255-VICHNCKD-VICHNSKY-VICHNSID-VICHNSHA NO CH 80050680 L R9,VIDVBFAD GET PTR. TO BUFFER 80050700 USING VIDABF,R9 USING DSECT ON D.A. INFO. 80050720 TM VIDVTST2,VIDV2RD+VIDV2WRT+VIDV2SCH RD,WRT,SCH? 80050740 BNZ VISR2GO1 YES, PROCEED WITH REST OF TRANSFER 80050760 LH R2,VICHCCNT GET AMT TO BE TRFD (FOR DELAY) 80050780 TM VIDVTYP,VIDVMPX TEST FIRST IF IS MPX (CTL OP.) 80050800 BNO VISR2PTS NO, THEN END THIS PASS 80050820 SPACE 2 80050840 * CHECK FOR HALT I/O OR EOF ON THIS DEVICE * 80050860 VISR2GO1 TM VIDVTST,VIDVHALT HAS HALT I/O BEEN ISSUED? 80050880 BNO VISR2NHL NO, THEN SKIP 80050900 MVI VICHSUST,VICUSEND SHOW ALL END CONDITIONS 80050920 OC VICHSCNT,VICHSCNT CHECK RESIDUAL COUNT=0? 80050940 BZ VISRINT YES, CREATE INTERRUPT 80050960 TM VICHCFLG,VICHCSLI CHECK IF SLI BIT WAS SET 80050980 BO VISRINT YES, CREATE INTERRUPT 80051000 OI VICHSCST,VICHSIL ELSE SHOW INCORR. LEN. 80051020 B VISRINT CAUSE INTERRUPT 80051040 SPACE 2 80051060 * CHECK IF EOF HAS OCCURRED * 80051080 VISR2NHL TM VIDVTST,VIDVOPEN+VIDVEOF (BOTH==> EOF THIS READ) 80051100 BNO VISRATN2 IF NOT, NORMAL 80051120 MVC VIDVBFPT,VIDVBFLN SHOW 0 MORE BYTES TO TRANSFER 80051140 B VISRCKLN TREAT AS INCORRECT LEN (0 TRF.) 80051160 VISRATN2 TM VIDVTST,VIDVEOF CHECK IF EOF HAS OCCURRED 80051180 BNO VISRCKLN NO, THEN NORMAL READ OCCURRED 80051200 OI VICHSUST,VICUSATN TURN ON ATTN BIT 80051220 B VISRINT CREATE INTERRUPT CONDITION 80051240 EJECT 80051260 * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** 80051280 * * DETERMINE PROPER LENGTH FOR DATA TRANSFER: * 80051300 * * SMALLER OF CCW COUNT FIELD, AMOUNT OF SPACE LEFT * 80051320 * * IN BUFFER, OR SIZE OF D.A. COUNT, KEY OR DATA FIELD* 80051340 * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** 80051360 VISRCKLN EQU * CHECK LENGTHS 80051380 TM VIDVTYP,VIDVMPX IS THIS FOR A MULTIPLEXER DEVICE? 80051400 BO VISRCKL3 YES, DO EASY LENGTH CHECK 80051420 AIF (&$VI#DA EQ 0).VINSIO3 80051440 TM VIDVTYP,VIDVTRM IS THIS A TERMINAL? 80051460 BO VISRCK3A YES, USE DIFFERENT CHECK PROCESS 80051480 SR R2,R2 CLEAR BYTE REGISTER 80051500 SR R0,R0 CLEAR LENGTH ACCUM .REG. 80051520 TM VIDVTST2,VIDV2WRT IS THIS A WRITE? 80051540 BNO VISRCKL2 NO, THEN IGNORE 80051560 TM VICHCOPC,B'00010000' IS THIS A FORMAT WRITE? 80051580 BNO VISRCK2A NO, THEN USE RECORD LENGTH 80051600 SPACE 2 80051620 * FORMAT WRITE: DETERMINE MAXIMUM SPACE LEFT IN BUFFER * 80051640 LH R10,VIDVBFLN MUST GET MAXIMUM LENGTH RECORD 80051660 SH R10,VIDVBFPT TOTAL SPACE LEFT ON TRACK 80051680 L R7,VICHCWD1 GET @ OF THE COUNT FIELD 80051700 ALR R7,RMEM RELOCATE IN PROGRAM AREA 80051720 TM VIDVTST,VIDVCD IS DATA CHAINING ON? 80051740 BO VISRCK2A YES, THEN RECORD MUST FIT 80051760 MVC VIBFKDL,5(R7) MOVE THAT TO AN ALIGNED AREA 80051780 IC R2,VIBFKL GET KEY LENGTH AREA 80051800 LH R1,VIBFDL GET LENGTH OF DATA AREA 80051820 LA R1,8+6+8(R1) ADD FOR COUNT, G2, AND G3 GAPS 80051840 LTR R2,R2 CHECK IF KEY FIELD 0 80051860 BZ *+8 YES, THEN DON'T ADD ANOTHER G2 80051880 LA R1,6(R1,R2) ELSE ADD ANOTHER G2 + KEY LEN. 80051900 * NOW R1 = TOT LENGTH OF THIS RECORD; R10 = SPACE AVAIL. * 80051920 CR R1,R10 IS RECORD LARGER THAN WILL FIT? 80051940 BH VISRUCHK YES, PRESENT UNIT CHECK 80051960 LA R0,8(R2) GET AMT. FOR COUNT+KEY AREA (REAL) 80051980 AH R0,VIBFDL ADD AMT. FOR DATA AREA 80052000 CLC VICHCCNT,=H'8' ALSO, COUNT FIELD MUST BE IN REC 1 80052020 * NOTE--THIS IS NOT NECESSARILY STANDARD * 80052040 BL VISRUCHK IF NOT, WE PRESENT UNIT CHECK 80052060 B VISRCKL4 HAVE MET ALL LENGTH RESTRICTIONS 80052080 SPACE 2 80052100 * CASE 2 : DIRECT ACCESS, BUT NOT FORMAT WRITE * 80052120 * FIGURE LENGTH OF EXISTING COUNT, KEY, OR DATA FIELD * 80052140 VISRCKL2 TM VICHCOPC,B'00010000' IS COUNT BEING TRANSFERRED? 80052160 BZ VISRCK2A NO, THEN DON'T GET NEW KL/DL 80052180 TM VIDVTST,VIDVCD WAS DATA CHAINING ON? 80052200 BO VISRCK2A YES, NO NEED TO RESET PTR 80052220 LH R7,VIDVBFPT ELSE GET POINTER IN BUFFER 80052240 STH R7,VIBFRPT POINT TO PRESENT RECORD 80052260 ALR R7,R9 AND RELOCATE 80052280 MVC VIBFKDL,5(R7) MOVE IN NEW KL/DL 80052300 VISRCK2A TM VIDVTST2,VIDV2SCH IS THIS A SEARCH 80052320 BNO VISRCK2B NO USE LENGTH RECORD AS MAX 80052340 LA R0,4 GUESS IT IS SEARCH HOME@ 80052360 TM VICHCOPC,X'39' WAS GUESS CORRECT 80052380 BO VISRCKL4 YES, GO CHECK AGAINST USER LENGTH 80052400 LA R0,5 ELSE LENGTH IS 4 AS IN SEARCH ID 80052420 TM VICHCOPC,X'10' (SRCH ID = X'31',51,OR71) 80052440 BO VISRCKL4 YES CHECK AGAINST USER LENGTH 80052460 IC R0,VIBFKL ELSE MAX LENGTH IS KEY LENGTH 80052480 B VISRCKL4 (LENGTH WILL BE CHECKED LATER ) 80052500 VISRCK2B LA R0,8 GET LENGTH OF COUNT FIELD 80052520 IC R2,VIBFKL GET LENGTH OF KEY FIELD 80052540 AR R0,R2 ADD LENGTH OF KEY TO GET END OF KEY 80052560 AH R0,VIBFDL ADD DATA LENGTH TO GET END OF REC. 80052580 AH R0,VIBFRPT RELOCATE TO REL. @ ON TRACK 80052600 SH R0,VIDVBFPT SUBTRACT TO GET AMT. REM. THIS REC. 80052620 SPACE 1 80052640 OC VIBFDL,VIBFDL CHECK IF DATA LENGTH IS ZERO (EOF) 80052660 BZ VISUXCPT YES, PRESENT UNIT END-OF-FILE IND. 80052680 TM VICHCOPC,B'00000100' WAS THIS A DATA TRANSFER? 80052700 BO VISRCKL4 YES, THEN R0 HAS RIGHT LENGTH 80052720 SH R0,VIBFDL NO, THEN REDUCE TO STOP AFTER KEY 80052740 TM VICHCOPC,B'00001000' WAS THIS A KEY TRANSFER? 80052760 BO VISRCKL4 YES, THEN R0 NOW HAS RIGHT LENGTH 80052780 SR R0,R2 NO, THEN REDUCE TO STOP AFTER COUNT 80052800 B VISRCKL4 GO CHECK LENGTHS 80052820 .VINSIO3 ANOP 80052840 SPACE 2 80052860 * UNIT RECORD AND TERMINAL LENGTH CHECKING * 80052880 * FOR TERMINALS LET MAX = LENGTH PASSED * 80052900 VISRCK3A LH R0,VIDVDTLN USE REAL LENGTH OF DATA 80052920 TM VIDVTST2,VIDV2RD BUT THAT LENGTH EXISTS ONLY FOR READ 80052940 BO *+8 SKIP OTHER LENGTH BEING USED 80052960 SPACE 1 80052980 VISRCKL3 LH R0,VIDVBFLN FOR NON-D.A. GET LENGTH OF BUFFER 80053000 SH R0,VIDVBFPT MINUS PTR ==> AMT. OF DATA LEFT 80053020 TM VIDVTST2,VIDV2RD+VIDV2PRT IS THIS READ OR WRITE? 80053040 BNZ *+8 80053060 LA R0,1 ELSE SHOW ONLY 1 BYTE TRANSFER 80053080 EJECT 80053100 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * 80053120 * CHECK ON AMOUNT OF DATA TO BE TRANSFERRED. * 80053140 * R0 CONTAINS MAXIMUM AMOUNT OF CURRENT RECORD LEFT, OR SPACE * 80053160 * LEFT ON TRACK FOR D.A. WRITE. * 80053180 * WILL END WITH R0 CONTAINING SMALLER OF REQUESTED AMOUNT OR * 80053200 * AMOUNT AVAILABLE. * 80053220 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * 80053240 VISRCKL4 LH R1,VICHCCNT GET CCW COUNT 80053260 CR R1,R0 COMPARE AMT. NEEDED VS. AMT. AVAIL. 80053280 BE VISR2TRF GO TRANSFER DATA IF PROPER 80053300 BL VIDTOVF ALL DATA NOT NEEDED; (SOME LEFT) 80053320 SPACE 2 80053340 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80053360 * TOO LITTLE DATA LEFT: * 80053380 * 1. MOVE DATA * 80053400 * 2. CHECK IF CD . IF YES, IL IN CSW; END * 80053420 * 3. CHECK IF SLI. IF NO, IL IN CSW; END * 80053440 * 4 CHECK IF CC . IF YES, NORMAL TRANSFER * 80053460 * 5. ELSE NO IL IN CSW; END * 80053480 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80053500 TM VICHCFLG,VICHCCD CHECK IF CD CALLED FOR 80053520 BNO VISRCKIL NO, CHECK FOR IL 80053540 NI VICHCFLG,255-VICHCCD-VICHCCC INHIBIT CD AND CC 80053560 OI VICHSCST,VICHSIL SHOW INCORR. LEN. 80053580 B VISR2TRF TRANSFER WHAT DATA YOU CAN 80053600 SPACE 1 80053620 VISRCKIL TM VICHCFLG,VICHCSLI CHECK IF SLI BIT ON 80053640 BO VISRCKCC YES, CHECK IF COMMAND CHAINING 80053660 OI VICHSCST,VICHSIL SHOW INCORRECT LENGTH 80053680 B VISR2TRF TRANSFER DATA 80053700 SPACE 1 80053720 VISRCKCC TM VICHCFLG,VICHCCC CHECK IF COMMAND CHAINING 80053740 BO VISR2TRF YES, TRANSFER DATA NOW 80053760 OI VICHSCST,VICHSIL SHOW IL IN CSW 80053780 B VISR2TRF TRANSFER 80053800 SPACE 2 80053820 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80053840 * TOO MUCH DATA LEFT; PARTIAL TRANSFER * 80053860 * TRANSFER, BUT SUPPRESS CC IF NOT SIL * 80053880 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80053900 VIDTOVF LR R0,R1 SET PROPER AMT. OF TRANSFER 80053920 OI VICHSCST,VICHSIL SHOW INCORR. LENGTH 80053940 TM VICHCFLG,VICHCCD IS DATA CHAINING ON? 80053960 BO VISR2TRF YES, THEN GO TRANSFER PART 80053980 TM VIDVTST2,VIDVSCH IS THIS A SHORT LENGTH SEARCH 80054000 BO VISR2TRF YES, PROCESS SHORT SEARCH 80054020 TM VICHCFLG,VICHCSLI CHECK IF SLI BIT ON IN CCW 80054040 BO VISR2TRF YES, THEN NO SWEAT 80054060 NI VICHCFLG,255-VICHCCC NO, SUPPRESS COMMAND CHAINING 80054080 EJECT 80054100 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80054120 * TRANSFER DATA; AMT. IN R0 * 80054140 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80054160 VISR2TRF L R1,VICHCCW GET ADDRESS TO WHICH TO TRANSFER 80054180 ALR R1,RMEM RELOCATE ADDR. FROM CCW 80054200 TM VICHCFLG,VICHCSKP IS SKIP FLAG ON? 80054220 BNO VISR2CK0 NO, THEN TRY TRANSFER 80054240 TM VIDVTST2,VIDVSCH IS THIS A SEARCH? 80054260 BO VISR2CK0 YES, THEN IGNORE SKIP BIT 80054280 LR R2,R0 SHOW ALL NEEDED WAS TRANSFERED 80054300 SR R0,R0 SHOW NO MORE LEFT TO TRANSFER 80054320 B VISR2PTS PRETEND NORMAL TRANSFER HAS OCCURRED 80054340 VISR2CK0 LTR R0,R0 CHECK IF 0 BYTES TO TRANSFER 80054360 BZ VISR2TFD IF YES, THEN IGNORE 80054380 LH R2,VIDVBFPT GET POINTER IN CURRENT BUFFER 80054400 LA R7,0(R9,R2) GET @ OF NEXT BYTE TO TRANSFER 80054420 LR R2,R0 SAVE # OF BYTES TO BE MOVED 80054440 TM VIDVTST2,VIDV2RD IS THIS A READ? 80054460 BO VISMVTO YES, MOVE TO USER AREA 80054480 TM VIDVTST2,VIDV2SCH IS THIS A SEARCH? 80054500 BO VISRCH YES, GO PERFORM SEARCH 80054520 TM VIDVTST2,VIDV2WRT IS THIS A WRITE OP? 80054540 BO VISMVFM YES, SHOW MOVE FROM USER 80054560 TM VIDVTYP,VIDVTRM IS CONTROL BEING DONE TO TERMINAL? 80054580 BO VISR2TFD YES, SHOW NORMAL END OF OPERATION 80054600 SR R0,R0 MUST BE CTRL OP--SHOW 0 BYTES UNTRFD 80054620 SR R10,R10 SHOW 0 BYTES OTHER THAN CARR CONT. 80054640 B VISURWRT PERFORM UNIT REC WRITE 80054660 TITLE 'WRITE OPERATION - DATA MOVEMENT FROM USER' 80054680 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80054700 * * MOVE DATA FROM USER (WRITE) * 80054720 * * R7=@ TO WHICH TO MOVE; R1=@ FROM WHICH TO MOVE; * * 80054740 * * R0=LENGTH OF MOVE; R9=@ OF START OF BUFFER * * 80054760 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80054780 SPACE 1 80054800 VISMVFM USRMOVE (R7),(R1),(R0),KEY=VICHSKEY,TYPE=FROM, #80054820 PROT=VIWRPTCK,ADDR=VIWRPGCK 80054825 B VIWRGO NORMAL COMPLETION--GO FINISH WRITE 80054830 VIWRPTCK OI VICHSCST,VICHPTCK SHOW PROTECTION CHECK OCCURRED 80054835 B *+8 SKIP 1 INSTRUCTION 80054840 VIWRPGCK OI VICHSCST,VICHPGCK SHOW PGM CHECK OCCURRED 80054845 NI VICHCFLG,255-VICHCCD-VICHCCC ON ERROR SUPPRESS BOTH *80054850 DATA CHAIN AND COMMAND CHAIN 80054855 SPACE 2 80054860 * CHECK FOR DATA CHAINING; IF NOT, PRINT LINE 80054865 VIWRGO TM VICHCFLG,VICHCCD CHECK ON DATA CHAINING 80054870 BO VISR2PTS YES--RESET POINTERS AND LOOP 80054880 SPACE 2 80054900 * NO CHAIN DATA WAS IN EFFECT; PRINT LINE * 80054920 AIF (&$VI#DA EQ 0).VINSIO4 80054940 TM VIDVTYP,VIDVDA IS THIS A DIRECT ACCESS DEVICE? 80054960 BNZ VIDAZERO YES, COMPUTE POINTERS 80054980 .VINSIO4 ANOP 80055000 LH R10,VIDVBFPT WHERE IS BUFFER POINTER? 80055020 AR R10,R2 + AMT. TO MOVE (LEGAL: <= USER REQ.) 80055040 SR R10,R0 - AMT. NOT MOVED (DUE TO PROT.) 80055060 SPACE 1 80055080 * R10 = LEN OF OUTPUT LINE * 80055100 VISURWRT LA R1,VIDVDDNM POINT TO CHARACTERS OF DDNAME 80055120 BCTR R9,0 BACK UP TO POINT TO CARR. CONT. BYTE 80055140 LA R10,1(R10) INCREASE LENGTH FOR CARR. CONTROL 80055160 MVC 0(1,R9),VICHCOPC MOVE IN COMMND 80055180 TM VIDVTYP,VIDVTRM IS THIS A TERMINAL DEVICE? 80055200 BNO VISURWRA NO, THEN PROCEED WITH NORMAL U/R WRT 80055220 SPACE 1 80055240 VISWRTMA MVI 0(R9),C' ' FOR CARRIAGE CONTROL (RECFM=FBA) 80055260 LA R1,VIDVDDNO GET POINTER TO OUTPUT DDNAME 80055280 L R7,VICLOCK GET CLOCK TO TIME STAMP OUTPUT 80055300 XHEXO R7,VITRMS2 CONVERT TO PRINTABLE HEX 80055320 LA R7,0(R9,R10) FIND END OF BUFFER 80055340 MVC 0(VITRMSL,R7),VITRMS1 MOVE IN TIME STAMP MESSAGE 80055360 LA R10,VITRMSL(R10) INCREASE LENGTH OF LINE TO PRINT 80055380 SPACE 2 80055400 VISURWRA XPUT 0(R9),(R10) PUT @ IN R9, LEN IN R10 80055420 BO VIDVATN 80055440 LA R9,1(R9) RESET TO POINT TO BUFFER AGAIN 80055460 XC VIDVBFPT,VIDVBFPT BEGIN MOVEMENT INTO POS. 1 AGAIN 80055480 SPACE 1 80055500 * NOW RESET POINTERS * 80055520 LH R7,VICHCCNT GET AMT IN CCW TO MOVE 80055540 SR R2,R0 GET AMT. TO MOVE - AMT NOT MOVED 80055560 SR R7,R2 REDUCE CCW COUNT TO AMT. REALLY MVD 80055580 STH R7,VICHSCNT STORE CSW COUNT RESIDUE 80055600 B VISR2TFD TRANSFER HAS OCCURRED 80055620 SPACE 2 80055640 VITRMS1 DC C'. AT TIME ' MESSAGE FOR TERMINAL TIME STAMP 80055660 VITRMS2 DS 8X SPACE FOR TIME 80055680 VITRMSL EQU *-VITRMS1 MESSAGE LENGTH 80055700 VITRMCDL EQU 80 LENGTH OF TERMINAL RECORD 80055720 VITRMTML EQU 8 LENGTH OF TIME PART OF TERMINAL REC 80055740 AIF (&$VI#DA EQ 0).VINSIO5 80055760 EJECT 80055780 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80055800 * * DIRECT ACCESS: ZERO REMAINDER OF TRACK OR RECORD * * 80055820 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80055840 VIDAZERO DS 0H 80055860 SR R2,R0 COMPUTE AMT WRITTEN=TO MOVE-RESIDUE 80055880 AR R7,R2 GET @ OF LAST BYTE WRITTEN 80055900 TM VICHCOPC,B'00010000' IS THIS A FORMAT WRITE? 80055920 BNO VIDAZER1 NO THEN ZERO ONLY WITHIN 1 RECORD 80055940 SPACE 1 80055960 * COMPUTE LENGTH OF REMAINDER OF TRACK * 80055980 LR R0,R9 MOVE TRACK POINTER 80056000 AH R0,VIDVBFLN GET @ OF END OF BUFFER 80056020 OI VIDVTST2,VICHNCKD SHOW CHAINED FROM WRITE C-K-D 80056040 OI VIBFLGS,VIBFTOG4 SHOW STAY AT G4 POSITION 80056060 B VIDAZER2 BRANCH TO COMPUTE LEN. TO ZERO 80056080 SPACE 1 80056100 * COMPUTE LENGTH OF REMAINDER OF RECORD * 80056120 VIDAZER1 SR R10,R10 CLEAR REGISTER FOR INSERT 80056140 IC R10,VIBFKL GET LENGTH OF KEY PORTION 80056160 AH R10,VIBFDL COMPUTE LEN OF KEY + DATA 80056180 AH R10,VIBFRPT LOCATE THE START OF THE RECORD 80056200 LA R0,8(R10,R9) ADD 8 FOR COUNT, RELOCATE, AND MOVE #80056220 TO R0 = @ OF END OF CURRENT RECORD 80056240 SPACE 1 80056260 VIDAZER2 SR R0,R7 COMPUTE AMOUNT TO ZERO 80056280 BNP VISR2PTS IF <=0, NOTHING TO ZERO 80056300 SRDL R0,8 GET # 256 BYTE BLKS & REMAINDER 80056320 LTR R0,R0 IF NO 256'S, GO TO SHORT BLOCKS 80056340 BZ VIDAZER3 80056360 XC 0(256,R7),0(R7) ELSE ZERO OUT 256 BYTES PAD 80056380 LA R7,256(R7) UPDATE 80056400 BCT R0,*-10 LOOP TO ZERO ALL 256-BYTE BLOCKS 80056420 SPACE 1 80056440 VIDAZER3 SRL R1,24 GET REMAINDER TO ZERO 80056460 LTR R1,R1 IS IT ZERO? 80056480 BZ VISR2PTS IF ZERO, DONE 80056500 BCTR R1,0 SUBTRACT 1 FOR SS OPN. 80056520 STC R1,*+5 STORE NEW LENGTH VALUE 80056540 XC 0($,R7),0(R7) **CHANGED** ZERO REMAINDER OF BYTES 80056560 B VISR2PTS SHOW TRANSFER DONE 80056580 EJECT 80056600 * * * * * * * * * * * * * * * * * * * * * * * * 80056620 * * SEARCH: COMPARE D.A. FIELD TO USER DATA * * 80056640 * * * * * * * * * * * * * * * * * * * * * * * * 80056660 SPACE 1 80056680 * USE SHORT LENGTH FOR KEY, ID, OR HOME @ SEARCH * 80056700 VISRCH LR R2,R0 SAVE LENGTH TO SEARCH 80056720 IC R0,VIBFKL GET KEY LENGTH CURR. REC. 80056740 TM VICHCOPC,B'00010000' IS THIS COUNT-TYPE SEARCH 80056760 BNO VISRCHA NO, KEY LENGTH IS RIGHT 80056780 LA R0,5 GUESS IT IS SEARCH ID 80056800 TM VICHCOPC,X'39' WAS GUESS WRONG ? (SRCH HOME @) 80056820 BNO VISRCHA GUESS WAS RIGHT--NO CHANGE 80056840 LA R7,VIDVCRCY NO, POINT TO HOME ADDR (CYL HD #) 80056860 BCTR R0,0 REDUCE TO COUNT OF 4 80056880 VISRCHA CR R2,R0 COMPARE USE LENGTH TO MAX. 80056900 BL VISRCHB IF LOW, USE USER AMOUNT 80056920 LTR R2,R0 ELSE, USE MAX LENGTH POSSIBLE 80056940 BZ VISRCHFL ZERO LENGTH SRCH FAILS 80056960 SPACE 2 80056980 * TEST IF SEARCH ARGUMENT REACHABLE (NOT FETCH PROTECTED)* 80057000 VISRCHB USRMOVE *-*,(R1),(R2),TYPE=CHECK,KEY=VICHSKEY, #80057020 PROT=VISPTCK,ADDR=VISPGCK 80057040 BCTR R2,0 REDUCE LEN FOR EX OF SS INSTR 80057060 STC R2,*+5 STORE LENGTH VALUE 80057080 CLC 0($,R7),0(R1) **CHANGED** COMPARE SEARCH VALUES 80057100 LA R2,1(R2) GET BACK FULL LENGTH 80057120 BL VISRCHLO SEARCH WAS LOW--FAIL 80057140 BE VISRCHCD EQUAL SRCH--PRESERVE PRIOR SETTING 80057160 TM VIBFLGS,VIBFSHI TEST IF PREVIOUSLY HIGH OR EQUAL 80057180 BM VISRCHCD IF MIXED==>LOW - DON'T SET HIGH NOW 80057200 OI VIBFLGS,VIBFSHI SHOW HI SEARCH ELSE 80057220 B VISRCHCD TEST FOR DATA CHAINING 80057240 VISRCHLO OI VIBFLGS,VIBFSLO SHOW LOW SETTING--SRCH WILL FAIL 80057260 VISRCHCD TM VICHCFLG,VICHCCD TEST IF DATA CHAINING ON 80057280 BO VISR2TFD YES, THEN TRANSFER DONE FOR NOW 80057300 SPACE 2 80057320 * NO DATA CHAINING; CHECK IF SEARCH SUCCEEDED * 80057340 TM VICHCOPC,B'01000000' CHECK IF HIGH SEARCH DESIRED 80057360 BNO VISRCHE2 NO, THEN MUST BE SEARCH IF EQUAL 80057380 TM VIBFLGS,VIBFSHI WAS HIGH SEARCH SATISFIED? 80057400 BO VISRCHOK YES, SEARCH SUCCEEDED; RESET CSW 80057420 BM VISRCHFL IF LOW, SEARCH FAILED, IGNORE 80057440 * SEARCH MUST HAVE BEEN EQUAL; WAS EQUAL ALLOWABLE? * 80057460 TM VICHCOPC,B'00100000' WAS IT SEARCH XX HI/EQUAL? 80057480 BO VISRCHOK YES, RESET CSW 80057500 BNO VISRCHFL NO, SEARCH FAILED, DON'T SKIP CCW 80057520 VISRCHE2 TM VIBFLGS,VIBFSHI MUST HAVE BEEN SEARCH FOR EQUAL 80057540 BNZ VISRCHFL IF WAS NOT = COMPARE, DON'T SKIP 80057560 SPACE 2 80057580 * SEARCH HAS SUCCEEDED; TRY TO SKIP CCW IF ONE EXISTS * 80057600 VISRCHOK L R7,VICHSWD1 GET @ NEXT CCW FOR SKIP ON SUCCESS 80057620 NI VIBFLGS,255-VIBFIXPT CLEAR IXPT FLAG IF ANOTHER SRCH 80057640 TM VICHCFLG,VICHCCC TEST IF COMMAND CHAINING 80057660 BNO VISRCHXX NO, THEN DON'T UPDATE 80057680 LA R7,8(R7) ELSE GET 1 CCW PAST NEXT ONE 80057700 ST R7,VIWORKF1 STORE IN SPARE FULLWORD 80057720 MVC VICHSADR,VIWORKF1+1 MOVE LAST 3 BYTES TO CSW 80057740 SPACE 2 80057760 * SET CHAINING REMINDERS FOR GOOD SEARCH * 80057780 SPACE 1 80057800 * CHAIN FROM SEARCH HOME ADDRESS EQUAL? * 80057820 VISRCHS1 LA R1,4 GET USEFUL CONSTANT 80057840 TM VICHCOPC,X'39' WAS IT SRCH HOME @ =? 80057860 BNO VISRCHS2 NO, TRY NEXT 80057880 XC VIBFRPT,VIBFRPT ZERO RECORD POINTER--NO CURRENT REC. 80057900 MVC VIBFKDL,=X'000004' SHOW KEY LEN=0, DATA LEN=4 80057920 OI VIBFLGS,VIBFTOG4 STAY AT G4 (IF EMPTY TRACK) 80057940 CR R2,R1 WAS SEARCH LENGTH LONG ENOUGH? 80057960 BL VISRCHXX NO, SKIP CHAINING REMINDER 80057980 OI VIDVTST2,VICHNSHA SHOW CHAINING WENT OK 80058000 B VISRCHXX 80058020 SPACE 1 80058040 * SEE IF CHAINED FROM SEARCH ID EQUAL * 80058060 VISRCHS2 TM VICHCOPC,X'31' WAS THIS SRCH ID =? 80058080 BNO VISRCHS3 NO, TRY AGAIN 80058100 TM VICHCOPC,X'40' WAS IT HI-OR-EQUAL?> 80058120 BO VISRCHXX YES, DONE 80058140 CR R2,R1 CHECK IF LENGTH LARGE ENOUGH 80058160 BNH VISRCHXX NO, SKIP CHAINING BIT 80058180 OI VIDVTST2,VICHNSID SHOW CHAINED LEGALLY 80058200 B VISRCHXX 80058220 SPACE 1 80058240 * SEE IF CHAINED FROM SEARCH KEY EQUAL * 80058260 VISRCHS3 TM VICHCOPC,X'29' IS IT SRCH KEY =? 80058280 BNO VISRCHXX NO,DONE 80058300 TM VICHCOPC,X'40' IS IT SEARCH KEY HIGH-OR-EQUAL? 80058320 BO VISRCHXX YES, DONE 80058340 IC R1,VIBFKL GET KEY LENGTH IN RECORD 80058360 CR R2,R1 COMPARE AMT ACTUALLY SRCHED 80058380 BL VISRCHXX NO, CHAINING DOESN'T GO 80058400 OI VIDVTST2,VICHNSKY SHOW CHAINED FROM SRCH KEY = 80058420 B VISRCHXX 80058440 SPACE 2 80058460 VISRCHXX EQU * END OF SEARCH 80058480 VISRCHFL NI VIBFLGS,255-VIBFSHI SHOW NO HI/LO FOR NEXT SEARCH 80058500 B VISR2PTS 80058520 .VINSIO5 ANOP 80058540 EJECT 80058560 * * * * * * * * * * * * * 80058580 * * READ WAS TO OCCUR * * 80058600 * * * * * * * * * * * * * 80058620 VISMVTO USRMOVE (R1),(R7),(R0),KEY=VICHSKEY,TYPE=TO, X80058640 PROT=VISPTCK,ADDR=VISPGCK ERROR EXITS FOR PROT, ADDR 80058660 BNZ VISPTCK PROT. EXCEPT. INTERRUPT 80058680 TM VIDVTYP,VIDVDA CHECK IF DIRECT ACCESS READ 80058700 BZ VISR2PTS NO, JUST UPDATE POINTERS 80058720 OC VIBFDL,VIBFDL TEST IF DATA LEN = 0 (EOF RECORD) 80058740 BZ VISUXCPT YES. PRESENT UNIT EXCEPTION 80058760 B VISR2PTS GO RESET POINTERS 80058780 TITLE 'RESET POINTERS, CHECK FOR CD OR CC, RETURN' 80058800 * * * * * * * * * * * * * * * * * * * * * * * * * * 80058820 * * END PASS 2: GET NEW CCW OR CAUSE INTERRUPT * * 80058840 * * * * * * * * * * * * * * * * * * * * * * * * * * 80058860 VISR2PTS LCR R10,R2 GET NEGATIVE FOR EFFECTIVE SUBTR. 80058880 AH R10,VICHCCNT FROM WHAT CCW WANTED, GET RESIDUE 80058900 STH R10,VICHSCNT SHOW AS CSW COUNT RESIDUE 80058920 SPACE 2 80058940 * CHECK IF DATA CHAINING * 80058960 VISR2TFD NI VIDVTST,255-VIDVCD WIPE OUT CD SETTING FROM LAST TIME 80058980 TM VIDVTYP,VIDVDA FOR DIRECT ACCESS DEVICE, SAVE 80059000 BZ *+10 POSITIONING INFO. 80059020 MVC VIDVLTIM,VICLOCK SHOW LAST TIME KNEW POSITION=NOW 80059040 TM VICHCFLG,VICHCCD TEST IF DATA CHAINING THIS TIME 80059060 BNO VISR2CC NO, CHECK IF COMMAND CHAIN NOW 80059080 AH R2,VIDVBFPT UPDATE POINTER WITHIN BUFFER 80059100 STH R2,VIDVBFPT STORE NEW POINTER 80059120 OI VIDVTST,VIDVCD SHOW DATA CHAINING THIS TIME 80059140 B VISNCCW GET TO NEXT CCW 80059160 SPACE 2 80059180 * REPOSITION DIRECT ACCESS POINTER * 80059200 VISR2CC TM VIDVTYP,VIDVDA IS THIS DIRECT ACCESS DEVICE? 80059220 BZ VISR2CC2 NO, THEN MERELY GO TO NEXT CCW 80059240 TM VIDVTST2,VIDV2RD+VIDV2SCH+VIDV2WRT IS READ,WRITE,SCH? 80059260 BZ VISR2CC2 NO, MERELY GET NEXT CCW 80059280 MVC VIWORKF1(1),VICHCOPC GET OPCODE OF THIS OPN. 80059300 NI VIWORKF1,X'1C' SAVE ONLY INFO ON PAST POSITION 80059320 TM VIWORKF1,B'00011000' IS THIS SEARCH HOME @? 80059340 BNO *+8 YES, ALSO SHOW PASSED C-K-D FIELDS 80059360 OI VIWORKF1,B'00011100' SET PROPER POSITION REMINDER 80059380 LH R10,VIDVBFPT SAVE OLD BUFFER POINTER 80059400 AR R10,R2 ADD AMOUNT MOVED THIS TIME 80059420 SR R2,R2 CLEAR FOR INSERTS 80059440 LH R1,VIBFRPT GET PTR TO CURRENT RECORD 80059460 BAL RLINK,VIROTCNT MOVE PAST COUNT FIELD 80059480 TM VIWORKF1,B'00001100' HAVE PASSED KEY OR DATA AREA? 80059500 BZ VISR2CC1 SKIP KEY FIELD ROTATION 80059520 BAL RLINK,VIROTKEY ELSE SKIP KEY FIELD 80059540 TM VIWORKF1,B'00000100' IS DATA TYPE OP? 80059560 BNO *+8 NO, DON'T MOVE PAST DATA AREA 80059580 BAL RLINK,VIROTDTA YES, SKIP DATA FIELD 80059600 VISR2CC1 STH R1,VIDVBFPT STORE NEW BUFFER PTR 80059620 CR R1,R10 COMPARE IF STILL ON TRACK 80059640 BNL *+8 YES, WITHIN 1 REVOLUTION DELAY 80059660 AH R1,VIDVBFLN NO, MUST HAVE GONE TO INDEX 80059680 SR R1,R10 # OF BYTES WORTH OF DELAY 80059700 MH R1,VIDVTTIM GET TIME TO PASS THOSE BYTES 80059720 SRA R1,6 DIV. BY 64 SINCE DVTTIM = TIME*64 80059740 A R1,VIODLAYT ADD PREVIOUSLY-ACCUMULATED DELAYS 80059760 ST R1,VIODLAYT STORE DELAY TIME FOR NEXT 80059780 SPACE 2 80059800 * CHECK IF CHAINING IN EFFECT; GET NEXT CCW * 80059820 VISR2CC2 TM VICHCFLG,VICHCCC TEST IF COMMAND CHAINING 80059840 BNO VISRDENT NO, CREATE DEVICE INTERRUPT 80059860 B VISNCCW GO FOR NEXT CCW ACTION 80059880 EJECT 80059900 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80059920 * * EXCEPTIONAL CONDITIONS: SET CSW OR COND. CODE * * 80059940 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80059960 VISUXCPT OI VICHSUST,VICUSUXC SHOW UNIT EXCEPT. = EOF 80059980 B VISRSTOR PRESENT CSW OR INTERRUPT 80060000 SPACE 2 80060020 VISRUCHK OI VICHSUST,VICUSUCK SET UNIT CHECK-ILLEGAL CHAN. OPNS. 80060040 B VISRSTOR STORE CSW OR CAUSE INTERRUPT 80060060 SPACE 2 80060080 * PROGRAM CHECK * 80060100 VISPGCK SR R0,R2 GET AMOUNT NOT MOVED 80060120 AH R0,VICHSCNT COMPUTE MOVE RESIDUE 80060140 STH R0,VICHSCNT STORE CSW COUNT RESIDUE 80060160 VISPGCK1 OI VICHSCST,VICHPGCK TURN ON PGM CHECK IN CSW 80060180 B VISRSTOR STORE CSW OR CAUSE INTERRUPT 80060200 SPACE 2 80060220 * PROTECTION CHECK * 80060240 VISPTCK SR R0,R2 GET AMOUNT NOT MOVED 80060260 AH R0,VICHSCNT COMPUTE MOVE RESIDUE 80060280 STH R0,VICHSCNT STORE CSW COUNT RESIDUE 80060300 VISPTCK1 OI VICHSCST,VICHPTCK RAISE PROTECTION CHECK CONDITION 80060320 VISRSTOR TM VIOFLAG,VIOCCSET CHECK IF THIS IS FIRST CCW OF SIO 80060340 BNO VISRDENT NO, THEN CAUSE INTERRUPT 80060360 MVC VICSW,VICHTCSW YES, THEN PRESENT CSW 80060380 B VICC1 AND CAUSE COND CODE=1 80060400 EJECT 80060420 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80060440 * * END OF OPERATION: CAUSE DEVICE END INTERRUPT * * 80060460 * * * * * * * * * * * * * * * * * * * * * * * * * * * 80060480 VISRDENT OI VICHSUST,VICUSEND SHOW CHANNEL + DEVICE ENDS 80060500 TM VIDVTYP,VIDVMPX IS THIS A MPX CHANNEL? 80060520 BO *+8 YES, NO CONTROL UNIT END 80060540 OI VICHSUST,VICUSUND SHOW UNIT END ALSO 80060560 VISRINT NI VICHSUST,255-VICUSBSY SHOW NO LONGER BUSY IN CSW 80060580 SPACE 2 80060600 * CHANNEL TABLE SHOWS HOW MANY DEVICES WORKING AND * 80060620 * HOW MANY INTERRUPT PENDING STATE FOR THAT CHANNEL. * 80060640 SR R2,R2 CLEAR FOR INSERT 80060660 L R7,=A(VICHTAB) GET CHANNEL TABLE START 80060680 IC R2,VICHTIX GET CHANNEL INDEX 80060700 ALR R7,R2 FIND CHANNEL POINTER 80060720 USING VICHTABD,R7 TEMPORARY USING 80060740 SPACE 2 80060760 * REDUCE NUMBER WORKING BY 1 * 80060780 TM VIDVTST,VIDVWORK IS DEVICE WORKING? 80060800 BNO VISRDE2 NO, DON'T RESET # BUSY DEVICES 80060820 IC R2,VICH#BSY GET PREVIOUS NUMBER NBUSY 80060840 BCT R2,*+10 REDUCE BY 1; IF NO DEVICE WORKING, 80060860 XC VICRSTAT(1),VIDVCMSK SHOW CHANNEL STATUS=FREE 80060880 STC R2,VICH#BSY RESTORE # BUSY DEVICES 80060900 VISRDE2 NI VIDVTST,255-VIDVWORK SHOW NO LONGER WORKING 80060920 OI VIDVTST,VIDVAVL SHOW DEVICE NOW AVAILABLE 80060940 SPACE 2 80060960 * INCREASE NUMBER OF INTERRUPTS PENDING BY 1 * 80060980 TM VIDVTST,VIDVIPND IS AN INT. ALREADY PENDING 80061000 BO VISRDE3 YES, DON'T RESET COUNT 80061020 IC R2,VICH#PND GET # DEVICES NOW PENDING 80061040 LA R2,1(R2) INCREASE FOR THIS DEVICE 80061060 STC R2,VICH#PND RESTORE COUNT 80061080 OI VIDVTST,VIDVIPND SHOW INT PENDING IN DEVICE 80061100 OC VIPEND(1),VIDVCMSK SHOW PENDING INT. FOR INTERP 80061120 VISRDE3 MVI VICHTST,VICHIPND SHOW CHANNEL PENDING ALSO 80061140 TM VIDVTYP,VIDVMPX+VIDVTRM MPX OR TERML AVAILABLE EVEN IF 80061160 BZ *+8 ONE DEVICE INTERRUPT PENDING 80061180 MVI VICHTST,VICHAVL SHOW AVAILABLE CHANNEL 80061200 SPACE 2 80061220 TM VIOFLAG,VIOCCSET HAS COND. CODE BEEN SET? 80061240 BO VICC0 NO, PRESENT CC=0, RETURN 80061260 B VIORTRN RETURN 80061280 DROP R7 80061300 EJECT 80061320 * * * * * * * * * * * * * * * * * * * * * * * * 80061340 * * SET CONDITION CODE FROM SIO, TIO, ETC. * * 80061360 * * * * * * * * * * * * * * * * * * * * * * * * 80061380 SPACE 1 80061400 * CC=0 ==> CHANNEL PROGRAM COMMENCED NORMALLY * 80061420 VICC0 CLI *+1,X'FF' SET CC=0 80061440 BAL RCC,VIORTRN CAPTURE CC AND LOOP 80061460 SPACE 1 80061480 * CC=1 ==> ERROR IN FIRST CCW: CSW STORED * 80061500 VICC1 CLI *,X'FF' SET CC = 1 (-) 80061520 BAL RCC,VIORTRN CAPTURE CC AND RETURN 80061540 SPACE 1 80061560 * CC=2 ==> DEVICE EXISTS BUT NOT AVAILABLE * 80061580 VICC2 CLI *,X'00' SET CC = 2 (+) 80061600 BAL RCC,VIORTRN CAPTURE CC AND RETURN 80061620 SPACE 1 80061640 * CC=3 ==> DEVICE DOES NOT EXIST * 80061660 VICC3 EQU * SET CC = 3 (OVF) 80061680 CLC ECREG0(4),=X'FF00FF00' FOR DEBUGGING SNAP TABLES IF 80061700 BNE VICC3A USER PGM R0 = FF00FF00 80061720 XSNAP T=(NO,,0),LABEL='VIRT I/O CC=3', FOR DEBUGGING #80061740 STORAGE=(VIDVINFO,VIBUFEND) EASY WAY TO SNAP I/O TAB 80061760 VICC3A TM *+1,X'FF' SET CC=3 80061780 BAL RCC,VIORTRN CAPTURE CC AND RETURN 80061800 SPACE 2 80061820 * * * * * * * * * * * * * * 80061840 * * COMMON RETURN POINT * * 80061860 * * * * * * * * * * * * * * 80061880 VIORTRN MVI VIOFLAG,0 TURN OFF ALL TEMPORARY FLAGS 80061900 MVI VIABFLAG,0 SHOW RETURNING TO MAIN INTERPRETER 80061920 L R13,4(R13) RELOAD SAVE AREA POINTER 80061940 LM R14,R0,12(R13) RELOAD REGUSTERS 80061960 L R12,68(R13) RELOAD 2ND BASE 80061980 SR R2,R2 RESTORE BYTE REGISTER 80062000 BR RLINK RETURN 80062020 EJECT 80062040 * INTERNAL CONSTANTS * 80062060 VIOJMPTB $AL2 EIHIO,(EISIO,EITIO,EIHIO,EITCH),-2*X'9C' 80062080 DS 0H MUST KEEP FLAGS ON HALFWORD BDY 80062100 VIOFLAG DS X INTERNAL FLAGS 80062120 VICCW1 EQUB 0 (VIOFLAG)==> 1ST CCW IN PROCESS 80062140 VIOFTIC EQUB 1 TIC EXECUTED THIS LAST TIME 80062160 VIOFIMM EQUB 2 (VIOFLAG)==> IMMEDIATE OPERATION 80062180 VIOCCSET EQUB 3 (VIOFLAG)==> CC HAS NOT BEEN SET 80062200 VISOPS DS X OPERS FOR CCW OPCODE LOOKUP 80062220 VISOPTIM DS H TIME FOR OPERATION 80062240 VIODLAYT DC F'0' TIME DELAY FOR RECORD POS., ETC. 80062260 TITLE '*** VIRTUAL I/O INTERNAL SUBS' 80062280 **--> INSUB: VIUSRMOV * * * * * * * * * * * * * * * * * * * * * * * * * 80070000 * PERFORM MOVEMENT IN USER AREA, WITH PROTECTION CHECK * 80070020 * * 80070040 * INPUT PARAMETERS: * 80070060 * R3 = ADDRESS TO WHICH TO MOVE * 80070080 * R4 = ADDRESS FROM WHICH TO MOVE * 80070100 * R5 = COUNT OF MOVEMENT * 80070120 * VIWORKB2 CONTAINS PROTECTION KEY OF USER AREA FOR CHECK * 80070140 * VIWORKB1 CONTAINS STORE/FETCH FLAG, AS NEEDED BY EIVISFCK * 80070160 * ALSO CONTAINS SKIP FLAG IF CHECK FOR ACCESSABILITY ONLY-- * 80070180 * NO DATA MOVEMENT TO OCCUR (USED FOR SEARCHES) * 80070200 * * 80070220 * RETURNS: * 80070240 * R3,R4 UPDATED, R5 DECREMENTED BY NUMBER OF BYTES MOVED * 80070260 * CC=0 IF PROPER AMOUNT SUCCESSFULLY MOVED (OR LEN=0 ON INPUT) * 80070280 * CC=+ IF PROTECTION VIOLATION OCCURRED * 80070300 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80070320 * R1 AND R2 USED, BUT SAVED AND RESTORED * 80070340 * R0=AMOUNT NOT MOVED (OR 0 IF SUCCESSFUL) * 80070360 * * 80070380 * USES INSUB: VIUMSUB * 80070400 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80070420 SPACE 1 80070440 VIUSRMOV STM R1,R2,VIUMSA2 STORE REGISTERS TO BE CHANGED 80070460 LTR R5,R5 CHECK IF ANYTHING TO MOVE 80070480 BZ VIUMDON IF ZERO, THEN NO ACTION 80070500 SPACE 1 80070520 VIUML1 LR R2,R3 GUESS BEGINNING ADDRESS FOR TO-USER 80070540 TM VIWORKB1,EI1STORE IS IT A TO-USER MOVE? 80070560 BO *+6 GUESS WAS RIGHT, CONTINUE 80070580 LR R2,R4 BEGINNING ADDRESS FOR FROM-USER 80070600 SLR R2,RMEM DERELOCATE ADDRESS TO BE CHECKED 80070620 LA R2,0(R2) GUARANTEE TOP BYTE=0 80070640 ST R5,VIUMSA1 SAVE COUNT VALUE FOR LATER 80070660 LR R0,R2 COPY BEGINNING ADDRESS 80070680 LA R1,0(R2,R5) END @+1 = BEGIN @ + LENGTH 80070700 BCTR R1,0 GET TRUE LAST BYTE OF MOVE 80070720 O R2,=F'2047' ADDR. OF LAST BYTE OF THIS 2K BLOCK 80070740 CR R1,R2 CHECK IF MOVE ALL WITHIN ONE BLOCK 80070760 BNH VIUMBAL YES, THIS IS SIMPLE MOVE 80070780 LR R1,R2 NO, MOVE MERELY TO TOP OF 2K BLOCK 80070800 SR R2,R0 RESET LENGTH TO MOVE (-1) 80070820 LA R2,1(R2) GET TRUE LENGTH TO MOVE 80070840 ST R2,VIUMSA1 SAVE LENGTH TRULY TO MOVE 80070860 SPACE 1 80070880 VIUMBAL C R1,ECFADH CHECK IF ADDRESS WITHIN BOUNDS 80070900 BH VIUMADER NO, SHOW ADDRESS ERROR (PGM CK) 80070920 L R15,=V(VIEIKTST) CALL INNER SUB TO CHECK PROTECTION 80070940 BALR R2,R15 CALL SUB. 80070960 B VIUMPRER RETURNS 0(R2) IF PROT. ERROR FOUND 80070980 * (SINCE MOVE TOTALLY WITHIN 1 2K BLOCK, ON FINDING AN * 80071000 * ERROR, WE STOP; NO MOVEMENT TO BE DONE IN THAT BLOCK) * 80071020 SPACE 1 80071040 L R0,VIUMSA1 NORMAL CASE: GOOD MOVE; GET LENGTH 80071060 TM VIWORKB1,VICHKSKP SHOULD WE CHECK ONLY? 80071080 BO *+8 YES, SKIP MOVING-PRETEND IT WENT 80071100 BAL R2,VIUMSUB DO MOVE 80071120 S R5,VIUMSA1 SUBTRACT LENGTH MOVED THIS PASS 80071140 BNZ VIUML1 STILL MORE TO MOVE 80071160 SPACE 1 80071180 VIUMDON LA R15,8 SHOW SUCCESSFUL COMPLETION 80071200 SR R0,R0 SHOW 0 BYTES LEFT TO MOVE 80071220 B VIUMRET RELOAD REGS AND RETURN 80071240 SPACE 1 80071260 VIUMPRER LA R15,4 SHOW PROTECTION EXCEPTION 80071280 B *+6 SKIP ADDRESS ERROR FLAG 80071300 VIUMADER SR R15,R15 SHOW ADDRESS EXCEPTION 80071320 LTR R0,R5 SHOW # OF BYTES NOT MOVED 80071340 VIUMRET LM R1,R2,VIUMSA2 RELOAD @ REGISTERS 80071360 BR RLINK RETURN 80071380 VIUMSA3 DS 3F STORAGE FOR R3,R4,R5 80071400 VIUMSA2 DS 2F STORAGE FOR R1,R2 INITIALLY 80071420 VIUMSA1 DS F STORAGE FOR COUNT BETWEEN CALLS 80071440 SPACE 3 80071460 **--> INSUB: VIUMSUB PERFORM MOVEMENT FOR INSUB VIUSRMOV * * * * * ** 80071480 * ENTRY CONDITIONS: * 80071500 * R3 = ADDRESS TO WHICH TO MOVE * 80071520 * R4 = ADDRESS FROM WHICH TO MOVE * 80071540 * R0 = COUNT OF MOVEMENT * 80071560 * R1 IS A FREE REGISTER; MAY BE DESTROYED * 80071580 * * 80071600 * EXIT CONDITIONS: * 80071620 * R3, R4 INCREMENTED BY AMOUNT MOVED * 80071640 * * 80071660 * PROTECTION AND ADDRESSING HAVE ALREADY BEEN CHECKED; * 80071680 * MOVE IS LEGAL BY THE TIME THIS ROUTINE REACHED * 80071700 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80071720 SPACE 1 80071740 VIUMSUB LTR R0,R0 IS THERE ANYTHING TO MOVE? 80071760 BCR Z,R2 RETURN IF NOT 80071780 LA R1,256 USEFUL CONSTANT 80071800 VIUMSMV CR R0,R1 CHECK IF MOVE LENGTH < 256 80071820 BL VIUMSHRT YES, MAKE SHORT MOVE 80071840 SPACE 1 80071860 MVC 0(256,R3),0(R4) MAKE NORMAL 256 BYTE MOVE 80071880 AR R4,R1 INCREASE FROM @ 80071900 AR R3,R1 INCREASE TO @ 80071920 SR R0,R1 DECREASE REMAINING LENGTH 80071940 BNZ VIUMSMV LOOP TO MOVE MORE 80071960 BR R2 IF FALL OUT, ALL MOVED; RETURN 80071980 SPACE 1 80072000 VIUMSHRT BCTR R0,R0 DECREASE LENGTH FOR SS-INSTR. 80072020 STC R0,*+5 STORE LENGTH OF MOVE 80072040 MVC 0($,R3),0(R4) **CHANGED** MOVE < 256 BYTES 80072060 AR R4,R0 INCREASE FROM @ 80072080 AR R3,R0 INCREASE TO @ 80072100 SR R0,R0 SHOW 0 BYTES REMAIN 80072120 BR R2 RETURN 80072140 TITLE 'TRACE CCW''S - INTERNAL SUBROUTINE' 80072160 **--> INSUB: VIOTRC PRINT CCW TRACE * * * * * * * * * * * * * * * * 80072180 * CHECK IF TRACING ON, TIME STAMP CCW, AND PRINT IT IN HEX * 80072200 * ENTRY: R7=ADDRESS OF CCW TO TRACE * 80072220 * ** R0 DESTROYED ** * 80072240 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80072260 VIOTRC TM ECPRFLG1,ECPRTRCE IS PROGRAM TRACING IN EFFECT? 80072280 BCR NO,R10 NO, RETURN IMMEDIATELY 80072300 LR R0,R7 GET @ OF INSTR. TO TRACE 80072320 SLR R0,RMEM DE-RELOCATE CCW ADDR 80072340 XHEXO R0,VIOTRH1 DISPLAY ADDRESS OF CCW 80072360 MVI VIOTRH1,C':' REUSE 1ST 2 BYTES (ADDRESS IS 6 80072380 MVI VIOTRH1+1,C' ' BYTES LONG) 80072400 L R0,VICLOCK GET CURRENT SYSTEM TIME 80072420 XHEXO R0,VIOTRH0 DISPLAY CURRENT TIME 80072440 L R0,VICHCCW GET FIRST WORD OF CCW 80072460 XHEXO R0,VIOTRH2 DISPLAY THAT WORD 80072480 MVC VIOTRH2-1(2),VIOTRH2 SEPARATE OPCODE PORTION 80072500 MVI VIOTRH2+1,C' ' BLANK OUT UNUSED BYTE 80072520 L R0,VICHCCW+4 GET 2ND WORD OF CCW 80072540 XHEXO R0,VIOTRH3 CONVERT TO PRINTABLE HEX 80072560 MVC VIOTRH3-1(4),VIOTRH3 SEPARATE FLAG FIELDS 80072580 MVI VIOTRH3+3,C' ' INSERT BLANK FILL 80072600 $PRNT VIOTRH,VIOTRH$L,VIOTRHEX 80072620 BR R10 80072640 SPACE 2 80072660 * COME HERE IF RECORDS EXCEEDED ON $PRNT DURING TRACE * 80072680 * RETURN TO RECORDS OVERRUN POINT IN MAIN INTERPRETER * 80072700 VIOTRHEX L R15,=V(EIXRECEX) GET POINTER TO RECORDS EXCEEDED 80072720 L R13,4(R13) RELOAD SAVE AREA POINTER 80072740 L R12,68(13) RELOAD BASE FOR EICNTEXC 80072760 BR R15 BRANCH TO THAT POINT 80072780 SPACE 80072800 VIOTRH DC C' TRACE--> TIME: ' HEADER LINE 80072820 VIOTRH0 DS CL8 80072840 DC C'; CCW ADDR' 80072860 VIOTRH1 DS 8C 80072880 DC C'; CCW: ' 80072900 VIOTRH2 DC 10C' ' 80072920 VIOTRH3 DS 8C' ' 80072940 VIOTRH$L EQU *-VIOTRH 80072960 DC C' 1 ' USED FOR XDECI IN TERM MODE 80072980 TITLE 'EVENT HANDLER SUBROUTINE' 80073000 **--> INSUB: VINQEVNT ENQUE EVENT * * * * * * * * * * * * * * * * * 80073020 * ENQUE EVENT IN EVENT TABLE * 80073040 * ENTRY: R1=TIME OF EVENT (REL. TO NOW) * 80073060 * EXIT: R2 POINTS TO EVENT WITH TIME IN IT * 80073080 * **R10 DESTROYED** * 80073100 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80073120 VINQEVNT LA R2,VIEVENT GET START OF EVENT LIST 80073140 SPACE 1 80073160 VINQEV2 L R10,0(R2) GET FIRST EVENT TIME 80073180 LTR R10,R10 CHECK IF NEGATIVE 80073200 BM VINQEV4 NEGATIVE ==> QUEUE EMPTY 80073220 CR R10,R1 CHECK IF NEW EVENT PRECEDES OLD 80073240 BH VINQEV3 IF YES, THEN INSERT NOW 80073260 SR R1,R10 ELSE SUBTRACT TIME TO NEXT 80073280 LA R2,8(R2) GET NEXT EVENT 80073300 B VINQEV2 RETURN TO CHECK NEXT EVENT 80073320 SPACE 1 80073340 VINQEV3 LA R10,VIEVENT+(VIEVNUM-2)*8 GET ADDRESS OF LAST EVENT 80073360 CR R2,R10 CHECK IF BEYOND TABLE 80073380 BH VINQEV4 GUARANTEED LAST ==> NO MOVE NEEDED 80073400 MVC 8(8,R10),0(R10) ELSE MUST MOVE AN EVENT UP 80073420 SH R10,=H'8' COME DOWN ONE POSITION 80073440 B VINQEV3+4 COMPARE NEXT ENTRY 80073460 SPACE 1 80073480 VINQEV4 ST R1,0(R2) STORE TIME OF EVENT 80073500 BR RLINK RETURN 80073520 SPACE 2 80073540 EJECT 80073560 **--> INSUB: VIODV# GET LOCATION IN VIDVTAB FOR DEVICE ADDRESS * * ** 80073580 * ENTRY: RAD1 CONTAINS 2 BYTE CHANNEL#, DEVICE# PAIR * 80073600 * EXIT: R9 = @ IN VIDVTAB OF THAT DEVICE, OR BRANCH TO * 80073620 * VICC3 (SET CC=3 AND RETURN TO EIFIN) IF NOT FOUND * 80073640 * R10 **DESTROYED** * 80073660 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80073680 SPACE 1 80073700 VIODV# L R10,=A(VIDVTAB) START OF DEVICE TABLE 80073720 SPACE 1 80073740 VIODV#1 L R8,0(R10) GET POINTER TO NEXT ENTRY IN TABLE 80073760 CH RAD1,(VIDVTDV@-VIDVTABD)(R8) CHECK DEVICE, CHANNEL # 80073780 BCR E,RLINK IF EQUAL, RETURN 80073800 LTR R8,R8 HAVE LOOKED AT LAST SLOT? 80073820 BM VICC3 YES, SET CC=3 TO REPORT ILLEGAL @ 80073840 LA R10,4(R10) ELSE GO TO NEXT ADDRESS POINTER 80073860 B VIODV#1 80073880 AIF (&$VI#DA EQ 0).VINSIO6 80073900 TITLE 'DIRECT ACCESS ROTATIONAL POSITIONING' 80073920 **--> INSUBS: VIROTXXX: ROTATE PAST COUNT, KEY, OR DATA PART * * * * * 80073940 * USED DURING ROTATIONAL POSITIONING IN PASS 1 PROCESSING * 80073960 * ENTRY: R2=X'000000??' (I.E. USABLE FOR BYTE FLAGS) * 80073980 * R1=POSITION POINTER * 80074000 * R0=NUMBER OF BYTES SKIPPED FOR POSITIONING * 80074020 * RLINK=RETURN ADDRESS * 80074040 * EXIT: R2=AS ABOVE (BYTE FLAG) * 80074060 * R1=UPDATED POSITION POINTER * 80074080 * R0=UPDATED BYTE SKIP COUNT * 80074100 * VIBFCKDX HAS PROPER SETTING SHOWING COUNT, KEY, OR * 80074120 * DATA FIELD PASSED (VIBFC, VIBFK, VIBFD) * 80074140 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80074160 * INSUB: VIROTKEY ROTATE PAST NEXT KEY FIELD * * * * * * * * * * * * 80074180 VIROTKEY IC R2,VIBFKL GET KEY LENGTH OF CURRENT RECORD 80074200 NI VIBFCKDX,255-VIBFD KEEP ONLY FLAGS 80074220 OI VIBFCKDX,VIBFK SHOW HAVE PASSED A KEY FIELD 80074240 LTR R2,R2 CHECK IF A KEY FIELD EXISTS 80074260 BCR Z,RLINK NO, THEN RETURN 80074280 AR R1,R2 YES, ADD IN KEY FIELD 80074300 LA R2,6(R2) INCREASE FOR G2 GAP AFTER KEY 80074320 AR R0,R2 INCR. DELAY FOR KEY FIELD BYTES 80074340 BR RLINK RETURN TO POINT OF CALL 80074360 SPACE 3 80074380 * INSUB: VIROTCNT ROTATE PAST NEXT COUNT FIELD * * * * * * * * * * * 80074400 VIROTCNT LA R1,8(R1) ADD 8 FOR COUNT FIELD 80074420 NI VIBFCKDX,255-X'1C' TURN OFF ALL POSITION BITS 80074440 OI VIBFCKDX,VIBFC SHOW HAVE PASSED A COUNT FIELD LAST 80074460 AH R0,=H'14' ADD DELAY FOR CT. FLD + G2 GAP 80074480 BR RLINK RETURN 80074500 SPACE 3 80074520 * INSUB: VIROTDTA ROTATE PAST NEXT DATA FIELD * * * * * * * * * * * 80074540 VIROTDTA LH R7,VIBFDL GET DATA LENGTH 80074560 LTR R7,R7 CHECK IF ZERO DATA LENGTH 80074580 BE *+8 YES,SKIP G3 GAP 80074600 LA R7,8(R7) INCREASE FOR DATA LEN + G3 GAP 80074620 LA R1,6(R1,R7) UPDATE POINTER FOR G2 & G3 GAPS 80074640 CLI VIBFKL,0 CHECK IF KEY FIELD OMITTED 80074660 BZ *+8 YES, THEN DON'T ADD ANOTHER G2 GAP 80074680 LA R1,6(R1) INCREASE FOR G2 GAP AFTER KEY 80074700 OI VIBFCKDX,VIBFD SHOW HAVE JUST PASSED DATA AREA 80074720 STH R1,VIBFRPT SHOW CURRENT REC. START PTR. 80074740 AR R0,R7 ADD DELAY BYTES FOR DATA AREA 80074760 LA R7,0(R1,R9) GET REAL @ OF NEXT COUNT FIELD 80074780 MVC VIBFKDL,5(R7) MOVE IN COUNT INFORMATION 80074800 CH R1,VIBFG4@ DOES THAT PLACE ONE AT A G4 GAP? 80074820 BCR L,RLINK NO, THEN MRERLY CLEAN UP AND RTN 80074840 STH R1,VIBFG4@ SHOW NEW G4 LOCATION REACHED 80074860 TM VIBFLGS,VIBFTOG4 STAY AT G4 IF HIT IT? 80074880 BCR O,RLINK IF YES, THEN DONE; RETURN 80074900 OI VIBFLGS,VIBFIXPT SHOW HAVE PASSED INDEX 80074920 LH R7,VIDVBFLN GET LENGTH OF BUFFER 80074940 SH R7,VIDVBFPT GET AMT OF SPACE REM. IN BUFFER 80074960 AR R0,R7 ADD ON # OF BYTES TO END OF TRK. 80074980 LA R1,VIBFR0 USEFUL CONSTANT 80075000 AR R0,R1 ADD ON # OF BYTES TO REACH H.A. 80075020 STH R1,VIBFRPT STORE POINTER TO BUFFER = 8 80075040 MVC VIBFKDL,VIBFR0+5(R9) MOVE IN COUNT OF R0 80075060 BR RLINK 80075080 EJECT 80075100 **--> INSUB: VISDAWRT/VISDARD DIRECT ACCESS READ/WRITE UTILITY * ** 80075120 * ENTRY CONDITIONS: * 80075140 * VIDVCRCY/VIDVCRHD MUST BE SET TO CYL/HEAD TO WRITE, * 80075160 * VIWORKF2 MUST BE SET TO CYL/HEAD TO READ * 80075180 * R10 = LINK REGISTER * 80075200 * R0 SET TO NUMBER OF DELAY BYTES ON EXIT * 80075220 * R1, RLINK DESTROYED * 80075240 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * 80075260 SPACE 3 80075280 * PERFORM DIRECT ACCESS WRITE/READ COMBINATION * 80075300 VISDAWRT TM VIDVTST,VIDVOPEN IS DEVICE ALREADY OPEN? 80075320 BNO VISDARD NO, THEN NO NEED TO COPY BUFFER 80075340 SPACE 1 80075360 MVI VISDARD2+1,X'00' SET BRANCH FOR READ & WRITE BOTH 80075380 ST R9,VISDABLK+2 STORE BUFFER ADDRESS 80075400 MVI VISDABLK+2,12 SHOW THIS IS A WRITE 80075420 VISDARD1 LH R1,VIDVMXHD GET MAX HEAD # 80075440 LA R1,1(1) INCREASE FOR REL. TO 0 80075460 MH R1,VIDVCRCY MULTIPLY BY CURRENT CYL # 80075480 AH R1,VIDVCRHD COMPUTE REL. POS. FOR THIS TRACK 80075500 STH R1,VISDABLK STORE IN CONTROL BLOCK 80075520 LA R1,VIDVDDNM GET PTR. TO DDNAME 80075540 ST R1,VISDABLK+6 STORE IN CONTROL BLOCK 80075560 L R15,VISDABLK+10 GET ENTRY ADDR. OF DA UPDT. RTN. 80075580 MVI VIABFLAG,VIABBDAM SHOW IN BDAM INTERFACE ROUTINE 80075600 CNOP 0,4 ALIGN SO BLOCK WILL START ON HALFWD 80075620 BALR RLINK,R15 CALL DIRECT ACCESS READ/WRITE RTN. 80075640 VISDABLK DS H,AL1,AL3,A REL REC #,TYPE I/O,DDNAM PTR,BUFF @ 80075660 DC V(VIDAIO) ADDRESS OF DIRECT ACCESS I/O RTN. 80075680 BO VIDVATN IF I/O DIDN'T GO, PRESENT ATTN. 80075700 SPACE 1 80075720 VISDARD2 BC $,VISDARD3 **CHANGED** SKIP OR REPEAT TO READ TRACK 80075740 VISDARD MVI VISDARD2+1,X'F0' SET SO WILL BRANCH OUT NEXT TIME 80075760 MVC VIDVCRCY(4),VIWORKF2 GET @ OF NEW TRACK TO READ 80075780 ST R9,VISDABLK+2 STORE BUFFER ADDRESS 80075800 MVI VISDABLK+2,8 SHOW THIS TIME IS A READ 80075820 B VISDARD1 BRANCH AND PERFORM I/O 80075840 SPACE 2 80075860 * DONE WITH READ * 80075880 VISDARD3 MVI VIBFLGS,VIBFPTX SHOW BUFFER POINTER MEANINGLESS 80075900 MVI VIABFLAG,VIABPAS1 SHOW BACK INTO PASS 1 OF I/O SIMUL. 80075920 L R0,VICLOCK GET CURRENT TIME 80075940 BAL RLINK,VIUPDBPT UPDATE POINTER ON BUFFER 80075960 BR R10 GO ENQUE EVENT AT THAT TIME 80075980 TITLE 'VIUPDBPT - UPDATE BUFFER POINTER SUBROUTINE' 80076000 * INSUB: VIUPDBPT UPDATE BUFFER POINTER * * * * * * * * * * * * * * 80076020 * ENTRY CONDITIONS: * 80076040 * R0 = SIMULATED TIME OF POINTER UPDATE * 80076060 * R9 = @ OF BUFFER - CONTENTS OF VIDVBFAD * 80076080 * VIBFCKDX BITS SET PROPERLY TO SHOW IF COUNT (VIBFC), * 80076100 * KEY (VIBFK), OR DATA (VIBFD) AREA LAST PASSED OVER * 80076120 * VIBFLGS = VIBFPTX (B'10000000') TO SHOW CURRENT POINTER NOT * 80076140 * MEANINGFUL; START AT HOME ADDRESS * 80076160 * =VIBFTOHA (B'01000000') FORCE TO END AT HOME ADDRESS * 80076180 * =VIBFTOG4 (B'00100000') FORCE TO STAY AT G4 GAP POSN.* 80076200 * IF REACH ONE * 80076220 * * 80076240 * EXIT CONDITIONS: * 80076260 * R0 = # OF BYTES TO PASS TO GET TO FIRST FIELD BEYOND THE * 80076280 * RECORDS UNDER HEAD AT TIME IN R0 ON ENTRY * 80076300 * VIBFCKDX SHOWS IF HAVE PASSED COUNT, KEY, OR DATA LAST * 80076320 * VIBFLGS =VIBFIXPT (B'00010000') IF HAVE PASSED INDEX POINT * 80076340 * * 80076360 * INTERNAL USAGE: * 80076380 * R1 = ADDRESS OF NEXT FIELD * 80076400 * R3 = GENERAL WORK REGISTER * 80076420 * R2 = BYTE REGISTER--TOP 3 BYTES 0'S * 80076440 * * 80076460 VIUPDBPT STM R1,R3,VIUMSA3 SAVE REGISTERS 80076480 BALR R15,0 SET UP TEMPORARY ADDRESSABILITY 80076500 USING *,15 FOR THIS ROUTINE ONLY 80076520 LH R2,VIDVBFPT GET BUFFER POINTER 80076540 LR R1,R0 SAVE TIME IN R0 80076560 S R1,VIDVLTIM MINUS LAST TIME KNEW DEVICE POSN. 80076580 BP VIUPDDV1 GO DO DIVISION IF POSITIVE 80076600 BM VIUPDRT0 SHOULD NEVER BE NEG., BUT RET. 0 IF 80076620 LR R0,R2 MOVE OVER BUFFER POINTER TO REPOS. 80076640 TM VIBFLGS,VIBFPTX+VIBFTOHA FORCE HOME@ OR PTR INVALID? 80076660 BNZ VIUPDSCN YES, THEN UPDATE POINTER 80076680 CH R0,VIBFG4@ AT G4 POSITION? 80076700 BE VIUPDSCN YES, THEN SET PTR TO R0 OR G4 80076720 B VIUPDRT0 NO, THEN RETURN ZERO BYTES MOVEMENT 80076740 SPACE 2 80076760 * HERE R1=AMOUNT OF TIME PASSED SINCE LAST KNEW POSITION * 80076780 VIUPDDV1 ST R0,VIDVLTIM SHOW NOW KNOW WHERE WE ARE 80076800 SR R0,R0 CLEAR FOR DIVIDE 80076820 LH R3,VIDVTTIM GET TIME TO PASS OVER 1 BYTE 80076840 SRA R3,6 DIVIDE SINCE VIDVTTIM = TIME*64 80076860 DR R0,R3 NOW HAVE # OF BYTES PASSED OVER 80076880 AR R1,R2 ADD PREVIOUS POINTER ==> NEW PTR. 80076900 LH R3,VIDVBFLN GET LENGTH OF TRACK 80076920 LR R0,R1 MOVE FOR LATER USE 80076940 CR R0,R3 IS PTR STILL ON 1ST REVOLUTION? 80076960 BNH VIUPDSCN YES, CAN SKIP DIVIDE 80076980 SR R0,R0 CLEAR R0 FOR DIVIDE 80077000 DR R0,R3 DIVIDE TO GET REMAINDER ON TRK 80077020 EJECT 80077040 * NOW R0 = POINTER ON TRACK TO WHERE HEAD IS. * 80077060 * FIGURE WHERE IS NEAREST GAP FOLLOWING. * 80077080 VIUPDSCN CH R0,VIUPDHR0 IS R0 IN THE G1 AREA? 80077100 BNH VIUPDHA2 YES, POSITION TO HOME ADDRESS 80077120 LH R1,VIBFG4@ GET POINTER TO THE G4 = END LAST REC 80077140 CR R0,R1 IS THE PTR IN THE G4 AREA? 80077160 BH VIUPDHA1 YES, THEN FORCE TO HOME ADDRESS 80077180 BL VIUPDSC2 NO, THE GO LOCATE NEAREST RECORD 80077200 TM VIBFLGS,VIBFTOG4 AT G4 POINT; DO WE REMAIN THERE? 80077220 BO VIUPDFN2 YES, FOUND NEW POINTER; HALT 80077240 B VIUPDHA1 ELSE GO TO HOME ADDRESS POINT 80077260 SPACE 1 80077280 VIUPDSC2 TM VIBFLGS,VIBFPTX IS POINTER MEANINGLESS? 80077300 BO VIUPDHA 80077320 TM VIBFLGS,VIBFTOHA SHOULD FORCE TO HOME ADDRESS POINT? 80077340 BO VIUPDHA1 YES, GO DO SO 80077360 OI VIBFLGS,VIBFD SHOW STARTING WITH A COUNT AREA 80077380 CH R0,VIBFRPT IS HEAD PAST THE LAST KNOWN POINT? 80077400 BL VIUPDHA IF LOW, THEN START AT HOME ADDRESS 80077420 BE VIUPDRT0 IF EQUAL, NO MOVE NEEDED; RETURN 80077440 LH R1,VIBFRPT IF HIGH, START AT PREVIOUS POINTER 80077460 B *+8 SKIP RESETS 80077480 VIUPDHA LA R1,VIBFR0 START AT R0 LOCATION 80077500 SPACE 1 80077520 STH R1,VIBFRPT SHOW AS CURRENT RECORD POINTER 80077540 LA R2,0(R1,R9) RELOCATE CURRENT POINTER 80077560 MVC VIBFKDL,5(R2) GET COUNT INFO OF CURRENT RECORD 80077580 SR R2,R2 CLEAR BYTE REGISTER 80077600 EJECT 80077620 * START WITH A NEW COUNT FIELD * 80077640 VIUPDCNT NI VIBFCKDX,X'F3' SHOW HAVE LAST PASSED COUNT 80077660 LA R1,8(R1) ADD LENGTH OF COUNT 80077680 CR R0,R1 CHECK IF HAVE GONE FAR ENOUGH 80077700 BNH VIUPDFND 80077720 SPACE 1 80077740 VIUPDKEY IC R2,VIBFKL GET KEY LENGTH OF CURRENT RECORD 80077760 OI VIBFCKDX,VIBFK SHOW LAST PASSED KEY 80077780 AR R1,R2 ADD KEY LENGTH (MAY BE 0) 80077800 CR R0,R1 CHECK IF THAT IS FAR ENOUGH 80077820 BNH VIUPDFND YES, FOUND POINT 80077840 SPACE 1 80077860 VIUPDDTA LH R3,VIBFDL GET DATA LENGTH 80077880 LTR R3,R3 CHECK IF DATA LEN=0 (HOME @) 80077900 BZ *+8 YES, SKIP GAP 80077920 LA R3,8(R3) ELSE ADD 8 FOR G3 GAP 80077940 LA R1,6(R1,R3) PTR = PTR+G2 GAP + DATA LEN + G3 80077960 OI VIBFCKDX,VIBFD SHOW LAST PASSED A DATA FIELD 80077980 LTR R2,R2 IS KEY LEN. 0 OF THIS RECORD? 80078000 BZ *+8 YES, THEN NO 2ND G2 GAP 80078020 LA R1,6(R1) ELSE ADD ANOTHER G2 GAP 80078040 STH R1,VIBFRPT PREPARE FOR NEW RECORD 80078060 LA R3,0(R1,R9) RELOCATE BUFFER POINTER 80078080 MVC VIBFKDL,5(R3) GET NEW KEY LEN, DATA LEN. 80078100 CR R0,R1 IS THIS FAR ENOUGH 80078120 BH VIUPDCNT NO, LOOP TO NEXT FIELD 80078140 SPACE 2 80078160 CH R1,VIBFG4@ IS THE NEW POSITION THE G4 GAP? 80078180 BNE VIUPDFN2 NO, THEN PROCEED NORMALLY 80078200 TM VIBFLGS,VIBFTOG4 IS POINTER TO REMAIN AT G4 GAP? 80078220 BO VIUPDFN2 YES, THEN POSITION FOUND 80078240 B VIUPDHA0 NO, THEN FORCE TO HOME ADDRESS 80078260 SPACE 2 80078280 VIUPDFND LR R3,R1 SAVE END POINTER 80078300 SR R3,R0 GET DISTANCE FROM END POINTER 80078320 LR R0,R3 THAT IS # OF BYTES TO SKIP 80078340 STH R1,VIDVBFPT STORE AS BUFFER POINTER 80078360 B VIUPDRTN RETURN 80078380 SPACE 2 80078400 VIUPDFN2 STH R1,VIDVBFPT STORE BUFFER POINTER 80078420 SR R1,R0 THIS GIVES # OF BYTES TO SKIP 80078440 LR R0,R1 PUT IN RIGHT REGISTER 80078460 B VIUPDRTN RETURN 80078480 SPACE 2 80078500 VIUPDHA0 LH R0,VIDVBFPT SAVE OLD POINTER FOR COMPUTATION 80078520 VIUPDHA1 LA R1,VIBFR0 SHOW NEW POINTER IS AT R0 80078540 STH R1,VIDVBFPT STORE THAT AS POINTER 80078560 AH R1,VIDVBFLN INCREASE FOR EASY SUBTRACT OF PTR 1 80078580 B VIUPDHA3 SKIP OTHER DORM 80078600 VIUPDHA2 LA R1,VIBFR0 SHOW THAT IS CURRENT BUFFER PTR 80078620 STH R1,VIDVBFPT STORE POINTER 80078640 VIUPDHA3 SR R1,R0 FIGURE # BYTES TO SKIP 80078660 LR R0,R1 PUT IN RIGHT REGISTER 80078680 OI VIBFCKDX,VIBFD HOME ADDRESS IS A COUNT FIELD 80078700 MVC VIBFRPT,VIUPDHR0 SHOW CURRENT REC. STARTS AT R0 POS. 80078720 MVC VIBFKDL,VIBFR0+5(R9) MOVE IN NEW KEY, DATA LEN PTRS. 80078740 B VIUPDRTN RETURN 80078760 VIUPDRT0 SR R0,R0 SHOW 0 MORE BYTES TO PASS 80078780 VIUPDRTN LM R1,R3,VIUMSA3 RELOAD REGISTER AS ON ENTRY 80078800 OI VIBFCKDX,X'10' GUARANTEE COUNT FIELD BIT IS ON 80078820 NI VIBFCKDX,X'3F' TURN OFF FIRST TWO FLAGS 80078840 DROP R15 80078860 BR RLINK RETURN 80078880 VIUPDHR0 DC 0H'0',AL2(VIBFR0) FOR RECORD POINTER 80078900 EJECT 80078920 **--> INSUB: VISDAOPN OPEN DIRECT ACCESS DEVICE * * * * * * * * * * * 80078940 * OPEN DEVICE AND READ ONE TRACK OF DEVICE * 80078960 * ENTRY: R9 POINTS TO BUFFER OF DEVICE TO BE OPENED * 80078980 * R8 POINTS TO DEVICE TABLE ENTRY FOR DEVICE TO BE OPENED * 80079000 * EXIT: R8,R9 UNCHANGED * 80079020 * R15, R0 DESTROYED * 80079040 * COND. CODE=0 IF OPEN SUCCEEDS, =3 OTHERWISE * 80079060 * CALLS VIDAIO - BDAM INTERFACE * 80079080 * VIUPDBPT - BUFFER POINTER UPDATE ROUTINE * 80079100 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80079120 VISDAOPN TM VIDVTST,VIDVOPEN IS DEVICE ALREADY OPEN? 80079140 BNO *+8 NO, GO PROCESS OPEN 80079160 SR R0,R0 CLEAR R0, SET COND CODE = 0 80079180 BR RLINK RETURN 80079200 SPACE 1 80079220 ST RLINK,VISDARLN SAVE REG THAT WILL BE CHANGED 80079240 MVC VIDABF(8),=AL2(VIBFR0,0,256*(VIBFPTX+VIBFD),4) X80079260 G4@=R0@, REC PTR=0, PTR INVALID, CKD LAST, KL=0, DL=0 80079280 XC 8(32,R9),8(R9) ZERO 32 BYTES AFTER INITIAL POINTERS 80079300 XC VIWORKF2,VIWORKF2 GO FOR CYL 0 TRACK 0 80079320 LA R1,VIDVDDNM POINTER TO DDNAME OF DEVICE 80079340 ST R1,VISDAOPB+6 PUT DDNAME @ IN CONTROL BLOCK 80079360 ST R9,VISDAOPB+2 PUT BUFFER @ IN CONTROL BLOCK 80079380 MVI VISDAOPB+2,8 SHOW READ ONLY 80079400 L R15,VISDAOPB+10 GET @ OF BDAM ROUTINE 80079420 MVI VIABFLAG,VIABBDAM SHOW BDAM IN CONTROL IF ABEND 80079440 CNOP 0,4 ALIGN FOR CONTROL BLOCK 80079460 BALR RLINK,R15 CALL INTERFACE TO BDAM 80079480 VISDAOPB DC H'0',AL1(8),AL3(*-*),A(*-*),V(VIDAIO) REL BLK#=0, X80079500 READ, PTR TO DDNAME, PTR TO BUFFER, ROUTINE CALL @ 80079520 MVI VIABFLAG,VIABPAS1 BACK IN PASS 1 80079540 BO VISDAOPR IF OPEN FAILS, RETURN WITH CC=3 80079560 MVC VIDVLTIM,VICLOCK CALIBRATE AT TIME NOW 80079580 MVC VIBFRPT,=AL2(VIBFINPT) SHOW AT INITIAL LOC IN BUFFER 80079600 XC VIDVCRCY,VIDVCRCY SHOW HAVE CYL 0 TRACK 0 80079620 L R0,VICLOCK GET CURRENT TIME 80079640 BAL RLINK,VIUPDBPT UPDATE BUFFER POINTER 80079660 SR R1,R1 SET CC=0 80079680 VISDAOPR L RLINK,VISDARLN GET BACK RLINK VALUE 80079700 BR RLINK RETURN 80079720 VISDARLN DS F SAVE RLINK 80079740 .VINSIO6 ANOP 80079760 LTORG , 80079780 DROP R13,REC,RMEM,R8,R9 80079800 TITLE '*** VIOINTFX - FIX UP IN CASE OF INTERRUPT ***' 80079820 **==> ENTRY: VIOINTFX CLEAN UP IN EVENT OF INTERRUPT = = = = = = = =* 80090000 * ENTRY USED TO PRESENT CSW, RESET CHANNEL STATUS, ETC. * 80090020 * ENTRY CONDITIONS: * 80090040 * R0 = NUMBER OF CHANNEL CAUSING INTERRUPT * 80090060 * R15 = ENTRY ADDRESS * 80090080 * EXIT CONDITIONS: * 80090100 * R0 CHANGED; R7,R8,R9 SAVED AND RESTORED * 80090120 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * 80090140 USING LOWCORE@,RMEM USING TO LOW CORE ADDRESSES 80090160 USING VIDVTABD,R8 USING DEVICE TABLE 80090180 USING VIOINTFX,R15 STANDARD USING 80090200 USING ECONTROL,REC USING TO ECONTROL 80090220 ENTRY VIOINTFX ENTRY POINT NAME 80090240 VIOINTFX STM R7,R9,VIOINFSA SAVE REGS WHICH WILL BE CHANGED 80090260 MVI VIABFLAG,VIABINTR SHOW INTO INTERRUPT PROCESSOR 80090280 L R9,=A(VIDVTAB) GET POINTER TO DEVICE TABLES 80090300 STC R0,VIOINFX1+1 STORE CHANNEL # OF INT 80090320 VIOINFX0 L R8,0(R9) GET @ OF A DEVICE TABLE ENTRY 80090340 VIOINFX1 CLI VIDVTCH#,$ **CHANGED** CHECK IF RIGHT DCHANNEL # 80090360 BNE VIOINFNO NO,LOOP 80090380 TM VIDVTST,VIDVIPND IS THAT DEVICE IN INT PEND STATE? 80090400 BO VIOINFX2 YES, FOUND RIGHT ONE 80090420 VIOINFNO LA R9,4(R9) INCREMENT TO NEXT DEVICE 80090440 LTR R8,R8 SEE IF LAST DEVICE ALREADY CHECKED 80090460 BNM VIOINFX0 LOOP TO FIND INTERRUPTING DEVICE 80090480 B VIOINFXR IF FALL OUT, RETURN NO INT PEND 80090500 SPACE 80090520 VIOINFX2 MVC VICSW,VICHTCSW PRESENT CSW TO USER 80090540 MVC VIIOOLD+2(2),VIDVTDV@ SHOW DEVICE @ IN OLD PSW 80090560 NI VICHSCST,255-VICHSPCI SHOW NO LONGER PCI 80090580 NI VIDVTST,255-VIDVIPND SHOW DEVICE NO LONGER PENDING 80090600 IC R0,VICHTIX GET CHANNEL TABLE INDEX 80090620 L R7,=A(VICHTAB) GET POINTER TO CHANNEL INFO TABLE 80090640 ALR R7,R0 POINT TO PROPER CHANNEL 80090660 USING VICHTABD,R7 GET POINTER TO CHANNEL TABLE 80090680 SR R9,R9 CLEAR R9 FOR INSERT 80090700 IC R9,VICH#PND GET COUNT OF DEVICES INT PEND 80090720 BCT R9,VIOINFX3 ONE LESS PENDING 80090740 MVI VICHTST,VICHAVL LAST ONE--SHOW IT IS AVAILABLE 80090760 B VIOINFX4 80090780 VIOINFX3 OC VIPEND(1),VIDVCMSK AT LEAST 1 INT NOW PENDING 80090800 MVI VICHTST,VICHIPND SHOW CHANNEL STILL PENDING 80090820 VIOINFX4 STC R9,VICH#PND SHOW # DEVS PENDING THIS CHANNEL 80090840 CLI VICH#BSY,0 ARE NO DEVICES BUSY? 80090860 BE VIOINFXR NONE-RETURN 80090880 MVI VICHTST,VICHWORK SHOW CHANNEL WORKING 80090900 TM VIDVTYP,VIDVMPX IS THIS A MPX CHANNEL (DEVICE) 80090920 BNO VIOINFXR NO, RETURN-CHANNEL WORKING 80090940 MVI VICHTST,VICHAVL SHOW CHANNEL STILL AVAILABLE 80090960 VIOINFXR LM R7,R9,VIOINFSA RELOAD SAVED REGISTERS 80090980 MVI VIABFLAG,0 SHOW RETURNING TO MAIN INTERPRETER 80091000 BR RLINK RETURN 80091020 VIOINFSA DS 3F SAVE AREA FOR THIS RTN. 80091040 DROP RMEM,R8,R15,REC,R7 80091060 LTORG , 80091080 TITLE 'VIDABF DSECT - FIRST 8 BYTES OF D.A. BUFFER' 80091100 VIDABF DSECT , FORMAT FIRST BYTES OF D.A. BUFFER 80091120 VIBFG4@ DS H ADDRESS OF G4 GAP 80091140 VIBFRPT DS H PTR. TO BEGINNING OF CURR. REC. 80091160 VIBFCKDX DS B WHERE ON BUFFER IN COUNT,KEY,DATA 80091180 VIBFC EQU B'00010000' (VIBFCKDX)==> LAST PASSED COUNT AREA 80091200 VIBFK EQU B'00011000' (VIBFCKDX)==> LAST PASSED KEY 80091220 VIBFD EQU B'00011100' (VIBFCKDX)==> LAST PASSED DATA AREA 80091240 VIBFLGS EQU VIBFCKDX FLAGS 80091260 VIBFPTX EQU B'10000000' (VIBFLGS)==> VIDVBFPT MEANINGLESS 80091280 VIBFTOHA EQU B'01000000' (VIBFLGS)==> FORCE TO HOME ADDR. 80091300 VIBFTOG4 EQU B'00100000' (VIBFLGS)==> REMAIN AT G4 IF HIT 80091320 VIBFIXPT EQU B'00000010' (VIBFLGS)==> HAVE PASSED INDEX PT. 80091340 VIBFSLO EQU B'10000000' (VIBFLGS)==> SEARCH HAS BEEN LOW 80091360 VIBFSHI EQU B'11000000' (VIBFLGS)==> SEARCH HAS BEEN HIGH 80091380 VIBFKDL DS 0XL3 KEY AND DATA AREAS 80091400 VIBFKL DS AL1 LENGTH OF KEY AREA; 0 IF NONE 80091420 VIBFDL DS H LENGTH OF DATA AREA 80091440 VIBFINPT EQU *-VIDABF INITIAL VIDVBFPT VALUE FOR D.A. 80091460 VIBFCRCH DS 2H CURRENT CYLINDER/HEAD 80091480 VIBFG1 DS XL8 G1 GAP LENGTH 80091500 VIBFG2 DS XL6 LENGTH OF G2 AFTER CYL/HEAD #S 80091520 VIBFR0 EQU *-VIDABF ADDRESS OF R0 RECORD 80091540 .VINOIO2 ANOP , END OF VIRT I/O SECTION 80091560 AIF (NOT &$VIRT OR &$VI#DA EQ 0).NOVIDA SKIP IF NO DASDS 80200000 TITLE 'VIRTUAL DIRECT ACCESS I/O BDAM INTERFACE' 80200020 VIDAIO CSECT 80200040 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80200060 * ALL DIRECT ACCESS I/O FOR VIRTUAL MACHINE IS PERFORMED HERE * 80200080 * REGISTER USAGE * 80200100 * ON ENTRY: * 80200120 * R13 - SAVE AREA POINTER * 80200140 * R14 - RETURN ADDRESS AND POINTER TO CONTROL BLOCK * 80200160 * CONTROL BLOCK FORMAT * 80200180 * 0(R14) - RELATIVE BLOCK NUMBER OF TRACK ON * 80200200 * VIRTUAL DEVICE. THIS IS USED ON READ * 80200220 * AND WRITE REQUESTS ONLY. HALF WORD * 80200240 * 2(R14) - REQUEST CODE. 0 - OPEN ; 4 - CLOSE * 80200260 * 8 - READ ;12 - WRITE * 80200280 * BYTE FLAG * 80200300 * 3(R14) - ADDRESS OF BUFFER. NOT USED ON CLOSE * 80200320 * 3 BYTE ADDRESS ACCESSIBLE AS FULL WORD * 80200340 * BY REFERENCING 2(R14) * 80200360 * 6(R14) - ADDRESS OF AN 8-BYTE AREA CONTAINING * 80200380 * A DDNAME. NOT USED ON CLOSE AS CLOSE * 80200400 * IS TO CLOSE ALL DCB'S CUURENTLY OPEN * 80200420 * R15 - ENTRY REGISTER * 80200440 * WITHIN CSECT * 80200460 * R6 - ECONTROL POINTER * 80200480 * R10 - DCB ADDRESS * 80200500 * R12 - POINTER TO CONTROL BLOCK * 80200520 * R13 - BASE AND SAVE AREA ADDRESS * 80200540 * ALL OTHERS ARE WORK REGISTERS * 80200560 * ON EXIT * 80200580 * ALL REGISTERS ARE RESTORED * 80200600 * CONDITION CODE IS SET AS FOLLOWS: * 80200620 * CC = 0 NO PROBLEMS * 80200640 * CC = 3 UNABLE TO PERFORM REQUEST * 80200660 * * 80200680 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 80200700 SPACE 3 80200720 USING *,R15 TEMPORARY ADDRESSABILITY THRU R15 80200740 STM R14,R12,12(R13) SAVE ALL REGISTERS EXCEPT R13 80200760 L R15,=A(VIDASAVE) GET ADDRESS OF SAVE AREA 80200780 DROP R15 NO LONGER NEED TEMPORARY BASE 80200800 ST R15,8(R13) SET FORWARD SA POINTER 80200820 ST R13,4(R15) SET BACKWARD SA POINTER 80200840 LR R13,R15 R13 IS NOW POINTING AT SA 80200860 USING VIDASAVE,R13 DECLARE R13 TO ALSO BE BASE 80200880 USING ECONTROL,REC REC PROVIDES LINK TO ECONTROL 80200900 LR R12,R14 RESERVE R12 AS CONTROL BLOCK PNTR 80200920 USING VIDACBLK,R12 PROVIDE MNEMONIC ADDRESSING TO BLOCK 80200940 B VIDASAVE+4*18 BRANCH AROUND SA 80200960 VIDASAVE DS 18F RESERVE SPACE FOR SA 80200980 SPACE 2 80201000 CLI VIDACODE,4 IS THIS A CLOSE? 80201020 BE VIDACLSE YES, BRANCH TO CODE TO DO CLOSES 80201040 L R1,VIDADDNM GET ADDRESS OF DDNAME AREA IN R1 80201060 LM R7,R9,=A(VIDADDN1,16,VIDADDND-16) SEARCH FOR DDNAME 80201080 VIDAFIND CLC 0(8,R7),0(R1) MATCHING THAT SPECIFIED IN REQUEST 80201100 BE VIDABRCH IF SUCCESS GET OUT OF LOOP 80201120 BXLE R7,R8,VIDAFIND LOOP BACK TO CHECK NEXT DDNAME 80201140 B VIDACC3 ERROR RETURN - NO DDNAME MATCH 80201160 SPACE 2 80201180 VIDABRCH L R10,8(R7) R10 NOW POINTS TO DCB TO BE USED 80201200 MVC VIDA#TRK(4),12(R7) SAVE NUMBER OF TRACKS TO PREFORMAT 80201210 USING IHADCB,R10 DECLARE SYMBOLIC ADDRESSING TO DCB 80201220 SPACE 80201240 TM DCBOFLGS,X'10' IS DCB OPEN? 80201260 BO VIDANOPN YES THEN NO OPEN REQUIRED 80201280 SPACE 3 80201300 MVC VIDADCB+(DCBDDNAM-IHADCB)(8),DCBDDNAM MOVE IN DCB NAME 80201320 LH R8,DCBBLKSI ACQUIRE SIZE OF PSEUDO TRACKS 80201340 STH R8,VIDADCB+(DCBBLKSI-IHADCB) STORE IN PREFORMAT DCB 80201360 OPEN (VIDADCB,OUTPUT) OPEN FOR OUTPUT TO DO PREFORMATTING 80201380 TM VIDADCB+(DCBOFLGS-IHADCB),X'10' DID WE SUCEED? 80201400 BZ VIDACC3 NO, DD CARD WAS MISSING, ERROR CC=3 80201420 SPACE 3 80201440 * ENTER HERE TO ZERO OUT ALL VIRTUAL TRACKS ON DEVICE * 80201460 * ACCESSED BY DCB POINTED TO BY R10. THIS CODE IS EXECUTE* 80201480 * WHENEVER AN OPEN IS PERFORMED. * 80201500 SPACE 80201520 * ZERO OUT BUFFER AREA THEN WRITE IT TO ALL BLOCKS * 80201540 * VIRTIO HAS ALREADY SET FIRST 8 BYTES AS IT NEEDS THEM 80201550 * IT HAS ALSO ZEROED THE FIRST 32 BYTES OF THE BUFFER 80201552 L R7,VIDABUFF COPY ADDRESS OF BUFFER INTO R7 & R11 80201560 LR R11,R7 R11 SAVES IT, R7 USED FOR ZEROING 80201580 LR R9,R8 SAVE LENGTH OF BUFFER 80201600 S R8,=F'8' REDUCE LENGTH BY SIZE OF G1 GAP 80201620 SRL R8,5 CALCULATE THE NUMBER OF 80201640 SLL R8,5 BYTES LEFT TO BE ZEROED 80201660 SR R9,R8 R9 IS NOW NUMBER OF BYTES TO SKIP 80201680 LM R14,R5,8(R7) LOAD UP 32 BYTES OF ZEROS 80201700 AR R7,R9 R7 IS BEGINNING OF AREA TO ZERO 80201720 LA R9,0(R7,R8) ADDRESS OF END OF AREA TO BE ZEROED 80201840 LA R8,32 INCREMENT THRU BUFFER IN STEPS OF 32 80201860 SR R9,R8 R9 IS NOW ADDRESS OF LAST 32-BYTES 80201880 SPACE 80201900 STM R14,R5,0(R7) ZERO NEXT 32-BYTE PORTION 80201920 BXLE R7,R8,*-4 LOOP TO CONTINUE ZEROING 80201940 SPACE 80201980 L R7,VIDA#TRK PREFORAMT WITH ZEROS ALL TRACKS 80202000 VIDAERAS WRITE VIDAECB0,SF,VIDADCB,(R11) WRITE RECORD OF ZEROS 80202020 CHECK VIDAECB0 WAIT COMPLETION OF WRITE OPERATION 80202040 BCT R7,VIDAERAS LOOP BACK TO DO NEXT BLOCK 80202060 CLOSE VIDADCB CLOSE PREFORMATTING DCB 80202080 OPEN ((R10),UPDAT) OPEN DCB FOR READ/WRITE PROCESSING 80202100 SPACE 2 80202120 VIDANOPN CLI VIDACODE,0 IF THIS WAS AN OPEN REQUEST 80202140 BE VIDACC0 THEN WE ARE ALL DONE 80202160 SPACE 3 80202180 * COMMON CODE FOR READ AND WRITE * 80202200 SPACE 80202220 LH R3,VIDABLCK GET RELATIVE BLOCK # 80202240 ST R3,VIDABLK# STORE IT FOR USE IN READ/WRITE 80202260 L R2,VIDABUFF R2 POINTS TO I/O BUFFER 80202280 CLI VIDACODE,8 IF THIS IS IS A READ REQUEST 80202300 BE VIDAREAD GO TO PERFORM READ 80202320 SPACE 3 80202340 * ACTUAL WRITE IS PERFORMED HERE * 80202360 SPACE 80202380 WRITE VIDAECB1,DI,(R10),(R2),'S',0,VIDABLK#+1 WRITE USER TRACK 80202400 CHECK VIDAECB1 AWAIT COMPLETION OF WRITE 80202420 B VIDACC0 RETURN NORMALLY 80202440 SPACE 3 80202460 * ACTUAL READ IS PERFORMED HERE * 80202480 SPACE 80202500 VIDAREAD READ VIDAECB2,DI,(R10),(R2),'S',0,VIDABLK#+1 READ USER TRACK 80202520 CHECK VIDAECB2 AWAIT COMPLETION OF READ 80202540 B VIDACC0 RETURN NORMALLY 80202560 SPACE 3 80202580 VIDACLSE LM R7,R9,=A(VIDADDN1,16,VIDADDND-16) CLOSE ALL DCB'S 80202600 VIDACTST L R10,8(R7) GET ADDRESS OF NEXT DCB 80202620 TM DCBOFLGS,X'10' IS THIS ONE OPEN 80202640 BZ VIDACNXT NO, TRY NEXT 80202660 CLOSE ((R10)) CLOSE THIS DCB 80202680 VIDACNXT BXLE R7,R8,VIDACTST LOOP BACK TO CHECK NEXT DCB 80202700 SPACE 3 80202720 VIDACC0 SR R0,R0 SET NORMAL COMP CODE = 0 80202740 B VIDARETN PERFORM ACTUAL RETURN 80202760 SPACE 80202780 VIDACC3 TM *+1,X'FF' SET ERROR COND CODE = 3 80202800 SPACE 80202820 VIDARETN L R13,4(R13) RESTORE SA POINTER 80202840 LM R14,R12,12(R13) RESTORE ALL OTHER REGISTERS 80202860 B VIDABLEN(RLINK) RETURN TO CALLER (AFTER CONTROL BLK) 80202880 DROP R13,R12,R10,REC 80202900 SPACE 3 80202920 VIDABLK# DS F FULL WORD FOR RELATIVE BLOCK # 80202940 VIDA#TRK DS F SAVE AREA FOR NUMBER OF TRACKS 80202960 VIDADCBS , CREATE DCB'S FOR EACH DASD 80202980 VIDADCB DCB DSORG=PS,MACRF=(WL),RECFM=F,EODAD=VIDACC3,SYNAD=VIDACC3 80203020 LTORG 80203080 SPACE 5 80203100 * DSECT VIDADSEC --- FORMATS THE PARAMETER CONTROL * 80203120 * FOR CSECT VIDAIO * 80203140 SPACE 80203160 VIDADSEC DSECT 80203180 CNOP 2,4 CONTOL BLOCK STARTS AT A HALF WORD 80203200 VIDACBLK DS 0H START OF CONTROL BLOCK, USING POINTS HERE 80203220 VIDABLCK DS H RELATIVE BLOCK ADDRESS OF VIRT TRACK 80203240 VIDABUFF DS 0A ADDRESS OF BUFFER 80203260 VIDACODE DS X REQUEST CODE 80203280 DS 3X ACTUAL BUFFER ADDRESS HERE 80203300 VIDADDNM DS A ADDRESS OF DDNAME AREA 80203320 VIDAENTR DS A ENTRY ADDRESS TO VIDAIO 80203340 VIDABLEN EQU *-VIDACBLK LENGTH OF CONTROL BLOCK 80203360 .NOVIDA ANOP 80203380 TITLE '*** EIOPCS - XOPC INTERPRETATION' 81000000 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 81000020 * CSECT EIOPCS * 81000040 * MAIN ENTRY FOR ALL XOPC'S * 81000060 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 81000080 EIOPCS CSECT 81000100 LR RCC,R15 SET UP ADDRESSABILITY ON RCC 81000120 USING EIOPCS,RCC ** UNUSUAL USE OF RCC AS BASE ** 81000140 USING ECONTROL,REC ACQUIRE ADDRESSABILITY TO ECONTROL 81000160 ST RLINK,EIXOPSAV SAVE RETURN @ 81000180 AIF (NOT &$VIRT).VIXOPC1 81000185 MVI VIABFLAG,VIABXOPC INDICATE WHERE AT IN CASE OF OC ERR 81000190 .VIXOPC1 ANOP 81000195 * THE FOLLOWING CODE INTERPRETS THE XOPC PSEUDO INSTRS * 81000200 SPACE 5 81000220 * CHECK IF LEGAL CODE # IS SPECIFIED IN THE IMMED FIELD * 81000240 * OF THE INSTR -- IF OK, BRANCH TO INDIVIDUAL XOPC * 81000260 * ROUTINES. * 81000280 C R7,=A(EC#XOPC) IS CODE # LEGAL ? 81000300 BH EIXOPCC3 IF NUMBER TOO HIGH, ABORT 81000320 EIXOPCOK EQU * 81000340 LR RWK1,R7 COPY CODE # FOR OFFSET INDEX 81000360 ALR RWK1,RWK1 GET INDEX INTO OFFSET TABLE 81000380 LH RWK1,EIOPCJMP(RWK1) GET BRANCH OFFSET TO ROUTINE 81000400 EIOPCB B EIOPCB(RWK1) BRANCH TO ROUTINE 81000420 SPACE 5 81000440 * THE FOLLOWING CODE PROCESSES THE INDIVIDUAL XOPC * 81000460 * PSEUDO INSTRUCTIONS * 81000480 SPACE 2 81000500 * XOPC 0 (SET UP PSEUDO SPIE) * 81000520 EIOPC0 EQU * 81000540 VIRT YES=EIXOPCC3 IF IN VIRT MODE, DISALLOW THIS XOPC 81000550 L RWK0,ECREG1 GET USER SPECIFIED EXIT @ 81000560 LA RWK1,1 ASSUME LENGTH-1 = 1 81000580 BAL RLINK,EIXOPCHK CHECK GIVEN ADDRESS FOR CORRECTNESS 81000600 ST RWK0,ECPRSPIE SET USER SPIE EXIT ADDR 81000620 MVC ECPRSCDE(4),ECREG0 SET USER SPIE CODE MASK 81000640 OI ECPRFLG3,B'10000000' TURN ON FLAG NOTE SPIE IS SET 81000660 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81000680 SPACE 2 81000700 * INSTRUCTION TRACE XOPC INSTRUCTIONS * 81000720 * * 81000740 * CHECK AND SET LIMIT ADDRESSES FOR TRACE * 81000760 EIOPC1 EQU * 81000780 EIOPC3 EQU EIOPC1 81000800 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR TRACE 81000820 CR RWK0,RWK1 ARE ADDRESSES RELATIVELY CORRECT ? 81000840 BNL EIXOPCC1 BRANCH IF NOT 81000860 BAL RLINK,EIXOPCHA CHECK ADDRESSES FOR LEGALITY 81000880 STM RWK0,RWK1,ECPRTRAL SET TRACE ADDRESS LIMITS IN PRCB 81000900 AIF (NOT &$VIRT).VIOPC1 81000902 TM ECFLAG4,AJOVIRT IF NOT IN VIRT MODE THEN CONTINUE 81000904 BZ *+10 STANDARD XOPC PROCESSING 81000906 MVC VITRWORD(4),ECREGS+8 VIRT TRACE FLAGS FROM USER R2 81000908 .VIOPC1 ANOP 81000910 BCTR R7,0 XOPC CODE# = CODE#-1 81000920 LTR R7,R7 IS CODE = 1 (R7 = 0) ? 81000940 BZ EIXOPCC0 YES, DOING XOPC 1 - FINISHED 81000960 * TURN ON INSTRUCTION TRACE FACILITY * 81000980 EIOPC2 EQU * 81001000 OI ECPRFLG1,ECPRTRCE TURN ON TRACE FACILITY 81001020 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001040 * TURN OFF INSTRUCTION TRACE FACILITY * 81001060 EIOPC4 EQU * 81001080 NI ECPRFLG1,255-ECPRTRCE TURN OFF TRACE FACILITY 81001100 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001120 SPACE 2 81001140 * STORAGE MODIFICATION CHECK XOPC INSTRUCTIONS * 81001160 * * 81001180 * CHECK AND SET LIMIT ADDRESSES FOR MOD CHECK * 81001200 EIOPC5 EQU * 81001220 EIOPC7 EQU EIOPC5 81001240 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR MOD CHK 81001260 CR RWK0,RWK1 ARE ADDRS RELATIVELY CORRECT ? 81001280 BNL EIXOPCC1 BRANCH IF NOT 81001300 BAL RLINK,EIXOPCHA CHECK IF ADDRESSES ARE LEGAL 81001320 STM RWK0,RWK1,ECPRMODL SET MOD CHECK ADDRESSES 81001340 LA RWK1,5 LOAD CODE # COMPARATOR 81001360 CR R7,RWK1 IS THIS AN XOPC 5 INSTR ? 81001380 BE EIXOPCC0 YES - FINISHED 81001400 * TURN ON MODIFICATION CHECK FACILITY * 81001420 EIOPC6 EQU * 81001440 OI ECPRFLG1,ECPRMODC TURN ON MOD CHECKING 81001460 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001480 * TURN OFF MODIFICATION CHECKING FACILITY * 81001500 EIOPC8 EQU * 81001520 NI ECPRFLG1,255-ECPRMODC TURN OFF MOD CHECKING 81001540 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001560 SPACE 2 81001580 * TURN ON ALIGNMENT CHECKING (360 STYLE) * 81001600 * (OC-6 ALIGNMENT INTERRUPTS ALLOWED) * 81001620 EIOPC9 EQU * 81001640 VIRT YES=EIXOPCC3 IF IN VIRT MODE, DISALLOW THIS XOPC 81001660 OI ECPRFLG2,ECALNCHK TURN ON CHECKING 81001680 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001700 * TURN OFF ALIGNMENT CHECKING (370 STYLE) * 81001720 * (OC-6 ALIGNMENT INTERRUPTS NOT ALLOWED) * 81001740 EIOPC10 EQU * 81001760 VIRT YES=EIXOPCC3 IF IN VIRT MODE, DISALLOW THIS XOPC 81001780 NI ECPRFLG2,255-ECALNCHK TURN OFF CHECKING 81001800 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001820 SPACE 2 81001840 * XOPC 11 (FETCH INSTRUCTION COUNT) * 81001860 EIOPC11 EQU * 81001880 MVC ECREG0(4),ECILIMT PUT COUNT IN USER REG 0 81001900 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81001920 SPACE 2 81001940 * XOPC 12 - EMULATE SYSTEM 360 * 81001960 EIOPC12 EQU * 81001980 VIRT YES=EIXOPCC3 IF IN VIRT MODE, DISALLOW THIS XOPC 81002000 NI ECPRFLG2,B'11110011' SHUT OFF ALL EMULATION BITS 81002020 OI ECPRFLG2,ECEM360 SHOW NOW EMULATING A 360 81002040 LA R15,EIXOPEM SHOW EMULATION CHANGE 81002060 B EIXOPNRT TAKE NON-STANDARD RETURN 81002080 SPACE 2 81002100 * XOPC 13 - EMULATE SYSTEM 370 * 81002120 EIOPC13 EQU * 81002140 VIRT YES=EIXOPCC3 IF VIRT MODE, DISALLOW THIS XOPC 81002160 NI ECPRFLG2,B'11110011' SHUT OFF ALLL EMULATION BITS 81002180 OI ECPRFLG2,ECEM370 SHOW NOW EMULATING A 370 81002200 LA R15,EIXOPEM SHOW EMULATION CHANGE 81002220 B EIXOPNRT TAKE NON-STANDARD RETURN 81002240 SPACE 2 81002260 * XOPC 14 - SET INTERRUPT COUNT * 81002280 EIOPC14 EQU * 81002300 MVC ECPRCMPR(4),ECREG0 MOVE GIVEN VALUE TO PRCB 81002320 B EIXOPCC0 BRANCH TO COMMON EXIT CODE 81002340 SPACE 2 81002360 * XOPC 15 - SET COUNT EXIT ADDRESS * 81002380 EIOPC15 EQU * 81002400 VIRT YES=EIOPC15A IN VIRT MODE THERE IS NO EXIT ADDR 81002410 MVC ECPRCLEA(4),ECREG0 MOVE GIVEN EXIT ADDRESS PRCB 81002420 EIOPC15A OI ECPRFLG4,ECLKADR TURN ON FLAG TO NOTE COUNT EXIT ADDR 81002440 B EIXOPCC0 BRANCH TO COMMON EXIT CODE 81002460 SPACE 3 81002480 * INSTRUCTION EXECUTION COUNT FACILITY INSTRUCTIONS * 81002500 * * 81002520 * XOPC 17 AND XOPC 18 * 81002540 * CHECK AND SET LIMIT ADDRESSES FOR COUNT FACILITY * 81002560 EIOPC17 EQU * 81002580 EIOPC18 EQU * 81002600 LM RWK0,RWK1,ECREGS GET LOW AND HIGH ADDRS FOR COUNT 81002620 CR RWK0,RWK1 ARE ADDRESSES RELATIVELY CORRECT ? 81002640 BNL EIXOPCC1 BRANCH IF NOT SET CC = 1 81002660 BAL RLINK,EIXOPCHA CHECK ADDRESSES FOR LEGALITY 81002680 STM RWK0,RWK1,ECPRICL SET COUNT LIMIT ADDRESSES IN PRCB 81002700 C R7,=F'17' IS THIS XOPC #17 OR XOPC 18? 81002720 BE EIXOPCC0 IS 17, SO FINISHED 81002740 SPACE 3 81002760 * TURN ON THE INSTRUCTION EXECUTION COUNT FACILITY * 81002780 EIOPC16 EQU * 81002800 TM ECPRFLG1,ECPRNOSP TEST PRCB FOR NO COUNTING SPACE AVAL 81002820 BO EIXOPCC1 NO SPACE AVAILABLE, QUIT 81002840 TM ECPRFLG1,ECPRCTON HAS SPACE FOR COUNT ALREADY ALLOCED 81002860 BO EINOALL SPACE ALREADY ALLOCATED 81002880 L RWK0,ECFADH GET HIGH PROG ADDR IN REG 0 81002900 S RWK0,ECFADL SUBTRACT TO FIND CORE LENGTH NEEDED 81002920 LA R9,ECPRICA GET ADDR IECF AREAS IN ECONTROL 81002940 GETMAIN EC,LV=(0),A=(R9),SP=1 TRY GET LENGTH USER PROG 81002960 LTR R15,R15 TEST TO SEE IF WE GOT WHAT WE NEEDED 81002980 BZ EISPCOK IF CC=0, WE GOT WHAT WE NEEDED 81003000 OI ECPRFLG1,ECPRNOSP IF NOT, NOT ENOUGH SPACE - SET FLAG. 81003020 B EIXOPCC1 AND QUIT. 81003040 EISPCOK EQU * 81003060 ST RWK0,ECPRICAL GOT AMOUNT NEEDED STORE LENGTH 81003080 OI ECPRFLG1,ECPRCTON NOTE ALLOCATION OF COUNTER SPACE 81003100 EINOALL EQU * 81003120 OI ECPRFLG1,ECPRIECF NOTE THAT THE COUNT FACILITY IS ON 81003140 B EIXOPCC0 BRANCH TO COMMON XOPC RETURN CODE 81003160 SPACE 3 81003180 * XOPC 19 * 81003200 * TURN OFF THE INSTRUCTION EXECUTION COUNT FACILITY * 81003220 EIOPC19 EQU * 81003240 NI ECPRFLG1,255-ECPRIECF TURN OFF THE COUNT FACILITY FLAG 81003260 B EIXOPCC0 BRANCH TO COMMON XOPC RETURN CODE 81003280 SPACE 3 81003300 * XOPC 20 * 81003320 * CLEAR INSTRUCTION EXECUTION COUNT FACILITY COUNT AREAS * 81003340 EIOPC20 EQU * 81003360 TM ECPRFLG1,ECPRCTON TEST FOR COUNT SPACE ALLOCATION 81003380 BNO EIXOPCC1 IF NOT ALLOCATED, CANNOT CLEAR IT 81003400 L RWK1,ECPRICA GET ADDRESS OF CORE TO BE CLEARED 81003420 L R9,ECPRICAL GET LENGTH OF CORE TO BE CLEARED 81003440 BCTR R9,0 GET LENGTH IN WORKABLE FORM 81003460 C R9,=XL4'000000FF' IS LENGTH > 256 BYTES 81003480 BNH EIREMAIN IF NOT > 256 BYTES CLEAR USING EX 81003500 XR R8,R8 ZERO OUT R8 FOR DIVIDE 81003520 D R8,=XL4'00000100' DIVIDE LEN BY 256 GIVING REMAINDER 81003540 EIOPCLP EQU * 81003560 XC 0(256,RWK1),0(RWK1) ZERO OUT 256 BYTE AREA 81003580 LA RWK1,256(RWK1) MOVE ADDRESS POINTER OVER 81003600 BCT R9,EIOPCLP GO BACK AND GET NEXT 256 BYTE AREA 81003620 LTR R9,R8 PUT REMNDR WHERE NEEDED BY EXECUTE 81003640 BZ EIXOPCC0 IF REMAINDER IS 0 WE ARE DONE 81003660 EIREMAIN EQU * 81003680 EX R9,EIXOPCXC EXECUTE XC TO DO REMAINING BYTES 81003700 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81003720 EIXOPCXC XC 0(0,RWK1),0(RWK1) ZERO OUT REMAINING BYTES IN COUNT 81003740 SPACE 3 81003760 * XOPC 21 (RETURN FROM INTERRUPT HANDLING STATE) * 81003780 EIOPC21 EQU * 81003800 VIRT YES=EIXOPCC3 IF IN VIRT MODE,DISALLOW THIS XOPC 81003810 TM ECPRFLG3,ECINHDST TEST SEE IF IN INTERRUPT HANDLING 81003820 BNO EIXOPCC1 IF NOT, THEN TROUBLE - SET CC = 1 81003840 L RIA,ECREG1 GET RESUMING ADDR FROM USER REG 1 81003880 MVC ECREG0(8),ECPRIRGS RELOAD USER REGISTERS 0 AND 1 81003900 NI ECPRFLG3,B'10111111' TURN OFF INTERRUPT HANDLING FLAG 81003920 B EIXOPCC0 SET CC = 0 TO SHOW NORMAL EXEC 81003940 SPACE 5 81003960 * XOPC 22 - DUMP INSTRUCTION EXECUTION COUNT STATISTICS * 81003980 SPACE 2 81004000 * THIS SECTION PRINTS THE STATISTICAL REPORT FOR THE * 81004020 * INSTRUCTION EXECUTION COUNT FACILITY. DUE TO THE TABLE* 81004040 * DESIGN OF IECF, MANY POINTERS ARE USED AND REGISTER * 81004060 * USAGE DIFFERS A LITTLE FROM THAT IN THE REST OF THE * 81004080 * EXTENDED INTERPRETER. REGISTER USAGE IN THIS SECTION IS* 81004100 * AS FOLLOWS: RWK0 - GENERAL WORK REGISTER * 81004120 * RWK1 - OFFSET POINTER IN COUNT TABLE * 81004140 * R7 - GENERAL WORK REGISTER * 81004160 * R8 - THE CURRENT INSTRUCTION COUNT * 81004180 * R9 - BASE ADDRESS OF COUNTING AREA * 81004200 * R10 - BASE ADDRESS OF USER PROGRAM AREA * 81004220 * RWK14 - CURRENT PROGRAM RELATIVE ADDRESS * 81004240 * BEING INSPECTED * 81004260 * IT SHOULD BE NOTED THAT THIS SECTION IS VERY INSTRUCTIO* 81004280 * LENGTH DEPENDENT. ANY NEW INSTRUCTION DIFFERING IN THE* 81004300 * TRADITIONAL LENGTH CODES WILL DRASTICALLY EFFECT THIS * 81004320 * SECTION. * 81004340 SPACE 3 81004360 EIOPC22 EQU * 81004380 TM ECPRFLG1,ECPRCTON TEST COUNT SPACE ALLOCATION 81004400 BNO EIXOPCC1 IF NEVER ALLOCATED CANNOT DUMP IT 81004420 L RWK1,ECFADL GET FAKE BEGIN INSTR ADDR 81004440 LA R10,0(RMEM,RWK1) GET PHYSICAL REAL STARTING INSTR ADR 81004460 L RWK1,ECPRICL GET BEGINNING COUNTABLE FAKE INSTR 81004480 ST RWK1,EISAV22 SAVE FIST OFFSET AS BEG LOOP ADDR 81004500 LR RWK14,RWK1 SAVE FIRST ADDR FOR LATER USE 81004520 S RWK1,ECFADL SET OFFSET POINTER AT BEG 81004540 SR R8,R8 ZERO OUT COUNT SAVING REGISTER 81004560 L R9,ECPRICA GET STARTING ADDRESS OF COUNT SPACE 81004580 SPACE 2 81004600 EILOP22 EQU * 81004620 CH R8,0(RWK1,R9) IS THE NEW COUNT THE SAME AS OLD? 81004640 BE EIMVPNTR IF SAME, MOVE POINTER OVER 81004660 SPACE 2 81004680 * THIS SECTION ACTUALLY PRINTS THE STATISTICS LINE * 81004700 LTR R8,R8 WAS THE OLD COUNT ZERO? 81004720 BZ EINEWCT IF OLD WAS ZERO, JUST SAVE & RETURN 81004740 L RWK0,EIEND22 GET ENDING ADDR OF THIS LOOP 81004760 XHEXO RWK0,EISTEND CONVERT ENDING ADDR TO HEX 81004780 L RWK0,EISAV22 SET BEGINNING ADDR OF THIS LOOP 81004800 XHEXO RWK0,EISTBEG CONVERT BEGINNING ADDR TO HEX 81004820 XDECO R8,EISTCNT CONVERT INSTR COUNT TO DECIMAL 81004840 MVC EISTBEG(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 81004860 MVC EISTEND(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 81004880 $PRNT EISTMSG,EISTMSGL,EIXOPREX PRINT STATISTICAL LINE 81004900 SPACE 2 81004920 EINEWCT EQU * 81004940 ST RWK14,EISAV22 SAVE BEGINNING LOOP ADDRESS 81004960 LH R8,0(RWK1,R9) REPLACE OLD COUNT WITH NEW 81004980 SPACE 2 81005000 EIMVPNTR EQU * 81005020 ST RWK14,EIEND22 SAVE ENDING LOOP ADDRESS 81005040 LTR R8,R8 TEST FOR ZERO COUNT 81005060 BZ EIRR22 ASSUME 2 BYTE LENGTH INSTRS ON H-WRD 81005080 LA R7,0(RWK1,R10) GET ADDRESS OPCODE OF PRES INSTR 81005100 TM 0(R7),X'C0' TEST OPCODE FOR LENGTH 81005120 BM EIRXSI22 BRANCH IF LENGTH EQUAL 4 81005140 BO EISS22 BRANCH IF AN SS INSTR LENGTH = 6 81005160 SPACE 2 81005180 EIRR22 EQU * 81005200 LA RWK1,2(RWK1) LENGTH = 2 INCERMENT AND CHECK DONE 81005220 B EICHK22 BRANCH CHECK IF DONE 81005240 SPACE 2 81005260 EIRXSI22 EQU * RX OR SI THEN LENGTH =4 81005280 LA RWK1,4(RWK1) LENGTH = 4 INCERMENT AND CHECK 81005300 B EICHK22 CHECK FOR FINISHED 81005320 SPACE 2 81005340 EISS22 EQU * LENGTH = 6 81005360 LA RWK1,6(RWK1) INCERMENT OFFSET AND CHECK 81005380 EICHK22 EQU * 81005400 LR RWK14,RWK1 MOVE OFFSET FOR ADDR CALCULATION 81005420 A RWK14,ECFADL ADD TO GET NEW USER PROGRAM ADDR 81005440 C RWK14,ECPRICH TEST TO SEE IF OUT OF COUNTING RANGE 81005460 BL EILOP22 IF NOT OUT OF RANGE CONTINUE 81005480 LTR R8,R8 IF FINISHED CHECK LAST COUNT 81005500 BZ EIXOPCC0 IF ZERO, DONE, BRANCH COMMON CODE 81005520 L RWK0,EIEND22 GET LAST ENDING ADDRESS 81005540 SPACE 2 81005560 * THIS SECTION PRINTS THE LAST STATISTICS LINE * 81005580 XHEXO RWK0,EISTEND CONVERT ENDING ADDRESS TO HEX 81005600 L RWK0,EISAV22 SET BEGINNING ADDR OF THIS LOOP 81005620 XHEXO RWK0,EISTBEG CONVERT BEGINNING ADDRESS TO HEX 81005640 XDECO R8,EISTCNT CONVERT INSTR "OUNT TO DECIMAL 81005660 MVC EISTBEG(2),EISTBLK BLANK OUT FORST TWO BYTES OF ADDR 81005680 MVC EISTEND(2),EISTBLK BLANK OUT FIRST TWO BYTES OF ADDR 81005700 $PRNT EISTMSG,EISTMSGL,EIXOPREX PRINT STATISTICAL LINE 81005720 B EIXOPCC0 BRANCH TO COMMON XOPC EXIT CODE 81005740 SPACE 2 81005760 EISTMSG DC C' STATS--> BEGIN ADDR:' STATISTICS MESSAGE 81005780 EISTBEG DC 8C' ' STATS MESSAGE 81005800 DC C' END ADDR:' STATS MESSAGE 81005820 EISTEND DC 8C' ' STATS MESSAGE 81005840 DC C' INSTRUCTION COUNT:' STATS MESSAGE 81005860 EISTCNT DC 12C' ' STATS MESSAGE 81005880 EISTMSGL EQU *-EISTMSG LENGTH OF STATISTICAL MESSAGE 81005900 EISTBLK DC 2C' ' BLANK AREA 81005920 EIEND22 DS F ENDING LOOP ADDRESS 81005940 EISAV22 DS F BEGINNING LOOP ADDRESS 81005960 SPACE 2 81005980 * RECORDS EXCEEDED DURING PRINTING * 81006000 EIXOPREX LA R15,EIXOPREC SHOW RECORDS EXCEEDED 81006020 B EIXOPNRT BRANCH TO NON-STANDARD RETURN 81006040 AIF (NOT &$VIRT).VIOPC 81006060 SPACE 2 81006080 * XOPC 23 - PRESENT CURRENT SYSTEM TIME * 81006100 VIOPC23 VIRT NO=EIXOPCC3 IF NOT IN VIRT MODE, ILLEGAL 81006120 MVC ECREGS,VICLOCK PUT CURRENT TIME IN USER REG. 0 81006140 B EIXOPCC0 RETURN, COND CODE GOOD 81006160 SPACE 81006180 SPACE 2 81006200 * XOPC 24 - TERMINATE VIRT. MODE RUN - NORMAL RETURN * 81006220 VIOPC24 VIRT NO=EIXOPCC3 NOT IN VIRT MODE, THEN IGNORE INST. 81006240 LA R15,EIXOPVRT SHOW SIMULATION END 81006280 B EIXOPNRT BRANCH TO NON-STD. RETURN POINT 81006320 SPACE 2 81006322 * XOPC 25 - TERMINATE VIRT MODE RUN WITH DUMP 81006324 VIOPC25 VIRT NO=EIXOPCC3 IF IN VIRT MODE, DISALLOW THIS XOPC 81006326 LA R15,EIXOPDMP SHOW SIMULATION END WITH DUMP 81006330 B EIXOPNRT BRANCH TO NON-STD. RETURN POINT 81006334 .VIOPC ANOP 81006340 SPACE 2 81006360 * THIS IS THE XOPC COMMON EXIT CODE * 81006380 EIXOPCC0 SR R15,R15 NORMAL RETURN CONDITION 81006400 SPACE 81006420 EIXOPNRT EQU * NON-STD. RETURN POINT; R15 LOADED 81006440 CLI *+1,X'00' SET CC=0 TO SHOW NORMAL RETURN 81006460 SPACE 1 81006480 EIXOPRT EQU * COMMON EXIT POINT; CC, R15 SET 81006500 L RLINK,EIXOPSAV RELOAD LINK REGISTER 81006520 AIF (NOT &$VIRT).VIXOPC2 81006525 MVI VIABFLAG,0 NOTE WE ARE RETURNING TO EXECUT 81006530 .VIXOPC2 ANOP 81006535 BALR RCC,RLINK CAPTURE COND. CODE & RETURN 81006540 SPACE 2 81006560 * SET COND CODE 1 TO INDICATE ABNORMAL END OF XOPC * 81006580 EIXOPCC1 SR R15,R15 STANDARD RETURN WITH R15=0 81006600 CLI *,X'FF' SET CC=1 TO SHOW ABNORMAL END 81006620 B EIXOPRT RETURN 81006640 SPACE 2 81006660 * SET CC=3 TO SHOW ATTEMPTED EXEC. OF ILLEGAL XOPC # * 81006680 EIXOPCC3 SR R15,R15 WILL BE STANDARD RETURN 81006700 TM *+1,X'FF' SET CC=3 TO SHOW ILLEGAL XOPC 81006720 B EIXOPRT BRANCH TO COMMON RETURN POINT 81006740 EIXOPSAV DS F SAVE FOR LINK REGISTER 81006760 **--> INSUB: EIXOPCHK CHECK ADDRESSES FOR XOPC INSTRUCTIONS + + * 81006800 *+ * 81006820 *+ ENTRY CONDITIONS: * 81006840 *+ RWK0 - CONTAINS THE ADDRESS TO BE CHECKED (LOW @) * 81006860 *+ RWK1 - CONTAINS LENGTH-1 OF STORAGE AFFECTED * 81006880 *+ RLINK - INTERNAL LINK REGISTER * 81006900 *+ EXIT CONDITIONS: * 81006920 *+ RWK1 - CONTENTS (LENGTH) MODIFIED WHENEVER * 81006940 *+ EIXOPCHK IS CALLED ; RWK1 CONTAINS * 81006960 *+ THE HIGH ADDRESS --> (LOW @ + LENGTH - 1) * 81006980 *+ * 81007000 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * 81007020 SPACE 2 81007040 EIXOPCHK EQU * 81007060 ALR RWK1,RWK0 COMPUTE HIGH ADDRESS 81007080 EIXOPCHA EQU * 81007100 C RWK0,ECFADL IS LOW ADDRESS IN RANGE ? 81007120 BL EIXOPCC1 NO, BRANCH TO NOTE ERROR 81007140 C RWK1,ECFADH IS HIGH ADDRESS IN RANGE ? 81007160 BCR L,RLINK YES, SO RETURN 81007180 B EIXOPCC1 NO, BRANCH TO NOTE ERROR 81007200 DROP RCC,REC 81007210 LTORG 81007220 SPACE 2 81007240 * TABLE FOR THE XOPC INSTRUCTION DISPLACEMENTS * 81007260 EIOPCJMP $AL2 EIOPCB,(EIOPC0,EIOPC1,EIOPC2,EIOPC3,EIOPC4,EIOPC5,EIOPC6X81007280 ,EIOPC7,EIOPC8,EIOPC9,EIOPC10,EIOPC11,EIOPC12,EIOPC13,EIX81007300 OPC14,EIOPC15,EIOPC16,EIOPC17,EIOPC18,EIOPC19,EIOPC20,EIX81007320 OPC21,EIOPC22) 81007340 AIF (NOT &$VIRT).VIOPCJ2 SKIP IF NOT VIRT 81007360 $AL2 EIOPCB,(VIOPC23,VIOPC24,VIOPC25) BRANCHS FOR VIRT XOPS 81007380 .VIOPCJ2 ANOP 81007400 TITLE '** ECBRSTKD: BRANCH STACK FOR LAST 10 BRANCHES **' 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 A ILC, CC, PM AND INSTRUCTION ADDRESS 83028000 ECBSPAD DS X RESERVED FOR FUTURE USE 83030000 ECBSVFLG DS X PSW SWAP FLAG 83031000 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 ECBSVTYP DS 0F PSW SWAP CODE. INDICATES TYPE 83039000 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 TM ECFLAG0,$ECCONT IS THIS A CONTINUE (FROM REMONI)CP 83146010 BO EICONTI2 YES...SKIP LOTS OF INITIALIZATION CP 83146020 OI ECFLAG0,$ECCONT SHOW INITIALIZATION DONE CPP 83146030 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 ECPSWRT,ECFENTER MAKE ENTRY POINT PSW ADDRESS 83224000 MVC ECR14SAV,ECREG14 SAVE FOR ORIGINAL RETURN @ 83226000 MVC ECILIMT,ECILIMP MOVE PERMENANT TO TEMPORARY L 83228000 MVI EIDFAULT+1,ECEM370+ECALNCHK ECPRFLG2 NON-VIRT. DFLT. 83229000 MVI EITSTMSK+1,ECEM370 INITIALIZE INVALID OPCODE TEST 83229500 SPACE 2 83230000 AIF (NOT &$VIRT).VINOBGN 83232000 TM ECFLAG4,AJOVIRT TEST IF VIRT. MACH. SIMULATION ON 83232100 BNO VIBEGINO SKIP BEGINNING CODE IF NOT 83232200 SPACE 4 83232300 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83232400 * VIBEGIN: BEGINNING (ONE TIME ONLY) OF VIRTUAL INITIALIZATION * 83232500 * SET UP TIMERS, ZERO CLOCK, GET INITIAL PSW, ETC. * 83232600 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83232700 VIBEGIN EQU * 83232800 XC VIZER1(VIZER1$L),VIZER1 ZERO OUT INITIAL VALUES 83232900 XC VISTATAB(4*VISTAB#1),VISTATAB ZERO STATISTICS COUNTERS 83232950 MVI VIEVENT,X'F5' PUT RECOGNIZABLE NEG. VALUE IN EVENT 83233000 MVC VIEVENT+1(VIEVNUM*8-1),VIEVENT KILL ALL EVENT VIST 83233100 L RMEM,ECRELOC GET @ OF USER'S PGM. BEGINNING 83233200 USING LOWCORE@,RMEM USING TO LOW CORE FIXED LOCATIONS 83233300 MVC ECPSW,0(RMEM) GET INITIAL PSW 83233400 MVI EIDFAULT+1,ECEM360+ECALNCHK DEFAULT IN VIRT MODE IS 360 83233500 MVI EITSTMSK+1,ECEM360 INITIALIZE INVALID OPCODE TEST 83233600 MVI VILASTAT,VISTPBST+VISTBUSY GUESS PROBLEM AND BUSY STATE 83233800 TM ECKYAMWP,VIAMWPRB TEST IF IN PROBLEM STATE 83233900 BO *+8 GUESS WAS RIGHT; SKIP 83234000 XI VILASTAT,VISTPBST+VISTSVST NO, SHOW NOW IN SUP. STATE 83234100 TM ECKYAMWP,VIAMWPWT CHECK TO SEE IF PSW WAIT BIT ON 83234120 BZ *+8 IF NOT SKIP BUSY RESET 83234140 NI VILASTAT,255-VISTBUSY IN WAIT STATE - REST BUSY BIT 83234160 MVC VICRSTAT,VILASTAT SHOW CURRENT STATE SAME 83234200 MVI VIPROSTS,0 ALLOW NORMAL ENTRY TO PROLOG CODE 83234210 SPACE 3 83234250 VIBEGINO DS 0H SKIP TO HERE IF NOT VIRT 83234300 .VINOBGN ANOP BEGINNING VIRT CODE 83234400 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 EICONTI2 DS 0H COME HERE ON 2ND CALL FROM REMONI CP 83300100 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 SR ROP,ROP CLEAR OPCODE REG FOR CONSTANT IC'S 83316000 L RIA,ECPSWRT LOAD INSTRUCTION ADDRESS FOR EIFINB1 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 EIFIN BEGIN MAIN INTERPRETOR LOOP 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 EIOC6 EQU * 83390000 LA R0,6 SPECIFICATION INTERRUPT 83392000 B EIEXITI EXIT POINT FOR INTERRUPTS 83394000 EIOCA EQU * 83402000 LA R0,10 DECIMAL OVERFLOW 83404000 B EIEXITI EXIT POINT FOR INTERRUPTS 83406000 EIOC5A EQU * ADDRESSING ERROR ON BRANCH 83407000 LA R0,5 ADDRESSING ERROR CODE 83407050 B EIOC6B BRANCH TO UPDATE PSW 83407100 EIOC6A EQU * ODD BRANCH ADDRESS SPEC. ERROR 83407150 LA R0,6 SPECIFICATION ERROR CODE 83407200 EIOC6B EQU * FIX UP PSW ADDRESS AND ILC 83407250 L R1,ECPSWRT ADD TWO TO CURRENT PSW ADDRESS 83407300 LA R1,2(R1) INCREMENT IS AS IF AN RR IS FOUND 83407350 ST R1,EIRIA STORE NEW INSTRUCTION ADDRESS IN 83407400 MVC ECPSWIAD(3),EIRIA+1 TEMPORARY AND THEN MOVE TO PSW 83407450 NI ECILCMSK,X'3F' ZERO OLD ILC TO PREPARE FOR NEW ONE 83407500 OI ECILCMSK,X'40' NEW ILC INDICATES AN RR INSTR FOUND 83407550 B EIEXITI EXIT POINT FOR INTERRUPTS 83407575 SPACE 5 83408000 * ENTERED WHEN PROGRAM BRANCHES OUT OF RANGE 83410000 EIIAOUT EQU * 83412000 VIRT YES=EIOC5A 83413000 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 AIF (NOT &$VIRT).VIWAIT1 IF NOT VIRT, CANCEL 83454000 SPACE 3 83454100 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83454150 * EXCESSIVE WAIT TIME: NO I/O NOR EVENT IN PROGRESS 83454200 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83454400 VIEXWAIT LA R1,EICCWT FOR EXCESSIVE WAIT=TIME OVERRUN 83454500 MVI ECFLAG1,$ECVIWT SHOW EXCESSIVE SYSTEM WAIT TIME 83454600 L RCC,ECPSWRT BE SURE ILC&CC ARE RIGHT 83454650 B EIITIA 83454700 .VIWAIT1 ANOP 83454800 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 BALR R1,0 TEMPORARY ADDRESSABILITY IN ORDER 83470000 USING *,R1 TO REGAIN POSSIBLE LOST BASE REGS. 83470500 LM R12,R13,EISPBASE RESTORE BASE REGISTERS IN CASE WRONG 83471000 DROP R1 REMOVE TEMPORARY ADDRESSABILITY 83471500 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' ZERO INCORRECT ILC 83488000 NI ECILCMSK,X'C0' ZERO INCORRECT CC AND PM 83490000 O RCC,ECPSWRT MERGE TOGETHER TO FORM CORRECT PSW 83492000 ST RCC,ECPSWRT PLACE IN PSEUDO PSW 83494000 AIF (NOT &$VIRT).VIOCX 83499100 VIRT NO=EITSTST NO INTERRUPT IN NON VIRT MODE 83499125 * IF IN VIRT MODE THEN SIMULATE PSW SWAP DUE TO A PROGRAM 83499150 * INTERRUPT PROVIDED WE ARE IN EXECUT, ELSE TERMINATE 83499200 SPACE 83499210 CLI VIABFLAG,0 IF OC WAS NOT IN EXECUT THEN WE 83499212 BNE VISPSNAP SNAP REGISTERS 83499214 CLI ECFLAG1,0 CHECK IF THIS WAS AN OC ERROR. 83499216 BNE EITSTST IF NOT, THEN CONTINUE TERMINATION 83499218 CLC ECREG0,VISPFF00 ELSE, OC ERROR OCCURRED. SKIP SNAP 83499220 BNE VISIMOC IF USER R0 IS NOT X'FF00FF00' 83499222 VISPSNAP SR R1,R1 BEFORE SNAP, SET R1 TO CONTAIN VALUE 83499224 IC R1,VIABFLAG OF VIABFLAG - INDICATES WHERE AT 83499226 XSNAP T=(PR,,0),LABEL='OC - INTERRUPT IN ASSISTV' 83499228 CLI VIABFLAG,0 IF WE ARE NOT IN EXECUT, THEN SKIP 83499230 BNE VIOCWHO PROGRAM INTERRUPT SIMULATION 83499232 VISIMOC OI VIPEND+1,VIPGMINT MARK OC-X INTERRUPT AS PENDING 83499234 NI VIPROSTS,255-VIPROLOK-VIINOCUR UNLOCK PROLOG 83499236 B EIFIN1 GO TO PROLOG TO PERFORM PSW SWAP 83499238 SPACE 83499239 VISPFF00 DC 0F'0',XL4'FF00FF00' USER R0 SETTING FOR OC SNAP 83499240 SPACE 83499241 VIOCWHO EQU * CHECK WHERE INTERRUPT OCCURRED 83499242 TM VIABFLAG,VIABPAS0+VIABPAS1+VIABPAS2+VIABINTR 83499244 BZ EITSTST IF IN VIRTIO THEN DUMP I/O TABLES 83499246 XSNAP T=(NO,,0),LABEL='VIRTIO TABLES', X83499248 STORAGE=(*0(8),*64(8),*0(9),*100(9)) 83499250 .VIOCX ANOP 83499500 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 CLI ECFLAG1,0 CHECK IF OC INTERRUPT 83524300 BNE EIITAILC NO, DON'T CHECK FOR USER SPIE 83524600 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 AIF (NOT &$VIRT).VIECRET VIRT NOT ALLOWED, NO STATS 83560020 TM ECFLAG4,AJOVIRT IF NOT VIRT MODE THEN NO STATS 83560040 BZ VIECRET SO CONTINUE RETURN 83560060 L R2,VICLOCK IF THIS SIMULATION WAS FOR 0 TIME 83560080 LTR R2,R2 THEN NO MEANINGFUL STATS EXIST. 83560100 BNP VIECRET HENCE RETURN TO MONITOR 83560120 $PRNT VISTATTL,L'VISTATTL,VIECRET PRINT TITLE FOR STATS 83560140 MVI VICRSTAT,X'FF' FORCE A CHANGE OF STATUS 83560160 XC VICRSTAT,VILASTAT IN ORDER TO CLEAN UP VALUES IN 83560180 BAL RLINK,VISTATS STATISTICS COUNTERS 83560200 SPACE 83560220 * CREATE STAT ENTRIES FOR PERCENTAGES * 83560240 SPACE 83560260 LM R7,R11,=A(VISTATAB,4,VISTABND-4,VISTADR,1000) BXLE VALS 83560280 VISTCONV L R1,0(R7) GET NEXT PERCENTAGE TYPE VALUE 83560300 MR R0,R11 SCALE IT BY 1000 83560320 DR R0,R2 GET PERCENTAGE OF TIME VALUE(SCALED) 83560340 CVD R1,VISTDBL CONVERT TO PRINTABLE FORM 83560360 MVC VISTEDIT(7),VISTED1 GET EDIT MASK 83560380 ED VISTEDIT(7),VISTDBL+5 EDIT INTO FORM XXX.X 83560400 L R3,0(R10) GET ADDRESS OF NEXT PRINT AREA 83560420 MVC 0(5,R3),VISTEDIT+2 MOVE PERCENT VALUE INTO LINE 83560440 LA R10,4(R10) INCREMENT TO NEXT PRINT AREA 83560460 BXLE R7,R8,VISTCONV LOOP ON ALL PERCENT VALUES 83560480 SPACE 83560500 * MOVE RAW VALUES INTO PRINT POSITIONS * 83560520 SPACE 83560540 LA R9,VISTCLK LOOP TO END OF ALL STAT VALUES 83560560 ST R2,VISTCLK COPY CLOCK INTO EXPECTED AREA 83560580 AIF (&VIDSK@# LE 0).VISTNDK SKIP IF NO DISK STATS 83560590 MVC VISTDK(8*&VIDSK@#),VISTDKSC MOVE IN DISK STATS 83560600 .VISTNDK ANOP 83560610 VISTRAW L R1,0(R7) GET NEXT VALUE 83560620 CVD R1,VISTDBL CONVERT TO PRINTABLE FORM 83560640 MVC VISTEDIT(12),VISTED2 COPY EDIT MASK 83560660 ED VISTEDIT(12),VISTDBL+2 EDIT TO 12 CHARACTER VERSION 83560680 L R3,0(R10) GET ADDRESS POF NEXT PRINT AREA 83560700 MVC 0(10,R3),VISTEDIT+2 MOVE UP TO 10 DIGITS TO PRINT 83560720 LA R10,4(R10) INCREMENT TO NEXT PRINT AREA 83560740 BXLE R7,R8,VISTRAW LOOP TO END OF ALL STATS 83560760 SPACE 83560780 * PRINT LINES WHICH WERE JUST PREPARED * 83560800 * VISTLADR IS A TABLE OF PAIRS EACH OF FORM * 83560820 * == LINE ADDRESS == == LENGTH OF LINE == * 83560840 SPACE 83560860 LM R7,R9,=A(VISTLADR,8,VISTLEND-8) SET FOR BXLE 83560880 VISTPRNT LM R0,R1,0(R7) GET LINE ADDRESS AND LENGTH 83560900 $PRNT (R0),(R1),VIECRET PRINT NEXT LINE 83560920 BXLE R7,R8,VISTPRNT LOOP THRU ALL LINES 83560940 VIECRET EQU * CONTINUE RETURN TO MONITOR 83560960 SPACE 83560980 .VIECRET ANOP 83561000 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 CLI ECFLAG1,$ECTIMEX CHECK IF TIME HAS EXPIRED 83572100 BNE EIECRET1 NO; ERROR MESSAGE @ OK 83572200 LA R1,EICCTIMB ELSE GET ERROR MSG. @ FOR TIME 83572300 ST R1,ECERRAD SAVE MESSAGE ADDRESS 83572400 EIECRET1 DS 0H TERMINATION IMMINENT 83572500 $RETURN RGS=(R14-R12) 83574000 * NEED FOLLOWING IN CASE OF INTERRUPT OUTSIDE OF EXECUT 83575000 EISPBASE DC A(EIECSAVE+4096,EIECSAVE) R12,R13 BASE REGS VALUES 83575500 AIF (NOT &$VIRT).VISTTAB 83576000 EJECT 83576020 * TABLES USED TO PRINT OUT STATISTICS IN VIRTUAL MODE * 83576040 * ARE ALL LOCATED HERE * 83576060 SPACE 83576080 * STATES FOR WHICH WE ARE TO KEEP STATISTICS TIMERS * 83576100 VISTMASK DC AL1(VISTBUSY,VISTSVST+VISTBUSY,VISTPBST+VISTBUSY) 83576120 DC AL1(VISTCH0,VISTCH1,VISTCH2) 83576140 DC AL1(VISTCH0+VISTBUSY,VISTCH1+VISTBUSY,VISTCH2+VISTBUSY) 83576160 VISTAB#1 EQU *-VISTMASK NUMBER OF TIMERS TO BE MAINTAINED 83576180 VISTCH0 EQU B'10000000' CHANNEL 0 MASK 83576200 VISTCH1 EQU B'01000000' CHANNEL 1 MASK 83576220 VISTCH2 EQU B'00100000' CHANNEL 2 MASK 83576240 VISTBUSY EQU B'00000100' CPU BUSY MASK 83576250 VISTSVST EQU B'00000010' SUPERVISOR STATE MASK 83576260 VISTPBST EQU B'00000001' PROBLEM STATE MASK 83576280 VISTATAB DS (VISTAB#1)F RESERVE SPACE FOR STAT TIMERS 83576320 VISTABND EQU * END OF TIMERS - USED IN BXLES 83576340 VISTDK DS (2*&VIDSK@#)F AREA FOR DISK STATS. 1 PAIR/DISK 83576360 VISTCLK DS F VICLOCK MOVED HERE FOR FINAL STATS 83576380 SPACE 83576400 * PRINT LINES AND RELATED STORAGE AREAS USED IN * 83576420 * FINAL VIRTUAL MODE STATISTICS PRINT OUT * 83576440 SPACE 83576460 * DATA AREA FOR CONVERSIONS * 83576480 VISTDBL DS D USED FOR CVD'S 83576500 VISTEDIT DS CL12 EDIT MASKS MOVED TO HERE 83576520 VISTED1 DC 0XL7'0',X'4020202120',C'.',X'20' MASK FOR PERCENTILES 83576540 VISTED2 DC XL12'402020202020202020202120' MASK FOR RAW VALUES 83576560 * HEADER AND SIMULATED TIME OUTPUT LINE * 83576580 VISTATTL DC C'0*** ASSIST-V FINAL STATISTICS ***' 83576600 VISTLN1 DC C' SIMULATED CLOCK TIME=' 83576620 VISTL1CK DC 10C'*',C' TIMER UNITS' CLOCK VALUE PLACED HERE 83576640 VISTL1$L EQU *-VISTLN1 LENGTH OF LINE 1 83576660 * CPU UTILIZATION LINE * 83576680 VISTLN2 DC CL23' CPU UTILIZATION:' 83576700 VISTL2CP VISTPER BUSY CPU UTILIZATION PLACED HERE 83576720 VISTL2SU VISTPER SUPER CPU UTIL. IN SUPER STATE 83576740 VISTL2PR VISTPER PROBLEM CPU UTIL. IN PROBLEM STATE 83576760 VISTL2$L EQU *-VISTLN2 LENGTH OF LINE 2 83576780 * CHANNEL UTILIZATION LINE * 83576800 VISTLN3 DC CL23' CHANNEL UTILIZATION:' 83576820 VISTL3C0 VISTPER CH0 CHANNEL 0 UTIL. PLACED HERE 83576840 VISTL3C1 VISTPER CH1 CHANNEL 1 UTIL. 83576860 VISTL3C2 VISTPER CH2 CHANNEL 2 UTIL. 83576880 VISTL3$L EQU *-VISTLN3 LENGTH OF LINE 3 83576900 * CPU/CHANNEL OVERLAP LINE * 83576920 VISTLN4 DC CL23' PROCESSOR OVERLAP:' 83576940 VISTL4C0 VISTPER CPU/CH0 CPU/CHANNEL 0 OVERLAP HERE 83576960 VISTL4C1 VISTPER CPU/CH1 CPU/CHANNEL 1 OVERLAP 83576980 VISTL4C2 VISTPER CPU/CH2 CPU/CHANNEL 2 OVERLAP 83577000 VISTL4$L EQU *-VISTLN4 LENGTH OF LINE 4 83577020 * DISK ARM MOVEMENT LINES (1 PER DISK) * 83577040 &$VIDSKF SETA 5 FIRST DISK STAT LINE# IS 5 83577050 VISTDKLN , CREATE MOVABLE HEAD DASD STAT LINES 83577060 SPACE 83577080 * CONTROL TABLE FOR WHERE TO PLACE CONVERTED STAT VALUES * 83577100 SPACE 83577120 VISTADR DC A(VISTL2CP,VISTL2SU,VISTL2PR) CPU UTIL. AREAS 83577140 DC A(VISTL3C0,VISTL3C1,VISTL3C2) CHANNEL UTIL. AREAS 83577160 DC A(VISTL4C0,VISTL4C1,VISTL4C2) CPU/CHANNEL OVERLAP AREAS 83577180 VISTDKAD , ADDRESSES FOR ENTRY OF STAT DATA 83577200 DC A(VISTL1CK) ADRESS FOR CLOCK VALUE 83577220 * ADDRESSES OF LINES TO BE PRINTED AND LINE LENGTHS * 83577240 VISTLINE , GENERATE PAIRS (LINE ADR., LENGTH) 83577260 .VISTTAB ANOP 83577280 EJECT 83577300 *********************************************************************** 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 * 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 AIF (NOT &$VIRT).VIFINB 83617000 MVI VITIMFAC+3,1 NOTE SUCCESSFUL BRANCH FOR TIMINGS 83618000 .VIFINB ANOP 83620000 LA RIA,0(RIA) REMOVE 1ST BYTE OF BRANCH @ 83622000 ST RIA,EIRIA SAVE CURRENT INSTR. ADDR. CEH 83623000 MVC ECPSWIAD,EIRIA+1 SET IAD TO REFLECT NEXT INSTR. ADDR 83623500 SPACE 1 83623510 * IF TIMER RUNOUT OCCURS, ASSIST SETS ECFLAG1=$ECTIMEX 83623520 EIFIN EQU * CHECK FOR TIMER RUNOUT 83623530 AIF (&$TIMER EQ 0).EINOTOA SKIP IF NO TIMER AT ALL 83623540 CLI ECFLAG1,$ECTIMEX HAS TIMER RUNOUT OCCURRED? 83623550 BNE EIFIN0 NO, FETCH AND PROCESS NEXT INSTR. 83623560 * FLAG EXISTING TIMER RUNOUT AND HALT RUN. 83623570 LA R1,EICCTIMB GET @ OF TIMER EXPIRED MESSAGE 83623580 B EIITIA JUMP TO EXIT SECTION 83623590 AGO .EINOTOB CONTINUE CHECK ON INSTRUCTION 83623600 .EINOTOA ANOP , NO TIMER: CATCH WITH INSTR. COUNT 83623610 B EIFIN0 FETCH AND EXAMINE NEXT INSTR. 83623620 .EINOTOB ANOP , 83623630 SPACE 1 83623640 * CHECK IF INSTRUCTION ADDRESS IS LEGAL 83623650 EIFIN0 DS 0H 83623660 L RIA,ECPSWRT GET @ OF NEXT INSTRUCTION 83623670 LA RIA,0(RIA) ZERO FIRST BYTE 83623900 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 TM ECPSWIAD+2,EIALHALF IS NEXT INSTRUCTION AT HALFWORD 83632000 BO EIOC6A NO, THEN UPDATE PSW AND INDICATE OC6 83642000 SPACE 83648000 EJECT 83678000 EIFIN1 EQU * 83678020 N RCC,=XL4'3F000000' CLEAR INCORRECT ILC 83678022 NI ECILCMSK,X'C0' CLEAR INCORRECT CC AND PM 83678024 O RCC,ECPSWRT MERGE TO FORM A GOOD PSW 83678026 ST RCC,ECPSWRT PLACE IN PSEUDO PSW 83678028 EIFIN2 EQU * COME HERE IF PSW OK 83678030 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83678040 * * 83678060 * HERE BEGINS THE PRIMARY INSTRUCTION FETCH/DECODE LOOP * 83678080 * * 83678100 * CONTROL IS PASSED TO EIFIN AFTER INTERPRETATION OF EACH * 83678120 * INSTRUCTION. * 83678140 * BRANCHES PASS TO EIFINB, AND THEN FLOW INTO EIFIN * 83678160 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83678180 AIF (NOT &$VIRT).VINOPRO SKIP PROGLOG IF NOT VIRT 83678200 SPACE 3 83678220 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83678240 * PROLOGUE FOR VIRT MODE * 83678260 * VIXTRATM IF LAST INSTRUCTION WAS EX THIS IS TIME OF EX * 83678280 * IF JUST FOUND PSW WAIT BIT ON, THIS IS TIME TO * 83678300 * NEXT EVENT * 83678320 * OTHERWISE IT IS ZERO * 83678340 * VIROP OPCODE OF INSTRUCTION * 83678360 * VITIMFAC FACTOR TO APPLY TO TIME (LENGTH, SUCCESS, ETC.) * 83678380 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83678400 VIPROLOG EQU * PROLOG TO VIRTUAL SIMULATION 83678420 TM ECFLAG4,AJOVIRT TEST IF IN VIRT MODE 83678440 BNO VIEIFIN IF NOT, GO PROCESS NEXT INSTR. 83678460 TM VIPROSTS,VIPROLOK IF WE HAVE ALREADY BEEN THRU PROLOG 83678465 BO VIEIFIN THEN DO NOT WASTE TIME REDOING IT 83678470 OI VIPROSTS,VIPROLOK PREVENT REENTRY TO PROLOG 83678475 L R4,VIXTRATM GET UNACCOUNTED-FOR TIME 83678480 SR R1,R1 CLEAR FOR IC 83678500 IC R1,VIROP PICK UP OPCODE 83678520 SLL R1,2 SHIFT FOR INDEX INTO 4 BYTE TABLE 83678540 L R7,=A(VITIMTAB) GET TIME OF MOST RECENT INSTR. 83678560 AH R4,0(R7,R1) AND ADD IT TO PREVIOUS RESIDUE 83678570 L R0,VITIMFAC GET FACTOR TO APPLY FOR LONG INSTR. 83678580 LTR R0,R0 CHECK IF MULTIPLICATION NEEDED 83678600 BZ VIADDRES 83678620 LH R1,2(R7,R1) GET INCREMENTAL TIME FACTOR 83678640 MR R0,R0 FORM NUMBER OF UNITS REL. TO LENGTH 83678660 AR R4,R1 ADD TO PREVIOUS COUNT THIS PASS 83678680 SPACE 1 83678700 VIADDRES A R4,VITIMRES ADD LEFTOVER FROM LAST PASS 83678720 MVI VIROP,0 SET OPCODE TO ZERO 83678760 XC VITIMQYS,VITIMQYS SHOW FACTOR ALSO ZERO 83678780 SPACE 3 83678820 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83679200 * EVENT HANDLING: POP EVENTS FROM EVENT LIST AS OFTEN AS CAN * 83679220 * CALL EVENT HANDLER FOR EACH EVENT NOW SO THAT MULTIPLE * 83679240 * EVENTS CAN OCCUR "SIMULTANEOUSLY" * 83679260 VINEXTEV L R7,VIEVENT GET LOWEST-TIMED EVENT 83679280 LTR R7,R7 CHECK IF IT IS TO OCCUR NOW 83679300 BNZ VITIMCHK NO EVENT; CHECK TIMER EXPIRATION 83679310 SPACE 1 83679315 * HANDLE ONE OR MORE EVENTS OCCURRING NOW 83679320 VINEXTV2 EQU * 83679325 L R7,VIEVENT+4 GET @ OF ROUTINE TO HANDLE EVENT 83679340 MVC VIEVENT(VIEVNUM*8-8),VIEVENT+8 MOVE ALL EVENTS DOWN ONE 83679360 OI VIEVENT+VIEVNUM*8-8,X'FF' MAKE SURE LAST EVENT MINUS 83679380 BALR RLINK,R7 CALL EVENT 83679400 BAL RLINK,VISTATS USDATE STATS IF NECESSARY 83679410 B VINEXTEV SEE IF NEXT EVENT TO OCCUR NOW, TOO 83679420 SPACE 3 83679425 * CHECK FOR TIMER EXCESSION 83679430 VITIMCHK EQU * CHECK VALUE OF LOC. 80 83679435 C R4,VITIMSCL R4 CONTAINS TIME (A) SINCE LAST X83679440 TIMER CLICK OR (B) 1 VITIMSCL IF DISCRETE TIME JUMP 83679445 BL VINODEC IF LESS THAN 1 SCALE UNIT, DONE 83679450 S R4,VITIMSCL ELSE DECREMENT TIMRES 83679455 SPACE 2 83679460 * COME HERE TO TICK LAST (ONLY) UNIT ON TIMER OR EVENT 83679465 VITIMCH2 EQU * 83679470 LA R0,1 USEFUL CONSTANT 83679472 L R7,VICLOCK UPDATE SIMULATION TIME 83679475 ALR R7,R0 ONE TIME UNIT HAS JUST PASSED 83679480 ST R7,VICLOCK RESTORE CLOCK 83679485 L R7,VITIMER GET VALUE AT LOC. 80 83679490 LTR R7,R7 CHECK IF TIMER IS ABOUT TO SOUND 83679495 BNZ *+12 NO, DON'T WORRY 83679500 OI VIPEND,B'00000001' ELSE SHOW EXT, INTERRUPT TO OCCUR 83679505 OI VIEXTPND+1,VITIMPND INTERRUPT CODE INDICATES TIMER 83679507 SLR R7,R0 DECREMENT TIMER BY 1 83679510 ST R7,VITIMER RESTORE USER'S LOC. 80 83679515 SPACE 1 83679520 * NOW PROCESS OCCURRANCE OF EVENTS 83679525 L R7,VIEVENT GET NEXT POSSIBLE EVENT 83679530 LTR R7,R7 GUARANTEED NO ZERO-TIME EVENTS 83679535 BM VINODEC IF NO EVENTS, DON'T TICK EV. LIST 83679540 SLR R7,R0 ELSE REDUCE TIME TO NEXT EV. BY 1 83679545 ST R7,VIEVENT REPLACE TIME TO OCCUR 83679550 LTR R7,R7 SET COND. CODE FOR EVENT 83679553 BZ VINEXTV2 BRANCH AND LET EVENT HAPPEN 83679555 SPACE 3 83679560 * ALL TIME EVENTS PROCESSED; CHECK FOR INTERRUPTS * 83679600 VINODEC ST R4,VITIMRES STORE RESIDUAL TIME FOR NEXT PASS 83679620 SPACE 5 83679640 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83679660 * CHECK FOR POSSIBLE INTERRUPTS * 83679680 * CALL ROUTINE VIINTCHK ONE OR MORE TIMES IF AN INTERRUPT * 83679700 * CAN BE ALLOWED TO OCCUR NOW * 83679720 * EACH TIME AN I/O OR EXTERNAL OCCURS WE MUST START I/O & * 83679740 * EXT CHECKING OVER AGAIN, SINCE SYSTEM MASK MAY DIFFER * 83679760 * IN NEW PSW, ALLOWING SOMETHING PREVIOUSLY SUPPRESSED * 83679780 * * 83679800 VITSTSUP TM VIPEND+1,VISVCINT CHECK IF SUPER. INT. PENDING 83679820 BZ VITSTPGM NO, THEN LOOK FOR PGM. PEND. 83679840 XI VIPEND+1,VISVCINT TURN OFF PENDING BIT 83679860 LA R7,VISVCMSK SHOW SUPER. INT. WILL OCCUR 83679880 BAL R2,VIINTGO CALL (SAME) RTN. TO EFFECT SURE INT. 83679900 VITSTPGM TM VIPEND+1,VIPGMINT TEST IF PROGRAM INT. READY TO OCCUR 83679920 BZ VITSTEXT NO, THEN LOOK FOR EXTERNAL INT. 83679940 XI VIPEND+1,VIPGMINT TURN OFF PGM INT. 83679960 LA R7,VIPGMMSK SHOW PGM INT. WILL OCCUR 83679980 BAL R2,VIINTGO CALL RTN. TO EFFECT SURE INT. 83680000 SPACE 2 83680020 VITSTEXT MVC *+7(1),ECSYSMSK CHECK SYS MASK TO SEE IF ANY PENDING 83680040 TM VIPEND,$ **CHANGED** /INT. IS ALLOWABLE 83680060 BZ VITSTWT IF NOT, GO CHECK FOR WAIT STATE. 83680080 LA R7,VITIMMSK SHOW SHOULD CHECK FOR TIMER INT. 83680100 BAL R2,VIINTCHK CALL ROUTINE TO CHECK FOR INT. 83680120 BNZ VITSTEXT IF INTERRUPT EFFECTED BEGIN AGAIN 83680130 LA R7,VICH2MSK SHOW SHOULD CHECK FOR CH#2 INT. 83680140 BAL R2,VIINTCHK CALL ROUTINE TO CHECK 83680160 BNZ VITSTEXT IF INTERRUPT EFFECTED, BEGIN AGAIN 83680180 LA R7,VICH1MSK SHOW SHOULD CHECK FOR CH#1 INT. 83680200 BAL R2,VIINTCHK CALL ROUTINE TO CHECK 83680220 BNZ VITSTEXT IF INTERRUPT EFFECTED, BEGIN AGAIN 83680240 LA R7,VICH0MSK SHOW SHOULD CHECK FOR CH#0 INT. 83680260 BAL R2,VIINTCHK CALL RTN TO CHECK FOR INT. 83680280 BNZ VITSTEXT IF INTERRUPT EFFECTED, BEGIN AGAIN 83680300 SPACE 1 83680320 * INTERRUPT CHECKING DONE; SEE IF MACHINE IS IN WAIT STAT* 83680340 VITSTWT TM ECKYAMWP,VIAMWPWT TEST IF IN WAIT STATE 83680360 BZ VIPLGEND IF NO, THEN END PROLOG PROC. 83680380 SPACE 3 83680400 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83680420 * MACHINE IS IN WAIT STATE * 83680440 * FIND LOWEST-TIMED EVENT AND DISCRETE TIME JUMP TO IT * 83680460 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83680470 LA R0,1 USEFUL CONSTANT 83680475 L R8,VITIMER GET VALUE IN USER LOC. 80 83680480 L R7,VIEVENT GET TIME TO NEXT EVENT 83680490 SLR R7,R0 WANT (TIME-1) TO NEXT EVENT 83680500 LTR R7,R7 SLR AVOIDS OVERFLOW, SET CC RIGHT 83680505 BM VITSTWT1 IF TIME TO EVENT NEG, USE TIMER 83680510 LR R9,R7 IF FALL THRU, AN EVENT IN FUTURE 83680520 LTR R8,R8 CHECK IF TIMER IS "DISABLED" 83680530 BM VITSTWT2 IF YES, THEN WILL USE EVENT TIME(^0) 83680540 * HERE BOTH TIMER AND (TIME-1) TO EVENT NON-NEGATIVE 83680550 CLR R9,R8 COMPARE (TIME-1) TO EVENT W/ TIMER 83680560 BNH VITSTWT2 R9 IS LOWER--CORRECT (BOTH > 0) 83680570 VITSTWT1 LTR R9,R8 ELSE MAKE R9 TIMER VALUE; CHECK IF - 83680580 BM VIEXWAIT BOTH ARE NEG==> EXCESSIVE WAIT TIME 83680590 SPACE 1 83680640 * NOT EXCESSIVE WAIT * 83680660 * BUMP CURRENT TIME AHEAD BY QUANTITY IN R9 * 83680680 VITSTWT2 L R7,VICLOCK UPDATE TIME SIMULATION HAS RUN 83680700 ALR R7,R9 INCREMENT 83680720 ST R7,VICLOCK RESTORE 83680740 L R7,VITIMER GET CONTENTS OF LOC. 80 83680760 SLR R7,R9 DECREMENT BY DISCRETE TIME QY. 83680780 ST R7,VITIMER RESTORE 83680800 SPACE 2 83680820 * RETURN TO MAJOR EVENT-RECOGNIZING LOOP * 83680840 * ZERO ALL QUANTITIES, SINCE HAVE JUST JUMPED TIME * 83680860 SR R4,R4 CLEAR REGISTER (WILL BE VITIMRES) 83680880 L R7,VIEVENT GET LOWEST TIMED EVENT 83680920 LTR R7,R7 SEE IF ONE REALLY EXISTS 83680940 BNP VITIMCH2 NO, GO BACK AND CHECK ON TIMER 83680960 SLR R7,R9 YES, DECREMENT TIME TO NEXT EVENT 83680980 ST R7,VIEVENT STORE EVENT LIST BACK 83681000 B VITIMCH2 HAVE TIMER OR EVENT HAPPEN 83681020 SPACE 3 83681040 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83681060 * CLEAN UP AND FLOW INTO MAIN INSTRUCTION DECODING LOOP * 83681080 VIPLGEND EQU * 83681100 SR R2,R2 CLEAR REG 83681120 B VIFIN BRANCH AROUND INTERNAL SUBS 83681200 EJECT 83681220 **--> INSUB: VIINTCHK CHECK FOR INTERRUPT OCCURRING * * * * * * * ** 83681240 * CHECK FOR INTERRUPT OCCURRING OR EFFECT INTERRUPT * 83681245 * ENTRY: R7 IS INDEX INTO VIINTTAB TABLE OF POSSIBLE INTERRUP* 83681250 * SERIES OF 4 BYTE OBJECTS: MASK TO CHECK, REL @ OF OLD * 83681255 * PSW, RELATIVE BRANCH TO CLEAN UP AFTER INTERRUPT, AND * 83681260 * (PRESENT CSW, ETC.), TYPE ( 0=PGM, 3=SUP, 6=EXT, 9=I/O)* 83681265 * EXIT: CC=0 ==> NO INTERRUPT OCCURRED * 83681270 * CC^=0 ==> INTERRUPT OCCURRED * 83681275 * VIPEND+1 HAS VIPNDINT BIT SET IF ANY HAS OCCURRED * 83681280 * SECOND ENTRY: VIINTGO EFFECTCERTAIN INTERRUPT (SUPERVISOR * 83681285 * OR PROGRAM) * 83681290 ** FIGURE OUT REGISTER SUSED LATER * 83681295 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83681300 VIINTCHK MVC *+7(1),0(R7) MOVE INTERRUPT MASK INTO TEST INST. 83681305 TM VIPEND,$ **CHANGED** TEST IF CURRENT INT PENDING 83681310 BCR Z,R2 IF NOT, RETURN NOW 83681315 MVC *+7(1),0(R7) INSERT MASK TO SEE IF THAT CAN OCCUR 83681320 TM ECSYSMSK,$ **CHANGED** TEST IF THAT IS NOT INHIBITED 83681325 BCR Z,R2 INHIBITED, RETURN 83681330 XC VIPEND(1),0(R7) TURN OFF INTERRUPT 83681335 SPACE 1 83681340 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83681345 **--> ENTRY: VIINTGO EFFECT AN INTERRUPT WHICH WILL OCCUR * 83681350 VIINTGO MVC VIINTAB,0(R7) MOVE CURRENT ENTRY TO TEMP. AREA 83681355 SR R8,R8 CLEAR FOR INSERT 83681360 IC R8,VINTOPSW GET REL. ADR. OLD PSW 83681365 ALR R8,RMEM GET THAT PSW FROM USER AREA 83681370 LA R9,VIPGMNEW-VIPGMOLD(R8) @ FOR NEW PSW ALSO 83681375 SPACE 1 83681380 * SWAP PSWS * 83681385 MVC 0(8,R8),ECPSW MAKE CURRENT PSW OLD ONE 83681390 MVC ECPSW,0(R9) MAKE NEW PSW CURRENT ONE 83681395 OI VIPROSTS,VIINOCUR RECORD FACT THAT A SWAP OCCURRED 83681400 SPACE 1 83681405 L RSTK,ECSTLINK NOTE THIS PSW SWAP IN INSTR. STACK 83681410 MVC ECSTIADD(4),4(R8) STACK ILC, CC, PM & IA OF OLD PSW 83681415 MVI ECVFLG,1 INDICATE THIS IS A PSW SWAP 83681420 SR R1,R1 CLEAR FOR INSERT 83681425 IC R1,VINTBRNM GET INTERRUPT TYPE CODE 83681430 LA R7,VINTRTB(R1) MOVE 4-BYTE AREA INTO STACK. LAST 83681435 MVC ECVTYP(4),0(R7) THREE BYTES ARE NAME OF INTERRUPT 83681440 SPACE 83681445 * CLEAN UP AS NECESSARY AFTER INTERRUPT * 83681450 SPACE 83681455 B VINTBRTB(R1) GET ADDR TO WHICH TO BRANCH 83681460 VINTBRTB B VINTIOFX I/O INT: CALL TO GET CSW PRESENTED 83681465 B VINTEXFX CLEAN UP INT. CODE AFTER EXT. INT. 83681470 NOP * NOTHING SPECIAL AFTER SVC 83681475 NOP * NOTHING SPECIAL SFTER PGM 83681480 SPACE 83681485 * TRACE CODE FOR PSW SWAPS * 83681490 SPACE 83681495 VIINTR0 TM ECPRFLG1,ECPRTRCE IS THE TRACE FACILITY ON? 83681500 BZ VIINNOTR NO, THEN CONTINUE SWAP PROCESS 83681505 TM VITRFLG3,VISTSVST+VISTPBST USER RESTRICTION ON STATE? 83681510 BNM VIINTR2 NO STATE RESTRICTION-CHECK INT TYPE 83681515 MVC VIINTR1+1(1),VICRSTAT ACQUIRE SYSTEM STATUS TO SEE IF 83681520 NI VIINTR1+1,X'03' IT MATCHES USER RESTRICTION OF 83681525 VIINTR1 TM VITRFLG3,$ **CHANGED** SUPER OR PROBLEM STATE ONLY 83681530 BNO VIINNOTR NO MATCH, SKIP TRACE 83681535 * SUPER OR PROBLEM STATE CONDITION MET, CHECK ON INT TYPE* 83681540 VIINTR2 TM VITRFLG3,VITRSWAP HAS USER REQUESTED ALL TYPES 83681545 BO VIINTR3 YES, THEN PERFORM SWAP TRACE 83681550 MVC *+7(1),0(R7) 0(R7) IS TYPE MASK, COMPARE IT WITH 83681555 TM VITRFLG3,$ **CHANGED** USER REQUESTED TRACE TYPES 83681560 BZ VIINNOTR NO MATCH, SKIP OVER TRACE 83681565 SPACE 83681570 * PERFORM TRACE, ALL CONDITIONS MET * 83681575 VIINTR3 MVC VIINTRCS(3),1(R7) TRACE MESSAGE NOW HAS INT NAME IN IT 83681580 L R7,0(R8) CONVERT LEFT SIDE OF OLD PSW TO 83681585 LA R1,VIINTRO1 PRINTABLE HEX. COMVERTED VALUE IS 83681590 BAL R10,VIINTHEX MOVED TO PROPER PLACE IN TRACE LINE 83681595 L R7,4(R8) CONVERT RIGHT SIDE OF OLD PSW TO 83681600 LA R1,VIINTRO2 PRINTABLE HEX. CONVERTED VALUE IS 83681605 BAL R10,VIINTHEX MOVED TO PROPER PLACE IN TRACE LINE 83681610 L R7,0(R9) CONVERT LEFT SIDE OF NEW PSW TO 83681615 LA R1,VIINTRN1 PRINTABLE HEX. CONVERTED VALUE IS 83681620 BAL R10,VIINTHEX MOVED TO PROPER PLACE IN TRACE LINE 83681625 L R7,4(R9) CONVERT RIGHT SIDE OF NEW PSW TO 83681630 LA R1,VIINTRN2 PRINTABLE HEX. CONVERTED VALUE IS 83681635 BAL R10,VIINTHEX MOVED TO PROPER PLACE IN TRACE LINE 83681640 L R7,VICLOCK GET SIMULATION TIME 83681645 LA R1,VIINTRTM INSERT HEX EQUIVALENT INTO 83681650 BAL R10,VIINTHEX TRACE LINE TO FORM TIME STAMP 83681655 $PRNT VIINTRMS,VIINTRML,EIXRECEX PRINT ASSEMBLED TRACE LINE 83681660 B VIINNOTR CONTINUE NORMAL INTERRUPT PROCESSING 83681665 SPACE 83681670 * MINI INTERNAL SUBROUTINE TO MINIMIZE STORAGE OVERHEAD * 83681675 * CAUSED BY MULTIPLE CALLS TO XHEXO SUBROUTINE. THIS * 83681680 * ROUTINE CONVERTS THE VALUE IN R7 TO PRINTABLE HEX * 83681685 * PLACING THE PRINTABLE VERSION IN THE 8 BYTES AT 0(R1) * 83681690 * R10 CONTAINS THE RETURN ADDRESS * 83681695 VIINTHEX XHEXO R7,0(R1) CONVERT TO PRINTABLE HEX 83681700 BR R10 RETURN TO CALLING PART 83681705 SPACE 83681710 * CONSTANT AREAS NEEDED BY PSW SWAP TRACE CODE * 83681715 SPACE 83681720 * TABLE OF INTERRUPT MASKS AND INTERRUPT NAMES * 83681725 VINTRTB DC AL1(VITRSWIO),CL3'I/O' I/O INT ENTRY 83681730 DC AL1(VITRSWEX),CL3'EXT' EXT INT ENTRY 83681735 DC AL1(VITRSWSV),CL3'SVC' SVC INT ENTRY 83681740 DC AL1(VITRSWPG),CL3'PGM' PGM INT ENTRY 83681745 SPACE 83681750 * PSW SWAP TACE MESSAGE IS ASSEMBLED INTO THIS AREA * 83681755 VIINTRMS DC C' TRACE--> TIME: ' START OF TRACE MESSAGE 83681760 VIINTRTM DC 8C'*',C' PSW SWAP--CAUSE=' TIME STAMP PLACED HERE 83681765 VIINTRCS DC CL3'***',C' INT. OPSW= ' INTERRUPT NAME PLACED HERE 83681770 VIINTRO1 DC CL8'*',C' ' LEFT SIDE OLD PSW PLACED HERE 83681775 VIINTRO2 DC CL8'*',C';' RIGHT SIDE OLD PSW PLACED HERE 83681780 DC C' NPSW= ' START NEW PSW PORTION 83681785 VIINTRN1 DC 8C'*',C' ' LEFT SIDE NEW PSW PLACED HERE 83681790 VIINTRN2 DC 8C'*' RIGHT SIDE NEW PSW PLACED HERE 83681795 VIINTRML EQU *-VIINTRMS LENGTH OF TRACE MESSAGE 83681800 VIINNOTR DS 0H BRANCH HERE TO CONTINUE PROCESSING 83681805 SPACE 83681810 * INSERT "SWAPPED" ENTRY IN BRANCH STACK * 83681815 L R1,ECBCUR GET POINTER TO BRANCH STACK 83681820 USING ECBRSTKD,R1 NOTE USING 83681825 L R1,ECBSLINK PICK UP LINK SO DSECT POINTS RIGHT 83681830 MVC ECBSTENT+4(L'ECBSTENT-4),ECSTENT+4 PUT IN BSTACK TOO 83681835 ST R1,ECBCUR STORE NEW CURRENT BSTACK POINTER 83681840 DROP R1 USING NO LONGER NEEDED 83681845 L R0,ECILIMT GET INSTRUCTION COUNT LIMIT 83681850 BCT R0,*+8 COUNT PSW SWAP AS 1 INSTR. ALSO 83681855 B EICNTINT WENT TO 0: CAUSE EXT. (COUNT) INT. 83681860 ST R0,ECILIMT RESTORE INSTR. COUNT LIMIT 83681865 C R0,ECPRCMPR SEE IF AT USER SPECIFIED LIMIT 83681870 BNE VINOCNSL IF NOT, CANNOT HAVE CONSOLE INT. 83681875 TM ECPRFLG4,ECLKADR IF USER DID NOT WANT CONSLOE INT. 83681880 BNO EICNTINT BUT SET LIMIT THEN WE SHOULD QUIT 83681885 OI VIPEND,B'00000001' USER REQUESTED EXTERNAL CONSOLE INT 83681890 OI VIEXTPND+1,VICONPND SET PENDING BIT AND INTERRUPT CODE 83681895 VINOCNSL EQU * 83681900 SPACE 1 83681905 * FIGURE OUT NEW STATE OF MACHINE-BUSY,PROBLEM,SUPERVISOR* 83681910 * **WARNING** THIS CODE IS CALLED FROM SECTION WHICH * 83681915 * HANDLES EXECUTION OF LPSW INSTRUCTION ******* * 83681920 VINTSTCK NI VICRSTAT,255-VISTSVST SHOW NOT SUPERVISOR STATE 83681925 OI VICRSTAT,VISTPBST+VISTBUSY GUESS BUSY AND IN PBLM STATE 83681930 TM ECKYAMWP,VIAMWPRB TEST IF REALLY PROBLEM 83681935 BO *+8 YES, GUESS WAS RIGHT 83681940 XI VICRSTAT,VISTPBST+VISTSVST NOT PBLM, YES SUPER. 83681945 TM ECKYAMWP,VIAMWPWT SEE IF THE MACHINE IS IN WAIT STATE 83681950 BZ *+8 IF NOT, WE'RE OK 83681955 NI VICRSTAT,255-VISTBUSY OTHERWISE, RESET BUSY BIT 83681960 VINTBRTN BAL RLINK,VISTATS CALL STATISTICS CALCULATOR 83681965 LTR RLINK,RLINK (GUARANTEED NON-ZERO) 83681970 BR R2 RETURN, SHOWING INTERRUPT HAS OCRD 83681975 VITIMMSK DC AL1(X'01',VIEXTOLD-LOWCORE@,4,0) EXTERNAL TIMER INT. 83681980 VICH2MSK DC AL1(X'20',VIIOOLD-LOWCORE@,0,2) I/O INT. CHANNEL#2 83681985 VICH1MSK DC AL1(X'40',VIIOOLD-LOWCORE@,0,1) I/O INT. CHANNEL 1 83681990 VICH0MSK DC AL1(X'80',VIIOOLD-LOWCORE@,0,0) I/O INT. CHANNEL 0 83681995 VISVCMSK DC AL1(X'00',VISVCOLD-LOWCORE@,8,0) SVC. INT. CONTROL 83682000 VIPGMMSK DC AL1(X'00',VIPGMOLD-LOWCORE@,12,0) PGM. INT. CONTROL 83682005 SPACE 1 83682010 VIINTAB DS 0XL4 INTERRUPT TABLE CURRENT ELEMENT 83682015 VINTMASK DS X MASK FOR PSW, ETC. 83682020 VINTOPSW DS AL1 REL. @ OF OLD PSW (REL. TO LOC. 0) 83682025 VINTBRNM DS AL1 INT. TYPE&BRANCH # FOR CLEAN UP 83682030 VINTCH# DS X CHANNEL# FOR I/O INTERRUPTS 83682035 SPACE 3 83682040 VINTIOFX L R15,=V(VIOINTFX) LOAD @ OF I/O RTN FIX-UP POINT 83682045 SR R0,R0 INSERT INTO R0 THE CHANNEL # ON 83682050 IC R0,VINTCH# WHICH THIS INTERRUPT OCCURRED 83682055 BALR RLINK,R15 CALL THAT RTN. TO GET CSW 83682060 SR R15,R15 CLEAR R15 (=ROP) 83682065 B VIINTR0 BRANCH BACK TO PERFORM TRACE 83682070 SPACE 1 83682075 VINTEXFX MVC VIEXTOLD+2(2),VIEXTPND INDICATE IN INT CODE WHAT TYPES 83682080 XC VIEXTPND,VIEXTPND OF EXTERNAL INTS. ZERO SAVED CODE 83682085 B VIINTR0 BRANCH BACK TO PERFORM TRACE 83682090 SPACE 3 83682095 **--> INSUB: VISTATS KEEP STATISTICS COUNTS * * * * * * * * * * * ** 83682540 * IN VIRT MODE KEEP STATISTICS ON EVENTS * 83682560 * ROUTINE CALLED EACH TIME THE CURRENT STATUS COULD HAVE * 83682580 * CHANGED, CAUSING DIFFERENT ACCUMULATIONS * 83682600 * MEANINGFUL STATES ARE RUN, SUPER, AND CH#N BUSY (0<=N<=2) * 83682620 * TABLES: MASKS (1 BYTE EACH) AND ACCUMULATIONS (FULL WD EACH)* 83682640 * ONE ENTRY FOR EACH INTERESTING COMBINATION * 83682660 * ROUTINE CALLED ON INTERRUPTS, CHANNEL COMMENCING ACTIVITY, * 83682680 * CHANNEL HALTING ACTIVITY * 83682700 * EXTERNAL ROUTINES WILL SET THE BITS IN VICRSTAT (CURRENT STAT* 83682720 * THIS ROUTINE WILL MAINTAIN VILASTAT (LAST STATUS), AND TIME * 83682740 * OF LAST STATUS CHANGE * 83682760 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 83682780 VISTATS XC VILASTAT,VICRSTAT SEE IF STATUS HAS REALLY CHANGED 83682800 BZ VISTEXIT NO, RETURN QUICKLY 83682820 L R9,VICLOCK GET CURRENT SIMULATION TIME 83682840 S R9,VILATIME GET LAST TIME STATUS CHANGED 83682860 BNP VISTEXIT IF ZERO, NOTHING TO ACCUMULATE 83682880 XC VILASTAT,VICRSTAT MUST RESET SINCE ABOVE XC DESTROYED #83682900 NOTE THAT 2 XCS ARE A NO-OP 83682920 SPACE 1 83682940 * GO INTO LOOP, CHECKING EACH CONDITION FOR WHICH A * 83682960 * MASK EXISTS * 83682980 LA R8,VISTATAB BEGIN. ADDR. OF STATS TABLE 83683000 LA R0,4 INCREMENT FOR BXLE 83683020 LA R1,VISTABND-4 END OF TABLE, LIMIT FOR BXLE 83683040 LA R7,VISTMASK GET ADDRESS OF SET OF MASKS 83683060 VISTLOOP MVC *+7(1),0(R7) MOVE IN MASK TO CHECK 83683080 TM VILASTAT,$ **CHANGED** SEE IF MONITORED CONDS. ON 83683100 BNO VISTBXLE SKIP IF NOT MONITORING THIS SET 83683120 LR R10,R9 GET COPY OF TIME SINCE LAST CHANGE 83683140 AL R10,0(R8) ADD PREVIOUS ACCUMULATED VALUE 83683160 ST R10,0(R8) STORE NEW ACCUMULATED VALUE 83683180 VISTBXLE LA R7,1(R7) INCREMENT TO NEXT MASK 83683190 BXLE R8,R0,VISTLOOP LOOP TO NEXT ENTRY 83683200 SPACE 1 83683220 * WHEN FALL OUT, THEN ALL STATS COUNTED * 83683240 * PRESERVE CURRENT TIME, AND MAKE CURRENT STATUS "LAST" * 83683260 MVC VILATIME,VICLOCK MAKE CURRENT TIME "LAST" STATE CHG. 83683280 VISTEXIT MVC VILASTAT,VICRSTAT MAKE CURRENT STATUS "LAST" ONE 83683300 BR RLINK RETURN 83683320 SPACE 2 83683590 VIPROSTS DS X PROLOG STATUS BYTE 83683595 VIPROLOK EQU B'10000000' LOCKED OUT OF PROLOG 83683597 VIINOCUR EQU B'01000000' PROLOG EFFECTED AN INTERRUPT 83683598 VITIMSCL DC F'1000' ONE SCALED TIMER UNIT 83683599 SPACE 2 83683600 VIFIN TM VIPROSTS,VIINOCUR CHECK IF AN INTERRUPT HAS OCCURRED 83683605 BZ VIEIFIN NO, THEN PROCEED NORMALLY 83683610 L RIA,ECPSWRT ELSE, GET NEW INSTR. @ FROM PSW 83683615 LR RCC,RIA COPY NEW CC/PROGRAM MASK 83683620 SPM RCC MAKE NEW CC ACTUAL 83683625 B EIFIN CHECK @ IN NEW PSW FOR LEGALITY 83683630 SPACE 2 83683635 VIEIFIN EQU * END OF VIRT PROLOG 83683640 NI VIPROSTS,255-VIPROLOK-VIINOCUR UNLOCK PROLOG, NO INT. 83683642 EJECT 83683645 .VINOPRO ANOP 83683800 LR RIA,RCC RESTORE INSTR. @ REG. 83708000 * CHECK FOR EXCEEDING TOTAL INSTRUCTION COUNT 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 AIF (NOT &$VIRT).VICNT1 83732210 TM ECFLAG4,AJOVIRT ARE WE IN VIRT MODE 83732220 BZ VICNT1 NO TREAT AS SPECIAL ASSIST EXIT 83732230 OI VIPEND,B'00000001' SET PENDING EXTERNAL INTERRUPT 83732240 OI VIEXTPND+1,VICONPND NOTE INT. CODE SHOWS CONSOLE INT. 83732245 B EICLKOK REJOIN NON VIRT CODE 83732250 .VICNT1 ANOP 83732260 VICNT1 L RIA,ECPRCLEA PREPARE TO BRANCH TO USER EXIT 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 ST RIA,ECSTIADD SAVE ILC,PM,CC,INSTR ADDRESS 83744000 MVI ECVFLG,0 INDICATE THIS IS NOT A PSW SWAP 83745000 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 AIF (NOT &$VIRT).VINOROP 83755000 STC ROP,VIROP SAVE OPCODE AS INDEX FOR TIMING 83755200 .VINOROP ANOP 83755400 SR R1,R1 R1 IS ZERO FOR IC 83756000 L R7,=A(EIOPCDTB) GET POINTER TO OPCODE TABLE 83758000 IC R1,0(R7,ROP) FETCH POINTER TO MAIN TABLE 83759000 SLL R1,3 MULTIPLY BY 8 FOR MAIN TAB INDEX 83760000 L R7,=A(EICONTAB) GET ADDRESS OF MAIN TABLE 83762000 AR R1,R7 GET ADDRESS OF CONTROL TABLE ENTRY 83763000 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 MVI EICTB1,0 OPCODE IS INVALID BY DEFAULT 83775000 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 EICHKF$A BRANCH 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 EICHKF$A 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 N RIA,=X'3FFFFFFF' CLEAR ILC FROM RIA 83832500 SLL R2,29 GET CORRECT ILC IN R2 83833000 OR RIA,R2 BUILD CORRECT RIGHT SIDE OF PSW 83833500 ST RIA,ECPSWRT AND SAVE IN PSEUDO PSW AREA 83834000 SR R2,R2 RESET R2 AS A BYTE REGISTER 83834500 SPACE 2 83835000 * 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 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 AIF (NOT &$VIRT).VICHKS1 SKIP STATE CHECK IF NOT VIRT 83860000 BNO EI2BDECD IF NOT A PRIVELEGED OP, PROCEED 83860100 TM ECFLAG4,AJOVIRT ELSE CHECK IF IN VIRT MODE 83860200 BNO EIOC2 IF NOT IN VIRT MODE THEN OC2 83860300 TM ECKYAMWP,VIAMWPRB ELSE CHECK IF IN PROBLEM MODE 83860400 .VICHKS1 BO EIOC2 BRANCH FOR OC2 IF IN PROBLEM MODE 83860500 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 EIXDUMPR SKIP EXTRANEOUS DECODING 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 AIF (NOT &$VIRT).VILLTIM 83897000 LA RWK0,3(R7,R9) SS DECIMAL -- AVERAGE OF TWO LENGTHS 83897100 SRL RWK0,1 USED TO COMPUTE EXTRA TIME FACTOR TO 83897200 ST RWK0,VITIMFAC BE USED IN ESTIMATING CPU TIME 83897300 .VILLTIM ANOP 83897600 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 EIOC6 OC6 DUE TO ALIGNMENT ERROR 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 AIF (NOT &$VIRT).VI3HDEC 84183000 TM EICTB3,EIB2IORL IF THIS IS AN SS LOG. THEN SAVE 84183100 BNO VI3HDECD LENGTH FOR TIMING ESTIMATE 84183200 LA RWK0,1(R7) GET LENGTH RATHER THAN LENGTH CODE 84183250 ST RWK0,VITIMFAC 84183300 VI3HDECD EQU * 84183400 .VI3HDEC ANOP 84183500 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 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 LA RWK0,1(R7) GET LENGTH OF SINGLE LEN MOD. 84204000 TM EICTB3,EIB2IORL TEST TO FIND LENGTH TYPE 84206000 BO *+8 IF ONLY ONE LENGTH, DONE 84208000 LA RWK0,1(R9) ELSE GET LEN. OF 2ND OPERAND 84210000 IC R2,EICTB3 GET BYTE SHOWING TYPE OF CHECKING 84212100 SLL R2,2 SHIFT SO 2ND OPD. IS IN 1ST OPD POSN 84212200 STC R2,EICTB3 RETURN BYTE; PROCEED AS FOR 1ST OPD 84212300 BAL RLINK,EIMSFCHK CALL RTN. TO CHECK STORAGE MOD. 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 ALR RAD1,RMEM RELOCATE 1ST FAKE @ TO REAL 84254000 ALR 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 * 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 AIF (NOT &$XIOS).EINOTRC 84307000 LA R2,0(RIA) ACQUIRE ADDRESS PORTION OF INSTR 84307200 TM ECPRFLG1,ECPRIECF IS THE IECF ACTIVE NOW? 84308000 BNO EITRICB IF NOT ON GO SEE IF TRACE IS ON 84310000 C R2,ECPRICH CMPR INSTR @ WITH HIGH ADDR LIMIT 84312000 BH EITRICB BRANCH IF OUT OF RANGE 84314000 C R2,ECPRICL CMPR INSTR @ WITH LOW ADDR LIMIT 84316000 BL EITRICB BRANCH IF OUT OF RANGE 84318000 LR RWK1,R2 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 R2,ECPRTRAH COMPARE INSTR @ WITH HIGH LIMIT 84356000 BH EIINCPSW BRANCH IF OUT OF RANGE 84358000 C R2,ECPRTRAL COMPARE INSTR @ WITH LOW LIMIT 84360000 BL EIINCPSW BRANCH IF OUT OF RANGE 84362000 AIF (NOT &$VIRT).VITRIC IF NO VIRT THEN NO SPECIAL CHECKS 84363000 SPACE 3 84363020 * IN VIRT MODE WE MUST CHECK TO SEE IF THE USER GIVEN * 84363040 * CONDITIONS ARE MET BEFORE PRINTING TRACE * 84363060 SPACE 84363080 TM ECFLAG4,AJOVIRT IF WE ARE NOT IN VIRT MODE 84363100 BZ VITRICND THEN RESUME TRACING, NO RESTRICTIONS 84363120 * CHECK FOR USER SPECIFIED RESTRICTION ON SYSTEM STATE * 84363140 TM VITRFLG4,VISTSVST+VISTPBST USER RESTRICTION ON STATE? 84363160 BNM VITRICAL NO STATE RESTRICTION, CHECK OTHERS 84363180 MVC VITRICST+1(1),VICRSTAT ACQUIRE SYSTEM STATUS TO SEE IF 84363200 NI VITRICST+1,X'03' IT MATCHES USER RESTRICTION OF 84363220 VITRICST TM VITRFLG4,$ **CHANGED** SUPER OR PROBLEM STATE ONLY 84363240 BNO EIINCPSW NO MATCH , SKIP TRACE 84363260 * SUPER OR PROBLEM STATE CONDITION MET, CHECK INSTR TYPE * 84363280 VITRICAL TM VITRFLG4,VITRALL IF WE ARE TO TRACE ALL INSTRS. 84363300 BO VITRICND THEN NO FURTHER TESTING IS NEEDED 84363320 * HANDLE USER REQUEST FOR BRANCH TRACING * 84363340 TM VITRFLG4,VITRBRCH DOES USER WANT TO TRACE BRANCHES? 84363360 BZ VITRICMO NO, SEE ABOUT MODIFY OPERATIONS 84363380 TM EICTB3,EIBRINST YES, IS THIS A BRANCH TYPE? 84363400 BO VITRICND YES, TRACE IT 84363420 CLI ECOP,X'82' TREAT LPSW AS A BRANCH 84363440 BE VITRICND TRACE IF AN LPSW 84363460 * HANDLE USER REQUEST FOR STORAGE MODIFICATION TRACE * 84363480 VITRICMO TM VITRFLG4,VITRSTOR DOES USER CARE ABOUT MODIFIES? 84363500 BZ VITRICPR NO, HOW ABOUT PRIVELEGED OPS 84363520 TM EICTB3,EI1STORE IS FIRST OPERAND REF A STORE 84363540 BO VITRICND YES, THEN TRACE THIS 84363560 TM EICTB3,EI2STORE NO, HOW ABOUT SECOND OPERAND 84363580 BO VITRICND YES, THEN TRACE. 84363600 * HANDLE USER REQUEST FOR PRIVELEGED OPERATION TRACE * 84363620 VITRICPR TM VITRFLG4,VITRPRIV DOES USER CARE ABOUT PRIV OPS? 84363640 BZ EIINCPSW NO, THEN NO TRACE OF THIS INSTR 84363660 TM EICTB1,EIPRIVOP IS THIS A PRIVELEGED OPERATION? 84363680 BZ EIINCPSW NO, THEN NO TRACE OCCURS 84363700 VITRICND EQU * TRACE WILL NOW BE CARRIED OUT 84363720 .VITRIC ANOP 84363740 MVC EITRMSIN+4(10),EIBLANKS BLANK OUT INSTR AREA 84364000 XHEXO R2,EITRMSAD CONVERT INSTR @ TO HEX 84366000 MVC EITRMSAD(2),EIBLANKS BLANK OUT 1ST TWO BYTE OF @ 84368000 LM R0,R1,ECSTINST-2 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,EIXRECEX 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 .EINOTRC ANOP 84409000 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 EIFIN 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,EIFIN GET CC, RETURN FOR NEW INSTR 84454000 SPACE 2 84456000 * THIS SECTION PROCESSES THE BALR INSTRUCTION 84458000 EIBALR EQU * 84460000 ST RIA,ECREGS(R7) FAKE REGISTER GETS PSW 84470000 LTR R9,R9 TEST FOR NO BRANCHING R2 = 0 84472000 BZ EIFIN NO BRANCH. GO BACK TO 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 EIFIN IF ZERO, NO BRANCH 84494000 LTR R8,R8 IS DECREMENTED VALUE = 0 ? 84496000 BZ EIFIN 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 EIFIN 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 EIFIN 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,EIFIN GET CC AND RETURN FOR NEXT INSTR 84560000 .EIFPRR2 ANOP 84562000 AIF (&$S370 NE 0).EILONG0 IF 370 OPS OK THEN DO GENERATION 84562200 EILONG EQU EIOC1 NO 370 OPS ALLOWED. FLAG AS OC1 84562400 AGO .EILONG3 SKIP PAST CODE FOR OTHER VERSIONS 84562600 .EILONG0 ANOP 84562800 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 EIFIN RETURN FOR NEXT INSTR 84874000 EIPAD EQU EIMVCL4+1 MVCL/CLCL PAD BYTE IS MOVED HERE 84876000 .EILONG2 ANOP 84878000 .EILONG3 ANOP 84878500 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 LR RCC,R8 GET NEW CC AND PM FROM USER REGISTER 84888000 SPM RCC SET REAL CC-PM TO FAKE CC-PM 84890000 B EIFIN RETURN FOR NEXT INSTRUCTION 84892000 SPACE 1 84894000 * THE FOLLOWING CODE PROCESSES ISK AND SSK 84896000 EISSK EQU * SSK AND ISK BOTH ENTER HERE 84896200 EIISK EQU * 84896400 AIF (NOT &$VIRT).VIISSK 84896600 LA R9,ECREGS+3(R9) GET @ OF LOW BYTE OF USER REG. 84896650 TM 0(R9),B'00001111' CHECK IF ANY OF BITS 28-31 ARE 1'S 84896800 BNZ EIOC6 THEN FLAG AS AN OC6 84897000 N R10,=X'00FFF800' MAKE CONTENTS OF R10 A TRUE 2K ADDR 84897200 C R10,ECFADH IF THE 2K BLOCK ADDRESS IS TOO HIGH 84897300 BNL EIOC5 THEN FLAG AS OC5 84897400 SRL R10,11 GET 2K BLOCK NUMBER AND THEN 84897600 A R10,ECRADH CALCULATE THE KEY ADDRESS 84897800 CLI ECOP,X'09' IF THIS AN ISK 84898000 BE VIISK TNEH BRANCH TO COMPLETE 84898200 * SSK COMPLETED HERE (360 MODE ONLY) 84898400 STC R8,0(R10) STORE PROTECT KEY (ALL 8 BITS) 84898600 NI 0(R10),B'11111000'+$CHG370 ZERO LOWER 3 BITS 84898800 B EIFIN FETCH AND EXECUTE NEXT INSTR. 84899000 * ISK COMPLETED HERE (360 MODE ONLY) 84899200 VIISK IC R8,0(R10) INSERT PROTECT KEY (ALL 8 BITS) 84899400 N R8,=X'000000F8' ZERO LOWER 3 BITS 84899600 STC R8,ECREGS+3(R7) PLACE IN LOWER BYTE OF REGISTER 84899800 B EIFIN FETCH AND EXECUTE NEXT INSTR. 84900000 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 .VIISSK ANOP 84920000 * INSTRUCTION IS FLAGGED AS AN OC2 IF WE ARE NOT IN VIRT 84921000 * MODE OR IF VIRT MODE IS NOT ALLOWED 84922000 SPACE 2 84924000 EISVC EQU * 84926000 AIF (NOT &$VIRT).VISVC 84928000 OI VIPEND+1,VISVCINT NOTE A PENDING SVC INTERRUPT 84930000 STH R7,ECINTCOD PUT SVC # IN CURRENT(==>OLD) PSW 84932000 B EIFIN FETCH AND EXECUTE NEXT INSTRUCTION 84934000 .VISVC ANOP 84936000 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 EIFIN 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,ECPSWRT GET ADRESS OF NEXT SEQUENTIAL INSTR 85000000 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 MVI ECVFLG,0 INDICATE THIS IS NOT A PSW SWAP 85073000 MVC ECSTINST,0(RAD1) GET UP TO 6 BYTES OF INSTR 85074000 IC ROP,ECOP GET OPCODE INTO REGISTER 85076000 SLR RAD1,RMEM DE-RELOCATE INSTR ADDR 85078000 ST RAD1,ECSTIADD SAVE INSTR ADDR FOR DUMP 85080000 MVC ECSTIADD(1),ECILCMSK SAVE CORRECT ILC,CC AND PM 85080500 AIF (NOT &$VIRT).VIEX 85081000 MVI VIXTRATM+3,1 NOTE EXTRA TIME DUE TO EXECUTE 85081200 .VIEX ANOP 85081400 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,ECPSWRT RELOAD CORRECT NEXT INSTR ADDR 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 SLR 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 SLR RWK1,RMEM DE-RELOCATE THE SCAN PTR 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 AIF (NOT &$VIRT).VIPRIV1 IF NOT VIRT, PRIV OPS ARE ERROR 85399000 EIIOS VIRT NO=EIOC2 PRIV EXCEPT. IF NOT VIRT MODE 85400000 L R7,=V(VIRTIO) CALL I/O SUPPORT ROUTINE 85400020 BALR R14,R7 CALL SUPPORT ROUTINE 85400040 BAL RLINK,VISTATS UPDATE STATS IF NECCESSARY 85400050 B EIFIN RETURN TO MAIN INSTR. DECODE LOOP 85400060 EIP370 EQU EIOC2 370 PRIV. OPS. NOT IMPLEMENTED YET 85406240 SPACE 2 85440000 * SET SYSTEM MASK (SSM) IMPLEMENTED HERE 85440200 EISSM EQU * SET SYSTEM MASK 85440400 MVC ECSYSMSK,0(RAD1) MOVE IN GIVEN SYSTEM MASK 85440600 B EIFIN INSTRUCTION EXECUTION DONE 85440800 SPACE 2 85441000 * LOAD PSW (LPSW) IMPLEMENTED HERE 85441100 EILPSW EQU * LOAD PSW 85441200 MVC ECPSW,0(RAD1) MOVE IN GIVEN PSW 85441300 L RIA,ECPSWRT SET RIA TO POINT TO THE NEXT INSTR. 85441350 LR RCC,RIA SET RCC TO THE NEW PROGRAM MASK 85441400 SPM RCC COPY INTO THE REAL PROGRAM MASK 85441440 BAL R2,VINTSTCK UPDATE STATS IF THIS CHANGED STATUS 85441460 B EIFINB RETURN AS IF THERE WERE A BRANCH 85441480 AGO .VIPRIV2 DONE WITH PRIVILEGED OPS 85441490 .VIPRIV1 ANOP , NON-VIRT: PRIV. OPS = 0C2 ERRS 85441500 EIIOS EQU EIOC2 ALL I/O INSTRS. ARE PRIVL'D 85441600 EIP370 EQU EIOC2 370 PRIVILIGED OPS ARE ILLEGAL 85441650 EISSM EQU EIOC2 SET SYSTEM MASK IS ILLEGAL 85441700 EILPSW EQU EIOC2 LOAD PSW IS ILLEGAL 85441750 .VIPRIV2 ANOP , END OF PRIVILEGED INSTRS. 85441800 AIF (&$REPL GT 0).EINREPO SKIP IF REPL AVAILABLE 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 AIF (&$S370 NE 0).EIMASK4 IF 370'S OK THEN SKIP 85754000 EIICM EQU EIOC1 NO 370'S, OC1 ERROR 85754200 EICLM EQU EIOC1 NO 370'S, OC1 ERROR 85754400 EISTCM EQU EIOC1 NO 370'S, OC1 ERROR 85754600 .EIMASK4 ANOP 85754800 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 AIF (&$S370 NE 0).EISRP0 IF 370'S OK SKIP 85820200 EISRP EQU EIOC1 NO 370'S, OC1 ERROR 85820400 AGO .EISRP2 85820600 .EISRP0 ANOP 85820800 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 ECILCMSK,X'04' CAPTURE BIT MASK 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 EIXOPC EQU EIOC1 NO XOPC'S IN THIS GEN 85981000 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 EIXIOS EQU * SECTION FOR X-MACRO I/O INSTRS 86006000 SR RAD2,RMEM REMOVE SPERIOUS RELOCATION 86020000 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 ENTRY EIXRECEX ENTRY POINT FOR RECS. EXCEEDED CPP 86125000 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 EIXOPC L R15,=V(EIOPCS) CALL XOPC SUBROUTINE 86175000 BALR RLINK,R15 CALL ROUTINE 86176000 SPACE 2 86177000 * R15 SET AS INDEX TO BRANCH TABLE BY RETURN POINT 86178000 B EIXRTNPT(R15) BRANCH TO RETURN POINT 86179000 EIXRTNPT EQU * MAIN RETURN POINT 86180000 B EIFIN NORMAL RETURN 86181000 SPACE 2 86182000 EIXOPREC EQU *-EIXRTNPT DISPLACEMENT IF RECORDS EXCEEDED 86183000 B EICNTEXC BRANCH TO TERMINATE RUN 86184000 SPACE 2 86185000 EIXOPEM EQU *-EIXRTNPT DISPLACEMENT IF EMULATION CHG. 86186000 MVC EIWORK(1),ECPRFLG2 GET MODE FLAG 86187000 NI EIWORK,ECEM360+ECEM370 LEAVE ONLY EMULATION BITS ON 86188000 MVC EITSTMSK+1(1),EIWORK CHANGE MASK IN TM INSTR. 86189000 B EIFIN LOOP FOR NEXT INSTRUCTION 86190000 AIF (NOT &$VIRT).VIOPC3 SKIP IF NOT VIRT 86191000 SPACE 2 86191500 EIXOPVRT EQU *-EIXRTNPT VIRT MODE NORMAL RETURN POINT 86192000 SR R1,R1 SHOW TERMINATION W/NO ERROR MSG. 86192200 MVI ECFLAG1,$ECVIOUT SHOW SIMULATION TO HALT 86192300 B EIITIA RETURN TO CLEAN UP AND HALT 86192400 SPACE 2 86192500 EIXOPDMP EQU *-EIXRTNPT DISPLACEMENT FOR VIRT HALT & DUMP 86192600 LA R1,EICCDMP GET @ OF DUMP MESSAGE 86192700 MVI ECFLAG1,$ECVIDMP SHOW SIMULATION TO HALT W/DUMP 86192800 B EIITIA END SIMULATION 86193000 .VIOPC3 ANOP 86194000 * END OF BRANCHES FROM XOPC ROUTINES 86195000 SPACE 3 86571300 .EINOXIO ANOP 86571400 **--> 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 EICHK BRANCH TO DO STORE CHECKING 86664000 TM ECFLAG0,$ECPROT IS ABSOLUTE PROTECT MODE ON ? 86668000 BCR Z,RLINK RETURN IF NOT 86670000 * PERFORM STORE/FETCH CHECKING 86671000 EICHK EQU * 86672000 C RWK1,ECFADL IS BEGINNING @ TOO LOW ? 86674000 BL EIOC4 YES, SO ERROR 86676000 C RWK0,ECFADH IS ENDING @ TOO HIGH ? 86678000 BNL EIOC5 @ TOO HIGH, ADDRESSING ERROR 86682000 AIF (NOT &$VIRT).VIEISF 86684000 TM ECFLAG4,AJOVIRT IF WE ARE NOT IN VIRT MODE 86684200 BNO VIEISF THEN DO NOT CHECK KEYS 86684400 MVC VIWORKB1,EIWORK COPY TYPE OF PROTECTION FLAGS 86684600 MVC VIWORKB2,ECKYAMWP COPY USER'S PROTECTION KEY 86684800 LA R15,VIEIKTST BRANCH TO ROUTINE WHICH CHECKS FOR 86685000 ST R2,EIMSFCHS SAVE R2 86685100 BALR R2,R15 KEY VIOLATIONS. **NOTE ROP KILLED** 86685200 B EIOC4 RETURN TO HERE ON PROTECTION ERROR 86685400 * INDICATE BY OC4 INTERRUPT 86685600 IC R15,ECOP RESTORE OPCODE INTO ROP 86685800 L R2,EIMSFCHS RESTORE R2 86685900 VIEISF EQU * 86686000 .VIEISF ANOP 86688000 AIF (&$XIOS).EINOXI1 86695000 BR RLINK RETURN TO CALLER 86695100 AGO .EINOXI2 86695200 .EINOXI1 ANOP 86695300 TM EIWORK,EI1STORE IF NOT STORE TYPE 86695600 BCR NO,RLINK THEN WE ARE ALL DONE 86695800 * 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,ECSTINST-2 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 ST R2,EIMSFCHS SAVE LINK REG. THAT WILL BE CHGD. 86747000 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 L R2,EIMSFCHS RELOAD LINK REG (LENGTH) 86753000 BR RLINK RETURN TO CALLER 86754000 * THE FOLLOWING STORAGE IS USED AS A PRINT FORMAT AREA BY 86756000 * THE MODIFICATION CHECK FACILITY 86758000 EIMSFCHS DS F R2 SAVE AREA 86759000 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 AIF (NOT &$VIRT).VIEIKTS 86776100 EJECT 86776120 **--> INSUB: VIEIKTST TEST FOR KEY VIOLATIONS IN VIRTUAL MODE + + + 86776140 *+ + 86776160 *+ THIS INSUB PERFORMS KEY CHECKS OF ALL 2K BLOCKS BETWEEN THE + 86776180 *+ ADDRESS IN RWK0 AND RWK1. THE TYPE OF CHECKING (STORE/FETCH) + 86776200 *+ IS DETERMINED BY WHETHER OR NOT EIWORK IS SET TO EI1STORE + 86776210 *+ + 86776220 *+ ENTRY CONDITIONS: + 86776240 *+ RWK0 - CONTAINS ADDRESS IN LOWEST 2K BLOCK + 86776260 *+ RWK1 - CONTAINS ADDRESS IN HIGHEST 2K BLOCK + 86776280 *+ R2 - RETURN REGISTER + 86776300 *+ VIWORKB1-CONTAINS THE BYTE FLAG TO INDICATE WHAT TYPE + 86776320 *+ OF TESTING TO PERFORM + 86776340 *+ VIWORKB2-CONTAINS USER PROTECT KEY + 86776350 *+ + 86776360 *+ EXIT CONDITIONS: + 86776380 *+ EXIT ADDRESS IS R2 IF A PROTECTION ERROR IS DETECTED + 86776400 *+ EXIT ADDRESS IS 4(R2) IF NO ERROR + 86776420 *+ RWK0,RWK1 ARE DESTROYED IF THE ERROR EXIT IS TAKEN + 86776440 *+ RWK0,RWK1 ARE UNCHANGED IF NO ERROR + 86776460 *+ + 86776480 *++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 86776500 SPACE 2 86776520 USING VIEIKTST,R15 LOCAL ADDRESSABILITY (EXTERNAL) 86776528 ENTRY VIEIKTST THIS IS ALSO CALLED FROM I/O CSECT 86776530 VIEIKTST TM VIWORKB2,X'F0' IF USER'S KEY IS 0 THEN NO ERROR IS 86776540 BZ VIKTSRET POSSIBLE. RETURN IMMEDIATELY 86776560 STM RWK0,RWK1,VIEIKTS9 SAVE ENTRY REGISTER VALUES 86776580 SRL RWK0,11 CONVERT EACH ADDRESS TO A KEY NUMBER 86776600 SRL RWK1,11 86776620 A RWK0,ECRADH GET ADDRESSES WHERE THE SIMULATED 86776640 A RWK1,ECRADH KEYS ARE STORED 86776660 MVC VIEIKTS2+1(1),VIWORKB2 PLACE USER'S KEY IN COMPARE INS. 86776680 NI VIEIKTS2+1,X'F0' MASK OUT AMWP BITS 86776700 VIEIKTS1 MVC VIEIKTS8,0(RWK1) GET STORAGE KEY 86776720 NI VIEIKTS8,X'F0' MASK OUT UNWANTED BITS 86776740 VIEIKTS2 CLI VIEIKTS8,$ IS USER'S KEY THE SAME AS STORAGE 86776760 BE VIEIKTS3 IF SO, TRY NEXT 2K BLOCK 86776780 TM VIWORKB1,EI1STORE IF NOT AND STORE CHECK, 86776800 BO VIKTSERR THEN TAKE ERROR EXIT 86776820 TM 0(RWK1),B'00001000' IF NOT AND FETCH PROTECT, QUIT ON 86776830 BO VIKTSERR ERROR IF FETCH PROTECTION BIT SET 86776840 VIEIKTS3 CLR RWK1,RWK0 IF REGISTER ARE NOT EQUAL 86776860 BCTR RWK1,0 THEN TEST THE NEXT LOWEST 2K 86776880 BNE VIEIKTS1 86776900 LM RWK0,RWK1,VIEIKTS9 ALL DONE, RESTORE ENTRY REGISTERS 86776920 VIKTSRET LA R2,4(R2) STANDARD RETURN SKIPS AN INSTRUCTION 86776940 VIKTSERR SR R15,R15 REGISTER 15 SHOULD BE A BYTE REG. 86776945 BR R2 RETURN TO CALLER 86776950 VIEIKTS9 DS 2F REGISTER SAVE AREA 86776960 VIEIKTS8 DS X STORAGE KEY COPIED HERE 86776980 DROP RMEM,R15 REGISTER NO LONGER NEEDED 86776990 .VIEIKTS ANOP 86777000 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 * TABLE FOR EXTENDED I/I INSTRUCTION DISPLACEME1T 86904000 EIXIOJ $AL2 EISPEJMP,(EIXREAD,EIXPRNT,EIXPNCH,EIXDUMP,EIXLIMD,EIXGETX86906000 ,EIXPUT,EIOC1) 86908000 .EINOXI2 ANOP 86910000 EICTNTRY DS 0D MOVE IECONTAB ENTRY HERE 86911000 * FLAG BYTES CONTAIN INSTR DECODING INFO 86911100 * EXPLANATORY EQUATES BEGIN AT SEQ# 87186000 86911200 EICTB1 DS B FLAG BYTE 1 86911300 EICTB2 DS B FLAG BYTE 2 86911400 EICTB3 DS B FLAG BYTE 3 86911500 EICTB4 DS B FLAG BYTE 4 86911600 EICTB5 DS B FLAG BYTE 5 86911700 EICTB6 DS B FLAG BYTE 6 86911800 EICTDISP DS H DISPL FOR BRANCH TO SPECIAL RTN 86911900 EICTE$L EQU *-EICTNTRY LENGTH OF A SINGLE TABLE ENTRY 86911920 LTORG , 86911950 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 OPERATION' CPP 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 AIF (NOT &$VIRT).NOVICC 86965000 EICCDMP $ERCGN V01,'USER REQUESTED ABEND DUMP',TYPE=ASSIST 86965200 EICCWT $ERCGN V02,'EXCESSIVE SYSTEM WAIT TIME',TYPE=ASSIST 86965400 .NOVICC ANOP 86965600 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 * OPCODE TABLE 86990000 EIXTAB 2,XOPC,2,2,SPM,BALR,BCTR,BCR X'00' 86991000 EIXTAB ISSK,ISSK,SVC,2,2,2,MVCL,CLCL X'08' 86992000 EIXTAB NMRR,NMRR,NMRR,NMRR,NMRR,NMRR,NMRR,NMRR X'10' 86993000 EIXTAB LR,NMRR,NMRR,NMRR,MRDR,MRDR,NMRR,NMRR X'18' 86994000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR X'20' 86995000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR X'28' 86996000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR X'30' 86997000 EIXTAB FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR,FPRR X'38' 86998000 EIXTAB STH,LA,STC,IC,EX,BAL,BCT,BC X'40' 86999000 EIXTAB NMRXH,NMRXH,NMRXH,NMRXH,NMRXH,4,CVD,CVB X'48' 87000000 EIXTAB ST,4,DECO,DECI,NMRXF,NMRXF,NMRXF,NMRXF X'50' 87001000 EIXTAB NMRXF,NMRXF,NMRXF,NMRXF,MD,MD,NMRXF,NMRXF X'58' 87002000 EIXTAB FPRS,HEXI,HEXO,4,4,4,4,XFPRF X'60' 87003000 EIXTAB FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF X'68' 87004000 EIXTAB FPRS,4,4,4,4,4,4,4 X'70' 87005000 EIXTAB FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF,FPRF X'78' 87006000 EIXTAB SSM,4,LPSW,DIAG,WRDD,WRDD,BXHLE,BXHLE X'80' 87007000 EIXTAB SHFTS,SHFTS,SHFTS,SHFTS,SHFTD,SHFTD,SHFTD,SHFTD X'88' 87008000 EIXTAB STM,NMSIF,NMSIS,NMSIS,NMSIS,NMSIF,NMSIS,NMSIS X'90' 87009000 EIXTAB LM,4,4,4,IOS,IOS,IOS,IOS X'98' 87010000 EIXTAB XREPL,4,4,4,4,4,4,4 X'A0' 87011000 EIXTAB 4,4,4,4,P370,P370,4,P370 X'A8' 87012000 EIXTAB 4,P370,P370,4,4,4,P370,P370 X'B0' 87013000 EIXTAB 4,4,P370,P370,4,CLM,STCM,ICM X'B8' 87014000 EIXTAB 6,6,6,6,6,6,6,6 X'C0' 87015000 EIXTAB 6,6,6,6,6,6,6,6 X'C8' 87016000 EIXTAB 6,MOVES,MOVES,MOVES,LOGS,LOGS,LOGS,LOGS X'D0' 87017000 EIXTAB 6,6,6,6,TR,TRT,MOVES,EDMK X'D8' 87018000 EIXTAB XTND,DUMPR,6,6,6,6,6,6 X'E0' 87019000 EIXTAB 6,6,6,6,6,6,6,6 X'E8' 87020000 EIXTAB SRP,MVO,PACK,UNPK,6,6,6,6 X'F0' 87021000 EIXTAB DECS,CP,DECS,DECS,DECS,DECS,6,6 X'F8' 87022000 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 SPACE 2 87067000 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 87067050 * * FORMAT FOR EITAB ENTRIES * 87067100 * * 87067150 * RTN MCH L S PR NM CK F1F2 B2 H2 ALN R1R2 LABEL * 87067200 * WHERE RTN=NAME OF OPERATION CLASS * 87067250 * MCH=360 OR 370 FOR 360 OR 370-ONLY OPERATIONS * 87067300 * PR=PR(IVILEGED) OR NM (NORMAL) * 87067350 * CK=STORAGE REFERENCE CHECK CK (CHECK) NO (NO STORE REF.* 87067400 * F1,F2 = F(ETCH) OR S(TORE) FOR OPERAND #1 OR #2 * 87067450 * B2 = DECODING OF SECOND BYTE * 87067500 * H2 = DECODING OF SECOND OPERAND (RX, RS) * 87067550 * ALN = ALIGNMENT FOR SECOND OPRAND (NONE, HALF, FULL, DB* 87067600 * R1,R2 = E(VEN) OR O(DD) FIRST AND SECOND REGISTERS REQD* 87067650 * LABEL = LABEL OF ROUTINE TO WHICH TO BRANCH * 87067700 * RTN MCH L S PR NM CK F1F2 B2 H2 ALN R1R2 LABEL * 87067750 * ___ ___ _ _ __ __ __ ____ __ __ ___ ____ _____ * 87067800 SPACE 87067850 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 ISSK,360,2,*,PR,NM,**,*,*,RR4,**,***,O,O,EISSK CPP 87087000 EITAB SVC,360,2,*,NO,NM,**,*,*,IOL,**,***,*,*,EISVC CPP 87087050 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 BXHLE,360,4,*,NO,NM,NO,N,*,RR4,BD,NON,O,O,EIRSBX CPP 87130000 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 P370,370,4,*,PR,NM,**,*,*,RR4,BD,***,*,*,EIP370 CPP 87147000 EITAB SSM,360,4,*,PR,NM,**,*,*,***,BD,NON,*,*,EISSM CPP 87147050 EITAB LPSW,360,4,8,PR,NM,CK,F,*,***,BD,DBL,*,*,EILPSW CPP 87147100 EITAB IOS,360,4,*,PR,NM,**,*,*,***,BD,***,*,*,EIIOS CPP 87147150 EITWRDD EQU EIT4 NO READ OR WRITE DIRECT CPP 87147200 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 EITAB XREPL,360,4,4,NO,NM,CK,S,*,IOL,BD,NON,*,*,EIXREPL CPP 87184100 *********************************************************************** 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 * 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 VICHKSKP EQU B'00001000' (VIRT I/O) CHECK FOR ACCESS ONLY 87357000 * 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 AIF (NOT &$VIRT).VINODC1 88000000 SPACE 3 88000010 VITIMTAB DS 0H TIMINGS TABLE 88000020 * 0_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000030 DC H'000,000,000,000,000,000,000,000,065,000,092,000,075,013,054,031' 88000040 DC H'139,000,219,000,288,000,000,000,000,000,000,000,000,000,000,000' 88000050 * 1_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000060 DC H'073,000,073,000,050,000,050,000,096,000,050,000,096,000,096,000' 88000070 DC H'050,000,050,000,050,000,050,000,342,000,650,000,050,000,050,000' 88000080 * 2_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000090 DC H'081,000,081,000,081,000,081,000,096,000,000,000,000,000,000,000' 88000100 DC H'081,000,097,000,132,000,132,000,588,00,1027,000,135,000,135,000' 88000110 * 3_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000120 DC H'065,000,065,000,065,000,065,000,096,000,000,000,000,000,000,000' 88000130 DC H'050,000,095,000,129,000,129,000,312,000,504,000,126,000,126,000' 88000140 * 4_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000150 DC H'133,000,058,000,102,000,108,000,231,000,092,000,088,000,062,023' 88000160 DC H'108,000,138,000,138,000,138,000,385,000,000,000,681,000,592,000' 88000170 * 5_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000180 DC H'072,000,000,000,000,000,000,000,154,000,108,000,154,000,154,000' 88000190 DC H'092,000,108,000,108,000,108,000,369,000,669,000,108,000,108,000' 88000200 * 6_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000210 DC H'072,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000220 DC H'108,000,154,000,188,000,188,000,615,00,1085,000,192,000,192,000' 88000230 * 7_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000240 DC H'072,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000250 DC H'092,000,152,000,187,000,187,000,338,000,562,000,183,000,183,000' 88000260 * 8_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000270 DC H'138,000,000,000,169,000,000,000,000,000,000,000,123,-15,123,-15' 88000280 DC H'069,004,054,004,069,004,054,004,069,008,069,008,069,008,069,008' 88000290 * 9_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000300 DC H'072,015,123,000,102,000,138,000,133,000,108,000,133,000,133,000' 88000310 DC H'077,023,000,000,000,000,000,000,108,000,108,000,108,000,108,000' 88000320 * A_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000330 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000340 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000350 * B_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000360 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000370 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000380 * C_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000390 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000400 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000410 * D_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000420 DC H'000,000,215,038,225,028,215,038,215,038,223,031,215,038,215,038' 88000430 DC H'000,000,000,000,000,000,000,000,252,137,238,092,246,048,246,048' 88000440 * E_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000450 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000460 DC H'000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000' 88000470 * F_ 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F * 88000480 DC H'000,000,225,044,221,036,215,038,000,000,000,000,000,000,000,000' 88000490 DC H'269,031,267,033,338,054,338,054,290,462,681,923,000,000,000,000' 88000500 .VINODC1 ANOP VIRT MODE DCS 88000510 .EINONE ANOP END OF EXTENDED INTERPRETER 89999999