У меня два вопроса: 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_: А, да есть такое! Я совсем забыл... Надо опять читать Зубкова... В следующий раз, когда туда поеду, попытаюсь теперь с контроллером разобраться... 2all: Но все-таки, мне еще бы хотелось услышать чье-то мнение относительно записи в порт... Что, куда, и какого размера надо послать, судя по приведенной части документации, чтобы установить этот мазафакин бит 1 по смещению 3?...
Мне вот этот вариант больше нравится: Код (Text): mov dx, base+3 mov al, 2 out dx, al В любом случае можно перебрать все биты 2 в диапазоне от base до base+0Fh. Порт base+0 похоже word для [записи?] данных.
Шьерт! Такое сообщение написал, и так и не нажал "send"! В-общем, со смешениями я разберусь как только научусь разрешать 12 прерывание Это делается так: in al,A1h and al,11101111b out A1h,al ? Этого достаточно? Ну, с точностью до базового адреса, куда спроецировал 8-15 прерывания 2 контроллер. Кстати, откуда можно узнать эти базовые адреса? Что-то в Зубкове я этого не нашел...
как только научусь разрешать 12 прерывание Ну да, только ведомый контроллер (который на A1) должен быть подключен через размаскированное прерывание к ведущему, хотя это наверняка и так работает. куда спроецировал 8-15 прерывания 2 контроллер В win98 я это выяснил методом перебора Поскольку после установки первого irq второго контроллера на вектор 50h (в 98-ой) все остальные идут рядом (следом), то проанализировав адреса обработчиков и для проверки поставив бряк на 40h,50h,60h... я убедился, что база была именно 50h (точно уже не помню). В досе еще проще - если уже есть мышь на com-порту, то можно просто посмотреть адрес обработчика или типа того. Еще я как-то дизассемблировал вот такой код, размаскирующий прерывание уровня irq: Код (Text): Const IntMaskList: array[1..8] of Byte = ($01,$02,$04,$08,$10,$20,$40,$80); procedure OpenLine(base,irq,opcode:word); begin ... mov ax,irq and al,07h mov Byte0095,al ; Получить адрес вектора прерывания: mov al,Byte0095 add al,08h mov ah,35h int 21h ... ; Размаскировать прерывания mov al,Byte0095 mov bx,offset IntMaskList xlat mov Byte0096,al not al mov ah,al in al,21h and al,ah out 21h,al
_Chingachguk_, большое тебе спасибо! Я стал на путь истины! Так бы я долго пытался заставить что-то вызывать прерывание int 12 Хорошо, что com1 во время моих экспериментов был отключен, а то это бы меня совсем с правильного пути бы отвело...