Минималистическая архитектура 16-битного процессора. Ревизия 2

Формат команды и порядок флагов не изменены. Всё, что в исходном описании было не определено, определено ниже. Изменения и добавления собраны в разделе 11.

1. Общие положения

Специальные регистры

Регистр Имя Назначение
R12 LR регистр связи (пишется командой CALL)
R13 SP указатель стека, растёт вниз
R14 IP указатель команд
R15 FLAGS регистр флагов

Аппаратно особыми являются только IP (автоматическая выборка), FLAGS (флаги АЛУ, прерывания) и SP/LR/IP в ограничениях разд. 6 и командах CALL/TRAP/IRET. Остальное обычные регистры.

2. Флаги

ZF, CF, SF, OF: стандартные флаги арифметики. IF: разрешение прерываний (0 запрещены, 1 разрешены).

  0    1    2    3    4    5   6   7   8   9  10  11  12  13  14  15
| ZF | CF | SF | OF | IF | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

Правила установки флагов

Команды ZF SF CF OF
ADD, ADC результат=0 бит 15 результата перенос из бита 15 знаковое переполнение
SUB, SBC, CMP результат=0 бит 15 результата заём: 1, если беззнаково A < B (с учётом входного CF у SBC) знаковое переполнение
NEG результат=0 бит 15 1, если R1≠0 (заём) 1, если R1=$8000
AND, OR, XOR, TEST результат=0 бит 15 0 0
SHL, SHR, SAR, ROR (счётчик ≠ 0) результат=0 бит 15 последний выдвинутый бит (у ROR бит 15 результата) 0
SHL, SHR, SAR, ROR (счётчик = 0) не меняются не меняются не меняются не меняются

ADC: A+B+CF. SBC: A−B−CF. Для многословных операций цепочка ADD/ADC и SUB/SBC работает без инверсии CF.

Флаги не меняют: LD, LDSX, LDZX, ST, STB, XCHB, NOT, BSX, Jxx, CALL, WFI. TRAP сбрасывает IF, IRET загружает флаги со стека.

3. Формат команды

Слово команды (старший бит слева):

 15      11 10    7 6     3 2     0
| OPCODE:5 | R1:4  | R2:4  | R2MOD:3 |

Если команде нужно слово disp, оно следует сразу за командным словом. Длина команды:

2 слова, если R2MOD ∈ {5, 6, 7} или (R2MOD = 3 и R2 = IP); иначе 1 слово.

Это правило применяется только к командам, использующим операнд R2/MOD. Для NEG, NOT, BSX, IRET, WFI поля R2 и R2MOD игнорируются полностью: команда всегда однословная, ошибок нет (рекомендуется кодировать нули).

Допустимость команды и её длина определяются только по первому слову.

Режимы R2MOD

MOD Запись Значение операнда
0 reg значение регистра R2
1 #imm4 поле R2 как беззнаковая константа 0..15 (R2 не регистр)
2 [reg] слово (байт) по адресу R2
3 [reg++] то же, затем R2 += шаг. При R2=IP: слово после команды, IP += 2 (непосредственная константа)
4 [--reg] R2 −= шаг, затем обращение по R2
5 [disp] слово (байт) по абсолютному адресу disp; поле R2 игнорируется
6 [reg+disp] слово (байт) по адресу R2+disp
7 reg+disp сама сумма R2+disp (без обращения к памяти)

4. Порядок выполнения команды (микропрограмма)

  1. Выбрать командное слово, IP += 2.
  2. Проверить допустимость (разд. 6). Недопустимо: ERRCMD, никаких побочных эффектов (разд. 8).
  3. Если команда двухсловная, выбрать второе слово, IP += 2. С этого момента IP равен адресу следующей команды, и именно это значение видит любая команда, читающая IP (в том числе R2=IP в MOD=6, 7 и операнд IP в ALU, ST, PUSH).
  4. Считать значение R1, если команда его использует. Источник R1 фиксируется до любых модификаций R2.
  5. Вычислить операнд по MOD. Автоинкремент или автодекремент R2 происходит здесь.
  6. Обращение к памяти (чтение, запись или атомарный обмен).
  7. Выполнить операцию, записать результат в R1, обновить флаги.

Следствия:

5. Таблица опкодов

Опкод находится в старших 5 битах слова. Декодер микропрограммный, свойства команды (байтовая, пишет R1, читает память, допустимые MOD) берутся из ПЗУ по 5-битному опкоду.

Код Мнемоника Код Мнемоника
00000 LD 10000 CMP
00001 LDZX 10001 TEST
00010 LDSX 10010 SHL
00011 XCHB 10011 SHR
00100 ST 10100 SAR
00101 STB 10101 ROR
00110 резерв 10110 NEG
00111 резерв 10111 NOT
01000 ADD 11000 BSX
01001 ADC 11001 Jxx
01010 SUB 11010 CALL
01011 SBC 11011 TRAP
01100 AND 11100 IRET
01101 OR 11101 WFI
01110 XOR 11110 резерв
01111 резерв 11111 резерв

Резервные опкоды вызывают ERRCMD.

6. Допустимые режимы (сводка)

6.1. Допустимые MOD по группам

