gates_of_skeldal/libs/tasker.asm
2025-01-25 13:08:41 +01:00

90 lines
2.2 KiB
NASM

.model small
.386
DGROUP group _DATA
extrn _tasklist_sp:dword[]
extrn _tasklist_low:dword[]
extrn _tasklist_top:dword[]
extrn _task_info:dword[]
extrn _curtask:dword
extrn _nexttask:dword
extrn _taskcount:dword
extrn __STACKLOW:dword
extrn __STACKTOP:dword
extrn _taskparam:dword
extrn free_:proc
_TEXT segment byte public 'CODE' use32
assume CS:_TEXT
assume DS:DGROUP
public task_sleep_
task_sleep_:
mov _taskparam,eax
pushfd
pushad
mov eax,_curtask
mov esi,[_tasklist_sp]
mov edi,[_tasklist_low]
mov edx,[_tasklist_top]
mov ecx,[_task_info]
mov [esi+eax*4],esp
mov ebx,_nexttask
term_1: cmp eax,ebx
mov eax,ebx
jnz twake
xor eax,eax
taskloop:
inc ebx
cmp ebx,_taskcount
jc tasktest
xor ebx,ebx
tasktest:
cmp dword ptr [esi+ebx*4],0
jz taskloop
test byte ptr [ecx+ebx],2 ;test zda je task waiting
jnz taskloop ;ano - pak ho preskoc (task 0 nesmi byt waiting)
twake: mov _curtask,eax
mov _nexttask,ebx
mov esp,[esi+eax*4]
mov ebx,[edi+eax*4]
mov __STACKLOW,ebx
mov ebx,[edx+eax*4]
mov __STACKTOP,ebx
popad
popfd
mov eax,_taskparam
ret
public task_terminating_
task_terminating_:
;tato funkce je volana po kazdem ukonceni ulohy
mov eax,[_tasklist_sp]
mov esp,[eax]
mov ebx,[_tasklist_low]
mov ebx,[ebx]
mov __STACKLOW,ebx
mov ebx,[_tasklist_top]
mov ebx,[ebx]
mov __STACKTOP,ebx
mov eax,_curtask
mov esi,[_tasklist_low]
mov eax,[esi+4*eax]
call free_
mov eax,_curtask
xor ebx,ebx
mov esi,[_tasklist_sp]
mov [esi+4*eax],ebx
mov esi,[_tasklist_sp]
mov edi,[_tasklist_low]
mov edx,[_tasklist_top]
mov eax,_curtask
mov ebx,_nexttask
jmp term_1
_TEXT ends
end