nedoPC.org

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



Reply to topic  [ 413 posts ]  Go to page Previous  1 ... 19, 20, 21, 22, 23, 24, 25 ... 28  Next
nedoPC-580 (SMP на 5 процессорах КР580ВМ80А) 
Author Message
Devil

Joined: 26 May 2003 06:57
Posts: 859
Reply with quote
Post 
Shaos wrote:
P.S. А вот код сохранения регистров для переключения контекста в обработчике прерываний (для начала думаю пусть прерывание будет по таймеру 10 раз в секунду):
Code:
SHLD #0058 ; save HL
POP H ; HL=PC
SHLD #0054 ; save PC
LXI H,0
DAD SP ; HL=SP
SHLD #0056 ; save SP
LXI SP,#0060
PUSH PSW ; save AF
PUSH B ; save BC
PUSH D ; save DE
; now switch context to another process

DAD SP портит флаг переноса. Надо после сохранения HL делать PUSH PSW / POP H / SHLD Будет, правда, испорчена пара байт в стеке, но будем надеяться никто DCX SP / DCX SP не делает :)

P.S. А вообще, идеальный вариант - использовать команду JC перед DAD SP, и там, в зависимости от флага переноса, устанавливать его или не устанавливать (DAD SP с нулём будет всегда сбрасывать).

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


27 Aug 2012 22:40
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
b2m wrote:
DAD SP портит флаг переноса. Надо после сохранения HL делать PUSH PSW / POP H / SHLD Будет, правда, испорчена пара байт в стеке, но будем надеяться никто DCX SP / DCX SP не делает :)

Если используется пара PUSH/POP то можно и не заморачиваться об "испорченности" байтов стека.


Last edited by HardWareMan on 05 Jan 2014 06:58, edited 1 time in total.



27 Aug 2012 22:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
b2m wrote:
Shaos wrote:
P.S. А вот код сохранения регистров для переключения контекста в обработчике прерываний (для начала думаю пусть прерывание будет по таймеру 10 раз в секунду):
Code:
SHLD #0058 ; save HL
POP H ; HL=PC
SHLD #0054 ; save PC
LXI H,0
DAD SP ; HL=SP
SHLD #0056 ; save SP
LXI SP,#0060
PUSH PSW ; save AF
PUSH B ; save BC
PUSH D ; save DE
; now switch context to another process

DAD SP портит флаг переноса. Надо после сохранения HL делать PUSH PSW / POP H / SHLD Будет, правда, испорчена пара байт в стеке, но будем надеяться никто DCX SP / DCX SP не делает :)

P.S. А вообще, идеальный вариант - использовать команду JC перед DAD SP, и там, в зависимости от флага переноса, устанавливать его или не устанавливать (DAD SP с нулём будет всегда сбрасывать).


хм, точно - я это как-то упустил из виду - вот поправленный вариант:
Code:
SHLD #0058 ; save HL
POP H ; HL=PC
SHLD #0054 ; save PC
LXI H,0
JC SETC
DAD SP ; HL=SP and clear C
JMP GOSTACK
SETC:
DAD SP ; HL=SP and then set C
STC ; set flag C
GOSTACK:
SHLD #0056 ; save SP
LXI SP,#0060
PUSH PSW ; save AF
PUSH B ; save BC
PUSH D ; save DE
; now switch context to another process

во вчерашнем сообщении тоже поправил...

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


28 Aug 2012 06:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Итак, делим адресное пространство на 4 окна по 16Кб - в первых трёх окнах имеем возможность подключения разных страниц большого общего ОЗУ (скажем размером 512К), причём каждый процессор может подключать их себе по разному. А последнее окно делим по хитрому:
Code:
#C000...#C7FF - ОЗУ 2К (у каждого процессора своё - всего 8К)
#C800...#CFFF - ОЗУ 2К (общее)
#D000...#FFFF - ПЗУ 12К (общее)

На самом деле размер ПЗУ - 32К, но первые 20К видимы только сразу после бута (и при записи в специальный порт) - содержимое ПЗУ будет повторяться в диапазоне адресов #0000...#7FFF и #8000...#FFFF, но в старших адресах область #C000...#CFFF всё также будет перекрываться маленькими ОЗУ (специфические 2К и общие 2К)...

