ЛамПанель

Порты

Регистры щёлкните значение, чтобы изменить

Программа

Отладчик

Данные в памяти

Подпрограммы ПЗУ

Справка

Автор программы «ЛамПанель» — Константин Юрьевич Поляков, kpolyakov.spb.ru. Эта версия опубликована с его разрешения; ПЗУ и примеры оригинальной программы включены с согласия автора.

«ЛамПанель» — учебная модель компьютера. Процессор с системой команд в духе PDP-11 управляет панелью из 8 рядов по 16 лампочек. Программа пишется на языке ассемблера, переводится в машинные коды и выполняется целиком или по шагам.

Устройство компьютера

R0, R1, R2, R316-битные регистры общего назначения. Сохраняют значения между запусками — их можно задать заранее, щёлкнув по значению.
PCсчётчик команд — адрес следующей команды
SPуказатель стека; стек растёт от конца памяти (100) вниз
PSфлаги результата: N (отрицательный), Z (ноль), C (перенос), O (переполнение)
ОЗУ256 байт, адреса 00–FF; программа и данные лежат в одной памяти
ПЗУсистемные подпрограммы с адреса 4000 (таблица адресов) и 4200 (код)
P0 … P7порты: каждый управляет одним рядом лампочек, старший бит — левая лампочка

Запись программы

Все числа — шестнадцатеричные (mov 1F, R0). Комментарий начинается с ;. Метка — имя с двоеточием в отдельной строке (loop:). Регистр букв не важен. Программа должна заканчиваться командой STOP.

Операнды

R1значение регистра
12число (только первый операнд)
(R1)ячейка памяти, адрес которой в R1
(R1)+то же, затем R1 увеличивается на 2 (для байтовых команд — на 1)
меткаячейка памяти по адресу метки
@меткаадрес метки как число (только в MOV @метка, Rx)

Результат записывается во второй операнд. Оба операнда не могут быть метками.

Команды

КомандаДействие
NOPничего не делать
STOPостановить программу
MOV a, bb := a
ADD a, bb := b + a
SUB a, bb := b − a
MUL a, bb := b · a (без знака; при выходе за 16 бит — флаги C и O)
DIV a, bb := b div a (без знака, остаток отбрасывается)
CMP a, bтолько флаги по разности a − b
AND / OR / XOR a, bпоразрядные «И», «ИЛИ», «исключающее ИЛИ»: b := b op a
NOT aинверсия всех битов
SHL n, a / SHR n, aлогический сдвиг влево / вправо на n бит (1…10)
SAR n, aарифметический сдвиг вправо (знак сохраняется)
ROL n, a / ROR n, aциклический сдвиг влево / вправо
RCL n, a / RCR n, aциклический сдвиг через бит переноса C
MOVB, CMPBто же для байтов; MOVB в регистр расширяет знак байта
SHLB … RCRBсдвиги младшего байта; старший байт не меняется
SWAPB aпоменять местами байты слова
JMP меткабезусловный переход
JZ / JNZпереход, если результат равен / не равен нулю
JL / JGEпереход, если результат < 0 / ≥ 0 (флаг N)
JG / JLEпереход, если результат > 0 / ≤ 0
CALL меткавызов подпрограммы (адрес возврата — в стек)
RET, RET nвозврат; RET n ещё и снимает со стека n байт
SYSTEM nвызов подпрограммы ПЗУ номер n
PUSH a / POP aзаписать в стек / снять со стека
MOV SP, Rx / MOV Rx, SPчтение и запись указателя стека
IN Pn, a / OUT a, Pnчтение / запись порта; номер порта можно взять из регистра: OUT R0, (R2)
DATA 1234 / DATA "текст"слово или строка в памяти

Сдвиги меняют только флаг C. MOV, логические команды, IN, OUT и POP сбрасывают C и O.

Подпрограммы ПЗУ

0погасить все лампочки
1зажечь все лампочки
2записать R0 во все порты
3, 4прокрутить панель вниз, вверх
5вывести 8 слов с адреса R0
6инверсия панели
7, 8, 9AND, OR, XOR всех портов с R1
A, B, C, D, ESHL, SHR, ROL, ROR, SAR всех портов на R1 бит
Fделение с остатком: R0 := R0 div R1, R1 := R0 mod R1
10цифра R0 в позиции R1 (0–2, справа налево)
11число R0 в системе с основанием R1
12, 13число R0 в десятичной, шестнадцатеричной системе

По умолчанию работает ПЗУ из оригинальной программы К.Ю. Полякова. Кнопка «ПЗУ» показывает коды всех подпрограмм; там же можно переключиться на новое ПЗУ (те же подпрограммы, написанные заново), загрузить свой файл .rom или сохранить отлаженную подпрограмму в формате ПЗУ.

Клавиши

F9выполнить (продолжить)
Ctrl+F9только трансляция
F8шаг; подпрограмма выполняется целиком
F7шаг с заходом в подпрограмму
Ctrl+F8отменить шаг
F4выполнить до строки с курсором
Escостановить
F10большая панель для проектора
Ctrl+0 … 6изменить R0–R3, PC, SP, PS
Ctrl+O, Ctrl+Sоткрыть, сохранить (Shift — сохранить как)

Щелчок по лампочке меняет бит порта. Файлы сохраняются в кодировке Windows-1251, как у исходной программы; открываются файлы в Windows-1251 и UTF-8.

Новая реализация «ЛамПанели», совместимая с оригинальной программой по машинным кодам и формату ПЗУ. Исходный код: github.com/RGB-Outl4w/lampanel.