Message 7.3 KB
; 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.
;
; > Sources.Message

;---------------------------------------------------------------------------
; Message_Received
; Message_Recorded
;
;       In:     r1 -> message block
;       Out:    r0 corrupted
;
;       Deal with messages which require no ack.
;
Message_Received
Message_Recorded
        ENTRY   "r1-r6"

        LDR     r0, [r1, #ms_action]

        Debug   msg,"Message",r0

        LDR     lr, =Message_MenuWarning
        TEQ     r0, lr
        BEQ     msg_menuwarning

        LDR     lr, =Message_MenusDeleted
        TEQ     r0, lr
        BEQ     msg_menusdeleted

        LDR     lr, =Message_HelpRequest
        TEQ     r0, lr
        BEQ     msg_helprequest

 [ LoadModeFiles
        TEQ     r0, #Message_DataLoad
        BEQ     msg_dataload

        TEQ     r0, #Message_DataSave
        BEQ     msg_datasave
 ]

        TEQ     r0, #Message_Quit
        EXIT    NE

msg_quit
        Debug   msg,"msg_quit"
        BL      Mod_ShutDown
        SWI     OS_Exit


msg_menuwarning
        Debug   msg,"msg_menuwarning"
        ADD     r1, r1, #20
        LDMIA   r1, {r1-r3}
        Push    "r1-r3"

        BL      Mode_GetCurrent
        BLVC    Mode_GetInfo
        BLVC    Mode_TestPalette
        BLVC    Mode_SetModeString

        Pull    "r1-r3"
        SWIVC   XWimp_CreateSubMenu

        EXIT


msg_menusdeleted
        Debug   msg,"msg_menusdeleted"
        LDR     r1, menu_handle
        BL      Menu_RemoveTick
        MOV     r1, #0
        STR     r1, menu_handle
        EXIT


msg_helprequest
        Debug   msg,"msg_helprequest"
        LDR     r2, [r1, #ms_data + b_window]
        LDR     r3, [r1, #ms_data + b_icon]

        CMP     r2, #iconbar_whandle
        MOVEQ   r2, #"B"
        MOVEQ   r3, #0
        BEQ     return_help

        LDR     lr, info_handle
        TEQ     r2, lr
        MOVEQ   r2, #"I"
        MOVEQ   r3, #0
        BEQ     return_help

        LDR     lr, display_handle
        TEQ     r2, lr
        MOVEQ   r2, #"D"
        BEQ     return_help

        LDR     lr, mode_handle
        TEQ     r2, lr
        MOVEQ   r2, #"W"
        BEQ     return_help

        CMP     r3, #0                  ; No help if not on a menu item.
        EXIT    LT

        Push    "r1,r3,lr"              ; Find menu item.
        MOV     r0, #1
        ADD     r1, sp, #4
        SWI     XWimp_GetMenuState
        Pull    "r1,r3,lr"              ; r3 = menu item
        EXIT    VS

        LDR     r0, menu_handle
        ADR     lr, m_iconbarmenu
        TEQ     r0, lr
        MOVEQ   r2, #"M"
        BEQ     return_help

        ADR     lr, m_coloursmenu
        TEQ     r0, lr
        MOVEQ   r2, #"C"
        BEQ     return_help

        LDR     lr, m_resolutionmenu
        TEQ     r0, lr
        MOVEQ   r2, #"R"
        BEQ     return_help

        LDR     lr, m_ratemenu
        TEQ     r0, lr
        EXIT    NE

        MOV     r2, #"F"                ; And drop through to...

return_help
        SUB     sp, sp, #8              ; Get some local stack.

        MOV     r1, sp                  ; Build message token.
        MOV     lr, #"H"
        STRB    lr, [r1], #1
        STRB    r2, [r1], #1
        MOV     r0, r3
        MOV     r2, #user_data_size - msHelp_message
        SWI     XOS_ConvertHex2

        BLVC    MsgTrans_OpenFile       ; Lookup help text.
        MOVVC   r1, sp
        ADRVC   r2, user_data + msHelp_message
        MOVVC   r3, #user_data_size - msHelp_message
        BLVC    MsgTrans_Lookup

        ADD     sp, sp, #8              ; Balance stack.

        LDRVC   r0, =Message_HelpReply
        SUBVC   r1, r2, #msHelp_message
        ADDVC   r3, r3, #msHelp_message + 4
        BICVC   r3, r3, #3              ; r3 = message size (including string terminator)
        STRVC   r3, [r1, #ms_size]
        BLVC    Message_SendAck
        EXIT


 [ LoadModeFiles

msg_dataload
        Debug   msg,"msg_dataload"
        LDR     lr, [r1, #msDataTransfer_filetype]
        LDR     r0, =FileType_Text
        TEQ     r0, lr                  ; Make sure it's a text file.
        ADRNE   r0, ErrorBlock_Modes_InvalidFile
        BLNE    MsgTrans_ErrorLookup
        EXIT    VS

        LDR     r6, [r1, #ms_yourref]   ; Save for later.
        Debug   msg," received ref",r6

        LDR     r0, =Message_DataLoadAck
        BL      Message_SendAck

        ADDVC   r1, r1, #msDataTransfer_filename
        BLVC    Mode_LoadFile
        BL      delete_scrap
        EXIT

delete_scrap
        Push    "r0,lr"
        LDR     lr, scrap_ref
        TEQ     r6, lr                  ; If loading scrap file then
        MOVEQ   lr, #-1                 ;   clear scrap ref
        STREQ   lr, scrap_ref
        ADREQ   r0, deletescrap         ;   and delete scrap file we used.
        SWIEQ   XOS_CLI
        Pull    "r0,pc",,^


msg_datasave
        Debug   msg,"msg_datasave"
        LDR     lr, [r1, #msDataTransfer_filetype]
        LDR     r0, =FileType_Text
        TEQ     r0, lr                  ; Make sure it's a text file.
        EXIT    NE

        ADR     r0, wimpscrapname       ; Check that Wimp$Scrap has been set.
        MOV     r2, #-1
        MOV     r3, #0
        MOV     r4, #VarType_Expanded
        SWI     XOS_ReadVarVal          ; Returns r2=0 if doesn't exist.
        CMP     r2, #0
        ADREQ   r0, ErrorBlock_Modes_NoScrap
        BLEQ    MsgTrans_ErrorLookup
        EXIT    VS

        MOV     lr, #-1
        STR     lr, [r1, #msDataTransfer_filesize]
        MOV     lr, #(msDataTransfer_filename + ?wimpscrapname2 + 3):AND::NOT:3
        STR     lr, [r1, #ms_size]

        ADR     r0, wimpscrapname2
        ADD     r1, r1, #msDataTransfer_filename
        BL      Mod_CopyString          ; r2 = length = -1 from above.

        LDR     r0, =Message_DataSaveAck
        ADR     r1, user_data
        BL      Message_SendAck

        LDRVC   lr, [r1, #ms_myref]     ; Note that we're using Wimp$Scrap.
        STRVC   lr, scrap_ref
        Debug   msg," sent ref",lr
        EXIT

wimpscrapname   DCB     "Wimp$Scrap",0
wimpscrapname2  DCB     "<Wimp$Scrap>",0
deletescrap     DCB     "%Delete <Wimp$Scrap>",0
                ALIGN

        MakeErrorBlock  Modes_InvalidFile
        MakeErrorBlock  Modes_NoScrap


;---------------------------------------------------------------------------
; Message_SendAck
;
;       In:     r0 = message to send
;               r1 -> message block to send
;       Out:    r0 corrupted
;
;       The references in the message block are updated and the message
;       is then sent to the appropriate task.
;
Message_SendAck
        ENTRY   "r1,r2"

        LDR     r2, [r1, #ms_taskhandle]
        LDR     lr, [r1, #ms_myref]
        STR     lr, [r1, #ms_yourref]
        STR     r0, [r1, #ms_action]

        MOV     r0, #User_Message
        SWI     XWimp_SendMessage

        EXIT
 ]

        LTORG

        END