Низкоуровневое програмирование Главная - Реальный режим - Прерывания Bios - INT 15h: Дополнительные функции.

INT 15h: Дополнительные функции.

Данное прерывание реализует несколько наборов API

Оглавление

Кассетный API

AHФункция
00hВключить мотор кассетного привода.

Выход:
AH!=86 и AH!=80, иначе касетный привод не найден.
прочие кассетные функции


Системный API

AHФункция
24hЛиния A20

Вход:
AL:
    1 - Включить линию A20
    2 - Выключить линию A20
    3 - узнать, можно ли переключить линию A20 через порт 92h

Выход:
При ошибке установлен флаг переноса и AH=86
Если в AL было переданно значение 3, то в BL==2 означает, что можно переключить линию A20 через порт 92h

Примечание:
Эта функция мало где описана, и, вероятно, поддерживается не всеми БИОСами
4FhВнутренняя функция
Эта функция вызывается обработчиком прерывания 9h (прерывание от клавиатуры). Точное назначение функции неизвестно. Реализация зависит от разработчиков БИОСа.
80hОткрыть устройство.
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
BX = ID устройства
CX = ID процесса
81hЗакрыть устройство.
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
BX = ID устройства
CX = ID процесса
82hзавершить программу устройства.
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
BX = ID устройства
83hЖдать события. Запустить таймер и установить флаг по истечении интервала.
Только AT-совместимые компьютеры

ALФункция
0Задать интервал и запустить таймер

Вход:
ES:BX - адрес байта, в котором будет установлен седьмой бит по истечении заданного времени
CX - время ожидания в микросекундах (старшая часть)
DX - время ожидания в микросекундах (младшая часть)

Выход:
AH = 83h (может так же равняться 80h, что означает неверный код функции или 86h, что означает, что функция не поддерживается)
AL - статус (если 0, то установить таймер не удалось, т.к. уже установлен другой таймер)

Примечание:
На большинстве систем время ожидания округляедся до кратного 977 милисекундам
На IBM PC/AT с биосом, датированным 1984/1/10 значение AL игнорируется, и всегда вызывается эта подфункция
1Отменить ожидание события

Выход:
AH = 83h (может так же равняться 80h, что означает неверный код функции или 86h, что означает, что функция не поддерживается)
AL = 0

Примечание:
На IBM PC/AT с биосом, датированным 1984/1/10 значение AL игнорируется, и всегда вызывается подфункция 0
84hОбеспечение джойстика (вероятно, подключённого через стандартный (и безнадёжно устаревший) игровой порт).

Вход:
DX = код подфункции:
DX
0Читать текущие переключатели

Выход:
AL = значения переключателей (если равно нулю, то джойстик не найден)
1Читать входы X,Y джойстика

Выход:
AX = джойстик 'A', значение X (горизонталь)
BX = джойстик 'A', значение Y (вертикаль)
CX = джойстик 'B', значение X (горизонталь)
DX = джойстик 'B', значение Y (вертикаль)
Если джойстик не найден, то AX=BX=CX=DX=0
85hклавиша SysReq.вызывается прерыванием INT 09H при нажатии и отпускании клавиши SysReq.
Только AT-совместимые компьютеры
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
AL = 0: SysReq нажата ('make')
AL = 1: SysReq отпущена ('break')
86hЖдать.
Только AT-совместимые компьютеры
Циклит с разрешенными прерываниями до истечения интервала времени.

Вход:
CX - время ожидания в микросекундах (старшая часть)
DX - время ожидания в микросекундах (младшая часть)

Примечание:
На большинстве систем время ожидания округляедся до кратного 977 милисекундам
Не реккомендуется указывать в качестве задержки значения меньше 1000 микросекунд (3e8h)
87hПереслать блок extended-памяти.
Только AT-совместимые компьютеры с процессором 286 и выше

Вход:
CX = размер блока в словах (максимум 8000h т.е. 64 кб.)
ES:SI = GDT
    db 16 dup (0) 16 пустых байтов
    dw ?         размер источника в байтах (2*[сх]+1)
    dw ?         младшая часть адреса источника
    db ?         старшая часть адреса источника
    db 93h       разрешены чтение и запись
    dw 0         пустое (резервное) слово
    dw ?         размер приемника в байтах (2*[сх]+1)
    dw ?         младшая часть адреса приемника
    db ?         старшая часть адреса приемника
    db 93h       разрешены чтение и запись
    dw 0         пустое (резервное) слово
    db 16 dup (0) 16 пустых байтов

