diff --git a/kernel/trunk/drivers/apm.asm b/kernel/trunk/drivers/apm.asm new file mode 100644 index 0000000000..060d9fb93a --- /dev/null +++ b/kernel/trunk/drivers/apm.asm @@ -0,0 +1,295 @@ +; 11.09.2009 staper@inbox.ru +; see kernel\docs\apm.txt + +use32 + + org 0x0 + + db 'MENUET01' + dd 0x1 + dd START + dd I_END + dd (I_END+100) and not 3 + dd (I_END+100) and not 3 + dd 0x0,0x0 + +include 'macros.inc' + +START: + mcall 40,0x7 + + mcall 49,0x0001,0x0001,0x5308 ;CX = FFFFh APM v1.0 +; mcall 49,0x0001,0x0001,0x530d +; mcall 49,0x0001,0x0001,0x530f + +; mcall 49,0x0000,,0x5310 ;bl - number of batteries +redraw: + mcall 49,0x0000,,0x530c + dec cl + jz still + mcall 49,0x0001,0x0001,0x5308 + mcall 49,0x01ff,,0x530c + test cl,cl + jz @f + mcall 49,0x0000,0x0001,0x530d + mcall 49,0x0000,0x0000,0x5307 + mcall 49,0x0000,0x0001,0x5308 + @@: + mcall 12,1 + mcall 0,100*65536+235,100*65536+90,0x34ffffff,0x000000,title + mcall 49,0x0000,,0x5300 + jnc @f + mcall 4,10*65536+3,0x80000000,text.4 + bts [flags],1 + jmp .end + @@: cmp al,0 + jne @f + mov edx,text.1 + jmp .0 + @@: cmp al,1 + jne @f + mov edx,text.2 + jmp .0 + @@: mov edx,text.3 + .0: push edx + mcall 4,169*65536+3,0x80dddddd,text.0 + pop edx + add ebx,47*65536 + mcall + mcall 49,0x0001,,0x530a + jc .error + push si dx cx bx ;time of battery life, b. flag, b. status, AC line status + + ;AC line status + cmp bh,0 + jne @f + mov edx,text.01 + jmp .1 + @@: cmp bh,1 + jne @f + mov edx,text.02 + jmp .1 + @@: cmp bh,2 + jne @f + mov edx,text.03 + jmp .1 + @@: mov edx,text.04 + .1: push edx + mcall 4,10*65536+10,0x80000000,text.00 + pop edx + mcall ,100*65536+10,;0x80000000 + + ;battery status + pop bx + cmp bl,0 + jne @f + mov edx,text.11 + jmp .2 + @@: cmp bl,1 + jne @f + mov edx,text.12 + jmp .2 + @@: cmp bl,2 + jne @f + mov edx,text.13 + jmp .2 + @@: cmp bl,3 + jne @f + mov edx,text.14 + jmp .2 + @@: mov edx,text.04 + .2: push edx + mcall 4,10*65536+20,0x80000000,text.10 + pop edx + mcall ,100*65536+20, + + ;battery life, percentage and minutes/seconds + mcall ,10*65536+30,,text.20 + pop cx + cmp cl,0xff + jne @f + mcall ,100*65536+30,0x80000000,text.04 + pop eax + jmp .end + @@: shl ecx,24 + shr ecx,24 + mcall 47,0x80030000,,100*65536+30,0x347636 + .3: mcall 4,115*65536+30,0x80000000,text.15 + mov dx,[esp] + shl edx,17 + shr edx,17 + mov ecx,edx + mcall 47,0x80030000,,140*65536+30 + pop cx + mov edx,text.21 + bt cx,15 + jc @f + mov edx,text.22 + @@: mcall 4,160*65536+30,0x80000000 + pop si + .error: + .end: + ;buttons + mcall 8,148*65536+16,45*65536+15,3,0x00677ab0 + mcall ,166*65536+16,,4, + mcall ,184*65536+16,,5, + mcall ,202*65536+16,,6, + bt [flags],1 + jc @f + mcall ,65*65536+45,,2, + @@: mcall 4,10*65536+50,0x80564242,text.30 + mcall 12,2 + +still: +; mcall 10 + mcall 23,12000 + test eax,eax + jz redraw + + dec al + jz redraw + dec al + jz key + dec al + jz button + jmp still + + + + +key: + mcall 2 + jmp still + +button: + mcall 17 + cmp ah,1 + jne @f + mcall -1 + + @@: cmp ah,2 + jne @f + mcall 5,50 + mcall 49,0x0001,0x0001,0x5307 + jmp redraw + + @@: cmp ah,4 + jg @f + mov edx,0x01f7 ;primary chan. + call reserv_ports + jc redraw + sub bh,3 + .1: call set_drive + btc [flags],2 + jnc .2 + call device_reset + jmp .3 + .2: call standby_hdd + .3: call free_ports + jmp redraw + + @@: cmp ah,6 + jg redraw + mov edx,0x0177 ;secondary chan. + call reserv_ports + jc redraw + sub bh,5 + jmp .1 + +set_drive: + dec dx + in al,dx + test bh,bh + jnz @f + btr ax,4 +.1: out dx,al + inc dx + ret +@@: bts ax,4 + jmp .1 + + +standby_hdd: +; 94h E0h nondata standby immediate +; 95h E1h nondata idle immediate +; 96h E2h nondata standby +; 97h E3h nondata idle +; 98h E5h nondata check power mode +; 99h E6h nondata set sleep mode + xor ecx,ecx + @@: in al,dx + dec cx + jz @f + bt ax,6 + jnc @b + mov al,0x96 + out dx,al + mov al,0xe2 + out dx,al +@@: +ret + +reserv_ports: + mov ecx,edx + dec ecx + push ax + mcall 46,0 + test al,al + jnz @f + pop bx + clc + ret +@@: pop bx + stc +ret + +device_reset: + xor ecx,ecx + @@: in al,dx + dec cx + jz @f + bt ax,6 + jnc @b + mov al,0x10 + out dx,al +@@: +ret + +free_ports: + mov ecx,edx + dec ecx + mcall 46,1 +ret + + +; +title db '',0 +flags dw 0 + +text: +.0: db 'APM v.1.',0 +.1: db '0',0 +.2: db '1',0 +.3: db '2',0 +.4: db 'APM not supported',0 + +.00: db 'power status:',0 +.01: db 'off-line',0 +.02: db 'on-line',0 +.03: db 'on backup power',0 +.04: db 'unknown',0 + +.10: db 'battery flag:',0 +.11: db 'high',0 +.12: db 'low',0 +.13: db 'critical',0 +.14: db 'charging',0 +.15: db ' % ,',0 + +.20: db 'battery life:',0 +.21: db 'min',0 +.22: db 'sec',0 + +.30: db 'STAND-BY: SYSTEM HDD: 0 1 2 3',0 + +I_END: diff --git a/programs/system/battery/bi.asm b/programs/system/battery/bi.asm new file mode 100644 index 0000000000..2f37a58f59 --- /dev/null +++ b/programs/system/battery/bi.asm @@ -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 \ No newline at end of file