Сб янв 14, 2017 01:38:18
Сб янв 14, 2017 15:28:28
Paguo-86PK писал(а):Вaш процессор напоминает мой, который многие критикуют. Суть которого в том, что АЛУ в нём отсутствует, но он просто работает как маршрутизатор потоков данных между всеми внешними устройствами, как умный ПДП. Подключив к нему внешние FPU/ALU - получаем полноценное процессорное устройство.
Сб янв 14, 2017 18:18:59
DX168B писал(а):Ну так на сколько я знаю, АЛУ - это не весь процессор, а всего лишь один из исполнителей. Имеет, грубо говоря, две входные шины, одну выходную, шину номера операции и линии вывода некоторых флагов. Например, zero флага и carrier флага (флага переноса) Отвечает он за такие операции, как сложение, вычитание, умножение, деление, сравнение и логические операции (И, ИЛИ, НЕ, И-НЕ, LSL, LSR и т.д.) От того у него и такое название "Арифметико-логическое устройство", ибо его основная задача в процессоре - быть всего лишь управляемым по команде калькулятором.
В моем примере АЛУ является всего лишь одним из узлов.
SF|PF|CF|ZF
+--+--+--+--+
| 0| 1| ?| 1| Паритетный ноль: (SKIP N) Исполнительный узел проигнорирует N инструкций дешифратора
| 1| 0| ?| 1| Отрицательный ноль: (LOOP N) Запрещает инкрементацию счётчика команд и одна инструкция выполняется N раз
| 1| 1| 1| 1| Отрицательный паритетный ноль: (WAIT N) То же самое, что LOOP, но с проверкой флага CF (здесь - Continue Flag)
+--+--+--+--+
Сб янв 14, 2017 23:19:59
Ну вот это совершенно прямое и честное утверждение.Paguo-86PK писал(а):.. мои "прихоти" .. системы команд с её "красивостью" - ... просто незначительные доработки именно i8080 ...
Вс янв 15, 2017 02:03:58
Вс янв 15, 2017 10:51:00
Абсолютныe адреса CALL/JMP i8080 - два байта и выходят за рамки 8-битового процессора. Их я выбросил сразу и все команды работают только с байтами. Извращение i8080 - LXI SP,a16, так как стековый регистр загружается крайне-крайне редко. Этих инструкций у меня вообще нет с самого начала. Как и EI/DI/PCHL/IN/OUT, которые достигаются более длинными комбинациями нескольких команд.petrenko писал(а):Ну вот это совершенно прямое и честное утверждение.
Но зачем тогда было писать слово "архитектура" в названии темы ?
Чтоб форумчане обратили внимание ?
Мож попросите модераторов поправить на что-нибудь вроде "Косметическое "причёсывание" систем команд" ?
Ну или что-нибудь в таком стиле.
В любом случае плохого в Вашем досуговом занятии ничего нет, так что удачно Вам продолжать сие.
И - что то я видимо недостаточно внимательно читал все Ваши сообщения - Вы уж выкинули из системы команд вызовы CALL по абсолютным адресам или пока ещё нет ?
"Если чё" - выкидывайте смело, разрешаю !
.. 00 --:HLT ;MOV [BX],[BX] - в i8080 mov m,m означает hlt
.. 06 --:MOV CL,[BX] - аналогично mov c,m
.. 70 --:MOV [BX],DL - аналогично mov m,d
.. 76 --:MOV CL,DL - аналогично mov c,d
66 ++ ??:PREFIX CL ;MOV CL,CL - аналогично mov c,c - пустая трата тактов
77 ++ ??:PREFIX DL ;MOV DL,DL - аналогично mov d,d - пустая трата тактов
.. 85 nn:PUSH 0500h+nn - аналогично push data в i8086
.. AA nn:ADD AL,nn - аналогично adi nn
.. AF nn:CMP AL,nn - аналогично cpi nn
.. B8 nn:JMP ±nn - безусловный относительный переход ±128
.. B9 nn:CALL ±nn - условный относительный вызов ±128
.. BC nn:JC ±nn - условный относительный переход ±128
.. CD --:INC DX - аналогично inx d
.. FE --:NOP - холостая операция
.. FF --:RET - безусловный возврат из подпрограммы
77 85 nn:PUSH 7500h+nn - расширяется диапазон
66 AA nn:ADD CL,nn - префикс 66 - подменяет аккумулятор на CL
77 AA nn:ADD DL,nn - префикс 77 - подменяет аккумулятор на DL
11 B8 nn:JMP ±nn - префикс расширяет адрес до ±2048
66 CD --:ADD DX,CX - префикс расширяет inx d до аналогичной dad
66 FE --:NOP 6 - префикс 66 для холостой операции - число тактов
77 FE --:NOP 7 - префикс 77 для холостой операции - число тактов
.. B8 FE:JMP $ ;WAIT - зацикливание на себя невозможно принципиально - префикс WAIT (SF=1,PF=1,ZF=1)
.. BC FF:JC $+1 ;RC - при переходе на байт назад - встречается FF-RET, достигается возврат по условию
┌─►RET Example:
Bx FF:Jcond $+1─┐ 1.BE FF - RZ
┌──┘┌►Rcond │ 2.BC FF - RC
└───┴───────────┘ 3.BD FF - RNC
Вс янв 15, 2017 11:41:22
Вс янв 15, 2017 11:44:33
LastHopeMan писал(а):Также не вижу перспектив в наращивании последовательных шин. В связи с тем, что все упирается в частоты, будущее наверное за архитектурой параллельного включения процессоров, возможно даже в одну широкую шину.
Вс янв 15, 2017 13:17:33
В поисках стабильности и защиты от сбоев, коду 00
Вс янв 15, 2017 14:18:22
"школьный процессор" - говорю же, что со школы начал делать наброски.pyzhman писал(а):Чем 00 отличается от АА, от 45 или, скажем, от E6. Да, прямо скажем, ничем. Другое дело, как уже было указано, - дешифровка КОП. Отсюда и надо было скакать в своё время. И помнить о дуализме. А эмуляторы писать - пусть пишут другие под ваш …
Вс янв 15, 2017 17:18:08
Вс янв 15, 2017 20:14:53
Зpя вы так…pyzhman писал(а):Боюсь напомнить про исключения.
Представляемая концепция процессорного устройства базируется на переработанной
системе команд процессора i8080 с полной утратой совместимости уровня машинных
команд и с частично достигнутой совместимостью с ассемблером процессора i8086.
----------
Таблица системы команд процессора была расчитана под интуитивное восприятие на
принципе ассоциативных предпосылок субъективного уровня с учитыванием реальной
возможной частоты использования различных инструкций в построениях алгоритмов.
Некоторые из инструкций, в силу морального устаревания и потерей актуальности,
были изначально исключены или получили более комплексный код редкой комбинации
обычных команд, чтобы не засорять таблицу и сохранять перспективу наращивания.
Регистр статуса процессора был переорганизован и флажки АЛУ получили частичную
связь на дешифратор команд с возможностью управлять периодом выполнения команд
для явного объявления условно реактивных и ленивых участков программного кода.
----------
Инструкции: Система команд процессора
===================
Дешифратор команд имеет 18 разрядов, имеющий условно разделённо-группированных
восемь проименованных шин и каждая из них имеет своё назначение для дешифрации
всех поддерживаемых архитектурой инструкций с перспективой явного наращивания.
Всего набор команд представляется таблицей команд с восемью слоями и имеющих в
своей структуре до восьми подслоёв, половина из которых доступна лишь основной
программе высшего уровня привелегий, выполняющей роль ядра операционной среды.
В состав процессора входит сверхоперативный контекстный файл с ёмкостью до 128
страниц, каждая из которых вмещает по 256 слов и обеспечивает сохранность всех
значений регистров общего назначения независимо для каждой страницы контекста.
Страница контекста имеет до 160 слов хранения операций реактивного исполнений,
вызываемых трюковым способом из любого места программы и требующих как минимум
от 1 такта на своё выполнение, позволяющих организовывать комплексные команды.
----------
Флаги: Регистр состояния процессора/АЛУ
=====================
Регистр состояния FX является старшим AH в AX, разделён на два ниббла FH и FL.
Старшим нибблом хранится индекс опционального регистра/указателя или итерации.
Младшим нибблом отражается комбинация режима дешифратора инструкций с флажками
результата действий команд АЛУ. Правилами постулатов исполнения вычислительных
операций исключаются вариации нуля нечётного паритета или отрицательного нуля.
Ноль нечётного паритета запрещает регистрирование результата выполнения потока
дешифрируемых инструкций на период с декрементацией опционального регистра или
итерации в старшем ниббле, позволяя опционально пропускать цепочку инструкций.
Отрицательный ноль приостанавливает считывание следующих инструкций, организуя
цикл на период с полной или условной декрементацией опционального регистра или
итерации в старшем ниббле, позволяя опционально ставить цикл и режим ожидания.
Через режим условного ожидания организуется возможность доступа к интерфейсным
устройствам ввода/вывода или внешней шине состояния сигналов событий ресурсов,
чтобы описывать алгоритмы своевременной обработки всех допускаемых прерываний.
----------
Обработка программных и аппаратных прерываний
=========
Архитектурой процессора не предусматривается возможность оперативной реакции в
режиме реального времени на любые внешние сигналы от периферии с генерацией по
их запросам определённых прерываний на обращение к соответствующим процедурам.
После включения ядра процессора и аппаратного сброса, управление передаётся на
нулевой контекст программы по вектору 0xFF00 с возможностью прямого доступа ко
всем ресурсам среды системы, всем контекстным файлам и к регистрам управления.
В обязанности кода основного процесса входит необходимость настройки периферии
и соответствующего реагирования на любые внешние сигналы с её стороны, а также
организации поддержки интерфейса с другим прикладным программным обеспечением.
Процесс ядра системы не имеет возможность непосредственного опроса внешних шин
и считывания их состояния без организации исполнения кода прикладного уровня с
поддержанием его нормального исполнения и надлежащего предоставления ресурсов.
----------
Доступ к внешним устройствам и регистрам контекстного файла
=======================
Системой команд не предусматриваются непосредственные команды доступа к портам
ввода/вывода для взаимодействия с устройствами периферии или доступа к ячейкам
контекстного файла и управляющим регистрам представления контекстной проекции.
Подобные операции находятся за пределами области задач прикладного уровня и не
засоряют таблицу команд как специализированные инструкции, используемые крайне
редко в зонах временной необходимости сервисных процедур операционной системы.
Процессором имеется достаточное количество префиксов для организации трюкового
достижения необходимых системных ресурсов в рамках кода операционной системы и
ограниченного контролируемого прикладного трюкового доступа к нужным ресурсам.
В момент попытки доступа приложения к порту ввода/вывода, исполнение программы
временно приостанавливается и управление передаётся ядру системы с загрузкой в
историю регистра-приёмника индекса порта, байта данных и режимом доступа в CF.
----------
Регистр селектора контекста (CS - Context Switch Register)
======================
Для непосредственного доступа к контексту любой имеющейся прикладной задачи на
уровне системного процесса доступен регистр CS, служащего переключателем задач
в системной среде и управляющего привелегиями для текущего активного процесса.
Базовая реализация процессора поддерживает от трёх независимых контекстов, под
которыми может выполняться непосредственно код системного ядра, код диспетчера
системных ресурсов с аппаратным интерфейсом и другой код прикладной программы.
Контекст ядра всегда имеет индекс с базой 0, диспетчерам ресурсов определяются
контексты с индексами от 127 до 100 в сторону уменьшения номера, тогда как все
приложения индексируются контекстами от 1 до 99 в сторону возрастания номеров.
_____
00000000 0 :База(0) - Системный код с высоким уровнем привелегий.
0XXXXXXX 1-99 :База(1) - Прикладной код с низким уровнем привелегий.
011XXXXX 100-127:База(127)-Средний уровень диспетчера системных ресурсов.
1XXXXXXX 128-255:Зеркала контекста №0 под высоким системным уровнем привелегий
----------
Счётчик выдержки исполнения прикладного кода (TX - Ticks Counter: TL & TH)
=====================
Старший бит регистра CS управляет блокировкой прохождения тактов к регистру TX
и на уровне приложений ведётся обратный отсчёт, окончание которого установит в
CS бит блокировки счёта с переключением контекста в высокий системный уровень.
Если при переключении с ядра к приложению счётчик TX был обнулён, ни один байт
прикладного кода не будет выполнен и управление получит вновь ядро с возвратом
кода состояния внешней периферийной шины через аккумклятор и флаг переноса CF.
Если в момент переключения на контекст приложения счётчик TX готов отсчитать 1
такт, будет выполнена одна единственная операция приложения и управление снова
получит ядро, что позволяет организовывать пошаговый режим отладчика программ.
..::: Context File Layout ::::::::::::::::::::::::::::::::::::::::::::::::::::
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
00:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 0:Up to 7 opcodes
10:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 1:---"---
20:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 2:---"---
30:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 3:---"---
40:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 4:---"---
50:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 5:---"---
60:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 6:---"---
70:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 7:---"---
80:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 8:---"---
90:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --|INT 9:---"---
A0:AL>>LO>>Стек истории --|AH>>HI>> ++ .. -- -- --|AX-Stack
B0:BL>>LO>>модификации- --|BH>>HI>> ++ .. -- -- --|BX-Stack
C0:CL>>LO>>всех РОН- -- --|CH>>HI>> ++ .. -- -- --|CX-Stack
D0:DL>>LO>> ++ .. -- -- --|DH>>HI>> ++ .. -- -- --|DX-Stack
E0:SP>LO/BP>LO/SI>LO/DI>LO|SP>HI/BP>HI/SI>HI/DI>HI|SP/BP/SI/DI-Stack
F0:IP>>LO>> ++/.. ../JP.LO|IP>>HI>> ++/.. ../JP.HI|IP/JP
+0:CS -- -- -- -- -- TL.TH |Control Registers
----------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Примерная трюковая цепочка ;;; Макрос псевдонима мнемоники с описанием ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MOV [0],DL ;;; Запись индекса проекции контекста
HLT DL ; Указываем регистр источника индекса
WAIT ; Приступаем к ожиданию системной операции
HLT ; Инструкция работает лишь в проекции системы
;;;;;;; MOV DL,[0] ;;; Чтение индекса проекции контекста
HLT ; Выбираем индекс считываемого регистра
WAIT ; Приступаем к ожиданию системной операции
HLT DL ; Считываем в регистр индекс проекции
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MOV DL,[DL] ;;; Читаем байт файла контекста
HLT DL ; Указываем принимающий регистр
WAIT ; Готовимся читать данные
HLT DL ; В регистр DL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MOV [DL],AL ;;; Пишем байт в файл контекста
HLT DL ; Указываем регистр выбора ячейки
WAIT ; Готовимся писать данные
HLT AL ; в ячейку DL из регистра AL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MOV DL,[1] ;;; Читаем байт регистра контроля
HLT 1 ; Указываем индекс считываемого регистра
WAIT ; Готовимся читать данные
HLT DL ; Указываем принимающий регистр
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MOV [1],DL ;;; Пишем байт в регистр контроля
HLT DL ; в ячейку из регистра DL
WAIT ; Готовимся писать данные
HLT 1 ; Указываем регистр контроля
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; IN DH ;;; Читаем данные с порта
HLT 1 ; Вибираем индекс регистра BH с индексом порта
WAIT ; Готовимся читать данные
HLT 1 ; В регистр BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; OUT [DH],CH ;;; Пишем данные в порт
HLT 1 ; Выбираем регистр BH с записуемым байтом
WAIT ; Готовимся писать данные
HLT 2 ; в порт CH из регистра BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Примерный набросок кода запуска управляющего ядра операционной системы ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0xFEFB ; Следующий макрос занимает 5 байтов
KERNEL: ;;;;;;;;;;;;;;;;;;;;;;;;; Переключатель контекста на прикладной код
.yield: MOV [0],AL ; Макрос переключения контекста регистром CR0
;HLT AL ; Регистр AL указывает контекст/принимает код
;WAIT ; JMP $ - Переход в условный цикл
;HLT 0 ; HLT - Привелегированная операция для CR[0]
;;;;;;;;;;;;;;;;;;;;;;;;;
; Здесь располагается селектор с пропуском до 7 инструкций и передачей
; управления соответствующей ситуации процедуре
.body: ;;;;;;;;;;;;;;;;;;;;;;;;; Тело обработчика прерываний - адрес : FF00h
JMP .overhead ; Запрос к стандартному API
JMP .acclaim ; Обращение к программным прерываниям INT 0-79
JMP .buffer ; Буферная зона - прослойка диспетчера памяти
JMP .context ; Диспетчер переключения контекстов процессов
JMP .device ; Запрос ко внешнему устройству ввода/вывода
JMP .error ; Обработчик программных/аппаратных ошибок
JMP .force ; Внешние форсированные события/прерывания
JMP .garret ; Загрузочная область поверхностного уровня
.context: ;;;;;;;;;;;;;;;;; Тело диспетчера контекста
XOR AL,AL ; Подготавливаем регистр к чтению регистра CR
HLT AL ; Определяем его как приёмник
WAIT ; Переход в условный цикл
HLT 7 ; Считываем содержимое CR[7] в AL
;;; ;;; ;;; ; Оперативные действия с контекстом
MOV AL,0x01 ; Выставляем индекс выбираемого контекста
CMP AL,AL ; Сброс флага переноса CF
CMC ; Устанавливаем флаг, если требуется протокол
JMP .yield ;
.device: ;;;;;;;;;;;;;;;;; Тело диспетчера периферии
ORG 0xFEFB
BIOS:
.app: ; Передача управления приложению
MOV [0],AL ; Выбор контекста - операция занимает 5 байтов
; Стартовый адрес процессора 0FF00h
; После сброса процессора включается режим SKIP 7 - пропустить 7 JMP'ов
; Прерванное приложение возвращает управление с режимом SKIP 1-6:
JMP .overhead ; No Skip:Запрос к стандартному API
JMP .acclaim ; SKIP 1: Обращение к программным прерываниям INT 0-79
JMP .buffer ; SKIP 2: Буферная зона - прослойка диспетчера памяти
JMP .context ; SKIP 3: Диспетчер переключения контекста процессов
JMP .device ; SKIP 4: Запрос ко внешнему устройству ввода/вывода
JMP .error ; SKIP 5: Обработчик программных/аппаратных ошибок
JMP .force ; SKIP 6: Внешние форсированные события/прерывания
.garret: ; Здесь начало работы BIOS при старте
; Иницируется стек, регистровые файлы приложений,
... ; настраивается периферия
MOV [6],CL ; Системные регистры №6 и №7 - соответственно младший байт
MOV [7],CH ; и старший счётчика тактов, обратный отсчёт которого ведётся
; в контексте прикладной задачи. Его обнуление - генерирует
; запрос к диспетчеру контекстов (см. SKIP 3 выше с JMP .context)
JMP BIOS.app ; Передадим управление конкретной прикладной задаче
;;;;;;;;;
.acclaim: ; Здесь расположен код обработки программного прерывания INT 0-79,
; предоставляющий доступ к базовому API
;;;;;;;;;
.buffer: ; Здесь расположение кода менеджера памяти
;;;;;;;;;
.context: ; Менеджер переключения контекста получает управление после истечения
; работы конкретной задачи или её пошаговой отладки
;;;;;;;;;
.device: ; Симулятор внешних устройств получает управление когда конкретное
; устройство системы запрашивается приложением. Нечто похожее
; на HAL/HEL-прослойку Windows.
;;;;;;;;;
.error: ; Здесь расположен код обработки аппаратных и программных ошибок,
; исключений и ситуаций, которые не были предусмотрены
;;;;;;;;;
.force: ; Наконец, тут находится код для обработки разных внешних сигналов,
; форсирующих выполнение системных функций.
; Например, нажатие клавиши клавиатуры и нажатие кнопки сброса -
; - прежде всего форсирующее событие, а потом уже - прерывание.
; Таймер реального времени, сигнал нестабильности источника питания,
; подключение USB-устройства - тоже форсаж, а не прерывание.
; Короче, весь маловажный "хлам" - здесь
44 00:HLT AL
B8 FE:WAIT (JMP $)
00 :HLT
Чт янв 26, 2017 22:43:53
Регистры Общего Назначения (РОН)
==============
Каждой исполняемой задаче доступен собственный независимый набор регистров, из
которых можно выделить несколько особенных, имеющих механизмы контроля ошибок,
автоматического инкремента/декремента и организации ленивых вычислений/циклов.
Так, регистры BH:BL / CH:CL / DH:DL составляют набор регистровых пар BX/CX/DX,
позволяющих организовывать косвенную и индексную адресацию для доступа к любой
из всех ячеек предоставляемой операционной средой памяти в оперативном режиме.
Несколько иначе организован регистр аккумулятора AL, имеющий условную половину
AH(FX) косвенно-условной доступности, позволяющего обеспечивать условные петли
и безусловные циклы, а также и опциональные линейные селекторы или вычисления.
+----------+ +----------+ +----------+ +----------+
| AX | | BX | | CX | | DX |
+---------+------+ +--------+--------+ +--------+--------+ +--------+--------+
| AH(FX) | AL | | BH | BL | | CH | CL | | DH | DL |
+----+----+------+ +--------+--------+ +--------+--------+ +--------+--------+
| FH | FL |
| == | == \__________
|0:--|0000: ------- \_____
|1:BH|0001:-- -- ZF # Zeroed result |
|2:CH|0010:-- CF -- # Carry Flag |
|3:DH|0011:-- CF ZF # Zero with Carry |
|4:AL|0100:PF -- -- # Odd Parity Flag |
|5:BL|0101:{SKIP FH}# Skip mode (register counter / x1..x7 times) |
|6:CL|0110:PF CF -- # Odd Parity with Carry |
|7:DL|0111:{SKIP FH}# Skip mode (register counter / x1..x7 times) |
|8:--|1000:SF -- -- # Signed result |
|9:x1|1001:{LOOP FH}# Loop mode (register counter / x1..x7 times) |
|A:x2|1010:SF CF -- # Signed result with Carry |
|B:x3|1011:{LOOP FH}# Loop mode (register counter / x1..x7 times) |
|C:..|1100:SF PF -- # Signed result with odd Parity |
|D:BX|1101:{ ----- }# |
|E:CX|1110:SF PF CF # Signed result with odd Parity and Carry |
|F:DX|1111:{WAIT FH}# Wait mode (register counter / x1..x7 times) |
+----+----------
_____
Регистровые указатели
===
Указатель инструкций IP имеет опциональный указатель JP, у стековых указателей
SP и BP младший бит имеет опциональное назначение для отслеживания критических
ситуаций или управления автоматическим инкрементом/декрементом значений SI/DI.
+----------+ +----------+-+ +----------+-+ +----------+
|______ IP ______| | SP /EF| | BP /FF| |_____ SI/DI _____|
| \__/ | | +-----+ / | | +-----+ / | | \++|--/ |
| JP | | /Error-Flag| | /Fault-Flag| |Auto-Inc|Auto-Dec|
+----------+ | / /increment| +-----+----------+ +----------+
+----+----------+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Примеры инструкций с расширением их возможностей опциональными битами ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AL,[DI+1] ; Считывает данные с базовым смещением,
; работает во всех стандартных режимах (EF==0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AL,[DI+1] ; Считывает данные без смещения, но производит
; пост-инкремент указателя, лишь когда (EF==1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Примеры трюковых цепочек для выполнения вычислений с проверкой ускорения ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; MUL AL,CH,CL ; Умножение с суммированием: AL+=CH*CL
HLT CL ; Указываем регистр множителя CL
WAIT ; Готовимся к вычислению
ADD AL,CH ; Приближаемся к результату через множимое CH
AND CL,CL ; Проверка участия регистра множителя в цикле
JZ .software ; Если он обнулён - аппаратной поддержки нет
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; DIV AL,CH,CL ; Деление: CL=255 :: CL-=AL/CH
HLT CL ; Указываем регистр дополненного частного CL
WAIT ; Готовимся к вычислению
SUB AL,CH ; Приближаемся к результату через делитель CH
JC .software ; Если признак CF - аппаратной поддержки нет
Сб янв 28, 2017 08:24:55
Сб янв 28, 2017 10:30:06
Сб янв 28, 2017 10:44:38
LastHopeMan писал(а):Многозадачность на физическом уровне в разы лучше.
Сб янв 28, 2017 12:12:40
Хoчу подчеркнуть, что собственную задумку двигаю в духе ещё прошлой эпохи. Будучи школьником, прочитал, что Z80 имеет двойной набор регистров для быстрого переключения во время прерывания. Тем самым, как бы псевдо-мультизадачностьКРАМ писал(а):Я бы еще раз предложил Вам ознакомиться с современными архитектурами ядер.
Прямой доступ в память уже давно делается внутрицикловым, то есть для транзакций используются те такты цикла, где нет обращения к шине данных/адреса, и/или для DMA использована отдельная шина.
Многозадачность при единственном ядре (псевдомногозадачность) в состоянии разделять ресурсы программными методами, что и реализовано в любой ОСРВ. Аппаратное жесткое разделение - совершенно беспонтовая вещь, патамушта в реальных задачах ресурсы используют ОДНОВРЕМЕННО несколько задач (поскольку этого требует алгоритм) и передача ресурса/данных из одной задачи в другую станет дополнительной тратой времени и самих этих ресурсов.
+----------=> _M[18:16]: Marker
| +----------=> _L[ 15 ]: Linker (1:FH == _Z / Number == -2)
| | +----------=> _K[14:12]: Keeper (1XX:Wait; X1X:Loop; XX1:Eval)
| | | +----------=> _J[ 11 ]: Judge (0:Application; 1:Supervisor)
| | | | +----------=> _Z[10:8 ]: Prefix
| | | | | +---------=> _I[ 7 ]: Intact
| | | | | | +-------=> _Y[ 6:4 ]: Translator / Group
| | | | | | | +-----=> _H[ 3 ]: High bit
| | | | | | | | +---=> _X[ 2:0 ]: Receiver / Sub-code
| | | | | | | | |
/|\|/|\|/|\|/|\|/|\
MMMLKKKJZZZIYYYHXXX
│││││││││││││││││││ ┌───┐
│││││▐┼┼┼┼┼┼┼┼┼┼┼┼┼────O & │
││││││▐┼┼┼┼┼┼┼┼┼┼┼┼────O │
│││││││││││▐┼┼┼┼┼┼┼────┤ │
││││││││││││▐┼┼┼┼┼┼────┤ │
│││││││││││││▐┼┼┼┼┼────┤ O────> XXXX00XXXX11101110|XCHG P$Z,[SP]:$1=P$Z(),P$Z(DW(SP())),DW(SP(),$1)//Exchange pair P$Z! with stack heap
││││││││││││││▐┼┼┼┼────O │
│││││││││││││││▐┼┼┼────┤ │
││││││││││││││││▐┼┼────┤ │
│││││││││││││││││▐┼────┤ │
││││││││││││││││││▐────O │
│││││││││││││││││││ └───┘
│││││││││││││││││││ ┌───┐
│││││▐┼┼┼┼┼┼┼┼┼┼┼┼┼────O & │
││││││▐┼┼┼┼┼┼┼┼┼┼┼┼────O │
│││││││││││▐┼┼┼┼┼┼┼────┤ │
││││││││││││▐┼┼┼┼┼┼────O │
│││││││││││││▐┼┼┼┼┼────┤ O────> XXXX00XXXX10100XXX|MOV R$X,[P$Z+IB]:R$X(DB(P$Z()+$C))//Move memory data by P$Z pointer into R$X
││││││││││││││▐┼┼┼┼────O │
│││││││││││││││▐┼┼┼────O │
│││││││││││││││││││ └───┘
│││││││││││││││││││ ┌───┐
│││││▐┼┼┼┼┼┼┼┼┼┼┼┼┼────O & │
││││││▐┼┼┼┼┼┼┼┼┼┼┼┼────O │
│││││││▐┼┼┼┼┼┼┼┼┼┼┼────O │
│││││││││││▐┼┼┼┼┼┼┼────┤ │
││││││││││││▐┼┼┼┼┼┼────O │
│││││││││││││▐┼┼┼┼┼────┤ O────> XXXX000XXX10111XXX|JCND$X $+$UIB:CND$X?IP(IP()+$A):0//Branching if CND$X!
││││││││││││││▐┼┼┼┼────┤ │
│││││││││││││││▐┼┼┼────┤ │
│││││││││││││││││││ └───┘
Можно расширить шину инверсией, чтобы упростить вентиля (К155ЛА2 - 8 входов, но есть же и ЛА19 на 12 входов), число которых равно числу всех команд - около 60:
│││││││││││││││││││ │││││││││││││││││││ ┌───┐
│││││▐┼┼┼┼┼┼┼┼┼┼┼┼┼─┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼────┤ & │
││││││▐┼┼┼┼┼┼┼┼┼┼┼┼─┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼────┤ │
│││││││▐┼┼┼┼┼┼┼┼┼┼┼─┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼────┤ │
│││││││││││││││││││ │││││││││││▐┼┼┼┼┼┼┼────┤ │
││││││││││││▐┼┼┼┼┼┼─┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼────┤ │
│││││││││││││││││││ │││││││││││││▐┼┼┼┼┼────┤ O────> XXXX000XXX10111XXX|JCND$X $+$UIB:CND$X?IP(IP()+$A):0//Branching if CND$X!
│││││││││││││││││││ ││││││││││││││▐┼┼┼┼────┤ │
│││││││││││││││││││ │││││││││││││││▐┼┼┼────┤ │
│││││││││││││││││││ │││││││││││││││││││ └───┘
Сб янв 28, 2017 13:38:47
КРАМ писал(а):Во первых, смена контекста современными архитектурами так же поддерживается на аппаратном уровне, а получить что то более рациональное гораздо проще увеличением ядер. Тем более, что ядра не слишком увеличивают площадь кристалла. ОЗУ, флеш и шины занимают больше места.
Сб янв 28, 2017 16:21:40
Сб янв 28, 2017 16:35:02
Знaчит, к сожалению, ввёл всех в заблуждение я…КРАМ писал(а):Причем тут ПК?
Насколько я понял, автор рассматривает RISC-архитектуру....