Вы можете спросить меня - а к чему такая путанная нарезка памяти? А я отвечу - это всё ради ShaOS, которую я мечтаю реанимировать ;)

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


28 Aug 2012 17:02
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Вы можете спросить меня - а к чему такая путанная нарезка памяти? А я отвечу - это всё ради ShaOS, которую я мечтаю реанимировать ;)

Да нет - я заподозрил неладное (уж больно ты рьяно взялся! :o ), но промолчал... :lol:

В конце-концов, все больные - о своих язвах: я - всё время про "Специалист" и
RAMFOS... И прототип у меня из него вырисовывается + "Орионные" приблуды...

Ну - у тебя свои любимые предпочтения... :wink:

Мне только категорически не нравится текстовый экран... :(
Я и в молдости - не польстился на РК-ку...

_________________
iLavr


28 Aug 2012 17:15
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Ну всему своё время - до быстрой графики поди тоже дорастём (ключевое слово "быстрой" ; )

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


28 Aug 2012 17:34
Profile WWW
God
User avatar

Joined: 13 Nov 2010 04:06
Posts: 1345
Reply with quote
Post 
А некоторым категорически достаточно CLI или Rogue-подобия... :D


29 Aug 2012 02:22
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Я тут подумал, что чисто программно мьютексы не сделать - всё равно будет вероятность того, что к ячейке с состоянием мьютекса процессы обратятся одновременно и одновременно же попробуют его залочить. Поэтому в системе должен быть как минимум один аппаратный мьютекс, который будет закрывать доступ к программным мьютексам, причём закрывать серъёзно - т.е. останавливая все процессоры кроме одного (даже если обращается больше одного должен быть выбран один). Например путём вывода в некий порт программа будет говорить железяке, что она хочет поработать с одним из мьютексов (захватить или освободить), в этот момент железяка остановит все процессоры кроме просящего (либо первого из просящих), далее программа устанавливает (и идёт дальше либо запоминает что она должна локнуться) либо сбрасывает мьютекс и пишет в другой порт чтобы сигнализировать о том, что работа с мьютексами закончена - далее железяка отпускает все процессы, а просящий процесс либо висит на программном локе (ожидая когда программный мьютекс отпустят при этом ос может отдавать управление другим тредам на этом же процессоре), либо идёт дальше - в зависимости от результата лочки-анлочки программного мьютекса. Вобщем как-то так...


Вобщем информация обо всех глобальных мьютексах будет храниться в общей непереключаемой памяти (#C800...#CFFF). Любой процесс может в любой момент прочитать состояние любого мьютекса, однако чтобы локнуть или анлокнуть мьютекс, надо будет уведомить супервизора, что процесс хочет зайти в критическую секцию - для этого можно обратиться к какому-то специальному адресу (упрощаем железо - портов нету), предварительно запретив прерывания:
DI
MVI A,1
STA #FFFF
Это вызывает прерывание процессора-супервайзера. Далее процесс ожидает подтверждения - читает оттуда байт и ждёт когда младший бит станет равен нулю:
LOOP:
LDA #FFFF
RAR
JC LOOP
В момент подтверждения ожидающий процессор либо останавливается супервизором (если эта критическая секция уже локнута другим процессором либо процессор с более низким номером также хочет обратиться к критической секции), либо идёт дальше - локать или анлокать программный мьютекс.

Если интересующий нас мьютекс свободен (бит мьютекса сброшен) и процесс хочет его локнуть, то бит мьютекса взводится, а супервайзер уведомляется, что критическая секция покидается:
XRA A
STA #FFFF
EI
После этого супервайзер отпускает все остановленные процессоры, если таковые были.

Если интересующий нас мьютекс свободен, но процесс хочет его анлокнуть, то это ошибка, теоретически приводящая к трапу.

Если интересующий нас мьютекс локнут (бит мьютекса взведён) и процесс хочет его локнуть, то нужно ожидать анлока - для этого мы уведомляем супервизора что покидаем критическую секцию:
XRA A
STA #FFFF
EI
и висим в цикле ожидая сброса бита мьютекса, чтобы попытаться его локнуть когда он освободится (опять же зайдя в критическую секцию). При этом текущий процессор может переключить контекст, отдав вычислительные ресурсы другому процессу, ожидающему своего кванта времени.

Если интересующий нас мьютекс локнут и процесс хочет его отпустить (надо ли проверять то, что мьютекс отпускается именно тем процессом, который его локал?), то бит мьютекса сбрасывается и супервизор уведомляется о том, что критическая секция покинута:
XRA A
STA #FFFF
EI


С другой стороны такой подход нарушает нашу первоначальную установку, что все процессоры работают параллельно не мешая друг-другу и никогда не тормозятся. Буду думать, может есть решение без торможения процов...

P.S. Хотя можно смириться с временным торможением, но тормозиловку сделать аппаратную - чтобы проц без кручения в цикле гасился сразу же следом за STA #FFFF. Есть идеи того как это лучше сделать?...

P.P.S. Первую версию на самом деле можно сделать программную (с пятым 8080), а потом - если всё получится - можно задумываться об аппаратном ускорении...

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


30 Aug 2012 21:50
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Напомню схему от Хардваремана, которую он придумал в сентябре прошлого года:

HardWareMan wrote:
Первые наброски по подключению 4х КР580ВМ80А к одной шинке. Все ресурсы могут быть расшарены, если всю шину адреса замультиплексировать. Итак, схема:
Image
Входящая тактовая частота - 10МГц. Это позволяет формировать F2 на частоте 2,5МГц - проверенная хорошая частота для ВМ80. Таймслот получается равен одному периоду частоты 10МГц, или 100нс, что не так и мало и можно использовать достаточно медленные ОЗУ (не забываем задержки на установку адреса в мультиплексорах и т.д.). 2 триггера образуют счетчик на 4 положения. Результирующие сигналы 5М и 2М являются одновременно и сигналом номера активного процессора (0..3), который следует подавать на мультиплексор адреса. Сам мультиплексор можно собрать из 8 микросхем 555КП2 (в одном корпусе 2 мультиплексора, а надо коммутировать 16 линий). Сигнал F1 каждого процессора можно (и даже нужно) использовать как гейт для сигналов RD/WR этого же процессора. Или так же тупо поставить еще один корпус 555КП2. Всего получилось 4 корпуса следующего комплекта: 555ТМ2, 555ЛП5, 555ЛН1 и 555ЛИ1. Если высоковольные буферы имеют инверсию (ЛА8, к примеру), тогда 555ЛИ1 меняется на 555ЛА3, а в наборе сигналов F2 нужно просто сменить местами F2_1 с F2_3 и F2_2 с F2_4. А теперь эпюры:
Image


Сигнал F1 узкий, а на всех диаграммах рисуют DBIN сильно шире - 8080 точно успеет из памяти прочитать данные, если мы RD и WR будем гейтовать сигналом F1?...

И потом WR на диаграмме 8080 выглядит как будто он тянется от одного пика F1 до другого F1, а прямо посередине идёт положительная полуволна F2, т.е. если мы будем гейтать WR тем же F1, то похоже оно сгенерит два сигнала WR из одного - второй будет узким, но тем не менее (хотя на более детальной диаграмме видно что первый будет узким, а второй пошире).

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


30 Aug 2012 22:57
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Shaos wrote:
Сигнал F1 узкий, а на всех диаграммах рисуют DBIN сильно шире - 8080 точно успеет из памяти прочитать данные, если мы RD и WR будем гейтовать сигналом F1?...

И потом WR на диаграмме 8080 выглядит как будто он тянется от одного пика F1 до другого F1, а прямо посередине идёт положительная полуволна F2, т.е. если мы будем гейтать WR тем же F1, то похоже оно сгенерит два сигнала WR из одного - второй будет узким, но тем не менее (хотя на более детальной диаграмме видно что первый будет узким, а второй пошире).

Сигнал записи гейтится F2. И только F2. В фазе нуля: --__--


Last edited by HardWareMan on 05 Jan 2014 06:58, edited 1 time in total.



30 Aug 2012 23:41
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
HardWareMan wrote:
Shaos wrote:
Сигнал F1 узкий, а на всех диаграммах рисуют DBIN сильно шире - 8080 точно успеет из памяти прочитать данные, если мы RD и WR будем гейтовать сигналом F1?...

И потом WR на диаграмме 8080 выглядит как будто он тянется от одного пика F1 до другого F1, а прямо посередине идёт положительная полуволна F2, т.е. если мы будем гейтать WR тем же F1, то похоже оно сгенерит два сигнала WR из одного - второй будет узким, но тем не менее (хотя на более детальной диаграмме видно что первый будет узким, а второй пошире).

Сигнал записи гейтится F2. И только F2. В фазе нуля: --__--

Ну ты же сам писал год назад:

HardWareMan wrote:
Сигнал F1 каждого процессора можно (и даже нужно) использовать как гейт для сигналов RD/WR этого же процессора.


Получается что если WR надо гейтить по F2, а не по F1, то мы получаем пересечение и процессоры будут наступать друг-другу на пятки - придётся тормозить процы через READY в циклах записи?...

P.S. Кстати на фирменных диаграммах сигналы F1 и F2 соотносятся так:
Code:
F1 _|^|_________|^|_

F2 ______|^^^|______

а у тебя так:
Code:
F1 _|^|_______|^|_

F2 ___|^^^|_____|^

Я подозреваю, что так тоже будет работать т..к. в твоём спеце точно также идёт и оно работает :roll:

P.P.S. Вот блин - в книжке на картинке нарисовано одно, а в таблице по цифрам стоит tD1=0 ns (минимальное время от спада Ф1 до фронта Ф2) что значит, что твоя диаграмма правильная :)

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


Last edited by Shaos on 31 Aug 2012 00:01, edited 3 times in total.



30 Aug 2012 23:46
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
А, да, тут же многопроцессорный арбитр. Ну да, Данные процессору нужны от фронта F1 и до фронта F2:
Code:
F1 ___--__
F2 -____--
DT xxxDDxx

И гейтить только родным F1. Ну а короткая запись не страшна - адреса то все стоят стабильно. Хотя ее не будет, так показал осциллограф когда я спеца мучал. Гейт по F2 работал четко, а он шире, чем F1.


Last edited by HardWareMan on 05 Jan 2014 06:58, edited 1 time in total.



30 Aug 2012 23:54
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Не совсем понял кого её не будет и что показал осциллограф...

P.S. Я смотрю что слово статуса хватать с шины данных совсем не сложно - так что наверное будут у нас нормальные порты с командами IN и OUT :)
По большому счёту нам только 2 бита нужны из этого слова состояния - INP и OUT

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


