![]() |
Передача параметров хитрой железке
Граждане программеры, возник вопрос: щас прорабатывается концепция хитрой железки, и вот возникла необходимость железяке передавать команды и параметры, железяка достаточно умная теоретически умеет прослушивать шину спекка и соответствующим образом реагировать. В общем нужна помощь искушонных в Z80 людей.
Так как планируется свести к минимуму колво портов в адресном пространстве машинки мы добавляем всего 2 порта 1-индекс внутреннего регистра, 2 непосредственно адресуемый регистр в связи с этим становиться неудобно передавать параметры, так как получается следующего вида манипуляции 1. устанавливаем в первом порту номер регистра для параметра 1 2. записываем параметр в порт 2 и так для каждого регистра. плюс ситуация усугубляется еще и тем что параметры очень часто первышають 8 бит (то есть могут встречаться 2 байтные параметры) Была одна из мыслей реализовать следующим образом передачу параметров. ld h,код команды ld l, первый 1 байтый параметр push hl // записываем в стек ld hl,параметр2 push hl ld hl,параметр3 push hl ld hl,параметр4 push hl ld a,a // признак железяке что необходимо исполнить команду // возвращаем стек в нормальное состояние pop hl pop hl pop hl pop hl Железяка ведет себя следующим образом, у нее есть FIFO буфер длинной в 8 байт, железяка прослушивает шину и видет что процу попалась команда PUSH HL после чего следует 2 цикла записи в память - железка пихает их в FIFO буфер Далее если процу попадается команда ld a,a она это дело воспринимает как признак для исполнения команды (код команды получается лежит в FIFO как самый старый байт). То есть метод как бы позволяет без проблем передавать 16 бит параметры и команды, но у него есть существенные недостатки 1. Юзается стек 2. если между инструкциями PUSH HL происходит прерыание и в обработчике прерываний тоже встречаются команды PUSH HL то естественно железяка засунет эти байты в FIFO очередь (то есть уже совсем левые параметры) 3. Нужно стек возвращать в исходное состояние - а это лишние траты тактов проца В общем это я привел один из примеров что бы было видно что можно достаточно нетривиально поступать. Основные требования к методу это 1. Скорость работы 2. возможность удобно передавать 2 байтные параметры (хоят тут выменя можете разубедить что вы 2 байтные параметры можете пердавать и байтику и вам это не мешает) 3. предусмотреть возможность что количество параметров может быть непостоянно И еще так как тема относиться вроде бы к железяке добавлю что железяку тут не обсужаю, важно мнение программистов которые теоретически будут работать с данным делом и важна оптимальность взаимоотношения железяки и программаного обеспечения |
Можно сделать так: 2 порта регистр команд/состояния и регистр данных. Шлем команду "записать данные в регистр N", протом шлем необходимое количество байт в рег данных. Чтение аналогично. 256 команд надеюсь хватит ;)
|
классические порты незачем бояться :) или расшаренная память как самый быстрый вариант кидания массивов.
Quote:
|
Quote:
Для начала выделяем где нить буфер для комадного пакета заполняем его при помощи outi запихиваем в железяку вычисляем параметр правим буфер и все сначала Тоесть есть лишние телодвижения, вопрос - как вы считаете это нормально (можно ли с этим смириться)? |
Quote:
Когда работает старый софт, который может нагадить в порты, порты закрыты и не реагируют. Новый крутой софт работает при открытых портах и использует их возможности. Quote:
Код будет выглядеть так: Code:
LD HL,#xxxxQuote:
|
Quote:
Склоняюсь наверное к варианту работы с блочными командами ввода вывода у нее 2 плюса 1. не надо будет сильно извращаться 2. реализация железяки проще будет |
Quote:
ну и кучка pop hl - тоже время как бы кушает-то :) а можно не ипать мозги а повесить 256 байт обычного озу на старший байт (a8-15) порта и править эти команды хоть вдоль хоть поперек. |
Нечетко выразился
Просто ты можеш в регистре нужные манипуляции провести и послать заново push hl. В общем варант с outi все самый оптимальный выходит. |
а мне память на портах больше нравица ;)
|
Quote:
Для тугодумов: В СПЕКТРУМЕ ИМЕЮТ ЗНАЧЕНИЕ МЛАДШИЕ 8 РАЗРЯДОВ. ld a,a // признак железяке что необходимо исполнить команду Дурацкий метод. В том смысле, что может самопроизвольно что угодно навыполняться. Через порты надёжнее. [quote] Основные требования к методу это 1. Скорость работы [quote] LD HL, paramters_address LD BC, #xxyy ; xx -- ваш регистр, yy -- порт. OTIR Медленно? |
| All times are GMT +4. The time now is 21:31. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.