; >MyMacros

        MACRO                           ;set some PSR bits
$lab    setpsr     $bits,$tempreg,$cond
$lab    MOV$cond   $tempreg,#$bits
        ORR$cond   $tempreg,$tempreg,PC
        TEQ$cond.P PC,$tempreg
        MEND


        MACRO                           ;clear some PSR bits
$lab    clrpsr     $bits,$tempreg,$cond
$lab    MVN$cond   $tempreg,#$bits
        TST$cond.P $tempreg,PC
        MEND


        MACRO                           ;toggle some PSR bits
$lab    togpsr     $bits,$tempreg,$cond
$lab    MOV$cond   $tempreg,#$bits
        TEQ$cond.P $tempreg,PC
        MEND


        MACRO
$lab    retfiq   $cc
$lab    SUB$cc.S PC, LR, #4
        MEND


        MACRO
        nop
        MOVNV   R0,R0
        MEND


        MACRO
$lab    Entry   $action,$pre
$lab
        Push    "R0,R1,SB,LR"
        BL      $pre.Entry$action.Err
        MEND


        MACRO
$lab    MinOps  $firstop, $repeatop, $destreg, $srcreg, $const, $cond
        LCLA    Const
Const   SETA    $const
        LCLA    Rotate
Rotate  SETA    0
        LCLL    First
        LCLA    Bits8
        LCLA    Bit
Bit     SETA    2

        WHILE   Bit<32
         [ ($const :ROR: Bit) < Const
Const    SETA    $const :ROR: Bit
Rotate   SETA    Bit
         ]
Bit     SETA    Bit+2
        WEND

Bit     SETA    0
Bits8   SETA    0
First   SETL    T

        WHILE   (Const <> Bits8) :LOR: First
Const   SETA    Const - Bits8

         WHILE   (Const :AND: (2_11 :SHL: Bit) = 0 ) :LAND: Bit<24
Bit      SETA    Bit+2
         WEND

Bits8   SETA    Const :AND: ( &FF :SHL: Bit )

         [ First

          [ "$srcreg"=""
$lab      $firstop.$cond $destreg, #Bits8 :ROL: Rotate
          |
$lab      $firstop.$cond $destreg, $srcreg, #Bits8 :ROL: Rotate
          ]

         |

$lab     $repeatop.$cond $destreg, $destreg, #Bits8 :ROL: Rotate
         ]

First   SETL    F
        WEND
        MEND

;put address of $dest in $reg
        MACRO
$lab    myaddr  $reg,$dest,$cond
        ASSERT  $reg<>PC
        ASSERT  ($dest-{PC}-8)<&10000
$lab    ADD$cond $reg,PC,#($dest-{PC}-8) :AND: &FF
        ADD$cond $reg,$reg,#($dest-{PC}-4) :AND: &FF00
        MEND


        GBLA    boff
        MACRO
$lab    baddr   $reg,$dest,$cond
        ASSERT  $reg<>PC
boff    SETA    {PC}+8-($dest)
$lab    MinOps  SUB, SUB, $reg, PC, boff, $cond
        MEND


;put absolute address of $sboff in $reg
        MACRO
$lab    sbaddr  $reg,$sboff,$cond
$lab    MinOps  ADD, ADD, $reg, SB, :INDEX: ($sboff), $cond
        MEND
       

        MACRO
$l      Text    $str
$l      =       "$str",0
        ALIGN
        MEND


        MACRO
$lab    aw      $size           ;allocate word aligned
        ASSERT  {VAR} :MOD: 4=0
$lab    #       $size
        MEND


        MACRO
$lab    a4      $size           ;allocate word aligned
        ASSERT  (:INDEX: {VAR}) :MOD: 4=0
$lab    #       $size
        MEND


        MACRO
$lab    bit     $bitnum
$lab    *       1 :SHL: ($bitnum)
        MEND


        MACRO
        getSB
        LDR     SB,[SB]
        MEND


        MACRO
        Align16 $base
        ASSERT  (.-$base) :MOD: 4 = 0
        WHILE   (.-$base) :MOD: 16 <> 0
        MOVNV   R0,R0
        WEND
        MEND


