Доступ к этим регистрам осуществляется прямым обращением к соответствующим портам ввода-вывода.
Регистр состояния ввода 0 (ISR0) — доступен для чтения из порта 03С2
бит 7: произошло прерывание обратного хода луча IRQ2
бит 6: дополнительное устройство 1 (линия FEAT1)
бит 5: дополнительное устройство 0 (линия FEAT0)
бит 4: монитор присутствует
Регистр вывода (MOR) — доступен для чтения из порта 3CCh и для записи как 3C2h
биты 7 – 6: полярность сигналов развертки — (01, 10, 11) = (350, 400, 480) линий
бит 5: 1/0 — нечетная/четная страница видеопамяти
биты 3 – 2: частота — (00, 01) = (25,175 MHz, 28,322 MHz)
бит 1: 1/0 — доступ CPU к видеопамяти разрешен/запрещен
бит 0: 1/0 — адрес порта контроллера CRT = 03D4h/03B4h
Регистр состояния ввода 1 (ISR1) — доступен для чтения из порта 03DAH
бит 3: происходит вертикальный обратный ход луча
бит 0: происходит любой обратный ход луча
Лучший момент для вывода данных в видеопамять — момент, когда электронный луч двигается от конца экрана к началу и экран не обновляется, то есть вертикальный обратный ход луча. Перед копированием в видеопамять полезно вызывать, например, следующую процедуру:
; процедура wait_retrace ; возвращает управление в начале обратного вертикального хода луча ; wait_retrace proc near push ax push dx mov dx,03DAh ; порт регистра ISR1 wait_retrace_end: in al,dx test al,1000b ; проверить бит 3 ; Если не ноль - jnz wait_retrace_end ; подождать конца ; текущего обратного хода wait_retrace_start: in al,dx test al,1000b ; а теперь подождать ; начала следующего jz wait_retrace_start pop dx pop ax ret wait_retrace endp