nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 15 Nov 2018 10:29



Reply to topic  [ 54 posts ]  Go to page Previous  1, 2, 3, 4  Next
Венец творенья 
Author Message
Fanat
User avatar

Joined: 24 Sep 2007 13:15
Posts: 63
Location: Украина
Reply with quote
Post 
По делу: собрал некое устройство для взаимодействия с LPT портом, 3 защелки, буфер, дешифратор (можно до 8-ми защелок). В общем позволяет передать данные с порта в любую из защелок. Хочу спросить, выводы GND LPT порта соеденять с землей самого устройства, или нет? Само устройство питается от блока питания компа, через molex, как и все мои поделки.

Не по делу: из философии программирования.

HardWareMan wrote:
Новоиспеченные программеры все более и более абстрагируются от железа, считая что они должны заниматься конкретно задачей а не изучать архитектуры и все такое. Соответственно, они полагаются на компилятор, который писали такие же балбесы, но которые чуть-чуть подтянули знания о железе, ибо без этого никак не написать компилятор.

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

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

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

П. С. Сам я при этом люблю как раз ковыряться в недрах системы, знать как все устроенно в деталях, без этого я испытываю дискомфорт.


27 Dec 2009 15:07
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
danchandoo wrote:
По делу: собрал некое устройство для взаимодействия с LPT портом, 3 защелки, буфер, дешифратор (можно до 8-ми защелок). В общем позволяет передать данные с порта в любую из защелок. Хочу спросить, выводы GND LPT порта соеденять с землей самого устройства, или нет?


Угу - соединять

_________________
:eugeek: https://twitter.com/Shaos1973


27 Dec 2009 18:24
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Зачем ПЗУ? Вплоне бесПЗУшная работоспособная схема есть:
http://stor.altervista.org/z80/schema_2.htm
Я посмотрел - самое то. Запускаем проц и через ЛПТ сливаем ему прогу приема,
а потом сливаем данные, после подачи последнего байта клац тумблером и
вперед (можно не тумблром а портом, но тумблером нагляднее.
http://stor.altervista.org/z80/schema_2_file/schema_2.gif

А подробнее можно? Как мы "сливаем ему прогу приема"?

Image

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

PS. Открыл картинку, чтобы было понятно - о чём мы...


Last edited by Lavr on 06 Apr 2012 13:42, edited 1 time in total.



05 Apr 2012 14:05
Profile
Banned
User avatar

Joined: 20 Mar 2005 14:41
Posts: 2150
Location: От туда
Reply with quote
Post 
Ну там же на схеме все видно. Естественно тормозим сигналом 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 (на цикл) на начало загруженной программы. Так достаточно подробно?


05 Apr 2012 20:55
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
...
Так достаточно подробно?

Вполне.. захотелось попробовать... :wink:
Довольно оригинальное решение!

_________________
iLavr


06 Apr 2012 10:47
Profile
Doomed

Joined: 26 May 2003 07:57
Posts: 634
Reply with quote
Post 
HardWareMan wrote:
Если применить LXI H/SHLD, то получим 2 байта на 6 байт ПЗУ, что эффективнее.

А если применить LXI H/PUSH H, то 2 байта на 4 байта ПЗУ. Только запись будет задом наперёд, но это не проблема.

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


06 Apr 2012 11:54
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Так как текущий адрес мы не знаем, то предполагается, что к порту мы подключаем его сразу после ресета. Потом, мы просто подаем заготовленную последовательность команд, поведение которых предсказуемо.

И я вот ещё подумал, что текущий адрес нам и вовсе не нужен. Здесь же Z80,
и подпрограмма-загрузчик небольшая - значит вполне хватит и диапазона
относительной адресации на цикл всей загрузки в ОЗУ.
А потом действительно подставляем абсолютный переход по нужному
адресу в ОЗУ. Его-то мы точно знаем.

_________________
iLavr


06 Apr 2012 12:11
Profile
Banned
User avatar

Joined: 20 Mar 2005 14:41
Posts: 2150
Location: От туда
Reply with quote
Post 
b2m wrote:
HardWareMan wrote:
Если применить LXI H/SHLD, то получим 2 байта на 6 байт ПЗУ, что эффективнее.

А если применить LXI H/PUSH H, то 2 байта на 4 байта ПЗУ. Только запись будет задом наперёд, но это не проблема.

Но при этом нужно будет сделать LXI SP,XXXX, а это еще 3 байта, но эффективность цикла все равно выше, согласен.
Lavr wrote:
И я вот ещё подумал, что текущий адрес нам и вовсе не нужен. Здесь же Z80, и подпрограмма-загрузчик небольшая - значит вполне хватит и диапазона относительной адресации на цикл всей загрузки в ОЗУ.
А потом действительно подставляем абсолютный переход по нужному
адресу в ОЗУ. Его-то мы точно знаем.

Это вариант, но все никак не могу отвыкнуть от мышления аля ВМ80. :3


06 Apr 2012 22:57
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Но при этом нужно будет сделать LXI SP,XXXX, а это еще 3 байта, но эффективность цикла все равно выше, согласен.

А вот это вопрос интересный... и обычно замыливается.
Давайте выясним.

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

Я не имел возможности проверить, как устанавливается SP, хотя это весьма
легко проверить при старте процессора:
Code:
   LXI H, 0000H
   DAD  SP; значение стека - в HL
   SHLD SPBOX
   JMP  STARTSYS
SPBOX: DW 0000H

но мы обычно получаем управление, когда стек уже установлен ОС.
На "Специалисте" это, в принципе, легко проверить, введя с 0000H эту программу,
и отключив перед RESET-ом цепи переброса ПЗУ в адрес 0000H.
"Специалист" не портит содержимое ОЗУ при RESET-е.

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

Или всё-таки в SP по RESET-у какие-то случайные значения?
Кто-нибуть знает точно или есть какие-либо ссылки на достоверные источники?

_________________
iLavr


07 Apr 2012 05:51
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
Но у меня есть предположение, что по RESET-у всё же сбрасывается в 0000H.
И значит верхняя ячейка стека по сбросу -> 0FFFFH.

Я не встречал этого явно для i8080, но делаю предположение по аналогии.
Так, в частности, в MCS-48, который делали явно по мотивам i8080 и i8085,
урезая последние, и расширяя периферию на кристалле, так вот для MCS-48
указывается явно:
Quote:
Сигнал RESET производит следующие действия:
сбрасывает счётчик команд (PC) и указатель стека (SP);


Да и во многих других МП по сбросу SP устанавливается в определённое значение.

_________________
iLavr


07 Apr 2012 07:12
Profile
Banned
User avatar

Joined: 20 Mar 2005 14:41
Posts: 2150
Location: От туда
Reply with quote
Post 
А М68К грузит PC и SP из первых двух двойных слов таблицы векторов. ;)