Выход:
AH - статус:
    0 - успешно
    1 - ошибка памяти
    2 - во время переключения возникло исключение.
    3 - переключение линии A20 не удалось
    80h - неиизвестная команда
    86h - неизвестная функция

Примечание:
Прерывания могут быть запрещены в процессе перемещения данных.
Спецификация Embedded BIOS 4.1 утверждает, что байты 8-10h в GDT должны корректно указывать на GDT, т.е. должны быть заполнены аналогично частям источника (10h-18h) и приёмника(18h-20h)
88hРазмер extended-памяти.(не более 64Мб)
Только AT-совместимые компьютеры

Выход:
AX = число непрерывных 1Kб блоков сверх 1Mб
89hВойти в режим Protected (286 Virtual memory). это полезная штука, если вы не знаете, что это за зверь - Protected Mode i286.

Вход:
ES:SI => 8-элементная таблица глобальных дексрипторов (GDT) (ниже)
BH = смещение в IDT начала первых 8 аппаратных прерываний (IRQ)
BL = смещение в IDT начала вторых 8 аппаратных прерываний (IRQ)

Выход:
AH - статус:
    0 - успешно
    1 - ошибка памяти
    2 - во время переключения возникло исключение.
    3 - переключение линии A20 не удалось
    80h - неиизвестная команда
    86h - неизвестная функция
Если не было ошибок, то все сегментные регистры изменяются. AX и BP теряются. 80286 входит в режим Protected без прямого выхода в режим Real.

Примечание:
Cтруктура GDT:
ES:[SI]+00h  фиктивный дескриптор     (все нули)
ES:[SI]+08h  дескриптор этой GDT      (инициализирует пользователь)
ES:[SI]+10h  дескриптор для IDT       (инициализирует пользователь)
ES:[SI]+18h  дескриптор для caller DS (инициализирует пользователь)
ES:[SI]+20h  дескриптор для caller ES (инициализирует пользователь)
ES:[SI]+28h  дескриптор для caller SS (инициализирует пользователь)
ES:[SI]+30h  дескриптор для caller CS (инициализирует пользователь)
ES:[SI]+38h  временный BIOS CS        (все нули)

Структура Дескриптора:
    dw ? - размер в байтах
    dw ? - младшая часть адреса начала
    db ? - старшая часть адреса начала
    db ? - права доступа:
           Биты 0-3 : Тип сегмента:
             Для системных десткрипторов:
                0 - резерв
                1 - свободный 16-битный TSS
                2 - LDT
                3 - занятый 16-битный TSS
                4 - 16-битный шлюз вызова
                5 - Шлюз задачи
                6 - 16-битный шлюз прерывания
                7 - 16-битный шлюз ловушки
                8 - резерв
                9 - свободный 32-битный TSS (i386+)
                10 - резерв
                11 - занятый 32-битный TSS (i386+)
                12 - 32-битный шлюз вызова (i386+)
                13 - резерв
                14 - 32-битный шлюз прерывания (i386+)
                15 - 32-битный шлюз ловушки (i386+)
             Для десткрипторов приложений:
                бит 0 - было обращение к сегменту
                бит 1 - для дескриптора данных: доступ на запись, для дескриптора кода: доступ на чтение
                бит 2 - для дескриптора данных: запись с конца, для дескриптора кода: conforming
                бит 3 = 0 : данные; = 1 : код
           Биты 4 : Тип дескриптора (установлен -> для приложений; сброшен -> системный)
           Биты 5-6 : Уровень привилегий
           Биты 7 : Установлен -> сегмент находится в оперативной памяти
    db ? - на i286 резерв, на i386+ расширенные права доступа:            Биты 0-3 : старшие 4 бита лимита сегмента
           Биты 4 : доступность
           Биты 5 : резерв
           Биты 6 : 16-битный, если сброшен, 32-битный если установлен
           Биты 7 : размерность: блоками по 4Кб, если установлен; байтами, если сброшен
    db ? - на i286 резерв, на i386+ старшие 8 бит начала сегмента
