0,0 → 1,522 |
; Battery Indicator v0.ALPHA by Gluk |
include "macros.inc" |
MEOS_APP_START |
CODE |
|
init: |
mov cl,48d ; setting waitingmask |
mov edx,0x110 |
mcall 66,4 |
|
mov word[vminor],0 |
mov dx,0x5300 |
xor ebx,ebx |
mov eax,49 |
jnc @f |
mov word[vminor],ax |
@@: |
mov dx,0x5308 |
mov bx,1 |
mov cx,bx |
mov eax,49 |
int 0x40 |
mov dx,0x530E |
xor bx,bx |
mov cx,0x0102 |
mov eax,49 |
int 0x40 |
mov dx,0x530D |
mov bx,1 |
mov cx,bx |
mov eax,49 |
int 0x40 |
mov dx,0x530F |
mov bx,1 |
mov cx,bx |
mov eax,49 |
int 0x40 |
xor ebx,ebx |
mov bx,[bid] ; find a bid |
dec ebx |
@@: |
mov eax,49 |
mov dx,530Ah |
inc ebx |
int 0x40 |
jc @b |
;cmp cl,0xff |
;je @b |
finded: |
mov [bid],bx |
;mcall 49,0,0,5310h |
|
mcall 9,streaminfo,-1 ; get process data |
mov ecx,dword[streaminfo+30d] |
mcall 18,21 |
mov [slotid],eax |
|
mov eax,48 ; get system colors |
mov ebx,3 |
mov ecx,sc |
mov edx,sizeof.system_colors |
mcall |
initend: |
|
redraw: |
call draw_window |
|
wait_event: ; main cycle |
call redata |
mov ebx,[waiting] |
mcall 23 |
cmp eax,0 |
jz wait_event |
dec eax |
jz redraw |
dec eax |
jz key |
dec eax |
jz button |
jmp wait_event |
|
button: |
mcall 17 |
@@: ;1: |
dec ah |
;jnz @f |
; or eax,-1 |
; mcall |
;@@: ;2 |
dec ah |
jnz @f |
mov eax,dword[whatview] |
mov ebx,views_end-3 |
add eax,4 |
cmp eax,ebx |
jb allok1 |
mov eax,views_start |
allok1: |
mov [whatview],eax |
mov eax,[eax] |
mov [viewer],eax |
@@: |
jmp wait_event |
|
redata: |
call getdata |
mov al,[window] |
cmp al,0 |
jz @f |
call regraph |
call rebutton |
@@: |
ret |
|
key: ; key event handler |
mov al,2 ; get key code |
mcall |
cmp al,2 |
jne wait_event |
call rewindow |
jmp wait_event |
|
draw_window: |
mov eax,12 |
mov ebx,1 |
mcall |
|
mov al,byte[window] |
cmp al,0 |
jz nowindow |
|
mcall 48,5 |
sub eax,[winotstx] |
sub eax,[winsizex] |
shl eax,16 |
sub ebx,[winotsty] |
sub ebx,[winsizey] |
shl ebx,16 |
mov ecx,ebx |
mov ebx,eax |
|
xor eax,eax ; create and draw the window |
add ebx,dword[winsizex] |
dec ebx ; (window_c)*65536+(window_s) |
add ecx,dword[winsizey] |
dec ecx |
mov edx,[sc.work] ; work area color |
or edx, 0x61000000 ; & window type 1 |
int 0x40 |
|
mov eax,13d ;printing pryamougolniks |
push eax ;pipka out |
mov eax,[winsizex] |
xor edx,edx |
mov ebx,3 |
div ebx |
mov ebx,eax |
; pusha |
;mov [nowpoint],0 |
;in: ebx - piplenght |
; mov eax,0 |
;mov edi, nowpoint |
; add edi,winform |
; mov ecx,ebx |
; rep stosb |
; mov eax,1 |
;mov edi, nowpoint |
; add edi,winform |
; mov ecx,ebx |
; rep stosb |
; mov eax,0 |
;mov edi, nowpoint |
; add edi,winform |
; mov ecx,ebx |
; rep stosb |
; popa |
mov ecx,ebx |
shl ebx,16 |
pop eax |
add ebx,ecx |
mov ecx,[winsizey] |
shr ecx,4 ;div 16 ;) |
xor edx,edx |
int 0x40 |
|
add ebx,65536-2 ;pipka in |
add ecx,65536-1 |
mov edx,[sc] |
int 0x40 |
|
mov ebx,[winsizex] ;korpus out |
mov ecx,[winsizey] |
shr ecx,4 |
mov edx,ecx |
shl ecx,16 |
add ecx,[winsizey] |
sub ecx,edx |
xor edx,edx |
int 0x40 |
|
add ebx,65536-2 ;korpus in |
add ecx,65536-2 |
mov edx,[sc] |
int 0x40 |
|
mov edx,[winborts] |
mov edi,edx |
shl edx,16 |
add ebx,edx |
sub ebx,edi |
sub ebx,edi ;black contur |
add ecx,65536-3 |
sub ecx,[winknopy] |
xor edx,edx |
int 0x40 |
|
add ebx,65536-2 ;working area |
add ecx,65536-2 |
mov edx,[sc.work] |
int 0x40 |
mov [winworkx],ebx |
mov [winworky],ecx |
|
call redata |
nowindow: |
mov eax,12 ;finish drawing |
mov ebx,2 |
int 0x40 |
ret |
|
rebutton: |
mov eax,8 |
mov edx,0x80000002 |
int 0x40 |
|
mov ebx,[winsizex] |
add ebx,65536-3 |
mov edi,[winknopy] |
mov ecx,[winsizey] |
sub ecx,edi |
sub ecx,2 |
shl ecx,16 |
add ecx,edi |
mov edx,0x00000002 |
mov esi,[sc.work_button] |
int 0x40 |
|
mov [wintextx],3 |
sub edi,[winfonty] |
shr edi,1 |
mov ebx,edi |
add ebx,[winsizey] |
sub ebx,[winknopy] |
mov [wintexty],ebx |
call dword[viewer] |
ret |
|
|
rewindow: |
mov al,byte[window] |
cmp al,1 |
jne @f |
mcall 67,1,1,0,0 |
mov byte[window],0 |
mcall 40,2 |
jmp endrew |
@@: |
mcall 48,5 |
sub eax,[winotstx] |
sub eax,[winsizex] |
sub ebx,[winotsty] |
sub ebx,[winsizey] |
mov ecx,ebx |
mov ebx,eax |
|
mov eax,67 |
mov edx,[winsizex] |
dec edx |
mov esi,[winsizey] |
dec esi |
int 0x40 |
|
mov byte[window],1 |
mov ecx,[slotid] |
mcall 18,3 |
|
mcall 40,7 |
endrew: |
call draw_window |
ret |
|
regraph: |
mov eax,13 |
mov ebx,[winworkx] ;working area |
mov ecx,[winworky] |
mov edx,[sc.work] |
int 0x40 |
|
mov ebx,[winworky] |
shl ebx,16 |
shr ebx,16 |
sub ebx,[wingotst] |
sub ebx,[wingotst] |
mov eax,ebx |
shr ebx,3 ;div 8 ;) |
shl eax,29 |
shr eax,32 ;ostatok |
add eax,[wingotst] |
cmp eax,ebx |
jb @f |
inc ebx |
@@: |
mov [winlines],ebx |
mov ecx,[delenia] |
@@: |
push ecx |
mov edi,ecx |
|
mov edx,[wingotst] |
mov ebx,[winworkx] |
shl edx,16 |
add ebx,edx |
shr edx,16 |
sub ebx,edx |
sub ebx,edx |
|
mov ecx,[winworky] |
mov eax,[winworky] |
shl eax,16 |
add ecx,eax |
|
push edx |
mov eax,[winlines] |
mul edi |
pop edx |
add edx,eax |
|
shl edx,16 |
sub ecx,edx |
|
shr ecx,16 |
inc ecx |
shl ecx,16 |
add ecx,[winlines] |
sub ecx,1 ;promezhutki |
mov edx,[sc.work_graph] |
mov eax,13 |
int 0x40 |
|
pop ecx |
loop @b |
endreg: |
ret |
|
getdata: |
xor ecx,ecx |
xor edx,edx |
|
;HERE YOU MAY GET A PERCENTAGE AND REMAINING TIME FOR BATTERY UNIT [bid], AND PUT THEY INTO [gotperc] AND [gottime] |
mov bx,[bid] |
mov eax,49 |
mov dx,530Ah |
int 0x40 |
mov [gotperc],cl |
mov [gottime],dx |
;/HERE |
|
xor eax,eax |
mov al,[gotperc] |
cmp al,0 |
jne @f |
mov [delenia],1 |
ret |
@@: |
cmp al,100 |
jb @f |
mov [delenia],8 |
ret |
@@: |
shl eax,3 |
mov ebx,100 |
xor edx,edx |
div ebx |
inc eax |
mov [delenia],eax |
ret |
|
viewers: |
time: |
xor edx,edx |
mov dx,[gottime] |
cmp dx,0xffff |
jne @f |
mov eax,4 |
mov ebx,[wintextx] |
shl ebx,16 |
add ebx,[wintexty] |
mov ecx,0x00000000 |
mov edx,simbols |
mov esi,3 |
add ecx,[sc.work_button_text] |
int 0x40 |
ret |
@@: |
shl edx,17 |
shr edx,31 |
mov eax,4 |
mov ebx,[wintextx] |
add ebx,2*8 |
shl ebx,16 |
add ebx,[wintexty] |
mov ecx,0x00000000 |
add edx,simbols |
mov esi,1 |
add ecx,[sc.work_button_text] |
int 0x40 |
;12345678901234567890123456789012 |
mov eax,47 |
mov bl,2 ;cifr |
mov bh,0 |
shl ebx,16 |
mov bl,0 ;ecx is chislo |
mov bh,0 |
xor ecx,ecx |
mov cx,[gottime] |
shl ecx,18 |
shr ecx,18 |
mov edx,[wintextx] |
shl edx,16 |
add edx,[wintexty] |
mov esi,0x10000000 |
add esi,[sc.work_button_text] |
int 0x40 |
ret |
percent: |
mov dl,[gotperc] |
cmp dl,0xff |
jne @f |
mov eax,4 |
mov ebx,[wintextx] |
shl ebx,16 |
add ebx,[wintexty] |
mov ecx,0x00000000 |
mov edx,simbols |
mov esi,4 |
add ecx,[sc.work_button_text] |
int 0x40 |
ret |
@@: |
mov eax,4 |
mov ebx,[wintextx] |
add ebx,3*8 |
shl ebx,16 |
add ebx,[wintexty] |
mov ecx,0x00000000 |
mov edx,simbols |
add edx,3 |
mov esi,1 |
add ecx,[sc.work_button_text] |
int 0x40 |
|
mov eax,47 |
mov bl,3 ;cifr |
mov bh,0 |
shl ebx,16 |
mov bl,0 ;ecx is chislo |
mov bh,0 |
xor ecx,ecx |
mov cl,[gotperc] |
mov edx,[wintextx] |
shl edx,16 |
add edx,[wintexty] |
mov esi,0x10000000 |
add esi,[sc.work_button_text] |
int 0x40 |
ret |
; <--- initialised data ---> |
DATA |
|
bid dw 8000h |
|
viewer dd percent |
whatview dd views_start |
views_start: |
dd percent |
dd time |
views_end: |
|
simbols db 'smh%??m???%' |
|
waiting dd 1000 |
watchings: |
window db 1 |
winotstx dd 7 |
winotsty dd 7 |
winsizex dd 48 |
winsizey dd 64 |
winborts dd 1 |
winfonty dd 9 |
winknopy dd 10 |
wingotst dd 2 |
; <--- uninitialised data ---> |
UDATA |
vminor dw ? |
sc system_colors |
streaminfo rb 1024 |
winform rb 1024 |
slotid dd ? |
|
gotperc db ? |
gottime dw ? |
delenia dd ? |
|
uwatchings: |
winhomex dd ? |
winhomey dd ? |
winworkx dd ? ;cx*65536+sx |
winworky dd ? ;cy*65536+sy |
winlines dd ? |
wintextx dd ? |
wintexty dd ? |
MEOS_APP_END |