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