nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 14 Aug 2020 18:01



Reply to topic  [ 7 posts ] 
Нетрадиционная польза от команд IN / OUT в Z80 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
.
У процессора КР580 ВМ80 команды IN/OUT выставляют адрес порта на обоих половинках адреса, а процессор Z80 выставляет на старшую половину адресов содержимое регистра B. Благодаря чему, загружая регистр B и делая для портов дешифрацию всех адресов можно поиметь аж 65536 I/O-портов.

Если использовать это свойство Z80 в сочетании с идеей по опросу клавиатуры с использованием сигналов с самой шины адреса (что использовано в ZX80 и ZX-Spectrum), то можно подключить к компьютеру на Z80 клавиатуру с неудобной матрицей. Максимальный размер клавиатурной матрицы опрашиваемой таким способом - это 16*8. Преимущество использования такого метода подключения клавиатуры - это затрата всего одного 8-ми разрядного регистра (например одного порта из ППА ВВ55), а т.к обычно ВВ55 уже есть, то расхода на детали вообще нет.

Например, клавиатура от Корвета имеет странную матрицу в которой по горизонтали до 16 линий и её трудно подключить к РК86 традиционно через её ВВ55, т.к в РК исходно матрица 8*8. Есть и другие готовые клавиатуры с большим числом линий. Например, у меня есть фирменная клавиатура от западной ЭВМ из начала 80-тых с матрицей 14*6 и её ранее не смог подключить ни к РК86, ни к Специалисту. Также клавиатуры для IBM PC имеют матрицу крупнее, чем 8*8 (что в РК и ОРИОНЕ) или 12*6 (что в Специалисте) и потому их также не подключишь к ОРИОНУ или Специалисту через их ППА клавиатуры.

Голая матрица из клавиатуры IBM PC получается если из платки старой IBM клавиатуры удалить паучину контроллера (или отрезать цепи линий матрицы от её выводов) и подпаять проводки прямо к печати. Кстати, при использовании IBM клавиатуры на базе токопроводящей резины желательна замена КР580 ВВ55 на 82C55 и резисторов привязки на 200 кОм, т.к токопроводящая резина при нажатии кнопки даёт не "короткое замыкание", а сопротивление ~500 Ом, чего недостаточно для утягивания не КМОП-входа ниже 1.5 вольт (чтобы воспринималось как 0).

Ещё данное свойство Z80 можно использовать, чтобы вообще без затрат деталей (даже на логику) в системах, где порты "положены" на память (что сделано в подавляющем большинстве бытовых 8-ми разрядок) организовать таким образом ROM/RAM-диск для данных на 64К стоящий в области портов. Т.о на Z80 можно, как и при процессоре 580 ВМ1, иметь 64К для кодов программ и ещё 64К для данных.

В компьютере ЮТ88 был организован эл.диск на 64 кб используя в качестве флага обращения к нему бит "стек" слова состояния процессора КР580. Там после команды включения эл.диска стековые команды попадали не в основное ОЗУ, а в банку ОЗУ электронного диска. Но это техническое решение в ЮТ88 потребовало доп.расход в несколько микросхем. Тогда как организация эл.диска на командах IN/OUT вообще не требует деталей (и такой эл.диск, в отличие от эл.диска из ЮТ88, не надо включать/выключать отдельной командой).

- - - Добавлено - - -

А rw6hrm принадлежит идея, что можно Z80 командами IN/OUT с полной дешифрацией ША работать с текстовым экраном в доп.банке ОЗУ. Экранное ОЗУ при этом не занимает адресное пространство памяти и не требует включения/выключения экранного ОЗУ из адресного пространства (как сделано в ПК "Львов").

Это возможно потому, что используя команду OUT (C),A что записывает байт по адресу (BC) в области портов получается такая же косвенная адресация экрана, как и с экраном в адресном пространстве с которым работают командами типа LD (RR),A переходя командой INC RR к следующему экранному байту. Здесь то же самое, только делается INC BC.


Last edited by barsik on 14 Jan 2020 15:10, edited 3 times in total.