90hЦикл занятости устройства.
Только AT-совместимые компьютеры
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
AL = код типа устройства
    00h = твердый диск
    01h = дискета
    02h = клавиатура
    03h = PS/2 мыш
    21h = ожидание ввода с клавиатуры Работает не везде
    80h = сеть
    FBh = звукРаботает не везде
    FCh = перезапуск дискаРаботает не везде
    FDh = запуск мотора дискеты
    FEh = принтер
ES:BX => управляющий блок для кодов 80h - BFh (по иным сведеньям 80h - FFh)

Примечание:
Здесь описанны вход и выход, которые должен ожидать обработчик этой функции.
Установленный флаг CF должен означать, что истёкло время ожидания
91hзавершить прерывание.
Только AT-совместимые компьютеры
По умолчанию, ничего не делает (зарезервированна для многозадачных ОС реального режима)

Вход:
AL = код типа устройства (см. подфункцию 90H)
   = 00h - 7Fh: последовательно используемые устройства
   = 80h - BFh: реентерабельные устройства (ES:BX => пакет данных)
   = C0h - FFh: не доступны через эту функцию

Примечание:
Здесь описанны вход и выход, которые должен ожидать обработчик этой функции.
C0h Адрес таблицы конфигурации (SCT)

Выход:
ES:BX = адрес таблицы конфигурации, таблица находится в ПЗУ BIOS;
  CF = 0 и AH = 0 при успешном вызове прерывания;
  CF = 1 и AH=86h или AH=80h если данная версия BIOS не поддерживает функцию C0h.

Примечание:
формат таблицы:
СмещениеРазмерОписание
00h2 байтаразмер таблицы за исключением этого поля
02h1 байткод модели компьютера
03h1 байтсуб-код модели компьютера
04h1 байтномер ревизии BIOS минус 1
05h1 байт
битОписание
0В системе установлена двойная шина (ISA + Micro Chanel)
1В системе установлена шина Micro Chanel, если установлен, иначе - ISA
2Биос имеет дополнительную область данных (EBDA)
3Функция 41h прерывания 15h поддерживается
4Прерывание 09h вызывает функцию 4Fh прерывания 15h
5Присутствуют часы реального времени (RTC)
6Установлен второй контроллер прерывания 8259 (в режиме каскадирования через IRQ 2, т.е. стандартная конфигурация)
7Третий канал DMA занят BIOS
06h1 байт
битОписание
0Резерв
1Поддерживается потоковая передача данных
2Используется НЕ 8042 контроллер клавиатуры
3Функция C8h прерывания 15h поддерживается
4Функция C7h прерывания 15h поддерживается
5Функция C6h прерывания 15h поддерживается
6Функция 09 прерывания 16h поддерживается
Некорректно устанавливается некоторыми БИОС
7Присутствует 32-х битный контроллер DMA
07h1 байт
битОписание
0SCSI поддерживается в IML
1IML система
2Подключена информационная панель
3Присутствует SCSI контроллер
4POST поддерживает включение\выключение ROM-TO-RAM
5Резерв
6Резерв
7Резерв
08h1 байт
битОписание
0POST поддерживает POSTEXT
1система поддерживает разделение памяти на отметке 16Mб
2Резерв
3-5001 - ABIOS НЕ поддерживается
010 - ABIOS поддерживается из ROM
011 - ABIOS поддерживается, но необходима загрузка в RAM.
111 - ABIOS присутствует
6В системе присутствует EEPROM
7(занято IBM)
09h1 байт
битОписание
0flash EPROM BIOS
1Система имеет расширеный режим мыши.
4-2Резерв
5-7(занято IBM)
0Ah - далее область данных, смысл которых зависит от производителя.
Некоторые биосы используют не все байты возможностей. К примеру, в Phoenix BIOS 4 rev. 6 User manual байты со смещёнием 7 и 8 отмечены как зарезервированные.
C1h Получить сегмент дополнительной области данных BIOS (EBDA)

Выход:
Если CF установлен: ошибка (AH=80h или AH=86h - данная функция не поддерживается)
Если CF сброшен: ES - сегмент EBDA
C2h BIOS - интерфейс указывающего устройства (мышь)
ALФункция
0Включить/Выключить

Вход:
BH = 00 - выключить
    = 01 - включить

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    02h - неверный параметр
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.
1Сбросить мышь

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.
BH = ID устройства(обычно нуль)
BL = код, возврашаемый устройством при перенастройке. (AAh - большинство PS/2 мышей)

