home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 4 / AUCD4.iso / acornuser / 1998 / nov1998 / regulars / StarInfo / Fletcher / SlowTWsrc < prev   
Text File  |  1998-05-13  |  4KB  |  102 lines

  1. In   -
  2. Out  SlowTW
  3. Type Module
  4. Ver  1.00f
  5.  
  6. Define Workspace
  7.  Name      module
  8.  Default   r12
  9.   `runtime  !  how often it should run
  10.   `nexttime !  the time we should run again
  11.   `starttime !  the time it started waiting
  12.   `slowtask !  domain id of task to slow
  13. End Workspace
  14.  
  15. Define Module
  16.  Name      SlowTW
  17.  Author    Justin Fletcher
  18.  PostFilter
  19.   Name     SlowTW
  20.   Task     -
  21.   Accept   Null Pollword
  22.   Code     slowtw
  23.  End PostFilter
  24.  PreFilter
  25.   Name     SlowTW
  26.   Task     -
  27.   Code     slowtw_pre
  28.  End PreFilter
  29.  Workspace *`len_module
  30.  Init      initcode
  31.  Commands
  32.   Name     SlowTW
  33.   Min      1
  34.   Max      1
  35.   Code     com_slow
  36.  End Commands
  37. End Module
  38.  
  39. #rem off
  40.  
  41. >initcode
  42.    STMFD   (sp)!,{r0-r5,link}            ; Stack registers
  43.    MOV     r0,#15                        ; number of cs/poll
  44.    STRW    r0,`runtime
  45.    LDMFD   (sp)!,{r0-r5,pc}              ; Return from call
  46.  
  47. >slowtw_pre
  48.    STMFD   (sp)!,{r0-r1,link}            ; Stack registers
  49.    LDRW    r0,`nexttime                  ; read the next time
  50.    TEQ     r0,#0                         ; is it set ?
  51.    LDMNEFD (sp)!,{r0-r1,pc}^             ; if so, return
  52.    SWI     "XOS_ReadMonotonicTime"       ; read the time
  53.    LDRW    r1,`starttime                 ; read the time we started this poll
  54.    SUB     r1,r0,r1                      ; r1 = time taken in poll
  55.    REM     "%c04Penalise by %r1"
  56.    LDRW    r14,`runtime                  ; read the runtime
  57.    ADD     r0,r0,r14                     ; add it on
  58.    ADD     r0,r0,r1                      ; add on the time it took
  59.    STRW    r0,`nexttime                  ; store back
  60.    LDMFD   (sp)!,{r0-r1,pc}^             ; Return from call
  61.  
  62. >slowtw
  63.    TEQ     r0,#0                         ; Wimp_Poll reason
  64.    TEQNE   r0,#13                        ; NULL or Pollword
  65.    MOVNES  pc,link                       ; if not NULL, return
  66.    STMFD   (sp)!,{r1-r5,link}            ; Stack registers
  67.    MOV     r2,#0
  68.    LDR     r2,[r2,#&ff8]                 ; read domain id
  69.    LDRW    r3,`slowtask                  ; read task to slow
  70.    TEQ     r2,r3                         ; slow ?
  71.    LDMNEFD (sp)!,{r1-r5,pc}^             ; if not, return
  72.    SWI     "XOS_ReadMonotonicTime"       ; read the time
  73.    MOVVS   r0,#0                         ; if error, clear 0
  74.    BVS     $error
  75.    LDRW    r2,`nexttime                  ; read next time
  76.    CMP     r2,r0                         ; compare them
  77.    STRWLS  r0,`starttime                 ; the time it started running
  78.    MOVLS   r0,#0                         ; if <= make sure it runs now
  79.    STRWLS  r0,`nexttime                  ; and zero the next time
  80.    MVNHI   r0,#NOT -1                    ; if > make sure it runs later
  81. $error
  82.    LDMFD   (sp)!,{r1-r5,pc}^             ; Return from call
  83.  
  84. >com_slow
  85.    STMFD   (sp)!,{r0-r5,link}            ; Stack registers
  86.    LDR     r12,[r12]                     ; read our workspace
  87.    MOV     r1,r0                         ; r1 = value to delay by
  88.    XSWI    "XOS_ReadUnsigned",10         ; read the value
  89.    BVS     $error                        ; if error, process
  90.    STRW    r2,`runtime                   ; store as the wait time
  91.    MOV     r2,#0
  92.    LDR     r2,[r2,#&ff8]                 ; read domain id
  93.    STRW    r2,`slowtask                  ; read task to slow
  94.    SWI     "XOS_ReadMonotonicTime"       ; read the time
  95.    STRW    r0,`starttime                 ; store as the start time
  96.    STRW    r0,`nexttime                  ; store as the next time too
  97. $error
  98.    XLDMFD  (sp)!,{r0-r5,pc}              ; Return from call
  99.  
  100. #POST
  101. #RUN <CODE>
  102.