Группа Опкоды Допустимые MOD
Чтение слова / значение LD, ADD, ADC, SUB, SBC, AND, OR, XOR, CMP, TEST, SHL, SHR, SAR, ROR 0..7
Байтовая загрузка LDZX, LDSX 0..6 (MOD=7 запрещён)
Запись, обмен ST, STB, XCHB 2..6
Передача управления Jxx, CALL, TRAP 0, 1, 2, 3 (только R2=IP), 5, 6, 7
Без операнда NEG, NOT, BSX, IRET, WFI любые (игнорируются)

6.2. Дополнительные запреты (для всех команд с операндом)

Нарушение любого пункта вызывает ERRCMD.

  1. R2=R15 при MOD ∈ {2, 3, 4, 6, 7}. (При MOD=0 R15 читается как значение, при MOD=1 и 5 поле R2 не регистр.)
  2. R2=IP при MOD=4.
  3. R2=IP при MOD=3 допустим только в группах «чтение слова» и «передача управления» (непосредственная константа). Для байтовых загрузок, ST, STB, XCHB запрещён.
  4. R2=IP при MOD=2 запрещён для ST, STB, XCHB.
  5. Байтовые команды (LDZX, LDSX, STB, XCHB): MOD=3 или 4 при R2=SP или R2=IP.
  6. Jxx с кодом условия 1111.

Смысл MOD для байтовых загрузок: MOD=0 берёт младший байт регистра R2 и расширяет (LDZX R1,R2 это R1=R2&$FF, LDSX R1,R2 то же что BSX с копированием), MOD=1 расширяет константу, остальные читают байт из памяти.

7. Описание команд

7.1. Загрузка, выгрузка, обмен

Запись байта и XCHB на 16-битной шине требуют разрешения отдельных байтов либо чтения-модификации-записи.

7.2. Арифметика и логика

7.3. Передача управления

Целью является значение операнда, то есть Jxx, CALL это загрузка IP с условием или с сохранением LR:

MOD Цель перехода
0 значение регистра R2
1 короткое знаковое смещение: IP + 2·sext4(R2), диапазон −8..+7 слов, IP это адрес следующей (однословной) команды
2 слово по адресу R2
3 (R2=IP) слово после команды (абсолютный адрес)
5 слово по адресу disp
6 слово по адресу R2+disp
7 R2+disp. При R2=IP: адрес относительно следующей команды

Коды условий Jxx (R1)

Код Мнемоника Условие
0000 JMP безусловно
0001 JZ / JE ZF=1
0010 JNZ / JNE ZF=0
0011 JC / JB CF=1 (ниже, беззнак.)
0100 JNC / JAE CF=0
0101 JA CF=0 и ZF=0
0110 JBE CF=1 или ZF=1
0111 JS SF=1
1000 JNS SF=0
1001 JO OF=1
1010 JNO OF=0
1011 JL SF≠OF
1100 JGE SF=OF
1101 JG ZF=0 и SF=OF
1110 JLE ZF=1 или SF≠OF
1111 — резерв, ERRCMD

8. Прерывания и исключения

8.1. Векторы

Таблица векторов находится по адресу $FF00..$FF1F: 16 слов, вектор n по адресу $FF00 + 2n, значение адрес обработчика.

Вектор Назначение
0..7 внешние запросы IRQ0..IRQ7
8 ERRCMD (недопустимая команда)
9..15 не назначены аппаратно, свободны для программных вызовов TRAP

(TRAP может вызывать и векторы 0..8.)

8.2. Внешние прерывания

8.3. Единая последовательность входа (IRQ, TRAP, ERRCMD)

  1. SP −= 2; [SP] = IP (сохраняемый).
  2. SP −= 2; [SP] = FLAGS (значение до изменения).
  3. FLAGS.IF = 0 (остальные флаги не меняются).
  4. IP = [$FF00 + 2·n].

Выход IRET: POP FLAGS (с вершины), POP IP. Порядок на стеке совпадает с TRAP.

LR, регистры и остальные флаги прерыванием не сохраняются: обработчик обязан сохранить всё, что использует, включая LR.

8.4. ERRCMD (вектор 8)

9. Сброс

10. Псевдокоманды и типовые приёмы

Запись Эквивалент
MOV Rd, Rs LD Rd, Rs
MOV Rd, #imm LD Rd, [IP++] (двухсловная)
LEA Rd, Rs+disp LD Rd, Rs+disp (MOD=7)
NOP LD R0, R0
RET LD IP, LR
PUSH R ST [--SP], R
POP R LD R, [SP++]
JMP addr Jxx 0000, адрес (MOD=3 при R2=IP)
Короткий переход Jxx cond, #off (MOD=1, ±8 слов)
Относительный переход Jxx cond, IP+disp (MOD=7, R2=IP)
STI / CLI OR R15, #$0010 / AND R15, #$FFEF
LDZX/LDSX Rd, Rs расширение младшего байта регистра (MOD=0)

11. Что изменено и добавлено относительно исходного описания

Не менялись: формат слова команды, порядок флагов, регистры, режимы MOD 0..7, набор исходных опкодов, механика прерываний и сброса.

Уточнения

Изменения поведения (проверьте)

Дополнения