Примечания:
Параметры по умолчанию:
Выключено
Частота - 100 Гц
Чуствительность - 4 отсечки на миллиметр
Масштаб 1:1
Рекомендуется вызывать при завершении программы если использовались какие-либо из подфункций функции C2h
На некоторых BIOS возврат BL не предусмотрен
2Установить частоту

Вход:
BH - чатота:
    0 - 10 Гц
    1 - 20 Гц
    2 - 40 Гц
    3 - 60 Гц
    4 - 80 Гц
    5 - 100 Гц
    6 - 200 Гц

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.
3Установить чуствительность

Вход:
BH - чуствительность:
    00 - одна отсечка на милиметр
    01 - две отсечки на милиметр
    02 - 4 отсечки на милиметр
    03 - 8 отсечек на милиметр

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.
04Получить ID

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль BH = ID устройства
05 Инициализация

Вход:
BH - размер пакета данных (от 1 до 8, в байтах)

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.

Примечания:
Параметры устанавливаются следующим образом:
Выключено
Частота - 100 Гц
Чуствительность - 4 отсечки на миллиметр
Масштаб 1:1
06 Дополнительные возможности
BHПодфункция
0 Получить параметры устройства

Выход:
BL - статус:
    бит 0 - нажата правая клавиша
    бит 1 - нажата средняя клавиша //не факт, что это действительно так, сам не проверял. В RBIL утверждается, что это поле зарезервированно
    бит 2 - нажата левая клавиша
    бит 3 - резерв
    бит 4 - масштаб 0 - 1:1, 1 - 2:1 (в некоторых источниках указано строго наоборот, что верно - не знаю)
    бит 5 - состояние 0 - выключено, 1 - включено
    бит 6 - 0 - потоковый режим, 1 - удалённый (remote) режим
    бит 7 - резерв
CL - чуствительность:
    00 - одна отсечка на милиметр
    01 - две отсечки на милиметр
    02 - 4 отсечки на милиметр
    03 - 8 отсечек на милиметр
DL - частота:
    0Ah - 10 Гц
    14h - 20 Гц
    28h - 40 Гц
    3Ch - 60 Гц
    50h - 80 Гц
    64h - 100 Гц
    C8h - 200 Гц

02 Установить масштаб 1:1
03 Установить масштаб 2:1

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.
07 Установить свой обработчик событий

Вход:
ES:BX - адрес обработчика (если адрес установлн в ноль, то испольуется стандартный обработчик)

Выход:
Если CF установлен: ошибка
    Значения AH в этом случае:
    01h - функция не поддерживается
    03h - ошибка интерфейса PS/2
    04h - необходимо повторить операцию
    05h - отсутствует драйвер мыши
    80h или 86h - данная функция не поддерживается
Если CF сброшен: успех, AH установлен в ноль.

Примечания:
Параметры передаются через стек:
Слово 1 - статус:
    бит 0 - нажата левая клавиша
    бит 1 - нажата правая клавиша
    бит 2 - нажата средняя клавиша //не факт, что это действительно так, сам не проверял. В RBIL утверждается, что это поле зарезервированно
    бит 3 - резерв
    бит 4 - знак по оси X
    бит 5 - знак по оси Y
    бит 6 - переполнение по оси X
    бит 7 - переполнение по оси Y
    бит 8-16 - резерв // Возможно, знак и переполнение по оси Z при её наличии?
Слово 2 - старший байт - знак, младший - координата X
Слово 3 - старший байт - знак, младший - координата Y
Слово 4 - обычно ноль, для но в случае если подключена трехкоординатная мышь используется для передачи координаты Z по аналогии со словами 2 и 3
08 Отправить байт на указывающее устройство

Вход:
BL - отправляемый байт

Примечания:
Поддерживается не всеми БИОС.
09 Получить данные с указывающего устройства

Выход:
BL - Первый считанный байт
CL - Второй считанный байт
DL - Третий считанный байт

Примечания:
Поддерживается не всеми БИОС.

Примечания:
Для проверки наличия этой функции пользуйтесь функцией C0h.


Сервис памяти

AHФункция
88hРазмер "расширенной" памяти

