; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; Copyright (C) Acorn Computers Ltd., 1988

        GBLS    VBar
        GBLS    XXModuleName

; :OR: this with the library segment tag to bind with ROM applications only

library_segment_is_ROM_only * &80000000 ; To make ROM version
; library_segment_is_ROM_only * 0       ; To make RAM version

VBar    SETS    "|"

        MACRO
        Module  $name
XXModuleName SETS "_":CC:"$name":CC:"_"
        MEND

        MACRO
        LoadStaticAddress $Addr, $Reg, $Reg2
        LCLS    reg2
 [ "$Reg2"=""
reg2    SETS    "ip"
 |
reg2    SETS    "$Reg2"
 ]
        LDR     $Reg, =$Addr
        LDR     $reg2, [sl, #SL_Lib_Offset]
        ADD     $Reg, $Reg, $reg2
        MEND

        MACRO
        LoadStaticBase $Reg, $Reg2
        LoadStaticAddress StaticData, $Reg, $Reg2
        MEND

        MACRO
$Label  Variable $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps  %       &$Tempa*4
        MEND

        MACRO
$Label  ExportedVariable $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:"$Label":CC:VBar
        EXPORT  $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps  %       &$Tempa*4
        MEND

        MACRO
$Label  ExportedWord $Value
        LCLS    Temps
Temps   SETS    VBar:CC:"$Label":CC:VBar
        EXPORT  $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps   &      $Value
        MEND

        MACRO
$Label  VariableByte $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
O_$Label *      .-StaticData
$Temps  %       &$Tempa
        MEND

        MACRO
$Label  InitByte $Value
$Label  =        $Value
        MEND

        MACRO
$Label  InitWord $Value
$Label  &        $Value
        MEND

        MACRO
$Label  Keep    $Arg
        LCLS    Temps
$Label  $Arg
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
$Temps
        MEND

 [ :LNOT::DEF:NoStubEntries

        ; Macro for generating the library end of entrypoint tables
        ; import  non-null if the entry isn't defined in the assembler part
        ;         of the library (conventionally has the value 'import')
        ; sym2    non-null if the stub is to be patched to branch to a symbol
        ;         other than the entry name
        ; direct  null       APCS_A compatibility veneer to be used
        ;         'direct'   APCS_A compatibility entry may branch directly to
        ;                    the entry (which does not use sp, fp, ip)
        ;         other      APCS_A compatibility entry branches directly to
        ;                    this symbol.
        ;         'unveneered' no compatibility veneer entry (subsequent
        ;                    addition).
        ; args    argument count or 'varargs'.  Selects which compatability
        ;         veneer should be used (if direct is null).
        ; directlocal  if direct is <other>, and this is null, then <other>
        ;              is a local symbol, otherwise the value should be either
        ;              "EXPORT" or "IMPORT"

        MACRO
        Entry   $sym, $import, $sym2, $direct, $args, $directlocal
        LCLS    Temps
   [ "$sym2" <> ""
Temps   SETS    "$sym2"
     |
Temps   SETS    "$sym"
   ]
Temps   SETS    "$VBar":CC:Temps:CC:"$VBar"
   [ "$import"<>""
        IMPORT  $Temps
   ]
        B       $Temps
        MEND



        MACRO
        Entry2   $sym, $import, $sym2, $direct, $args, $directlocal, $ignore
        LCLS    Temps
   [ "$sym2" <> ""
Temps   SETS    "$sym2"
     |
Temps   SETS    "$sym"
   ]
Temps   SETS    "$VBar":CC:Temps:CC:"$VBar"
   [ "$import"<>""
        IMPORT  $Temps
   ]
        B       $Temps
        MEND



 ] ; :LNOT::DEF:NoStubEntries

        END