SCRNIO TITLE 'Execute CCW for a 3270 Display' 00000001 SCRNIO CSECT 00000002 SPACE 00000003 *---------------------------------------------------------------------* 00000004 * * 00000005 * SCRNIO executes a CCW for a 3270 display. At entry, R1 -> CCW and * 00000006 * R2 contains the device address. The high-order byte of R2 * 00000007 * contains the flag bits defined for FLAGS. R15 contains the * 00000008 * entry address and R13 points to a standard save area. * 00000009 * When SCRNIO returns, the condition code and R15 are set to in- * 00000010 * dicate success or failure. A sense byte or 0 is returned in * 00000011 * the high-order byte of R0. The residual count or 0 is returned * 00000012 * in the remainder of R0. * 00000013 * * 00000014 * SCRNIO disables interrupts and runs with the system key. * 00000015 * SCRNIO is re-entrant. DMSFREE, DMSFRET, and DMSKEY are called * 00000016 * via SVC 203. For a CMS console, CONWAIT is called via SVC 202. * 00000017 * * 00000018 *---------------------------------------------------------------------* 00000019 SPACE 00000020 PRINT NOGEN 00000021 STM R14,R12,12(R13) SAVE REGISTERS 00000022 LR R12,R15 SET-UP ADDRESSING 00000023 USING SCRNIO,R12 00000024 USING NUCON,0 00000025 LR R3,R1 SAVE CCW ADDRESS IN R3 00000026 LA R0,WORKDBLW GET WORK AREA DOUBLEWORD COUNT 00000027 DMSFREE DWORDS=(0),TYPE=USER,ERR=STGERR,MSG=NO 00000028 B GOTFREE 00000029 SPACE 00000030 STGERR LA R15,104 ERROR CODE 104 FOR NO STORAGE 00000031 SR R0,R0 NO SENSE OR RESIDUAL COUNT 00000032 L R14,12(R13) RESTORE OTHER REGISTERS 00000033 LM R1,R12,24(R13) 00000034 LTR R15,R15 SET CC FROM R15 00000035 BR R14 RETURN 00000036 SPACE 00000037 GOTFREE LR R9,R1 SET-UP WORK AREA 00000038 USING WORKAREA,R9 R9 RESERVED FOR THIS 00000039 STM R0,R1,WORKFRET SAVE INFO FOR FRET 00000040 LA R1,SAVEAREA CHAIN SAVE AREAS 00000041 ST R13,SAVEAREA+4 00000042 ST R1,8(R13) 00000043 LA R13,SAVEAREA NOW READY FOR SUBROUTINE CALLS 00000044 MVI SBYTE,0 SENSE BYTE IS 0 00000045 XC RESCOUNT(4),RESCOUNT RESIDUAL COUNT IS 0 00000046 XC RTNCODE(4),RTNCODE RETURN CODE IS 0 00000047 ST R3,CCWADDR SAVE CCW ADDRESS 00000048 STCM R2,B'1000',FLAGS SAVE FLAGS 00000049 STH R2,DEVADDR SAVE DEVICE ADDRESS 00000050 DMSKEY NUCLEUS GET SYSTEM KEY 00000051 SSM =X'00' DISABLE INTERRUPTS 00000052 TM FLAGS,CMSCON IF CMS CONSOLE, FINISH I/O 00000053 BZ SCRADDR 00000054 LH R2,NUMPNDWR ANY PENDING WRITES? 00000055 LTR R2,R2 IF NOT, SKIP CALLING CONWAIT 00000056 BZ SCRADDR 00000057 SSM =X'FF' ENABLE INTERRUPTS 00000058 LA R1,=CL8'CONWAIT' CLEAR PENDING CMS CONSOLE I/O 00000059 SVC 202 00000060 DC AL4(1) IGNORE ERRORS 00000061 SSM =X'00' SET NO INTERRUPTION 00000062 SCRADDR LH R2,DEVADDR DISPLAY ADDRESS CUU 00000063 L R1,CCWADDR R1 -> CCW 00000064 WAITDISP EQU * 00000065 TIO 0(R2) RESET ALL PENDING INTERRUPTIONS 00000066 BC 6,WAITDISP AND LOOP IF SOME MORE 00000067 BC 1,RESETSCR ERROR IF DISPLAY NOT OPERATIONAL 00000068 * 00000069 * ISSUE DIAGNOSE 00000070 * 00000071 DIAG EQU * 00000072 DIAG R1,R2,X'58' ISSUE DIAGNOSE 00000073 BC 8,TIO1 ALL OK: GO WAIT FOR END OF I/O 00000074 BC 2,DIAG BUSY: REISSUE DIAGNOSE 00000075 BC 4,CHKCSW GO LOOK AT CSW 00000076 BC 1,RESETSCR ERROR IF DISPLAY NOT OPERATIONAL 00000077 * 00000078 * WAIT FOR THE END OF THE INPUT/OUTPUT AND CHECK CSW 00000079 * 00000080 TIO1 EQU * 00000081 TIO 0(R2) WAIT FOR THE END OF INPUT/OUTPUT 00000082 BC 8,CHKCSW OK: GO ON 00000083 BC 2,TIO1 BUSY: KEEP LOOPING 00000084 BC 1,RESETSCR ERROR IF DISPLAY NOT OPERATIONAL 00000085 TM CSW+4,X'B0' CSW STORED + ATTN CTLUNIT END BUSY 00000086 BNZ TIO1 YES THEN HANDLE AS BUSY 00000087 CHKCSW EQU * 00000088 CLI CSW+5,X'00' SOME PROBLEM WITH THE CHANNEL ? 00000089 BNE RESETSCR YES NOTHING WE CAN DO 00000090 LH R0,CSW+6 GET RESIDUAL COUNT 00000091 ST R0,RESCOUNT SAVE TO RETURN 00000092 CLI CSW+4,X'0C' DID WE GET CE+DE ? 00000093 BE GOTCEDE YES- WE ARE FINISHED 00000094 CLI CSW+4,X'08' DID WE GET CE ONLY ? 00000095 BE TIO2 YES GO WAIT FOR DE 00000096 TM FLAGS,CMSCON IS THIS THE CMS CONSOLE? 00000097 BZ NOTCP NO, SKIP CHECK FOR CP ERROR 00000098 CLI CSW+4,X'8E' IS THIS ERROR CODE '8E' FROM CP ? 00000099 BE CPERR YES, INDICATE IT TO CALLER 00000100 NOTCP TM CSW+4,X'02' UNIT CHECK ? 00000101 BO SENSE YES GO DO A SENSE 00000102 TM CSW+4,X'B0' ATTN OR CTL UNIT END OR BUSY ? 00000103 BNZ DIAG IF YES REISSUE THE DIAGNOSE 00000104 TM CSW+4,X'0C' DID WE GET AT LEAST CE OR DE ? 00000105 BZ DIAG NO REISSUE THE DIAGNOSE 00000106 TIO2 EQU * 00000107 TIO 0(R2) WAIT FOR DE 00000108 BC 2,TIO2 BUSY KEEP LOOPING 00000109 BC 1,RESETSCR ERROR IF DISPLAY NOT OPERATIONAL 00000110 * 00000111 * ALL OK EXIT 00000112 * 00000113 GOTCEDE EQU * 00000114 B SCRRTN KEEP RETURN CODE 0 00000115 SPACE 00000116 * 00000117 * ERRORS 00000118 * 00000119 CPERR EQU * ERROR X'8E' FROM CP 00000120 MVI RTNCODE+3,X'8E' RETURN ERROR TO CALLER 00000121 B SCRRTN 00000122 SPACE 00000123 SCRERR EQU * 00000124 MVI RTNCODE+3,4 STANDARD ERROR RC 00000125 MVC RTNCODE+1(2),X'40' ALSO STATUS BYTES FROM CSW 00000126 B SCRRTN 00000127 SPACE 00000128 SENSE EQU * GET SENSE DATA CP HAS FOR US 00000129 TM FLAGS,NOSENSE SENSE SUPPRESSED? 00000130 BO SCRERR YES, THEN JUST RETURN ERROR 00000131 * BUILD CCW, CALL OURSELVES 00000132 LA R1,SBYTE STORE BUFFER ADDRESS IN CCW 00000133 ST R1,SENSECCW 00000134 MVI SENSECCW,X'04' SENSE COMMAND 00000135 MVC SENSECCW+4(4),=F'1' COUNT = 1 00000136 MVI SENSECCW+4,X'20' SILI 00000137 LA R1,SENSECCW R1 -> SENSE CCW 00000138 LH R2,DEVADDR R2 = DEVICE ADDRESS 00000139 ICM R2,B'1000',=AL1(NOSENSE) AVOID LOOPING 00000140 LA R15,SCRNIO MAKE RECURSIVE CALL 00000141 BALR R14,R15 READ SENSE BYTE 00000142 * (IGNORE ERRORS) 00000143 RESETSCR TM FLAGS,CMSCON CMS CONSOLE? 00000144 BZ RESETERR NO, JUST RETURN ERROR 00000145 LH R2,DEVADDR GET DISPLAY ADDRESS CUU 00000146 DIAG R2,R3,X'24' IS IT STILL THERE 00000147 BC 2,GOTCEDE EXIT IF DISCONNECTED 00000148 RESETERR MVI RTNCODE+3,8 SENSE BYTE ERROR CODE 00000149 MVC RTNCODE+1(2),X'40' ALSO STATUS BYTES FROM CSW 00000150 SPACE 00000151 SCRRTN EQU * GET DATA FROM WORKAREA TO RETURN 00000152 DMSKEY RESET RESTORE CALLER'S KEY 00000153 L R2,RTNCODE RETURN CODE IN R2 00000154 L R3,RESCOUNT RESIDUAL COUNT IN R3 00000155 ICM R3,B'1000',SBYTE PLUS SENSE BYTE 00000156 L R13,4(R13) RESTORE R13 FROM SAVE AREA 00000157 LM R0,R1,WORKFRET RETURN WORK AREA STORAGE 00000158 DMSFRET DWORDS=(0),LOC=(1) 00000159 DROP R9 DON'T USE WORK AREA NOW! 00000160 L R14,12(R13) RESTORE RETURN ADDRESS 00000161 LR R15,R2 RETURN ADDRESS INTO R15 00000162 LR R0,R3 SENSE AND RESIDUAL COUNT INTO R0 00000163 LM R1,R12,24(R13) RESTORE OTHER REGISTERS 00000164 LTR R15,R15 SET CONDITION CODE FOR CALLER 00000165 BR R14 RETURN TO CALLER 00000166 SPACE 00000167 LTORG 00000168 EJECT 00000169 * WORK AREA IN FREE STORAGE 00000170 SPACE 00000171 WORKAREA DSECT 00000172 WORKFRET DS 1D R0, R1 TO FREE WORK AREA 00000173 SAVEAREA DS 12D SAVE AREA FOR CALLED ROUTINES 00000174 SENSECCW DS 1D SENSE CCW BUILT HERE 00000175 RTNCODE DS 1F RETURN CODE 00000176 RESCOUNT DS 1F RESIDUAL COUNT 00000177 DEVADDR DS 1H DEVICE ADDRESS 00000178 CCWADDR DS 1A CCW ADDRESS 00000179 SBYTE DS 1X SENSE BYTE 00000180 FLAGS DS 1X FLAGS FROM CALLER 00000181 CMSCON EQU X'01' I/O IS TO CMS CONSOLE 00000182 NOSENSE EQU X'02' DON'T DO SENSE IF ERROR 00000183 WORKSIZE EQU *-WORKAREA SIZE IN BYTES 00000184 WORKDBLW EQU (WORKSIZE+7)/8 SIZE IN DOUBLEWORDS 00000185 NUCON 00000186 REGEQU 00000187 END 00000188