Выход:
AX - количество килобайт, выше 1 мб.
CF установлен, если произошла ошибка
Примечание:
Часто эта функция исскуственно ограничена границей в 16мб
Многие БИОСы неправильно устанавливают флаг CF, в связи с чем обычно реккомендуется следующий способ проверить наличие этой функции:
	MOV AH, 0x88
	INT 0x15		; вызываем функцию
	JC SHORT .ERR	; флаг CF установлен - считаем, что произошла ошибка
	TEST AX, AX		; размер равный нулю скорее всего ошибочен
	JE SHORT .ERR
	CMP AH, 0x86		; этот код соответсвует ошибке "неподдерживаемая функция"
	JE SHORT .ERR
	CMP AH, 0x80		; этот код соответсвует ошибке "неправильная командая функция"
	JE SHORT .ERR
	; обрабатываем результат
	
безусловно, при таком подходе мы теряем часть случаев, когда функция исправно работает, зато дойдя до моента обработки результата мы уверены, что функция отработала верно.
8AhРазмер памяти свыше 64Мб

Выход:
AX - младшая часть размера памяти
DX - старшая часть размера памяти
Флаг CF установлен, если функция не поддерживается

Примечание:
Эта функция возвращает количество блоков по 1Кб свыше 64Мб
В некоторых источника эта функция описывается как аналог функции DA88h. Вероятно, разные производители БИОСов реализуют её по-разному, в связи с чем не рекомендуется её использовать.
C7hКарта памяти свыше 1Мб

Вход:
CS:DI - адрес, куда будет помещана карта памяти
Флаг CF установлен при ошибке

Примечание:
Не все БИОСы поддерживают эту функцию
Рекомендуется проверять наличие этой функции с помощью функции C0h
Карта имеет следующий формат:
СмещениеРазмерОписание
0WORDРазмер таблицы, за исключением этого слова
2DWORDКоличество килобайт логической памяти между 1Мб и 16Мб
6DWORDКоличество килобайт логической памяти между 16Мб и 4Гб
AhDWORDКоличество килобайт системной памяти между 1Мб и 16Мб
EhDWORDКоличество килобайт системной памяти между 16Мб и 4Гб
12hDWORDКоличество килобайт кэшируемой памяти между 1Мб и 16Мб
16hDWORDКоличество килобайт кэшируемой памяти между 16Мб и 4Гб
1AhDWORDКоличество килобайт до начала не системной памяти между 1Мб и 16Мб
1EhDWORDКоличество килобайт до начала не системной памяти между 16Мб и 4Гб
22hWORDНачальный сегмент наибольшего блока памяти в промежутке C0000h-DFFFFh
24hWORDРазмер наибольшего блока памяти в промежутке C0000h-DFFFFh
26hDWORDРезерв
DAhРазмер памяти от 1мб до 16мб

Вход:
AL=88h

Выход:
AX=0
CL, BX - количество килобайт доступной памяти в промежутке от 1мб до 16мб (старшая часть в CL)

Примечание:
Если произошла ошибка - установлен флаг переноса (CF)
В большинстве случаев эта функция вернёт размер примерно 14 мб, т.к. в промежутке от 1 мб до 16 мб есть облать, используемая БИОСом.
E8hПамять
ALфункция
01hразмер extended-памяти.

Выход:
ax = cx - размер сконфигурированный расширенной памяти в килобайтах в промежутке от 1Мб до 16Мб
bx = dx - размер сконфигурированной расширенной памяти в блоках по 64Кб свыше 16Мб
Если произошла ошибка - установлен флаг переноса (CF)
20hКарта памяти разбитая на блоки разных типов. допускает дыры в памяти.

Вход:
edx = 534d4150h ('SMAP');
ebx - Смещение от начала карты памяти(0 - начать с начала)
eсx - Размер буфера
es:di - Адрес буфера для размещения карты памяти

Выход:
eax - 534d4150h ('SMAP')
ebx - Следующее смещение от начала карты памяти, если = 0, то вся карта передана
ecx - Количество возвращенных байт

Примечание:
Эта функция не включает информацию о области памяти, адресуемой в графеческую карту
81hРазмер extended-памяти.

Выход:
eax = ecx - размер сконфигурированный расширенной памяти в килобайтах в промежутке от 1Мб до 16Мб
ebx = edx - размер сконфигурированной расширенной памяти в блоках по 64Кб свыше 16Мб
Если произошла ошибка - установлен флаг переноса (CF)


APM API


