kolibrios/programs/system/battery/bi.asm
Yogev Ezra eed73247e9 Add sources of APM driver (by Staper) and battery driver (by Gluk)
git-svn-id: svn://kolibrios.org@1980 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-06-25 15:19:38 +00:00

522 lines
8.0 KiB
NASM

; 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