Венец творенья

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

User avatar
danchandoo
Fanat
Posts: 63
Joined: 24 Sep 2007 12:15
Location: Украина

Post by danchandoo »

По делу: собрал некое устройство для взаимодействия с LPT портом, 3 защелки, буфер, дешифратор (можно до 8-ми защелок). В общем позволяет передать данные с порта в любую из защелок. Хочу спросить, выводы GND LPT порта соеденять с землей самого устройства, или нет? Само устройство питается от блока питания компа, через molex, как и все мои поделки.

Не по делу: из философии программирования.
HardWareMan wrote:Новоиспеченные программеры все более и более абстрагируются от железа, считая что они должны заниматься конкретно задачей а не изучать архитектуры и все такое. Соответственно, они полагаются на компилятор, который писали такие же балбесы, но которые чуть-чуть подтянули знания о железе, ибо без этого никак не написать компилятор.
Это не плохо. Нет. Это просто необходимо. Представьте себе инженера, который прежде чем строить мост, проверяет все используемые при этом законы физики и их следствия, проверяет достоверность опытов, которыми они подтверждаются, проверяет использованые физиками математические теоремы, проделывает заново весь научный путь за 400 и более лет... Сколько на это уцдет времени? Когда он наконец сможет начать проектировать мост? Или ему еще прейдется разобраться с принципами работы компьютера на котором выполняются расчеты. Вдруг там кроется ошибка...

Для пущего пафоса приведу себе в поддержку еще и Дейкстру, который говорил, что чем далее программист отдален от особенностей работы конкретной платформы тем лучше. Тем эфективнее становится отношение затраченная работа/результат.

Полагаться на компилятор можно и нужно, и чем дальше тем чаще.

П. С. Сам я при этом люблю как раз ковыряться в недрах системы, знать как все устроенно в деталях, без этого я испытываю дискомфорт.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

