Есть порт, допустим 0x300h.
Если я пишу
Code: Select all
mov dx,300h
in al,dx
Code: Select all
mov dx,300h
in ax,dx
Moderator: Shaos
Code: Select all
mov dx,300h
in al,dx
Code: Select all
mov dx,300h
in ax,dx
Теоретически - да.Tronix wrote:Ну, в AL положим то же что и раньше, а что в AH? Следующий байт из регистра 0x300h или байт из регистра 0x301h?
Code: Select all
IN EAX, DX
нефига не равноin al,dx
in ah,dx
Code: Select all
in ax,dx
Все правильно. Почему же "из соседнего какого-то" ? Не из соседнего какого-то, а просто читает в два приема один 16-битный порт.Tronix wrote:Имеется ввиду именно 8088. В том то и дело, что он не делает два захода, а походу в AH помещает значение из соседнего какого-то порта.
То естьнефига не равноin al,dx
in ah,dxCode: Select all
in ax,dx
То есть у тебя имеется конкретно плата на которой есть реальный i8088?Tronix wrote:Имеется ввиду именно 8088.
Code: Select all
in al,dx
in ah,dx
Code: Select all
in ax,dx
Code: Select all
in al,dx
xchg ah,al
inc dx
in al,dx
xchg ah,al
Точно. А в ax при этом 16-бит слово из 300h. Масло масляное, но может прояснит, а может и запутает.Lavr wrote: in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:в этом случае, если dx = 300hCode: Select all
in al,dx xchg ah,al inc dx in al,dx xchg ah,al
то в al - байт из 300h
а в ah - байт из 301h
"Правда освобождает!" (с)Mixa64 wrote:но может прояснит, а может и запутает.
Справедливо, если это реализовано в железе на плате. А что за система там с 8088 - я так и не услышал.Mixa64 wrote:А 8086 прочитает 16-битный порт в один прием, если он выровнен на 16 бит (синоним - четный адрес), и в два приема, если его адрес нечетный.
Я не понимаю, как 16-битное слово читается? шина - 8 битная. Соответственно на шине данных не может 16 битное слово быть никак за раз. При in al,порт - все понятно. При in al,dx; xchg al,ah; inc dx; in al,dx то же все понятно. Не понятно с in ax,dx.Mixa64 wrote:Точно. А в ax при этом 16-бит слово из 300h. Масло масляное, но может прояснит, а может и запутает.Lavr wrote: in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:в этом случае, если dx = 300hCode: Select all
in al,dx xchg ah,al inc dx in al,dx xchg ah,al
то в al - байт из 300h
а в ah - байт из 301h
А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?Tronix wrote: Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.
Разбирайся со схемотехникой "Поиска". Я не знаю как там сделано. И я уже 3-й раз говорю,Tronix wrote:Для меня это не очевидно нефига.
Не мешает ничего (кроме усложнения схемы). Так то можно и вообще окно в 64 кб сделать в памяти, и сразу 64кб данных перебрасывать. Но речь не о том, а о том, что я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.Mixa64 wrote:А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?Tronix wrote: Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.
Для скорости можно и ПДП замутить, заодно и прикольнее гораздо: один раз программно дергаешь, а дальше оно само пересылается.
Неправильно ты думал. И я уже объяснять устал. В железе - может быть простоTronix wrote: я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.
Подробно и с картинками, правда, на английском, но, на мой взгляд,Lavr wrote:посмотри документ: 8086_PROGRAMMED _IO.doc...