ASMB,R,Q,C
      HED <#PUTR> DS "PUT" SUBROUTINE * (C) HEWLETT-PACKARD CO. 1980* 
      NAM #PUTR,7 91750-1X025 REV 2013 791129 ALL 
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
* 
* 
      ENT #PUTR 
      SPC 1 
      EXT .ENTR,$LIBR,$LIBX 
      EXT #SBFL,#SBFA    LENGTH & ADDRESS OF CURRENT RQST 
      EXT $OPSY 
* 
*    NAME:   #PUTR
*    SOURCE: 91750-18025
*    RELOC:  91750-1X025
*    PGMR:   LYLE WEIMAN JUNE 1979
* 
* 
* 
*  PURPOSE: 
*     #PUTR IS CALLED BY GRPM WHEN IT NEEDS TO MODIFY PART OF THE DS
*     HEADER.  WHILE IT IS MUCH CLEANER AND PREFERABLE TO COPY AS MUCH OF 
*     THE HEADER AS MAY BE MODIFIED INTO A LOCAL BUFFER, MODIFY IT THERE, 
*     THEN USE THE OVER-WRITING FEATURE OF SUBROUTINE #RQUE, IT IS SOMETIMES
*     MORE EFFICIENT SIMPLY TO PLACE THE UPDATE INFORMATION DIRECTLY INTO 
*     THE HEADER, PARTICULARLY WHEN UPDATING DATA NEAR THE END OF THE HEADER. 
* 
      SPC 2 
*  #PUTR CALLING SEQUENCE (NOTE: THIS ROUTINE ASSUMES THAT #GETR HAS
*                          BEEN CALLED PREVIOUSLY.  IT USES THE ADDRESS 
*                          AND BUFFER LENGTH OF THE LAST DS HEADER
*                          PROCESSED BY #GETR, WHICH IS LEFT OVER FROM
*                          THE #GETR CALL AND COMMUNICATED TO #PUTR VIA 
*                          ENTRY POINT) : 
* 
*     JSB #PUTR 
*     DEF *+3 
*     DEF <OFFSET>    OFFSET INTO HEADER TO START WRITING ( >= 0) 
*     DEF <OVERLAY DATA WORD>  DATA TO OVERLAY DS HEADER IN SAM 
*  <ERROR RETURN>      ATTEMPT MADE TO WRITE PAST END OF BUFFER 
*  <NORMAL RETURN>     (A) & (B) MEANINGLESS
      SPC 3 
*     #PUTR OPERATION:
*       1. VERIFY THAT A REQUEST BUFFER HAS BEEN READ PREVIOUSLY. 
*          ENTRY POINTS #SBFL AND #SBFA ARE USED FOR COMMUNICATION BETWEEN
*          #PUTR AND #GRPM FOR THIS DETERMINATION.
*       2. VERIFY THAT THE OFFSET SPECIFIED RESIDES WITHIN THE REQUEST
*          BUFFER.
*       3. TURN OFF MEMORY PROTECTION, STORE THE DATA WORD IN THE REQUEST 
*          BUFFER AT THE OFFSET SPECIFIED, RESTORE MEMORY PROTECTION, AND 
*          RETURN TO THE CALLER.
* 
*     IF THE VERIFICATION TESTS ABOVE ARE NOT PASSED, THE <ERROR RETURN> EXIT 
*     IS TAKEN, WITHOUT CAUSING ANY DAMAGE TO THE REQUEST BUFFER. 
      SKP 
OFSET NOP           OFFSET
ODATA NOP           OVERLAY DATA
* 
#PUTR NOP 
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF OFSET 
* 
INI   JSB CONFG    CONFIGURE DMS/NON-DMS ('NOP' AFTER 1ST CALL) 
* 
      LDB OFSET,I   LOAD OFFSET 
      LDA #SBFL 
      SSB,RSS         IF NEGATIVE OFFSET OR 
      CMA,INA,SZA,RSS     NO BUFFER, THEN 
      JMP #PUTR,I            RETURN WITHOUT CAUSING DAMAGE! 
* 
*                   CHECK FOR "OFFSET" > LENGTH OF BUFFER 
* 
      ADA OFSET,I     SUBTRACT FROM TRUE LENGTH OF DATA 
      SSA,RSS       WRITING PAST END OF BUFFER? 
      JMP #PUTR,I   YES, EXIT 
* 
*     END OF VERIFICATION TESTS 
* 
      ISZ #PUTR     ADJUST FOR "GOOD" EXIT
* 
      JSB $LIBR     LOWER MEMORY-PROTECT FENCE
      NOP              (PRIVILEGED) 
      ADB #SBFA     COMPUTE ADDRESS OF DATA AREA
      LDA ODATA,I   LOAD DATA TO OVERLAY
* 
MOD1  XSA B,I       (STA B,I IF NOT DMS SYSTEM) STORE DATA
* 
      JSB $LIBX     RESTORE MEMORY PROTECTION & RETURN TO CALLER
      DEF #PUTR 
* 
*      THIS CODE IS EXECUTED ONLY ONCE.  IT CHANGES THE "XSA B,I" INSTRUCTION 
*     AT LABEL "MOD1" TO A "STA B,I" INSTRUCTION IF THE RTE IS NOT
*     USING THE DYNAMIC MAPPING SYSTEM (DMS). 
* 
CONFG NOP          ROUTINE TO CONFIGURE FOR DMS/NON-DMS INSTR.
      CLB           CLEAR CALL TO THIS
      STB INI          ROUTINE
      LDA $OPSY    GET OP-SYSTEM TYPE 
      RAR,SLA      ROTATE MAPPED-MEMORY BIT TO LSB.  USING DMS? 
      JMP CONFG,I    YES, RETURN NOW
      LDA STA       YES, CHANGE XSA B,I TO STA B,I
      DST MOD1
      JMP CONFG,I  RETURN 
*     DATA AREA 
* 
A     EQU 0 
B     EQU 1 
* 
STA   STA B,I 
SIZE  BSS 0 
* 
      END 
                                                                                                                                                                                                                  