forked from KolibriOS/kolibrios
122 lines
2.1 KiB
PHP
122 lines
2.1 KiB
PHP
|
new_thread:
|
||
|
mov ecx,ipcarea2
|
||
|
call init_ipc
|
||
|
mcall 40,1000000b
|
||
|
tstill:
|
||
|
mov dword[ipcarea2],0
|
||
|
mov dword[ipcarea2+4],8
|
||
|
mcall 10
|
||
|
.prc:
|
||
|
cmp eax,7
|
||
|
jne tstill
|
||
|
and [flag],not FL_PLAY
|
||
|
mov eax,dword[ipcarea2+8]
|
||
|
cmp eax,[parentPID]
|
||
|
jne tstill
|
||
|
cmp byte[ipcarea2+16],IPC_PLAY
|
||
|
je .play_next
|
||
|
cmp byte[ipcarea2+16],IPC_TRIG
|
||
|
jne tstill
|
||
|
.play_next:
|
||
|
or [flag],FL_PLAY
|
||
|
mov edi,[cur_ptr]
|
||
|
movzx eax,word[edi]
|
||
|
mov [play_area],ax
|
||
|
add [cur_ptr],2
|
||
|
if SOUND eq ON
|
||
|
test [flag],FL_MUTE
|
||
|
jnz .nosound
|
||
|
mov esi,play_area
|
||
|
mov eax,55
|
||
|
mov ebx,eax
|
||
|
int 0x40
|
||
|
.nosound:
|
||
|
end if
|
||
|
movzx ebx,byte[play_area]
|
||
|
and ebx,0x7f
|
||
|
add [cur_tick],ebx
|
||
|
mov eax,23
|
||
|
int 0x40
|
||
|
cmp word[edi],0
|
||
|
jne .checkevt
|
||
|
mov eax,IPC_NEXT
|
||
|
call ipc_send
|
||
|
jmp tstill
|
||
|
.checkevt:
|
||
|
test eax,eax
|
||
|
jz .upd
|
||
|
cmp eax,7
|
||
|
jne tstill
|
||
|
cmp byte[ipcarea2+16],IPC_PLAY
|
||
|
jne tstill
|
||
|
.upd:
|
||
|
mov eax,IPC_UPDT
|
||
|
call ipc_send
|
||
|
jmp .play_next
|
||
|
|
||
|
respawn:
|
||
|
mcall 9,prcinfo,-1
|
||
|
mov ecx,eax
|
||
|
xor edx,edx
|
||
|
xor esi,esi
|
||
|
.nxt:
|
||
|
mcall 9
|
||
|
cmp dx,[ebx+4]
|
||
|
jae .less
|
||
|
mov dx,[ebx+4]
|
||
|
mov esi,[ebx+30]
|
||
|
.less:
|
||
|
loop .nxt
|
||
|
push esi
|
||
|
mcall 51,1,new_thread,APP_MEM
|
||
|
pop edx
|
||
|
cmp edx,[childPID]
|
||
|
jne .nochild
|
||
|
mov edx,[parentPID]
|
||
|
.nochild:
|
||
|
mov [childPID],eax
|
||
|
call prc_find
|
||
|
mcall 18,3
|
||
|
ret
|
||
|
|
||
|
kill:
|
||
|
mov edx,[childPID]
|
||
|
call prc_find
|
||
|
mcall 18,2
|
||
|
.nothread:
|
||
|
ret
|
||
|
|
||
|
prc_find: ;in: edx-PID, out: ecx-number
|
||
|
mcall 9,prcinfo,-1
|
||
|
mov ecx,eax
|
||
|
.nxt:
|
||
|
mcall 9
|
||
|
cmp edx,[ebx+30]
|
||
|
je .found
|
||
|
loop .nxt
|
||
|
.found:
|
||
|
ret
|
||
|
|
||
|
init_ipc:
|
||
|
mcall 60,1,,20
|
||
|
ret
|
||
|
|
||
|
ipc_send: ;eax-msg
|
||
|
test [flag],FL_LOCK
|
||
|
jnz .noipc
|
||
|
pusha
|
||
|
mov [ipcmsg],al
|
||
|
mov ebx,ipcarea2
|
||
|
mov ecx,childPID
|
||
|
cmp eax,0xb0
|
||
|
jb .noparent
|
||
|
add ecx,4
|
||
|
sub ebx,20
|
||
|
.noparent:
|
||
|
mov dword[ebx],0
|
||
|
mov dword[ebx+4],8
|
||
|
mcall 60,2,[ecx],ipcmsg,1
|
||
|
popa
|
||
|
.noipc:
|
||
|
ret
|