An even better TaskWindow |
Following the aforementioned TaskWindow speed-ups, Chris Manning decided to go one better and implement a variable poll-rate method.
Please note that this code is for, I think, the TaskWindow module part of RISC OS 4. It does not
work here, with RISC OS 3.70. I suspect the offset is wrong but I've not looked into it. A
crashed TaskWindow needs lots of TaskKilling (five or six times, twice), so be sure you have a
task killer module ready...
For those of you with the correct TaskWindow module, Chris is using it on his system and it
seems quite happy.
The changes to the TaskWindow module are:
Change: 00000320 : 03A03034 : MOVEQ R3,#&34 00000330 : 7A000896 : BVC &00002590 Change: 0000141C : E59B0004 : LDR R0,[R11,#4] 00001420 : E590302C : LDR R3,[R0,#&02C] 00001424 : EB00045E : BL &000025A4 Add: 00002590 : E3A0E00F : MOV R14,#&0F 00002594 : E58CE02C : STR R14,[R12,#&02C] 00002598 : E58CE030 : STR R14,[R12,#&030] 0000259C : E3A0E000 : MOV R14,#0 000025A0 : EAFFF763 : B &00000334 Add: 000025A4 : E2533001 : SUBS R3,R3,#1 000025A8 : 05903030 : LDREQ R3,[R0,#&030] 000025AC : E580302C : STR R3,[R0,#&02C] 000025B0 : E3A00000 : MOV R0,#0 000025B4 : E3A03000 : MOV R3,#0 000025B8 : 11A0F00E : MOVNE PC,R14 000025BC : EAFFFDC8 : B &00001CE4
This is backed up by the following code. It creates a file (in WimpScrap) which can be used to view or set the TaskWindow polling rate. The default rate is 15.
REM >Source:Util.TaskWindowPollRate ON ERROR ON ERROR OFF: PROCerror: END buf_size%=4096 DIM buf% buf_size%-1 : name$="TaskWindowPollRate" filename$=name$ : bufsize%=256 mininterval%=1 maxinterval%=255 defaultinterval%=15 : FlagF%=1<<26 FlagI%=1<<27 FlagV%=1<<28 FlagC%=1<<29 FlagZ%=1<<30 FlagN%=1<<31 : L%=buf%+buf_size% FOR opt%=12 TO 15 STEP 3 P%=0 O%=buf% [ OPT opt% ; ; r0 -> command line ; r1 -> command tail ; r12 -> workspace (1kB) ; r13 -> stack ; STMFD r13!,{r14} LDRB r0,[r1] ; First character of parameter CMP r0,#ASC(" ") ; No param means the current MVNLE r6,#0 ; value is to be displayed BLE _findmodule% TEQ r0,#ASC("*") ; An asterisk means the MOVEQ r6,#defaultinterval% ; default value is to be used BEQ _findmodule% MOV r0,r1 ; -> parameter MOV r1,r12 ; -> buffer MOV r2,#bufsize% ; Length of buffer SWI "XOS_GSTrans" LDMVSFD r13!,{pc} MOV r0,r12 ; -> Translated string MOV r1,#0 ; Return result in r2 SWI "XOS_EvaluateExpression" LDMVSFD r13!,{pc} CMP r2,#mininterval% ; Check number is in range BLT _toosmall% CMP r2,#maxinterval% BGT _toobig% MOV r6,r2 ; r6 == poll interval ; ; ._findmodule% MOV r0,#18 ; Extract module info ADR r1,_taskwindow% SWI "XOS_Module" LDMVSFD r13!,{pc} ; LDR r0,[r4,#-4] ; Size of work area CMP r0,#48 ; Patched TaskWindow has LDMLEFD r13!,{pc} ; larger workarea CMP r6,#0 ; -ve interval means 'display' STRPL r6,[r4,#44] ; Remainder of this interval STRPL r6,[r4,#48] ; New interval LDMPLFD r13!,{pc}^ ; LDR r0,[r4,#48] ; Active poll interval ADR r1,_currentnum% MOV r2,#_currentnumL% SWI "XOS_ConvertCardinal4" ; Convert to a string LDMVSFD r13!,{pc} ADR r0,_current% SWI "XOS_Write0" ; Display value SWIVC "XOS_NewLine" LDMFD r13!,{pc} ; ; ._compare% LDRB r7,[r3],#1 ; Byte from first string LDRB r8,[r5],#1 ; Byte from second string TEQ r7,r8 ; Compare bytes MOVNE pc,r14 ; Return NE if different TEQ r7,#0 ; Check for end BNE _compare% ; Look at next byte MOV pc,r14 ; Return EQ if identical ; ._toosmall% ADR r0,_smallerror% ; -> Error block B _toobig0% ._toobig% ADR r0,_bigerror% ; -> Error block ._toobig0% LDMFD r13!,{r14} ; Return address ORRS pc,r14,#FlagV% ; Set V flag and return ._smallerror% EQUD &16C EQUS "Number too small"+CHR$(0) ALIGN ._bigerror% EQUD &16C EQUS "Number too big"+CHR$(0) ._taskwindow% EQUS "TaskWindow"+CHR$(0) ._current% EQUS "Current poll rate is " ._currentnum% EQUS STRING$(10,"*")+CHR$(0) FNEqu("_currentnumL%","P%-_currentnum%") ] NEXT opt% OSCLI("Save <Wimp$ScrapDir>."+filename$+" "+STR$~(buf%)+" +"+STR$~(P%)) OSCLI("SetType <Wimp$ScrapDir>."+filename$+" Utility") END : DEF PROCerror REPORT IF ERR<>17 PRINT " at line "; ERL ", location counter=&"; ~P% ENDPROC : : DEF FNEqu(variable$, value$) =EVAL("FNMakeVar("+variable$+","+value$+")") : : DEF FNMakeVar(RETURN var%, value%) var%=value% =0