TITLE 'ICATS FAKE A READ-FROM-A-UTS ROUTINE' FAK00010
*********************************************************************** FAK00020
* * FAK00030
* MODULE NAME = FAKE UTS READ * FAK00040
* * FAK00050
* FUNCTION = SIMULATE A READ FROM A UTS MACHINE BY READING * FAK00060
* DATA FROM THE CMS FILE ICATS INDATA A, AND * FAK00070
* PUTTING IT WHERE THE CALLER WANTS. * FAK00080
* IF THE END OF THE CMS FILE IS HIT BEFORE WE HAVE * FAK00090
* READ ENOUGH BYTES, RESTART FROM THE BEGINNING. * FAK00100
* * FAK00110
* NOTE = YOU CAN SIMULATE EITHER FIXED- OR VARIABLE-LENGTH * FAK00120
* UTS DATA BY CHANGING THE DATA IN THE CMS FILE * FAK00130
* ICATS INDATA A. USE THE VIN OR FIN EXECS TO * FAK00140
* CHANGE THAT FILE. * FAK00150
* * FAK00160
* ENTRY POINTS = FAKEREAD * FAK00170
* * FAK00180
* LINKAGE = SOME ROUTINE DECIDES TO READ SOME DATA FROM THE UTS * FAK00190
* (FOR EXAMPLE, THE WRITE ROUTINE TO GET THE DATA TO * FAK00200
* WRITE TO THE CMS FILE), BUT THIS REQUEST DIDN'T COME * FAK00210
* FROM A REAL UTS. RATHER IT CAME FROM A FAKE * FAK00220
* INTERRUPT VIA THE FAKIT COMMAND. * FAK00230
* THE CALLER DID THIS * FAK00240
* LA R0,XXX HOW MANY BYTES HE WANTS * FAK00250
* LA R1,BUFFER WHERE HE WANTS IT * FAK00260
* L R15,AREADUTS * FAK00270
* BALR R14,R15 * FAK00280
* TO GET TO THE UTS I/O ROUTINE AND THE UTS I/O * FAK00290
* ROUTINE DETERMINED THIS WAS A FAKE INTERRUPT, SO * FAK00300
* IT DID THIS * FAK00310
* L R15,FAKEREAD * FAK00320
* BALR R14,R15 * FAK00330
* TO GET TO ME. * FAK00340
* * FAK00350
* REGISTER CONTENTS UPON ENTRY = * FAK00360
* R0 = HOW MANY BYTES THE CALLER WANTS FROM THE UTS. * FAK00370
* R1 = THE BUFFER ADDRESS. * FAK00380
* R2 = POINTS TO THE ICATS COMMON DATA AREA AS ALWAYS. * FAK00390
* R14 = RETURN ADDRESS BACK TO THE UTS I/O ROUTINE. * FAK00400
* R15 = ADDRESS OF THIS SUBROUTINE (USED FOR BASE REG). * FAK00410
* * FAK00420
* REGISTER CONTENTS UPON EXIT = * FAK00430
* R15 = 0 = EVERYTHING WENT OK. * FAK00440
* OR R15 = 4 = THE FILE ICATS INDATA A DOES NOT EXIST. * FAK00450
* OR R15 = 8 = INCORRECT BUFFER LENGTH (NOT POSITIVE). * FAK00460
* * FAK00470
* REGISTER USAGE: * FAK00480
* R0 = FREE * FAK00490
* R1 = FREE * FAK00500
* R2 = ICATS COMMON DATA AREA BASE REGISTER (ICDATA) * FAK00510
* R3-R6 = FREE * FAK00520
* R7 = BUFFER ADDRESS LENGTH. AMOUNT OF DATA LEFT TO READ. * FAK00530
* R8 = BUFFER ADDRESS POINTER. WHERE TO PUT THE NEXT RECORD. * FAK00540
* R9 = FREE * FAK00550
* R10 = USED TEMPORARILY TO HOLD THE RETURN CODE * FAK00560
* R11 = BASE REGISTER FOR THIS ROUTINE * FAK00570
* R12-R13 = FREE * FAK00580
* R14 = TEMPORARY WORK REGISTER AND RETURN ADDRESS FOR WHEN * FAK00590
* CALL SUBROUTINES * FAK00600
* R15 = SUBROUTINE ADDRESS * FAK00610
* * FAK00620
* NORMAL EXIT = * FAK00630
* R15 = 0 * FAK00640
* * FAK00650
* EXTERNAL REFERENCES = NONE * FAK00660
* * FAK00670
* CONTROL BLOCKS = ICDATA (ICATS COMMON DATA AREA) * FAK00680
* * FAK00690
* NON-STANDARD MACROS (FOUND IN ICATS MACLIB) * FAK00700
* ICDATA = ICATS COMMON DATA AREA DSECT. * FAK00710
* * FAK00720
* CHANGE ACTIVITY * FAK00730
* DATE NAME REASON FOR CHANGE * FAK00740
* 04/21/83 RICK JASPER BROKEN AWAY FROM ICATS MAINLINE INTO * FAK00750
* SEPARATE SUBROUTINE * FAK00760
* * FAK00770
*********************************************************************** FAK00780
EJECT FAK00790
PRINT GEN,NODATA FAK00800
FAKEREAD CSECT FAK00810
USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA FAK00820
USING FAKEREAD,R15 USE R15 FOR NEXT INSTRUCTION ONLY FAK00830
STM R1,R14,UTSIOREG SAVE CALLERS REGISTERS FAK00840
DROP R15 FAK00850
USING FAKEREAD,R11 USE R11 FOR THIS ROUTINE'S BASE REG FAK00860
LR R11,R15 SWITCH BASE REGISTER TO R11 FAK00870
LTR R0,R0 INSURE POSITIVE LENGTH FAK00880
BNP READBAD0 GIVE AN ERROR IF <= 0 FAK00890
LR R7,R0 SAVE BUFFER LENGTH FAK00900
LR R8,R1 SAVE BUFFER ADDRESS FAK00910
FSOPEN 'ICATS INDATA A' FAK00920
LTR R15,R15 CHECK FOR FILE-DOES-NOT-EXIST FAK00930
BNZ READNONE NOPE, FILE'S NOT THERE FAK00940
READREAD DS 0H FAK00950
FSREAD 'ICATS INDATA A',BUFFER=(R8),BSIZE=(R7) FAK00960
C R15,=F'12' SEE IF END-OF-FILE YET FAK00970
BNE READCONA NOPE, WE DID READ SOMETHING FAK00980
* ELSE RESET READ POINTER TO START OF FILE FAK00990
FSPOINT 'ICATS INDATA A',RDPNT=1 FAK01000
B READREAD START RE-READING THE FILE FAK01010
READCONA DS 0H NOTE: R0 = # BYTES DATA JUST READ FAK01020
AR R8,R0 POINT TO NEXT DATA AREA FAK01030
SR R7,R0 THERE'S LESS LEFT TO READ NOW FAK01040
BP READREAD CONTINUE READING IF NOT DONE YET FAK01050
LA R10,0 RETURN CODE = 0 = EVERYTHING'S GREAT FAK01060
READBYE FSCLOSE 'ICATS INDATA A' FAK01070
LR R15,R10 TRANSFER RETURN CODE FAK01080
LM R1,R14,UTSIOREG FAK01090
BR R14 BYE FAK01100
* FAK01110
READNONE LA R10,4 RC = 4 = ICATS INDATA A DOES NOT EXIST FAK01120
B READBYE FAK01130
* FAK01140
READBAD0 LA R10,8 RC = 8 = INCORRECT BUFFER LENGTH FAK01150
B READBYE FAK01160
* FAK01170
READMVC MVC 0(0,R8),RCBINBUF FAK01180
UTSIOREG DS 15F FAK01190
RCBINBUF DS CL80 FAK01200
LTORG FAK01210
ICDATA FAK01220
END FAK01230