CodeNet / Языки программирования / Ассемблер / Прерывания DOS и BIOS
CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
Функции BIOS -
INT 15H обрабатывает специфические функции AT
ПодФнк: 00H Cass motor ON 80H Device Open 86H Wait 01H Cass motor OFF 81H Device Close 87H Move Extended Mem Block 02H Read cassette 82H Program terminate 88H Get Extended Mem Size 03H Write cassette 83H Event wait 89H Switch to Virtual Mode 84H Joystick 90H Device Busy Loop 85H SysReq key 91H Finish Interrupt замечание: Кассетные подфункции опущены для краткости (мне не нужны, а вам?) AH сервис --- ---------------------------------------------------------------------------- 80H открыть устр. возвращает, ничего не делая. См. подфункции 90H и 91H. вход: BX = ID устройства; CX = ID процесса --- ---------------------------------------------------------------------------- 81H Закрыть устр. возвращает, ничего не делая. См. подфункции 90H и 91H. вход: BX = ID устройства; CX = ID процесса --- ---------------------------------------------------------------------------- 82H завершить программу устройства. Ничего не делает. См. 90H и 91H. вход: BX = ID устройства --- ---------------------------------------------------------------------------- 83H Ждать события. Запустить таймер и установить флаг по истечении интервала. вход: AL = код подфункции: AL = 0: уст. интервал (и запустить таймер) ES:BX = адрес пользовательского байта. бит 7 в этом байте будет включен по истечении интервала. CX,DX = длина интервала в микросекундах (CX - старшая часть) AL = 1: отменить ожидание события. --- ---------------------------------------------------------------------------- 84H Обеспечение джойстика. вход: DX = код подфункции: DX = 0: читать текущие переключатели возврат: AL = значения переключателей (биты 7-4) DX = 1: читать входы X,Y джойстика возврат: AX = джойстик 'A', значение X (горизонталь) AX = джойстик 'A', значение Y (вертикаль) AX = джойстик 'B', значение X (горизонталь) AX = джойстик 'B', значение Y (вертикаль) --- ---------------------------------------------------------------------------- 85H клавиша SysReq. Эта функция ничего не делает. вызывается прерыванием INT 09H при нажатии и отпускании клавиши SysReq. Идея состоит в том, чтобы операционная система перехватывала INT 15H и выдавала подфункцию 85H, чтобы отслеживать состояние (нажата или отпущена) клавиши SysReq. вход: AL = 0: SysReq нажата ('make') AL = 1: SysReq отпущена ('break') --- ---------------------------------------------------------------------------- 86H Ждать. Циклит с разрешенными прерываниями до истечения интервала времени. вход: CX,DX = сколько микросекунд ждать до возврата к пользователю --- ---------------------------------------------------------------------------- 87H Переслать блок extended-памяти. перемещает блок памяти в extended-память и из нее (RAM выше 1 мегабайта на компьютерах ¦286¦ ). вход: ES:SI => таблица глобальных дескрипторов (GDT) - см. ниже. CX = счетчик пересылаемых 16-битовых слов (максимум = 8000H = 32K) выход: Carry-флаг = 1 при ошибке. AH = 0 нет ошибки AH = 2 прерывание по исключению AH = 1 ош. четности RAM AH = 3 gate address line 20 failure структура GDT для подфункции 87H ES:[SI]+00H Фиктивный дескриптор (обнуляет пользователь) ES:[SI]+08H дескриптор этой GDT (обнуляет пользователь) ES:[SI]+10H дескриптор блока источника (см. ниже) ES:[SI]+18H дескриптор блока назначения (см. ниже) ES:[SI]+20H кодовый сегмент для BIOS (обнуляет пользователь) ES:[SI]+28H стековый сегмент для BIOS (обнуляет пользователь) ;---------- пример GDT для INT 15H, подфункции 87H INT_15_GDT label byte DB 8 dup(0) ;фиктивный DB 8 dup(0) ;эта GDT DW 0 ;source block "limit" value SRC_LO DW ? ;24-битовый адрес SRC_HI DB ? DB 93H ;права доступа (read/write data seg) DW 0 ;резерв DW 0 ;target block "limit" value DEST_LO DW ? ;24-битовый адрес DEST_HI DB ? DB 93H ;права доступа (read/write data seg) DW 0 ;резерв DB 8 dup(0) ;code segment setup by BIOS DB 8 dup(0) ;stack segment setup by BIOS ;---------- конец примерной GDT замечание: прерывания запрещаются в процессе перемещения данных, так что, если вы запускаете пачку конкурирующих процессов асинхронной передачи, избегайте перемещения больших объемов данных. См. VDISK.SYS --- ---------------------------------------------------------------------------- 88H дать размер extended-памяти. выход: AX = число непрерывных 1K блоков сверх 1M (1024K) --- ---------------------------------------------------------------------------- 89H Войти в режим Protected (286 Virtual memory). это хитрая штука, если вы не знаете, что делаете. Лучше изучите эту функцию по листингу BIOS. вход: ES:SI => 8-элементная таблица глобальных дексрипторов (GDT) (ниже) BH = смещение в IDT начала первых 8 аппаратных прерываний BL = смещение в IDT начала вторых 8 аппаратных прерываний выход: AH = 0, если не было ошибок все сегментные регистры изменяются. AX и BP теряются. 80286 входит в режим Protected без прямого выхода в режим Real. структура GDT для подфункции 89H 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 (обнуляет пользователь) --- ---------------------------------------------------------------------------- 90H Цикл занятости устройства. Ничего не делает. Я полагаю, что, если ваши инициалы - MS или DR, вы можете перехватывать эту функцию и заставить ее что-то делать. вход: AL = код типа устройства 00H = твердый диск 01H = дискета 02H = клавиатура 80H = сеть ES:BX => управляющий блок сети fdH = запуск мотора дискеты feH = принтер --- ---------------------------------------------------------------------------- 91H завершить прерывание. Ничего не делает. Идея здесь - предоставить механизм для обработчика устройства, чтобы проверять занятость устройства. когда обработчик завершил обработку запроса, он может использовать эту функцию, чтобы дать знать системе, что устройство свободно. вход: AL = код типа устройства (см. подфункцию 90H) AL = 00H - 7fH: последовательно используемые устройства AL = 80H - bfH: реентерабельные устройства (ES:BX => пакет данных)