31 Aug 2012 00:10
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Shaos wrote:
Не совсем понял кого её не будет и что показал осциллограф...

Короткой записи же.
Shaos wrote:
P.S. Я смотрю что слово статуса хватать с шины данных совсем не сложно - так что наверное будут у нас нормальные порты с командами IN и OUT :)
По большому счёту нам только 2 бита нужны из этого слова состояния - INP и OUT

Латчить по SYNC AND F1 в одну ТМ2. Все верно.


Last edited by HardWareMan on 05 Jan 2014 06:58, edited 1 time in total.



31 Aug 2012 01:37
Profile
Senior
User avatar

Joined: 21 Jul 2012 15:56
Posts: 126
Location: Zürich, Switzerland
Reply with quote
Post 
HardWareMan wrote:
А, да, тут же многопроцессорный арбитр. Ну да, Данные процессору нужны от фронта F1 и до фронта F2:
Code:
F1 ___--__
F2 -____--
DT xxxDDxx

И гейтить только родным F1. Ну а короткая запись не страшна - адреса то все стоят стабильно. Хотя ее не будет, так показал осциллограф когда я спеца мучал. Гейт по F2 работал четко, а он шире, чем F1.


Очень интересные детали, я правильно понимаю, что срез ни на что не влияет ни у F1 ни у F2?


31 Aug 2012 06:42
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 413 posts ]  Go to page Previous  1 ... 19, 20, 21, 22, 23, 24, 25 ... 28  Next

Who is online

Users browsing this forum: No registered users and 26 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.