MT_SUSJB/SMS.SSJB - Suspend an Existing Job

Suspend an existing job. (ok, how do I suspend a non-existing job then? LOL)

Call Parameters Return Register Return Parameter
D0.B $08 D0.L Error code.
D1.L Id of the job to be suspended. -1 indicates the current job. D1.L Preserved. Unless the job id of -1 was used on entry, in which case the return value is the job id of the current job.
D2.L Unused. D2.L Preserved.
D3.W Timeout period in frames. -1 indicates indefinite suspension. D3.L Preserved.
A0.L Unused. A0.L Base address of suspended job.
A1.L Address of the flag byte (see below) or zero. A1.L Preserved. (or is it? See notes below.).

Errors

Error Code Description
ERR_NJ Invalid job id.

Notes

  • All registers not shown above are not used on entry and are preserved on exit.
  • A1.L is documented as being preserved, but personal experience has shown that it is //not always// preserved.
  • The value in D3.W is stored in the job’s header at JB_STAT.
  • The value in A1.L is stored in the header at JB_HOLD. The flag byte at (A1) will be cleared when the job is released (unsupended) again.
  • A frame period is 1/50th of a second in UK/Europe but 1/60th in the USA.
  • If the job being suspended is already suspended, then the current suspend period is changed to the new one, and the job is re-suspended for the new period of time in full.
  • This trap always exits via the job scheduler, so it is not atomic.

Example

The following shows the use of this call.

        moveq   #SMS.SSJB,d0    ; Or MT_SUSJB
        moveq   #-1,d1          ; Suspend myself
        moveq   #50,d3          ; Suspend for 50 frames
        suba.l  a1,a1           ; No flag byte required
        trap    #1              ; Suspend the job
        ...
        <Carry on as normal when the suspension is over.>
        ...