Advanced Power Managment (APM) - это старый механизм управления электропитанием компьютера
Этот апи реализуется через функцию 53h, т.е. в AH необходимо передавать значение 53h
ALФункция
00hПроверить наличие APM

Вход:
BX=0

Выход:
Если установлен флаг переноса, то APM не поддерживается и AH - статус.
Иначе:
AH - старший номер версии (в коде BCD)
AL - младший номер версии (в коде BCD)
BX = 504Dh
CX :
     бит 0 : 16-ти битный интерфейс поддерживается
     бит 1 : 32-х битный интерфейс поддерживается
     бит 2 : Вызов CPU IDLE снижает скорость процессора
     бит 3 : APM выключено (disabled)
     бит 3 : APM отключено (disengaged)

Примечание:
Некоторые старые версии Award BIOS не изменяют значение BX
Установленный бит 2 регистра CX означает, что если был вызов CPU IDLE, а сейчас системе требуется полная производительность, то необходимо сделать вызов CPU BUSY.
01hПодключиться к интерфейсу реального режима

Вход:
BX=0

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
По умолчанию после установки соединения APM работает в режиме совместимости с версией 1.0. Что бы переключится на более новую версию используйте функцию 0Eh.
04hОтключиться от интерфейса

Вход:
BX=0

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
05hCPU IDLE

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
06hCPU BUSY

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
Эта функция гарантирует, что после её выполнения процессор будет работать на полной мощности. Её можно вызывать, даже если процессор уже работает на полной мощности
07hЗадать состояние

Вход:
BX - ID устройства
CX - состояние

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
Не вызывайте эту функцию из обработчика аппаратного прерывания

Определены следующие ID устройств (где XX - это номер устройства, XX = FF означает все устройства этого типа) :
   0001h - все управляемые устройства
   01XXh - видеокарты/дисплеи
   02XXh - устройства хранения данных
   03XXh - порты LPT
   04XXh - порты COM
   05XXh - сетевый адаптеры (APM версии 1.1 или выше)
   06XXh - разъёмы PCMCIA (APM версии 1.1 или выше)
   80XXh - аккамуляторы (поддерживается не везде) (счёт устройств начинается с единицы) (APM версии 1.2 или выше)
   EXXXh - определяется производителем системы
на некоторых системах вместо ID 0001h используется ID 0000h. Это применимо не только к этой функции, но и ко всем функциям, использующим ID устройства.
Определены следующие состояния:
   0000h - готовность (не работает с ID устройства 0001h). Устройство работает на полной мощности
   0001h - ожидание. Устрпойство находится в режиме пониженного энергопотребления
   0002h - пауза. Устройство выключено, но его состояния сохранено.
   0003h - выключено.
   0004h - обработка запроса на выход из состояний паузы или ожидания (только для устройства с ID 0001h) (APM версии 1.1 или выше)
   0005h - отмена запроса на выход из состояний паузы или ожидания (только для устройства с ID 0001h) (APM версии 1.1 или выше) (имеется ввиду, что этот вызов отменяет запрос)
   0020h-007Fh - определяется производителем системы

по стандарту версии 1.0 состояние 0003h не применимо к устройству с ID 0001h, но большинство систем обрабатывали такую ситуацию как выключение компьютера. Такое поведение было объявлено стандартным в версии 1.2, хотя упоминание о не пременимости состояния 0003h к устройству с ID 0001h было убрано с версии 1.1
08hВключить/выключить (enable/disable) управление питанием

Вход:
BX = 0001h (APM версии 1.1 или больше) FFFFh (APM версии 1.0)
CX = 0 - выключить, = 1 - включить

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
APM не может быть одновременно выключено (disabled) и отключено (disengaged)
Не вызывайте эту функцию из обработчика аппаратного прерывания
09hВостановить значения, используемые при включении компьютера

Вход:
BX = 0001h (APM версии 1.1 или больше) FFFFh (APM версии 1.0)

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
В результате APM для устройств будет отключено (disengaged), однако для системы в целом будет включено (engaged)
Не вызывайте эту функцию из обработчика аппаратного прерывания
0AhПолучить статус питания

Вход:
BX - ID устройства

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
BH - статус разёма питания:
     00h - питание отключено
     01h - питание подключено
     02h - подключено резервное питание
     FFh - неизвестно
BL - статус заряда аккамулятора:
     00h - высокий
     01h - низкий
     02h - критический
     03h - заряжается
     FFh - неизвестно
