Rustem Gimadutdinov (rgimad)
7f7312d98b
git-svn-id: svn://kolibrios.org@8725 a494cfbc-eb01-0410-851d-a64ba20cac60
113 lines
2.7 KiB
PHP
113 lines
2.7 KiB
PHP
; note: proc that defines without stdcall, call using "call"
|
|
; note: by stdcall convention callee is responsible for cleaning up the stack,
|
|
; arguments are pushed onto the stack in right-to-left order
|
|
align 4
|
|
proc _memset stdcall, dest:dword, val:byte, cnt:dword ; doesnt clobber any registers
|
|
;DEBUGF DBG_INFO, "memset(%x, %u, %u)\n", [dest], [val], [cnt]
|
|
push eax ecx edi
|
|
mov edi, dword [dest]
|
|
mov al, byte [val]
|
|
mov ecx, dword [cnt]
|
|
rep stosb
|
|
pop edi ecx eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc _srand stdcall, seed:dword
|
|
push eax
|
|
;DEBUGF DBG_INFO, "_srand: next_rand = %u\n", [next_rand]
|
|
mov eax, dword [seed]
|
|
mov dword [next_rand], eax
|
|
pop eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc _rand stdcall
|
|
push ebx edx
|
|
;DEBUGF DBG_INFO, "_rand: next_rand = %u\n", [next_rand]
|
|
mov eax, dword [next_rand]
|
|
mov ebx, 214013
|
|
mul ebx
|
|
add eax, 2531011
|
|
mov dword [next_rand], eax
|
|
shr eax, 16
|
|
and eax, 0x7fff
|
|
pop edx ebx
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc _getseed stdcall
|
|
push edx
|
|
rdtsc
|
|
xor eax, edx
|
|
pop edx
|
|
ret
|
|
endp
|
|
|
|
; calculate (num % num_mod) / num_div
|
|
align 4
|
|
proc mod_div stdcall, num: dword, num_mod: dword, num_div:dword ; TODO check
|
|
; in: num - number
|
|
; num_mod - first divisor
|
|
; num_div - second divisor
|
|
; out: eax - the result
|
|
; destroys: mb flags
|
|
push ecx edx
|
|
xor edx, edx
|
|
mov eax, dword [num]
|
|
mov ecx, dword [num_mod]
|
|
div ecx
|
|
|
|
mov eax, edx
|
|
xor edx, edx
|
|
mov ecx, dword [num_div]
|
|
div ecx
|
|
pop edx ecx
|
|
ret
|
|
endp
|
|
|
|
; update key map; TODO impl;
|
|
align 4
|
|
proc keyboard_update stdcall, _code: dword
|
|
push eax ebx ecx edx
|
|
mov eax, dword [_code]
|
|
|
|
mov edx, eax
|
|
and edx, 0xF000
|
|
|
|
mov ebx, eax
|
|
and ebx, 0x0F00
|
|
shr ebx, 8
|
|
|
|
xor ecx, ecx
|
|
cmp edx, 0x6000
|
|
jne .if1_end
|
|
mov ecx, 0x9
|
|
.if1_end:
|
|
add ebx, ecx
|
|
; DEBUGF DBG_INFO, "keynum %x\n", ebx
|
|
cmp ebx, KEY_SIZE
|
|
jae .ret
|
|
DEBUGF DBG_INFO, "keynum %x\n", ebx
|
|
mov byte [key + ebx], 1
|
|
|
|
.ret:
|
|
pop edx ecx ebx eax
|
|
ret
|
|
endp
|
|
|
|
; ; get seconds count
|
|
; align 4
|
|
; proc get_clock stdcall
|
|
; ; out: eax - time from system start in 10^-2 secs
|
|
; push ebx
|
|
; mov eax, 26
|
|
; mov ebx, 9
|
|
; int 0x40
|
|
; pop ebx
|
|
; ret
|
|
; endp
|