|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
Не совсем понял, почему адрес данных всегда совпадает с адресом команд.
Я предполагал, что после чтения кода операции будут выполнены несколько микрокоманд, которые установят шину адреса ОЗУ данных и шину адреса команд. В случае RST они наверное совпадут, но не в случае других команд.
А схемы я не рисую
Выполнение команды RST n
data[n]=PC; PC=code[n];
и RET n
PC=data[n];
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
23 Oct 2011 11:29 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну вот такая у нас простота конструкции... однофазная синхронизация... трудное децтво... диривяные игрушки... Если я не путаю - в PIC-e тоже так, поэтому я и назвал прототип - " Stupid PIC"! Схему я не просил рисовать - имелось ввиду "глядя на схему", а то абстрактно обсуждать трудно...
Неее... Данные - сразу на шину данных внутреннюю, КОП - на дешифраторы и ПЗУ микрокоманд.
Счётчик перебирает младшие адреса ПЗУ микрокоманд, организуя все внутренние сигналы управления.
Но КОП+Данные поступают всегда одновременно. Слово программы по сути 16-битное.
Поэтому я и ввёл CMA как XOR 0FH - всё равно данные поступают...
И обнуления регистров отдельно не делал - всё-равно, что 0 из данных загружать.
Но разве это на систему PIC не похоже?
Почти все комнды - за 1 машинный цикл. Ну у нас - также...
Только переходы - в два цикла РС перезаписать.
|
23 Oct 2011 11:59 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
У PIC-а адрес данных не совпадает с PC, а является частью команды, IMHO. Похоже только на команды, работающие с литералами.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
23 Oct 2011 12:38 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Согласен, но мы и не ставим задачей повторить PIC, но позаимствовать решения у него можно.
В частности "короткие" JMP-пы по условию точно надо взять - очень легко реализуются аппаратно.
Длинные JMP-пы тоже можно использовать, как загрузку РС в два приёма нибблами...
И загрузка литер и номера регистров - у PIC-а часть команды.
Другое дело, что было пожелание иметь возможность модифицировать память
программ - поэтому я и пытаюсь этот механизм ввести хотя бы частично.
А память данных - как набор регистров, похоже, придётся делать на РУ2. Других вариантов пока не вижу.
|
23 Oct 2011 13:26 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Поскольку PC предполагается 8-битным, плюс 4-битный переключатель страниц, то для 1-уровневого стека понадобятся либо 3 корпуса 4-битных регистров, либо 2 корпуса - 8-битный и 4-битный регистры.
Это ещё аппаратно приемлемо...
Если глубину вложений увеличивать, то число корпусов умножается на глубину.
Поскольку разместить стек в памяти программ простой возможности пока не вижу, а в памяти регистров места практически нет.
В качестве РОН К155РУ2 - это всего 16 4-битных регистров.
Формат 8-битной команды:
KKKKDDDD, где KKKK-КОП, DDDD-данные (литера или номер регистра) не даёт возможности и число регистров увеличить более 2^4=16.
Если KKKK = 1111 ( 0Fh), то это префикс. Тогда DDDD - интерпретируются также как КОП однониббловой команды без аргумента типа NOP, RRC, RAL, и т.д.
Одноуровневый стек видел только у TI TMS1000. Сейчас пытаюсь посмотреть программы для TMS1000 - сколь они эффективны с 1-уровневым стеком.
Согласно мануалу - TMS_1000_Data_Manual.pdf, работать вобщем-то можно... но у TMS1000 ячеек ОЗУ побольше, чем 16...
В совокупности складывается впечатление, что 4-битный процессор может осилить роль контроллера, программируемого в кодах.
О софте типа редактора или компилятора на базе 4-битного процессора, похоже, мечтать не приходится...
PS. Чисто для сравнения:
Intel 4004 - 4-х уровневый стек;
Intel 4040 - 8-и уровневый стек;
PIC16F8x - 8-и уровневый стек;
Intel 8048 - 8-и уровневый стек.
|
04 Nov 2011 05:37 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
Если у тебя шина адреса 8-ми разрядная и ты предполагаешь доступ к данным по адресу в регистрах, то надо бы подумать о регистровых парах. Проще всего поставить две К155РУ2, одну для чётных, другую для нечётных регистров. Но тогда будет 32 регистра.
А если будет команда перехода по адресу в регистрах, то стек возвратов можно будет реализовать программно. Например вызов подпрограммы в пределах одной страницы:
Код CALLPROC должен будет поместить R1,R0 в стек (например по адресу R14,R15) и сделать переход на R3,R2
Аналогично можно сделать RETPROC.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
Last edited by b2m on 04 Nov 2011 07:11, edited 3 times in total.
|
04 Nov 2011 06:21 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я аппаратно не имею возможности выбрать более 2^4=16 регистров. Если их сделать сдвоенными, вторые половины мне просто будут недоступны программно.... Шина адреса 8-ми разрядная - непосредственно адресует блок в 256 байт памяти программ. Блоки по 256 байт переключает 4-битный переключатель страниц. То есть в стек надо загнать 12 бит адреса возврата. Это никак не сохранить даже в сдвоенных регистрах, тем более этого нет в том, что ты предлагаешь...
Это только 8 бит... куда деть ещё 4 бита переключателя страниц?
Поскольку условные переходы у нас короткие, то безусловные JUMP и CALL должны быть длинными - межстраничными, как и возвраты из вызовов.
Last edited by Lavr on 04 Nov 2011 07:32, edited 1 time in total.
|
04 Nov 2011 06:53 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
Тут, кстати, пригодилась бы система рестартов, потому как для команды JMP надо делать 4х-битный регистр страницы, в котором будут старшие 4 бита адреса перехода и менять этот регистр для вызова "дальних" версий CALLPROC и RETPROC нежелательно. А рестарт будет всегда прыгать на нулевую страницу, независимо от этого регистра.
А если команда рестарта будет ещё и регистровую пару загружать... Например, полезно для номера функции (пусть даже это будет фиксированная пара R0,R1), или как в данном случае - "ближний" адрес. То будет вообще шоколадно
К примеру, обычная коротенькая п/п (рестарт) будет использовать R1,R0 как адрес возврата, и заканчиваться будет JMP R1R0, т.е. коротким переходом на текущую страницу, откуда мы, предположительно, и вызвали рестарт.
Но вообще, в таком случае, проще сделать так, чтобы команда рестарта заносила в R1R0 младшие биты PC, это подойдёт и для вызова CALLPROC.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
04 Nov 2011 06:58 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
Я думал, предполагался регистр текущей страницы. Тогда можно обойтись одной командой JMP и для дальних вызовов, и для ближних.
Т.е. дальний переход выглядел бы так:
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
04 Nov 2011 07:07 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Может быть я неудачно придумал дальние безусловные JUMP и CALL?
Я их решил реализовать так: если 8-битная команда:
KKKKDDDD, где KKKK-КОП, DDDD-данные (литера или номер регистра), то DDDD - подключены к внутренней 4х-битной магистрали, а KKKK - к памяти микрокоманд.
Аппаратно 4х-битный регистр страницы подключен к внутренней 4х-битной магистрали,
PC_Low - подключен к внутренней 4х-битной магистрали,
а вот PC_High к ней не подключен.
При выполнении JUMP и CALL:
KKKK- JUMP или CALL,
DDDD - 4х-битный регистр страницы .
после выборки КОПа JUMP или CALL программный счётчик PC автоматом аппаратно увеличивается на 1 и во время выполнения КОПа указывает уже на следующий KKKKDDDD.
DDDD сразу защёлкиваем в 4х-битный регистр страницы
А вот во время выполнения КОПа можно защелкнуть DDDD - в PC_Low, а KKKK - в PC_High, причём одновременно, поскольку PC_High должен быть аппаратно подключен входами к линиям KKKK - это никак не мешает обычной работе.
После чего снова делаем инкремент PC.
Инкремент PC происходит аппаратно, т.к. PC_Low и PC_High - это два счётчика с предзагрузкой, включенные последовательно.
1-уровневый стек, я хотел реализовать аппаратно защёлкивая состояния PC_Low, PC_High и 4х-битный регистр страницы в отдельные 4х-битные регистры одновременно и параллельно.
|
04 Nov 2011 07:27 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 862
|
Я пытаюсь придумать, как можно сделать многоуровневый стек. В конце концов можно дать программный доступ к этим 3-м регистрам, но это сильно усложняет конструкцию.
Но начал я совсем с другой темы: как удобнее адресовать данные через регистры. Если оставить одну К155РУ2, то адрес будет выдаваться за два такта, нельзя ведь выдать одновременно два регистра. К тому-же придётся ставить дополнительный 4-х битный регистр для старших битов адреса.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
04 Nov 2011 07:41 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да и я бы хотел сделать многоуровневый стек.
Но как не кручу - это действительно сильно усложняет конструкцию.
И возвраты в 0-страницу придумывал, чтобы регистр страниц просто сбрасывать в 0 аппаратно при возврате...
Раздельно PC_Low, PC_High аппаратно манипулировать проще, это всего лишь
завести их входы на внутреннюю магистраль данных, а вот регистр страниц всё усложняет...
Но всего 256 байт памяти программ, как в прототипе, - это тоже некавайно.
Добавив регистр страниц, я хоть приемлемые 4096 байт выкрутил...
PS. Со стеком пытаюсь взять пример как с PIC-a, так и с ранних 4-битников. У всех них стек отдельный, ограниченный и программно-недоступный. TMS1000 с 1 ячейкой стека на 1 вызов в этом смысле - аппаратный предел.
PPS. Вся абурдность ещё и в том, что ОЗУ, как таковое у нас есть, но выполняет роль ПЗУ программ. На запись доступно с пульта, а программно на запись - недоступно. Вот и подмывает адреса возврата и стек засунуть как-то в это "ОЗУ программ", хотя бы в 0-страницу... или в вершину...
|
04 Nov 2011 08:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
1 ячейка стека на 1 вызов, судя по TMS1000, - решение всё-таки работоспособное... раз уж TMS1000 активно и успешно продавалась... Но по собственному опыту знаю - хотелось бы иметь хотя бы 2 уровня вложения. Но если всё-таки реализовать запись в " ОЗУ программ", можно попробовать другое древнее решение: адрес возврата сохраняется в первых ячейках подпрограммы, а вместо RET подпрограмма заканчивется переходом на свой начальный адрес, где во время вызова уже подготовлен JMP по адресу возврата. Так делали во времена Фортрана, и это чревато тем что подпрограмму нельзя вызвать из самой себя, но вложение разных подпрограмм - вполне допустимо... Этот приём я увидел ещё в одном " самоварном" компьютере: http://www.ljw.me.uk/educ8/educ8.htmlИнтересная самоделка в принципе, только авторы как-то по-жадовски зажали принципиальную схему... Авторы пишут, что опираются на решения DEC PDP-8... Интересно, этот знаменитый раритет был бесстековой машиной? Если да - может не грех это перенять? PS. Да, похоже DEC PDP-8 обходилась без стека, и никто её за зто не ругал:
Источник
|
05 Nov 2011 14:20 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
ЕМНИП, у МИПСов же 1 уровень стека. Точнее, у них специальный регистр адреса возврата, куда сохраняется адрес при вызове подпрограммы. Но никто не мешает сохранять этот регистр где-нибудь еще, ведь правда? Я думаю, это достаточно красивое решение.
|
06 Nov 2011 04:35 |
|
|
VituZz
God
Joined: 13 Nov 2010 04:06 Posts: 1345
|
Прошу не пинать, если я невпопад... Но почему мы не можем просто поставить ОЗУ нужной разрядности шины данных и к нему реверсивный счётчик? PUSH записывает в ОЗУ и добавляет к счётчику единицу, POP - обратные действия. Чем это решение не подходит? Вложенность стека определится только объёмом ОЗУ.
|
06 Nov 2011 06:11 |
|
|
Who is online |
Users browsing this forum: No registered users and 27 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
|
|