apm_check関数では、INT 0x15(AX=5300h)を使用してBIOS経由でAPMのサポート状況を調査します。
入力 |
レジスタ |
内容 |
AX |
5300h |
BX |
device ID of system BIOS (0000h固定) |
INT 15H(AX=5300h)のパラメータ
出力 |
レジスタ |
内容 |
CF |
正常:CF clear 異常:CF set
|
AH |
major version (BCD表現?)
|
AL |
major version (BCD表現?)
|
BX |
504Dh ("PM")
|
CX |
APM flagsのビットフィールド
bit0: 16-bit protected mode interface supported
bit1: 32-bit protected mode interface supported
bit2: CPU idle call reduces processor speed
bit3: BIOS power management disabled
bit4: BIOS power management disengaged (APM v1.1)
bit5-7: reserved
|
INT 0x15からの出力値「major version」と「APM flags」を変数detailに代入して返り値として返えします。
detail変数の内容
reserved |
APM flags |
major version |
major version |
apm_disconnect関数では、INT 0x15(5304h)を使用し、apmのdisconnectを行います。
入力 |
レジスタ |
内容 |
AX |
5304h |
BX |
device ID of system BIOS (0000h固定) |
INT 15H(AX=5304h)のパラメータ
出力 |
レジスタ |
内容 |
CF |
正常:CF clear 異常:CF set
|
AH |
エラーコード
01h power management functionality disabled
02h interface connection already in effect
03h interface not connected
04h real-mode interface not connected
05h 16-bit protected-mode interface already connected
06h 16-bit protected-mode interface not supported
07h 32-bit protected-mode interface already connected
08h 32-bit protected-mode interface not supported
09h unrecognized device ID
0Ah invalid parameter value in CX
0Bh (APM v1.1) interface not engaged
0Ch (APM v1.2) function not supported
0Dh (APM v1.2) Resume Timer disabled
0Eh-1Fh reserved for other interface and general errors
20h-3Fh reserved for CPU errors
40h-5Fh reserved for device errors
60h can't enter requested state
61h-7Fh reserved for other system errors
80h no power management events pending
81h-85h reserved for other power management event errors
86h APM not present
87h-9Fh reserved for other power management event errors
A0h-FEh reserved
FFh undefined
|
INT 15H(AX=5304h)のエラーコードを関数の戻値として返します。
apm_connect関数では、INT 0x15(5303h)を使用し、APM 32-BIT PROTMODE INTERFACEでのconnectを行います。
入力 |
aレジスタ |
内容 |
AX |
5303h |
BX |
device ID of system BIOS (0000h固定) |
INT 15H(AX=5304h)のパラメータ
出力 |
レジスタ |
内容 |
CF |
正常:CF clear 異常:CF set
|
AX |
APM 32-bit code segment (real mode segment base address)
|
EBX |
エントリーポイントのオフセット
|
CX |
APM 16-bit code segment (real-mode segment base address)
|
DX |
APM 16-bit data segment (real-mode segment base address)
|
ESI |
APM BIOS 32-bit code segment length (low word of ESI)
APM BIOS 16-bit code segment length (high word of ESI)
|
DI |
APM BIOS data segment length
|
AH(エラーの場合) |
エラーコード
01h power management functionality disabled
02h interface connection already in effect
03h interface not connected
04h real-mode interface not connected
05h 16-bit protected-mode interface already connected
06h 16-bit protected-mode interface not supported
07h 32-bit protected-mode interface already connected
08h 32-bit protected-mode interface not supported
09h unrecognized device ID
0Ah invalid parameter value in CX
0Bh (APM v1.1) interface not engaged
0Ch (APM v1.2) function not supported
0Dh (APM v1.2) Resume Timer disabled
0Eh-1Fh reserved for other interface and general errors
20h-3Fh reserved for CPU errors
40h-5Fh reserved for device errors
60h can't enter requested state
61h-7Fh reserved for other system errors
80h no power management events pending
81h-85h reserved for other power management event errors
86h APM not present
87h-9Fh reserved for other power management event errors
A0h-FEh reserved
FFh undefined
|
BXレジスタに返ってくる、エントリーポイントのチェックを行っているのだが、良くわからない....
connectの結果が返るので、この値をbios_apminfo_t型の変数aiにセットします。
Int 15h(AX=530Eh)でAPMのDriver Versionを取得します。
apm_check関数をcallして、apmがサポートされているかチェックします。サポートされていなければ、この関数を抜けます。
apm_disconnect関数をcallして、apmをdisconnectする。
apm_connect関数をcallして、apmに接続します。接続出来た場合は、変数aiにapm情報が返ります。接続出来なかった場合画面にエラーを表示しreturnします。
Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2
apm: connect error
APMのProbeが正常に完了したら、画面に出力します。
Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 apm