11 Jan 2020 16:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
При работе с портом 580ВВ55 под управлением микропроцессора 580ВМ80 очень удобна
команда SHLD XXXX, в том случае, если ППА включен как ячейки памяти.

Особенно это удобно в случае сканирования 7-сегментного индикатора портами А и В.
Если в HL загружать 7-сегментный код и его позицию, то команда SHLD PORT_BASE
выводит эти значения в порты А и В практически одновременно.

_________________
iLavr


11 Jan 2020 19:05
Profile
Doomed

Joined: 18 Nov 2013 03:38
Posts: 648
Location: Москва
Reply with quote
Польза несомненно есть - можно не парить мозги с I/O и цеплять порты напрямую к ISA. При инициализации всяких VGA Realtek и Trident не нужно думать, а просто какие есть у них порты управления, в те и писать. Только 0xA0000 память надо как-то маппить в адресное пространство z80, ну выделить один порт для переключения ISA video ram и основной памяти, но тоже ничего сложного.


12 Jan 2020 02:34
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Lavr wrote:
микропроцессора 580ВМ80
Раз уж в теме обсуждается и КР580, то добавлю и про него.

Почитывая на досуге вражеские книги и журналы на тему антикварных микропроцессоров, узнал недавно, как следовало с пользой использовать наличие в КР580 команд IN/OUT. Оказывается, чтобы использовать команды IN/OUT совершенно необязательно ставить системный контроллер ВК28 (или делать его аналог вокруг 589ИР12 на мелкой логике).

IN/OUT выгодны тем, что они 2-х байтовые, тогда как команды работы с ОЗУ (если не считать косвенную адресацию) - трёх-байтовые. Когда идёт битва за каждый байт, что типично для кода прошиваемого в ПЗУ, то возможность применить IN/OUT становится ценной.

Т.к I/O-портов всего 256, то в РК86 достаточно выделить в области памяти одну страницу в 256 байт. В РК найти свободные сплошные 256 адресов не проблема. Чтобы поиметь 256 портов в памяти, но с которыми можно работать командами IN/OUT, хитрые враги обычно делают так.

Они при работе команд IN/OUT хитро выдают на старшую половину шины адреса (msb) старший адрес страницы выделенной для портов. Например, если мы решили отдать портам участок A000...A0FF, то надо выдавать при OUT на адреса A15...A8 число A0.

Процессоры 8085 и Z80 сразу дают /IORD и /IOWR, которые можно объединить на двух диодах и резисторе, получив сигнал /IO о том, что идёт команда IN/OUT. А вот при КР580 требуется получать его из "слова состояния", для чего надо по фронту SYNC защёлкивать в 155 ТМ2 биты D4 и D6, а инверсные выходы этих триггеров также объединить двумя диодами. Полученный с помощью 2-х диодов сигнал /IO, когда он равен 0, свидетельствует, что идёт работа с портами.

Если по этому сигналу /IO выдавать на старшую половину адресов адрес страницы портов в памяти (в данном примере это A0), то с портами отображёнными в память можно работать командами IN/OUT, как при наличии системного контроллера. Выгоднее всего старший (msb) байт адреса страницы портов выдавать с помощью двух 555 КП11, т.к при этом одновременно адреса A15...A8 процессора буферизуются. Но можно использовать отключаемый 8-ми разрядный буфер АП6 и резисторы привязки (что даёт страницу портов FF00).

Эти КП11-тые при не OUT-командах пропускают через себя адреса A15...A8 от процессора, а при OUT командах выдают в линии A15...A8 msb-байт адреса страницы портов. Если изменять число набранное на входе КП11, то страницу портов можно "гонять" по всему адресному пространству, что, кстати, и делается в «Корвете» (позволяя создать конфигурацию наиболее удобную для конкретной задачи, например, там одна конфигурация портов для МГ-бейсика и совсем другая для CP/M).

