dnl m4test.in
dnl Copyright 1984-2017 Cisco Systems, Inc.
dnl 
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl 
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl 
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl a small excerpt from the delta 68k .m4 file that nonetheless strains
dnl m4 pretty well.  use "make bullym4test.in" to test more fully, if you
dnl have the time.

changequote({,})

dnl delta assembler does not support register masks; must convert to constant
define(PUSHREGS,{moveml REGMASK({$1},{A7FIRST}),DEC(SP)})
define(POPREGS,{moveml INC(SP),REGMASK({$1},{D0FIRST})})
define(STOREREGS,{moveml REGMASK({$1},{D0FIRST}),{$2}})
define(LOADREGS,{moveml {$2},REGMASK({$1},{D0FIRST})})
define(REGMASK,{{&0x}HEXWORD(eval(REGMASK1({$1}/,0,{$2})))})
define(REGMASK1,{
  ifelse(
    $2,len({$1}),
      {0},
    substr({$1},eval($2+2),1),-,
      {REGRANGE(substr({$1},$2,1),
                substr({$1},eval($2+1),1),
                substr({$1},eval($2+4),1),
                {$3}) +
       REGMASK1({$1},eval($2+6),{$3})},
      {$3(substr({$1},$2,1),substr({$1},eval($2+1),1)) +
       REGMASK1({$1},eval($2+3),{$3})})})
define(REGRANGE,{$4($1,$2)+ifelse($2,$3,{0},{REGRANGE($1,incr($2),$3,{$4})})})
define(A7FIRST,{(2**(ifelse($1,D,15,7)-$2))})
define(D0FIRST,{(2**(ifelse($1,A,8,0)+$2))})

dnl used to pretty up register mask
define(HEXLONG,{HEXIFY($1,0)})
define(HEXWORD,{HEXIFY($1,4)})
define(HEXBYTE,{HEXIFY($1,6)})
define(HEXIFY,{ifelse($1,0,{substr(00000000,$2)},{HEXIFY(eval($1/16),incr($2)){}HEXDIGIT(eval($1%16))})})
define(HEXDIGIT,{substr({0123456789abcdef},$1,1)})

    PUSHREGS({D2-D7/A2-A6})

    POPREGS({D2-D7/A2-A6})
