; 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 "",0 deletescrap DCB "%Delete ",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