;FOLLOWING MACROS ONLY FOR DEBUG

        MACRO
        mess    $cond,$s1,$s2,$s3,$s4,$s5
 [ {TRUE}
        B$cond  %F11
        BAL     %F21
11
        Push    "R0,R1,LR"
        BL      Mess1
        [ (:LNOT: IrqDebug) :LOR: DebugSwitch
        BNE     %FT15           ;skip if IRQ thread or debugging switched off
        ]
        SWI     OS_WriteS
 [ "$s1"="NL"
 = CR,LF
 |
 = "$s1"
 ]
 [ "$s2"=""
 |
  [ "$s2"="NL"
  = CR,LF
  |
  = "$s2"
  ]
  [ "$s3"=""
  |
   [ "$s3"="NL"
   = CR,LF
   |
   = "$s3"
   ]
   [ "$s4"=""
   |
    [ "$s4"="NL"
    = CR,LF
    |
    = "$s4"
    ]
    [ "$s5"=""
    |
     [ "$s5"="NL"
     = CR,LF
     |
     = "$s5"
     ]
    ] 
   ]
  ]
 ]
        =       0
        ALIGN
        [ SpoolOff
        BL      SpoolOn
        ]
        Pull    "LR"
15
        TEQP    PC, R0          ;restore PSR
        nop                     ;delay in case mode change
        Pull    "R0,R1,LR"
21
 ]
        MEND

        MACRO
        wrhex   $reg,$cond
        Push    "R0-R3,LR",$cond
        MOV$cond R2,$reg
        BL$cond PHEX
        Pull    "R0-R3,LR",$cond
        MEND


        MACRO
        Tword   $reg,$cond
        Push    "R0-R3,LR",$cond
        MOV$cond R2,$reg
        BL$cond TubeWrHexWord
        Pull    "R0-R3,LR",$cond
        MEND


        MACRO
$l      SetBorder  $red,$green,$blue,$cond
$l      Push       "R0,R1",$cond
        LDR$cond   R0,=VIDC
        LDR$cond   R1,=&40000000+ $red + $green *16 + $blue *256
        STR$cond   R1,[R0]
        Pull       "R0,R1",$cond
        MEND


        MACRO
$l      Border  $red,$green,$blue,$cond
$l      LDR$cond   R0,=VIDC
        LDR$cond   R1,=&40000000+ $red + $green *16 + $blue *256
        STR$cond   R1,[R0]
        MEND


        MACRO
        regdump $cond
 [ "$cond" <> ""
        B$cond  %FT01
        B       %FT02
 ]
01
        DLINE   " R0       R1       R2       R3       R4       R5       R6       R7"
        DREG    r0, " ",cc
        DREG    r1, " ",cc
        DREG    r2, " ",cc
        DREG    r3, " ",cc
        DREG    r4, " ",cc
        DREG    r5, " ",cc
        DREG    r6, " ",cc
        DREG    r7, " "
        DLINE   " R8       R9       R10      R11      R12      R13"
        DREG    r8, " ",cc
        DREG    r9, " ",cc
        DREG    r11, " ",cc
        DREG    r12, " ",cc
        DREG    r13, " "
02
        MEND

        MACRO
        FileBufs
        Push    "R0-R8"
        mess    ,"Buffer   Flags    Next     Prev     Pri Off  Fcb      Older    Younger",NL
        MOV     R0, R9
00
        LDMIA   R0, {R1-R8}
        EOR     R4, R4, R8, LSL #24
        wrhex   R0
        wrhex   R1
        wrhex   R2
        wrhex   R3
        wrhex   R4
        wrhex   R5
        wrhex   R6
        wrhex   R7
        mess    ,NL
        MOV     R0, R3
        TSTS    R0, #ARM_CC_Mask
        BNE     %FT01
        TEQS    R0, R9
        BNE     %BT00
01
        Pull    "R0-R8"
        MEND

 [ Dev
        MACRO
        DebugError $PrefixStr
        BVC     %FT01
        Push    "R0"
        BIC     R0, R0, #ARM_CC_Mask
        LDR     R0, [R0]
        DREG    R0, "$PrefixStr",cc
        LDR     R0, [SP]
        BIC     R0, R0, #ARM_CC_Mask
        ADD     R0, R0, #4
        DSTRING R0, " = "
        Pull    "R0"
01
        MEND
 ]

Nowt    *       &40000000

        GBLS    CaseConvertReg
        GBLS    CaseConvertType
        MACRO
        Internat_CaseConvertLoad  $UR,$Type
CaseConvertReg SETS    "$UR"
CaseConvertType SETS   "$Type"
        LDR     $UR, $Type.CaseTable
        MEND

        MACRO
        Internat_UpperCase      $Reg, $UR
        ASSERT  $UR = $CaseConvertReg
        ASSERT  CaseConvertType = "Upper"
        TEQ     $UR, #Nowt
        LDRNEB  $Reg, [$UR, $Reg]
        MEND

        END