07 Apr 2012 07:47
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
А М68К грузит PC и SP из первых двух двойных слов таблицы векторов. ;)

Хардыч, а в твоём Интелловском мануале по i8080 нет какой-либо конкретики о состоянии SP по RESET?

_________________
iLavr


07 Apr 2012 08:16
Profile
God
User avatar

Joined: 13 Nov 2010 05:06
Posts: 1292
Reply with quote
Post 
Попробовал на "железном" ВМ80 с пошаговым устройством. Похоже, что SP не сбрасывается. У меня, по крайней мере, пошаговое устройство показывает после включения так:

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

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

0000 C9
800B FF

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

0000 C9
800C FF

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

Вот так вот, вуаля. Может, я что-то неправильно делаю?


07 Apr 2012 09:08
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
VituZz wrote:
Попробовал на "железном" ВМ80 с пошаговым устройством. Похоже, что SP не сбрасывается.
...

На правду похоже... то есть первоначально стек сам установился на адрес 800AН,
в остальные попытки после RESET, SP просто не менялся - поэтому сдвиг вверх по RET.
Странно, что на один адрес... :(

А по включению питания - у тебя ПЗУ в начальном адресе = RET?

_________________
iLavr


07 Apr 2012 09:18
Profile
God
User avatar

Joined: 13 Nov 2010 05:06
Posts: 1292
Reply with quote
Post 
Я подставил эмулятор ПЗУ с одной только этой командой.

Перепробовал несколько разных процессоров, работают аналогично.


Last edited by VituZz on 07 Apr 2012 09:44, edited 1 time in total.



07 Apr 2012 09:27
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 54 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 2 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:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.