nedoPC-580 (SMP на 5 процессорах КР580ВМ80А)

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Shaos wrote:P.S. А вот код сохранения регистров для переключения контекста в обработчике прерываний (для начала думаю пусть прерывание будет по таймеру 10 раз в секунду):

Code: Select all

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/
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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.
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

b2m wrote:
Shaos wrote:P.S. А вот код сохранения регистров для переключения контекста в обработчике прерываний (для начала думаю пусть прерывание будет по таймеру 10 раз в секунду):

Code: Select all

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: Select all

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
во вчерашнем сообщении тоже поправил...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Итак, делим адресное пространство на 4 окна по 16Кб - в первых трёх окнах имеем возможность подключения разных страниц большого общего ОЗУ (скажем размером 512К), причём каждый процессор может подключать их себе по разному. А последнее окно делим по хитрому:

Code: Select all

#C000...#C7FF - ОЗУ 2К (у каждого процессора своё - всего 8К)
#C800...#CFFF - ОЗУ 2К (общее)
#D000...#FFFF - ПЗУ 12К (общее)
На самом деле размер ПЗУ - 32К, но первые 20К видимы только сразу после бута (и при записи в специальный порт) - содержимое ПЗУ будет повторяться в диапазоне адресов #0000...#7FFF и #8000...#FFFF, но в старших адресах область #C000...#CFFF всё также будет перекрываться маленькими ОЗУ (специфические 2К и общие 2К)...
Вы можете спросить меня - а к чему такая путанная нарезка памяти? А я отвечу - это всё ради ShaOS, которую я мечтаю реанимировать ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Вы можете спросить меня - а к чему такая путанная нарезка памяти? А я отвечу - это всё ради ShaOS, которую я мечтаю реанимировать ;)
Да нет - я заподозрил неладное (уж больно ты рьяно взялся! :o ), но промолчал... :lol:

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

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

Мне только категорически не нравится текстовый экран... :(
Я и в молдости - не польстился на РК-ку...
iLavr
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ну всему своё время - до быстрой графики поди тоже дорастём (ключевое слово "быстрой" ; )
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

А некоторым категорически достаточно CLI или Rogue-подобия... :D
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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), а потом - если всё получится - можно задумываться об аппаратном ускорении...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Напомню схему от Хардваремана, которую он придумал в сентябре прошлого года:
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 из одного - второй будет узким, но тем не менее (хотя на более детальной диаграмме видно что первый будет узким, а второй пошире).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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.
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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: Select all

F1 _|^|_________|^|_

F2 ______|^^^|______
а у тебя так:

Code: Select all

F1 _|^|_______|^|_

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

P.P.S. Вот блин - в книжке на картинке нарисовано одно, а в таблице по цифрам стоит tD1=0 ns (минимальное время от спада Ф1 до фронта Ф2) что значит, что твоя диаграмма правильная :)
Last edited by Shaos on 31 Aug 2012 00:01, edited 3 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

А, да, тут же многопроцессорный арбитр. Ну да, Данные процессору нужны от фронта F1 и до фронта F2:

Code: Select all

F1 ___--__
F2 -____--
DT xxxDDxx
И гейтить только родным F1. Ну а короткая запись не страшна - адреса то все стоят стабильно. Хотя ее не будет, так показал осциллограф когда я спеца мучал. Гейт по F2 работал четко, а он шире, чем F1.
Last edited by HardWareMan on 05 Jan 2014 06:58, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Не совсем понял кого её не будет и что показал осциллограф...

P.S. Я смотрю что слово статуса хватать с шины данных совсем не сложно - так что наверное будут у нас нормальные порты с командами IN и OUT :)
По большому счёту нам только 2 бита нужны из этого слова состояния - INP и OUT
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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.
User avatar
BarsMonster
Senior
Posts: 126
Joined: 21 Jul 2012 15:56
Location: Zürich, Switzerland

Post by BarsMonster »

HardWareMan wrote:А, да, тут же многопроцессорный арбитр. Ну да, Данные процессору нужны от фронта F1 и до фронта F2:

Code: Select all

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