CH - флаги аккамулятора (APM версии 1.1 или выше):
     бит 0 : высокий уровень заряда
     бит 1 : низкий уровень заряда
     бит 2 : критический уровень заряда
     бит 3 : аккамулятор заряжается
     бит 4 : такого аккамулятора не существует
     биты 5,6 зарезервированны (сброшены)
     бит 7 : батарей нет
CL - уровень заряда аккамулятора от 0 до 100, FFh = неизвестно
DX - оставшееся время работы от аккамулятора (APM версии 1.1 или выше):
     бит 15 : если установлен, то в минутах; если сброшен, то в секундах
     биты 14-0 : оставшееся время в указанных единицах
если на входе ID устройства соответствовал аккамулятору, то:
SI - количество установленных в системе аккамуляторов (APM версии 1.2 или выше)

Примечание:
В качестве ID устройства может передаваться ID всей системы (0001h) или же ID аккамулятора
В результате DX равный FFFFh означает "неизвестно"
В результате CH равный FFFFh означает "неизвестно"
Не вызывайте эту функцию из обработчика аппаратного прерывания
0BhПолучить событие питания

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
BX - код события
CX - информация о событии (APM версии 1.2 или выше) (для событий 0003h и 0004h):
     бит 0 : разъёмы PCMCIA были выключены в состоянии паузы
     остальные биты зарезервированны

Примечание:
Коды событий:
    0001h - запрос на переход в режим ожидания
    0002h - запрос на переход в режим паузы
    0003h - нормальное возобновление системы
    0004h - критическое возобновление системы
    0005h - низкий уровень заряда батареи
    0006h - изменилось состояние питания (APM версии 1.1 или выше)
    0007h - изменилось время (APM версии 1.1 или выше)
    0008h - критический переход в режим паузы (APM версии 1.1 или выше)
    0009h - запрос на переход в режим ожидания от пользователя (APM версии 1.1 или выше)
    000Ah - запрос на переход в режим паузы от пользователя (APM версии 1.1 или выше)
    000Bh - выход из режима ожидания (APM версии 1.1 или выше)
    000Ch - изменение возможностей (APM версии 1.2 или выше)
    01XXh - события оборудования
    02XXh - события, определяемые производителем

Не вызывайте эту функцию из обработчика аппаратного прерывания
0СhПолучить состояние питания (APM версии 1.1 или выше)

Вход:
BX - ID устройства

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
CX - состояние:
     0000h - готовность (не работает с ID устройства 0001h). Устройство работает на полной мощности
     0001h - ожидание. Устрпойство находится в режиме пониженного энергопотребления
     0002h - пауза. Устройство выключено, но его состояния сохранено.
     0003h - выключено.
     0020h-007Fh - определяется производителем системы
0DhВключить/выключить автоматическое управление электропитанием устройства (APM версии 1.1 или выше)

Вход:
BX - ID устройства
CX = 0 - выключить, = 1 включить

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
0EhЗадать версию APM (APM версии 1.1 или выше)

Вход:
BX = 0
CH - старший номер версии APM, поддерживаемой драйвером (в коде BCD)
CL - младший номер версии APM, поддерживаемой драйвером (в коде BCD)

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
CH - старший номер версии APM, используемый для текущего соединения (в коде BCD)
CL - младший номер версии APM, используемый для текущего соединения (в коде BCD)

Примечание:
Эту функцию необходимо вызывать после установки соединения функцией 01 для того, что бы использовать возможности новых версий APM. (По умолчанию APM эмулирует поведение версии 1.0)
0FhВключить/отключить (engage/disengage) управление питанием (APM версии 1.1 или выше)

Вход:
BX - ID устройства
CX = 0 - выключить, = 1 включить

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.

Примечание:
Когда управление электропитанием отключено (disengaged), то APM автоматически управляет электропитанием устройств. Когда оно включено, то в управлении электропитанием участвует драйвер.
10hУзнать возможности (APM версии 1.2 или выше)

