; Файл sysports.inc ; ; Системные порты (61h и 70h) ; Префикс SP comment~ только чтение/ чтение запись │<─────────>│<─────────>│ │ │ │ 7 6 5 4 3 2 1 0 ┌──┬──┬──┬──┬──┬──┬──┬──┐ Порт 61h │ │ │ │ │ │ │ │ │ └──┴──┴──┴──┴──┴──┴──┴──┘ ^ ^ ^ ^ ^ ^ ^ ^ │ │ │ │ │ │ │ └─ Строб таймера 2, подключённого к динамику (0 -- счётчик запрещён; 1 -- разрешён) │ │ │ │ │ │ └──── Данные динамика │ │ │ │ │ └─────── RAMPCK NMI (0 -- разрешён; 1 -- запрещён и сброшен) │ │ │ │ └────────── IOCHK NMI (0 -- разрешён; 1 -- запрещён и сброшен) │ │ │ └───────────── 0 -- идёт цикл рергенерации памяти; 1 -- цикла нет │ │ └──────────────── Состояние выхода OUT счётчика 2 │ └─────────────────── 1 -- есть IOCHK запроршерно прерывание NMI └────────────────────── 1 -- RAMPCK активен (низкий уровень) запрошено прерывание NMI ~ ;RSPPort61 record SNMIR:1, SNMII:1,STOUT2:1, RegRAM:1, NMIIEn:1, NMIREn:1, SSpeak:1, StrobGate2:1 CmSPStrobT2 equ 00000001b ; Строб таймера CmSPSpeaker equ 00000010b ; Доступ к динамику CmSPTOUT2 equ 00100000b ; выход таймера, подключённого к динамику. MSPPCSpeakerCountGate equ 00000001b ; MSPPCSpeakerDataGate equ 00000010b ; MKBDEnableBit equ 10000000b ; comment~ 7 6 5 4 3 2 1 0 ┌──┬──┬──┬──┬──┬──┬──┬──┐ Порт 70h │ │0 │ │ │ │ │ │ │ └──┴──┴──┴──┴──┴──┴──┴──┘ ^ ^ ^ ^ ^ ^ ^ │ └──┴──┴──┴──┴──┴── RTC (Адрес памяти конфигурации системы) └─────────────────────── Маска NMI (0 -- разрешено; 1 -- сброшено) ~ ;SysPort70 record SNMIDesable:1,SReserv:1=0, SRTCAddr:6 CmSPNMIEna equ 10000000b ; ;─────────────────────────────────────────────────────────────────────────────── ; Разрешает работу счётчика динамика ; EnDes=Enable -- разрешить работать счётчику ; =Desable -- запретить работу счётчика PCSpkCount macro EnDes in al, 61h ifb .err PCSpkCount: Не указана операция со счётчиком динамика. elseifidni , or al, PCSpeakerCountGate ; записать 1 в бит разрешения работы elseifidni , and al, not PCSpeakerCountGate ; записать 0 в бит разрешения работы else .err PCSpkCount: Неправильно указана операция со счётчиком динамика. endif out 61h, al endm ;─────────────────────────────────────────────────────────────────────────────── ; Разрешает вывод данных из счётчика 2 в динамик ; EnDes=Enable -- разрешить вывод данных из счётчика в динамик ; =Desable -- запретить вывод данных из счётчика в динамик SPPCSpeaker macro EnDes in al, 61h ifb .err PCSpkCount: Не указана операция со счётчиком динамика. elseifidni , or al, PCSpeakerDataGate ; записать 1 в бит разрешения работы elseifidni , and al, not PCSpeakerDataGate; записать 0 в бит разрешения работы else .err PCSpkCount: Неправильно указана операция со счётчиком динамика. endif out 61h, al endm ;─────────────────────────────────────────────────────────────────────────────── ; Вывод данных в динамик ; Data=1 или Hi -- вывод логической единицы в динамик ; =0 или Lo -- вывод логического нуля в динамик ; SPOutSpeaker macro Data in al, 61h ifb EnDes .err PCSpkCount: Не указана операция со счётчиком динамика. elseifidni ,<1> or al, PCSpeakerDataGate ; записать 1 в бит разрешения работы elseifidni ,<0> and al, not PCSpeakerDataGate; записать 0 в бит разрешения работы elseifidni , or al, PCSpeakerDataGate ; записать 1 в бит разрешения работы elseifidni , and al, not PCSpeakerDataGate; записать 0 в бит разрешения работы else .err Неправильно указана операция со счётчиком динамика. endif out 61h, al endm ;─────────────────────────────────────────────────────────────────────────────── ; Стандартрный код, по-видимому сообщающий клавиатуре о том, что байт ; данных из портра прочитан и принят. Можно перердаватрь следрующий байр ; SPKBDReaded macro in al, 61h ; Взять значение из порта управления клавиатурой mov ah, al ; Сохрарнить его в ah or al, MKBDEnableBit ; Разрешить клавиатуру out 61h, al ; mov al, ah ; Восстановить исходное содержимое порта. out 61h, al ; endm ;─────────────────────────────────────────────────────────────────────────────── ; Устанавливает адрес читаемого/записываемого байта RTC/CMOS ; Address -- адрес (число) интересующего байта RTC или байтовый регистр, кроме al ; Если адрес задан регистром, то его корректность не проверяется. Адрес должен ; быть меньше 64 (40h). ; Портит регистры: al. SetIndexRTCRAM macro Address local Reg ifregb Address, Reg if reg EQ No if Address LT 01000000b in al, 70h or al, Address out 70h, al else .err RTC: Слишком велик адрес endif else in al, 70h or al, Address out 70h, al endif endm ;─────────────────────────────────────────────────────────────────────────────── ; Разрешает или запрещает прерывания NMI. ; Параметр EnDes должен быть или Enable (разрешить), или Desable (запретить). SPNMI macro EnDes:req in al, 70h ifidni , or al, CmSPNMIEna elseifidni , and al, not CmSPNMIEna else .err Неправильно указана операция с прерываниями NMI endif out 70h, al endm ;─────────────────────────────────────────────────────────────────────────────── ; Задержка при работе с портами ввода/вывода ; Переменная .DelayType должна указывать тип процессора (286, 386, ...) SPDelay macro ifdef .DelayType if .DelayType GE 486 ; Порт 0E1h специально для задержки времени на любых чипсетах out 0E1h, ax ; (Надо найти более подробную информацию о нем.) endif else jmp short $+2 ; Данная задержка используется на машинах до 386 включительно. Основана на том, что endif ; процессоры до 386 после перехода очищают очередь команд, и начинают выборку команд endm ; из памяти заново. ; Конец файла sysports.inc ; ;─░P*.FRM*.MAC<БA*.FRM