nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 16:29



Reply to topic  [ 255 posts ]  Go to page Previous  1 ... 13, 14, 15, 16, 17  Next
4-bit Processor 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
RDIR_BYTE - прочитать биты направления порта N в аккумулятор?
WDIR_BYTE - записать биты направления порта N из аккумулятора?
бит 1 это вход (высокоимпендансное состояние), а бит 0 это выход...

с другой стороны это всё можно решить внешней схемой и управлять направлениями через те же INP/OUT но с большими номерами

_________________
:dj: https://mastodon.social/@Shaos


05 Nov 2015 22:22
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
с другой стороны это всё можно решить внешней схемой и управлять направлениями через те же INP/OUT но с большими номерами

Вот и я так подумал... портами же через те же INP/OUT можно и банки памяти коммутировать,
не вводя никаких дополнительных команд.

_________________
iLavr


06 Nov 2015 13:54
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post Re:
tihsasha1967, 08 янв 2014 wrote:
Теперь есть желание "прикрутить" АЛУ.

Не прошло и 2 года, как я АЛУ в это поделие вделал! :lol:

Image
Увеличить

АЛУ последовательного типа, но на скорость работы это никак не повлияет.
Что параллельное АЛУ, что последовательное в этой системе выполняют
операцию за 4 такта.

АЛУ реализует следующие операции:

Image

На мой взгляд, набор довольно развитый, при этом я всё еще умещаюсь на одном экране проекта. :o
И хотя я не сосчитал еще число корпусов, но на взгляд всё ещё бюджетно и - по-нищебродски... 8)

Чего я ввиду нищебродскости решил не реализовывать:
CMP, RAL и RAR - сильно распирают скромную схемотехнику.
Но попробовать можно - кардинальных препятствий для этого нет.

Наиболее трудно мне дались CMC и SBB с учетом сохранения схемотехнической простоты.
Но в итоге довольно оригинально извернулся сделать инверсию флага переноса только
на первом сдвиге из 4-х...

