DIO TITLE 'DMSDIO (CMS) VM/370 - RELEASE 6' 00001000
SPACE 2 00002000
*. 00004000
* 00005000
* MODULE NAME: 00006000
* 00007000
* DMSDIO (DISKIO) 00008000
* 00009000
* SUBROUTINE NAME: 00010000
* 00011000
* DMSDIOR (RDTK) 00012000
* 00013000
* FUNCTION: 00014000
* 00015000
* TO READ ONE OR MORE 800-BYTE RECORDS (BLOCKS) FROM 00016000
* DISK, OR TO READ ONE 200-BYTE RECORD (SUB-BLOCK) FROM 00017000
* DISK. 00018000
* 00019000
* ATTRIBUTES: 00020000
* 00021000
* NUCLEUS RESIDENT, REENTRANT 00022000
* 00023000
* ENTRY POINTS: 00024000
* 00025000
* DMSDIOR 00026000
* 00027000
* ENTRY CONDITIONS: 00028000
* 00029000
* L R15,ARDTK WHERE ARDTK=V(DMSDIOR) 00030000
* BALR R14,R15 00031000
* 00032000
* R1 MUST POINT TO PARAMETER LIST AS FOLLOWS: 00033000
* 00034000
* DS OF 00035000
* PLIST DC A(BUFF) ADDRESS OF BUFFER INTO 00036000
* WHICH DATA IS TO BE READ 00037000
* DC F' ' SIZE OF ABOVE BUFFER (BYTE COUNT) 00038000
* DC A(DISKAD) ADDRESS OF LIST CONTAINING 00039000
* DISK ADDRESSES OF ALL RECORD(S) 00040000
* TO BE READ 00041000
* DC A(DSKTBL) ADDRESS OF (POINTER TO) ACTIVE 00042000
* DISK TABLE BLOCK PERTAINING TO DISK 00043000
* TO BE READ 00044000
* 00045000
* EXIT CONDITIONS: 00046000
* 00047000
* NORMAL RETURN 00048000
* R15=0 (AND CONDITION-CODE=0) 00049000
* 00050000
* ERROR RETURNS 00051000
* R15=1: NO ACTIVE-DISK-TABLE BLOCK FOUND BY ADTLKP 00052000
* WHERE MODE-LETTER WAS SUPPLIED 00053000
* R15=2: PERMANENT I/O ERROR READING DISK 00054000
* R15=3: UNSUPPORTED DASD OR NOT ATTACHED 00055000
* R15=5: DISK-ADDRESS=0 (A PROGRAMMING BUG BY CALLER) 00056000
* OR NOT WITHIN DISK LIMITS 00057000
* R15=7: ATTEMPT TO READ INTO CMS NUCLEUS BELOW FREAR 00058000
* R15=8: UNDETERMINED ERROR (CP DIAGNOSE CONDITION CODE 2) 00059000
* R15=25: INSUFFICIENT FREE STORAGE AVAILABLE 00059500
* 00060000
* CALLS TO OTHER ROUTINES: 00061000
* 00062000
* DMSLAD, DMSFREE, DMSFRET 00063000
* 00064000
* EXTERNAL REFERENCES: 00065000
* 00066000
* DMSNUC, ADTSECT, DIOSECT 00067000
* 00068000
* TABLES/WORKAREAS: 00069000
* 00070000
* 800 BYTE BUFFER AREA 00071000
* 00072000
* REGISTER USAGE: 00073000
* 00074000
* R15 DIOSECT 00075000
* R2 BASE 00076000
* REST WORK 00077000
* 00078000
* NOTES: 00079000
* 00080000
* (1) THE FORMAT OF EACH DISK ADDRESS SUPPLIED IN 00081000
* THE LIST FOR EACH 800-BYTE RECORD IS A HALFWORD 00082000
* BLOCK NUMBER. 00083000
* 00084000
* (2) IF THE BUFFER-SIZE (BYTE COUNT) IS ZERO, A 00085000
* 200-BYTE RECORD (SIXTEENTH-TRACK) IS TO BE READ. 00086000
* 00087000
* (3) DMSDIOR WILL ACCEPT A DISK MODE IN PLACE OF 00088000
* THE POINTER TO THE ACTIVE DISK TABLE: DMSIAD IS 00089000
* CALLED IN THIS CASE TO FIND THE EQUIVALENT DISK. 00090000
* 00091000
* (4) A SPECIAL INTERFACE BETWEEN CMS AND CP WILL 00092000
* CAUSE INPUT/OUTPUT OPERATIONS TO BE EXECUTED BY 00093000
* CP. CONTROL WILL NOT BE RETURNED TO CMS UNTIL 00094000
* THE OPERATION IS COMPLETE. ANY NECESSARY ERROR 00095000
* RECOVERY WIL BE DONE BY CP. 00096000
* 00097000
* OPERATION: 00098000
* 00099000
* DMSDIOR DETERMINES WHETHER OR NOT THE CALLING PROGRAM 00100000
* WISHES TO READ A 800-BYTE RECORD. IF IT DOES NOT, 00101000
* DMSDIOR CHECKS TO SEE IF 00102000
* THE BYTE COUNT EXCEEDS 800 BYTES, IMPLYING MORE THAN 00103000
* ONE 800-BYTE RECORD TO BE READ. IF SO, FREE STORAGE 00104000
* IS OBTAINED, AND CHAINED CCW'S ARE USED INSOFAR AS 00105000
* PRACTICAL TO READ AS MANY RECORDS AS POSSIBLE WITH 00106000
* ONE IO TO THE DISK. IF NOT MORE THAN 800, NO FREE 00107000
* STORAGE IS NECESSARY AS A STANDARD CCW PACKAGE (IN 00108000
* DIOSECT) IS USED. IN ANY EVENT, WHETHER OR NOT 00109000
* REPEATED IO'S ARE NECESSARY, THE DATA IS READ INTO 00110000
* THE DESIGNATED BUFFER, FREE STORAGE IS RETURNED IF 00111000
* NECESSARY, AND RETURN IS MADE TO THE CALLER. IF THE 00112000
* BYTE COUNT EXCEEDS 800, IT NEED NOT NECESSARILY BE AN 00113000
* EXACT MULTIPLE OF 800. 00114000
* 00115000
* IF THE CALLING PROGRAM WISHES TO READ A 200-BYTE 00116000
* RECORD (SUB-BLOCK), 00117000
* DMSDIOR CALLS THE DMSFREE TO OBTAIN AN 800-BYTE 00118000
* BUFFER. IT THEN READS THE 800-BYTE BLOCK CONTAINING 00119000
* THE DESIRED SUB-BLOCK INTO THE BUFFER. 00120000
* NEXT, DMSDIOR EXTRACTS THE DESIRED SUB-BLOCK FROM THE 00121000
* 800-BYTE BUFFER AND MOVES IT TO THE 200-BYTE BUFFER 00122000
* THE 200-BYTE 00123000
* BUFFER SPECIFIED IN THE PARAMETER LIST. IT THEN 00124000
* CALLS THE DMSFRET TO RELEASE THE 800-BYTE BUFFER, THE 00125000
* ENTIRE BLOCK WAS READ INTO AND RETURNS TO THE CALLING 00126000
* PROGRAM. SUB-BLOCKS ARE RESERVED FOR FIRST CHAIN 00127000
* LINK AREAS AND SHOULD NOT BE USED FOR OTHER PURPOSES. 00128000
* 00129000
* NOTE: 00130000
* 00131000
* IF THE 200-BYTE BLOCK IS THE FIRST 200 BYTES OF AN 00132000
* 800 BYTE BUFFER, DMSDIOR READS 200 BYTES DIRECTLY 00133000
* INTO THE DESIGNATED 00134000
* STORAGE AREA INSTEAD OF OBTAINING FREE STORAGE AND 00135000
* MOVING THE 200 BYTES LATER. 00136000
* 00137000
* MODULE NAME: 00138000
* 00139000
* DMSDIO (DISKIO) 00140000
* 00141000
* SUBROUTINE NAME: 00142000
* 00143000
* DMSDIOW (WRTK) 00144000
* 00145000
* FUNCTION: 00146000
* 00147000
* TO WRITE ONE OR MORE 800-BYTE RECORDS (BLOCKS) ON 00148000
* DISK, OR TO WRITE ONE 200-BYTE RECORD (SUB-BLOCK) ON 00149000
* DISK. 00150000
* 00151000
* ATTRIBUTES: 00152000
* 00153000
* NUCLEUS RESIDENT, REENTRANT 00154000
* 00155000
* ENTRY POINTS: 00156000
* 00157000
* DMSDIOW 00158000
* 00159000
* ENTRY CONDITIONS: 00160000
* 00161000
* L R15,AWTRK WHERE WRTK=V(WRTK) 00162000
* BALR R14,R15 00163000
* 00164000
* R1 MUST POINT TO PARAMETER LIST AS FOLLOWS: 00165000
* DS OF 00166000
* PLIST DS A(BUFF) ADDRESS OF BUFFER FROM WHICH 00167000
* DATA IS TO BE WRITTEN 00168000
* DC F' ' SIZE OF ABOVE BUFFER (BYTE COUNT) 00169000
* DC A(DISKAD ADDRESS OF LIST CONTAINING DISK 00170000
* ADDRESSES OF ALL RECORD(S) TO BE WRITTEN 00171000
* DC A(DSKTBL) ADDRESS OF (POINTER TO) ACTIVE DISK 00172000
* TABLE BLOCK PERTAINING TO DISK TO BE WRITTEN. 00173000
* 00174000
* EXIT CONDITIONS: 00175000
* 00176000
* NORMAL RETURN 00177000
* R15=0 (AND CONDITION-CODE=0) 00178000
* 00179000
* ERROR RETURNS 00180000
* R15=1: NO ACTIVE-DISK-TABLE BLOCK FOUND BY ADTLKP 00181000
* WHERE MODE-LETTER WAS SUPPLIED 00182000
* R15=2: PERMANENT I/O ERROR WRITING DISK 00183000
* R15=3: UNSUPPORTED DASD OR NOT ATTACHED 00184000
* R15=4: ATTEMPT TO WRITE ON SYSTEM DISK (MODE=S) 00185000
* R15=5: DISK-ADDRESS=0 (A PROGRAMMING BUG BY CALLER) 00186000
* OR NOT WITHIN DISK LIMITS 00187000
* R15=6: ATTEMPT TO WRITE ON READ-ONLY DISK 00188000
* R15=8: UNDETERMINED ERROR (CP DIAGNOSE CONDITION CODE 2) 00189000
* R15=25: INSUFFICIENT FREE STORAGE AVAILABLE 00189500
* 00190000
* CALLS TO OTHER ROUTINES: 00191000
* 00192000
* DMSLAD, DMSFREE, DMSFRET 00193000
* 00194000
* EXTERNAL REFERENCES: 00195000
* 00196000
* DMSNUC, DIOSECT, ADTSECT 00197000
* 00198000
* TABLES/WORKAREAS: 00199000
* 00200000
* 800 BYTE BUFFER AREA OBTAINED FROM FREE STORAGE 00201000
* 00202000
* REGISTER USAGE: 00203000
* 00204000
* R0, R1, R3-14 = WORK REGISTERS 00205000
* R15 DIOSECT 00206000
* R2 BASE 00207000
* 00208000
* NOTES: 00209000
* 00210000
* (1) THE FORMAT OF EACH DISK ADDRESS SUPPLIED IN 00211000
* THE LIST FOR EACH 800-BYTE RECORD IS A HALFWORD 00212000
* BLOCK NUMBER. 00213000
* 00214000
* (2) IF THE BUFFER SIZE (BYTE COUNT) IS ZERO, A 00215000
* 200-BYTE RECORD IS TO BE WRITTEN. 00216000
* 00217000
* (3) WRTK WILL ACCEPT A DISK MODE IN PLACE OF THE 00218000
* POINTER TO THE ACTIVE DISK TABLE. 00219000
* 00220000
* OPERATION: 00221000
* 00222000
* DMSDIOW DETERMINES WHETHER OR NOT THE CALLING PROGRAM 00223000
* WISHES TO WRITE A SUB-BLOCK. IF IT DOES NOT, DMSDIOW 00224000
* CHECKS 00225000
* TO SEE IF THE BYTE COUNT EXCEEDS 800 BYTES, IMPLYING 00226000
* MORE THAN ONE 800-BYTE RECORD TO BE WRITTEN. IF SO, 00227000
* FREE STORAGE IS OBTAINED, AND CHAINED CCW'S ARE USED 00228000
* INSOFAR AS PRACTICAL TO WRITE AS MANY RECORDS AS 00229000
* POSSIBLE WITH ONE IO OPERATION. IF NOT MORE THAN 00230000
* 800, NO FREE STORAGE IS NECESSARY, AS A STANDARD CCW 00231000
* PACKAGE (IN DIOSECT) IS USED. IN ANY EVENT, WHETHER 00232000
* OR NOT REPEATED IO'S ARE NECESSARY, THE DATA IS 00233000
* WRITTEN FROM THE DESIGNATED BUFFER, FREE STORAGE IS 00234000
* RETURNED IF NECESSARY, AND RETURN IS MADE TO THE 00235000
* CALLER. IF THE BYTE COUNT EXCEEDS 800, IT NEED NOT 00236000
* NECESSARILY BE AN EXACT MULTIPLE OF 800. 00237000
* 00238000
* IF THE CALLING PROGRAM WISHES TO WRITE A SUB-BLOCK, 00239000
* DMSDIOW OBTAINS 800 BYTES OF BUFFER SPACE INTO WHICH 00240000
* TO READ 00241000
* THE BLOCK (IN WHICH THE 200 BYTES OF DATA IS TO BE 00242000
* PLACED). IT THEN READS THAT BLOCK INTO THE BUFFER. 00243000
* NEXT, 00244000
* DMSDIOW MOVES 200 BYTES OF DATA FROM THE BUFFER 00245000
* POINTED TO BY THE PARAMETER 00246000
* LIST INTO THE APPROPRIATE SUB-BLOCK LOCATION IN THE 00247000
* BUFFER CONTAINING 00248000
* THE 800-BYTE BLOCK. DMSDIOW THEN WRITES THE UPDATED 00249000
* BLOCK BACK ONTO 00250000
* THE DISK AT ITS ORIGINAL LOCATION, RELEASES THE 800 00251000
* BYTES IT USED AS A BUFFER, AND RETURNS TO THE CALLING 00252000
* PROGRAM. 00253000
* 00254000
* NOTE: 00255000
* 00256000
* IF THE 200-BYTE SUB-BLOCK IS THE FIRST 200 BYTES OF 00257000
* AN 800-BYTE BUFFER AND THE REMAINING 600 BYTES ARE 00258000
* NOT USED 00259000
* DMSDIOW WRITES 200 BYTES DIRECTLY FROM THE DESIGNATED 00260000
* STORAGE AREA 00261000
* INSTEAD OF THE READ, MOVE, AND WRITE PROCEDURE 00262000
* DESCRIBED ABOVE. 00263000
* 00264000
* DIRECT I/O 00265000
* 00266000
* INPUT/OUTPUT ACTIVITY TO DISK WILL BE INITIATED BY A 00267000
* SPECIALLY CODED DIAGNOSE INSTRUCTION. 00268000
* 00269000
* A DIAGNOSE INSTRUCTION WITH A CODE X'18' IS ISSUED TO 00270000
* SIGNAL CP TO PERFORM THE DESIGNATED I/O OPERATION. 00271000
* R4 CONTAINS THE DEVICE-ADDRESS, AND R8 POINTS TO THE 00272000
* STANDARD CCW CHAIN: 00273000
* 00274000
* FOR 2314 OR 2319 00275000
* 00276000
* SEEK CCHH 00277000
* SEARCH CCHHR 00278000
* TIC *-8 00279000
* READ/WRITE 00280000
* CCHHR DC X'CCHHR' 00281000
* 00282000
* FOR 3330, 3340, 3350 OR 3380 HRC004DS 00283490
* 00284000
* SEEK CCHH 00285000
* SET SECTOR 00286000
* SEARCH CCHHR 00287000
* TIC *-8 00288000
* READ/WRITE 00289000
* CCHHR DC X'CCHHR' 00290000
* 00291000
* IF THE OPERATION IS SUCCESSFUL, CP RETURNS TO CMS WITH A 00292000
* CONDITION-CODE 0; THIS INDICATES THAT THE OPERATION WAS 00293000
* SUCCESSFULLY STARTED AND COMPLETED. 00294000
* 00295000
* UPON RETURN TO CMS, THE FOLLOWING CONDITION CODES AND ERROR 00296000
* CODES ARE RETURNED: 00297000
* 00298000
* CONDITION-CODE (CC) = 0: I/O COMPLETE WITH NO ERRORS. 00299000
* 00300000
* CC = 1: ERROR CONDITION, AS PER R15 RETURNS 1-4 00301000
* 00302000
* CC = 2: ERROR CONDITION, AS PER R15 RETURNS 5-12 00303000
* 00304000
* CC = 3: UNCORRECTABLE I/O ERROR, AS PER R15 RETURN 13 00305000
* OR INVALID DIAGNOSE CALL 00306000
* 00307000
* ERROR-CODE RETURNED IN R15, AS FOLLOWS: 00308000
* 00309000
* 1 = DEVICE NOT ATTACHED 00310000
* 2 = DEVICE IS IS AN UNSUPPORTED DASD DEVICE 00311000
* 3 = ATTEMPT TO WRITE ON A READ-ONLY DISK-WORD ALIGNED 00312000
* 4 = CYLINDER NUMBER NOT WITHIN RANGE OF USER'S DISK 00313000
* 5 = POINTER TO USER'S CCW STRING NOT DBL-WORD ALIGNED 00314000
* 6 = CCW OR SEEK/SEARCH ARGUMENTS NOT WITHIN USER CORE 00315000
* 7 = USER CCW IS INVALID 00316000
* 8 = READ/WRITE BYTE-COUNT = 0 00317000
* 9 = READ/WRITE BYTE-COUNT GREATER THAN 2048 00318000
* 10 = USER'S R15 AT ENTRY NOT POSITIVE NUMBER 00319000
* OR IS NOT LARGE ENOUGH FOR GIVEN CCW STRING 00320000
* 12 = CYLINDER NUMBER ON SEEK-HEAD DOES NOT MATCH 00321000
* THE CYLINDER NUMBER ON THE FIRST SEEK 00322000
* 13 = UNCORRECTABLE I/O ERROR (CSW RETURNED 00323000
* TO THE USER; SENSE BYTES AVAILABLE IF USER 00324000
* DOES A SENSE.) 00325000
* 00326000
* UNSUCCESSFUL DISK I/O: BECAUSE OF USE OF THE DIAGNOSE 00327000
* SIGNAL, CP IS IN A POSITION OF KNOWING WHAT I/O ACTIVITY THE 00328000
* VIRTUAL MACHINE DESIRES. CP WILL PERFORM ERROR RECORDING, 00329000
* RETRY, RECOVERY OR ABORT PROCEDURES FOR THE CMS VIRTUAL 00330000
* MACHINE. 00331000
* 00332000
*. 00333000
EJECT 00334000
********************************************************************** 00335000
* 00336000
* INITIALIZATION 00337000
* 00338000
********************************************************************** 00339000
DMSDIO START 0 @VA01921 00340300
RDTK EQU DMSDIO @VA01921 00340600
ENTRY RDTK @VA01921 00340900
ENTRY WRTK 00341000
ENTRY DMSDIOR 00342000
ENTRY DMSDIOW 00343000
USING NUCON,R0 00344000
SPACE 00345000
USING RDTK,R15 00346000
DMSDIOR EQU * 00347000
L R15,ADIOSECT SET UP R15 BRIEFLY FOR 00348000
USING DIOSECT,R15 EXTERNAL DIO-SECT 00349000
STM R0,R14,XRSAVE SAVE THE REGISTERS (NOT 15) 00350000
LR R12,R15 SWITCH DSECT-ADDRESSABILITY 00351000
DROP R15 TO R12 INSTEAD OF R15 00352000
USING DIOSECT,R12 ... 00353000
BALR BASE,0 NOW ESTABLISH 00354000
USING *,BASE OUR OWN 00355000
LA BASE,COMAD COMMON ADDRESSABILITY 00356000
USING COMAD,BASE ... 00357000
MVI IOCOMM,READ SET IO COMMAND TO READ 00358000
CLC 0(4,R1),ANUCEND IS CORE-ADDRESS WITHIN CMS NUC? 00359000
BNL COMMON TRF IF NOT (OK) - JOIN COMMON 00360000
* 00361000
MVI ERRCODE,07 ATTEMPT TO RDTK INTO NUCLEUS IS 00362000
B RETURN2 NOW 'ERROR 7'. (24 NOV 70) 00363000
DROP BASE 00364000
SPACE 3 00365000
USING WRTK,15 00366000
DMSDIOW EQU * 00367000
WRTK L R15,ADIOSECT SET UP R15 BRIEFLY FOR 00368000
USING DIOSECT,R15 EXTERNAL DIO-SECT 00369000
STM R0,R14,XRSAVE SAVE THE REGISTERS (NOT 15) 00370000
LR R12,R15 SWITCH DSECT-ADDRESSABILITY 00371000
DROP R15 TO R12 INSTEAD OF R15 00372000
USING DIOSECT,R12 00373000
BALR BASE,0 NOW ESTABLISH 00374000
USING COMAD,BASE OUR OWN 00375000
COMAD EQU * COMMON ADDRESSABILITY. 00376000
MVI IOCOMM,WRITE SET IO COMMAND TO WRITE 00377000
USING XPLIST,R1 (BRIEFLY) 00378000
CLI XMODE,C'S' TEST FOR ATTEMPT TO WRITE ON SYSTEM DISK 00379000
BNE COMMON OK, CONTINUE 00380000
MVI ERRCODE,04 NO, SET ERROR CODE = 4 00381000
B RETURN2 ERROR RETURN 00382000
DROP R1 00383000
EJECT 00384000
********************************************************************** 00385000
* 00386000
* COMMON RDTK/WRTK CODING 00387000
* 00388000
********************************************************************** 00389000
COMMON LR PLIST,1 SAVE PARAMETER LIST 00390000
USING XPLIST,PLIST ... 00391000
MVI DIOFLAG,X'00' CLEAR ALL FLAG-BITS 00392000
CLI XMODE,00 CHECK MODE, HOPEFULLY = 00 00393000
BE GETDEVT OK, GET DEVICE-TABLE DIRECTLY 00394000
S R1,=F'12' BACK OFF 12 BYTES TO MAKE MODE 24(R1) 00395000
L R15,VCADTLKP CALL ADTLKP @VM03093 00396100
BALR R14,R15 ... 00397000
BZ R1OK GOOD SHOW. 00398000
MVI ERRCODE,01 ERROR 1 IF ERROR FROM ADTLKP (SICK MODE) 00399000
B RETURN2 GO EXIT. 00400000
* 00401000
GETDEVT L R1,XMODE GET DEVICE-TABLE-ADDRESS FROM P-LIST 00402000
* 00403000
USING ADTSECT,R1 (BRIEFLY) 00404000
R1OK ST R1,SAVEADT KEEP THIS SAFE IN CASE WE NEED IT. 00405000
L XR1,ADTDTA ACCESS DEVICE TABLE IN NUCON 00406000
DROP R1 00407000
* 00408000
L R14,AFVS REFERENCE FVS INFO 00409000
USING FVSECT,R14 ... 00410000
OI UFDBUSY,DIOBIT SET OUR BIT IN 'UFDBUSY' FLAG 00411000
ST R1,ADTADD SAVE ADT ADDRESS @VA05652 00411500
DROP R14 00412000
* 00413000
LH DISKIO,DTAD(,XR1) GET ACTUAL DISK ADDRESS 00414000
IC R15,DTADT(,XR1) GET THE DEVICE-TYPE, @VA01695 00415100
STC R15,DEVTYP AND SAVE FOR GENERAL USE @VA01695 00415200
L BUFFAD,XBUFFAD GET ADDRESS OF BUFFER 00416000
L BUFFSZ,XBUFFSZ GET BUFFER SIZE 00417000
L DISKAD,XDISKAD GET ADDRESS OF DISK ADDRESS 00418000
SR R11,R11 CLEAR ERROR-COUNT FOR LATER USE, 00419000
ST R11,DIOFREE AND CLEAR FREE-STORAGE-ADDRESS 00420000
LTR BUFFSZ,BUFFSZ CHECK BYTE-COUNT, 00421000
BZ HANDLQQ BZ IF = 0, HANDLE DIFFERENTLY. 00422000
C BUFFSZ,RECSZ IF NOT, IS BYTE-COUNT > 800 ? 00423000
BNH READY BNH IF NOT, HANDLE REGULARLY. 00424000
OI DIOFLAG,TOOBIG SIGNAL TOO BIG TO TRY DIAGNOSE 00425000
LA R0,JSNEED IF > 800, GET 00426000
* GET SOME FREE STORAGE FOR A CCW-CHAIN AND DISK ADDRESS 00427000
DMSFREE DWORDS=(0),TYPCALL=BALR,TYPE=NUCLEUS 00428000
LTR R15,R15 FAIL IF STORAGE NOT @VA02374 00428300
BNZ ERROR25 ACQUIRED @VA02374 00428600
STM R0,R1,FREER0 SAVE NO. WORDS & ADDRESS FOR LATER 00429000
LR R8,R1 SET IT IN R8 WHERE NEEDED, 00430000
MVI LASTCYL+3,X'FF' SET CYLINDER NO. TO 255 TO FORCE 00431000
* A NEW CYLINDER-SEEK, AND CONTINUE... 00432000
* MAIN LOOP FOR READING SEVERAL 800 -BYTE RECORDS ... 00433000
LOOP LR R9,R8 SET R9 TO BEGINNING OF CCW-CHAIN, 00434000
LA R10,DSEEKA(,R8) SET R10 FOR SEEK-ADDRESSES, 00436000
MVI LASTREC,X'FF' FORCE SETSECT FOR 1ST IN CHN@VA02324 00436500
MVI LASTHED+3,X'FF' SET HEAD NUMBER PURPOSELY TO 255, 00437000
LA R0,PRACLIM PRACTICAL LIMIT INTO R0 FOR BCT-LOOP, 00438000
B LOOP2 AND CONTINUE SHORTLY BELOW ... 00439000
* LOOP FOR CHAINING ANOTHER CCW ... 00440000
LOOP1 MVI 20(R9),X'60' TURN ON COMMAND CHAINING 00441000
LA R9,24(,R9) REESTABLISH CCW-POINTER 00442000
AL BUFFAD,RECSZ INC. CORE-ADDRESS FOR NEXT REC. @VA01695 00443100
LA DISKAD,2(,DISKAD) INC. FOR NEXT DISK-ADDRESS, 00444000
* MAIN LOOP FOR SETTING UP ONE CCW-PACKAGE ... 00445000
LOOP2 BAL R13,JFILL2 FILL IN SEEK-ADDRESSES AND RWCCW, 00446000
C R14,LASTCYL IS IT THE SAME CYLINDER AS LAST TIME? 00447000
BE JAS1 BE IF YES. 00448000
ST R14,LASTCYL IF NOT, STORE NEW CYLINDER NUMBER 00449000
MVI LASTREC,X'FF' SET REC. NO. FOR SET-SECTOR TEST @VA01695 00449100
CR R9,R8 ARE WE AT THE BEGINNING OF CCW'S ? 00450000
BE JAS2A YES - START THE NEW CCW CHAIN. @VA01695 00451100
BCTR DISKAD,0 IF NOT DECREMENT 'DISKAD' BY 2 TO 00452000
BCTR DISKAD,0 COMPENSATE FOR BEING INCREMENTED LATER 00453000
SL BUFFAD,RECSZ AND DECR BUFFAD FOR SAME REASON, @VA01695 00454100
SH R9,=H'8' BACK UP TO THE LAST CCW P3094 00455000
MVI 4(R9),X'20' TURN OFF COMMAND CHAINING P3094 00456000
B JAS3A GO INCREMENT BUFFSZ & ADD NO-OP. 00457000
* IF CYLINDER NO. SAME AS LAST TIME, CHECK HEAD NUMBER ... 00458000
JAS1 C R15,LASTHED IF HEAD NUMBER SAME AS LAST TIME ? 00459000
BE JAS3 BE IF YES, OMIT UNNECESSARY SEEK. 00460000
CR R9,R8 AT THE BEGINNING OF CCW CHAIN ? @VA01695 00460100
BE JAS2A YES - LEAVE "LASTREC" = X'FF'. @VA01695 00460200
* (TO ENSURE A SET-SECTOR IS INCLUDED) 00460300
* STORE NEW HEAD NUMBER, AND INCLUDE 'SEEK' IN CCW-CHAIN ... 00461000
JAS2 MVI LASTREC,00 CLEAR REC NO FOR SET-SECTOR TEST @VA01695 00462100
JAS2A ST R15,LASTHED STORE NEW HEAD NUMBER, @VA01695 00462200
ST R10,0(,R9) STORE SEEKAD IN CCW, 00463000
MVI 0(R9),X'1B' WITH SEEK COMMAND-CODE, 00464000
MVC 4(4,R9),CCW1+4 MOVE IN THE RIGHT HALF, 00465000
LA R9,8(,R9) ADJUST CCW-POINTER, 00466000
* NOW SET UP SEARCH, TIC, AND READ/WRITE CCW'S ... 00467000
JAS3 EQU * HRC004DS 00468110
SR R13,R13 CLEAR A WORK REGISTER HRC004DS 00468120
IC R13,6(,R10) ...AND GET THE DISPLACEMENT. HRC004DS 00468130
TM DEVTYP,TYP3380 RPS TYPE DEVICE ? HRC004DS 00468140
BO JAS3B HRC004DS 00468150
TM DEVTYP,RPSTYP RPS TYPE DEVICE ? HRC004DS 00468160
BNO JAS3M NO...BR @V2A2014 00468200
JAS3B MVC 4(4,R9),CCWX+4 MOVE IN THE SET SECTOR CCW. HRC004DS 00470990
IC R15,SECTNUMS(R13) GET THE NEEDED SECTOR NO @VA01695 00473500
CLI DEVTYP,TYP3330 3330? @V2A2014 00473600
BE SECTSET YES..USE 3330 SECTORS @V2A2014 00473700
IC R15,SECT3350(R13) NO..USE 3350 SECTORS @V304498 00473740
CLI DEVTYP,TYP3350 3350? @V304498 00473750
BE SECTSET YES..USE 3350 SECTORS @V304498 00473760
IC R15,SECT3380(R13) NO..USE 3380 SECTORS HRC004DS 00473770
CLI DEVTYP,TYP3380 3380? HRC004DS 00473780
BE SECTSET YES..USE 3380 SECTORS HRC004DS 00473790
IC R15,SECT3340(R13) NO..USE 3340 SECTORS @V2A2014 00473800
SECTSET EQU * @V2A2014 00473900
STC R15,7(,R10) SAVE IT AFTER THE SEEK ARGUMENTS @VA01695 00474500
LA R15,7(,R10) POINT TO WHERE WE PUT IT, @VA01695 00475500
ST R15,0(,R9) STORE ADDRESS IN CCW, @VA01695 00476500
MVI 0(R9),X'23' AND MOVE IN THE OP-CODE. 00478000
SLR R15,R15 GET THE... @VA01695 00478100
IC R15,LASTREC LAST RECORD WE HANDLED @VA01695 00478200
LA R15,1(,R15) PLUS ONE; @VA01695 00478300
CR R13,R15 THIS ONE SAME AS LAST+1 ? @VA01695 00478400
BE JAS3M SAME AS LAST+1, OMIT SET-SECTOR. @VA01695 00478600
LA R9,8(,R9) ADJUST THE CCW-POINTER. 00479000
JAS3M EQU * HRC004DS 00480190
STC R13,LASTREC SAVE "THIS ONE" (C.C. INTACT) HRC004DS 00480380
LA R15,2(,R10) STORE SEEKAD+2 HRC004DS 00480570
ST R15,0(,R9) IN CCW, 00481000
MVI 0(R9),X'31' AND FILL IN SEARCH COMMAND CODE, 00482000
MVC 4(20,R9),CCW2+4 MOVE IN THE REST OF MAIN CCW'S, 00483000
ST R9,8(,R9) FILL IN ADDRESS OF '*-8' 00485000
MVI 8(R9),X'08' AND THE 'TIC' COMMAND-CODE. 00486000
LA R10,8(,R10) AND SEEKAD POINTER FOR NEXT ONE. 00487000
S BUFFSZ,RECSZ DECREMENT BYTE COUNT 00488000
BNP JAS4 BNP IF 0 (OR MINUS), ALL DONE. 00489000
BCT R0,LOOP1 IF STILL PLUS, ITERATE UP TO LIMIT. 00490000
LA R0,1 SET R0=1 IF DROPPED THRU BCT; @VA01695 00490100
JAS3A A BUFFSZ,RECSZ IF LIMIT EXCEEDED, RESTORE 'BUFFSZ' 00491000
JAS4 LA R15,PRACLIM+1 COMPUTE NO. OF CCW "PACKAGES" @VA01695 00492100
SR R15,R0 ... (AND LEAVE IN R15); @VA01695 00492200
MVI 0(R8),X'07' INSTALL SEEK OP-CODE 00493000
B READY1 AND GO PREPARE TO START SIO SEQUENCE. 00494000
* 00495000
READY BAL R13,JFILL1 FILL IN SEEKAD'S AND CCW'S 00496000
* 00497000
LA R15,1 ONLY 1 READ OR WRITE FOR ST'D DIAG. 00498000
READY1 XC CSW(8),CSW ZERO OUT THE CSW 00499000
ST R8,CAW AND POINT TO THE CCWS 00500000
DC X'83',X'48',AL2(DIAGNUM) 00501000
BNZ DIAGBAD APPARENTLY DIDN'T DO TOO WELL! 00502000
TM DIOFLAG,TOOBIG WAS THIS A ST'D DIAGNOSE CALL? 00503000
BNO JAS9 YES. THEN THERE'S ONLY ONE ITERATION 00504000
LA DISKAD,2(,DISKAD) INCREMENT DISK-ADDRESS FOR NEXT TIME 00505000
AL BUFFAD,RECSZ ADVANCE CORE-ADDRESS @VA01695 00506100
S BUFFSZ,RECSZ AND DECREMENT BYTE-COUNT 00507000
BP LOOP BP IF STILL SOME MORE LEFT TO DO. 00508000
JAS9 TM DIOFLAG,WRTKF TEST IF WRTK CALLED RDTK 00509000
BO RECUR YES, HANDLE RECURSIVENESS 00510000
TM DIOFLAG,QQTRK TEST IF ONLY 1/4 OF 1/4 DESIRED 00511000
BZ CLEAR15 BZ IF NOT - WE'RE DONE. 00512000
* 00513000
BAL RETREG,QQCALC IF WE READ 16TH TRACK, SET UP REGISTERS 00514000
MVC 0(200,BUFFAD),0(TEMP) AND MOVE DATA TO USER'S BUFFER. 00515000
* 00516000
CLEAR15 MVI ERRCODE,00 CLEAR ERROR CODE IN R15 00517000
* 00518000
RETURN LM R0,R1,FREER0 RESTORE R0 & R1 FOR FRET-CALL, 00519000
LTR R1,R1 IS THERE ANYTHING TO RETURN ? 00520000
BZ RETURN1 EXIT IF 0 (NO NEED FOR FRET CALL) 00521000
* CALL FRET TO RETURN THE SPACE USED FOR CCW'S 00522000
DMSFRET DWORDS=(0),LOC=(1),TYPCALL=BALR 00523000
RETURN1 L R14,AFVS REFERENCE FVS INFO 00524000
USING FVSECT,R14 ... 00525000
KXCHK DIOBIT CHECK FOR 'KX' WANTED... 00526000
DROP R14 00527000
RETURN2 LM R0,R15,XRSAVE RESTORE REGISTERS 0-14, ERROR-CODE TO R15 00528000
LTR R15,R15 SET CONDITION-CODE FOR CONVENIENCE OF CALLER 00529000
BR R14 AND RETURN TO CALLER. 00530000
EJECT 00531000
********************************************************************** 00532000
* 00533000
* SPECIAL ROUTINES TO HANDLE 1/4 OF 1/4 TRK 00534000
* 00535000
********************************************************************** 00536000
* 00537000
* DETERMINE WHETHER RDTK OR WRTK AND GET BUFFER SPACE 00538000
* 00539000
* CHECK FOR VARIOUS SPECIAL CASES FOR READ OR WRITE 200 BYTES... 00540000
* 00541000
HANDLQQ LA R13,READY R13 = A(READY) FOR MANY XFER'S BELOW, 00542000
MVC QQDSK2(2),0(DISKAD) MOVE DISK-ADDRESS TO DIOSECT 00543000
LA DISKAD,QQDSK2 AND REFER TO IT FROM THERE. 00544000
H200 LA BUFFSZ,200 SET FOR READ OR WRITE OF 200 BYTES, 00545000
CLI DEVTYP,TYP2314 IS THIS A 2314 ? @V2A2014 00546100
BCR 7,R13 NO..NO ADJUST NECESSARY @V2A2014 00546200
TM QQDSK2,X'20' CHECK 3RD BIT OF DISK-ADDRESS, 00548000
BZ CHKNEW IF = 0 (BLOCK NO. < 8192), CHECK FURTHER 00549000
TM QQDSK2,X'80' IF = 1, IS LEFTMOST BIT ALSO = 1 ? 00550000
BCR 8,R13 'BZ READY' IF NOT (NO SPECIAL PROBLEM) 00551000
L TEMP,QQDSK1 GET DISK-ADDRESS (IN RIGHT END OF REG.) 00552000
SH TEMP,X6000 SUBTRACT NECESSARY ADJUSTER FOR SPECIAL 00553000
STH TEMP,QQDSK2 CASE, AND STORE ADJUSTED DISK-ADDRESS 00554000
BR R13 'B READY' (CAN READ OR WRITE 200 BYTES) 00555000
X6000 DC AL2(X'6000') ADJUSTER FOR SPECIAL RANGE OF BLOCK NUMBR 00556000
* 00557000
CHKNEW CLI IOCOMM,WRITE IF BLOCK-NUMBER < 8192, = WRITE ? 00558000
BE CLRLEFT BE IF YES, MUST CLEAR 16TH-TRACK BITS. 00559000
TM QQDSK2,X'C0' IF A READ, MAYBE = 1ST 16TH TRACK ? 00560000
BCR 8,R13 'BZ READY' IF YES, READ 1ST 200 BYTES. 00561000
* 00562000
CLRLEFT NI QQDSK2,X'3F' CLEAR LEFTMOST 2 BITS & USE OLD METHOD. 00563000
* GET 800 BYTES FROM FREE 00564000
DMSFREE DWORDS=100,TYPE=NUCLEUS,TYPCALL=BALR,ERR=*,MSG=NO 00565000
* @VA15103 00565100
LTR R15,R15 FAIL IF STORAGE NOT @VA02374 00565300
BNZ ERROR25 ACQUIRED @VA02374 00565600
STM R0,R1,FREER0 SAVE NO. WORDS & ADDRESS FOR LATER 00566000
LR BUFFAD,R1 AND LOAD WHERE NEEDED. 00567000
OI DIOFLAG,QQTRK SET 1/4 OF 1/4 MODE BIT 00568000
L BUFFSZ,RECSZ SET ADJUSTED BUFFER SIZE 00569000
CLI IOCOMM,WRITE CALLED FOR WRTK 00570000
BCR 7,R13 NO, WE'RE ALL SET (GO TO 'READY') 00571000
OI DIOFLAG,WRTKF IF YES,SET FLAG-BIT TO READ FIRST 00572000
MVI IOCOMM,READ SET TO READ FIRST 00573000
BR R13 'B READY' 00574000
* 00575000
* PROCESS WRTK CALLS RDTK CASE, AFTER READ COMPLETED 00576000
* 00577000
RECUR BAL RETREG,QQCALC CALCULATE APPROPRIATE 1/4 WITHIN BLOCK 00578000
MVC 0(200,TEMP),0(BUFFAD) MOVE INTO TEMPORARY 800 BYTE BU 00579000
MVI IOCOMM,WRITE RESET TO WRITE 00580000
L BUFFAD,DIOFREE SET NEW BUFFER ADDRESS 00581000
L BUFFSZ,RECSZ AND SIZE OF RECORD 00582000
NI DIOFLAG,255-WRTKF-QQTRK CLEAR FLAG-BITS (ALMOST DONE) 00583000
LA R13,READY1 SET R13 TO RETURN TO 'READY', 00584000
LA R15,1 SIGNAL THIS IS A SINGLE 'I/O' 00585000
B JFILL3 FILL IN CCW'S AND THEN WRITE THE BLOCK. 00586000
EJECT 00587000
********************************************************************** 00588000
* 00589000
* I/O ERROR PROCESSOR 00590000
* 00591000
********************************************************************** 00592000
SPACE 00593000
DIAGBAD STC R15,DIAGRET SAVE CP'S RETURN CODE. 00594000
MVC IOOLD(16),IOOPSW AND PERTINENT INFO 00595000
BC 4,RET1 HANDLE CONDITION CODE 1. 00596000
BC 2,RET2 HANDLE CONDITION CODE 2 00597000
MVI ERRCODE,02 MIGHT AS WELL NAME THIS ERROR NOW. 00598000
GETOUT LA TEMP,SENCCW POINT TO THE SENSE-CCW 00599000
ST TEMP,CAW REALLY POINT TO IT. 00600000
SIO 0(DISKIO) NOW CRANK IT UP. 00601000
TIO 0(DISKIO) AND WAIT. 00602000
BC 2,*-4 ...SOME MORE... 00603000
CLI DEVTYP,TYP2314 IS DISK A 2314? @VA04120 00603100
BE RETURN YES; THEN DON'T ISSUE MSG BELOW @VA04120 00603200
LA R1,L'SENSB DETERMINE # SENSE BYTES PRESENT HRC004DS 00603220
SH R1,CSW+6 HRC004DS 00603240
STH R1,DIOSNSCT HRC004DS 00603260
TM SENSB+1,WRTINHIB 'WRITE-INHIBIT' IS NOT THE @VA01921 00603300
BO WRTONLY USERS FAULT - GIVE A CLUE. @VA01921 00603600
B RETURN GET OUT NOW SINCE INFO IS AVAILABLE. 00604000
* 00605000
RET1 CLI DIAGRET,X'04' DID CP CATCH SOMEONE GOING OFF THE END? 00606000
BE ERROR5 YES. GO TELL HIM. 00607000
CLI DIAGRET,X'03' OR WAS THE DISK READ-ONLY? 00608000
BE ERROR6 YES. GO HANDLE. 00609000
MVI ERRCODE,X'03' LABLE IT AS A WEIRD USER-ERROR. 00610000
B RETURN RETURN TO CALLER 00611000
* 00612000
RET2 MVI ERRCODE,X'08' LABEL AS UNDETERMINED V0158 00613100
B RETURN RETURN TO THE CALLER. 00621000
* 00622000
ERROR5 MVI ERRCODE,X'05' TELL HIM HIS EXTENT IS WRONG 00623000
B RETURN RETURN TO THE CALLER 00624000
* 00625000
WRTONLY DMSERR NUM=905,LET=S,TEXT='WRITE-INHIBIT SWITCH SET ON DRIVE..X00625300
.NOTIFY OPERATOR' @VA01921 00625600
ERROR6 L R15,SAVEADT GET THAT ADDRESS WE SAVED SO NEATLY. 00626000
USING ADTSECT,R15 00627000
NI ADTFLG1,255-ADTFRW TURN OF THE R/W INDICATOR. 00628000
OI ADTFLG1,ADTFRO TURN ON THE READ-ONLY INDICATOR. 00629000
DROP R15 00630000
MVI ERRCODE,X'06' TELL HIM THAT THE DISK IS R/O (NOW). 00631000
B RETURN ... 00632000
ERROR25 MVI ERRCODE,25 CAN'T DO IT WITHOUT @VA02374 00632300
B RETURN WORK SPACE @VA02374 00632600
EJECT 00633000
*********************************************************************** 00634000
* 00635000
* CALCULATE DISPLACEMENT FOR 1/4 OF 1/4 00636000
* 00637000
********************************************************************** 00638000
QQCALC L TEMP,XDISKAD CALCULATE POSITION IN BUFFER 00639000
LH TEMP,0(0,TEMP) ... 00640000
SRL TEMP,14 GET 1/4 OF 1/4 NUMBR 00641000
N TEMP,=XL4'00000003' NOW ISOLATE NUMBER (0 TO 3) 00642000
MH TEMP,H200+2 EACH 1/4 OF 1/4 IS 200 BYTES 00643000
A TEMP,DIOFREE ADD RELOCATION FACTOR 00644000
L BUFFAD,XBUFFAD GET ORIGINAL 200 BYTE BUFFER ADDRESS 00645000
BR RETREG RETURN TO CALLER 00646000
SPACE 2 00647000
* SUBROUTINE TO FILL IN SEEK-ADDRESS INFORMATION AND/OR 00648000
* READ-WRITE CCW'S. (JAS) 00649000
* 'JFILL1' FILLS IN BOTH FOR 'REGULAR' CALLS. 00650000
* 'JFILL2' FILLS IN BOTH FOR LARGE BLOCKS. 00651000
* 'JFILL3' FILLS IN ONLY CCW'S FOR 16-TH TRACKS. 00652000
* (IN ANY CASE, R13 = RETURN-REGISTER) 00653000
* 00654000
JFILL1 LA R10,SEEKADR FOR REGULAR CASE, SET R10 = A(SEEKADR) 00655000
MVC CCW1A(8),CCW1 ASSUME DEVICE IS NOT A 3330 00656000
LA R8,CCW1A ALSO POINT R8 TO CCW1 FOR CAW LATER. 00657000
* (AT ENTRY TO 'JFILL2', R10 MUST POINT TO SEEK-AD'S) 00658000
JFILL2 SR R14,R14 CLEAR R14, 00659000
ST R13,DOUBLE SAVE R13 (ONLY REGISTER WE HAVE HANDY) 00660000
LA R13,TBL3330 SET TENTATIVELY FOR 3330. 00661000
CLI DEVTYP,X'09' IS IT A 3330 ? 00662000
BE R13OK BRANCH IF YES. 00663000
LA R13,TBL3350 SET TENTATIVELY FOR 3350 @V304498 00663100
CLI DEVTYP,TYP3350 IS THIS A 3350 ? @V304498 00663200
BE R13OK YES, OBTAIN DISK ADDRESS @V304498 00663300
LA R13,TBL3380 SET TENTATIVELY FOR 3380 HRC004DS 00663400
CLI DEVTYP,TYP3380 IS THIS A 3380 ? HRC004DS 00663500
BE R13OK YES, OBTAIN DISK ADDRESS HRC004DS 00663600
LA R13,TBL2314 SET R13 TENTATIVELY FOR 2314, 00664000
CLI DEVTYP,X'08' IS UNIT-TYPE = 08 (2314) ? 00665000
BE R13OK BE IF YES 08, 2314. 00666000
LA R13,TBL3340 MUST BE 3340 @V2A2014 00667100
R13OK EQU * ... 00668000
USING JTABLE,R13 ... 00669000
LH R15,0(,DISKAD) OBTAIN THE DISK-ADDRESS, 00670000
N R15,=X'0000FFFF' P0992 00671000
BCTR R15,0 DECREMENT IT BY ONE (BLOCK NUMBER - 1) 00672000
LTR R15,R15 WAS BLOCK-NUMBER = 0 (INVALID) 00673000
BM ERROR5 BM IT IT WAS, ERROR 5 (NO MESSAGE) 00674000
D R14,RECCYL DIVIDE BY NUMBER RECORDS PER CYLINDER, 00675000
ST R15,0(,R10) STORE 00-00-00 & CYLINDER NUMBER, 00676000
LR R15,R14 REMAINDER INTO R15, 00677000
SR R14,R14 AND CLEAR R14 AGAIN, 00678000
D R14,RECHED DIVIDE BY NUMBER RECORDS PER HEAD(S), 00679000
LA R14,1(,R14) RECORD NUMBER STARTS WITH 1 (NOT 0) 00680000
CLI NUMHED+1,01 IS IT PER 'ONE' HEAD ? 00681000
BE R15OK BE IF YES (ALL OK AS IS) 00682000
AR R15,R15 IF NOT, DOUBLE THE HEAD NUMBER, 00683000
CH R14,OVEREC CHECK RECORD NUMBER FOR TRACK OVERFLOW 00684000
BNH R15OK BNH IF NOT IN 'NEXT TRACK', 00685000
LA R15,1(,R15) INCR. HEAD NUMBER IF REC 9 UP, ETC. 00686000
R15OK STH R15,4(,R10) STORE 00 & HEAD-NUMBER. 00687000
* (NOTE -- HEAD NUMBER REMAINS IN R15) 00688000
STC R14,6(,R10) AND STORE RECORD NUMBER (1-4 OR 1-15) 00689000
L R14,0(,R10) CYLINDER NUMBER BACK INTO R14 PER SPEC 00690000
L R13,DOUBLE RESTORE R13 AND PROCEED TO JFILL3 ... 00691000
DROP R13 ... 00692000
* 00693000
JFILL3 EQU * NOW CONTINUE (OR CAN ENTER HERE)... 00694000
TM DEVTYP,TYP3380 IS THIS A 3380? HRC004DS 00694300
BE JFILL3B HRC004DS 00694600
TM DEVTYP,RPSTYP RPS TYPE DEVICE ? @V2A2014 00695100
BNO JFILL3A NO...BR @V2A2014 00695200
JFILL3B EQU * NOW CONTINUE (OR CAN ENTER HERE).HRC004DS 00696100
TM DIOFLAG,TOOBIG IS THIS A STANDARD DIAGNOSE CALL? 00697000
BNZ JFILL3A IF NOT, THIS CALC DONE ELSEWHERE @VA01695 00698100
STM R14,R15,DOUBLE GET SOME WORKING ROOM, @VA01695 00698200
SR R14,R14 AND A CLEAN REGISTER 00700000
IC R14,6(,R10) NEED THE RECORD NUMBER. 00701000
IC R15,SECTNUMS(R14) GET THE RIGHT SECTOR NUMBER; @VA01695 00702100
CLI DEVTYP,TYP3330 3330 ? @V2A2014 00702200
BE STRSECT YES..BR @V2A2014 00702300
IC R15,SECT3350(R14) NO..USE 3350 SECTORS @V304498 00702340
CLI DEVTYP,TYP3350 3350 ? @V304498 00702350
BE STRSECT YES..BR @V304498 00702360
IC R15,SECT3380(R14) NO..USE 3380 SECTORS HRC004DS 00702370
CLI DEVTYP,TYP3380 3380 ? HRC004DS 00702380
BE STRSECT YES..BR HRC004DS 00702390
IC R15,SECT3340(R14) NO..USE 3340 SECTORS @V2A2014 00702400
STRSECT STC R15,7(,R10) STORE WHERE NEEDED. @VA01695 00702600
MVC CCW1(4),CCW1A BETTER MAKE SOME ROOM 00705000
MVC CCW1A(8),CCWX MOVE IN THE SET SECTOR CCW 00706000
LA R8,CCW1 AND POINT TO THE READJUSTED STRING 00707000
LM R14,R15,DOUBLE GET THOSE REGISTERS BACK. 00708000
JFILL3A EQU * NICE PLACE TO RESUME. 00709000
ICM BUFFAD,8,IOCOMM INSERT OP CODE (06 OR 05), @VA01695 00710100
ST BUFFAD,RWCCW STORE OP-CODE + DATA ADDRESS, @VA01695 00710200
STH BUFFSZ,RWCCW+6 STORE COUNT (TENTATIVELY) 00712000
C BUFFSZ,RECSZ IS IT TOO LARGE (> RECSIZ) ? 00713000
BCR 13,R13 'BNH' IF NOT TOO LARGE, EXIT VIA R13. 00714000
MVC RWCCW+6(2),RECSZ+2 IF TOO LARGE, SUBSTITUTE RECSIZ. 00715000
BR R13 (R14 & R15 MEANINGFUL FOR JFILL1 OR JFILL2) 00716000
EJECT 00717000
* CONSTANTS & DISK TABLES ... 00718000
* 00719000
RECSZ DC F'800' CMS USUALLY READS & WRITES 800 BYTES 00720000
* 00721000
TBL2314 DS 0F 2314-TABLE (FOR GENERAL USE) ... 00731000
* (INDICATED BY 'UNIT TYPE' OF X'08' A LA 'OS') 00732000
DC F'150' NUMBER OF RECORDS PER CYLINDER 00733000
DC F'15' NUMBER OF RECORDS PER ... 00734000
DC H'2' PER TWO HEADS. 00735000
DC H'8' OVERFLOW-RECORD NUMBER 00736000
DC H'20' NUMBER OF HEADS (TRACKS) PER CYLINDER 00737000
DC H'203' MAXIMUM NUMBER OF CYLINDERS 00738000
* 00738050
TBL3350 DS 0F 3350 TABLE (FOR GENERAL USE) @V304498 00738100
* ( INDICATED BY 'UNIT TYPE' OF X'0B' A LA 'OS') 00738150
DC F'570' NUMBER OF RECORDS PER CYLINDER @V304498 00738200
DC F'19' NUMBER OF RECORDS PER ... @V304498 00738250
DC H'1' PER ONE HEAD @V304498 00738300
DC H'20' OVERFLOW-RECORD NUMBER (N/A) @V304498 00738350
DC H'30' NUMBER OF TRACKS PER CYLINDER @V304498 00738400
DC H'115' MAXIMUM NUMBER OF CYLINDERS @V304498 00738450
* 00739000
* HRC004DS 00739090
TBL3380 DS 0F 3380 TABLE (FOR 800 BYTE BLKS) @V6AE8C1X00739180
(INDICATED BY 'UNIT TYPE' OF X'0EHRC004DS 00739270
DC F'540' NUMBER OF RECORDS PER CYLINDER HRC004DS 00739360
DC F'36' NUMBER OF RECORDS PER TRACK HRC004DS 00739450
DC H'1' PER ONE HEAD HRC004DS 00739540
DC H'37' OVERFLOW RECORD NUMBER (N/A) HRC004DS 00739630
DC H'15' NUMBER OF TRACKS PER CYLINDER HRC004DS 00739720
DC H'121' MAXIMUM NUMBER OF CYLINDERS HRC004DS 00739810
* HRC004DS 00739900
TBL3330 DS 0F 3330-TABLE (FOR GENERAL USE) ... 00740000
* (INDICATED BY 'UNIT TYPE' OF X'09' A LA 'OS') 00741000
DC F'266' NUMBER OF RECORDS PER CYLINDER 00742000
DC F'14' NUMBER OF RECORDS PER ... 00743000
DC H'1' PER ONE HEAD. 00744000
DC H'15' OVERFLOW-RECORD NUMBER (N/A) 00745000
DC H'19' NUMBER OF HEADS (TRACKS) PER CYLINDER 00746000
DC H'246' MAXIMUM NUMBER OF CYLINDERS 00747000
* 00748000
TBL3340 DS 0F 3340 TABLE @V2A2014 00748050
DC F'96' @V2A2014 00748100
DC F'8' @V2A2014 00748150
DC H'1' @V2A2014 00748200
DC H'9' @V2A2014 00748250
DC H'12' @V2A2014 00748300
DC H'682' @V2A2014 00748350
* 00748400
H8 DC H'8' 00749000
WRTINHIB EQU X'02' SENSE BYTE 1, BIT 6 @VA01921 00749500
* 00750000
SECTNUMS DC XL1'00' 00751000
DC X'020B141D252E374049525B646D75' @VA01695 00752100
* 00753000
SECT3340 DC XL1'00' @V2A2014 00753100
DC X'020910171E252C32' @V2A2014 00753200
* 00753300
SECT3350 DC XL1'00' @V304498 00753600
DC AL1(2,8,15,21,27,34,40,46,53,59,65,71,78,84,90) @V304498 00753610
DC AL1(97,103,109,116) @V304498 00753620
SECT3380 DC XL1'00' HRC004DS 00753621
DC AL1(5,11,17,23,29,34,40,46,52,58,64,70) HRC004DS 00753622
DC AL1(75,81,87,93,99,105,111,116,122,128,134,140) HRC004DS 00753623
DC AL1(146,152,157,163,169,175,181,187,193,198) HRC004DS 00753624
DC AL1(204,210) HRC004DS 00753625
* 00753630
LTORG 00754000
* 00755000
JTABLE DSECT 00756000
RECCYL DS 1F NUMBER OF RECORDS PER CYLINDER 00757000
RECHED DS 1F NUMBER OF RECORDS PER ... 00758000
NUMHED DS 1H PER ONE OR TWO HEADS. 00759000
OVEREC DS 1H OVERFLOW-RECORD NUMBER (OR N/A) 00760000
HEDCYL DS 1H NUMBER OF HEADS (TRACKS) PER CYLINDER 00761000
MAXCYL DS 1H MAXIMUM NUMBER OF CYLINDERS 00762000
SPACE 2 00763000
* PARAMETERS FOR HANDLING CHAINED CCW'S, ETC. 00764000
* 00765000
PRACLIM EQU 15 PRACTICAL LIMIT FOR NO. OF REC. FOR ONE 'SIO' 00766000
* 00767000
TYP3340 EQU X'07' DEVICE TYPE 3340 @V2A2014 00767100
TYP3350 EQU X'0B' DEVICE TYPE 3350 @V304498 00767150
TYP3380 EQU X'0E' DEVICE TYPE 3380 HRC004DS 00767170
TYP2314 EQU X'08' DEVICE TYPE 2314 @V2A2014 00767200
TYP3330 EQU X'09' DEVICE TYPE 3330 @V2A2014 00767300
RPSTYP EQU X'01' ROTATIONAL POSITION SENSING @V2A2014 00767400
JSNEED EQU PRACLIM*6 (FOR R0) NO DBL WORDS NEEDED FROM FREE 00768000
DSEEKA EQU (PRACLIM*5)*8 OFFSET (IN BYTES) OF SEEK ADDRESSES 00769000
EJECT 00770000
NUCON 00771000
DIOSECT 00772000
ADT 00773000
FVS 00774000
REGEQU 00775000
********************************************************************* 00776000
* 00777000
* CONSTANTS AND DEFINITIONS 00778000
* 00779000
********************************************************************* 00780000
* 00781000
* REGISTER ASSIGNMENTS 00782000
* 00783000
BASE EQU R2 00784000
PLIST EQU 3 00785000
DISKIO EQU R4 00786000
BUFFAD EQU R5 00787000
BUFFSZ EQU R6 00788000
DISKAD EQU R7 00789000
RETREG EQU R14 ... 00790000
TEMP EQU R15 ... 00791000
XR1 EQU 5 00792000
* 00793000
* FORMAT OF PARAMETER LIST 00794000
* 00795000
XPLIST DSECT 00796000
XBUFFAD DC A(0) BUFFER ADDRESS 00797000
XBUFFSZ DC F'0' BUFFER SIZE 00798000
XDISKAD DC A(0) ADDRESS OF DISK ADDRESS LIST 00799000
XMODE DC A(0) ACTIVE DISK TABLE ADDRESS (OR MODE) 00800000
* 00801000
READ EQU X'06' 00802000
WRITE EQU X'05' 00803000
SILI EQU X'20' 00804000
PCI EQU X'80' 00805000
CC EQU X'40' 00806000
CE EQU X'08' 00807000
DE EQU X'04' 00808000
UC EQU X'02' 00809000
PROGCHK EQU X'20' 00810000
PROTCHK EQU X'10' 00811000
END 00812000