* /* START OF SPECIFICATIONS **** 00050002 *01* PROCESSOR = ASSEMXF-370R 00100002 **** END OF SPECIFICATIONS ***/ 00150002 TITLE 'IGG019VB - GET LOCATE VARIABLE AND UNDEFINED RECORDS (OCR)' 00300019 IGG019VB CSECT 00600019 *********************************************************** @YM00638 00650002 *MODULE-NAME @YM00638 00700002 * IGG019VB @YM00638 00750002 * @YM00638 00800002 *DESCRIPTIVE-NAME @YM00638 00850002 * OCR GET, LOCATE MODE, VARIABLE AND UNDEFINED RECORDS @YM00638 00860002 * @YM00638 00870002 *COPYRIGHT @YM00638 00880002 * NONE @YM00638 00890002 * @YM00638 00892002 *CHANGE-ACTIVITY @YM00638 00894002 * 00900019 * RELEASE 20 ADDITIONS/CHANGES/DELETIONS 01100020 *A427000,428000 A33921 01300020 *C471000 A33921 01500020 *A454000,455000,460000,628000,629000,631000,802000 A56384 01600001 * RELEASE 21 ADDITIONS/CHANGES/DELETIONS 01700020 *D454000,455000,460000,628000,629000,631000,802000 YM5997 01750001 *C240000,366000,393000,792000 YM5997 01800001 *A394000,630500 YM5997 01850001 * RELEASE 22 ADDITIONS/CHANGES/DELETIONS 01900020 * RELEASE 23 ADDITIONS/CHANGES/DELETIONS 02100020 * RELEASE 24 ADDITIONS/CHANGES/DELETIONS 02300020 * RELEASE 25 ADDITIONS/CHANGES/DELETIONS 02500020 * RELEASE 26 ADDITIONS/CHANGES/DELETIONS 02700020 * RELEASE 27 ADDITIONS/CHANGES/DELETIONS 02900020 * 03600019 * 03900019 * STATUS - CHANGE LEVEL 00 RELEASE 20 04200020 * 04500019 * 04800019 * 05100019 *FUNCTION-GET- TO LOCATE THE ADDRESS OF LOGICAL SEQUENTIAL RECORDS 05400019 * WITHIN A BUFFER FOR THE USER 05700019 * RELEASE- CAUSES THE REMAINING CONTENTS OF THE CURRENT BUFFER 06000019 * TO BE IGNORED 06300019 * 06600019 *ENTRY POINTS 06900019 * LABEL OCR010 07200019 * LABEL OCR020 07500019 * 07800019 *ENTRY INSTRUCTION SEQUENCE 08100019 * GET RELEASE 08400019 * LA 1,DCB LA 1,DCB 08700019 * L 15,48(1) L 15,48(1) 09000019 * BALR 14,15 BALR 14,8(15) 09300019 * 09600019 *INPUT FROM USER AS ADDRESSES IN FOLLOWING REGISTERS 09900019 * REG 0 USED IN MOVE MODE(NOT APPLICABLE IN LOCATE MODE) 10200019 * REG 1 DCB ADDRESS 10500019 * REG 13 WORK-SAVE ADDRESS 10800019 * REG 14 USER IN-LINE RETURN ADDRESS 11100019 * REG 15 THIS ROUTINES INITIAL BASE ADDRESS 11400019 * 11700019 *OUTPUT REGISTER ADDRESSES AS FOLLOWS 12000019 * REG 0 NOT APPLICABLE 12300019 * REG 1 RECORD ADDRESS LOCATED FOR USER 12600019 * REG 13 WORK-SAVE ADDRESS 12900019 * REG 14 RETURN ADDRESS 13200019 * REG 15 RETURN CODE 13500019 * REG 2-12 AS UPON ENTRY TO THIS ROUTINE 13800019 * 14100019 *EXTERNAL ROUTINES 14400019 * 14700019 * IGG019VE - INPUT ERROR ROUTINE WHICH DETECTS, CORRECTS DEVICE 15000019 * ERRORS AND RETURNS BLOCK OF DATA. 15300019 * IGG019CC END OF BLOCK ROUTINE WHICH SCHEDULES REQUESTS. 15600019 *EXITS 15900019 * OCR025 BRANCH TO USER,RETURNS PARAMETERS 16200019 * OCR034 BRANCH AND LINK TO END OF BLOCK ROUTINE 16500019 * OCR072 BRANCH AND LINK TO END OF BLOCK ROUTINE 16800019 * OCR080 BRANCH AND LINK TO INPUT ERROR ROUTINE 17100019 * OCR150 BRANCH TO USER, RETURNS PARAMETERS 17400019 * 17700019 *TABLES/WORKAREAS 18000019 * 18300019 * USER SAVE/WORK AREA-LAST 13 WORDS USED 18600019 * DCB 18900019 * 19200019 * IOB 19500019 * 19800019 *ATTRIBUTES---REENTRANT,REUSABLE,PROBLEM PROGRAM MODE 20100019 * 20400019 ******************************************************************* 20700019 * 21000019 * ALL REGISTER EQUATES HAVE AN 'R' AT THE END OF THE SYMBOL 21300019 * 21600019 *********************************************************************** 21900019 * 22200019 PARA1R EQU 1 PARAMETER REGISTER 1 22500019 BUFADR EQU 1 ADDRESS OF BUFFER 22800019 DCBR EQU 2 DCB ADDRESS 23100019 IOBADR EQU 3 IOB ADDRESS 23400019 EOBADR EQU 4 EOB ADDRESS 23700019 RECADR EQU 5 RECORD ADDRESS @YA00403 24000002 WORK3R EQU 6 WORK REGISTER 24300019 WORK1R EQU 7 WORK REGISTER 24600019 CON255R EQU 7 WORK REGISTER-CONTAINS 255 24900019 BASER EQU 8 BASE REGISTER 25200019 SAVR EQU 13 USER SAVE AREA 25500019 RETR EQU 14 RETURN ADDRESS 25800019 WORK2R EQU 14 WORK REGISTER 26100019 ENTRYR EQU 15 ENTRY ADDRESS 26400019 LNGHR EQU 15 WORK REGISTER-CONTAINS BUFFER LNGH 26700019 *********************************************************************** 27000019 EOFBIT EQU X'40' DCBORBYT-END OF FILE BIT 27300019 BUFPRIME EQU X'20' DCBORBYT-BUFFERS PRIMED BIT 27600019 ERRFLGS EQU X'3F' DCBIFLGS-DCB ERROR FLGS OFF 27900019 BUF EQU 0 OFFSET OF BUFFER ADDRESS IN CCW 28200019 CNT EQU 6 OFFSET OF COUNT IN CCW 28500019 LINECNT EQU 28 OFFSET OF LINE COUNT IN ERROR CNTRS 28800019 NOERROR EQU X'00' TESTS FOR RETURN CODE OF ZERO 29100019 LPREFIX EQU 4 LENGTH OF A VARIABLE RECORD PREFIX 29400019 LNGH EQU 2 LENGTH OF NUMBER IN PREFIX 29700019 UNDEF EQU X'C0' USED TO TEST FOR UNDEF RECORDS 30000019 C255 EQU 255 USED TO CLEAR 256 BYTES OF CORE 30300019 C256 EQU 256 USED TO INCREMENT POINTER BY 256 30600019 ADDRESS EQU 3 LENGTH OF AN ADDRESS 30900019 ZERO EQU 0 USED AS A CONSTANT OF ZERO 31200019 ONE EQU 1 USED TO INCREMENT BY 1 31500019 USERREG EQU 36 SAVE AREA OFFSET TO REG2 31800019 RETREG EQU 20 SAVE AREA OFFSET TO REG14 32100019 SAVREG EQU 20 SAVE AREA OFFSET TO STORE REGISTERS 32400019 * 32700019 * 33000019 * 33300019 EJECT 33600019 USING IGG019VB,ENTRYR USE ENTRY POINT AS A BASE (REG 15) 33900019 USING IHADCB,PARA1R USE DCB ADDRESS AS A BASE (REG 1) 34200019 * 34500019 OCR010 B OCR030 BRANCH AROUND RELEASE 34800019 ZEROS DC X'00000000' FILL FOR ENTRY AT +8 - USE AS CNST=0 35100019 * 35400019 OCR020 MVC DCBRECAD+1(ADDRESS),DCBEOBAD+1 INITIALIZE FOR RELEASE 35700019 * 36000019 OCR025 BR RETR RETURN TO USER 36300019 OCR030 STM RETR,BASER,SAVREG(SAVR) SAVE REGISTERS @YA00403 36600002 * 36900019 DROP ENTRYR DROP REG 15 AS BASE FOR MODULE 37200019 DROP PARA1R DROP REG 1 AS BASE FOR DCB 37500019 USING IGG019VB,BASER NEW BASE REG ADDRESSABILITY 37800019 USING IHADCB,DCBR NEW DCB REG ADDRESSABILITY 38100019 * 38400019 LR BASER,ENTRYR LOAD BASE ADDRESS 38700019 LR DCBR,PARA1R LOAD DCB ADDRESS 39000019 LM IOBADR,RECADR,DCBIOBA LOAD WORK REGISTERS @YA00403 39300002 TM DCBORBYT,BUFPRIME ARE THE BUFFERS PRIMED 39600019 BNZ OCR035 YES,BRANCH 39900019 * 40200019 *********************************************************************** 40500019 * 40800019 * PRIME BUFFERS SUBROUTINE 41100019 * 41400019 *********************************************************************** 41700019 NI DCBIFLGS,ERRFLGS MAKE SURE ERROR FLAGS ARE OFF 42000019 * 42300019 SR WORK3R,WORK3R CLEAR REGISTER 42600019 CLI DCBBUFNO,ONE IF BUFFER NUMBER IS ONE A33921 42700020 BE OCR0341 GO TO OCR0341 A33921 42800020 IC WORK3R,DCBBUFNO GET NUMBER OF BUFFERS 42900019 BCTR WORK3R,0 DECREMENT BY 1 FOR LOCATE MODE 43200019 OCR033 L IOBADR,0(IOBADR) GET ADDRESS OF NEXT IOB 43500019 ST IOBADR,DCBIOBA STORE THAT IOB ADDRESS TO THE DCB 43800019 * 44100019 * 44400019 BAL RETR,OCR040 BRANCH AND LINK TO CLEAR BUFFER 44700019 * 45000019 L ENTRYR,DCBEOB LOAD ADDRESS OF END OF BLOCK ROUTINE 45300019 * 45600019 OCR034 BALR RETR,ENTRYR BRANCH AND LINK TO EOB ROUTINE 45900019 BCT WORK3R,OCR033 IF MORE IOBS, BRANCH TO SCHEDULE 46200019 L IOBADR,0(IOBADR) GET IOB ADDRESS THAT WAS NOT SCHED 46500019 ST IOBADR,DCBIOBA STORE TO DCB 46800019 OCR0341 OI DCBORBYT,BUFPRIME SET BUFFERS PRIMED SWITCH ON A33921 47100020 * 47400019 *********************************************************************** 47700019 OCR035 AH RECADR,DCBLRECL DETERMINE NEXT RECORD ADDRESS 48000019 CR RECADR,EOBADR END OF BLOCK ADDRESS 48300019 BL OCR085 NO,BRANCH TO GIVE ADDRESS OF REC 48600019 * 48900019 LA RETR,OCR070 LOAD CORRECT RETURN ADDRESS 49200019 EJECT 49500019 *********************************************************************** 49800019 * 50100019 * CLEAR BUFFER SUBROUTINE 50400019 * 50700019 *********************************************************************** 51000019 OCR040 SR WORK1R,WORK1R CLEAR REGISTER 51300019 IC WORK1R,DCBOFFSR GET OFFSET OF CHANNEL PROGRAM 51600019 AR WORK1R,IOBADR GET ADDRESS OF CHANNEL PROGRAM 51900019 L BUFADR,BUF(WORK1R) LOAD BUFFER ADDRESS 52200019 LA BUFADR,ONE(BUFADR) CLEAR HI BYTE AND INCREMENT BY 1 52500019 SH BUFADR,CNT(WORK1R) SUBTRACT RECORD LENGTH 52800019 TM DCBRECFM,UNDEF UNDEFINED RECORDS 53100019 BO OCR045 YES, BRANCH 53400019 SH BUFADR,FOUR FOR VAR RECS, SUB 4 TO ACCOUNT FOR 53700019 * FOUR BYTE PREFIX IN BUFFER 54000019 OCR045 LH LNGHR,DCBBUFL LOAD LENGTH OF BUFFER 54300019 LA CON255R,C255 LOAD CONSTANT = 255 54600019 BCTR LNGHR,0 DECREMENT LENGTH BY 1 54900019 * 55200019 OCR050 CR LNGHR,CON255R COMPARE LENGTH TO CLEAR WITH 255 55500019 BNH OCR060 IF 255 OR LESS, BRANCH 55800019 * 56100019 EX CON255R,OCR055E CLEAR 256 BYTES 56400019 * 56700019 SR LNGHR,CON255R SUBTRACT 255 FROM AMT TO BE CLEARED 57000019 BCTR LNGHR,0 SUBTRACT ONE MORE BYTE 57300019 LA BUFADR,C256(BUFADR) UPDATE AREA ADDRESS 57600019 B OCR050 BRANCH TO TEST FOR MORE 57900019 * 58200019 OCR055E XC 0(1,BUFADR),0(BUFADR) CLEAR INSTRUCTION USED BY EX INSTR 58500019 * 58800019 OCR060 EX LNGHR,OCR055E CLEARS LESS THAN 256 BYTES 59100019 * 59400019 BR RETR RETURN TO CALLING ROUTINE 59700019 * 60000019 *********************************************************************** 60300019 EJECT 60600019 OCR070 TM DCBORBYT,EOFBIT TEST IF END OF FILE IS ON 60900019 BO OCR075 IF YES, DO NOT SCHEDULE,BRANCH 61200019 L ENTRYR,DCBEOB LOAD ADDRESS OF EOB ROUTINE 61500019 OCR072 BALR RETR,ENTRYR BRANCH AND LINK TO EOB ROUTINE 61800019 * 62100019 OCR075 L ENTRYR,DCBGERR LOAD ADDRESS OF GERR ROUTINE 62400019 * 62700019 OCR080 BALR RETR,ENTRYR BRANCH AND LINK TO GERR RTN 63000019 * 63300019 OCR085 CLC DCBERRCN+1(ADDRESS),ZEROS ARE COUNTERS SPECIFIED 63600019 BE OCR090 NO, BRANCH 63900019 * 64200019 * 64500019 L WORK1R,DCBERRCN LOAD ADR OF 32 BYTE COUNT AREA 64800019 L WORK2R,LINECNT(WORK1R) LOAD NO. OF LINES READ 65100019 LA WORK2R,ONE(WORK2R) ADD 1 TO COUNT 65400019 ST WORK2R,LINECNT(WORK1R) STORE COUNT 65700019 OCR090 LR WORK2R,RECADR SAVE BEGINNING ADR OF BUFFER FOR REC 66000019 SR WORK1R,WORK1R CLEAR REGISTER 66300019 IC WORK1R,DCBOFFSR LOAD CHANNEL PROGRAM OFFSET 66600019 AR WORK1R,IOBADR LOAD CHANNEL PROGRAM ADDRESS 66900019 LH LNGHR,CNT(WORK1R) LOAD LENGTH OF RECORD FROM CCW 67200019 TM DCBRECFM,UNDEF UNDEFINED BUFFER SPECIFIED 67500019 BO OCR095 IF YES,BRANCH 67800019 LA LNGHR,LPREFIX(LNGHR) ADD 4 FOR VARIABLE RECORDS TO GET 68100019 * LENGTH OF RECORD BUFFER 68400019 OCR095 LR WORK3R,LNGHR LOAD COUNT FOR BUFFER SCAN 68700019 * 69000019 OCR092 CLI 0(RECADR),ZERO IS BUFFER BYTE = 0 69300019 BNE OCR100 NO, BRANCH 69600019 LA RECADR,ONE(RECADR) INCREMENT BUFFER POINTER BY 1 69900019 BCT WORK3R,OCR092 BRANCH TO CHECK NEXT BYTE FOR ZERO 70200019 * 70500019 OCR100 AR WORK2R,LNGHR ADD MAX LENGTH TO BEGIN TO GET END 70800019 OCR110 SR WORK2R,RECADR SUBTRACT BEGINNING OF DATA FROM 71100019 * END OF RECORD BUFFER TO GET LENGTH 71400019 TM DCBRECFM,UNDEF TEST FOR UNDEFINED RECORDS 71700019 BO OCR120 YES,BRANCH 72000019 * 72300019 LA WORK2R,LPREFIX(WORK2R) ADD 4 TO LNGH TO INCLUDE PREFIX 72600019 STH WORK2R,DCBLRECL STORE LNGH TO DCB 72900019 SH RECADR,FOUR SUBTRACT 4 FROM REC ADDR TO GET PRE- 73200019 * FIX ADDRESS, THEN STORE IN DCB 73500019 MVC 0(LNGH,RECADR),DCBLRECL MOVE LENGTH TO PREFIX 73800019 B OCR130 BRANCH TO CONT. PROCESSING 74100019 * 74400019 OCR120 STH WORK2R,DCBLRECL STORE UNDEFINED LENGTH TO DCB 74700019 * 75000019 * 75300019 OCR130 LR PARA1R,RECADR RECORD ADDRESS TO REGISTER 1 75600019 ST PARA1R,DCBRECAD STORE RECORD ADDRESS TO DCB 75900019 AH RECADR,DCBLRECL DETERMINE ADDRESS OF NEXT RECORD 76200019 L WORK1R,DCBEOBAD LOAD EOB ADDRESS 76500019 SR ENTRYR,ENTRYR CLEAR REGISTER 15 76800019 CR RECADR,WORK1R COMPARE NEXT REC ADR TO EOB ADDRESS 77100019 BL OCR140 IF LESS, BRANCH 77400019 CLI DCBEIB+1,NOERROR IS RETURN CODE = 0 77700019 BE OCR140 YES,BRANCH 78000019 IC ENTRYR,DCBEIB+1 LOAD RETURN CODE 78300019 XC DCBEIB+1(ONE),DCBEIB+1 CLEAR RETURN CODE SAVE AREA 78600019 * 78900019 OCR140 LM DCBR,BASER,USERREG(SAVR) RESTORE USER REGISTERS @YA00403 79200002 L RETR,RETREG(SAVR) RESTORE RETURN REGISTER 79500019 OCR150 BR RETR RETURN TO USER 79800019 FOUR DC 1H'4' USED AS A CONSTANT OF 4 80100019 CNOP 0,8 PAD TO DOUBLE WORD BOUNDARY 80400019 DCBD DSORG=PS,DEVD=OR @YM00635 80700002 END 81000019