037099f50d
git-svn-id: svn://kolibrios.org@2288 a494cfbc-eb01-0410-851d-a64ba20cac60
344 lines
6.6 KiB
NASM
344 lines
6.6 KiB
NASM
; 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
|
||
|
||
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
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:
|