-
Notifications
You must be signed in to change notification settings - Fork 2
/
tasking.dasm
51 lines (45 loc) · 1.37 KB
/
tasking.dasm
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
; tasking.dasm: multitasking
;
; This file is part of S0lllOS.
; Visit our git repo at https://github.com/S0lll0s/S0lllOS
; Copyright (C) 2013 S0lll0s
:_tasking_next_slice
SET A, [_tasking_current_task]
SET [A+0xc], POP ; store EX
SET [A+0x2], POP ; store A
SET [A+0x3], B ; store B
SET [A+0x4], C ; store C
SET [A+0x5], X ; store X
SET [A+0x6], Y ; store Y
SET [A+0x7], Z ; store Z
SET [A+0x8], I ; store I
SET [A+0x9], J ; store J
SET [A+0xa], POP ; store PC
SET [A+0xb], SP ; store SP
SET A, [_tasking_current_task]
:.loop
SET A, [A+1] ; A is next task's info
IFB [A+0xf], 0x1 ; process is locked, pick another one
SET PC, .loop
SET [_tasking_current_pid], [A]
SET [_tasking_current_task], A
:_tasking_load_only
SET B, [A+0x3] ; restore B
SET C, [A+0x4] ; restore C
SET X, [A+0x5] ; restore X
SET Y, [A+0x6] ; restore Y
SET Z, [A+0x7] ; restore Z
SET I, [A+0x8] ; restore I
SET J, [A+0x9] ; restore J
SET SP, [A+0xb] ; restore SP
SET PUSH, [A+0xa] ; save PC
SET EX, [A+0xc] ; restore EX
SET PUSH, [A+0x2] ; restore A
RFI 0 ; jump
:_tasking_num_tasks dat 0 ; num tasks
:_tasking_current_pid dat 0 ; current process id
:_tasking_current_task dat 0 ; current task info
; task info:
; dat pid, next entry
; dat A, B, C, X, Y, Z, I, J, PC, SP, EX, locking thread
; dat flags, flags ; pad to power of two (16 word allocation)