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 INTO HEADER TO START WRITING ( >= 0) * DEF DATA TO OVERLAY DS HEADER IN SAM * ATTEMPT MADE TO WRITE PAST END OF BUFFER * (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 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