Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1979 → Rev 1980

/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: