multitask.asm
1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
IRQ0:
# set IP for process B in its first stack frame
set R1 @intr1B # top (empty)
dec R1 # where interrupt mask is saved
set R0 0xFFFF # mask
save R0 R1
dec R1 # where IP is saved
set R0 @processB
save R0 R1 # assign it to @processB
# start process A
set SP @intr0A
set R0 @processA
jmp R0
# which process is running
# - 0 => process A
# - 1 => process B
current:
= 0
IRQ2:
# check which process is running
set R0 @current
load R0 R1
set R2 @switchB
jz R1 R2
switchA: # switch to process A
dec R1
set SP @intr1A
set R3 @end
jmp R3
switchB: # switch to process B
inc R1
set SP @intr1B
end: # update the running process
save R1 R0
iret
# code for process A: make R0 blink (AAAA/4444)
processA:
set R0 0xAAAA
set R0 0x4444
set R1 @processA
jmp R1
# code for process B: make R0 blink (BBBB/8888)
processB:
set R0 0xBBBB
set R0 0x8888
set R1 @processB
jmp R1
# stack for process A
intr0A: # frame for IRQ0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr1A: # one more frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr2A: # one last frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
# stack for process B
intr0B: # frame for IRQ0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr1B: # one more frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr2B: # one last frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0