Ввел несколько необычную команду SFA - Set Flags on A (выставить флаги по регистру А:
это по сути - операция сложения регистра А с нулём и установкой флагов.
Введена, чтобы быстро оценить значение, считанное из порта, не изменяя его.
В привычном нам 580ВМ80 это нетрудно сделать через ORA A, к примеру.
В этом процессоре такой возможности нет: все операции выполняются между
регистром-аккумулятором А и буферным регистром В, или между А и 0, А и 1.

Большую схему и весь проект пока не выкладываю - надо погонять на ошибки.
И САМОЕ ГЛАВНОЕ - Я-ТАКИ СОКРАТИЛ ОДНУ БИС СТАТИЧЕСКОГО ОЗУ!!! :kruto:

Содержимое ПЗУ микрокоманд кардинально изменилось, но мой бинарный редактор
мне очень в этом помог. Работать было удобно, ошибок пока не обнаружилось!

Проект потихоньку продолжаю, и собираюсь в обозримом будущем завершить... если
не случится каких-либо ненужных форсмажоров...

_________________
iLavr


23 Nov 2015 16:21
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
...надо погонять на ошибки.

Что-то я впал в полный ступор на тестировании ниббловой операции SUB... :osad:
Получается у меня некоторая непонятная мне странность, которой раньше не замечал...

Ну мы все помним, что вычитание в АЛУ заменяется сложением с дополнением вычитаемого до единицы:

SUB:
A - B = A + (/B + 1)

А теперь рассмотрим простой пример:
A = 0Fh
B = 1h


Code:
  1111b = А
 -0001b = В
------- эквивалентно
  1111b
 +1111b
-------
1<1110b

0Fh - 1h = 0Eh и флаг C = 1 - тут всё верно, так ведь?

но при вычитании флаг C = 1 - значит был заём,
а если был заём, то 1h > 0Fh !!! а ведь это не так!?

Вот я и не пойму два дня уже, либо где я затупил, либо - что я делаю не так?

_________________
iLavr


27 Nov 2015 16:43
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
вот тут пишут, что этот бит надо просто отбрасывать:

https://courses.cs.vt.edu/csonline/NumberSystems/Lessons/SubtractionWithTwosComplement/index.html

возможно это инвертнутый бит переполнения...

P.S. да - вот тут так и пишут: http://www.math-only-math.com/subtraction-by-2s-complement.html
Quote:
(i) At first, 2’s complement of the subtrahend is found.
(ii) Then it is added to the minuend.
(iii) If the final carry over of the sum is 1, it is dropped and the result is positive.
(iv) If there is no carry over, the two’s complement of the sum will be the result and it is negative.

_________________
:dj: https://mastodon.social/@Shaos


27 Nov 2015 17:35
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
вот тут пишут, что этот бит надо просто отбрасывать:

Тоже уже так думал... Но если я работаю с 2-мя нибблами, составляющими байт,
и если отбросить этот бит - получается вроде как некоторая брехня... :wink:
Если делать ту же операцию с байтами, то:
0Fh + 0Fh = 1Eh, как же его отбросить, ведь при работе с байтом, я должен
вычесть потом старшие нибблы байта, но уже инструкцией SBB - вычитание
с учетом заема... или я опять где-то затупил?


P.S. У меня что-то такое подозрение, что "собака порылась" здесь вот где:
считать ли ниббл беззнаковым или нибблом со знаком... Хотя ниббл со знаком -
звучит странно, но я же ввёл флаг Sign... :roll:

_________________
iLavr


27 Nov 2015 18:14
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
ну просто видимо при сложении C должен быть прямой флаг, а при вычитании - инверсный

P.S. вот тут устами самого интела говорится, что после вычитания флаг инвертируется (стр.46 в PDF или 2-8 на бумаге):
http://www.tramm.li/i8080/Intel%208080-8085%20Assembly%20Language%20Programming%201977%20Intel.pdf
Quote:
This is because the processors complement the carry flag at the end of a subtract operation so that it can be used as a 'borrow' flag in multibyte subtractions

_________________
:dj: https://mastodon.social/@Shaos


27 Nov 2015 21:26
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
...устами самого интела говорится, что после вычитания флаг инвертируется

Действительно...
Quote:
Однако если такие операции проводятся микропроцессорами i8080 или i8085, флаг переноса будет СБРОШЕН в конце вычитания. Это происходит потому, что микропроцессоры инвертируют флаг переноса в конце операции вычитания, так чтобы он мог быть использован в дальнейшем в качестве флага «заёма» при многобайтном вычитании.

Спасибо за подсказку - не знал... :oops:
А я как раз и проверял операции вычитания через эмулятор 580ВМ80 "Специалиста"...
Attachment:
SBB_8080.gif
SBB_8080.gif [ 6.43 KiB | Viewed 16739 times ]

Смотрю - а результат-то не сходится с моим АЦП! :roll: Подправлю...

_________________
iLavr


28 Nov 2015 08:11
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
А в принципе, если будет утяжелять схемотехнику, то можно и оставить так, как есть, просто учитывать эту особенность программно.

Оказывается, не я первый такому поведению АЛУ удивился - в принципе-то оно правильное:
https://en.wikipedia.org/wiki/Carry_flag
Quote:
For subtractive operations, two (opposite) conventions are employed as most machines set the carry flag on borrow while some machines (such as the 6502 and the PIC) instead reset the carry flag on borrow (and vice versa).

А я помню, когда PIC-ами занимался, в мануалах обращают на это внимание, но я с этим тогда как-то практически не столкнулся...

_________________
iLavr


28 Nov 2015 09:01
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
А мне помнится мы это уже обсуждали применительно к 6502...


P.S. Вспомнил - недообсуждали, т.к. я потом сам додумал применительно к своему процу :)
В случае нашего старого-доброго 8080:
A-B-c это тоже самое как A+/B+1-c или A+/B+/c :)
В случае же прямолинейного использование заёма как инверснутого переноса (6502) будет так:
A-B-/c = A+/B+1-/c = A+/B+c

_________________
:dj: https://mastodon.social/@Shaos


28 Nov 2015 17:18
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Просто получается интересная затея... я инверсию флага С уже реализовал аппаратно - нужно для SBB и CMC.

И вот эта неожиданная особенность вычитания позволила бы всю эту аппаратную часть сократить вместе с
инструкцией CMC - ну чисто из нищебродских соображений. Поскольку есть еще инструкции STC и CLC.

Надо подумать... :-?

Я тут пока воплотил в микрокод и "железо" полноценный JMP ADDR, где ADDR - полный 12-битный адрес!
И умудрился сделать это практически за ОДИН ЦИКЛ! :mrgreen: Причем аппаратно - очень просто...

