; > Sources.ModHead      

        GET Sources.NameNum


        LEADR   Module_LoadAddr

        ASSERT  (.=Module_BaseAddr)

        DCD     0 
        DCD     Init           - Module_BaseAddr
        DCD     Die            - Module_BaseAddr
        DCD     Service        - Module_BaseAddr
        DCD     Title          - Module_BaseAddr
        DCD     Helpstr        - Module_BaseAddr
        DCD     0

; --------------------------------------------------------------------------

Title   DCB     TERRITORY_NAME,0
Helpstr DCB     TERRITORY_NAME," Territory",9,"$VString ($Date)",0
        ALIGN
; --------------------------------------------------------------------------

;       Module initialisation point
Init
        Push    "r0-r4,LR"

        ADR     r0, Path
        MOV     r2, #-1
        MOV     r3, #0
        MOV     r4, #VarType_Expanded
        SWI     XOS_ReadVarVal
        CMP     r2, #0

        ADREQL  r0, Path
        ADREQL  r1, PathDefault
        MOVEQ   r2, #?PathDefault
        MOVEQ   r3, #0
        MOVEQ   r4, #VarType_String
        SWIEQ   XOS_SetVarVal

        LDR     r0, [r12]
        CMP     r0, #0                  ; clears V
      [ Version >= 7
        MOVNE   r12,r0
        BNE     %FT01
      |
        Pull    "r0-r4,PC",NE
      ]

        MOV     r0, #6
        LDR     r3, =max_running_work
        SWI     XOS_Module
        ADDVS   sp,sp,#4
        Pull    "r1-r4,PC",VS
        STR     r2, [r12]
        MOV     r12, r2
        MOV     r0, #0
        STR     r0, message_file_block
            
01
; Build entry table.

Register

        ADR     r14,scratch_buffer
        ADRL    r0,ReadTimeZones
        STR     r0,[r14],#4
        ADRL    r0,ConvertDateAndTime
        STR     r0,[r14],#4
        ADRL    r0,ConvertStandardDateAndTime
        STR     r0,[r14],#4
        ADRL    r0,ConvertStandardDate
        STR     r0,[r14],#4
        ADRL    r0,ConvertStandardTime
        STR     r0,[r14],#4
        ADRL    r0,ConvertTimeToOrdinals
        STR     r0,[r14],#4
        ADRL    r0,ConvertTimeStringToOrdinals
        STR     r0,[r14],#4
        ADRL    r0,ConvertOrdinalsToTime
        STR     r0,[r14],#4
        ADRL    r0,Alphabet
        STR     r0,[r14],#4
        ADR     r0,AlphabetIdent
        STR     r0,[r14],#4
        ADR     r0,SelectKeyboardHandler
        STR     r0,[r14],#4
        ADR     r0,WriteDirection
        STR     r0,[r14],#4
        ADR     r0,CharacterPropertyTable
        STR     r0,[r14],#4
        ADR     r0,GetLowerCaseTable
        STR     r0,[r14],#4
        ADR     r0,GetUpperCaseTable
        STR     r0,[r14],#4
        ADR     r0,GetControlTable
        STR     r0,[r14],#4
        ADR     r0,GetPlainTable
        STR     r0,[r14],#4
        ADR     r0,GetValueTable
        STR     r0,[r14],#4
        ADRL    r0,GetRepresentationTable
        STR     r0,[r14],#4
        ADRL    r0,Collate
        STR     r0,[r14],#4
        ADRL    r0,ReadSymbols
        STR     r0,[r14],#4
        ADRL    r0,GetCalendarInformation
        STR     r0,[r14],#4
        ADRL    r0,NameToNumber
        STR     r0,[r14],#4
        ADRL    r0,TransformString
        STR     r0,[r14],#4

        MOV     r0,#TERRITORY_NUMBER    ; Territory number
        ADR     r1,scratch_buffer
        MOV     r2,r12
        SWI     XTerritory_Register     ; Ignore errors.


        Pull    "r0-r4,PC",,^

Path             DCB     TERRITORY_NAME,"$Path"
                 DCB     0
PathDefault      DCB     "Resources:$.Resources.",TERRITORY_NAME,"."
                 DCB     0
message_filename DCB     TERRITORY_NAME,"Messages"
                 DCB     0
        ALIGN


; --------------------------------------------------------------
;       Module service entry point
Service
        LDR     R12, [R12]
        CMP     R12, #0
        MOVEQ   PC, LR

        TEQ     R1,#Service_TerritoryManagerLoaded
        Push    "r0-r4,LR",EQ
        BEQ     Register

        MOV     PC,LR

; --------------------------------------------------------------
;       RMKill'ing the module
Die
        Push    "R0-R11,LR"
;
        LDR     r12, [r12]
        CMP     r12, #0
        Pull    "R0-R11,PC",EQ,^

        LDR     r0, message_file_block  ; Close the message file if open
        CMP     r0, #0
        ADRNE   r0, message_file_block+4
        SWINE   XMessageTrans_CloseFile
        MOVVC   r0, #0
        STRVC   r0, message_file_block
        STRVS   r0,[SP]
        Pull    "r0-r11,PC",VS

; Deregister

        MOV     r0,#TERRITORY_NUMBER            ; e.g. UK = 1.
        SWI     XTerritory_Deregister

; Release all workspace

      [ Version < 7            ; Now freed by kernel

        MOV     r2, r12
        MOV     r0, #ModHandReason_Free
        SWI     XOS_Module
      ]

        Pull    "R0-R11,PC",,^          ; don't refuse to die

open_messages_file
        ENTRY   r0-r2
        LDR     r0, message_file_block
        CMP     r0, #0
        EXIT    NE
        ADR     r0, message_file_block+4
        ADRL    r1, message_filename
        MOV     r2, #0
        SWI     XMessageTrans_OpenFile
        STRVS   r0, [sp]
        MOVVC   r2, #-1
        STRVC   r2, message_file_block
        EXIT

message_errorlookup ENTRY r1-r7
        BL      open_messages_file
        EXIT    VS
        MOV     r4, r1
        ADR     r1, message_file_block + 4
        MOV     r2, #0
        SWI     XMessageTrans_ErrorLookup
        EXIT

        LNK     Sources.Entries
