Управление курсором через порты ввода/вывода

Тема в разделе "WASM.ASSEMBLER", создана пользователем shi, 30 сен 2006.

  1. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Подскажите, плз, как в протектед-мод управлять курсором ввода?

    Видимо, это нужно делать через порты. Но если есть другие решения, буду рад узнать.
    Через V86 и int10h не очень хочется - слишком навороченно для такой простой задачи.

    Хорошо бы найти какой-нибудь обширный хелп по портам архитектуры PC
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Что касается видео одаптора, то:
    http://www.codenet.ru/progr/video/egavga/
    Если будут вопросы распишу подробнее.
    Обширного хэлпа нет. А вобще есть Ralf_Brown_2000.
     
  3. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Спасибо за ссылку и за оперативность.
    А что означают знаки вопроса в номерах портов( напр, в оглавлении:
    Порт 3?5h: Регистр Старшего Адреса Курсора (Индекс eh) (Cursor Location High Register)
    )? Это какие-то обозначения, или их значения могут варьироваться?
     
  4. Ole

    Ole Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    69
    3?5 имеет два варианта. 3B5 для монохромных режимов и 3D5 для цветных. В твоем случае наверное последнее.
     
  5. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Этот вопрос, скорее, по языку С
    Есть такая global функция на nasm:
    Код (Text):
    1. port_in_char:
    2.     mov dx,[esp+4]
    3.     in al,dx
    4. retn
    И на С:
    Код (Text):
    1. char port_in_char(short port);
    2.  
    3. static int get_cursor() {
    4. //    return cursor;
    5.    
    6.     port_out_char(CRTC_ADDRESS_PORT,CURSOR_HI_REGISTER);
    7.     int x = (int)port_in_char(CRTC_REGISTER_PORT);
    8.    
    9.     port_out_char(CRTC_ADDRESS_PORT,CURSOR_LO_REGISTER);
    10.     return (x<<8) + (int)port_in_char(CRTC_REGISTER_PORT);
    11.    
    12. }
    последняя глючит на переполнениях: выдаёт значение, которое отличается от истинного на величину, кратную 256(напр, 0, -256). Ну никак не пойму, почему...

    Кстати, аналогичная функция set_cursor(int) работает нормально, т.е. константы все правильные
     
  6. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    функция get_cursor() должна возвращать short, старший байт которого есть результат первого вызова port_in_char, а младший - соответственно, результат второго вызова той же функции

    функция char port_in_char(int port) должна бы, вроде, возвращать значение char из портa port.

    port_out_char работает нормально - проверено
     
  7. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Если кому-либо интересно, то я уже нашел решение:
    port_in_char возвращал signed char, поэтому, когда старший бит был установлен, его неявное преобразование к int давало число на 256 меньшее, чем следовало