0,0 → 1,112 |
; 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 |