1 // Basic support for apmbios callbacks.
3 // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
4 // Copyright (C) 2005 Struan Bartlett
5 // Copyright (C) 2004 Fabrice Bellard
7 // This file may be distributed under the terms of the GNU GPLv3 license.
9 #include "farptr.h" // GET_VAR
10 #include "biosvar.h" // struct bregs
11 #include "ioport.h" // outb
12 #include "util.h" // irq_enable
15 out_str(const char *str_cs)
19 u8 c = GET_VAR(CS, *s);
27 // APM installation check
29 handle_155300(struct bregs *regs)
31 regs->ah = 1; // APM major version
32 regs->al = 2; // APM minor version
35 // bit 0 : 16 bit interface supported
36 // bit 1 : 32 bit interface supported
41 // APM real mode interface connect
43 handle_155301(struct bregs *regs)
48 // Assembler entry points defined in romlayout.S
49 extern void apm16protected_entry();
50 extern void apm32protected_entry();
52 // APM 16 bit protected mode interface connect
54 handle_155302(struct bregs *regs)
56 regs->bx = (u32)apm16protected_entry;
57 regs->ax = SEG_BIOS; // 16 bit code segment base
58 regs->si = 0xfff0; // 16 bit code segment size
59 regs->cx = SEG_BIOS; // data segment address
60 regs->di = 0xfff0; // data segment length
64 // APM 32 bit protected mode interface connect
66 handle_155303(struct bregs *regs)
68 regs->ax = SEG_BIOS; // 32 bit code segment base
69 regs->ebx = (u32)apm32protected_entry;
70 regs->cx = SEG_BIOS; // 16 bit code segment base
71 // 32 bit code segment size (low 16 bits)
72 // 16 bit code segment size (high 16 bits)
73 regs->esi = 0xfff0fff0;
74 regs->dx = SEG_BIOS; // data segment address
75 regs->di = 0xfff0; // data segment length
79 // APM interface disconnect
81 handle_155304(struct bregs *regs)
88 handle_155305(struct bregs *regs)
95 // APM Set Power State
97 handle_155307(struct bregs *regs)
121 handle_155308(struct bregs *regs)
128 handle_15530a(struct bregs *regs)
130 regs->bh = 0x01; // on line
131 regs->bl = 0xff; // unknown battery status
132 regs->ch = 0x80; // no system battery
133 regs->cl = 0xff; // unknown remaining time
134 regs->dx = 0xffff; // unknown remaining time
135 regs->si = 0x00; // zero battery
141 handle_15530b(struct bregs *regs)
144 regs->ah = 0x80; // no event pending
147 // APM Driver Version
149 handle_15530e(struct bregs *regs)
156 // APM Engage / Disengage
158 handle_15530f(struct bregs *regs)
163 // APM Get Capabilities
165 handle_155310(struct bregs *regs)
173 handle_1553XX(struct bregs *regs)
179 handle_1553(struct bregs *regs)
182 case 0x00: handle_155300(regs); break;
183 case 0x01: handle_155301(regs); break;
184 case 0x02: handle_155302(regs); break;
185 case 0x03: handle_155303(regs); break;
186 case 0x04: handle_155304(regs); break;
187 case 0x05: handle_155305(regs); break;
188 case 0x07: handle_155307(regs); break;
189 case 0x08: handle_155308(regs); break;
190 case 0x0a: handle_15530a(regs); break;
191 case 0x0b: handle_15530b(regs); break;
192 case 0x0e: handle_15530e(regs); break;
193 case 0x0f: handle_15530f(regs); break;
194 case 0x10: handle_155310(regs); break;
195 default: handle_1553XX(regs); break;