; 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. ; ; watchdog source [ NewErrorSystem watchdogguard DCD &E240569E [ WatchdogTimer BreakWatchdogHandler ENTRY "R0" | BreakWatchdogHandler TEQ R0,#Event_Keyboard MOVNE PC,lr TEQ R1,#1 ; only interested in key down MOVNE PC,lr [ SnapShot TEQ R2,#13 BEQ capturescreen ] TEQ R2,#15 ; break key MOVNE PC,lr Push "R0" ] MOV R0,PC TEQP PC,#SVC_mode NOP Push "R0-R2,LR" LDR R0,watchdogcodew TEQ R0,#0 BNE watchdogend LDR R0,watchdogarea LDR R1,watchdogguard CMP R0,R1 BEQ watchdogend [ WatchdogTimer ; the event based system has already checked for break key. MOV R0,#121 MOV R1,#44:EOR:128 ; Break SWI XOS_Byte CMP R1,#&ff BNE watchdogend ] MOV R0,#121 MOV R1,#2:EOR:128 ; Alt SWI XOS_Byte CMP R1,#&ff BNE watchdogend MOV R0,#121 MOV R1,#1:EOR:128 ; Ctrl SWI XOS_Byte CMP R1,#&ff BEQ watchdogend ; only Break MOV R0,#121 MOV R1,#0:EOR:128 ; Shift SWI XOS_Byte CMP R1,#&ff BEQ watchdogend LDR R1,watchdogguard STR R1,watchdogarea LDR R1,taskhandle STR R1,watchdogtask MOV R1,#-1 STR R1,watchdogtaskno ADR R0,watchdogcallback MOV R1,R12 SWI XOS_AddCallBack MOV R0,#124 SWI XOS_Byte ; clear escape condition watchdogend Pull "R0-R2,LR" TEQP PC,R0 NOP Pull "R0,PC" LTORG kill_labels DCB "Watchdog:Stop,Cancel,Next Task" DCB 0 ALIGN watchdogcallback Push "R0-R7,R14" LDR R0,watchdogtask ; R0 = task handle LDR R1,[wsptr,R0] ; R1 -> task record TEQ R1,#task_unused LDRNE R7,taskhandle ; save this as we may have to page STRNE R0,taskhandle ; BLNE fulltaskhandle STRNE R7,taskhandle ; put it back just in case MOVNE R0,R14 MOVEQ R0,#0 ; setup meaningful task handle =0 if none, else current SWI XTaskManager_TaskNameFromHandle ; get task name ADRVS R0,notaskname MOV R4,R0 LDR R0,commandflag TEQ R0,#cf_active ADRNE R0,killapptoken ADREQ R0,killprogtoken ADRL R2,watchdogerrtxt MOV R3,#?watchdogerrtxt MOV R5,#0 BL LookupToken ADRL R0,watchdogerror LDR R1,=&050DEAD0 ; user1 STR R1,[R0] MOV R1,#256+2048+512 ; new bits ADR R2,watchdogappname MOV R3,#0 MOV R4,#1 SUB SP,SP,#64 Push "R0-R4" ADR R0,kill_labels ADD R2,SP,#20 MOV R3,#64 BL LookupToken1 MOV R5,R2 MOV R0,#124 SWI XOS_Byte ; BASIC may have caused an escape condition Pull "R0-R4" SWI XWimp_ReportError ADD SP,SP,#64 CMP R1,#5 ; next BNE watchdognext taskloop LDR R0,watchdogtaskno ADD R0,R0,#1 CMP R0,#maxtasks BEQ watchdognext STR R0,watchdogtaskno ADRL R3,taskpointers ADD R0,R3,R0, LSL #2 LDR R2,[R0] TEQ R2,#task_unused BEQ taskloop SUB R0,R0,wsptr STR R0,watchdogtask ADR R0,watchdogcallback MOV R1,R12 SWI XOS_AddCallBack Pull "R0-R7,PC" watchdognext CMP R1,#3 ; kill CMPNE R1,#1 ; ok if text mode STR R1,watchdogarea Pull "R0-R7,PC",NE LDR R0,watchdogtask STR R0,newtaskhandle BL printjobrunning LDR R14,taskhandle TEQ R0,R14 ; current task going to die? BEQ %FT05 LDR R7,taskhandle Push userblk BL pageintask Pull userblk ; current task already paged in SWI XWimp_CloseDown ; taken from wimp_poll... LDR R14,ptrtask LDR R5,taskhandle TEQ R5,R14 MOVEQ R14,#nullptr ; avoid ptr_leaving_window! STREQ R14,ptrwindow ; MOV R0,#EscapeHandler ; the domain is about to die - SWI XOS_ReadDefaultHandler ; prevent nasty handlers from being SWIVC XOS_ChangeEnvironment ; called when they shouldn't be! ; MOV R0,#EventHandler SWI XOS_ReadDefaultHandler SWIVC XOS_ChangeEnvironment ; BL deallocatependingtask ; delete task block (gone for good) ; reclaim memory as well! MOV R0,#0 ; 'Press SPACE' if anything printed BL int_commandwindow ; can't call SWI since task is dead! CLRV ; ignore errors STR R7,newtaskhandle Push userblk BL pageintask Pull userblk Pull "R0-R7,PC" 05 SWI XHourglass_Smash ; turn off hourglass (if displayed) ; If kill message was textual, this wont have ; been done ; errorstack held the most recently used sprite area LDR R0,errorstack-8 CMP R0,#&8000 ; were we in a sprite ? Pull "R0-R7" ,LT SWILT OS_Exit ; can safely exit LDR R14,orig_applicationspacesize CMP R0,R14 Pull "R0-R7",GT SWIGT OS_Exit ; outside app space MOV R0,#SpriteReason_SwitchOutputToSprite MOV R1,#0 MOV R2,#0 MOV R3,#0 SWI XOS_SpriteOp ; make sure output is switched to the screen Pull "R0-R7" SWI OS_Exit LTORG killapptoken DCB "KillApp",0 ALIGN killprogtoken DCB "KillProg",0 ; we're in command mode ALIGN notaskname DCB "Unknown",0 ALIGN watchdogappname DCB "Window Manager",0 ALIGN printjobrunning ENTRY R0 LDR R14,taskhandle TEQ R0,R14 ; killing current task ? EXITS NE SWI XPDriver_CurrentJob EXITS VS TEQ R0,#0 EXITS EQ SWI XPDriver_AbortJob EXITS ] LTORG SWIWimp_SetWatchdogState MyEntry "SetWatchdogState" [ NewErrorSystem TEQ R0,#0 BNE %FT01 LDR R14,watchdogcodew TEQ R14,#0 ; already disabled ? EOREQ R1,R1,R12 STREQ R1,watchdogcodew BEQ ExitWimp 01 LDR R0,watchdogcodew EOR R0,R0,R12 EORS R0,R0,R1 STREQ R0,watchdogcodew ] B ExitWimp [ SnapShot capturescreen Push R0 MOV R0,PC TEQP PC,#SVC_mode ; need a stack!!! NOP Push "R0-R2,LR" MOV R0,#121 MOV R1,#2:EOR:128 ; Alt SWI XOS_Byte CMP R1,#&ff ADREQ R0,screen_callback SWIEQ XOS_AddCallBack B watchdogend screen_callback Push "R0-R3,lr" MOV R3,#1 ADR R2,scrn_pathname MOV R0,#2 SWI XOS_SpriteOp MOVVS R1,#1 MOVVS R2,#0 SWIVS XWimp_ReportError Pull "R0-R3,PC" scrn_pathname DCB ".!!Screen!!",0 ALIGN ] END