STM8 - STM8
STM8 представляет собой 8-разрядный микроконтроллер семейства от STMicroelectronics . В микроконтроллерах STM8 используется расширенный вариант архитектуры микроконтроллеров ST7 . Микроконтроллеры STM8 особенно дешевы для полнофункционального 8-битного микроконтроллера.
Архитектура
STM8 очень похож на более ранний ST7, но лучше подходит в качестве цели для C из-за его 16-битных индексных регистров и режима адресации, связанного с указателем стека . Хотя внутренне в архитектуре Гарварда он имеет единую 24-битное адресное пространство, что позволяет код для выполнения из оперативной памяти (полезно для внутрисистемного программирования на флэш - ПЗУ ), и данные (например, таблиц поиска ) , чтобы получить доступ из ПЗУ. Доступ к данным выше 64 КБ ограничен специальными инструкциями «загрузить дальше»; операнды памяти большинства операций могут обращаться максимум к 128 КБ (16-битный базовый адрес плюс 16-битное смещение).
Очень немногие микроконтроллеры STM8 имеют более 64 КБ памяти данных.
Он имеет те же шесть регистров (A, X, Y, SP, PC, CC), что и ST7, но индексные регистры X и Y были расширены до 16 бит, а счетчик программ увеличен до 24 бит. Аккумулятор А и указатель стека остаются 8 и 16 бит, соответственно.
Регистр кода условия имеет два более определенных битов, в общей сложности семь. Имеется флаг переполнения и второй бит разрешения прерывания , позволяющий использовать четыре уровня приоритета прерывания .
Подсемейства
- Автомобиль СТМ8АФ
- СТМ8АЛ автомобильный маломощный
- STM8L маломощный
- STM8S по выгодной цене
- STM8T с сенсорным управлением
- Управление освещением STLUX
- STNRG широтно-импульсная модуляция -controllers
Поддержка компилятора
STM8 поддерживается бесплатным компилятором Small Device C Compiler , бесплатным компилятором Cosmic C с закрытым исходным кодом и несвободными компиляторами IAR C и Raisonance. Помимо C существует STM8 eForth, порт языка программирования Forth с открытым исходным кодом.
Изменения по сравнению с ST7
Набор инструкций STM8 в основном является надмножеством ST7, но не полностью совместим с двоичными кодами.
Операции с регистрами X и Y расширены до 16 бит. Таким образом, загрузка и сохранение обращаются к двум байтам памяти, а не к одному. (Кроме того, флаг полупереноса был изменен, чтобы отразить перенос с бита 7 на бит 8 16-битного результата, а не перенос с бита 3 на 4.)
Прерывания передают девять байтов состояния вместо пяти на ST7.
Команда умножения сохраняет 16-битное произведение в указанном индексном регистре (например, X), а не делит его между X и A.
Косвенные способы адресации , которые извлекающие 8-битный адрес из памяти (опкоды 92 2x
, 92 3x
, 92 Bx
, 92 6x
, 92 Ex
, 91 6x
, и 91 Ex
), были удалены; все режимы косвенной адресации выбирают 16-битные адреса. Был 72
добавлен новый байт префикса , который используется для косвенного кодирования, начиная с 16-битного адреса.
Инструкции по манипулированию битами были изменены, чтобы принимать 16-битный адрес и требовать 72
байта префикса. Коды операций без префикса 0x
и 1x
ранее занятые коды вместо этого используются для относительной адресации указателя стека.
Коды некоторых редко используемых инструкций ветвления были изменены, чтобы требовать 90
префикса, а коды операций без префикса переназначены для подписанных ветвей, которые зависят от флага V.
Инструкции загрузки и сравнения, нацеленные на регистр X, мало используются на ST7 с режимами адресации, индексируемыми регистром X. В STM8, когда такие операции определяют операнд памяти, индексированный регистром X, операнд регистра изменяется на Y. С 90
префиксом регистры меняются местами, так что регистр индекса равен Y, а регистр операнда - X.
Одно из основных различий в производительности заключается в том, что STM8 выбирает 32 бита из ПЗУ за цикл, а для типичных инструкций требуется один цикл плюс один цикл на каждый доступ к ОЗУ. ST7, напротив, выбирает 8 бит за цикл и берет один цикл на байт инструкции.
Набор инструкций
Инструкции STM8 состоят из необязательного префикса байт ( , , или ), в опкоде байт, и несколько (до четырех, но редко более чем два) байт из операндов. Байты префикса в основном изменяют режим адресации, используемый для указания операнда памяти, но в некоторых случаях префиксы и полностью выполняют другую операцию.
7216
9016
9116
9216
72
90
Префикс меняет 90
местами X и Y в следующей инструкции. В таблице ниже эти варианты объединены в одну строку путем записи «X / Y», что означает «X» или «Y». Префикс 90
также используется в двух местах для введения новых кодов операций: инструкции BCPL и BCCM и некоторые условия перехода.
Префикс 92
преобразует инструкции с операндом смещения ( addr16 , X) в косвенную адресацию ([ addr8 ], X). Смещение заменяется 8-битным адресом 16-битного значения смещения в памяти. Он используется только для этой функции.
Префикс 91
имеет оба предыдущих эффекта, преобразовывая ( addr16 , X) режимы адресации в ([ addr8 ], Y).
Префикс 72
используется в нескольких местах гораздо менее регулярным образом. В некоторых случаях он вводит новые режимы адресации (особенно ([ addr16 ], X) непрямой 16-битный режим), но также вводит много совершенно новых операций.
Приставка | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Операнды | Мнемонический | Описание |
---|---|---|---|---|---|---|---|---|---|---|---|
- | 0 | 0 | 0 | 0 | код операции | адрес 8 | OP ( адрес 8 , SP) | Инструкции с одним операндом (см. Ниже) | |||
- | 0 | 0 | 0 | 1 | код операции | адрес 8 | OP A, ( адрес 8 , SP) | Двухоперандные инструкции со стековым операндом | |||
- | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | адрес 8 | SUB A, ( адрес 8 , SP) | A: = A - операнд |
- | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | адрес 8 | CP A, ( адрес 8 , SP) | Сравнить A - операнд |
- | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | адрес 8 | SBC A, ( адрес 8 , SP) | A: = A - операнд - C вычесть с заимствованием |
- / 90 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | адрес 8 | CPW X / Y, ( адрес 8 , SP) | Сравнить X / Y - операнд (16 бит) |
- | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | адрес 8 | И А, ( адрес 8 , SP) | A: = A & операнд, побитовое и |
- | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | адрес 8 | BCP A, ( адрес 8 , SP) | Побитовый тест A и операнд |
- | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | адрес 8 | LDW Y, ( адрес 8 , SP) | Y: = операнд ( |
- | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | адрес 8 | LDW ( адрес 8 , SP), Y | Операнд: = Y ( |
- | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | адрес 8 | XOR A, ( адрес 8 , SP) | A: = A ^ операнд, исключающее ИЛИ |
- | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | адрес 8 | АЦП A, ( адрес 8 , SP) | A: = A + операнд + C, сложить с переносом |
- | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | адрес 8 | ИЛИ A, ( адрес 8 , SP) | A: = A | операнд, включительно или |
- | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | адрес 8 | ДОБАВИТЬ A, ( адрес8 , SP) | A: = A + операнд |
- | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | imm16 | ДОБАВИТЬ X, # imm16 | X: = X + немедленно (= |
- | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | imm16 | SUBW X, # imm16 | X: = X - немедленно (= |
- | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | адрес 8 | LDW X, ( адрес 8 , SP) | X: = операнд |
- | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | адрес 8 | LDW ( адрес 8 , SP), X | Операнд: = X |
72/90 | 0 | 0 | 0 | c | немного | v | операнды | Битовые операции | |||
72 | 0 | 0 | 0 | 0 | немного | 0 | адрес16 soff8 | BTJT addr16 , # бит , метка | Перейти к ПК + soff8, если исходный бит истинен (установлен) | ||
72 | 0 | 0 | 0 | 0 | немного | 1 | адрес16 soff8 | BTJF addr16 , # бит , метка | Перейти к ПК + soff8, если исходный бит ложный (очистить) | ||
72 | 0 | 0 | 0 | 1 | немного | 0 | адрес16 | BSET addr16 , # бит | Установить указанный бит в 1 | ||
72 | 0 | 0 | 0 | 1 | немного | 1 | адрес16 | BRES адрес16 , # бит | Сбросить (сбросить) указанный бит на 0 | ||
90 | 0 | 0 | 0 | 1 | немного | 0 | адрес16 | BCPL addr16 , # бит | Дополнить (переключить) выбранный бит | ||
90 | 0 | 0 | 0 | 1 | немного | 1 | адрес16 | BCCM addr16 , # бит | Запись флага переноса в бит памяти | ||
- / 90 | 0 | 0 | 1 | 0 | состояние | soff8 | Условные переходы (8-битное смещение со знаком) | ||||
- | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | soff8 | Этикетка JRA | Всегда переходить (истина) |
- | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | soff8 | JRF этикетки | Ветвь никогда (ложь) |
- | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | soff8 | JRUGT этикетки | Перейти, если без знака больше, чем (C = 0 и Z = 0) |
- | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | soff8 | JRULE этикетки | Переход, если без знака меньше или равно (C = 1 или Z = 1) |
- | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | soff8 | JRNC этикетки | Переход, если нет переноса (C = 0) |
- | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | soff8 | Этикетка JRC | Переход при переносе (C = 1) |
- | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | soff8 | JRNE этикетки | Перейти, если не равно (Z = 0) |
- | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | soff8 | JREQ этикетки | Перейти, если равно (Z = 1) |
- | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNV этикетки | Перейти, если не переполнение (V = 0) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNH этикетки | Ветвь, если не полуперенос (H = 0) |
- | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | JRV этикетки | Переход при переполнении (V = 1) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | Этикетка JRH | Разветвляется, если переносится наполовину (H = 1) |
- | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | soff8 | JRPL этикетки | Перейти, если плюс (N = 0) |
- | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | soff8 | JRMI этикетки | Переход, если минус (N = 1) |
- | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRSGT этикетки | Переходить, если знак больше (S = 0 и N = V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRNM этикетки | Перейти, если нет маски прерывания (I = 0) |
- | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | JRSLE этикетки | Переход, если знак меньше или равен (S = 1 или N ≠ V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | Этикетка JRM | Переход, если прерывания замаскированы (I = 1) |
- | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRSGE этикетки | Переход, если знак больше или равен (N = V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRIL этикетки | Переход, если линия прерывания низкая |
- | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRSLT этикетки | Переходить, если подписано меньше (N ≠ V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRIH этикетки | Переход, если линия прерывания высока |
приставка | 0 | Режим | код операции | операнд | Инструкции с одним операндом | ||||||
- | 0 | 0 | 0 | 0 | код операции | адрес 8 | OP ( адрес 8 , SP) | Относительный указатель стека | |||
- | 0 | 0 | 1 | 1 | код операции | адрес 8 | OP addr8 | 8-битный абсолютный адрес | |||
72 | 0 | 0 | 1 | 1 | код операции | адрес16 | OP [ адрес16 ] | 16-битный косвенный адрес | |||
92 | 0 | 0 | 1 | 1 | код операции | адрес 8 | OP [ адрес8 ] | 8-битный косвенный адрес 16-битного адреса | |||
- | 0 | 1 | 0 | 0 | код операции | - | OP A | Аккумулятор | |||
72/90 | 0 | 1 | 0 | 0 | код операции | адрес16 | OP ( адрес16 , X / Y) | Индексируется с 16-битным смещением | |||
- / 90 | 0 | 1 | 0 | 1 | код операции | - | OPW X / Y | Регистр X / Y (16-битная операция) | |||
72 | 0 | 1 | 0 | 1 | код операции | адрес16 | OP addr16 | 16-битный адрес | |||
- / 90 | 0 | 1 | 1 | 0 | код операции | адрес 8 | OP ( адрес 8 , X / Y) | 8-битный адрес плюс X / Y | |||
72 | 0 | 1 | 1 | 0 | код операции | адрес16 | OP ([ адрес16 ], X) | 16-битный косвенный адрес плюс X | |||
92/91 | 0 | 1 | 1 | 0 | код операции | адрес 8 | OP ([ адрес8 ], X / Y) | 8-битный косвенный адрес плюс X / Y | |||
- / 90 | 0 | 1 | 1 | 1 | код операции | - | OP (X / Y) | Проиндексировано без смещения | |||
приставка | 0 | Режим | 0 | 0 | 0 | 0 | операнд | NEG операнд | Отрицание с дополнением до двух | ||
0 | Режим | 0 | 0 | 0 | 1 | (переназначен для обменных операций; см. следующий раздел) | |||||
0 | Режим | 0 | 0 | 1 | 0 | (переназначен для других операций; см. следующий раздел) | |||||
приставка | 0 | Режим | 0 | 0 | 1 | 1 | операнд | Операнд CPL | Дополнение , логическое НЕ | ||
приставка | 0 | Режим | 0 | 1 | 0 | 0 | операнд | SRL операнд | Сдвиг вправо логический, msbit очищен, lsbit для переноса: (операнд: C): = (0: операнд) | ||
0 | Режим | 0 | 1 | 0 | 1 | (переназначен для других операций; см. следующий раздел) | |||||
приставка | 0 | Режим | 0 | 1 | 1 | 0 | операнд | Операнд RRC | Повернуть вправо через перенос, (операнд: C): = (C: операнд) | ||
приставка | 0 | Режим | 0 | 1 | 1 | 1 | операнд | Операнд SRA | Сдвиг вправо арифметика, msbit сохраняется, lsbit для переноса | ||
приставка | 0 | Режим | 1 | 0 | 0 | 0 | операнд | Операнд SLL | Сдвиг влево, msbit для переноса: (C: операнд): = (операнд: 0) | ||
приставка | 0 | Режим | 1 | 0 | 0 | 1 | операнд | Операнд RLC | Повернуть влево через перенос, (C: операнд): = (операнд, C) | ||
приставка | 0 | Режим | 1 | 0 | 1 | 0 | операнд | Операнд DEC | Декремент; N и Z установлены, переносить без изменений | ||
0 | Режим | 1 | 0 | 1 | 1 | (переназначен для других операций; см. следующий раздел) | |||||
приставка | 0 | Режим | 1 | 1 | 0 | 0 | операнд | Операнд INC | Приращение; N и Z установлены, переносить без изменений | ||
приставка | 0 | Режим | 1 | 1 | 0 | 1 | операнд | Операнд TNZ | Тест ненулевой: установите N и Z на основе значения операнда | ||
приставка | 0 | Режим | 1 | 1 | 1 | 0 | операнд | SWAP- операнд | Поменять местами половины операнда (4-битный поворот; 8-битный для SWAPW X и SWAPW Y) | ||
приставка | 0 | Режим | 1 | 1 | 1 | 1 | операнд | Операнд CLR | Установить операнд на 0, N очищено, Z установлено | ||
приставка | 0 | Режим | код операции | операнд | Переназначены оподы [03-7] [125B] из диапазона с одним операндом | ||||||
- / 90 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - | RRWA X / Y | Повернуть слово вправо через A: 8-битный поворот вправо 24-битной конкатенации X / Y и A; (X: A): = (A: X) |
- | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | адрес16 | EXG A, адрес 16 | Обменять A с памятью |
- | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | - | EXG A, XL | Обменять A на X (нижняя половина) |
- | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | - | EXGW X, Y | Заменить X на Y (16 бит) |
- | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | - | EXG A, YL | Обменять A на Y (нижняя половина) |
- | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | - | (зарезервированный) | |
- / 90 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | - | RLWA X / Y | Повернуть слово влево через A: 8-битный поворот влево 24-битной конкатенации X / Y и A; (А: Х): = (Х: А) |
- | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | адрес16 | POP- адрес16 | Вытащить из стопки |
- / 90 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | - | MUL X / Y, А | X / Y: = XL / YL × А |
- | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | imm8 | SUBW SP, # imm | SP: = SP - imm8 |
- / 90 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | - | DIV X / Y, A | Разделите X / Y на A; 16-битное частное по X / Y, остаток по A |
- | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | - | ПРИСТАВКА | Префикс инструкции 72 : изменить следующий код операции
|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | - | (зарезервированный) | ||
- | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | imm8 адрес16 | MOV addr16 , # imm8 | Немедленно переместить в память (флажки не изменяются) |
- | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | адрес8 адрес8 | MOV адрес8 , адрес8 | Переместить память в память (флаги не изменяются) |
- | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | адрес16 адрес16 | MOV адрес16 , адрес16 | Переместить память в память (флаги не изменяются) |
- | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | - | DIVW X, Y | Разделите X на Y (16 бит); частное по X, остаток по Y |
0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | - | (зарезервированный) | ||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | - | (зарезервированный) | ||
- | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | адрес16 | PUSH addr16 | Вставить в стек |
- | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | imm8 | НАЖАТЬ # imm8 | Вставить в стек |
- | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | imm8 | ДОБАВИТЬ SP, # imm8 | SP: = SP + imm8 |
- | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | адрес 8 | LD ( адрес8 , SP), A | Хранить относительно стека |
- | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | адрес 8 | LD A, ( адрес 8 , SP) | Загрузить относительно стека |
- | 1 | 0 | 0 | код операции | - | Разные инструкции. Ни один из них не устанавливает коды условий неявно. | |||||
- | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | IRET | Возврат из прерывания (pop CC, A, X, Y, PC) |
- | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - | RET | Извлечь 16-битный адрес возврата из стека на ПК |
- | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | адрес24 | INT | Специальный переход для таблицы векторов прерываний |
- | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | - | ЛОВУШКА | Прерывание с прерыванием |
- | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | - | POP A | Извлечь из стека |
- / 90 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | - | POPW X / Y | Извлечь X / Y из стека (16 бит) |
- | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | - | POP CC | Извлечь коды условий из стека |
- | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | - | RETF | Извлечь 24-битный адрес возврата из стека в ПК |
- | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | - | НАЖАТЬ А | Поместить A в стек |
- / 90 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | - | PUSHW X / Y | Вставить X / Y в стек (16 бит) |
- | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | - | НАЖАТЬ CC | Помещать коды условий в стек |
- | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | - | СЛОМАТЬ | Остановить для отладчика, если он есть, или NOP |
- | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | - | CCF | Дополнение (переключение) флаг переноса |
- | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес24 | CALLF адрес24 | Нажать 24-битный ПК; ПК: = адрес24 |
92 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес16 | CALLF [ адрес16 ] | Косвенный дальний вызов; адрес 24-битный указатель |
- | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | - | HALT | Остановить процессор и часы |
- | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | - | WFI | Дождитесь прерывания, останавливая процессор, но не часы |
72 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | - | WFE | Ожидание события (сопроцессор), обработка прерываний во время ожидания |
- | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | - | PDY | Префикс инструкции 90 : поменяйте местами X и Y в следующей инструкции
|
- | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | - | PIY | Префикс инструкции 91 : PDY plus PIX
|
- | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | - | PIX | Префикс инструкции 92 : использовать 8-битную косвенную память для операнда
|
- / 90 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | - | LDW X / Y, Y / X | X / Y: = Y / X |
- / 90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | - | LDW SP, X / Y | SP: = X / Y |
- / 90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | - | LD XH / YH, А | XH / YH: = А |
- / 90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | - | LDW X / Y, SP | X / Y: = SP |
- / 90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | - | LD XL / YL, А | XL / YL: = А |
- | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | - | RCF | Сбросить (сбросить) флаг переноса |
- | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | - | SCF | Установить флаг переноса |
- | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | - | RIM | Сбросить маску прерывания (разрешить прерывания) |
- | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | - | SIM | Установить маску прерывания (отключить прерывания) |
- | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | - | RVF | Сбросить (сбросить) флаг переполнения |
- | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | - | NOP | Нет операции |
- / 90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | - | LD A, XH / YH | А: = XH / YH |
- / 90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | - | LD A, XL / YL | А: = XL / YL |
Приставка | 1 | Режим | код операции | операнд | Инструкции с двумя операндами A: = операнд операции | ||||||
- | 0 | 0 | 0 | 1 | код операции | адрес 8 | OP ( адрес 8 , SP) | Операнд относительно стека (см. Выше; коды операций 16, 17, 1C, 1D не соответствуют шаблону) | |||
- | 1 | 0 | 1 | 0 | код операции | imm8 | OP # imm8 | 8-битный непосредственный операнд (запрещен как место назначения) | |||
- | 1 | 0 | 1 | 1 | код операции | адрес 8 | OP addr8 | 8-битный абсолютный адрес (запрещен для перехода / вызова) | |||
- | 1 | 1 | 0 | 0 | код операции | адрес16 | OP addr16 | 16-битный абсолютный адрес | |||
72 | 1 | 1 | 0 | 0 | код операции | адрес16 | OP [ адрес16 ] | 16-битный косвенный адрес | |||
92 | 1 | 1 | 0 | 0 | код операции | адрес 8 | OP [ адрес8 ] | 8-битный косвенный адрес 16-битного адреса | |||
- / 90 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP ( адрес16 , X / Y) | Индексируется с 16-битным смещением | |||
72 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP ([ адрес16 ], X) | 16-битный косвенный + X | |||
92/91 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP ([ адрес8 ], X / Y) | 8-битный косвенный + X / Y | |||
- / 90 | 1 | 1 | 1 | 0 | код операции | адрес 8 | OP ( адрес 8 , X / Y) | Индексируется с 8-битным смещением | |||
- / 90 | 1 | 1 | 1 | 1 | код операции | - | OP (X / Y) | Проиндексировано без смещения | |||
приставка | 1 | Режим | 0 | 0 | 0 | 0 | операнд | SUB A, операнд | A: = A - операнд | ||
приставка | 1 | Режим | 0 | 0 | 0 | 1 | операнд | CP A, операнд | Сравнить A - операнд | ||
приставка | 1 | Режим | 0 | 0 | 1 | 0 | операнд | SBC A, операнд | A: = A - операнд - C вычесть с заимствованием | ||
приставка | 1 | Режим | 0 | 0 | 1 | 1 | операнд | CPW X / Y, операнд | Сравнить X / Y - операнд (16 бит); сравнить Y / X, если режим операнда проиндексирован X / Y (коды операций D3, E3, F3) | ||
приставка | 1 | Режим | 0 | 1 | 0 | 0 | операнд | И А, операнд | A: = A & операнд, побитовое и | ||
приставка | 1 | Режим | 0 | 1 | 0 | 1 | операнд | BCP A, операнд | Побитовый тест A и операнд | ||
приставка | 1 | Режим | 0 | 1 | 1 | 0 | операнд | LD A, операнд | A: = операнд | ||
приставка | 1 | Режим | 0 | 1 | 1 | 1 | операнд | Операнд LD , A | Операнд: = A (режим 2 |
||
приставка | 1 | Режим | 1 | 0 | 0 | 0 | операнд | XOR A, операнд | A: = A ^ операнд, исключающее ИЛИ | ||
приставка | 1 | Режим | 1 | 0 | 0 | 1 | операнд | АЦП A, операнд | A: = A + операнд + C, сложить с переносом | ||
приставка | 1 | Режим | 1 | 0 | 1 | 0 | операнд | ИЛИ A, операнд | A: = A | операнд, включительно или | ||
приставка | 1 | Режим | 1 | 0 | 1 | 1 | операнд | ADD A, операнд | A: = A + операнд | ||
приставка | 1 | Режим | 1 | 1 | 0 | 0 | операнд | JP- операнд | Младшие 16 бит PC: = операнд, безусловный переход (режимы 2 |
||
приставка | 1 | Режим | 1 | 1 | 0 | 1 | операнд | CALL операнд | Нажмите 16-битный ПК, младшие 16 бит ПК: = операнд ( переназначены режимы 2 |
||
приставка | 1 | Режим | 1 | 1 | 1 | 0 | операнд | LDW X / Y, операнд | Загрузить X / Y: = операнд; используйте 16 вместо 90 1E для LDW Y, ( адрес 8 , SP) | ||
приставка | 1 | Режим | 1 | 1 | 1 | 1 | операнд | Операнд LDW , X / Y | Операнд: = X / Y (16 бит, режим 2 |
||
Приставка | 1 | Режим | код операции | операнд | Переназначенные коды операций A7, AC, BC, AD, BD, AF из диапазона с двумя операндами | ||||||
- / 90 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес24 | LDF ( адрес 24 , X / Y), A | Загрузить далеко (= |
92/91 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес16 | LDF ([ адрес16 ], X / Y), A | 16-битный адрес 24-битного указателя |
- | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес24 | JPF адрес 24 | ПК: = addr24 (= |
92 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес16 | JPF [ адрес16 ] | Косвенный дальний прыжок; адрес 24-битный указатель |
- | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес24 | LDF A, адрес 24 | Загрузить далеко (= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес16 | LDF A, [ адрес16 ] | Загрузить дальний, 16-битный адрес 24-битного указателя |
- | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | CALLR этикетки | Нажмите 16-битный ПК, ПК: = ПК + операнд (= |
- | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес24 | LDF адрес24 , A | Операнд: = A (= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес16 | LDF [ адрес16 ], A | Операнд: = A, 16-битный адрес 24-битного указателя |
- / 90 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес24 | LDF A, ( адрес 24 , X / Y) | Загрузить далеко (= |
92/91 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес16 | LDF A, ([ адрес16 ], X / Y) | 16-битный адрес 24-битного указателя |
72 | 1 | Режим | код операции | операнд | Арифметические операции с индексным регистром (16 бит) X / Y: = X / Y ± операнд | ||||||
72 | 1 | 0 | 1 | 0 | код операции | imm16 | OPW X / Y, # imm16 | 16-битный немедленный | |||
72 | 1 | 0 | 1 | 1 | код операции | адрес16 | OPW X / Y, адрес16 | 16-битный абсолютный | |||
72 | 1 | 1 | 1 | 1 | код операции | адрес 8 | OPW X / Y, ( адрес 8 , SP) | Относительный стек | |||
72 | 1 | Режим | 0 | 0 | 0 | 0 | операнд | SUBW X, операнд | X: = X - операнд (предпочтительно код операции 1D для SUBW X, # imm16 ) | ||
72 | 1 | Режим | 0 | 0 | 1 | 0 | операнд | SUBW Y, операнд | Y: = Y - операнд | ||
72 | 1 | Режим | 1 | 0 | 0 | 1 | операнд | ADDW Y, операнд | Y: = Y + операнд | ||
72 | 1 | Режим | 1 | 0 | 1 | 1 | операнд | ADDW X, операнд | X: = X + операнд (предпочитайте код операции 1C для ADDW X, # imm16 ) |
Для инструкций CPW и LDW, в которых режим адресации операндов индексируется X, STM8 по умолчанию использует регистр Y вместо X. Применение 90
префикса меняет местами X и Y, так что регистр X, а режим адресации индексируется Y.