forked from KolibriOS/kolibrios
477 lines
9.5 KiB
PHP
477 lines
9.5 KiB
PHP
|
;
|
|||
|
; Ghost Monitor - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
|
|||
|
; All Right Reserved
|
|||
|
|
|||
|
;--------------------------------------------------------------------
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; OUT : AL - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
cpu_usage:
|
|||
|
pusha
|
|||
|
mov byte [c_u_t], 0
|
|||
|
mov eax, 18 ; TSC / SEC
|
|||
|
mov ebx, 5
|
|||
|
int 0x40
|
|||
|
shr eax, 20
|
|||
|
push eax
|
|||
|
|
|||
|
mov eax, 18 ; IDLE / SEC
|
|||
|
mov ebx, 4
|
|||
|
int 0x40 ; eax - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
shr eax, 20 ; eax = IDLE / 1048576
|
|||
|
pop ebx
|
|||
|
cmp eax, ebx ; BUG : time to time ICPS > TSCPS
|
|||
|
jnl c_u_o
|
|||
|
push ebx
|
|||
|
xor edx, edx
|
|||
|
mov ebx, 100
|
|||
|
mul ebx ; eax =(IDLE / 1048576) * 100
|
|||
|
|
|||
|
xor edx, edx
|
|||
|
pop ebx ; ebx = (TSC/1048576)+1
|
|||
|
inc ebx
|
|||
|
div ebx ; eax = ((IDLE / 1048576) * 100) / ((TSC/1048576)+1)
|
|||
|
|
|||
|
mov bl, 100
|
|||
|
sub bl, al
|
|||
|
cmp bl, 101
|
|||
|
jnl c_u_o
|
|||
|
mov [c_u_t], bl
|
|||
|
|
|||
|
c_u_o: popa
|
|||
|
mov al, [c_u_t]
|
|||
|
ret
|
|||
|
uglobal
|
|||
|
c_u_t: db 0
|
|||
|
endg
|
|||
|
;--------------------------------------------------------------------
|
|||
|
mem_usage:
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; OUT : al - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
display nl, 'Memory usage : '
|
|||
|
if (OS_version >= 0x0530)
|
|||
|
display 'yes'
|
|||
|
pusha
|
|||
|
mov byte [m_u_t], 0
|
|||
|
|
|||
|
mov eax, 18 ; full mem
|
|||
|
mov ebx, 17
|
|||
|
int 0x40
|
|||
|
shr eax, 10
|
|||
|
push eax
|
|||
|
|
|||
|
mov eax, 18 ; free mem
|
|||
|
mov ebx, 16
|
|||
|
int 0x40 ; eax - free mem
|
|||
|
shr eax, 10 ; eax = fmem / 1024
|
|||
|
xor edx, edx
|
|||
|
mov ebx, 100
|
|||
|
mul ebx ; eax =(free mem / 1024) * 100
|
|||
|
|
|||
|
xor edx, edx
|
|||
|
pop ebx ; ebx = (full mem/1024)+1
|
|||
|
inc ebx
|
|||
|
div ebx ; eax = ((free mem / 1024) * 100) / ((full mem/1024)+1)
|
|||
|
|
|||
|
mov bl, 100
|
|||
|
sub bl, al
|
|||
|
cmp bl, 101
|
|||
|
jnb m_u_o
|
|||
|
mov [m_u_t], bl
|
|||
|
|
|||
|
m_u_o: popa
|
|||
|
mov al, [m_u_t]
|
|||
|
ret
|
|||
|
uglobal
|
|||
|
m_u_t: db 0
|
|||
|
endg
|
|||
|
else
|
|||
|
display 'no'
|
|||
|
xor eax, eax
|
|||
|
ret
|
|||
|
end if
|
|||
|
|
|||
|
;#######################################################################
|
|||
|
stop_test:
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
display nl, 'Kill process type : '
|
|||
|
if (OS_version < 0x0400)
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> Menuet
|
|||
|
display 'Menuet'
|
|||
|
mov eax, 18
|
|||
|
mov ebx, 2
|
|||
|
mov ecx, [test_pid]
|
|||
|
int 0x40
|
|||
|
mov byte[test_id], 0
|
|||
|
ret
|
|||
|
; -------------------------------
|
|||
|
else if (OS_version >= 0x0400)
|
|||
|
if (OS_version < 0x0580)
|
|||
|
display 'old Kolibri'
|
|||
|
; -- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> Kolibri 4 <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
mov ebx, Buf
|
|||
|
xor ecx, ecx
|
|||
|
find_th:mov eax, 9
|
|||
|
int 0x40
|
|||
|
mov edx, dword [Buf + 30]
|
|||
|
cmp edx, dword [test_pid]
|
|||
|
je kill_t
|
|||
|
inc ecx
|
|||
|
cmp ecx, eax ; eax - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
jle find_th
|
|||
|
jmp cl_tinf ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> !!!! <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> !!!!
|
|||
|
kill_t: mov ebx, 2 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
mov eax, 18
|
|||
|
int 0x40
|
|||
|
cl_tinf:
|
|||
|
mov byte[test_id], 0
|
|||
|
ret
|
|||
|
uglobal
|
|||
|
Buf: times 1024 db ? ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID`<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
endg
|
|||
|
else
|
|||
|
; -------------------------------
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> Kolibri 0.5.8.0 <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
display 'Kolibri 0.5.8.0'
|
|||
|
mov eax, 18
|
|||
|
mov ebx, 18
|
|||
|
mov ecx, [test_pid]
|
|||
|
int 0x40
|
|||
|
mov byte [test_id], 0
|
|||
|
ret
|
|||
|
; -------------------------------
|
|||
|
end if
|
|||
|
end if
|
|||
|
;#######################################################################
|
|||
|
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; in : edx - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> mls
|
|||
|
; ebx - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : X << 16 + Y
|
|||
|
show_text:
|
|||
|
mov eax, 4
|
|||
|
mov ecx, 0x10000000
|
|||
|
@@:
|
|||
|
movzx esi, byte[edx]
|
|||
|
inc edx
|
|||
|
int 0x40
|
|||
|
add ebx, 10
|
|||
|
add edx, esi
|
|||
|
cmp byte[edx], -1
|
|||
|
jne @b
|
|||
|
ret
|
|||
|
;---------------------------------------------------------------------
|
|||
|
multiplier:
|
|||
|
;--- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; out : CL = <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 10, <EFBFBD><EFBFBD><EFBFBD> 0
|
|||
|
xor ecx, ecx
|
|||
|
if (OS_version >= 0x0510)
|
|||
|
display nl, 'Multiplier (RDMSR) : yes'
|
|||
|
cmp dword [Vendor + 8], 'cAMD' ; Check for Advanced Micro Devices CPU
|
|||
|
jne noAMD
|
|||
|
cmp byte [CPU_fam], 5
|
|||
|
jne noAMDK6
|
|||
|
mov eax, 68 ; AMD-K6 (p.30)
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x0C0000087
|
|||
|
int 0x40 ; eax - low dword
|
|||
|
and eax, 111b
|
|||
|
mov cl, [athloncoef3 + eax]
|
|||
|
cmp eax, 6
|
|||
|
jne @f
|
|||
|
cmp byte[CPU_mod], 8
|
|||
|
jae @f
|
|||
|
mov cl, 20
|
|||
|
@@: ret
|
|||
|
|
|||
|
noAMDK6:cmp byte [CPU_fam], 6
|
|||
|
jne noAMDK7
|
|||
|
cmp byte [CPU_mod], 5
|
|||
|
jna @f
|
|||
|
mov eax, 0x80000007
|
|||
|
cpuid
|
|||
|
and edx, 6 ; voltage ID control & frequency ID control
|
|||
|
cmp edx, 6
|
|||
|
je AMDK7M
|
|||
|
@@: mov eax, 68 ; Athlon/AthlonXP
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x0C0010015
|
|||
|
int 0x40
|
|||
|
mov ebx, eax
|
|||
|
shr ebx, 24
|
|||
|
and ebx, 0x0F
|
|||
|
shr eax, 20
|
|||
|
jnc @f
|
|||
|
add bl, 16
|
|||
|
@@: mov cl, [athloncoef + ebx]
|
|||
|
ret
|
|||
|
|
|||
|
AMDK7M: mov eax, 68 ; AthonXP-M
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0xC0010042
|
|||
|
int 0x40
|
|||
|
and eax, 0x1F
|
|||
|
mov cl, [athlonmcoef + eax]
|
|||
|
ret
|
|||
|
|
|||
|
noAMDK7:
|
|||
|
cmp byte [CPU_fam], 0xF
|
|||
|
jne AMD_Fusion
|
|||
|
mov eax, 0x80000007
|
|||
|
cpuid
|
|||
|
and edx, 6 ; voltage ID control & frequency ID control
|
|||
|
cmp edx, 6
|
|||
|
je AMDK8M
|
|||
|
mov eax, 68 ; Athon64
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0xC0010015
|
|||
|
int 0x40
|
|||
|
shr eax, 24
|
|||
|
and al, 0x3F
|
|||
|
shr al, 1
|
|||
|
add al, 4
|
|||
|
mov dl, 10
|
|||
|
mul dl
|
|||
|
mov cl, al
|
|||
|
ret
|
|||
|
|
|||
|
AMDK8M: mov eax, 68 ; Athon64-M
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0xC0010042
|
|||
|
int 0x40
|
|||
|
and al, 0x3F
|
|||
|
shr al, 1
|
|||
|
add al, 4
|
|||
|
mov dl, 10
|
|||
|
mul dl
|
|||
|
mov cl, al
|
|||
|
ret
|
|||
|
|
|||
|
AMD_Fusion:
|
|||
|
cmp byte [CPU_fam], 0x14
|
|||
|
jne unknownAMD
|
|||
|
mov eax, 68 ;
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0xC0010071
|
|||
|
int 0x40
|
|||
|
shr ebx, 17
|
|||
|
and ebx, 0x3F
|
|||
|
add bl, 16 ; Fmax = 100MHz * (edx[54:49] + 10h)
|
|||
|
shl bl, 3
|
|||
|
mov edx, ebx
|
|||
|
shl edx, 2
|
|||
|
add ebx, edx ;) that all was just to multiply ebx by 40
|
|||
|
and eax, 0x1ff
|
|||
|
mov dl, al
|
|||
|
and dl, 3 ; dl = 4*fractional part of the divisor
|
|||
|
shr eax, 4
|
|||
|
inc eax
|
|||
|
shl eax, 2
|
|||
|
or al, dl ; ax = 4 * divisor
|
|||
|
xchg eax, ebx
|
|||
|
div ebx
|
|||
|
mov cl, al
|
|||
|
ret
|
|||
|
|
|||
|
noAMD: cmp dword [Vendor + 8], 'ntel' ; Check for International Electronics CPU
|
|||
|
jne noIntel
|
|||
|
cmp byte[CPU_fam], 0x0F
|
|||
|
jne noIntelP4
|
|||
|
cmp byte [CPU_type], 6
|
|||
|
jne @f
|
|||
|
mov eax, 68 ; Pentium M
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x2A
|
|||
|
int 0x40
|
|||
|
shr eax, 22
|
|||
|
and eax, 0x1F
|
|||
|
mov dl, 10
|
|||
|
mul dl
|
|||
|
mov cl, al
|
|||
|
ret
|
|||
|
@@: cmp byte [CPU_mod], 2
|
|||
|
jae @f
|
|||
|
mov eax, 68 ; Pentium 4 / Xeon (model < 2) Willamete
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x2A
|
|||
|
int 0x40
|
|||
|
shr eax, 8
|
|||
|
and eax, 0x0F
|
|||
|
mov cl, [p4coef + eax]
|
|||
|
ret
|
|||
|
@@: mov eax, 68 ; Pentium 4 / Xeon (model >= 2) NorthWood
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x2C
|
|||
|
int 0x40
|
|||
|
shr eax, 24
|
|||
|
and eax, 0x1F
|
|||
|
mov dl, 10
|
|||
|
mul dl
|
|||
|
mov cl, al
|
|||
|
ret
|
|||
|
noIntelP4:
|
|||
|
cmp byte[CPU_fam], 6
|
|||
|
jne noIntelP6
|
|||
|
mov eax, 68 ; Pentium Pro / Pentium II / Pentium III
|
|||
|
mov ebx, 3
|
|||
|
mov edx, 0x2A
|
|||
|
int 0x40
|
|||
|
shr eax, 22
|
|||
|
test al, 0x20
|
|||
|
jz @f
|
|||
|
or al, 0x10
|
|||
|
@@: and eax, 0x1f
|
|||
|
|
|||
|
cmp byte[CPU_mod], 0x06 ; ? 7
|
|||
|
ja @f
|
|||
|
and al, 0x0f
|
|||
|
@@:
|
|||
|
mov cl, [coppercoeff + eax]
|
|||
|
cmp byte[CPU_mod], 0x0B
|
|||
|
jb @f
|
|||
|
mov cl, [tualatcoeff + eax]
|
|||
|
|
|||
|
cmp byte[CPU_mod], 0x0B
|
|||
|
je @f
|
|||
|
mov dl, 10 ; model 0x0C - 0x0F - Dothan / Yonah / Conroe / Merom
|
|||
|
mul dl
|
|||
|
mov cl, al
|
|||
|
|
|||
|
@@: ret
|
|||
|
|
|||
|
noIntel:
|
|||
|
noIntelP6:
|
|||
|
unknownAMD:
|
|||
|
ret
|
|||
|
|
|||
|
athloncoef db 110, 115, 120, 125, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 120
|
|||
|
db 190, 120, 200, 130, 135, 140, 210, 150, 220, 160, 165, 170, 180, 230, 240
|
|||
|
athlonmcoef: db 110, 115, 120, 125, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105
|
|||
|
db 30, 190, 40, 200, 130, 135, 14, 210, 150, 220, 160, 165, 170, 230, 240
|
|||
|
athloncoef3 db 45, 50, 40, 55, 25, 30, 60, 35
|
|||
|
p4coef db 160, 170, 180, 190, 200, 210, 220, 230, 80, 90, 100, 110, 120, 130, 140, 150 ; Pentium 4 (Willamete)
|
|||
|
coppercoeff db 50, 30, 40, 20, 55, 35, 45, 25, 35, 70, 80, 60, 20, 75, 15, 65, 90, 110, 120, 20, 95, 115, 85, 25, 35, 70, 80, 100, 20, 75, 15, 105
|
|||
|
tualatcoeff db 120, 35, 35, 40, 55, 35, 115, 35, 160, 70, 80, 60, 40, 75, 35, 65, 90, 110, 35, 35, 95, 35, 85, 35, 35, 35, 130, 100, 140, 35, 150, 105
|
|||
|
else
|
|||
|
display nl, 'Multiplier : no'
|
|||
|
ret
|
|||
|
end if
|
|||
|
;---------------------------------------------------------------------
|
|||
|
digit_len:
|
|||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 47
|
|||
|
; ecx - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; ebx - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 65536
|
|||
|
pusha
|
|||
|
xor ebx, ebx
|
|||
|
mov eax, ecx
|
|||
|
mov esi, 10
|
|||
|
@@: xor edx, edx
|
|||
|
inc ebx
|
|||
|
div esi
|
|||
|
test eax, eax
|
|||
|
jnz @b
|
|||
|
mov [tdl], ebx
|
|||
|
popa
|
|||
|
mov ebx, [tdl]
|
|||
|
shl ebx, 16
|
|||
|
ret
|
|||
|
uglobal
|
|||
|
tdl dd 0
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
;--------------------------------------------------------------------
|
|||
|
ftoa:
|
|||
|
; esi - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
; Data_String - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
pusha
|
|||
|
mov edi, Data_String
|
|||
|
fninit
|
|||
|
fld dword [esi]
|
|||
|
fmul dword [MConst]
|
|||
|
fbstp [Data_BCD]
|
|||
|
mov ax, word[Data_BCD + 8]
|
|||
|
cmp ax, 0xFFFF
|
|||
|
je @@Overflow
|
|||
|
mov al, byte[Data_BCD + 9]
|
|||
|
and al, al
|
|||
|
jz @@NoSign
|
|||
|
mov AL,'-'
|
|||
|
stosb
|
|||
|
@@NoSign:
|
|||
|
mov ebx, 8
|
|||
|
mov ecx, 9
|
|||
|
mov edx, 18 - 2 ; 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
@@NextPair:
|
|||
|
mov al, byte[Data_BCD + ebx]
|
|||
|
mov AH,AL
|
|||
|
shr AL,4
|
|||
|
add AL,'0'
|
|||
|
stosb
|
|||
|
dec edx
|
|||
|
jnz @@N0
|
|||
|
mov AL,'.'
|
|||
|
stosb
|
|||
|
@@N0: mov AL,AH
|
|||
|
and AL,0Fh
|
|||
|
add AL,'0'
|
|||
|
stosb
|
|||
|
dec edx
|
|||
|
jnz @@N1
|
|||
|
mov AL,'.'
|
|||
|
stosb
|
|||
|
@@N1: dec ebx
|
|||
|
loop @@NextPair
|
|||
|
xor al, al
|
|||
|
stosb
|
|||
|
mov edi, Data_String
|
|||
|
mov esi, Data_String
|
|||
|
cmp byte[esi], '-'
|
|||
|
jne @@N2
|
|||
|
inc esi
|
|||
|
inc edi
|
|||
|
@@N2: mov ecx, 18+1+1
|
|||
|
@@N3: cmp byte[esi], '0'
|
|||
|
jne @@N4
|
|||
|
inc esi
|
|||
|
loop @@N3
|
|||
|
jmp @@Error
|
|||
|
@@N4: rep movsb
|
|||
|
jmp @@End
|
|||
|
@@Overflow:
|
|||
|
@@Error:mov eax, 'ERR'
|
|||
|
stosd
|
|||
|
@@End: popa
|
|||
|
ret
|
|||
|
MConst: dd 1.0E2 ; 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
uglobal
|
|||
|
Data_BCD: DT ?
|
|||
|
Data_String: times 20 db 0 ; ASCIIZ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
endg
|
|||
|
;--------------------------------------------------------------------
|
|||
|
ReservePorts:
|
|||
|
; In : ecx - first port, edx - last port
|
|||
|
; Out : CF = 1 if error
|
|||
|
pusha
|
|||
|
mov eax, 46
|
|||
|
xor ebx, ebx
|
|||
|
int 0x40
|
|||
|
clc
|
|||
|
test eax, eax
|
|||
|
jz @f
|
|||
|
stc
|
|||
|
@@: popa
|
|||
|
ret
|
|||
|
|
|||
|
FreePorts:
|
|||
|
; In : ecx - first port, edx - last port
|
|||
|
pusha
|
|||
|
mov eax, 46 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x295 <EFBFBD> 0x296 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
xor ebx, ebx
|
|||
|
inc ebx
|
|||
|
int 0x40
|
|||
|
popa
|
|||
|
ret
|