forked from KolibriOS/kolibrios
Add sources of APM driver (by Staper) and battery driver (by Gluk)
git-svn-id: svn://kolibrios.org@1980 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
295
kernel/trunk/drivers/apm.asm
Normal file
295
kernel/trunk/drivers/apm.asm
Normal file
@@ -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
|
||||
|
||||
|
||||
; <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:
|
Reference in New Issue
Block a user