aboutsummaryrefslogtreecommitdiffstats
path: root/modules/poweroff.asm
blob: f4f19a2fcfd95d221266b3580cf77a067849cdb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
; ****************************************************************************
;
;  poweroff.asm
;
;   Copyright 2009 Sebastian Herbszt
;
;  APM poweroff module.
;
;  This program is free software; you can redistribute it and/or modify
;  it under the terms of the GNU General Public License as published by
;  the Free Software Foundation, Inc., 53 Temple Place Ste 330,
;  Boston MA 02111-1307, USA; either version 2 of the License, or
;  (at your option) any later version; incorporated herein by reference.
;
; ****************************************************************************

		absolute 0
pspInt20:	resw 1
pspNextP:	resw 1
		resb 124
pspCmdLen:	resb 1
pspCmdArg:	resb 127

		section .text
		org	0x100

_start:
		mov ax,5300h	; APM Installation Check (00h)
		xor bx,bx	; APM BIOS (0000h)
		int 15h
		jnc check_sig

		mov bx, msg_notpresent
		jmp error

check_sig:
		cmp bx,504Dh	; signature 'PM'
		je check_ver

		mov bx, msg_notpresent
		jmp error

check_ver:
		cmp ax,0101h	; Need version 1.1+
		jae check_state

		mov bx, msg_notsup
		jmp error

check_state:
		test cx,8	; bit 3 APM BIOS Power Management disabled
		jz connect

		mov bx, msg_pmdisabled
		jmp error

connect:
		mov ax,5301h	; APM Real Mode Interface Connect (01h)
		xor bx,bx	; APM BIOS (0000h)
		int 15h
		jnc connect_ok

		mov bx, msg_connect
		jmp error

connect_ok:
		mov ax,530Eh	; APM Driver Version (0Eh)
		xor bx,bx	; APM BIOS (0000h)
		mov cx,0101h	; APM Driver version 1.1
		int 15h
		jnc apm0101_check

		mov bx, msg_notsup
		jmp error

apm0101_check:
		cmp cx,0101h	; APM Connection version
		jae apm0101_ok

		mov bx, msg_notsup
		jmp error

apm0101_ok:
		mov ax,5307h	; Set Power State (07h)
		mov bx,0001h	; All devices power managed by the APM BIOS
		mov cx,0003h	; Power state off
		int 15h
		jnc off

		mov bx, msg_failed

error:
		mov ax,2
		int 22h
off:
		ret

msg_notpresent:	db 'APM not present.',0dh,0ah,0
msg_notsup:	db 'APM 1.1+ not supported.',0dh,0ah,0
msg_pmdisabled:	db 'Power management disabled.',0dh,0ah,0
msg_connect:	db 'APM RM interface connect failed.',0dh,0ah,0
msg_failed:	db 'Power off failed.',0dh,0ah,0