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

16-bit mode of KISC (Koy Instruction Set Computing): «Koy-Machine» by Alikberov (10 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 16 7 8 9 10 11 Следующая »
#135
(Правка: 22:44) 22:22, 22 фев. 2021

Тaк как с эмуляцией у меня большие проблемы в плане полной инкапсуляции, попытался набросать черновик периферийных функций BIOS:

+ Показать
Таким образом, эмуляция из уровня «CPU<->RAM», где программа варится в собственном соку, выходит уже на уровень малого взаимодействия с пользователем.

Из эскиза уже более-менее видно, что D₇, «Direct sEvent» должен служить стеком событий, как в Windows.
То есть, стандартные аппаратные прерывания я думаю не рассматривать (как рудименты пережитка прошлого) и попытаться воспроизвести архитектуру системы с более высоким уровнем. Однако, это вовсе не означает, что прерываний не будет совсем.
Для прикладного уровня прерываний точно не будет.

Как я уже говорил, регистр D₉ должен переключать УВВ-Страницы.
Следуя Кой-парадигме, приложение не имеет права выбирать страницы с BCD-индексом.
То есть, «MOV D9,0xE6» можно, а вот «MOV D9,0x89» нельзя.
Так, если «D₉=0x00» по умолчанию стандартен для взаимодействия с БСВВ, то BCD-индексы 01₁₆…99₁₆ уже привилегированны и служат селекторами 99 различных физических УВВ.
А для приложения в индекс обязательно следует добавлять шестнадцатеричную букву A…F. Получается порядка 156 виртуальных УВВ.

Конечно, всё это справедливо в рамках конкретной реализации согласно Кой-Парадигме.
А так как единственным активным пользователем являюсь только я, то буду пытаться нарабатывать всё именно в этом русле.

Эмулятор
Наконец-то решил проблему с отсутствием некоторых важных команд.

(Здесь видно, что я намеренно не соблюдаю традиционный синтаксис и никаких «ADC»/«SBB» не использую, чтобы всё было как можно проще и очевиднее…)

Правда, в рамках i8080-эмуляции это пока не реализовано в силу некоторых сложностей, но на Verilog это опишется довольно легко.
(Сложно в 8-битном i8080/z80 компактно проверить в эмуляторе правый операнд на конкретный РОН и сделать подстановку.)
Так как i8080-эмулятор ограничивается размером в 1 Кб и приходится нехило выкручиваться, чтобы в 1 Кб уместить и эмулятор, и дизассемблер!
(Для себя поставил цель сделать максимально компактный код эмулятора, запускаемый и на ZX-Spectrum, и на РАДИО-86РК без какой-либо модификации - типа рекламной акции Кой-Технологии! :-D )

P.S.: Заметил, что когда рисую схемы в Logisim или пишу программы под i8080, мозги начинают работать существенно лучше, чем во вседозволенном Си, JavaScript, Python или Verilog…


#136
(Правка: 9:30) 9:00, 23 фев. 2021

Свершилoсь!
Товарищи!

Я решил проблему инкремента/декремента!

Если Вы не забыли, регистры D₀…₉ работают как УВВ, где D₉ служит селектором страницы УВВ.
Получается, что в относительной базово индексной адресации нельзя использовать РОН D-ряда - [BCi+n+D₀…₉]. А это - целый десяток!

Тем самым, трюком можно обеспечить:

Тем самым, появляются полноценные стековые операции:

1234 A5 AD 67 9F|MOV A5,[BC6--][7]
1238       67 8F|MOV A5,[--BC6][7]
123A       67 2F|MOV A5,[++BC6][7]
123C       67 1F|MOV A5,[BC6++][7]
Но только на чтение.
Хотя, на запись тоже можно достичь, если запретить запись в память напрямую из УВВ.
123E    DA 67 9F|MOV [BC6--][7],A5
1241       67 8F|MOV [--BC6][7],A5

Так аппаратно в Verilog очень легко расставить подобные ловушки, чтобы расширить пространство для трюков.
Думаю, операции «ADD/SUB/MOV Di,Dj» (пересылка из УВВ в УВВ) тоже следует запретить, тогда и умножение/деление внедрять можно:

1243    DA    9A|MUL BC9 ; BC9 = +B9 * +C9 // MUL - Multiplication to Unsigned Long
1245          8B|MIL BC8 ; BC8 = ±B8 * ±C8 // MIL - Multiplication to Integer Long

P.S.: Тем самым, концептуально Кой-Идея развивается и открывает новые горизонты!

#137
(Правка: 0:05) 0:00, 24 фев. 2021

Частичнo вернулся к #54 (код CF₁₆ и означал флаг CF - аналог Z80-CCF).

Теперь получается следующее:

КодКомандаДействие
AF₁₆AF/CMAComplement PSW-AF Flag
BF₁₆BF/CMBComplement PSW-BF Flag
CF₁₆CF/CMCComplement PSW-CF Flag
DF₁₆DF/CMDComplement PSW-DF Flag
В таком случае 8 операций ветвления кодируются так:
КодКомандаАналог
AE₁₆JAE BC0JNS BC0
AF₁₆ AE₁₆JAF BC0JS BC0
BE₁₆JBE BC0JNO BC0
BF₁₆ BE₁₆JBF BC0JO BC0
CE₁₆JCE BC0JNC BC0
CF₁₆ CE₁₆JCF BC0JC BC0
DE₁₆JDE BC0JNZ BC0
DF₁₆ DE₁₆JDF BC0JZ BC0
В принципе, если месяц назад я упразднил в Дешифраторе Команд разницу между AE/AF;BE/BF;CE/CF;DE/DF, то теперь придётся её вернуть (в Logisim в частности), а также и код DD₁₆ отделить от группы ARG и сделать его частным случаем HLT/INT с передачей управления «CALL 0xDD00» например, как отдельную инструкцию типа «DBG» или «DBG 01…99».
(Но это не точно…)

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

P.S.: Эмулятор для i8080/Z80 под ROM/ПЗУ без самомодификации почти сделал…
(В ZX-Spectrum область 0x386E…0x3CFF заполнена FF: Думаю туда и разместить свой Кой-Эмулятор/Дизассемблер…)

#138
(Правка: 1:52) 1:39, 28 фев. 2021

Важнo
Всё-таки немножечко продвинулся концептуально.
Как я писал выше, код DD₁₆ я сделал исключительно отладочным «DBG», что на деле является «HLT DD» и работает как «CALL 0xDD00».
А так как сегодня весь день думал, как бы оптимально осуществить все эти адресации с авто-пре/пост-инкрементом/декрементом, но ничего путного так и не придумал.
В эмуляторе это как бы и работает, но всё сложно так, что я сам путаюсь, как это кодировать!
(Что не вяжется с парадигмой Акына с WYSIWYG-кодированием!)

И только сейчас я нашёл способ, реализовал в эмуляторе/дизассемблере и проверил - работает!

Сложение Указателей
Как уже известно, под указателями на ячейку в памяти у меня отведено 10 пар регистров - B₀C₀…B₉C₉, что кратко записывается как BC₀…₉.
Здесь одинокий код DD₁₆ работает как «DBG». А вот с BCD-префиксом 01…99 код DD₁₆ работает уже как «ADC BCm,BCn»:

1234       12 DD|ADD BC1,BC2         ; Сложение двух указателей
1236       33 DD|ADD BC3,BC3         ; Формально «BC₃ <<= 1»
1238       54 DD|ADD BC5,BC4
Тем самым, никакой авто-инкремент/декремент уже не требуется!
Заносим в BC₁ константу 0x0001 и в BC₉ константу 0xFFFF, получаем:
1234       21 DD|INC BC₂
1236       29 DD|DEC BC₂
Получается просто и понятно (любая домохозяйка акына это поймёт), чтобы и в Logisim реализовать, и в Verilog описать, и кодировать голыми руками в дампе.

И стековые операции реализуются подобным образом:

; Здесь:
;  BC₁ = 0x0001
;  BC₂ = 0x0002
;  BC₄ = StackPointer
;  BC₅ = FramePointer
;  BC₈ = 0xFFFE
;  BC₉ = 0xFFFF
1234    C1 CC 1C|AND C1,C1          ; Just Reset CF
1237       48 DD|ADD BC4,BC8        ; SP -= 2
1239       40 C0|MOV [BC4+0],C0
123B       41 B0|MOV [BC4+1],B0     ; PUSH BC₀

P.S.: Правда, i8080-код сейчас чуток раздулся и не влезет в резервную область ПЗУ ZX-Spectrum.
Но это из-за вчерашних выкрутасов с авто××крементами.
Нужно будет выскабливать код…

#139
9:32, 1 апр. 2021

Из #1499 перешёл на #47 и дочитав до #51 обнаружил от KPG ссылку на собственную страницу… °_⁰

Странно, что здесь это появилось раньше, чем я открыл данную тему…

#140
1:45, 12 апр. 2021

Покa выложу-ка свой сырой и позорный набросок Кой-Мак (Koy-Machine).
(Из Ташкента же я! А здесь - коймак едят! :D )

В общем, справа - отладочный дамп с архитектурным состоянием. Прежде всего, мне он отображает состояние эмулятора на каждом шаге.

Жмёте ПРОБЕЛ и выполняете инструкцию…

#141
(Правка: 15:36) 15:35, 28 мая 2021

Написaл практически с нуля Эмулятор.
Дамп можно редактировать и после обновления страницы изменения будут применены.
Кнопки и - запуск/отладка кода.

Справа: Дамп активного региона памяти; Дизассемблинг; Регистровый файл.

Внизу: Пока единственный интерактивный мониторинг записи в порт 0xC0#0 для вывода текста.

#142
(Правка: 13:48) 11:00, 29 мая 2021

Тепeрь и каKOY-то ассемблер готов!
Запустить.
(Если требуется в поле редактора восстановить оригинальный текст, просто, очистите его и обновите страничку.)

Самая сложная для ассемблера - инструкция АЛУ, так как там очень много вариаций.

В общем, программировать теперь можно как в голом дампе, так и листингом ассемблера.

Однако, в эмуляторе выявились некоторые ненужные фишки.
Так, команда «ALU A1,[BC2+3+C2]» не должна работать, так как сочетание «BC₂» и «C₂» - нежелательно. Думаю, что такие сочетания следует исполнять просто как «ALU A1,[BC2+3]».
Также, команды «ALU A1,[BC2+3+C0]» также нежелательны, так как регистры «A₀», «B₀», «C₀» и «D₀…₉» - особенные и не должны участвовать в косвенно-индексной адресации.

В общем, худо-бедно, минимальную среду удалось получить…

Теперь, следуя демонстрации графики #284, нужно как-то прикрутить хоть какую-то графическую периферию или звук…

И операции умножения куда-то пристроить нужно.
Где-то я писал, что под …

В таком случае и побочные холостые «SWP» исчезнут, а арифметика посерьёзнее появится.

P.S.: Жара надвинулась вовсю!!! Долго что-то делать - полушария кипят…

#143
11:00, 30 мая 2021

Оглядывaясь на свои наработки, в частности - ×80, заметил ещё одну фишку.

КодОперацияОписание
12 ABSWP A₁,B₂Обмен значениями регистров A₁ и B₂
21 ABSWP A₂,B₁Обмен значениями регистров A₂ и B₁
12 BASWP B₁,A₂Обмен значениями регистров B₁ и A₂
21 BASWP B₂,A₁Обмен значениями регистров B₂ и A₁

В том же x86 одну и ту же инструкцию можно закодировать десятком способов, так как архитектура разрабатывалась в условиях жёсткой конкуренции и некогда было продумывать строгий вектор масштабирования.
В моём же случае, кодирование команд акынским методом должно быть максимально простым и однозначным в большинстве случаев. А значит, из указанных выше четырёх кодирований операций только две должны быть легальными.
Так как сравнить две BCD-цифры сложнее - требуется 4-битный компаратор, легче сравнивать имена регистров:
КодОперацияОписание
12 ABSWP A₁,B₂Сравнить 1<2 сложно, а "A"<"B" - легко
21 ABSWP A₂,B₁Сравнить 2>1 сложно, а "A"<"B" - легко
12 BASWP B₁,A₂Сравнить "B">"A" легко
21 BASWP B₂,A₁Сравнить "B">"A" легко
К тому же, должно быть нельзя обмениваться и с периферийными регистрами портов D-группы. Что освобождает ещё часть кода под резерв.

Итого, из 1485 комбинаций лишь 297 - легальные SWP.
В остальном, 162 - умножение (MUL/MIL) и 1026 резерва.
То есть, SWP - 20%, MUL/MIL - ≈11%, а под резерв дальнейшего расширения системы команд - более 70%.

Проблема #853 частично может быть решена, если условиться под операции ветвления выделить резервный код программной библиотеки. Это хоть костыльно, но из эмуляции видно, что загрузка 16-битного слова в пару B:C реализуема программно и работает нормально.

P.S.: Лето пришло такое, что ПК быстро перегревается за пару часов. А эффективной системы охлаждения - нет: Лишь баклажки воды из морозильника, которые быстро оттаивают.
В такой среде я не могу спокойно продолжать разработку и весь на нервах

#144
(Правка: 10:24) 10:10, 31 мая 2021

Рассмoтрим некоторые комбинации с условиями, что…

Таким образом, правила кодирования специальных инструкций описывать будет легче:
КодИнструкцияПримечание
ji knINT knjiПод резервом как CALL 0xknji
-- 00HLT
-- kAADD Ri,TkПо принципу - ADC Ri,Tk
-- kBSUB Ri,TkПо принципу - SBB Ri,Tk
-- kCAND Ri,Tk
-- kDOR Ri,Tk
-- kEEOR Ri,Tk
-- kFMOV Ri,Tk
ji 0AADD Ri,[BCj+i]По принципу - ADC Ri,[BCj+i]
ji 0BSUB Ri,[BCj+i]По принципу - SBB Ri,[BCj+i]
ji 0CAND Ri,[BCj+I]
ji 0DOR Ri,[BCj+i]
ji 0EEOR Ri,[BCj+i]
ji 0FMOV Ri,[BCj+i]
ji kAADD Ri,[BCj+i+Tk]
ji kBSUB Ri,[BCj+i+Tk]
ji kCAND Ri,[BCj+i+Tk]
ji kDOR Ri,[BCj+i+Tk]
ji kEEOR Ri,[BCj+i+Tk]
ji kFMOV Ri,[BCj+i+Tk]
0i Tk??? ??? ???Сейчас был обнаружен резерв!!!
ji TkMOV [BCj+i],Tk
mn RTSWP Rm,Tn
nn AADIV BCn,AnЭкспериментально: Bn = BCn / An, Cn = BCn % An
nn BBMUL BCn,Bn,CnИли кратко «MUL BCn» / «MUL Bn,Cn»
nn CCMIL BCn,Bn,CnИли кратко «MIL BCn» / «MIL Bn,Cn»
ji DDADD BCi,BCjПо принципу - ADC BCi,BCj
-- DDDBGПо принципу - CALL DD00₁₆
ji AEJA BCi+i
ji BEJB BCi+i
ji CEJC BCi+i
ji DEJD BCi+i
-- AFCMAИли же CMAF / CAF / AF
-- BFCMBИли же CMBF / CBF / BF
-- CFCMCИли же CMCF / CCF / CF
-- DFCMDИли же CMDF / CDF / DF
ji AF???До сих пор под резервом или JNA BCi+j
ji BF???До сих пор под резервом или JNB BCi+j
ji CF???До сих пор под резервом или JNC BCi+j
ji DF???До сих пор под резервом или JND BCi+j
-- ExCALL 0xE000…EF00
-- FxCALL 0xF000…FF00
ji ExCALL 0xE0ji…EFjiДо сих пор под резервом
ji FxCALL 0xF0ji…FFjiДо сих пор под резервом

Таким образом, практически всю систему Кой-Команд можно описать в данной краткой таблице.

Сейчас под вопросом операции MUL/MIL/DIV в частности, так как формально их поддержка на уровне кодирования команд вполне допустима.

#145
21:39, 2 июня 2021

Добaвил пробный графический буфер 120×100 в эмулятор и ужаснулся производительности!
Если нажать , то страница на некоторое время повиснет, прежде чем выдаст узор.
Потому, нажатиями можно код выполнять порциями.

Ни о какой динамичной графике и речи быть не может!

P.S.: Видимо, сильно подвёл Proxy для Array в этом JavaScript и нужно писать по старинке - без новомодных плюшек.
Да ещё проекция регистров прямо в тот же  Proxied Array - не самое лучшее решение.

#146
14:00, 3 июня 2021

Добaвил пародию на макросы…

Было:

	.ORG	0x0000
	REG	BC4
	CALL	FD
	.DW	0x00A0	; LOAD BC4,0x00A0
	REG	BC1
	CALL	FD
	.DW	0x0001	; LOAD BC1,0x0001
	REG	BC9
	CALL	FD
	.DW	0xFFFF	; LOAD BC9,0xFFFF
	REG	A9
	CALL	FA
	.DB	0xC0	; LOAD A9,0xC0
Стало:
	.DEFW	JMP,0xFE	; JMP IS [FE,LO,HI]
	.DEFW	LOAD,0xFD	; LOAD IS [FD,LO,HI]
	.DEFB	LDA,0xFA	; LDA IS [FA]
	.DEFB	LDB,0xFB	; LDB IS [FB]
	.DEFB	LDC,0xFC	; LDC IS [FC]
	;;;;;;;;;;;;;;;;;;;;;;;;;
	.ORG	0x0000
	LOAD	BC1,0x0001	; BC1 IS INCREMENTOR
	LOAD	BC4,0x00A0	; BC4 IS SP (STACK)
	LOAD	BC9,0xFFFF	; BC9 IS DECREMENTOR
	LDA	0xC0
То есть, определяешь инструкцию «LDA» как «INT 0xFA» с автоматическим «.DB».
(В дизассемблере подстановка отсутствует и всё отображается как есть…)

Теперь бить листинг станет ещё легче.
По идее, можно и «PUSH/POP» ещё внедрить. Но такая абстракция уже отдаляет от «кода акына».

#147
17:17, 5 июня 2021

Добaвил поддержку меток…
(Скопировал фрагмент #1957 готового кода из своего соседнего проекта - ×80…)

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

#148
(Правка: 14:41) 14:00, 7 июня 2021

Набросaл пилотный Кой-Рендер.

+ Показать
Галочками можно частично управлять отображением спрайтов.
В поле можно задать свой бинарный цикл переключения.

Шум в кадре - усиление эффекта:
Когда-то система задумывалась как врезка к композитному ТВ-сигналу через LM1881 для организации OSD-работы к тюнеру, чтобы выводить показания 1-Wire термометров в частности или организовать игру «Ну, Погоди!» прямо поверх телевизионного канала.

То есть, типа, промежуточная ТВ-приставка-врезка для дополнения телевизионного сигнала разной информацией мониторинга бытовой среды.

Так-как Кой-Процессор имеет всего 10 периферийных регистров D₀…₉ и только D₀…₇ должны активно использоваться, это - 64 бита маскировки спрайтов в кадре. Это вполне хватает под 8 позиций 7-сегментных знаков.

#149
(Правка: 22:23) 22:22, 7 июня 2021

Написaл, вернее дополнил разработанную для Нуль-Поста, свою утилиту так, чтобы легче было редактировать слайд целиком и индексировать на нём спрайты.
В итоге, получилось как-то так

+ Показать
Картинка не очень, так как не удалось найти качественное, не пожатое в jpeg, изображение. Из-за чего артефактов очень много.

Но, в целом, разобрался в особенностях построения инструментов для подобного рендера.

Как можете видеть из работы скрипта, игровую ситуацию кодировать флажками можно.
То есть, Кой-Алгоритму вполне под силу поддержать подобную динамику и экшн. :))
Тем самым, игры, типа «Super Mario» реализовать будет достаточно сложно.
А вот такие Ралли или Тетрис - вполне легко!

Страницы: 16 7 8 9 10 11 Следующая »
ФлеймФорумПроЭкты