Автор программы «ЛамПанель» — Константин Юрьевич Поляков, kpolyakov.spb.ru. Эта версия опубликована с его разрешения; ПЗУ и примеры оригинальной программы включены с согласия автора.
«ЛамПанель» — учебная модель компьютера. Процессор с системой команд в духе PDP-11 управляет панелью из 8 рядов по 16 лампочек. Программа пишется на языке ассемблера, переводится в машинные коды и выполняется целиком или по шагам.
Устройство компьютера
| R0, R1, R2, R3 | 16-битные регистры общего назначения. Сохраняют значения между запусками — их можно задать заранее, щёлкнув по значению. |
| 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, b | b := a |
| ADD a, b | b := b + a |
| SUB a, b | b := b − a |
| MUL a, b | b := b · a (без знака; при выходе за 16 бит — флаги C и O) |
| DIV a, b | b := 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, 9 | AND, OR, XOR всех портов с R1 |
| A, B, C, D, E | SHL, 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.