|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
KolAnVi
Fanat
Joined: 27 May 2011 04:25 Posts: 79 Location: Perm
|
А что если сделать какой-нибудь служебный регистр, к которому можно обращаться как к РОН, но его функция будет выступать источником недостающего нибла в командах записи(либо верхнего либо нижнего в зависимости от команды либо адреса LSB)?
Либо запись в этот регистр может быть организован в фоне при операции чтения (4 из 8 бит). При этом указанный в команде(или в LSB адреса) нибл идет в приемник, а другой - в служебный регистр. Получаем програмную реализацию "чтение-модификация-запись" с возможностью маневра, например работать для скорости только с одним ниблом, второй оставляя "don't care" .
|
17 Jan 2014 00:58 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Честно говоря, так оно и было с самого начала.
Но чем это плохо - всё равно получается, что нет возможности модифицировать ячейку где лежит КОП. То есть - такая схема не может сама считывать программу, скажем, с
магнитофона в собственную память.
Поэтому я и попытался от 2-х 4-битных уйти к одному 8-битному корпусу.
В общем-то нужна инструкция типа XCHG двух нибблов. В PDP-11 она есть для решения
похожей проблемы. Но у меня её пока нет.
_________________ iLavr
|
17 Jan 2014 02:03 |
|
|
AIS
Novelist
Joined: 30 Nov 2013 05:04 Posts: 32 Location: 83.149.47.40
|
Такой возможности нет, если при записи просто игнорировать ненужные 4 бита и не использовать бит адреса для выбора конкретной микросхемы.
А выше я описал как сделать, чтобы КОП был доступен для записи по четным адресам, а данные по нечетным.
|
17 Jan 2014 02:13 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я вот тоже с этими регистрами - всю голову себе поломал... аж не выспался сегодня...
Всё дело в том, что я старательно все эти регистры посокращал до минимума и на этом
пути пришел к выводу, что у меня получается уже что-то близкое к PDP-8, а в ней основной
принцип - все регистры должны быть в памяти, раз уж она тут есть.
Кстати, и в 6502 - тоже решение похожее...
Для чего я и тужился с косвенной адресацией.
В общем и так я приспасабливал этот дополнительный регистр, и иначе... и всё как-то
криво он цепляется....
И тут меня посетила парадоксальная мысль! Я - добавляю лишний регистр... а процессор -
4-битный... а может - добавить ещё один регистр - и пусть процессор станет 8-битным?
Интересно, что это многие 4-битные косяки просто сводит на нет...
А схема, что интересно - практически не меняется!
В общем к утру я на бумажке перерисовал всё в 8-битную версию... и всё стало замечательно!!!
Но... вылез другой косячок - в операциях CALL теперь некуда присунуть 4 старших бита 12-разрядного
программного счетчика...
Но - сегодня высплюсь - просмотрю всё еще раз...
Тут просто пока я рисовал новую схему - всё больше убеждался, что надо перейти к 8-битному
варианту и вот почему...
Эта схема не является же самоцелью - в её основе была мысль, что простеньким но быстрым самодельным процем можно попробовать эмулировать 580ВМ80...
И я просто вдруг задумался... 8 бит данных 16 бит адреса - делим на 4 - получаем:
6 !!! - обращений к УВВ надо сделать, чтобы только выставить адрес и данные эмулируемого
проца!!! А разбор команд? Мне думается теперь, что для поставленной задачи 4-битность -
это не лучшее решение...
_________________ iLavr
|
17 Jan 2014 02:29 |
|
|
VituZz
God
Joined: 13 Nov 2010 04:06 Posts: 1345
|
Я тоже задумывался над этим вопросом.
Мне показалось оптимальным иметь 12 разрядов для шин адреса и данных.
Да, вроде уже не 8 бит, но ещё не 16... Но 8 и 16 - это скорее дело привычки и традиций.
И я не старался минимизировать схему.
|
17 Jan 2014 13:24 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
12 разрядов для шины адреса - просто жестокая необходимость, которая обеспечивает
хотя бы минимально 4096 байт для какой-либо серьёзной программы.
Я же не зря ковыряюсь с EDUC-8 - я пробую программировать в убогой системе команд и
пытаюсь понять, что необходимо, а без чего - можно и обойтись.
А вот данные - всё-таки лучше размером в байт - это удобно ложится в распространенные
мс. памяти, чтобы не оригинальничать особо.
И если ты обратил внимание, то в плане - я один корпус ОЗУ подсократил...
А насчет минимизации - ну ты лучше всех тут знаешь, что я жестко решил ограничиться
размером большой макетки.
_________________ iLavr
|
18 Jan 2014 01:06 |
|
|
KolAnVi
Fanat
Joined: 27 May 2011 04:25 Posts: 79 Location: Perm
|
А что если служебный регистр для записи второго ниббла - это будет второй аккумулятор(они 4-х битные)? И между ними можно будет переключаться командой. Все команды между чтения памяти(по 8 бит) будут иметь флаг, загружать ли второй ниббл в текущий теневой аккумулятор(первый ниббл обрабатывается согласно команде).
|
18 Jan 2014 10:28 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Совершенно верно! И именно так примерно я тоже размышлял...
Но что здесь я увидел неприятного - это решение тянет за собой мультиплексоры
в том или ином месте схемы...
И вот в этот момент я решил - введение "второго 4-битного аккумулятора" -
да это фактически 8-битный единственный аккумулятор!!!
Тогда я и подумал, что добавив еще один регистр - я сделаю 8-битным буфер
данных и процессор станет 8-битным. Вот такой был ход мысли.
Регистры команд, флагов и инструкций АЛУ - остаются, как и были, 4-битными.
Ну а РС - он и так уже был 12-битным.
Я вот думаю, может его сделать 16-битным, поскольку старшую 8-битную часть, видимо,
удобнее сохранять в 8-битную память, нежели 4-битный огрызок, который сейчас несколько
всё затрудняет...
_________________ iLavr
|
18 Jan 2014 11:52 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну вот эта мысль наконец-то реализовалась...
Скачать
Окончательно собирал под Вендой 7, которая неслабо проклевала мне мозг...
Но все опции вроде работают правильно, а окончательно все глюки выяснятся
при эксплуатации.
_________________ iLavr
|
14 Feb 2014 10:00 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
| | | | Lavr wrote: И тут меня посетила парадоксальная мысль! Я - добавляю лишний регистр... а процессор - 4-битный... а может - добавить ещё один регистр - и пусть процессор станет 8-битным? Интересно, что это многие 4-битные косяки просто сводит на нет... А схема, что интересно - практически не меняется! В общем к утру я на бумажке перерисовал всё в 8-битную версию... и всё стало замечательно!!! Но... вылез другой косячок - в операциях CALL теперь некуда присунуть 4 старших бита 12-разрядного программного счетчика... | | | | |
Нашел я местечко, куда присунуть 4 старших бита 12-разрядного программного счетчика...
и когда я тщательно всю эту идею продумал, то неожиданно оказалось, что такое решение
очень похоже на микроконтроллеры семейства 1816ВЕ48!
_________________ iLavr
|
02 May 2014 06:29 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я переделал в нулевом приближении всю схему, и всё довольно хорошо вписалось в существующую уже
4-битную конструкцию без значительных изменений.
Я учел опыт PDP-8 ( EDUC-8 ), и при 8-разрядной внутренней шине с 12-битным адресом формат команды
стал теперь следующим:
1 байт: KOP_.SEG_ - то есть по 4 бита на код операции и указатель сегмента размером в 256 байт.
2 байт: ADRH.ADRL - младшая и старшая части смещения в сегменте размером в 256 байт.
Да, от RISC-принципов пришлось несколько отойти, и команда с 12-битным адресом обрабатывается
в два захода: во время выборки FETCH KOP_.SEG_ защелкиваются в регистр инструкций, а вторым
заходом ADRH.ADRL - записываются в программный счетчик РС, при этом одновременно из регистра инструкций значение сегмента - KOP_.SEG_ - защелкивается в сегментную часть РС.
Таким образом с переходами и вызовами JMP и JSR все проблемы устранились довольно элегантно.
Я ввел 2 префикса: E и F, как советовал Виталий, и как это делают в PDP-8 (EDUC-8 ), так что можно
непротиворечиво реализовать набор в 46 команд, что очень неплохо.
Команды с префиксом E работают со следующим байтом, и их формат вот такой:
1 байт: PREF.KOP_ - то есть 4 бита на код операции, a 4 бита префикса позволяют их отличить от адреса.
2 байт: BYTE.8BIT - байт с которым работают, типа ANI BYTE, MVI A,BYTE.
С этим набором команд тоже всё удобно и проблем нет.
Однобайтные команды с префиксом F :
1 байт: PREF.KOP_ - то есть 4 бита на код однобайтной операции типа RAL, RAR, CMA и т.д. 4 бита префикса
позволяют их отличить от адреса в командах 1 типа и от двухбайтных команд 2 типа.
С этим набором я проблем тоже не вижу.
Проблема опять вылезла там, где я её не ожидал... И проблема с инструкциями типа LHLD и SHLD - чисто условно.
Так как HL здесь нет, а есть косвенная загрузка значения РС сегментом и смещением из памяти, ну и их сохранение.
Значит проблема вот где, чтобы косвенно загрузить РС командой, ну скажем LD PC,[ADDR] - то есть сегмент PC -
из [ADDR], а смещение PC - из [ADDR+1], я должен выставить в буфер адреса значение ADDR и считать сегмент PC.
А вот увеличить буфер адреса на 1 - у меня никакого механизма нет. Буфер адреса, в отличие от программного счетчика РС - это просто регистр.
Если я правильно помню (могу и ошибиться), в i8080 операции типа LHLD и SHLD выполняются через пару WZ.
То есть: WZ - в буфер адреса через схему инкремента, после чего WZ=WZ+1. Но аналога WZ у меня нет и пока
вводить не хочется: аппаратно - это еще 3 корпуса регистров.
А вот как с этим справляются в 6502, где WZ нет? Как ресурсами 6502 закружают его РСL, РСH из памяти, согласно
этой вот блок-схеме? Подсобите советом знатоки и поклонники 6502!
Я склонен предположить, что используется DL, т.к. он выходит на шины ABL, ABH, но у DL нет пути через сумматор.
_________________ iLavr
|
07 Jul 2014 15:33 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А согласно другому варианту этой же блок-схемы, хоть и менее красивому, есть у DL путь через сумматор... Но судя по описанию системы команд 6502, шибко красивого решения при пересечении границы блока и смене сегмента также найдено не было:
_________________ iLavr
|
07 Jul 2014 19:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Вообще говоря в системе команд 6502 это единственная команда, загружающая слово в РС. JMP (<address>) - с косвенной загрузкой адреса. А вот разрядность этого регистра DL не совсем понятна. По входу - похож на 8-разрядный, но имеет 2 выхода на шины ABL, ABH. И с этой командой у 6502 действительно есть проблемы! | | | | Quote: The 6502's memory indirect jump instruction, JMP (<address>), is partially broken. If <address> is hex xxFF (i.e., any word ending in FF), the processor will not jump to the address stored in xxFF and xxFF+1 as expected, but rather the one defined by xxFF and xx00 ( for example, JMP ($10FF) would jump to the address stored in 10FF and 1000, instead of the one stored in 10FF and 1100). This defect continued through the entire NMOS line, but was corrected in the CMOS derivatives. | | | | |
_________________ iLavr
|
08 Jul 2014 06:57 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А согласно более подробному варианту, всё несколько сложнее, чем на блок-схеме выше...
Увеличить
_________________ iLavr
|
10 Jul 2014 09:45 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
По электрической схеме у меня, наконец, всё срослось!
И даже косвенная адресация получилась, на мой взгляд, нескольно необычно,
но довольно просто и эффективно.
К сожалению, завяз немного с ремонтом дома, а так в общем-то всё готово и
надо бы вплотную заняться упорядочением микрокода, благо теперь есть
для этого инструмент.
_________________ iLavr
|
05 Oct 2014 11:35 |
|
|
Who is online |
Users browsing this forum: No registered users and 18 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
|
|