Вход

Просмотр полной версии : Команды OUTI, INI и подобные и 16-битные порты



Gutten
05.12.2016, 15:08
Хотелось бы прояснить для себя - возможно ли использование команд блочного ввода-вывода с 16битными портами? Где-то выдел использование OUTI для передачи блока с настройками в музпроцессор. Не понятно вот что: при исполнении этой команды меняется регистр B в качестве счётчика байт, получается эта команда работает только с 8битными портами, адрес задаётся регистром С и передать можно максимум 255 байт? Как же это работало для музпроцессора?

drbars
05.12.2016, 17:02
Gutten, регистр B каждый раз задавался перед командой.

Hacker VBI
05.12.2016, 17:07
Gutten, официальная дока (http://zilog.com/appnotes_download.php?FromPage=DirectLink&dn=UM0080&ft=User%20Manual&f=YUhSMGNEb3ZMM2QzZHk1NmFXeHZaeTVqYjIwdlpHOWpjeTk2 T0RBdlZVMHdNRGd3TG5Ca1pnPT0=)всё прояснит.
рег. В декрементируется ПЕРЕД выполнением отправки.
вывод идёт в 16бит адрес

Gutten
05.12.2016, 17:37
Так по этой доке и получается, что в В задаётся счётчик и он же (уменьшенный на 1) выставляется на старший байт адресной шины.

Register B can be used as a byte counter, and its decremented value is placed on the top half (A8 through A15) of the address bus.

Example
If Register C contains 07h, Register B contains 10h, the HL register pair contains 100014
and memory address 1000h contains 5914, then upon the execution of an OUTI instruction,
Register B contains 0Fh, the HL register pair contains 1001h, and byte 59h is written
to the peripheral device mapped to I/O port address 07h.

Получается, никак не выдать в 16 битный порт (к примеру, #FDFD) массив из 12 байт командой OUTI?

jerri
05.12.2016, 18:44
Gutten, да все правильно
или так


dup 11
outi
inc b
edup
outi

zx-kit
05.12.2016, 18:50
Так по этой доке и получается, что в В задаётся счётчик и он же (уменьшенный на 1) выставляется на старший байт адресной шины.


Получается, никак не выдать в 16 битный порт (к примеру, #FDFD) массив из 12 байт командой OUTI?

Можно:
OUTI
INC B
OUTI
INC B
...

Gutten
06.12.2016, 00:30
Ну в принципе, да, так можно.
Жаль, с OTIR уже так не провернуть. Можно было бы память экономить.

Hacker VBI
06.12.2016, 12:15
выдаём блок парой "старший байт адреса, значение"
рег С должен хранить нужное значение младшего байта адреса порта
set_ports
.m1 ld b,(hl)
inc hl
inc b
ret z
outi
jr .m1
постоянно юзаю эту функцию для блочного программирования железа TS Conf

Barmaley_m
11.12.2016, 01:14
Нужно еще учитывать, что при дешифрации портов 7FFD, FFFD и BFFD учитываются не все 8 старших бит адреса, а только (обычно) A14 и A15. Поэтому вывод в любые порты с адресами XXFD, где XX=00..7F, попадет в регистр номера страницы Spectrum-128. В некоторых случаях работает не весь диапазон x=00..7F, а только его часть, например, 40FD..7FFD. Но все равно это много. Для AY обычно работают диапазоны XX=80..BF -> BFFD, XX=C0..FF -> FFFD. Поэтому уменьшение регистра B командами OUTI и OTIR не должно помешать выводу в эти порты небольших блоков данных.

Мне еще не встречался реальный клон ZX, у которого для дешифрации портов 128 и AY использовались бы все 8 старших бит адреса. Это просто расточительно схемотехнически, а пользы никакой.

jerri
11.12.2016, 17:13
Barmaley_m, проблема программера не в том чтобы работало на том железе что у него на руках, а чтобы работало на любом совместимом железе.
таким образом упрощенно писать можно но не желательно.

Barmaley_m
11.12.2016, 21:05
чтобы работало на любом совместимом железе.
Покажи мне такое железо, у которого для дешифрации портов FFFD, BFFD, 7FFD, кроме адресных линий A14 и A15, используются другие адресные линии из диапазона A8-A14.

goodboy
11.12.2016, 21:31
на первом (жёлтом) скорпе кажется а13 участвует в дешифрации портов AY.
приходилось или отрезав вывод кидать на него 1 или патчить данные
иначе все цифровки молчали