Вход:
BX = 0

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
BL - количество установленных в системе аккамуляторов
CX - флаги возможностей:
     бит 0 : может войти в глобальный режим ожидания
     бит 1 : может войти в глобальный режим паузы
     бит 2 : таймер пробуждения выведет систему из состояния ожидания
     бит 3 : таймер пробуждения выведет систему из состояния паузы
     бит 4 : сигнал на линии ring com-порта или модема выведет систему из состояния ожидания
     бит 5 : сигнал на линии ring com-порта или модема выведет систему из состояния паузы
     бит 6 : сигнал на линии ring PCMCIA выведет систему из состояния ожидания
     бит 7 : сигнал на линии ring PCMCIA выведет систему из состояния паузы
     биты 8-15 : зарезервированно

Примечание:
Эта функция не требует наличия установленного соединения
11hТаймер пробуждения (APM версии 1.2 или выше)

Вход:
BX = 0
CL :
     00 - Выключить таймер
     01 - Узнать настройку таймера
     02 - Задать настройку таймера
Если CL = 02:
CH - секунда (в коде BCD)
DH - час (в коде BCD)
DL - минута (в коде BCD)
SI - в старшем байте месяц (в коде BCD), в младшем байте день (в коде BCD)
DI - год (в коде BCD)

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе, если на входе CL = 01:
CH - секунда (в коде BCD)
DH - час (в коде BCD)
DL - минута (в коде BCD)
SI - в старшем байте месяц (в коде BCD), в младшем байте день (в коде BCD)
DI - год (в коде BCD)

Примечание:
Значение таймера задаётся в абсолютном времени, а не относительном
12hВключить/выключить пробуждение системы по сигналу на линии ring (APM версии 1.2 или выше)

Вход:
BX = 0
CL :
     00 - Выключить пробуждение по сигналу на линии ring
     01 - Включить пробуждение по сигналу на линии ring
     02 - Узнать статус пробуждения по сигналу на линии ring

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
CX - статус пробуждения по сигналу на линии ring:
     00 - Выключено
     01 - Включено

Примечание:
Эта функция задаёт реакцию на все линии ring, способные пробудить систему
13hВключить/выключить запросы по таймеру (APM версии 1.2 или выше)

Вход:
BX = 0
CL :
     00 - Выключить запросы по таймеру
     01 - Включить запросы по таймеру
     02 - Узнать статус запросов по таймеру

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
CX - статус запросов по таймеру:
     00 - Выключено
     01 - Включено

Примечание:
По умолчанию APM может предложить перейти врежим ожидания или паузы, основываясь на времени бездействия системы. Данная функция позволяет управлять этим поведением
80hОпределить наличия расширения от изготовителя системы

Вход:
BH = 7fh

Выход:
Если установлен флаг переноса, то произошла ошибка и AH - статус.
иначе:
BX - ID изготовителя

Примечание:
Нередко также изменяются значения регистров AX и CX
Вызов функций расширения осуществляется через эту же функцию, а номер необходимой функции передаётся в BH

Коды статуса APM
КодЗначение
01Управление электропитанием выключено (disabled)
02Соединение уже установлено
03Соединение не установлено
04Соединение с интерфейсом реального режима не установлено
05Соединение с интерфейсом 16-ти битного (i286) защищённого режима уже установлено
06Интерфейс 16-ти битного (i286) защищённого режима не поддерживается
07Соединение с интерфейсом 32-х битного защищённого режима уже установлено
08Интерфейс 32-х битного защищённого режима не поддерживается
09Неизвестный ID устройства
0AhНеверное значение в CX
0Bh(APM версии 1.1 или выше) Интерфейс не включён (engaged)
0Ch(APM версии 1.2 или выше) Функция не поддерживается
0Dh(APM версии 1.2 или выше) Таймер пробуждения выключен
60hНе могу перейти в запрошенный режим
80hНет событий управления электропитанием для обработки
86hAPM отсутствует


Прочие функции

AHФункция
04h Создать таблицу системных параметров ABIOS

Выход:
CF установлен - ошибка, иначе - успешно.
05h Создать таблицу инициализации ABIOS

Выход:
CF установлен - ошибка, иначе - успешно.
22h Получить расположение ROM BASIC

Выход:
CF установлен - ошибка (если AH=86h, то функция не поддерживается)
Если AX=0000, то ES:BX - расположение ROM BASIC в памяти.
52hИзвлечь носитель информации

Вход:
DL - номер диска(80h ... 0FFh)

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Эта функция относится к стандарту EDD. Подробнее про этот стандарт вы можете узнать на странице прерывания 13h
Эта функция используется функцией 46h прерывания 13h