Type ASSEMBLE
Source Lines : 855
Fixes Applied : 7
Most Recent Version : Tuesday, December 12, 1978
Last Fix ID : [R14923DS]
Module
DMSSQS (SOQSAM - QUEUED SEQUENTIAL ACCESS METHOD)
Function
TO ANALYZE RECORD FORMAT AND SET UP THE BUFFERS ACCORDINGLY FOR GET, PUT AND PUTX REQUESTS.
Attributes
REENTRANT, NUCLEUS RESIDENT
Operation
INITIALIZATION OSIOTYPE AND IOBECBPT ARE SET TO INDICATE ACCESS METHOD AND FCB ADDRESS RESPECTIVELY. THEN, IF THE DUMMY OPTION IS NOT SPECIFIED IN THE FCB, A BRANCH IS TAKEN TO GETTER, PUTTER OR PUTXER DEPENDING ON WHETHER THE REQUEST IS A GET, PUT OR PUTX RESPECTIVELY. IF DUMMY IS SPECIFIED IN THE FCB, CONTROL IS PASSED TO QSAMDUMY. GETTER AFTER FCBIOSW AND IOBIOFLG ARE SET TO INDICATE INPUT IN PROCESS, DCB FIELDS DCBMACF AND DCBRECFM ARE ANALYZED TO DETERMINE THE TYPE OF MODE DESIRED - MOVE OR LOCATE - AND THE RECORD FORMAT. IF THE MODE IS MOVE, THE USER SPECIFIED 'MOVE TO' ADDRESS IS STORED IN DEBTCBAD. BOTH MODES CONTINUE BY DETERMINING WHETHER IT IS CALLED FROM CLOSE (DMSSOP). IF SO, A CHECK IS MADE TO DETERMINE WHETHER THE UPDATE FLAG (IOBUBD) IN THE "IOBIOFLG" IS ON INDICATING A "PUTX" ISSUED ON THE LAST BLOCK. IF THE UPDATE FLAG IS NOT ON, CONTROL IS RETURNED TO CLOSE. IF THE UPDATE FLAG IS ON, CONTROL IS PASSED TO THE ROUTINE "GETXER" TO REWRITE THE LAST BLOCK BEFORE RETURNING TO CLOSE. (SEE "GETXER" BELOW). IF NOT CALLED BY CLOSE, A CHECK IS MADE TO DETERMINE WHETHER AN "END OF BLOCK" CONDITION EXISTS. IF "END OF BLOCK" CONDITION DOES EXIST, A CHECK IS MADE OF THE UPDATE FLAG TO DETERMINE WHETHER A RECORD IN THE JUST COMPLETED BLOCK WAS UPDATED. IF SO, "GETXER" RECEIVES CONTROL TO REWRITE THE LAST BLOCK; (SEE "GETXER" BELOW). ROUTINE "SETEOB" THEN RECEIVES CONTROL TO GET THE NEXT BUFFER FROM THE POOL; (SEE "SETEOB" BELOW). UPON RETURN FROM "SETEOB", THE APPROPRIATE "FCB" FIELDS ARE UPDATED AND A CALL IS MADE TO DMSSEB TO FILL THE NEW BUFFER WITH THE NEXT BLOCK. UPON RETURN, THE "FCBITEM" COUNT IS UPDATED, AND THE "ECB" IS CHECKED FOR AN ERROR. IF ONE EXISTS, CONTROL IS PASSED TO DMSSCT (CHECK SIMULATION). AFTER IT IS DETERMINED THAT THERE IS A RECORD IN THE BUFFER, THE RECORD IS DEBLOCKED FROM THE BUFFER AND, IF THE RECFM IS VARIABLE OR UNDEFINED, DCBLRECL IS SET TO THE LENGTH OF THE RECORD. IF THE MODE IS LOCATE, CONTROL IS RETURNED TO THE USER WITH THE ADDRESS OF THE RECORD. IF THE MODE IS MOVE, THE RECORD IS MOVED TO THE ADDRESS PROVIDED BY THE USER AND CONTROL IS RETURNED TO THE USER. PUTTER RECEIVES CONTROL FROM "PUT" MACRO INSTRUCTION. AFTER "FCBIOSW" AND "IOBIOFLG" ARE SET TO INDICATE OUTPUT IN PROGRESS, A CHECK IS MADE TO DETERMINE WHETHER THIS CALL WAS MADE FROM CLOSE. IF NOT CALLED FROM CLOSE AND THE MODE IS LOCATE, AND THIS IS THE FIRST "PUT" CALL, THE ADDRESS OF THE FIRST BUFFER IS PLACED IN REGISTER 1 AND CONTROL IS RETURNED TO THE USER. IF CALLED FROM CLOSE, A CHECK IS MADE TO SEE IF A PUT IS NECESSARY. IF NOT, CONTROL IS RETURNED TO THE USER. IF A PUT IS NECESSARY, THE POINTERS ARE SETUP TO WRITE A SHORT BLOCK. IF OTHER THAN THE FIRST "PUT" CALL, IT IS DETERMINED WHETHER THE CURRENT BUFFER HAS SUFFICIENT SPACE FOR ANOTHER RECORD. IF IT HAS, REGISTER 1 IS UPDATED TO THE ADDRESS OF THE NEXT RECORD WITHIN THE CURRENT BUFFER AND CONTROL IS RETURNED TO THE CALLER. IF THE CURRENT BUFFER IS FULL, A CALL IS MADE TO DMSSEB TO WRITE THE CURRENT BUFFER TO THE FILE. UPON RETURN FROM DMSSEB THE "ECB" IS CHECKED FOR ERROR INDICATION AND IF ONE EXISTS CONTROL IS PASSED TO DMSSCT (CHECK SIMULATION). IF NO ERROR CONDITION EXISTS THE "FCBITEM" COUNT IS UPDATED TO REFLECT THE LAST BLOCK WRITTEN. ROUTINE "SETEOB" THEN RECEIVES CONTROL TO GET THE NEXT BUFFER FROM THE POOL; (SEE "SETEOB" BELOW). IF LOCATE IS SPECIFIED, CONTROL IS RETURNED TO THE USER. IF MOVE MODE IS SPECIFIED, THE ROUTINE MOVEMODE IS USED TO MOVE THE RECORD INTO THE BUFFER AND CONTROL IS RETURNED TO THE USER. PUTXER RECEIVES CONTROL FROM "PUTX" MACRO INSTRUCTION. SETS THE UPDATE FLAG ("IOBUPD") IN THE "IOBIOFLG" FIELD OF THE IOB TO INDICATE THAT THE CURRENT BLOCK HAS BEEN UPDATED AND THEREFORE WILL BE REWRITTEN AT "END OF BLOCK" TIME. RETURNS CONTROL TO THE USER. GETXER RECEIVES CONTROL FROM ROUTINE "GETTER" AT "CLOSE" TIME OR "END OF BLOCK" TIME WHEN THE UPDATE FLAG (IOBUPD) HAS BEEN SET IN THE "IOBIOFLG" BY A PREVIOUS "PUTX" CALL. THE "FCBIOSW" AND "IOBIOFLG" ARE CHANGED FROM A "GET" CALL TO A "PUT" CALL. THE "FCBITEM" COUNT IS RESET TO THE FIRST RECORD OF THE CURRENT BLOCK. DMSSEB IS CALLED TO REWRITE THE UPDATED BLOCK. UPON RETURN, THE "ECB" IS CHECKED FOR AN ERROR CONDITION. IF ONE EXISTS, A CALL IS MADE TO DMSSCT (CHECK SIMULATION). IF NO ERROR INDICATION, THE "FCBITEM" COUNT IS RESTORED TO THE NEXT BLOCK, THE "FCBIOSW" AND "IOBIOFLG" ARE RESET TO INDICATE THE "GET" CALL AND IF NOT "CLOSE" TIME, CONTROL IS RETURNED TO ROUTINE "GETTER". IF "CLOSE" TIME CONTROL IS RETURNED TO DMSSOP (CLOSE). SETEOB RECEIVES CONTROL FROM ROUTINES "GETTER" OR "PUTTER" AT "END OF BLOCK" TIME. DCB AND IOB ADDRESSES ARE UPDATED TO POINT TO THE NEXT BUFFER IN THE POOL AND CONTROL IS RETURNED TO THE CALLING ROUTINE. MOVEMODE MOVES THE RECORD FROM THE USER BUFFER TO THE SYSTEM BUFFER IN THE CASE OF "PUT" AND FROM THE SYSTEM BUFFER TO THE USER BUFFER IN THE CASE OF "GET". IT THEN RETURNS CONTROL TO THE CALLING ROUTINE. QSAMDUMY QSAMDUMY FIRST CHECKS TO DETERMINE IF A GET OR A PUT WAS ISSUED. IF A GET WAS ISSUED, AN END OF FILE ERROR CODE IS SET AND CONTROL IS PASSED TO DMSSCTCE. IF A PUT WAS ISSUED, CONTROL IS RETURNED TO THE USER WITH THE ADDRESS OF THE NEXT RECORD AREA IN REGISTER ONE.
Calls to Other Routines
DMSSEB, DMSSCT