0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; Copyright (C) 2006-2012 Oracle Corporation
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; This file is part of VirtualBox Open Source Edition (OSE), as
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; available from http://www.virtualbox.org. This file is free software;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; you can redistribute it and/or modify it under the terms of the GNU
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; General Public License (GPL) as published by the Free Software
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; Foundation, in version 2 as it comes in the "COPYING" file of the
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; --------------------------------------------------------------------
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; Protected-mode APM implementation.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; 16-bit protected mode APM entry point
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync_TEXT segment public 'CODE'
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncextern _apm_function:near ; implemented in C code
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncpublic apm_pm16_entry
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync.286
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; APM function dispatch table
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_disp:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_disconnect ; 04h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_idle ; 05h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_busy ; 06h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_set_state ; 07h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_enable ; 08h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_restore ; 09h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_get_status ; 0Ah
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_get_event ; 0Bh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_pwr_state ; 0Ch
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_dev_pm ; 0Dh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_version ; 0Eh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_engage ; 0Fh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync dw offset apmf_get_caps ; 10h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_disp_end:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; APM worker routine. Function code in AL; it is assumed that AL >= 4.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; Caller must preserve BP.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_worker proc near
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync sti ; TODO ?? necessary ??
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push ax ; check if function is supported...
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync xor ah, ah
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync sub al, 4
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov bp, ax
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync shl bp, 1
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync cmp al, (apm_disp_end - apm_disp) / 2
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop ax
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ah, 53h ; put back APM function
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jae apmw_bad_func ; validate function range
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apm_disp[bp] ; and dispatch
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_disconnect: ; function 04h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_idle: ; function 05h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync sti
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync hlt
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_busy: ; function 06h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_set_state: ; function 07h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_enable: ; function 08h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_restore: ; function 09h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync; jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_get_status: ; function 0Ah
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_bad_func
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_get_event: ; function 0Bh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ah, 80h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_failure
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_pwr_state: ; function 0Ch
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_dev_pm: ; function 0Dh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_bad_func
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_version: ; function 0Eh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ax, 0102h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_engage: ; function 0Fh
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync ; TODO do something?
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmf_get_caps: ; function 10h
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov bl, 0 ; no batteries
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov cx, 0 ; no special caps
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync jmp apmw_success
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmw_success:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync clc ; successful return
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync ret
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmw_bad_func:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ah, 09h ; unrecognized device ID - generic
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapmw_failure:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync stc ; error for unsupported functions
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync ret
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_worker endp
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; 16-bit protected mode APM entry point
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; According to the APM spec, only CS (16-bit code selector) is defined.
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; The data selector can be derived from it.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_pm16_entry:
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync mov ah, 2 ; mark as originating in 16-bit PM
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync ; fall through
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_pm16_entry_from_32:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push ds ; save registers
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push bp
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push cs
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop bp
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync add bp, 8 ; calculate data selector
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ds, bp ; load data segment
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync call apm_worker ; call APM handler
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop bp
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop ds ; restore registers
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync retf ; return to caller - 16-bit return
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync ; even to 32-bit thunk!
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync_TEXT ends
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync.386
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncBIOS32 segment public 'CODE' use32
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncpublic apm_pm32_entry
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; 32-bit protected mode APM entry point and thunk
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; According to the APM spec, only CS (32-bit) is defined. 16-bit code
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync;; selector and the data selector can be derived from it.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; WARNING: To simplify matters, we use 16-bit far return to go from 32-bit
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; code to 16-bit and back. As a consequence, the 32-bit APM code must lie
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync;; below 64K boundary in the 32-bit APM code segment.
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsyncapm_pm32_entry:
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push ebp ; ebp is not used by APM
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync mov bp, cs ; return address for 16-bit code
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync push bp
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync mov ebp, apm_pm32_back
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync push bp ; Note: 16:16 address!
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync push cs
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop ebp
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync add ebp, 8 ; calculate 16-bit code selector
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync push bp ; push 16-bit code selector
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync mov ebp, apm_pm16_entry_from_32
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync push bp ; push 16-bit offset
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync mov ah, 3 ; mark as originating in 32-bit PM
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync
ea18eebe4b48f0b8dac8abfa45b1f8d677b4a731vboxsync db 66h ; force a 16-bit return
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync retf ; off to 16-bit code...
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncapm_pm32_back: ; return here from 16-bit code
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync pop ebp ; restore scratch register
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync retf
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsyncBIOS32 ends
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync
0886d8f3dd24cf84b1875e6b3147c600c2eec6c2vboxsync end