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