|
|
|
SPC object omt-entry-t which is defined in mip-h.emi describes the structure of an OMT entry.
/* OMT entry */ dcl spc omt-entry-t bas(*) ; /* base addressability type hex 00 = based on an static storage area hex 01 = based on an automatic storage area hex 02 = based on a space pointer hex 03 = based on a parameter hex 04 = based on the PCO object hex FF = base addressability not provided */ dcl dd omt?addr-type char(1) dir ; /* For types hex 00, hex 01, hex 02, hex 03, and hex 04, this is a 3-byte logical binary value representing the offset to the object from the base addressability. For type hex FF, the value is binary 0. */ dcl dd omt?offset char(3) dir ; /* For types hex 02 and hex 03, this is a 2-byte binary field containing the number of the OMT entry for the space pointer or a parameter that provides base addressability for this object. */ dcl dd omt?num-basee bin(2) dir ;
/* @file tmip04.emi Parses the OMT component in an OPM MI program template. */ dcl spcptr .pgm-name parm ; dcl spcptr .pgm-type parm ; dcl ol pl-main( .pgm-name, .pgm-type ) parm ext ; entry *(pl-main) ext ; dcl dd pgm-name char(10) bas(.pgm-name) ; dcl dd pgm-type char(2) bas(.pgm-type) ; dcl dd rt char(34) auto ; dcl sysptr pgm auto ; cpybrep rt, x'00' ; cpybla rt(1:2), pgm-type ; cpyblap rt(3:30), pgm-name, ' ' ; rslvsp pgm, rt, *, * ; brk '1' ; dcl spcptr p auto ; dcl dd len bin(4) auto ; modasa p, 8 ; cpynv p->matpg?bytes-in, 8 ; matpg p, pgm ; cpynv len, p->matpg?bytes-out ; modasa p, -8 ; modasa p, len ; cpynv p->matpg?bytes-in, len ; matpg p, pgm ; brk '2' ; /* is the OMT materializable? */ tstbts(b) p->matpg?obsv-attr, 5 / zer(see-you) ; dcl spcptr pos auto ; dcl dd inx bin(4) auto ; dcl dd odv-num bin(4) auto ; dcl dd b4 bin(4) auto ; cpynv(b) odv-num, p->matpg?num-odv1 / nzer(=+2) ; cpynv odv-num, p->matpg?num-odv2 ; : addspp pos, p, p->matpg?omt-off ; cpynv inx, 1 ; cpybrep msg, " " ; cpybla msg, "ODV Num Based on Offset" ; %sendmsg(msg, 64) ; omt-loop: cmpnv(b) inx, odv-num / hi(end-omt-loop) ; cpybrep msg, " " ; cpynv rec?odv-num, inx ; cmpbla(b) pos->omt?addr-type, x'00' / neq(=+3) ; cpybla rec?addr-type, "Static storage" ; b select-type ; : cmpbla(b) pos->omt?addr-type, x'01' / neq(=+3) ; cpybla rec?addr-type, "Automatic storage" ; b select-type ; : cmpbla(b) pos->omt?addr-type, x'02' / neq(=+3) ; cpybla rec?addr-type, "Space pointer" ; b select-type ; : cmpbla(b) pos->omt?addr-type, x'03' / neq(=+3) ; cpybla rec?addr-type, "Parameter" ; b select-type ; : cmpbla(b) pos->omt?addr-type, x'04' / neq(=+3) ; cpybla rec?addr-type, "PCO object" ; b select-type ; : cmpbla(b) pos->omt?addr-type, x'FF' / neq(=+2) ; cpybla rec?addr-type, "Not specified" ; select-type: cpybra b4, pos->omt?offset ; cpynv rec?offset, b4 ; %sendmsg(msg, 64) ; addn(s) inx, 1 ; addspp pos, pos, omt-entry-len ; b omt-loop ; end-omt-loop: see-you: neg(s) len ; modasa p, len ; rtx * ; /* globals */ dcl dd msg char(64) auto ; dcl dd rec?odv-num znd(6,0) def(msg) pos(1) ; dcl dd rec?addr-type char(20) def(msg) pos(9) ; dcl dd rec?offset znd(6,0) def(msg) pos(29) ; /include mip-h.emi ; pend ;
For example, when calling tmip04.emi to parse the OMT of tmip01.emi, the output might like the following:
4 > call tmip04 (tmip01 x'0201')
ODV Num Based on Offset
000001 Automatic storage 000000
000002 Automatic storage 000016
000003 Automatic storage 000272
000004 Space pointer 000000
000005 Space pointer 000000
000006 Space pointer 000004
000007 Space pointer 000008
000008 Space pointer 000008
000009 Space pointer 000010
000010 Space pointer 000040
000011 Space pointer 000044
000012 Space pointer 000048
000013 Space pointer 000052
000014 Space pointer 000053
000015 Space pointer 000057
000016 Space pointer 000064
000017 Space pointer 000080
000018 Space pointer 000096
000019 Space pointer 000098
000020 Space pointer 000099
000021 Space pointer 000100
000022 Space pointer 000104
000023 Space pointer 000108
000024 Space pointer 000110
000025 Space pointer 000112
000026 Space pointer 000116
000027 Space pointer 000120
000028 Space pointer 000124
000029 Space pointer 000128
000030 Space pointer 000132
000031 Space pointer 000136
000032 Space pointer 000140
000033 Space pointer 000144
000034 Space pointer 000148
000035 Space pointer 000152
000036 Space pointer 000156
000037 Space pointer 000160
000038 Space pointer 000164
000039 Space pointer 000166
000040 Space pointer 000167
000041 Space pointer 000174
000042 Space pointer 000176
000043 Space pointer 000177
000044 Space pointer 000000
000045 Space pointer 000000
000046 Space pointer 000004
000047 Space pointer 000000
000048 Space pointer 000000
000049 Space pointer 000004
000050 Space pointer 000006
000051 Space pointer 000007
000052 Space pointer 000008
000053 Space pointer 000000
000054 Space pointer 000000
000055 Space pointer 000002
000056 Space pointer 000002
000057 Space pointer 000000
000058 Space pointer 000000
000059 Space pointer 000002
000060 Space pointer 000003
000061 Space pointer 000003
000062 Automatic storage 000288
000063 Automatic storage 000304
000064 Static storage 000000
000065 Not specified 000000
000066 Automatic storage 000308
000067 Automatic storage 000576
000068 Space pointer 000000
000069 Space pointer 000000
000070 Space pointer 000004
000071 Space pointer 000008
000072 Space pointer 000015
000073 Space pointer 000016
000074 Automatic storage 000592
000075 Automatic storage 000608
000076 Automatic storage 000624
000077 Automatic storage 000656
000078 Automatic storage 000672
000079 Automatic storage 000688
000080 Automatic storage 000704
000081 Automatic storage 000720
000082 Automatic storage 000736
000083 Automatic storage 000752
000084 Automatic storage 000768
000085 Automatic storage 000784
000086 Automatic storage 000800
000087 Automatic storage 000816
000088 Automatic storage 000832
000089 Not specified 000000
000090 Automatic storage 000848
1.5.9