danchandoo wrote:По делу: собрал некое устройство для взаимодействия с LPT портом, 3 защелки, буфер, дешифратор (можно до 8-ми защелок). В общем позволяет передать данные с порта в любую из защелок. Хочу спросить, выводы GND LPT порта соеденять с землей самого устройства, или нет?
Угу - соединять
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Зачем ПЗУ? Вплоне бесПЗУшная работоспособная схема есть:
http://stor.altervista.org/z80/schema_2.htm
Я посмотрел - самое то. Запускаем проц и через ЛПТ сливаем ему прогу приема,
а потом сливаем данные, после подачи последнего байта клац тумблером и
вперед (можно не тумблром а портом, но тумблером нагляднее.
http://stor.altervista.org/z80/schema_2 ... hema_2.gif
А подробнее можно? Как мы "сливаем ему прогу приема"?

Image

У него ПЗУ нет... или лэтч стоИт по адресу 0000Н и фактически мы должны
через ЛПТ имитировать работу ПЗУ, подтормаживая z80, ибо по ЛПТ
иначе не успеем...
Так чтоль?

PS. Открыл картинку, чтобы было понятно - о чём мы...
Last edited by Lavr on 06 Apr 2012 12:42, edited 1 time in total.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Ну там же на схеме все видно. Естественно тормозим сигналом WAIT. Здесь имитация ПЗУ, но очень хитрая. Так как текущий адрес мы не знаем, то предполагается, что к порту мы подключаем его сразу после ресета. Потом, мы просто подаем заготовленную последовательность команд, поведение которых предсказуемо. Например, если ПЗУ с 0 по $7FFF, а ОЗУ сверху, то вполне мы можем подать последовательность команд MVI/STA. Это получается 1 полезный байт на 5 байт ПЗУ. Если применить LXI H/SHLD, то получим 2 байта на 6 байт ПЗУ, что эффективнее. Т.е., в линейном пространстве "ПЗУ" объемом 32Кбайта мы можем подать 32768/6=5461,33 последовательности и еще остается 32768-(5461*6)=32768-32766=2 байта. Этого не хватает для джампа, но он и не нужен, если ОЗУ начинается с 8000. Если ОЗУ с другого адреса, то мы можем пожертвовать 1 блоком и запихать нормальный джамп. При этом, 5460 последовательностей перенесут 5460*2=10920 байт. Не кисло, да? Ну а если сделать виртуальный цикл: MVI/STA/JMP, то используя всего 8 виртуальных байт можем переслать сколь угодно большое количество полезных байт данных в ОЗУ. После посылки последнего байта просто меняем адрес в джампе с 0000 (на цикл) на начало загруженной программы. Так достаточно подробно?
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:...
Так достаточно подробно?
Вполне.. захотелось попробовать... :wink:
Довольно оригинальное решение!
iLavr
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

HardWareMan wrote:Если применить LXI H/SHLD, то получим 2 байта на 6 байт ПЗУ, что эффективнее.
А если применить LXI H/PUSH H, то 2 байта на 4 байта ПЗУ. Только запись будет задом наперёд, но это не проблема.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Так как текущий адрес мы не знаем, то предполагается, что к порту мы подключаем его сразу после ресета. Потом, мы просто подаем заготовленную последовательность команд, поведение которых предсказуемо.
И я вот ещё подумал, что текущий адрес нам и вовсе не нужен. Здесь же Z80,
и подпрограмма-загрузчик небольшая - значит вполне хватит и диапазона
относительной адресации на цикл всей загрузки в ОЗУ.
А потом действительно подставляем абсолютный переход по нужному
адресу в ОЗУ. Его-то мы точно знаем.
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

b2m wrote:
HardWareMan wrote:Если применить LXI H/SHLD, то получим 2 байта на 6 байт ПЗУ, что эффективнее.
А если применить LXI H/PUSH H, то 2 байта на 4 байта ПЗУ. Только запись будет задом наперёд, но это не проблема.
Но при этом нужно будет сделать LXI SP,XXXX, а это еще 3 байта, но эффективность цикла все равно выше, согласен.
Lavr wrote:И я вот ещё подумал, что текущий адрес нам и вовсе не нужен. Здесь же Z80, и подпрограмма-загрузчик небольшая - значит вполне хватит и диапазона относительной адресации на цикл всей загрузки в ОЗУ.
А потом действительно подставляем абсолютный переход по нужному
адресу в ОЗУ. Его-то мы точно знаем.
Это вариант, но все никак не могу отвыкнуть от мышления аля ВМ80. :3
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Но при этом нужно будет сделать LXI SP,XXXX, а это еще 3 байта, но эффективность цикла все равно выше, согласен.
А вот это вопрос интересный... и обычно замыливается.
Давайте выясним.

Всегда пишут, что стек надо установить: LXI SP,XXXX.
Но куда-то же он по RESET всё-таки сам устанавливается?
Мы знаем, что и таймер 580ВИ53 по скромному умолчанию в известный
режим устанавливается, хотя справочники этого не обещают.

Я не имел возможности проверить, как устанавливается SP, хотя это весьма
легко проверить при старте процессора:

Code: Select all

   LXI H, 0000H
   DAD  SP; значение стека - в HL
   SHLD SPBOX
   JMP  STARTSYS
SPBOX: DW 0000H
но мы обычно получаем управление, когда стек уже установлен ОС.
На "Специалисте" это, в принципе, легко проверить, введя с 0000H эту программу,
и отключив перед RESET-ом цепи переброса ПЗУ в адрес 0000H.
"Специалист" не портит содержимое ОЗУ при RESET-е.

Но у меня есть предположение, что по RESETSP всё же сбрасывается в 0000H.
И значит верхняя ячейка стека по сбросу -> 0FFFFH.
Если у нас в верхних адресах - системное ПЗУ, стек работать не будет.
А если там ОЗУ, как в обсуждаемом варианте, то стек от 0FFFFH будет расти вниз,
и ничего необычного не произойдёт.

Или всё-таки в SP по RESET-у какие-то случайные значения?
Кто-нибуть знает точно или есть какие-либо ссылки на достоверные источники?
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Но у меня есть предположение, что по RESET-у всё же сбрасывается в 0000H.
И значит верхняя ячейка стека по сбросу -> 0FFFFH.
Я не встречал этого явно для i8080, но делаю предположение по аналогии.
Так, в частности, в MCS-48, который делали явно по мотивам i8080 и i8085,
урезая последние, и расширяя периферию на кристалле, так вот для MCS-48
указывается явно:
Сигнал RESET производит следующие действия:
сбрасывает счётчик команд (PC) и указатель стека (SP);
Да и во многих других МП по сбросу SP устанавливается в определённое значение.
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

А М68К грузит PC и SP из первых двух двойных слов таблицы векторов. ;)
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:А М68К грузит PC и SP из первых двух двойных слов таблицы векторов. ;)
Хардыч, а в твоём Интелловском мануале по i8080 нет какой-либо конкретики о состоянии SP по RESET?
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Попробовал на "железном" ВМ80 с пошаговым устройством. Похоже, что SP не сбрасывается. У меня, по крайней мере, пошаговое устройство показывает после включения так:

0000 C9; команда RET должна в следующем цикле загрузить PC содержимым SP
800A FF; здесь ничего не подключено, ШД притянута к +.

После нажатия сброса:

0000 C9
800B FF

После следующего нажатия сброса:

0000 C9
800C FF

Если выключить-включить питание, то после RET адрес будет уже другой, но последующие нажатия сброса всё также увеличивают его значения.

Вот так вот, вуаля. Может, я что-то неправильно делаю?
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Попробовал на "железном" ВМ80 с пошаговым устройством. Похоже, что SP не сбрасывается.
...
На правду похоже... то есть первоначально стек сам установился на адрес 800AН,
в остальные попытки после RESET, SP просто не менялся - поэтому сдвиг вверх по RET.
Странно, что на один адрес... :(

А по включению питания - у тебя ПЗУ в начальном адресе = RET?
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Я подставил эмулятор ПЗУ с одной только этой командой.

Перепробовал несколько разных процессоров, работают аналогично.
Last edited by VituZz on 07 Apr 2012 08:44, edited 1 time in total.