опять про порты...

Тема в разделе "WASM.ELECTRONICS", создана пользователем ubil, 25 фев 2005.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    У меня два вопроса: 1 общего содержания, а другой - более конкретного.

    1)

    Пусть у нас есть дивайс, у которого есть некая область портров в-в, и мы выполняем команду out dx, ax; означает ли это, что 1 байт из ax пойдет в порт dx, а другой - в порт dx+1?



    2)

    Такой вопрос возник в процессе проработки мануала к дивайсу:

    там (кроме всего прочего) написано:

    All operations are to even addresses, and the offsets given below are in 2 byte units. The transfer can be either a 16 bit word (length code W below), an 8 bit byte of which only n bits are used (n), or no data may be transferred at all (0).



    Offset Length Desc.

    0 W Send word to camera

    1 0 Reset interfase to no error state

    2 1 Enable/disable DMA if bit 0 = 1/0

    3 2 Enable/dis. end of DMA interrupts if bit 0 = 1/0

    Enable/dis. end of operation interrupts if bit 1 = 1/0

    4 0 Cancel camera interrupt request

    ...

    Сначала я пытался разрешить прерывания командами

    mov dx, base+3

    mov al, 2

    out dx, al



    Но потом "заметил" "are in 2 byte units" и исправил на

    mov dx, base+3*2

    mov ax, 2

    out dx, ax



    И результат все-равно был одним и тем же - прерывания не генерировались там, где должны были(да и вообще нигде не генерировались:) )



    И вот мой второй вопрос: как бы вы, мегашарящие пиплы:), стали "разрешать" прерывания на моем месте?



    И еще, просто интересно, зачем там указана длина? Это что, просто информация для общего развития, о том, что при посылке слова в данный порт только 2, 1, или 0 бит из 16 будет передано дивайсу? Тогда к чему там написано "an 8 bit byte"? В-общем, какие-то нерусские люди писали мануал, что теперь еще, вдобавок, через 7 лет, наш человек там точно все ноги переломает:)
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    прерывания не генерировались



    Это лучше размаскировать прерывания в контроллере прерываний ;)
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    2_Chingachguk_:

    А, да есть такое!:) Я совсем забыл... Надо опять читать Зубкова... В следующий раз, когда туда поеду, попытаюсь теперь с контроллером разобраться...



    2all: Но все-таки, мне еще бы хотелось услышать чье-то мнение относительно записи в порт... Что, куда, и какого размера надо послать, судя по приведенной части документации, чтобы установить этот мазафакин бит 1 по смещению 3?...
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ubil

    1. Да, это в книге Р. Хайда описано.
     
  5. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Мне вот этот вариант больше нравится:


    Код (Text):
    1. mov dx, base+3
    2. mov al, 2
    3. out dx, al




    В любом случае можно перебрать все биты 2 в диапазоне от base до base+0Fh. Порт base+0 похоже word для [записи?] данных.
     
  6. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Шьерт! Такое сообщение написал, и так и не нажал "send"!:)



    В-общем, со смешениями я разберусь как только научусь разрешать 12 прерывание:) Это делается так:

    in al,A1h

    and al,11101111b

    out A1h,al ? Этого достаточно?

    Ну, с точностью до базового адреса, куда спроецировал 8-15 прерывания 2 контроллер. Кстати, откуда можно узнать эти базовые адреса? Что-то в Зубкове я этого не нашел...
     
  7. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    как только научусь разрешать 12 прерывание



    Ну да, только ведомый контроллер (который на A1) должен быть подключен через размаскированное прерывание к ведущему, хотя это наверняка и так работает.



    куда спроецировал 8-15 прерывания 2 контроллер



    В win98 я это выяснил методом перебора ;) Поскольку после установки первого irq второго контроллера на вектор 50h (в 98-ой) все остальные идут рядом (следом), то проанализировав адреса обработчиков и для проверки поставив бряк на 40h,50h,60h... я убедился, что база была именно 50h (точно уже не помню). В досе еще проще - если уже есть мышь на com-порту, то можно просто посмотреть адрес обработчика или типа того.



    Еще я как-то дизассемблировал вот такой код, размаскирующий прерывание уровня irq:


    Код (Text):
    1. Const
    2.  
    3.   IntMaskList: array[1..8] of Byte = ($01,$02,$04,$08,$10,$20,$40,$80);
    4.  
    5. procedure OpenLine(base,irq,opcode:word);
    6.   begin
    7. ...
    8.   mov  ax,irq
    9.   and  al,07h
    10.   mov  Byte0095,al
    11. ; Получить адрес вектора прерывания:
    12.   mov  al,Byte0095
    13.   add  al,08h
    14.   mov  ah,35h
    15.   int  21h
    16.   ...
    17. ; Размаскировать прерывания
    18.   mov  al,Byte0095
    19.   mov  bx,offset IntMaskList
    20.   xlat
    21.   mov  Byte0096,al
    22.   not  al
    23.   mov  ah,al
    24.   in   al,21h
    25.   and  al,ah
    26.   out  21h,al
     
  8. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    _Chingachguk_, большое тебе спасибо! Я стал на путь истины!:)



    Так бы я долго пытался заставить что-то вызывать прерывание int 12:) Хорошо, что com1 во время моих экспериментов был отключен, а то это бы меня совсем с правильного пути бы отвело...