Open the file, read the object file header and test
the appropriate fields.
The header layout is in $system.zguard.dobjfmt
The easiest way I can see to do it is a TACL routine that captures the output of FUP INFO $vol.*.* WHERE FILECODE=100 into a TACL variable, then gets the file names out of that variable one by one, captures the output of BIND SHOW INFO FROM <file> into another TACL variable, looks through that second TACL variable to see whether it has accelerator information, and if so, displays the filename as one that is accelerated.
Instead of using FUP INFO, it could find the filenames using the #FILEINFO built-in in a loop. It would be easier to code using #FILEINFO, but I have a feeling it would run a bit slower. Maybe not enough slower to matter much, but I don't know for sure.
If you want some help writing such a TACL routine, ask and I would be happy to write some code for you, but I cannot test it, so you might have to do a little debugging of the TACL. I'm pretty sure it would not require much debugging.
Instead of BIND you can use VPROC to get that information.
VPROC might be better. I really don't know. I'm not aware of any documentation that says how VPROC is supposed to behave and what it is supposed to display in all situations. BIND has the advantage that it is described better.
Vproc would work example listings of combinations below acelerated,
native and not
$SYSTEM.SYSTEM.FUP
Binder timestamp: 23JUL1999 05:14:48
Version procedure: S7053D45^31MAR99^LOAD^AAS^28MAY
Version procedure: T6553D45^23JUL99^FUP^23JUL99
Target CPU: TNS, TNS/R
AXCEL timestamp: 23JUL1999 05:15:30
$SYSTEM.SYSTEM.AR
GMT Binder timestamp: 20FEB1997 18:40:50
Version procedure: T8432D40_01NOV95_CRTLMAIN
Version procedure: T8629D43_17Mar97_20Feb97
Native Mode: runnable file
$SYSTEM.SYSTEM.ARMTRACE
GMT Binder timestamp: 22APR1992 15:31:40
Version procedure: T9051C31^16APR92^AAN01A
Target CPU: TNS/R
Thanks for posting those examples.
I do not mean to be difficult on this point, but a few examples might not show some case in which VPROC would give a misleading result.
For example, all of the files in this demonstration contain proper version procedures. It certainly would be important to check what output VPROC gives for a few accelerated and unaccelerated code 100 files that contain no procs whose names match the version procedure pattern. But even if a few examples without version procedures seem to work, that isn't proof that VPROC will work for all cases. It would be a highly suggestive demonstration, and probably proof enough for the purpose we are discussing right now, but I still would be a little wary of using VPROC for a purpose for which I'm not sure it was intended and thoroughly tested. I'm much more willing to trust that BIND would handle every case correctly.
This is probably one of the easiest and most reliable ways to
accomplish this. There is a simple flag in the header for Axcel and
OCA along with associated bit DEFINEs.
You should just be able to open the object, read the header, check the
target CPU and test the appropriate flag.
Just 2 samples with an Integrity:
$DSMSCM.CHECKOBJ.CHECKER
Binder timestamp: 21JUN2010 13:46:27
Version procedure: T0000H06^21JUN10^R01^V01^M000
TNS/E Native Mode: runnable file
$DSMSCM.CHECKOBJ.CHECKPWX
Binder timestamp: 18NOV2010 14:11:09
Version procedure: >> NO T9xxx PROC <<
Target CPU: UNSPECIFIED
OCA timestamp: 18NOV2010 14:11:29
Would be similar on an S-series with AXCEL instead of OCA.
It appears the OP already has a solution he likes, but here's a
TACL-only variation, based of something similar I wrote to display a
bunch of information on ZZSA files.
You give it a subvolume, and it will list the AXCEL and OCA status of
every TNS object in the subvolume. I just tossed in the compile
timestamp, so the formatting is off, but it's an fyi start, easily
modified/enhanced...
?TACL Routine
#FRAME
#PUSH file2test subv subv^test cnt e r p oct ipf
#PUSH ts
[#DEF file^hdr Struct
Begin
filler 180;
uint cts(0:2);
filler 302;
int2 ipf_addr;
int2 ipf_len;
uint ipf_flags;
int2 oct_addr;
uint oct_flags;
filler 8;
End;
]
[#CASE [#ARGUMENT /Value subv/Subvol Otherwise]
|1| #SET file2test [subv]
|2| #SET file2test [#DEFAULTS /Current/]
]
#SET subv^test [file2test]
#SET file2test [#NEXTFILENAME [file2test].A]
[#LOOP |While| [#MATCH [subv^test]* [file2test]] |Do|
[#IF [#FILEINFO /Code/[file2test]] = 100 |Then|
#SET e [#REQUESTER /Wait 512/Read [file2test] e r p]
[#CASE [e]
|0| #APPEND p >
Sink [#REQUESTER /Wait/Close e]
#EXTRACTV r file^hdr
#SET ipf [#COMPUTE file^hdr:ipf_flags / 16384]
#SET oct [#COMPUTE file^hdr:oct_flags / 16384]
#SET ts [#COMPUTE [file^hdr:cts(0)] * 4294967296
+ [file^hdr:cts(1)] * 65536
+ [file^hdr:cts(2)]
]
#output Compiled - [_contime_to_text [#CONTIME [ts]]]
#OUTPUT /Hold/[file2test]
#OUTPUT /Column 30,Hold/ [#CASE [oct]
| 0 1 | Not Axcel'd
| 2 | Axcel'd but disabled
| 3 | Axcel'd
]
#OUTPUT /column 60/ [#CASE [ipf]
| 0 1 | Not OCA'd
| 2 | OCA'd
| 3 | OCA'd but disabled
]
|Otherwise| #OUTPUT [file2test] - open error [e]
] == End Case
] == End if
#SET file2test [#NEXTFILENAME [file2test]]
] == End Loop
#UNFRAME