FULL TITLE 'FULL SCREEN I/O SERVICE FOR CMS' FUL00010 SPACE FUL00020 * FUL00030 * THIS SUBROUTINE PROVIDES A REASONABLY SYSTEM INDEPENDENT FUL00040 * INTERFACE TO PROBLEM PROGRAMS FOR 3270-STYLE I/O. FUL00050 * FUL00060 * ATTRIBUTES: NOT REENTRANT. SERIALLY REUSABLE IF INITIALIZE FUL00070 * AND TERMINATE CALLS ARE PAIRED. FUL00080 * FUL00090 * ENTRY CONDITIONS: FUL00100 * R15 --> ENTRY POINT FUL00110 * R14 = RETURN ADDRESS FUL00120 * R13 --> OS/STYLE SAVE AREA FUL00130 * R1 --> OS/STYLE PARAMETER LIST. FUL00140 * PARAMETERS: FUL00150 * 0(R1) --> H'FUNCTION CODE' FUL00160 * 4(R1) --> BUFFER FUL00170 * 8(R1) --> H'LENGTH' OF BUFFER. FUL00180 * 12(R1) --> HALFWORD RETURNED LENGTH FOR READ OPERATIONS. FUL00190 * FUNCTION CODES: FUL00200 * 0 -- GET CONTROL OF SCREEN FUL00210 * 1 -- PERFORM ERASE WRITE OF BUFFER DATA FUL00220 * 2 -- PERFORM NORMAL WRITE OF BUFFER DATA FUL00230 * 3 -- PERFORM READ MODIFIED INTO BUFFER AFTER WAITING FUL00240 * FOR ATTENTION FUL00250 * 4 -- PERFORM READ BUFFER INTO BUFFER FUL00260 * 5 -- RELINQUISH CONTROL FUL00270 * FUL00280 * OPERATING NOTES: FUL00290 * FUL00300 * FUNCTION 0 MUST BE ISSUED FIRST. FUNCTION 5 SHOULD BE ISSUED FUL00310 * BEFORE THE FULL SCREEN APPLICATION TERMINATES. FUL00320 * AFTER WRITING A WCC TO UNLOCK THE KEYBOARD, FUNCTION 3 SHOULD FUL00330 * BE ISSUED TO WAIT FOR ATTENTION. AN I/O ERROR MIGHT OCCUR FUL00340 * IF AN ATTENTION IS PENDING AND THE NEXT I/O IS A FUL00350 * WRITE. FUL00360 * THIS ROUTINE USES A STAX EXIT. THE APPLICATION SHOULD NOT FUL00370 * ISSUE THE STAX MACRO BETWEEN INITIALIZING AND TERMINATING THIS FUL00380 * INTERFACE. FUL00390 * RETURN CODE 4 CAN INDICATE: FUL00400 * 1. NOT PROPERLY INITIALIZED. FUL00410 * 2. SCREEN STOLEN BY THE OPERATING SYSTEM (ISSUE ERASE WRITE FUL00420 * GET IT BACK: THIS IS A CMS-DEPENDENT CONVENTION). FUL00430 * 3. NON FULL-SCREEN INPUT PENDING. USE STANDARD INPUT FUL00440 * ROUTINES TO ACQUIRE IT. FUL00450 * FUL00460 * RETURN CODES: FUL00470 * 0 -- SUCCESSFUL COMPLETION FUL00480 * 4 -- SCREEN NOT FORMATTED FUL00490 * 8 -- I/O ERROR ON DEVICE. FUL00500 * 12 -- ILLEGAL FUNCTION FUL00510 * 16 -- DEVICE NOT OPERATIONAL OR OF INCORRECT TYPE FUL00520 * FUL00530 FULLSERV CSECT FUL00540 SAVE (14,12),,* FUL00550 LR R12,R15 FUL00560 USING FULLSERV,R12 FUL00570 LM R8,R11,0(R1) R8 --> FUNCTION CODE FUL00580 * R9 --> BUFFER FUL00590 * R10 --> BUFFER LENGTH FUL00600 * R11 --> RETURNED LENGTH FOR READ FUL00610 LA R7,12 SET ILLEGAL FUNCTION FUL00620 ST R8,FUNCRET QK FUL00630 LH R8,0(,R8) GET FUNCTION CODE FUL00640 CL R8,=A(FUNCMAX) TEST FOR LEGAL FUNCTION FUL00650 BH RETURN WORST FEARS REALIZED FUL00660 SLL R8,2 MAKE BRANCHABLE FUL00670 B *+4(R8) AND BRANCH FUL00680 FUNC0 B INIT 0 -- INITIALIZE FUL00690 B EWRITE 1 -- ERASE WRITE FUL00700 B WRITE 2 -- NORMAL WRITE FUL00710 B READM 3 -- READ MODIFIED FUL00720 B READB 4 -- READ BUFFER FUL00730 B TERMIN 5 -- TERMINATE FUL00740 FUNCMAX EQU (*-FUNC0)/4-1 FUL00750 SPACE FUL00760 * RETURN TO CALLER. RC IN R7 FUL00770 SPACE FUL00780 RETURN ST R7,16(,R13) SET RETURN CODE IN R15 POSITION FUL00790 L R8,FUNCRET QK FUL00800 ST R7,0(,R8) set FUNCTION CODE to return code FUL00810 RETURN (14,12) RETURN TO CALLER FUL00820 EJECT FUL00830 * FUL00840 * ESTABLISH CONTROL. FUL00850 * 1. CHECK CONSOLE TYPE. FUL00860 * 2. DISABLE FOR ALL INTERRUPTS. FUL00870 * 3. TAKE CONTROL OF ATTENTIONS VIA STAX. FUL00880 * 4. ISSUE ERASE WRITE TO CLEAR SCREEN AND PUT CONSOLE IN FUL00890 * FULL SCREEN MODE. FUL00900 * FUL00910 INIT LA R7,16 GET TENTATIVE RETURN CODE FUL00920 L R1,=F'-1' VIRTUAL CONSOLE DIAGNOSE FUL00930 DIAG R1,R2,X'24' DO IT FUL00940 BNZ RETURN DON'T ALLOW ANYTHING SLEAZY FUL00950 CLM R3,B'0100',=X'04' ACCEPT ONLY 3277 OR 3278 TYPES FUL00960 BE TYPEOK FUL00970 CLM R3,B'0100',=X'01' ACCEPT ONLY 3277 OR 3278 TYPES FUL00980 BNE RETURN FUL00990 TYPEOK STCM R1,B'0011',CONSADDR SAVE CONSOLE ADDRESS FUL01000 SSM *+1 DISABLE FOR INTERRUPTS FUL01010 MVI STAXECB,0 CLEAR ECB FUL01020 STAX CATCHATN PLAN TO CATCH ATTENTIONS FUL01030 LA R1,GETSCRN --> CCWS TO GET SCREEN FUL01040 B DIAG58 DO THE I/O FUL01050 * FUL01060 * RELINQUISH CONTROL. FUL01070 * 1. CLEAR CONSOLE ADDRESS FUL01080 * 2. CANCEL STAX FUL01090 * FUL01100 TERMIN XC CONSADDR,CONSADDR CLEAR CONSOLE ADDRESS FUL01110 STAX , CANCEL STAX FUL01120 SR R7,R7 SET RETURN CODE FUL01130 B RETURN FUL01140 EJECT FUL01150 * FUL01160 * WRITE, READ BUFFER, OR ERASE WRITE. FUL01170 * 1. --> CORRECT CCW. FUL01180 * 2. FILL IN ADDRESSES AND DO I/O FUL01190 * FUL01200 EWRITE LA R1,EWCCW --> ERASE WRITE CCW FUL01210 B FILLIN GO FILL IN THE DATA FUL01220 WRITE LA R1,WCCW --> NORMAL WRITE CCW FUL01230 B FILLIN GO FILL IN THE DATA FUL01240 READB LA R1,RBCCW --> READ BUFFER CCW FUL01250 B FILLIN GO FILL IN THE DATA FUL01260 * FUL01270 * READ MODIFIED FUL01280 * 1. WAIT FOR ATTENTION. FUL01290 * 2. --> CORRECT CCW. FUL01300 * 3. FILL IN ADDRESSES AND DO I/O FUL01310 * FUL01320 READM MVC DEBUG1,STAXECB SAVE ECB STATE FOR DEBUGGING FUL01330 WAIT 1,ECB=STAXECB WAIT FOR ATTN FUL01340 MVC DEBUG2,X'44' SAVE CSW STATUS FOR DEBUGGING FUL01350 LA R1,RMCCW --> READ MODIFIED CCW FUL01360 B FILLIN GO FILL IN THE DATA FUL01370 EJECT FUL01380 * FUL01390 * FILL IN DATA FOR READ OR WRITE OPERATIONS PRIOR TO DIAGNOSE FUL01400 * FUL01410 FILLIN STCM R9,B'0111',1(R1) MOVE 3 BYTE ADDRESS INTO CCW FUL01420 MVC 6(2,R1),0(R10) MOVE 2 BYTE LENGTH INTO CCW FUL01430 * FUL01440 * PERFORM DIAGNOSE X'58' I/O FUL01450 * FUL01460 DIAG58 LR R2,R1 SAVE CCW REGISTER FUL01470 LH R3,CONSADDR PICK UP CONSOLE ADDRESS FUL01480 LA R7,4 ASSUME NOT IN CONTROL FUL01490 LTR R3,R3 ARE WE? FUL01500 BZ RETURN NO. FUL01510 WAITT , YES. LET CONSOLE QUIESCE. FUL01520 LA R4,10 RETRY 10 TIMES (ARBITRARY) IF BUSY FUL01530 LA R7,8 ASSUME ERROR FUL01540 DO58 DIAG R2,R3,X'58' PERFORM THE DIAGNOSE FUL01550 BZ WAITEND OPERATION STARTED FUL01560 BM CHECKEND CCW STORED FUL01570 BO RETURN CC=3: RETURN ERROR. FUL01580 SSM =X'FE' CC=2: RETRY UP TO 10 TIMES FUL01590 SSM *+1 (OPEN INTERRUPT WINDOW: IT MIGHT BE FUL01600 BCT R4,DO58 INTERRUPT PENDING ON ANOTHER CUU) FUL01610 B RETURN RETURN ERROR IF RETRY EXHAUSTED FUL01620 WAITEND TIO 0(R3) WAIT FOR OPERATION TO END FUL01630 BO RETURN CC=3: RETURN ERROR FUL01640 BZ RETURN CC=0 IS IMPOSSIBLE! FUL01650 BP WAITEND LOOP ON BUSY. WILL NOT SPIN. FUL01660 TM X'44',X'04' INCLUDES DEVICE END? FUL01670 BNO WAITEND NO. KEEP WAITING FUL01680 CHECKEND LA R7,4 ASSUME SCREEN STOLEN FUL01690 CLI X'44',X'8E' WAS IT? FUL01700 BE RETURN YES. DONE FUL01710 LA R7,8 ASSUME I/O ERROR FUL01720 MVI STAXECB,X'40' PSEUDO PREPOST THE ECB FUL01730 TM X'44',X'80' ATTENTION STRUCK? FUL01740 BO RETURN YES. RETURN ERROR. FUL01750 MVI STAXECB,0 NO. CLEAR ECB FOR EVENTUAL WAIT FUL01760 TM X'44',X'F3' ANY FUNNY BITS ON? FUL01770 BNZ RETURN YES. ERROR FUL01780 CLI X'45',0 ANY CHANNEL STATUS? FUL01790 BNE RETURN YES. ERROR FUL01800 SR R7,R7 OTHERWISE, CALL IT A SUCCESS FUL01810 CH R8,=Y(4*3) IS IT READ MODIFIED? FUL01820 BL RETURN RETURN IF LESS FUL01830 CH R8,=Y(4*4) HOW ABOUT READ BUFFER? FUL01840 BH RETURN RETURN IF MORE FUL01850 LH R1,X'46' PICK UP CSW RESIDUAL COUNT FUL01860 LNR R1,R1 COMPLEMENT IT FUL01870 AH R1,0(,R10) ADD ORIGINAL COUNT FUL01880 STH R1,0(,R11) AND STORE DIFFERENCE (BYTES MOVED) FUL01890 B RETURN AND GET OUT OF HERE FUL01900 EJECT FUL01910 * FUL01920 * STAX ROUTINE (SIMPLICITY ITSELF FUL01930 * FUL01940 CATCHATN SAVE (14,12) FUL01950 DROP , NO ADDRESSABILITY REALLY FUL01960 LR R12,R15 GET SOME FUL01970 USING CATCHATN,R12 FUL01980 POST STAXECB INDICATE SOMETHING FUL01990 RETURN (14,12) FUL02000 EJECT FUL02010 * STATIC DATA FUL02020 SPACE FUL02030 GETSCRN DS 0D CCWS TO GET CONTROL OF SCREEN FUL02040 DC X'1900000060FF0001' FUL02050 DC X'29',AL3(NULLWCC),X'20800001' FUL02060 EWCCW DC X'2900000020800000' ERASE WRITE CCW FUL02070 WCCW DC X'2900000020000000' WRITE CCW FUL02080 RMCCW DC X'2A00000020800000' READ MODIFIED CCW FUL02090 RBCCW DC X'2A00000020000000' READ BUFFER CCW FUL02100 STAXECB DC F'0' ECB FOR ATTENTION FUL02110 CONSADDR DC H'0' CONSOLE ADDRESS FUL02120 NULLWCC DC X'C0' FUL02130 DEBUG1 DC X'FF' PLACE TO SAVE DEBUGGING INFORMATION FUL02140 DEBUG2 DC X'FFFF' PLACE TO SAVE DEBUGGING INFORMATION FUL02150 FUNCRET DS F FUL02160 LTORG FUL02170 REGEQU FUL02180 END FUL02190