1145
|
1 **************************************************
|
|
2 * System Call: F$Sleep
|
|
3 *
|
|
4 * Function: Put the calling process to sleep
|
|
5 *
|
|
6 * Input: X = Sleep time in ticks (0 = forever)
|
|
7 *
|
|
8 * Output: X = Decremented by the number of ticks that the process slept
|
|
9 *
|
|
10 * Error: CC = C bit set; B = error code
|
|
11 *
|
|
12 FSleep pshs cc preserve interupt status
|
|
13 ldx <D.Proc Get current process pointer
|
|
14
|
|
15 * F$Sleep bug fix. Check if we're in system state. If so return because you
|
|
16 * should never sleep in system state.
|
|
17 cmpx <D.SysPrc is it system process?
|
|
18 beq SkpSleep skip sleep call
|
|
19 orcc #IntMasks disable interupts
|
|
20 lda P$Signal,x get pending signal
|
|
21 beq L0722 none there, skip ahead
|
|
22 deca wakeup signal?
|
|
23 bne L0715 no, skip ahead
|
|
24 sta P$Signal,x clear pending signal so we can wake up process
|
|
25 L0715
|
|
26 IFNE H6309
|
|
27 aim #^Suspend,P$State,x
|
|
28 ELSE
|
|
29 ENDC
|
|
30 L071B puls cc
|
|
31 os9 F$AProc activate the process
|
|
32 bra L0780
|
|
33 L0722 ldd R$X,u get callers X (contains sleep tick count)
|
|
34 beq L076D done, wake it up
|
|
35 IFNE H6309
|
|
36 decd subtract 1 from tick count
|
|
37 ELSE
|
|
38 ENDC
|
|
39 std R$X,u save it back
|
|
40 beq L071B zero, wake up process
|
|
41 pshs x,y
|
|
42 ldx #(D.SProcQ-P$Queue)
|
|
43 L0732 std R$X,u
|
|
44 stx 2,s
|
|
45 ldx P$Queue,x
|
|
46 beq L074F
|
|
47 IFNE H6309
|
|
48 tim #TimSleep,P$State,x
|
|
49 ELSE
|
|
50 ENDC
|
|
51 beq L074F
|
|
52 ldy P$SP,x get process stack pointer
|
|
53 ldd R$X,u
|
|
54 subd R$X,y
|
|
55 bcc L0732
|
|
56 IFNE H6309
|
|
57 negd
|
|
58 ELSE
|
|
59 nega
|
|
60 negb
|
|
61 ENDC
|
|
62 std R$X,y
|
|
63 L074F puls y,x
|
|
64 IFNE H6309
|
|
65 oim #TimSleep,P$State,x
|
|
66 ELSE
|
|
67 ENDC
|
|
68 ldd P$Queue,y
|
|
69 stx P$Queue,y
|
|
70 std P$Queue,x
|
|
71 ldx R$X,u
|
|
72 bsr L0780
|
|
73 stx R$X,u
|
|
74 ldx <D.Proc
|
|
75 IFNE H6309
|
|
76 aim #^TimSleep,P$State,x
|
|
77 ELSE
|
|
78 ENDC
|
|
79 SkpSleep puls cc,pc
|
|
80
|
|
81 L076D ldx #D.SProcQ-P$Queue
|
|
82 L0770 leay ,x
|
|
83 ldx P$Queue,x
|
|
84 bne L0770
|
|
85 ldx <D.Proc
|
|
86 clra
|
|
87 clrb
|
|
88 stx P$Queue,y
|
|
89 std P$Queue,x
|
|
90 puls cc
|
|
91
|
|
92 L0780 pshs dp,x,y,u,pc
|
|
93 L0782 leax <L079C,pc
|
|
94 stx 7,s
|
|
95 ldx <D.Proc
|
|
96 ldb P$Task,x This is related to the 'one-byte hack'
|
|
97 cmpb <D.SysTsk that stops OS9p1 from doing an F$AllTsk on
|
|
98 beq L0792 _every_ system call.
|
|
99 os9 F$DelTsk
|
|
100 L0792 ldd P$SP,x
|
|
101 IFNE H6309
|
|
102 pshsw
|
|
103 ENDC
|
|
104 pshs cc,d
|
|
105 sts P$SP,x
|
|
106 os9 F$NProc
|
|
107
|
|
108 L079C pshs x
|
|
109 ldx <D.Proc
|
|
110 std P$SP,x
|
|
111 clrb
|
|
112 puls x,pc
|