Причём, интересно, что мы получаем порты, которые читаются и по обращению в память и по IN/OUT, что даёт нам ещё больше выигрыша. Во-первых, скорость. LD A,(HL) выполняется вдвое быстрее, чем IN A,(port). Во-вторых, мы можем проверять один флаг по биту D7 всего одной командой. Например, INC (HL) при HL указывающем в порт выдаст во флаге Signum значение бита D7 порта, что экономит нам команду OR A. При этом возможность работать с портами двухбайтовыми IN/OUT, и экономить тем самым объём кода в некритичных к скорости местам, сохраняется.

Не знаю дошла ли ценность идеи до малоопытных в железе, потому упомяну лишь что, если бы разработчики РК86 читали в своё время вражеские книги, то они могли бы израсходовать на порты не 32 тысячи адресов, а всего 256, получив при этом выигрыш в объёме кода за счёт двухбайтовости команд IN/OUT, причём не увеличивая число корпусов.

PS. msb на вражеском языке означает "most significant byte".


Last edited by barsik on 23 Feb 2020 21:55, edited 2 times in total.



13 Jan 2020 05:49
Profile
Doomed
User avatar

Joined: 13 Nov 2007 12:09
Posts: 414
Location: Ставрополь
Reply with quote
barsik wrote:
... достаточно выделить в области памяти одну страницу в 256 байт.

... и всё, что написано далее, почему-то мне напоминает о процессоре 6502 ;)), у которого страничная адресация памяти по 256 байт.
Ну это так, навеяло...
barsik, о чём мы говорили в нашей переписке, а именно про адресацию внешнего блока памяти через IN/OUT, - получилось! Теперь имею внешний видеоадаптер, память которого отделена от процессорной и адресуется через порты ВВ. Скорости для видеовывода хватает, артефакты записи в память (мурашки, как на ЮТ-88) отсутствуют (может ещё потому, что порт ВВ доступен только во время обратного хода синхроимпульсов).


13 Jan 2020 12:21
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
rw6hrm wrote:
через IN/OUT, - получилось!
Сразу было ясно, что идея состоятельная. Но бОльшая ценность идеи об адресации поля памяти вне плоскости процессора - для организации ROM/RAM-диска, т.к и работа с ним при этом в разы быстрее, чем через ППА, а главное расход деталей - ноль.
rw6hrm wrote:
Скорости для видеовывода хватает
Потеря быстродействия в самом коротком цикле пересылок не превышает 13%. Более неприятна потеря для работы с экраном стековых команд, что сильно ускоряет ролик и в меньшей степени неприятна потеря команды LDIR.
rw6hrm wrote:
порт ВВ доступен только во время обратного хода синхроимпульсов... мурашки, как на ЮТ-88
Если останавливать процессор WAIT-ом до начала бордюра (по горизонтали или вертикали), то это, хотя и устраняет блёстки на экране, но тормозит скорость вывода на 90%. Чтобы процессор не нарушал циклы доступа видеочасти к ОЗУ надо иметь период доступа к ОЗУ вдвое выше периода доступа к ОЗУ видеочасти. Тогда пол этого периода отдаётся для доступа видео схемы, а во вторую половину ОЗУ доступно процессору. Если клок CPU и период доступа к ОЗУ видеочасти синхронны, то потеря быстродействия не превышает 20% и никаких блёсток на экране возникнуть не может.

Блёстки возникают только когда процессор имеет приоритет и запрещает в свои циклы доступ к ОЗУ видеочасти. Так делают в простых текстовых адаптерах, но даже тогда за счёт принудительного гашения экрана (на время доступа процессора) блёсток не видно при чёрном экране (они видны только при белом экране). Блёстки бывают ещё в неграмотных схемах, когда запрета доступа видеадаптеру нет, но соседние циклы влияют, создавая ошибки считывания видеочастью из-за кратковременных конфликтов на шине. Какая из этих причин блёсток на экране работает в ЮТ88 ?


15 Jan 2020 14:13
Profile
Senior

Joined: 31 Mar 2012 17:50
Posts: 138
Location: 93.73.80.128
Reply with quote
i8255 может работать и на вывод и на ввод, потому лепить его только на вывод неправильно, хотя в msx так и есть, для вывода вполне достаточно простого 8bit регистра


18 Jan 2020 13:46
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 7 posts ] 

Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.