Сейчас вот раздумываю, нужен ли этому нищебродскому 4-битнику CALL ADDR, при глубине стека -
1 адрес возврата, который будет стОить аппаратно - 3 корпуса 555ИР16. :ewink:


P.S. Я просто пока делал полноценный JMP ADDR (а ведь CALL ADDR отличается всего на 1 импульс! :o ),
так вот, я призадумался над словами автора Nibbler-а:

Quote:
При использовании таблиц переходов и специальных ячеек памяти, в программах Нибблера можно реализовать простой механизм вызова / возврата, без реального аппаратного стека.

И пришел я к выводу, что это сделать можно! Это будет кургузо и непривычно с точки зрения программирования,
но ведь некоторые люди и привычный ассемблер считают языком, невозможным для освоения... :wink:

Мне стало казаться, что косвенный JMP полезнее CALL ADDR с одним возвратом...

_________________
iLavr


29 Nov 2015 03:15
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Lavr wrote:
Мне стало казаться, что косвенный JMP полезнее CALL ADDR с одним возвратом...


Угу - похоже на то...

_________________
:dj: https://mastodon.social/@Shaos


29 Nov 2015 14:22
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
И хотя я не сосчитал еще число корпусов, но на взгляд всё ещё бюджетно и - по-нищебродски...

Сосчитал число корпусов - их примерно 48 - и прикинул размер моим любимым методом:
Attachment:
Plat4cpu.jpg
Plat4cpu.jpg [ 39.92 KiB | Viewed 18558 times ]

Примерно 48 - реально должно быть меньше, кое-что лишнее в проекте для убыстрения
"чисто цифровых" вычислений.
Но видно, что весь 4-bit Processor пока на уровне размеров параллельного 4-bit АЛУ на
NAND
, и не выходит за габариты большой макетки.

_________________
iLavr


29 Nov 2015 14:54
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Lavr wrote:
Мне стало казаться, что косвенный JMP полезнее CALL ADDR с одним возвратом...
Угу - похоже на то...

Да - CALL ADDR в 4-битнике делать не буду: присмотрелся внимательно - это требует
больше микросхем, чем 3 регистра с z-состоянием выхода. И самое неприятное в плане
нищебродства - нужны еще минимум как 2 шинных формирователя. Это портит всё нищебродство...

На том "железе", которое уже есть реализовал немного кривоватый косвенный JMP:
JMI SEG,ADR,REG - сегмент и старший ниббл РС указываются напрямую, а
младший ниббл РС берется из указанного регистра общего назначения.
Это дает возможность косвенно передать управление на 16 ячеек подряд.
Немного, но без аппаратного усложнения - хоть так... :-?

Ввел некий аналог рестарта по типу RST N: только он у меня передает управление на начало
одного из 16 сегментов по 256 байт.
Т.е. RST SEG = JMP SEG,00h,00h.

Думаю, надо ввести еще RST REGB - идея та же самая, но номер сегмента берется не
из команды, а из регистра В. Немного гибкости должно придать...


P.S. Вот еще задумался - нужна ли процессору инструкция HLT с выходом только по RESET ?

_________________
iLavr


03 Dec 2015 10:21
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Вот такая система команд у меня утряслась в итоге на имеющемся "железе":
Attachment:
4BITinstr96.gif
4BITinstr96.gif [ 28.71 KiB | Viewed 21109 times ]

Я отказался от CALL ADDR с одноранговым стеком - усложняет схему ~ на 5 корпусов.
Отказался от CMP - тоже зело усложняет схему.
Для нищебродского 4-битника стыдно быть сложным! :egeek:

Все команды работают, проверены на простеньких примерах. Теперь надо бы что-то спрограммировать
посерьезнее... :wink: Теннис ? :ebiggrin:

Аппаратно хочу пока заменить этот странный 155ИР26, которого у меня так и нет, на К155РУ2,
аналог которой - (К589РУ01 - 16 слов по 4 разряда) я таки сподобился приобрести...
Неприятно, что у них инверсный выход с открытым коллектором. :osad:

Ну и, по возможности, постараюсь максимально привести всю схему к базису: 155ЛА3, 155ЛН1.


P.S. Ну и сама схема на данный момент:

Image
Увеличить

_________________
iLavr


03 Dec 2015 15:52
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 255 posts ]  Go to page Previous  1 ... 13, 14, 15, 16, 17  Next

Who is online

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