TITLE 'AMDPRFMT - LINE FORMAT ROUTINE' 00160002 AMDPRFMT CSECT 00170002 *A-000000-999999 @Y02006 00172002 * /* START OF SPECIFICATIONS **** 00180002 * 00190002 *01* MODULE-NAME = AMDPRFMT 00200002 * 00300002 *02* CSECT-NAME = AMDPRFMT 00350002 * 00450002 *01* DESCRIPTIVE-NAME = AMDPRDMP/SNAP EXIT LINE FORMAT ROUTINE 00500002 * 00600002 *01* COPYRIGHT = NONE 00650002 * 00860002 *01* STATUS = VS2 RELEASE 02.0 00900002 * 01000002 *01* FUNCTION = AMDPRFMT FORMATS 120 BYTE OUTPUT LINE WITH LABELS 01050002 * AND/OR DATA FROM THE DUMP DATA SET OR CALLER'S STORAGE AS 01100002 * SPECIFIED BY THE CALLER THROUGH FORMAT PATTERNS. IT ALSO 01110002 * TRANSLATES DATA TO PRINTABLE HEX IF REQUESTED. 01120002 * 01150002 *02* OPERATION = UPON ENTRY, AMDPRFMT IS PASSED THE ADDRESS OF THE 01200002 * ORIGINAL EXIT PARAMETER LIST AND THE ADDRESS OF THE FIRST 01250002 * FORMAT PATTERN. 01300002 * ONE OR MORE FORMAT PATTERNS MAY BE PASSED TO AMDPRFMT ON EACH 01350002 * CALL, SO LONG AS THEY ARE CONTIGUOUS AND DELIMETED BY A WORD 01360002 * OF ZEROS AFTER THE FINAL PATTERN. BEFORE PROCESSING ANY 01370002 * PATTERN, THE PARAMETER LIST IS CHECKED TO DETERMINE WHETHER 01380002 * AMDPRDMP ISSUED THE LOAD FOR AMDPRFMT, AND IF SO, A GETMAIN IS 01390002 * ISSUED FOR A SAVEAREA/WORKAREA. THIS IS REQUIRED IN THE EVENT 01392002 * THAT AMDPRFMT HAS TO OBTAIN DATA TO BE FORMATTED FROM THE DUMP 01394002 * DATA SET, NECESSITATING LINKAGE TO THE AMDPRDMP EXIT INTERFACE 01396002 * MEMORY ACCESS ROUTINE. EACH PATTERN IS THEN CHECKED IN TURN, 01398002 * UNTIL THE WORD OF ZEROS IS REACHED. 01398402 * IF A LABEL IS TO BE INCLUDED IN THE OUTPUT LINE, THE FOLLOWING 01398802 * PROCESSING OCCURS: THE LABEL LENGTH IS ADDED TO THE ADDRESS 01399202 * OF THE OUTPUT LINE BUFFER PLUS THE REQUESTED OFFSET INTO THAT 01399602 * LINE. IF THE LABEL WILL EXTEND OVER THE END OF THE 120 BYTE 01399702 * BUFFER, IT IS TRUNCATED SUFFICIENTLY TO FIT. THE LABEL 01399802 * POINTER IS THEN RETRIEVED FROM THE FORMAT PATTERN, UNLESS THIS 01399902 * PATTERN CONTAINS NO LABEL POINTER, IN WHICH CASE THE SAVED 01416602 * POINTER IN THE PARAMETER LIST FROM THE PREVIOUS LABEL, IS 01426602 * USED. THE NEW LABEL'S LENGTH IS ADDED TO THE LABEL POINTER 01428602 * AND THE RESULT IS SAVED IN THE PARAMETER LIST. THE CHARACTER 01430602 * STRING BEGINNING AT THE LABEL POINTER IS MOVED TO THE 01432602 * REQUESTED OFFSET INTO THE PRINT LINE FOR THE REQUESTED (OR 01433002 * UPDATED IF TOO LONG) LENGTH. 01433102 * IF DATA IS TO BE INCLUDED IN THE PRINT LINE, THE FOLLOWING 01433202 * PROCESSING OCCURS: THE DATA LENGTH AND PRINT LINE OFFSET ARE 01438802 * VALIDITY CHECKED IN A MANNER SIMILAR TO THE ONE DESCRIBED 01440802 * ABOVE, WITH THE EXCEPTION THAT, IF THE DATA MUST BE TRANSLATED 01442802 * TO PRINTABLE HEX, THE RESULTANT DATA LENGTH IS EFFECTIVELY 01443202 * DOUBLED. NEXT, A DETERMINATION IS MADE AS TO WHETHER OR NOT 01443602 * AMDPRFMT MUST INVOKE THE MEMORY ACCESS ROUTINE, ADDRESSED IN 01444002 * THE PARAMETER LIST, TO OBTAIN THE DATA TO BE FORMATTED. IF 01444102 * THE CALLER WAS INVOKED THROUGH AMDPRDMP, THE PARAMETER LIST IS 01444202 * CHECKED AS TO WHETHER THE DATA IS IN THE CALLER'S STORAGE OR 01444302 * MUST BE READ FROM THE DUMP DATA SET. IF THE CALLER WAS 01458202 * INVOKED THROUGH SNAP, THEN AMDPRFMT DOES NOT CHECK THE 01468202 * PARAMETER LIST BECAUSE THE DATA WILL BE IN EITHER THE CALLER'S 01470202 * OR SNAP'S STORAGE AND CAN BE READ DIRECTLY. IN THE EVENT THAT 01470602 * AMDPRDMP'S MEMORY ACCESS ROUTINE IS CALLED, AMDPRFMT USES THE 01471002 * SAVEAREA/WORKAREA FOR STANDARD LINKAGE AND A TEMPORARY READ 01471402 * BUFFER. THE REQUESTED ADDRESS IS READ FOR THE REQUESTED 01471802 * LENGTH WITH SPECIAL CONSIDERATION OF BOUNDARIES AND LENGTHS 01471902 * RETURNED SO AS NOT TO READ PAST A DUMP DATA SET 4K BLOCK 01472002 * BOUND. IF AT ANY TIME, THE AMDPRDMP MEMORY ACCESS ROUTINE 01472102 * RETURNS A CODE OF 4 INDICATING AN UNSUCCESSFUL READ, AMDPRFMT 01476702 * DOES THE FOLLOWING: THE DATA ITEM CURRENTLY BEING PROCESSED 01478702 * IS NOT MOVED TO THE OUTPUT LINE. THE NEXT FORMAT PATTERN, IF 01480702 * ANY, IS PROCESSED. A CODE OF 4 IS RETURNED TO THE CALLER ON 01481102 * COMPLETION. ONCE THE DATA HAS BEEN READ INTO THE WORKAREA, 01481202 * PROCESSING BECOMES IDENTICAL TO THE CASE WHERE DATA IS ALREADY 01481302 * IN THE CALLER'S (OR SNAP'S) STORAGE, AS FOLLOWS: 01481402 * IF THE DATA IS ALREADY IN PRINTABLE HEX FORMAT, IT IS MOVED 01486002 * ALL AT ONCE TO THE REQUESTED OFFSET INTO THE PRINT LINE. IF 01488002 * NOT, IT IS UNPACKED, FOUR BYTES AT A TIME WITH THE LAST UNPACK 01490002 * <= 4 BYTES DEPENDING ON THE REQUESTED LENGTH, DIRECTLY INTO 01490402 * THE PRINT LINE AT THE REQUESTED OFFSET FROM THE DATA POINTER 01490502 * IN THE FORMAT PATTERN, OR FROM THE SAVED DATA POINTER IN THE 01490602 * PARAMETER LIST. THE UNPACK IS DONE IN SUCH A WAY THAT IT DOES 01490702 * NOT REQUIRE THE USE OF A LOW ORDER PAD CHARACTER IN THE 01502502 * RECEIVING FIELD SO THAT A USER MAY FORMAT SEGMENTS OF AN 01512502 * OUTPUT LINE IN ANY ORDER. A TRANSLATE IS DONE AFTER THE 01514502 * ENTIRE STRING IS UNPACKED. THIS COMPLETES PROCESSING FOR AN 01518402 * INDIVIDUAL FORMAT PATTERN AND AMDPRFMT NEXT CHECKS FOR ANOTHER 01520402 * PATTERN OR THE WORD OF ZEROS THE LATTER OF WHICH RESULTS IN 01522402 * FREEING OF THE GETMAINED SAVE/WORK AREA IF ANY, AND RETURN TO 01526302 * THE CALLER. 01528302 * 01530402 *01* NOTES = 01534302 * 01538202 *02* DEPENDENCIES = NONE THAT CANNOT BE RESOLVED BY RECOMPILATION. 01550002 * 02010002 *02* RESTRICTIONS = NONE 02050002 * 02160002 *02* REGISTER-CONVENTIONS = REGISTER SYMBOLS ARE DEFINED STARTING 02200002 * AT SYMBOL R0. 02250002 * 02400002 *02* PATCH-LABEL = PATCH. RESERVED FOR FUTURE USE. 02450002 * 02600002 *01* MODULE-TYPE = PROCEDURE 02650002 * 02750002 *02* PROCESSOR = ASSEMBLER 02800002 * 03150002 *02* MODULE-SIZE = 0.7K BYTES 03200002 * 03350002 *02* ATTRIBUTES = REENTRANT; RESIDES IN LPA. 03400002 * 03650002 *01* ENTRY-POINT = AMDPRFMT 03700002 * 04000002 *02* PURPOSE = MAIN AND ONLY ENTRY POINT. ENTERED TO FORMAT ALL OR 04050002 * PART OF AN OUTPUT LINE. 04060002 * 04100002 *02* LINKAGE = STANDARD. 04150002 * 04300002 *02* INPUT = GENERAL PURPOSE REGISTER 0 CONTAINS ADDRESS OF THE 04350002 * FIRST FORMAT PATTERN. GENERAL PURPOSE REGISTER 1 CONTAINS THE 04400002 * ADDRESS OF THE ORIGINAL EXIT PARAMETER LIST PASSED TO THE EXIT 04450002 * MODULE BY AMDPRDMP/SNAP. 04500002 * THE FOLLOWING FIELDS IN THE EXIT PARAMETER LIST ARE 04550002 * REFERENCED: 04560002 * 04600002 * FIELD PURPOSE OF REFERENCE 04602002 * 04604002 * ADPLASID ASID FOR READ BY AMDPRDMP 04606002 * MEMORY ACCESS ROUTINE. 04608002 * ADPLSBPL SUBPOOL NUMBER TO BE USED IF 04608402 * GETMAIN NECESSARY. 04608802 * ADPLFLAG BIT ZERO IS CHECKED TO DETERMINE 04609202 * IF LOADED BY AMDPRDMP OR SNAP. 04609602 * ADPLBUF POINTER TO CALLER'S OUTPUT LINE 04609702 * BUFFER. 04609802 * ADPLMEMA IF LOADED BY AMDPRDMP, THIS FIELD 04609902 * IS USED TO ACCESS AMDPRDMP'S 04623202 * MEMORY ACCESS ROUTINE. 04633202 * ADPLFMT1 SAVE WORD FOR PREVIOUS LABEL POINTER. 04635202 * ADPLFMT2 SAVE WORD FOR PREVIOUS DATA POINTER. 04635602 * 04636002 * ALL FIELDS OF EACH FORMAT PATTERN ARE REFERENCED. 04636402 * 04636702 *02* REGISTERS-SAVED = ALL 04750002 * 04850002 *02* REGISTER-USAGE = 04900002 * R0 ADDRESS FORMAT PATTERN ON ENTRY. 05010002 * R1 ADDRESS PLIST ON ENTRY; MACRO INTERFACE. 05012002 * R2 GENERAL WORK REGISTER. 05014002 * R3 WORK REGISTER; REQUESTED LABEL/DATA LENGTH. 05016002 * R4 GENERAL WORK REGISTER. 05018002 * R5 INDEX INTO OUTPUT BUFFER. 05018402 * R6 OUTPUT BUFFER DSECT BASE. 05018802 * R7 GENERAL WORK REGISTER. 05019202 * R8 FORMAT PATTERN DSECT BASE. 05019602 * R9 LINK REGISTER; GENERAL WORK REGISTER. 05019702 * R10 INDEX INTO FORMAT PATTERNS. 05019802 * R11 AMDPRFMT BASE REGISTER. 05019902 * R12 PLIST DSECT BASE. 05029902 * R13 SAVEAREA POINTER. 05039902 * R14 RETURN ADDRESS. 05043202 * R15 RETURN CODE. 05045202 * 05046702 *02* REGISTERS-RESTORED = ALL BUT R15. 05050002 * 05150002 *01* EXIT-NORMAL = 05200002 * 05400002 *02* CONDITIONS = CONTROL IS RETURNED TO THE CALLER FROM THIS POINT 05450002 * IF AMDPRFMT WAS SUCCESSFUL IN FORMATTING ALL LABEL AND DATA 05500002 * ITEMS INDICATED IN THE FORMAT PATTERNS FOR THIS CALL. I.E. ALL 05510002 * READS FROM THE AMDPRDMP DUMP DATA SET WERE SUCCESSFUL. THIS 05520002 * EXIT IS TAKEN EVEN IF ANY LABEL OR DATA ITEM MUST BE TRUNCATED 05530002 * DUE TO OUTPUT BUFFER OVERFLOW. 05540002 * 05550002 *02* OUTPUT = THE OUTPUT BUFFER ADDRESSED BY THE PARAMETER LIST IS 05600002 * FORMATTED WITH THE REQUESTED LABELS AND DATA. THE LABEL AND 05650002 * DATA POINTER FIELDS IN THE PARAMETER LIST (ADPLFMT1 AND 05700002 * ADPLFMT2) ARE UPDATED WITH THE DEFAULT POINTERS TO BE USED ON 05750002 * THE NEXT CALL OF AMDPRFMT IN THE EVENT THAT THEY ARE NOT 05760002 * SUPPLIED IN THE NEXT FORMAT PATTERN. 05770002 * 05800002 *02* RETURN-CODES = REGISTER 15 = 0. 05850002 * 06050002 *01* EXIT-ERROR = 06100002 * 06300002 *02* CONDITIONS = CONTROL IS RETURNED TO THE CALLER FROM THIS POINT 06350002 * IF AMDPRFMT WAS NOT COMPLETELY SUCCESSFUL IN FORMATTING ALL 06400002 * DATA ITEMS INDICATED IN THE FORMAT PATTERNS FOR THIS CALL. 06410002 * I.E. AT LEAST ONE READ FROM THE AMDPRDMP DUMP DATA SET 06420002 * RESULTED IN A RETURN CODE OF 4 FROM THE AMDPRDMP MEMORY ACCESS 06430002 * ROUTINE. THIS EXIT WILL NEVER BE TAKEN WHEN AMDPRFMT IS 06440002 * LOADED BY SNAP. 06442002 * 06450002 *02* OUTPUT = THE OUTPUT BUFFER ADDRESSED BY THE PARAMETER LIST 06500002 * WILL BE FORMATTED WITH ALL LABEL ITEMS SPECIFIED IN THE FORMAT 06550002 * PATTERNS, AND ALL DATA ITEMS THAT COULD BE SUCCESSFULLY READ 06600002 * FROM THE AMDPRDMP DUMP DATA SET. 06650002 * 06700002 *02* RETURN-CODES = REGISTER 15 = 4. 06750002 * 07000002 *01* EXTERNAL-REFERENCES = 07050002 * 07200002 *02* ROUTINES = 07250002 * AMDMEMAR THE AMDPRDMP MEMORY ACCESS ROUTINE IN 07360002 * AMDPRUIM IS CALLED TO READ DATA FROM 07370002 * THE DUMP DATA SET. 07380002 * 07390002 *02* DATA-AREAS = AMDPRDMP/ABDUMP PARAMETER LIST; FORMAT PATTERNS. 07400002 * REFERENCE INPUT UNDER ENTRY POINT 07610002 * SECTION. 07620002 * 07630002 *02* CONTROL-BLOCKS = NONE 07650002 * 07900002 *01* TABLES = 07950002 * FMTREAD A 16 BYTE WORK AREA TO CONTAIN DATA READ 08110002 * FROM THE AMDPRDMP DUMP DATA SET. 08120002 * FMTLN4A A 16 BYTE TRANSLATE TABLE USED TO TRANSLATE 08130002 * HEX CHARACTERS A-F TO PRINTABLE HEX. 08140002 *01* MACROS = GETMAIN 08150002 * FREEMAIN 08260002 * 08270002 *02* SERIALIZATION = NONE 08300002 * 08400002 *01* CHANGE-ACTIVITY = Y02006 08450002 * 08550002 *01* MESSAGES = NONE 08600002 * 08800002 *01* ABEND-CODES = NONE 08850002 * 08950002 **** END OF SPECIFICATIONS ***/ 09000002 */*AMDPRFMT: CHART (AMODE,SEQ) */ 09010002 */*HEADER 09020002 */*AMDPRFMT - AMDPRDMP/ABDUMP LINE FORMAT ROUTINE 09030002 */* PAGE # */ 09040002 */*AMDPRFMT: E AMDPRDMP/ABDUMP LINE FORMAT ROUTINE */ 09050002 */* N THIS ROUTINE FORMATS A LINE USING A FORMAT PATTERN */ 09100002 */* M SET UP ADDRESSABILITY */ 09150002 */* P SET UP BASE FOR PLIST MAPPING (R12) */ 09160002 */* P SET RET CODE =0 FOR IMMEDIATE RETURN IF NO PATRNS */ 09210002 */* P PUT PATTERN ADDRESS IN REG 8 FOR BASING & TEST FOR 0 */ 09250002 */* D (YES,,NO,FMTLNRT3) IS THERE A PATTERN? */ 09260002 */* P SET UP BASE FOR PATTERN MAPPING */ 09270002 */* P GET OUTPUT BUFFER ADDRESS FROM PLIST */ 09300002 */* P SET UP BASE FOR OUTPUT BUFFER MAPPING */ 09310002 */* D (YES,,NO,FMTLNLP) TEST ADPLFLAG- LOAD BY PRDMP? */ 09320002 */* L GETMAIN FOR FMTSAVE AREA & WORK AREA */ 09340002 */* N USE SUBPOOL FROM PLIST */ 09340402 */* P STD SAVE AREA LINKAGE */ 09342002 */* P BASE WORK AREAS ON R13 */ 09344002 */* M INITIALIZE AMDPRFMT RETURN CODE SW OFF */ 09348002 */*FMTLNLP: P ZERO INDEX REG FOR PATTERN */ 09350002 */* D (YES,FMTLNRT,NO,) IS PATTERN CODE = 0? END OF PTRNS */ 09400002 */* D (YES,FMTLN1,NO,) IS THERE A LABEL? */ 09450002 */*FMTLNA: D (YES,FMTLN2,NO,) IS THERE DATA? */ 09500002 */*FMTLNB: P (,FMTLNLP) UPDATE PATTERN BASE TO POINT TO NEXT PATTERN */ 09550002 */*FMTLN1: N MOVE LABEL TO OUTPUT BUFFER */ 09600002 */* P GET LENGTHS FROM PATTERN */ 09650002 */* P AND OFF DATA LENGTH FOR LABEL LEN ONLY */ 09660002 */* D (YES,%L2,NO,) IS THERE A LABEL POINTER? */ 09700002 */*FMTLN1A: P (,FMTLN1B) P GET LABEL PTR FROM FMT SAVE WORD IN PLIST */ 09750002 */*%L2: P GET LABEL PTR FROM PATTERN */ 09800002 */* P ADD 4 TO INDEX REGISTER */ 09850002 */*FMTLN1B: P UPDATE PTR TO THE NEXT LABEL AND STORE IT BACK IN PLIST 09900002 */**/ 09910002 */* P GET LABEL OFFSET INTO OUTPUT BUFFER FROM PATTERN */ 09950002 */* P GET ADDR OF WHERE TO PUT LABEL IN BUFFER */ 10000002 */* D (YES,,NO,%ML1) IS THIS ADDR OVER END OF BUFFER? */ 10010002 */* N (,FMTLNB) DO NOT FORMAT LABEL */ 10020002 */*%ML1: P ADD LEN OF LABEL TO BUFFER ADDR + OFFSET */ 10030002 */* D (YES,,NO,%ML2) IS RESULT OVER END OF BUFFER? */ 10040002 */* P SUBTRACT AMOUNT OF OVERFLOW FROM ORIGINAL LENGTH */ 10042002 */*%ML2: P (,FMTLNA) EX TO MOVE VAR LEN LABEL TO OUTPUT BUFFER */ 10050002 */*FMTLN2: N PUT DATA IN PRINT LINE */ 10100002 */* P GET LENGTHS FROM PATTERN */ 10150002 */* P AND OFF LABEL LENGTH FOR DATA LENGTH ONLY */ 10160002 */* P INCR BY 1 FOR TRUE LENGTH */ 10170002 */* D (YES,,NO,FMTLN2A) IS THERE A DATA PTR? */ 10200002 */* P GET DATA PTR FROM PATTERN */ 10250002 */* P (,FMTLN2B) ADD 4 TO PATTERN INDEX REGISTER */ 10300002 */*FMTLN2A: P GET DATA PTR FROM FMT SAVE WORD IN PLIST */ 10350002 */*FMTLN2B: P UPDATE PTR TO NEXT DATA AND STORE IT BACK IN PLIST */ 10400002 */* P GET DATA OFFSET FROM PATTERN */ 10450002 */* D (YES,,NO,%ML3) WAS FMT LOADED BY ABDUMP? */ 10460002 */* N (,FMTLN3) DATA IS DEFINITELY IN CORE */ 10470002 */*%ML3: N LOAD BY PRDMP- DATA MAY NOT BE IN CALLERS STORAGE */ 10480002 */* D (YES,,NO,%ML4) IS DATA IN STORAGE? */ 10500002 */* N (,FMTLN3) DATA IS IN CALLERS STORAGE */ 10510002 */*%ML4: N MUST CALL MEMORY ACCESS RTN TO READ THE DUMP */ 10520002 */* N IF DATA IS NOT ALREADY IN EBCDIC, SET TARGET OF MOVE */ 10530002 */* N FROM READ AREA TO 16 BYTE WORK AREA */ 10540002 */* N IF DATA IS ALREADY IN EBCDIC, THEN SET TARGET OF MOVE */ 10542002 */* N DIRECTLY TO OUTPUT BUFFER */ 10544002 */* P GET ADDRESS OF WORK AREA FOR READ TARGET */ 10550002 */* D (YES,,NO,FMTLN2C) IS DATA ALREADY IN EBCDIC? */ 10600002 */* P GET ADDRESS OF WHERE TO PUT DATA IN BUFFER FOR READ TARGET */ 10650002 */* D (YES,,NO,%ML5) THIS ADDR OVER END OF BUFFER? */ 10660002 */* N (,FMTLNB) DO NOT FORMAT DATA */ 10670002 */*%ML5: P ADD LEN OF DATA TO BUF ADDR + OFFSET */ 10680002 */* D (YES,,NO,FMTLN2C) IS RESULT OVER END OF BUFFER? */ 10690002 */* P SUBTRACT AMOUNT OF OVERFLOW FROM ORIGINAL LENGTH */ 10692002 */*FMTLN2C: P SAVE REGS 2 - 3 */ 10700002 */*FMTLN2D: P PUT ADDR TO BE READ IN REG 0 (FROM R7) */ 10750002 */* P RESET PLIST ADDR IN R1 */ 10760002 */* L CALL MEMORY ACCESS RTN - READ FOR THE DATA */ 10800002 */* N AT MOST ONLY 4 BYTES OF DATA ARE ASSURED TO BE VALID */ 10850002 */* D (YES,FMTLN2D1,NO,) MEMORY ACCESS RTN SUCCESSFUL? */ 10860002 */* M (,FMTLNB) INDICATE ONE OF THE READS FAILED & QUIT THIS PTRN */ 10870002 */*FMTLN2D1: P POINT R1 TO DATA JUST READ */ 10880002 */* P CALCULATE NUMBER OF BYTES THAT CAN BE MOVED */ 10900002 */* D (YES,FMTLN2E,NO,) IS NUMBER OF BYTES < 4? */ 10950002 */* P PUT 4 IN LENGTH REGISTER */ 11000002 */*FMTLN2E: P DECREMENT LENGTH TO BE MOVED FROM REMAINING LENGTH */ 11050002 */* D (YES,,NO,FMTLN2F) RESULT > 0? */ 11100002 */* P INCREMENT 'FROM' ADDRESS */ 11150002 */* P MOVE DATA TO AREA */ 11200002 */* P (,FMTLN2D) INCREMENT 'TOO' ADDRESS */ 11250002 */*FMTLN2F: P ADD SUBTRACTED VALUE BACK TO LENGTH */ 11300002 */* D (YES,FMTLN2G,NO,) IS RESULT = 0? */ 11350002 */* P MOVE LAST PART OF DATA */ 11400002 */*FMTLN2G: P RESTORE REGISTERS 2 - 3 */ 11450002 */* D (YES,FMTLNB,NO,) IS DATA ALREADY IN EBCDIC? */ 11500002 */*FMTLN2H: P GET ADDRESS OF WHERE TO PUT DATA IN BUFFER */ 11550002 */* D (YES,,NO,%ML6) THIS ADDR OVER END OF BUFFER? */ 11560002 */* N (,FMTLNB) DO NOT FORMAT DATA */ 11570002 */*%ML6: P ADD TWICE THE LEN OF DATA TO BUFFER ADDR + OFFSET */ 11580002 */* D (YES,,NO,FMTLN2I) IS RESULT OVER END OF BUFFER? */ 11590002 */* P DETERMINE HOW MUCH OVER */ 11592002 */* N CONVERT TO INPUT BYTES ROUNDED TO BYTE BOUNDARY */ 11594002 */* P ADD 1 & DIVIDE BY 2 */ 11596002 */* P SUBTRACT CONVERTED EXISS VALUE FROM ORIG INPUT LEN */ 11598002 */* D (YES,,NO,FMTLN2I) IS TRUNCATED LENGTH = 0? */ 11598402 */* N (,FMTLNB) DO NOT FORMAT DATA */ 11598802 */*FMTLN2I: S (,FMTLNB) FMTLN4: TRANSLATE TO PRINTABLE HEX */ 11599202 */*FMTLN3: P SET UP DATA 'FROM' ADDRESS FOR HEXCNVT IF NOT IN EBCDIC */ 11650002 */* D (YES,,NO,FMTLN2H) IS DATA ALREADY IN EBCDIC? */ 11700002 */* P MOVE DATA 'FROM' ADDRESS TO PREG */ 11800002 */* P GET ADDR OF WHERE TO PUT DATA IN BUFFER */ 11810002 */* D (YES,,NO,%ML8) IS THIS ADDR OVER END OF BUF? */ 11820002 */* N (,FMTLNB) DO NOT FORMAT DATA */ 11830002 */*%ML8: P ADD LENGTH OF DATA TO BUFFER ADDR + OFFSET */ 11840002 */* D (YES,,NO,FMTLN3A) IS RESULT OVER END OF BUFFER? */ 11842002 */* P SUBTRACT AMOUNT OF OVERFLOW FROM ORIGINAL LENGTH */ 11844002 */*FMTLN3A: P DECREMENT LENGTH FOR EX MOVE DATA */ 11850002 */* P (,FMTLNB) MOVE EBCDIC DATA TO BUFFER */ 11900002 */*FMTLN4: E PRINT HEX CONVERT */ 11950002 */* D (YES,,NO,%ML10) IS LENGTH = 0? */ 11960002 */* N (,FMTLN4H) DO NOTHING */ 11970002 */*%ML10: P SAVE LOW ORDER 2 BITS OF LENGTH */ 11980002 */* P DIVIDE LENGTH BY 4 */ 11990002 */* D (YES,FMTLN4F,NO,) TOTAL LENGTH LESS THAN 4? */ 11992002 */*FMTLN4E: P UNPACK 4 BYTES INTO 7 BYTES OF BUFFER */ 11994002 */* P UNPACK LAST BYTE PREVIOUSLY UNPKED INTO 8TH BYTE OF BUF */ 11996002 */* P OR LAST 2 BYTES (7TH & 8TH) WITH 'F0F0' */ 11998002 */* P INCR BUFFER PTR BY 8 */ 11998402 */* P INCR SOURCE PTR BY 4 */ 11998802 */* P DECR COUNT OF GROUPS OF 4 BYTES */ 11999202 */* D (YES,FMTLN4F,NO,FMTLN4E) PROCESSED LAST GROUP? */ 11999602 */*FMTLN4F: D (YES,,NO,%ML11) ARE SAVED BITS = 0? */ 11999702 */* N (,FMTLN4G) NO <4 INPUT BYTE GROUP TO FORMAT */ 11999802 */*%ML11: N FORMAT LAST (OR ONLY) GROUP OF <4 INPUT BYTES */ 11999902 */* P DECR REMAIN LENGTH BY 1 FOR EXEC */ 12016602 */* P DOUBLE LEN FOR EX TARGET */ 12026602 */* P SHIFT TARGET LENGTH 4 BITS LEFT IN EX REG */ 12028602 */* P INSERT SOURCE LEN IN LOW 4 BITS OF EX REG */ 12030602 */* P EX UNPACK REMAIN <4 BYTE GROUP */ 12032602 */* P INCR BUFFER PTR TO LAST BYTE JUST UNPKED */ 12033002 */* P UNPACK LAST BYTE PREVIOUSLY UNPKED INTO NEXT BYTE */ 12033102 */* P OR LAST 2 BYTES WITH 'F0F0' */ 12033202 */* P ADJUST BUFFER PTR PAST LAST BYTE (ADD 2) */ 12035202 */*FMTLN4G: P AGAIN DOUBLE LENGTH FOR TRANSLATE */ 12038802 */* P RE ESTABLISH BUFFER PTR TO BEGIN OF FIELD */ 12040802 */* P DECR LENGTH FOR EX */ 12042802 */* P EX TRANSLATE OF FA - FF */ 12043202 */*FMTLN4H: R RETURN ON R9 */ 12043602 */*FMTLNRT: D (YES,,NO,FMTLNRT2) LOADED BY PRDMP? */ 12045602 */* P INITIALLY INDICATE RETURN CODE 0 REQD */ 12046002 */* D (YES,,NO,FMTLNRT1) ANY READ ERRORS THIS CALL? */ 12046402 */* P INDICATE RETURN CODE 4 REQD */ 12046802 */*FMTLNRT1: M SET UP FOR FREEMAIN */ 12047202 */* P RESTORE SAVEAREA LINKAGE */ 12047602 */* L FREE GETMAINED SAVE/WORK AREA */ 12049602 */* P (,FMTLNRT3) MOVE INDICATED RET CODE TO R15 */ 12049702 */*FMTLNRT2: P SET CODE OF 0 IN R15 */ 12050002 */*FMTLNRT3: P RESTORE REGS EXCEPT R15 */ 12060002 */* R RETURN */ 12100002 */*AMDPRFMT: END */ 12150002 EJECT 12200002 *********************************************************************** 12250002 * * 12300002 * THIS IS THE GENERAL FORMAT ROUTINE . INPUT * 12350002 * TO THIS ROUTINE IS A LIST OF FORMAT PATTERNS, EACH * 12400002 * DESCRIBES THE POSITION OF A DATA ITEM IN THE OUTPUT * 12450002 * LINE AND A LABEL WHICH IDENTIFIES THAT DATA ITEM. THE * 12500002 * ENTIRE LIST THUS DESCRIBES THE FORMAT OF A LINE OF * 12550002 * OUTPUT. AMDPRFMT FORMATS SUCH A LINE IN THE EXIT * 12600002 * INTERFACE OUTPUT BUFFER, READY FOR PRINTING. THE * 12650002 * FOLLOWING IS THE FORMAT OF A PATTERN ENTRY... * 12700002 * * 12750002 * 0 **************************************** * 12800002 * * CODE * LBL* DTA* LABEL * DATA * * 12850002 * * BYTE * LN * LN * OFFSET * OFFSET * * 12900002 * 4 **************************************** * 12950002 * * POINTER TO LABEL * * 13000002 * * (IF PRESENT) * * 13050002 * 8 **************************************** * 13100002 * * POINTER TO DATA * * 13150002 * * (IF PRESENT) * * 13200002 * **************************************** * 13250002 * * 13300002 * CODE BYTE DESCRIPTION... * 13350002 * BIT MEANING * 13400002 * 0 UNUSED * 13450002 * 1 UNUSED * 13500002 * 2 DATA IS EBCDIC * 13550002 * 3 DATA IS IN CORE * 13600002 * 4 THERE IS A DATA POINTER * 13650002 * 5 DATA IS TO BE PLACED ON PRINT LINE * 13700002 * 6 THERE IS A LABEL POINTER * 13750002 * 7 A LABEL IS TO BE INCLUDED ON PRINT LINE * 13800002 * * 13850002 * IF LABEL AND DATA POINTERS DON'T EXIST THE PATTERN ENTRY * 13900002 * WILL ONLY BE 4 BYTES LONG. IF EITHER POINTER IS OMITTED THE* 13950002 * ROUTINE WILL USE THE ADDRESS OF THE LAST LABEL OR DATA * 14000002 * PLUS IT'S LENGTH FOR THE NEXT LABEL OR DATA ADDRESS. * 14050002 * THE LAST ENTRY IN A PATTERN WILL BE FOLLOWED BY A BYTE OF * 14100002 * ZEROS. * 14150002 * * 14200002 *********************************************************************** 14250002 EJECT 14300002 R0 EQU 0 14400002 R1 EQU 1 14450002 R2 EQU 2 14500002 R3 EQU 3 14550002 R4 EQU 4 14600002 R5 EQU 5 14650002 R6 EQU 6 14700002 R7 EQU 7 14750002 R8 EQU 8 14800002 R9 EQU 9 14850002 R10 EQU 10 14900002 R11 EQU 11 14950002 R12 EQU 12 15000002 R13 EQU 13 15050002 R14 EQU 14 15100002 R15 EQU 15 15150002 SPACE 15200002 STM R14,R12,12(R13) STORE CALLER'S REGS 15250002 BALR R11,0 ESTABLISH REG 11 AS BASE 15300002 USING *,R11 15350002 MODID 15360002 SPACE 15400002 LR R12,R1 REGISTER 12 WILL 15410002 USING ABDPL,R12 ADDRESS EXIT PARAMETER LIST 15450002 SR R15,R15 SET 0 RET CODE IN CASE NO PATTERNS 15460002 LTR R8,R0 PATTERN ADDR TO R8 FOR BASE 15500002 BZ FMTLNRT3 IF NOT PATTERN, EXIT 15550002 USING FMTPTRN,R8 ADDRESS FORMAT PATTERN MAP 15600002 L R6,ADPLBUF GET OUTPUT BUFFER ADDR 15650002 USING OUTBUF,R6 ADDRESS OUTPUT BUFFER MAP 15700002 TM ADPLFLAG,ADPLSNPR WERE WE LOADED BY PRDMP? 15810002 BZ FMTLNLP NO- DONT NEED GETMAINED WORK AREA 15820002 SPACE 15820402 *********************************************************************** 15822002 * * 15824002 * LOADED BY AMDPRDMP; NEED GETMAINED SAVE/WORK AREA * 15830002 * * 15840002 *********************************************************************** 15840102 SPACE 15840202 LA R0,GETMLEN SET LENGTH OF GETMAIN 15840402 ICM R0,B'1000',ADPLSBPL SET UP SUBPOOL NUMBER 15842002 GETMAIN R,LV=(0) GET SAVE/WORK AREA 15846002 ST R13,4(R1) SAVE AREA LINKAGE 15848002 ST R1,8(R13) 15848402 LR R13,R1 15848802 USING FMTSWMAP,R13 ADDRESS SAVE/WORK AREA MAP 15849202 MVI FMTSWS,X'00' INITIALIZE FMT RET CODE SW OFF 15849702 SPACE 15849802 *********************************************************************** 15849902 * * 15850002 * PROCESS STRING OF PATTERNS * 15866602 * * 15876602 *********************************************************************** 15878602 SPACE 15880602 FMTLNLP SR R10,R10 ZERO INDEX REG 15883302 TM PTRNCD,X'FF' TEST FOR END OF PATTERN 15900002 BZ FMTLNRT YES--RETURN TO CALLER 15950002 TM PTRNCD,LBL TEST FOR LABEL FOR THIS ENTRY 16000002 BO FMTLN1 YES--GO MOVE TO LABEL TO OUTPUT BUFF 16050002 FMTLNA TM PTRNCD,DTA TEST FOR DATA FOR THIS ENTRY 16100002 BO FMTLN2 YES--PUT DATA INTO OUTPUT BUFFER 16150002 FMTLNB LA R8,4(R10,R8) UPDATE PATTERN BASE TO NEXT ENTRY 16200002 B FMTLNLP LOOP FOR ALL PATTERN ENTRIES 16250002 SPACE 2 16252002 *********************************************************************** 16260002 * * 16270002 * * 16350002 * MOVE LABEL TO OUTPUT BUFFER * 16400002 * * 16450002 * * 16460002 *********************************************************************** 16470002 SPACE 16500002 FMTLN1 IC R3,PTRNLN GET LENGTHS 16550002 N R3,LN1MSK AND FOR LABEL LN ONLY 16600002 SRL R3,4 SHIFT TO LOW DIGIT OF REG 16650002 TM PTRNCD,LBLP IS THERE A LABEL POINTER 16700002 BZ FMTLN1A NO--BR AROUND 16750002 L R7,PTRNPTR YES--LOAD IT INTO R7 16800002 LA R10,4(R10) ADD LN OF PTR TO INDEX 16850002 B FMTLN1B BR AROUND 16900002 FMTLN1A L R7,ADPLFMT1 LOAD ADDR OF NEXT LABEL 16950002 FMTLN1B LA R4,1(R7,R3) INCR NEXT LABEL ADDR 17000002 ST R4,ADPLFMT1 STORE IT BACK 17050002 SR R4,R4 CLEAR FOR IC 17100002 IC R4,PTRNOFF1 GET OFFSET INTO LINE OF LABEL 17150002 LA R4,ADDR(R4) ADDR OF WHERE TO PUT LABEL ON LINE 17200002 LA R1,OVRFLOW ADDR OF 1ST CHAR OVER BUFFER END 17202002 CR R4,R1 IS HE POINTING ME OUTSIDE BUFFER? 17210002 BNL FMTLNA YES, DO NOT FORMAT LABEL 17220002 LA R9,1(R4,R3) ADD LENGTH TO BUFFER ADDR + OFFSET 17250002 CR R9,R1 IS RESULT OUTSIDE OF BUFFER? 17300002 BNH FMTLN1C NO- GO AHEAD AND MOVE LABEL 17310002 SPACE 17312002 *********************************************************************** 17314002 * * 17316002 * PART OF LABEL IS OUTSIDE OF BUFFER- TRUNCATE IT. * 17316402 * * 17318002 *********************************************************************** 17318402 SPACE 17318802 SR R9,R1 DETERMINE HOW MUCH WENT OVER 17330002 SR R3,R9 TRUNCATE ORIGINAL LENGTH 17340002 FMTLN1C EX R3,LBLMOVE MOVE LABEL TO PRINT LINE 17400002 B FMTLNA CONTINUE 17450002 SPACE 2 17500002 *********************************************************************** 17510002 * * 17520002 * * 17550002 * PLACE DATA INTO PRINT LINE * 17600002 * * 17650002 * * 17660002 *********************************************************************** 17670002 SPACE 17700002 FMTLN2 IC R3,PTRNLN GET LENGTHS 17750002 N R3,LN2MSK AND OFF ALL BUT LAST DIGIT 17800002 LA R3,1(R3) INCR TO REAL LENGTH 17850002 TM PTRNCD,DTAP IS THERE A DATA PTR 17900002 BZ FMTLN2A BR IF NOT 17950002 L R7,PTRNPTR(R10) YES--LOAD PTR TO DATA 18000002 LA R10,4(R10) ADD LN OF PTR TO INDEX REG 18050002 B FMTLN2B BR AROUND 18100002 FMTLN2A L R7,ADPLFMT2 LOAD ADDR OF NEXT DATA 18150002 FMTLN2B LA R4,0(R7,R3) UPDATE TO NEXT DATA ADDR 18200002 ST R4,ADPLFMT2 PUT IT BACK 18250002 SR R4,R4 CLEAR OFFSET REG 18300002 IC R4,PTRNOFF2 LOAD OFFSET OF DATA INTO PRINT LINE 18350002 TM ADPLFLAG,ADPLSNPR WERE WE LOADED BY ABDUMP? 18360002 BZ FMTLN3 YES- DATA IS IN CORE- NO READS REQD 18370002 SPACE 18372002 *********************************************************************** 18374002 * * 18376002 * LOADED BY AMDPRDMP- DATA MAY OR MAY NOT BE IN CORE- CHECK PATTERN * 18380002 * * 18382002 *********************************************************************** 18384002 SPACE 18386002 TM PTRNCD,DTAC IS DATA ALREADY IN CORE? 18390002 BO FMTLN3 YES- MOVE DIRECTLY - NO NEED TO 18392002 * CALL MEMORY ACCESS ROUTINE 18394002 SPACE 18396002 *********************************************************************** 18396402 * * 18396802 * DATA MUST BE READ FROM DUMP VIA MEMORY ACCESS ROUTINE. * 18398002 * IF DATA IS ALREADY IN EBCDIC, THEN SET TARGET OF MOVE FROM * 18398402 * READ AREA DIRECTLY TO OUTPUT BUFFER. IF DATA IS NOT ALREADY * 18398802 * IN EBCDIC, SET TARGET OF MOVE TO 16 BYTE GETMAINED WORKAREA. * 18399202 * * 18399302 *********************************************************************** 18399402 SPACE 18399502 TM PTRNCD,DTAE IS DATA ALREADY IN EBCDIC? 18399602 LA R2,FMTREAD SET MOVE TARGET TO WORK AREA 18399702 BZ FMTLN2C NO- NOT ALREADY EBCDIC- KEEP R2 18399802 LA R2,ADDR(R4) YES- ALREADY EBCDIC- SET MOVE TARGET 18399902 * DIRECTLY TO OUTPUT BUFFER 18416602 SPACE 18418602 *********************************************************************** 18420602 * * 18422602 * SINCE MOVING DIRECTLY TO OUTPUT BUFFER- CHECK LENGTHS & INSURE * 18426602 * DATA DOES NOT FALL OUTSIDE OF BUFFER * 18428602 * * 18428702 *********************************************************************** 18428802 SPACE 18428902 LA R1,OVRFLOW ADDR OF 1ST CHAR OVER BUFFER END 18429002 CR R2,R1 IS HE POINTING ME OUTSIDE BUFFER? 18430602 BNL FMTLNB YES- DO NOT FORMAT DATA 18432602 LA R9,0(R2,R3) ADD LENGTH TO BUFFER ADDR + OFFSET 18433002 CR R9,R1 IS RESULT OUTSIDE OF BUFFER? 18433102 BNH FMTLN2C NO- GO AHEAD AND MOVE DATA 18433202 SPACE 18435302 *********************************************************************** 18437302 * * 18437702 * PART OF DATA IS OUTSIDE OF BUFFER- TRUNCATE IT. * 18438802 * * 18439202 *********************************************************************** 18439602 SPACE 18440002 SR R9,R1 DETERMINE HOW MUCH WENT OVER 18440802 SR R3,R9 TRUNCATE ORIGINAL LENGTH 18442802 SPACE 18442902 *********************************************************************** 18443002 * * 18443102 * PREPARE TO READ DATA FROM THE DUMP VIA MEMORY ACCESS RTN * 18443202 * * 18443302 *********************************************************************** 18443402 SPACE 18443502 FMTLN2C STM R2,R3,FMTRDSV SAVE ACROSS THE READ 18443602 FMTLN2D LR R0,R7 ADDR TO BE READ IN PARM REGISTER 18444002 LR R1,R12 RESTORE PLIST REG 18444102 L R15,ADPLMEMA GET ADDR OF MEMORY ACCESS FROM PLIST 18444202 BALR R14,R15 CALL MEMORY ACCESS ROUTINE 18444302 LTR R15,R15 WAS READ SUCCESSFUL? 18444402 BZ FMTLN2D1 YES- CONTINUE 18458202 SPACE 18460202 *********************************************************************** 18462202 * * 18464202 * READ VIA THE MEMORY ACCESS ROUTINE WAS UNSUCCESSFUL. * 18468202 * INDICATE A RETURN OF 4 IN R15 WILL BE REQUIRED ON EXIT. * 18470202 * DISCONTINUE PROCESSING OF THIS PATTERN, & CONTINUE WITH THE NEXT * 18470602 * PATTERN, IF ANY. * 18471002 * * 18471102 *********************************************************************** 18471202 SPACE 18471302 OI FMTSWS,MEMAERR INDICATE ONE BAD READ 18471402 B FMTLNB CONTINUE WITH NEXT PATTERN, IF ANY 18471802 FMTLN2D1 LR R1,R0 POINT R1 TO DATA JUST READ 18481802 LCR R5,R7 COMPLIMENT ADDR 18521802 N R5,LN3MSK AND OFF ALL BUT LAST 2 BITS 18571802 BNZ FMTLN2E BR IF NOT ZERO (LN IN R5) 18621802 LA R5,4 ZERO--USE A LN OF 4 18671802 FMTLN2E SR R3,R5 SUBTRACT LN TO BE MOVED FROM 18721802 * REMAINING LENGTH 18771802 BNP FMTLN2F BR IF REMAINING LN EQ OR LT 0 FOR 18821802 * LAST MOVE 18871802 AR R7,R5 INCR 'FROM' ADDR 18921802 BCTR R5,0 DECR LN OF MOVE FOR EX 18931802 EX R5,DTAMOVE1 MOVE DATA 18941802 LA R2,1(R5,R2) INCR 'TOO' ADDR 18943802 B FMTLN2D LOOP FOR ALL DATA TO BE MOVED 18945802 SPACE 18947802 FMTLN2F AR R3,R5 ADD BACK SUBTRACTED VAL TO LN 18949802 BZ FMTLN2G ALL DONE IF ZERO 18949902 BCTR R3,0 DECR 1 FOR EX 18966602 EX R3,DTAMOVE1 DO LAST MOVE 18976602 FMTLN2G LM R2,R3,FMTRDSV RESTORE REGS R2 - R3 18978602 TM PTRNCD,DTAE IS DATA EBCDIC 18980602 BO FMTLNB YES--DONE WITH DATA FOR THIS PATTERN 18982602 * ENTRY IF SO 18983002 SPACE 18983302 FMTLN2H LA R5,ADDR(R4) ADDR OF WHERE IN BUFFER TO PUT 19000002 * DATA 19050002 LA R1,OVRFLOW ADDR OF 1ST CHAR OVER BUFFER END 19052002 CR R5,R1 IS HE POINTING ME OUTSIDE BUFFER? 19060002 BNL FMTLNB YES- DO NOT FORMAT DATA 19070002 LA R9,0(R5,R3) ADD LENGTH TO BUFFER ADDR + OFFSET 19100002 AR R9,R3 AGAIN ADD LENGTH FOR PRINTABLE HEX 19150002 CR R9,R1 IS RESULT OUTSIDE OF BUFFER? 19200002 BNH FMTLN2I NO- GO AHEAD AND CONVERT DATA 19250002 SPACE 19252002 *********************************************************************** 19254002 * * 19256002 * PART OF CONVERTED DATA IS OUTSIDE OF BUFFER- TRUNCATE THE INPUT * 19260002 * (I.E. ONE HALF THE CONVERTED) LENGTH. * 19270002 * * 19272002 *********************************************************************** 19274002 SPACE 19276002 SR R9,R1 DETERMINE HOW MUCH WENT OVER 19280002 LA R9,1(R9) INCREMENT BY ONE AND 19290002 SRL R9,1 DIVIDE BY 2 TO OBTAIN AMOUNT BY 19292002 * WHICH THE INPUT LENGTH SHOULD BE 19294002 * TRUNCATED. (BYTE BOUNDARY) 19296002 SR R3,R9 TRUNCATE ORIGINAL LENGTH 19298002 LTR R3,R3 INSURE TRUNCATED LENGTH ISNT 0 19298402 BZ FMTLNB ZERO- CANT FORMAT THIS DATA 19298802 FMTLN2I BAL R9,FMTLN4 CONVERT DATA TO PRINTABLE HEX 19300002 B FMTLNB DONE WITH DATA FOR THIS PTRN ENTRY 19350002 SPACE 19360002 FMTLN3 LR R2,R7 DATA 'FROM' ADDR TO R2 19370002 TM PTRNCD,DTAE IS DATA ALREADY IN EBCDIC? 19380002 BZ FMTLN2H NO--GO CONVERT TO HEX 19390002 LA R2,ADDR(R4) DATA 'TOO' ADDR TO R2 19394402 LA R1,OVRFLOW ADDR OF 1ST CHAR OVER BUFFER END 19394802 CR R2,R1 IS HE POINTING ME OUTSIDE BUFFER? 19396402 BNL FMTLNB YES- DO NOT FORMAT DATA 19396802 LA R9,0(R2,R3) ADD LENGTH TO BUFFER ADDR + OFFSET 19398002 CR R9,R1 IS RESULT OUTSIDE OF BUFFER? 19398402 BNH FMTLN3A NO- GO AHEAD AND MOVE DATA 19398802 SPACE 19402002 *********************************************************************** 19404002 * * 19406002 * PART OF DATA IS OUTSIDE OF BUFFER- TRUNCATE IT. * 19407302 * * 19407702 *********************************************************************** 19408102 SPACE 19408502 SR R9,R1 DETERMINE HOW MUCH OVER 19409302 SR R3,R9 TRUNCATE ORIGINAL LENGTH 19411302 FMTLN3A BCTR R3,0 DECR LN FOR EXECUTE 19416002 LR R1,R7 DATA 'FROM' ADDR TO PREG 19418002 EX R3,DTAMOVE1 MOVE EBCDIC DATA TO BUFFER 19424502 B FMTLNB CONTINUE WITH NEXT ENTRY IN PATTERN 19433002 SPACE 19441502 *********************************************************************** 19441902 * * 19442302 * CONVERT DATA TO PRINTABLE HEX * 19443502 * * 19443902 *********************************************************************** 19444302 SPACE 19444702 FMTLN4 LTR R1,R3 MAKE SURE LENGTH ISNT ZERO 19445502 BZ FMTLN4H ZERO- DO NOTHING 19447502 LA R0,3 SET UP MASK 19449502 NR R0,R1 AND SAVE 2 LOW ORDER BITS 19449902 SRL R1,2 DIVIDE BY 4 19466602 LTR R1,R1 LENGTH LESS THAN 4? 19476602 BZ FMTLN4F IF YES--BRANCH 19478602 FMTLN4E UNPK 0(7,R5),0(4,R2) UNPACK HEX DIGITS 19480602 UNPK 7(1,R5),6(1,R5) UNPACK 2ND LAST INTO LAST 19482602 OC 6(2,R5),LN4MSK FIX THE ZONES 19483002 LA R5,8(R5) INCREMENT BUF INDEX REG 19483102 LA R2,4(R2) INCREMENT INPUT SOURCE PTR 19483202 BCT R1,FMTLN4E LOOP THRU GROUPS OF 4 BYTES 19488802 FMTLN4F LTR R0,R0 TEST SAVED BITS 19493602 BZ FMTLN4G BRANCH IF NO <4 BYTE GROUP 19494002 BCTR R0,0 DECREMENT FOR EXECUTE 19494102 LR R1,R0 ADJUST R1 19494202 AR R1,R0 FOR EXECUTE INSTRUCTION 19494302 SLL R1,4 19508202 OR R1,R0 19518202 EX R1,FMTLN4C EXECUTE UNPACK 19520202 SRL R1,4 19520602 AR R5,R1 19521002 UNPK 1(1,R5),0(1,R5) UNPK 2ND LAST INTO LAST 19521402 OC 0(2,R5),LN4MSK FIX THE ZONES 19521802 LA R5,2(R5) ADJUST PAST END OF LAST UNPKED BYTE 19521902 FMTLN4G AR R3,R3 SET UP LENGTH FOR 19527902 * TRANSLATE INSTRUCTION 19530502 SR R5,R3 RE-EXTABLISH BEGINNING OF FIELD 19533102 BCTR R3,0 DECR LN 1 FOR EXECUTE INSTR 19535702 EX R3,FMTLN4D EXECUTE TRANSLATE 19538302 FMTLN4H BR R9 RETURN TO CALLER 19540902 SPACE 19543502 *********************************************************************** 19546102 * * 19548102 * EXECUTABLE INSTRUCTIONS * 19550002 * * 19560002 *********************************************************************** 19570002 SPACE 19580002 DTAMOVE1 MVC 0(0,R2),0(R1) MOVE DATA 19600002 LBLMOVE MVC 0(0,R4),0(R7) MOVE LABELS 19650002 FMTLN4C UNPK 0(0,R5),0(0,R2) UNPACK HEX DIGITS 19660002 FMTLN4D TR 0(0,R5),FMTLN4A-X'F0' TRANSLATE FA - FF 19670002 SPACE 2 19700002 FMTLNRT TM ADPLFLAG,ADPLSNPR WERE WE LOADED BY PRDMP? 19750002 BZ FMTLNRT2 NO- SKIP FREEMAIN & RET CODE CHECK 19800002 SPACE 19810002 *********************************************************************** 19820002 * * 19830002 * WERE LOADED BY PRDMP- SET PROPER RETURN CODE, RESTORE SAVEAREA * 19850002 * CHAINING, AND FREE GOTTEN STORAGE. * 19860002 * * 19862002 *********************************************************************** 19864002 SPACE 19866002 SR R9,R9 SET A ZERO RETURN CODE 19870002 TM FMTSWS,MEMAERR ANY READ ERRORS THIS CALL? 19880002 BZ FMTLNRT1 NO- KEEP CODE OF ZERO 19890002 SPACE 19890402 *********************************************************************** 19890802 * * 19891202 * AT LEAST ONE READ FAILED DURING THIS CALL OF AMDPRFMT. * 19892002 * * 19892402 *********************************************************************** 19892802 SPACE 19893202 LA R9,4 SET A RETURN CODE OF 4 19894002 FMTLNRT1 LA R0,GETMLEN SET UP LENGTH FOR FREEMAIN 19896002 ICM R0,B'1000',ADPLSBPL SET UP SUBPOOL FOR FREEMAIN 19898002 LR R1,R13 SET UP ADDRESS OF AREA TO BE FREED 19898402 L R13,4(R13) RESTORE SAVE AREA LINKAGE BEFORE 19898802 * FREEING OUR SAVE/WORK AREA 19899202 FREEMAIN R,LV=(0),A=(1) FREE FMT SAVE/WORKAREA 19899602 LR R15,R9 SET RET CODE IN R15 19899702 B FMTLNRT3 BRANCH AROUND NON-PRDMP LOAD CODE 19899802 FMTLNRT2 SR R15,R15 RETURN CODE IS ALWAYS ZERO WHEN 19899902 * LOADED BY ABDUMP- READ ERROR CANNOT 19900002 * OCCUR 19916602 FMTLNRT3 L R14,12(R13) RESTORE R14 19926602 LM R0,R12,20(R13) RESTORE R0 - R12 19928602 BR R14 RETURN TO CALLER 19930602 SPACE 3 19933302 *********************************************************************** 19943302 * * 19945302 * * 19950002 * CONSTANTS FOR FORMAT LINE ROUTINE * 20000002 * * 20050002 * * 20060002 *********************************************************************** 20070002 SPACE 20100002 LN1MSK DC F'240' LENGTH MASK FOR LABEL LENGTH 20250002 LN2MSK DC F'15' LENGTH MASK FOR DATA LENGTH 20300002 LN3MSK DC F'3' ROUNDING VALUE FOR 4 BYTE BOUND 20350002 LN4MSK DC X'F0F0' ZONE MASK FOR UNPACKS 20360002 FMTLN4A DC C'0123456789ABCDEF' TRANSLATE TABLE 20400002 FMTPATCH DC 13F'0' AMDPRFMT PATCH AREA 20650002 EJECT 20700002 IHAABDPL DSECT=YES 20710002 SPACE 3 20720002 FMTPTRN DSECT DSECT FOR LINE FORMAT ROUTINE 20750002 PTRNCD DS BL1 20800002 DTAE EQU X'20' DATA EBCDIC BIT 20810002 DTAC EQU X'10' DATA IN CORE BIT 20820002 DTAP EQU X'08' DATA POINTER PRESENT BIT 20830002 DTA EQU X'04' DATA TO BE INCLUDED BIT 20840002 LBLP EQU X'02' LABEL PTR PRESENT BIT 20842002 LBL EQU X'01' LABEL TO BE INCLUDED BIT 20844002 PTRNLN DS XL1 LABEL/DATA LENGTH (-1) 20850002 PTRNOFF1 DS XL1 LABEL OFFSET 20900002 PTRNOFF2 DS XL1 DATA OFFSET 20950002 PTRNPTR DS F POINTER TO LABEL/DATA 21000002 SPACE 3 21050002 FMTSWMAP DSECT AMDPRFMT SAVE/WORK AREA MAP 21060002 FMTSAVE DS 18F AMDPRFMT SAVE AREA 21070002 FMTREAD DS CL16 AMDPRFMT READ AREA 21080002 FMTWORK DS 0XL16 AMDPRFMT WORK AREA 21090002 FMTRDSV DS 2F REGISTER SAVEAREA ACROSS READS 21092002 FMTSWS DS BL1 AMDPRFMT SWITCHES 21094002 MEMAERR EQU X'80' MEMORY ACCESS RTN READ ERROR 21096002 FMTRSVD DS XL7 UNUSED 21098002 FMTSWEND EQU * 21148002 GETMLEN EQU FMTSWEND-FMTSWMAP LENGTH OF FMTSWMAP DSECT 21198002 SPACE 3 21248002 OUTBUF DSECT DSECT FOR OUTPUT BUFFER 21298002 ADDR DS CL120 21348002 OVRFLOW DS CL1 21398002 END AMDPRFMT 21448002