PROC dum$ASID asid (
  xasti : integer -281474976710655..281474976710655 = $required
  ptl   : integer -281474976710655..281474976710655 = 0
  xasid : VAR of integer
  )

  crev a_mult k=integer
  crev a_divisor k=integer
  crev bits k=integer d=0..15
  bits(0) = 0
  bits(1) = 8
  bits(2) = 4
  bits(3) = 12
  bits(4) = 2
  bits(5) = 10
  bits(6) = 6
  bits(7) = 14
  bits(8) = 1
  bits(9) = 9
  bits(10) = 5
  bits(11) = 13
  bits(12) = 3
  bits(13) = 11
  bits(14) = 7
  bits(15) = 15
  if ptl > 0 then
    crev (ptl2 asti) k=integer
    ptl2 = $value(ptl) + 1
    a_divisor = 256 / ptl2
    a_mult = 10000(16) / mmv$a_divisor
  else
    a_divisor = $mem($sa(mmv$a_divisor) 3)
    a_mult = $mem($sa(mmv$a_mult) 3)
  ifend
  asti = $value(xasti)
  asid = bits($mod(asti, 16))*4096
  asid = bits($mod((asti/16), 16))*256+asid
  asid = bits($mod((asti/256), 16))*16+asid
  asid = bits($mod((asti/4096), 16))+asid
  asid = asid / a_divisor + $mod(asid, a_divisor) * a_mult
  if not $specified(xasid) then
    putl ' ASID = '//$strrep(asid, 16)
  else
    xasid = asid
  ifend
PROCEND dum$asid
