14d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// APM BIOS support for the Bochs BIOS 24d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Copyright (C) 2004 Fabrice Bellard 34d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 44d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Debugging extensions, 16-bit interface and extended power options 54d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Copyright (C) 2005 Struan Bartlett 64d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 74d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is free software; you can redistribute it and/or 84d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// modify it under the terms of the GNU Lesser General Public 94d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License as published by the Free Software Foundation; either 104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// version 2 of the License, or (at your option) any later version. 114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is distributed in the hope that it will be useful, 134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// but WITHOUT ANY WARRANTY; without even the implied warranty of 144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Lesser General Public License for more details. 164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// You should have received a copy of the GNU Lesser General Public 184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License along with this library; if not, write to the Free Software 194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_REAL) 224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define APMSYM(s) apmreal_ ## s 234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#elif defined(APM_PROT16) 244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define APMSYM(s) apm16_ ## s 254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#elif defined(APM_PROT32) 264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define APMSYM(s) apm32_ ## s 274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#error unsupported APM mode 294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 314d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(out_str): 324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push eax 334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ebx 344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, eax 354d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(out_str1): 364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SEG CS 374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, byte ptr [bx] 384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0 394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je APMSYM(out_str2) 404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc ebx 424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(out_str1) 434d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(out_str2): 444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ebx 454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop eax 464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 484d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_poweroff_str): 494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .ascii "Shutdown" 504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima db 0 514d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_suspend_str): 524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .ascii "Suspend" 534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima db 0 544d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_standby_str): 554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .ascii "Standby" 564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima db 0 574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if DEBUG_APM 594d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_str): 604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push edx 614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #INFO_PORT 624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(out_str) 634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop edx 644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; print the hex number in eax 674d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_num): 684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push eax 694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ebx 704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ecx 714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push edx 724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ecx, eax 734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #8 744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #INFO_PORT 754d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_num1): 764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, ecx 774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr eax, #28 784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add al, #0x30 794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x39 804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jbe APMSYM(put_num2) 814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add al, #0x27 824d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_num2): 834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl ecx, #4 854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dec bx 864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(put_num1) 874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop edx 884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ecx 894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ebx 904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop eax 914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 934d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_reg): 944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr eax, #8 964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr eax, #8 984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr eax, #8 1004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 1014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax,ebx 1034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_num) 1044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x3b 1064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx,al 1074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 1084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx,al 1094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 1104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1114d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(put_regs): 1124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push eax 1134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push edx 1144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ebx 1154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #INFO_PORT 1164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, eax 1184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d584145 // 'EAX=' 1194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ebx 1214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ebx 1224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d584245 // 'EBX=' 1234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, ecx 1254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d584345 // 'ECX=' 1264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, edx 1284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d584445 // 'EDX=' 1294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, esi 1314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d495345 // 'ESI=' 1324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, edi 1344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x3d494445 // 'EDI=' 1354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_reg) 1364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x0a 1384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx, al 1394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ebx 1404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop edx 1414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop eax 1424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 1434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_PROT32) 1464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_apm32_entry: 1474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_PROT16) 1494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_apm16_entry: 1504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pushf 1524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_REAL) 1544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_apmreal_entry: 1554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if DEBUG_APM 1584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(put_regs) 1594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_REAL) 1624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 1634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM installation check 1644d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(00): 1654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x00 1664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(01) 1674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, #1 // APM major version 1694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #2 // APM minor version 1704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, #0x50 // 'P' 1724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0x4d // 'M' 1734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // bit 0 : 16 bit interface supported 1754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // bit 1 : 32 bit interface supported 1764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, #0x3 1774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 1784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 1804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM real mode interface connect 1814d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(01): 1824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x01 1834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(02) 1844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 1854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 1874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM 16 bit protected mode interface connect 1884d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(02): 1894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x02 1904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(03) 1914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #_apm16_entry 1934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0xf000 // 16 bit code segment base 1954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si, #0xfff0 // 16 bit code segment size 1964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, #0xf000 // data segment address 1974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, #0xfff0 // data segment length 1984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 1994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM 32 bit protected mode interface connect 2024d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(03): 2034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x03 2044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(04) 2054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0xf000 // 32 bit code segment base 2064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ebx, #_apm32_entry 2074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, #0xf000 // 16 bit code segment base 2084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // 32 bit code segment size (low 16 bits) 2094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // 16 bit code segment size (high 16 bits) 2104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov esi, #0xfff0fff0 2114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0xf000 // data segment address 2124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, #0xfff0 // data segment length 2134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM interface disconnect 2184d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(04): 2194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x04 2204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(05) 2214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM cpu idle 2254d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(05): 2264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x05 2274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(07) 2284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima sti 2294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima hlt 2304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM Set Power State 2344d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07): 2354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x07 2364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(08) 2374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bx, #1 2394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(ok) 2404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #3 2424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je APMSYM(07_poweroff) 2434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #2 2454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je APMSYM(07_suspend) 2464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #1 2484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je APMSYM(07_standby) 2494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(ok) 2514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_poweroff): 2534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // send power off event to emulator 2544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cli 2554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x8900 2564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #APMSYM(07_poweroff_str) 2574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(out_str) 2584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2594d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_1): 2604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima hlt 2614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(07_1) 2624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2634d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_suspend): 2644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push edx 2654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x8900 2664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #APMSYM(07_suspend_str) 2674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(out_str) 2684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop edx 2694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2714d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(07_standby): 2724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push edx 2734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x8900 2744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #APMSYM(07_standby_str) 2754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call APMSYM(out_str) 2764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop edx 2774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM Enable / Disable 2814d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(08): 2824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x08 2834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(0a) 2844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 2864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 2884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; Get Power Status 2894d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(0a): 2904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x0a 2914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(0b) 2924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, #0x01 // on line 2934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // mov bh, #0x02 // battery 2944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0xff // unknown battery status 2954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // mov bl, #0x03 // charging 2964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ch, #0x80 // no system battery 2974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // mov ch, #0x8 // charging 2984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, #0xff // unknown remaining time 2994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // mov cl, #50 3004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0xffff // unknown remaining time 3014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si, #0 // zero battery 3024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // mov si, #1 // one battery 3034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 3044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 3064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; Get PM Event 3074d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(0b): 3084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x0b 3094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(0e) 3104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, #0x80 // no event pending 3114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(error) 3124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 3144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM Driver Version 3154d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(0e): 3164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x0e 3174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(0f) 3184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, #1 3204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #2 3214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 3234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 3254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM Engage / Disengage 3264d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(0f): 3274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x0f 3284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(10) 3294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 3314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 3334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; APM Get Capabilities 3344d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(10): 3354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x10 3364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne APMSYM(unimplemented) 3374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0 3394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, #0 3404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp APMSYM(ok) 3424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;----------------- 3444d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(ok): 3454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima popf 3464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima clc 3474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_REAL) 3484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp iret_modify_cf 3494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 3504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima retf 3514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 3524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(unimplemented): 3534d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaAPMSYM(error): 3544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima popf 3554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima stc 3564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(APM_REAL) 3574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp iret_modify_cf 3584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 3594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima retf 3604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 3614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#undef APM_PROT32 3634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#undef APM_PROT16 3644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#undef APM_REAL 3654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#undef APMSYM 366