Просмотр полной версии : Команды OUTI, INI и подобные и 16-битные порты
Хотелось бы прояснить для себя - возможно ли использование команд блочного ввода-вывода с 16битными портами? Где-то выдел использование OUTI для передачи блока с настройками в музпроцессор. Не понятно вот что: при исполнении этой команды меняется регистр B в качестве счётчика байт, получается эта команда работает только с 8битными портами, адрес задаётся регистром С и передать можно максимум 255 байт? Как же это работало для музпроцессора?
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бит адрес
Так по этой доке и получается, что в В задаётся счётчик и он же (уменьшенный на 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?
Gutten, да все правильно
или так
dup 11
outi
inc b
edup
outi
Так по этой доке и получается, что в В задаётся счётчик и он же (уменьшенный на 1) выставляется на старший байт адресной шины.
Получается, никак не выдать в 16 битный порт (к примеру, #FDFD) массив из 12 байт командой OUTI?
Можно:
OUTI
INC B
OUTI
INC B
...
Ну в принципе, да, так можно.
Жаль, с 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 старших бит адреса. Это просто расточительно схемотехнически, а пользы никакой.
Barmaley_m, проблема программера не в том чтобы работало на том железе что у него на руках, а чтобы работало на любом совместимом железе.
таким образом упрощенно писать можно но не желательно.
Barmaley_m
11.12.2016, 21:05
чтобы работало на любом совместимом железе.
Покажи мне такое железо, у которого для дешифрации портов FFFD, BFFD, 7FFD, кроме адресных линий A14 и A15, используются другие адресные линии из диапазона A8-A14.
на первом (жёлтом) скорпе кажется а13 участвует в дешифрации портов AY.
приходилось или отрезав вывод кидать на него 1 или патчить данные
иначе все цифровки молчали
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot