Флейм
GameDev.ru / Флейм / Форум / CISC-x80: ПРАвәльный 8-битный «ДОМАШНИЙ» (псевдо-совместимый с PC-XT / CP/M-80 / DOS) (3 стр)

CISC-x80: ПРАвәльный 8-битный «ДОМАШНИЙ» (псевдо-совместимый с PC-XT / CP/M-80 / DOS) (3 стр)

Advanced: Тема повышенной сложности или важная.
Страницы: 1 2 3 4 515 Следующая »
=A=L=X=Постоялецwww22 мая 201817:07#30
Mahagam
> ну слепите 16 рон (на самом деле меньше) и получите MSP430
Ну, кстати, да, возможно очень похоже бы получилось.
Единственное у меня обязательно была бы (или будет) однобайтовая команда IF, которая по сути является префиксом типа 1111XXXX или 11111XXX, где XXX(X) это код условия. То есть условное выполнение возможно для любой команды и регулируется этим префиксом. Можно сказать, что каждая команда по выполнению последним действием сбрасывает флаг условного выполнения в "ALWAYS", а этот префикс его перебивает. Посему у обычных двухбайтовых инструкций должен быть еще бит влияния на флаги.

Правка: 22 мая 2018 17:08

}:+()___ [Smile]Постоялецwww22 мая 201817:10#31
Mahagam
> так вот, всю красоту и лаконичность сломала пара: некрасивая команда RETI и вызов прерывания. они вот совсем не ложились на ту ортогональность что была без них.
А через микрокод нельзя было такое разрулить? Казалось бы, он специально придуман чтобы всякие нестандартные вещи обрабатывать.
MahagamПостоялецwww22 мая 201817:19#32
}:+()___ [Smile]
> А через микрокод нельзя было такое разрулить?
можно, но тогда надо было бы придумать микрокод для остальных команд, придумать и написать декодер микрокода, исполнительные механизмы для микрокода и т. п.
а без этой пары проц получился ну очень простым.

я думал что можно будет для таких команд сделать макрокод: подставлять в конвейер команд существующие команды без считывания их из памяти. (например RETI эквивалентна паре команд POP, а прерывание - пара PUSH и JMP). но и тогда все равно пришлось бы вводить логику чтобы слегка изменяла поведение остальной части проца.

это в модели на JS всё просто. а на верилоге приходится изголятся ради красоты.

AlikberovПостоялецwww22 мая 201820:19#33
Mahagam
> никакие верилог-шаблоны в FPGA не заливаются.
Вo-первых, к чему все эти придирки?
Во-вторых, видимо не совсем поняли, что я имею ввиду…
Mahagam
> дешифратор команд чтобы был простой и лаконичный.
> так вот, всю красоту и лаконичность сломала пара
В-третьих, данная тема как раз таки о том, что процессор должен иметь красивый внешне потребительский вид, чтобы никто не задумался (сперва), отчего ломается вся «эргономика команд»…

Смотрите, что у меня выходит у дешифратора команд:

  • 8 бит самой команды;
  • 3 бита префикса;
  • 3 бита флага сравнения старшего ниббла префикса с младшим (случаи «44 66», «66 44» или «55 55»), а так же случаи «44 32» или «22 34»;
  • флаг префикса (коды 00h/11h/22h/33h/44h/55h/66h/77h), но также флаг декад (CAh/CBh/CCh/CDh/DAh/DBh/DCh/DDh/EAh/EBh/ECh/EDh/FAh/FBh/FCh/FDh), а также флаг «замыкания» ветвлений на себя;
  • флаг, что команда под условным префиксом «LOOP»;
  • флаг, что команда под условным префиксов «WAIT»;
  • флаг, что команду выполняет основной процесс;
  • флаг, что команда выполняется под префиксом «WAIT» в режиме микрокода;

Года два прошло и подзабыл. У меня 18 разрядов получилось на команду. То есть, если строить процессор дискретными элементами, то на одну операцию идёт элемент «7 И-НЕ» (в лучшем случае) или «18 И-НЕ» (в худшем). Итого, 36 линий - прямых и инверсных…
+ Назначение линий шаблона JS-эмулятора и Verilog-фрагмент

Тем самым, я никак «не постеснялся» расчитать всё так, чтобы снаружи система команд выглядила интуитивно и красиво, не смотря на то, что внутри будет кошмар…
(Если вы запускали эмулятор мой, то заметили, как секунд 10-15 он запускается: Подготавливает массивы для дешифровки четверти миллиона(!!!) комбинаций команд)

P.S.: А то, как я понял, вы хотели и стремились именно к красивой схемотехнике!
Сами же говорите, что на дворе - XXI век! К чему тогда скупиться и делать Hyper-RISC процессор из одной команды!?
Или снова хотите сказать, что я ни на ZX кодить не могу, ни в Verilog совсем не разбираюсь?

Правка: 22 мая 2018 21:01

MahagamПостоялецwww23 мая 20180:10#34
Alikberov
> ни в Verilog совсем не разбираюсь?
именно что.
тот самый случай, когда за язык описания аппаратуры садится программист. выходит говносхема.

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

=A=L=X=Постоялецwww23 мая 20182:58#35
Mahagam
> а от красоты системы команд проку совсем никакого.

Но почему тогда красиво реализовать на кристалле этот MP помешала именно пара некрасивых, выбивающихся из общего фона числом совершаемых действий команд?
Луквите, товарищ. :)
Например у классических RISC-ов никаких двойных обращений к памяти (которая судя по всему и подвела вашу схему в верилоге), а вместо call производится jump с копированием адреса возврата в Link Register, который за исключением этого действия такой же равноправный, отчего вызванная функция при желании может запихать его в стек, зато leaf-node-функции могут выполнять ret как mov ip, lr. Разве не облегчило бы жизнь? Думаю как раз в этом и был затык.
Так что красивая архитектура может спасать.

Правка: 23 мая 2018 3:14

AlikberovПостоялецwww23 мая 20184:16#36
Mahagam
> именно что.
> тот самый случай, когда за язык описания аппаратуры садится программист.
> выходит говносхема.
Тогдa, в таком случае, не окажете ли любезность в помощи с проработкой как описанной мною архитектуры, так и её аппаратной моделью? ;)

Подробнее
Если вы всё же запускали мой эмулятор, наверняка заметили, что при запуске «BIOS» очищается не весь экран терминала: Справа остаётся цветной мусор и там «тикает счётчик»……
Это - не баг, а явная демонстрация, что процедура вывода текста на экран умеет работать с «окнами» (строки 4891…5115). В частности, второй поток выводит у меня туда время и логи обращения к портам…
Более того, процедура поддерживает «Escape»-последовательность, аналогично «ANSI.SYS»: Можно подать «Esc»+ десяток десятичных параметров + Буква…
(Обратите внимание, что фрагменты ассемблерного кода спокойно можно отлаживать в той же Visual Studio и вставлять в мой эмулятор: Именно так я и делал, отлаживая сложные фрагменты!)

Таким образом, минимальный состав ПО у меня имеется: Каждый процесс может выводить данные в собственный (не перекрываемый) регион на терминале.
Это я к тому, что фактически для работы «в железе» у меня практически весь минимум готов…

К тому же, в процессор изначально введена концепция мультизадачности:
Встроенная статическая память 256x128=32Кб. Под каждый процесс выделяется 256 байт регистрового файла.
Каждый регистр имеет магазинную организацию: При изменении регистра его предыдущее значение помещается в историю.
Тем самым, можно выполнить «MOV AL,1»+«MOV AL,2»+«MOV AL,3»+«CALL Proc», а подпрограмма может прокрутить историю и прочитать все те «3», «2» и «1» инструкцией «POP AL»…
Инструкции «JMP» то же самое делают с «IP»: В критических участках программы можно обходиться без «CALL»/«RET»…
То есть, на старте «BIOS» может до настройки памяти и стека пользоваться подпрограммами…
Естественно, глубина ограничена: «РОН» - 8 уровней, «указатели» - 4 уровня…
В регистровом файле всё «лежит на местах»: A0-AF - «AX», B0-BF - «BX», C0-CF - «CX», D0-DF - «DX»/ E0-FF - «SI/DI/SP/BP/IP»…
Имеются инструкции «MOV R8,[R8]»/«MOV [R8],R8» для прямого доступа ко всем 256 ячейкам контекстного файла текущей задачи…

Процессор задумывался с микрокодом:
Так как этот «микрокод» не является чистым, а лишь инструкциями с усечёнными операндами, я условно их буду называть «макрокодом»…
Ячейки контекста от «00» до «9F» - макрокод… Через «WAIT INT 8» будет исполняться макрокод ячеек «80-8F»…
Так как контекст с регистровым файлом и макрокодом задумывается как 256 отдельных 8-битных регистров (аппаратно дорогих), то процессор может в принципе за такт выполнять …
В первой версии эмулятора процессора операции «SKIP 6» не только пропускали 6 следующих инструкций, но и заносили их в файл «макрокода», усекая операнды, чтобы уложиться в 2 байта…
Но потом я подправил концепцию и «WAIT INT 68» включает режим «SKIP 6» и последующие 6 инструкций заносятся в контексте… Тем самым, сама «SKIP» перестала портить контекст…

Период исполнения потока:
Имеются 8 служебных регистров за рамками контекста. Они доступны через «MOV [n],R»/«MOV R,[n]»…
Причём, «MOV [0],R» использует реальную операцию «HLT» и не может быть выполнена прикладным кодом в принципе… Только системный код вместо «HLT» имеет префикс «HLT 0»… (строки 5311 и 5375)
Почему я так сделал? Просто меня БЕСЯТ привелегированные инструкции в x86, которые зря засоряют систему команд, а используются исключительно редко!!!
Тем самым, прикладной код может читать «MOV R,[0]», но не писать…
Старший бит «[0]» является флаговым и указывает, в прикладном ли режиме сейчас исполняется программа?
Если он сброшен (значения 0…127), значит режим прикладной и код «00» - это «HLT». Если же он установлен (значения 128…255), значит режим системный и код «00» - это «HLT 0»… Всё просто! При значениях 128…255 выбран всё равно контекст №0 как активный, но в проекциях для «MOV R8,[R8]»/«MOV [R8],R8» доступны любые станицы 0…127. Тем самым, системный код может свободно их переключать и модифицировать.
Регистры «[6]» и «[7]» считают такты. Как только они достигают 0, управление получает системный код… Счёт тактов из-под системного кода не ведётся и он может предустановить их число для конкретного процесса. Причём, сигнал «RESET» запускает отсчёт тактов…

Сброс процессора:
Процессор нельзя «быстро сбросить»: По приходу сигнала «RESET» генерируется нужное событие с передачей управления диспетчеру… При этом счётчик тактов декрементом стремится к нулю.
Если диспетчер - «адекватен», он может переписывать значения счётчика тактов и отдалять момент «сброса»… Это позволит выполнить некоторые важные задачи…
Если же диспетчера не существует, счётчик скоро обнулится и управление получит «BIOS».
Таким образом, случайным сигналом «RESET» систему не перезапустить и можно этот сигнал использовать опционально как интерфейсный, так как он управляет напрямую декрементом счётчика и можно фиксировать длительность «RESET»-периодов…

Подытожу:
Понимая, что процессор с 128 страницами контекста из 256 регистров - слишком дорогое удовольствие даже в наши дни, расчитывается, что физически будет не 128 страниц, а 3: Одна - системная, вторая - сервисная, а третья - прикладная и прогружаемая с внешней памятью. Две задачи параллельно, в принципе, смогут исполняться без тормозов. А вот с тремя задачами…
То есть, принципиально процессор может иметь несколько модификаций с аппаратной поддержкой от 3 процессов (минимум) до десятков (опционально).
А то, что синтаксис инструкций - x86-подобный, то принципиально ничего не мешает разрабатывать и отлаживать любой код под x80 в любом PC-отладчике.
Получается своеобразный восьмибитный x86 же…

P.S.: Чувствую, сейчас начнётся жёсткая критика… Мол, под JS набыдлокодить можно любую архитектуру! А в Verilog такое не опишешь, чтобы ровно залилось в бюджетный FPGA!

Правка: 23 мая 2018 9:17

MahagamПостоялецwww23 мая 201812:20#37
Alikberov
> не окажете ли любезность в помощи с проработкой как описанной мною архитектуры,
> так и её аппаратной моделью? ;)
а смысл? куда и как это применять? до отдельных чипов это не дойдёт. а для реализации во FPGA нужны какие-то неоспоримые преимущества перед альтернативами.

вообще проц во FPGA - это по большей части не самоцель, он чаще идёт как довесок на свободную часть кристалла.

return [](){};Участникwww23 мая 201812:51#38
Alikberov
Напиши простенький 8-битный проц с десятком инструкций на logisim
MahagamПостоялецwww23 мая 201813:25#39
return [](){};
а что потом? куда и как можно перегнать получившийся результат?
return [](){};Участникwww23 мая 201813:28#40
Mahagam
никуда, но будет хоть какое-то понимание
MahagamПостоялецwww23 мая 201813:36#41
return [](){};
ну так можно пойти более практичным путём: купить на али простенький кит на плиске и реализовать своё творение в реальном железе. за 50 баксов там даже с экранчиком есть варианты
=A=L=X=Постоялецwww23 мая 201813:49#42
Интересно - сейчас вообще есть смысл делать 8/16-битки как таковой?
То есть вот эти ардуины всякие - это просто попытка выдоить устаревшее оборудование на лохах или реально можно выиграть хоть в чём то сделав 8-битную схему на пяти тысячах транзисторов, а не 32-битную на 100 тысяч со встроенным 100 Кб SRAM на той же площади кристалла просто потому что ножки куда то подводить всё равно надо?

Правка: 23 мая 2018 13:50

DexusУчастникwww23 мая 201813:52#43
=A=L=X=
Смысл есть в случае хоть какой то экономии. Очевидно ж. Либо экономия на разработке/производстве, либо экономия на заряде батареи (меньше потребления). И то и другое - ещё лучше.

Правка: 23 мая 2018 14:18

MahagamПостоялецwww23 мая 201813:55#44
=A=L=X=
оно ж по разным техпроцессам делается, и себестоимость тоже сильно разная.
Страницы: 1 2 3 4 515 Следующая »

/ Форум / Флейм / ПроЭкты

2001—2018 © GameDev.ru — Разработка игр