Урок 4. Циклы и условия: умножение повторным сложением
В картинкахВ этом уроке нет новых деталей — только программа. Процессор не умеет умножать, но умеет повторять: 13 × 11 — это 13, сложенное 11 раз. Счётчик в памяти, флаг Z и условный переход — и готов цикл.
4.1. Идея: счётчик до нуля
- сумма лежит в ячейке 0, счётчик — в ячейке 1;
- в петле: сумма + 13, счётчик − 1;
SUB #1ставит флагZ, когда счётчик дошёл до нуля;JNZ loopвозвращается в начало петли, покаZ= 0.
Так же карта будет принимать байт: «8 раз взять бит».
4.2. Программа
Тот же проект, что в уроке 3. Новых деталей нет: переходы по флагам собраны в уроке 2, память — в уроке 3. Этот урок — про то, как на них пишут программы.
| Команда | Переходит, если | Флаг ставят |
|---|---|---|
| JMP | всегда | — |
| JZ | Z = 1 (результат был 0) | LD, ADD, ADC, SUB, AND, OR, XOR, CMP |
| JNZ | Z = 0 | те же |
| JC | C = 1 (перенос; у SUB/CMP — A ≥ B) | ADD, ADC, SUB, CMP |
| JNC | C = 0 | те же |
| CALL | всегда, запомнив адрес возврата | — |
| RET | на запомненный адрес | — |
Шаг 1. Программа в ПЗУ
⚙ у ROM → кнопка ⬆ → файл 04-mul.rom.json. Clock можно поставить на 10Hz — петля длинная.
; Урок 4 — умножение повторным сложением: 13 × 11 = 143. Счётчик в ячейке 1 убывает до нуля — петля, как у карты; «принять 8 бит». JNZ смотрит на флаг Z, который поставила SUB. LD #0 ST 0 ; сумма = 0 LD #11 ST 1 ; счётчик = 11loop: LD 0 ADD #13 ST 0 ; сумма = сумма + 13 LD 1 SUB #1 ST 1 ; счётчик = счётчик − 1 JNZ loop ; не ноль — ещё раз LD 0 ; ответ — в A, на лампыdone: JMP done ; стоп: программа шагает на месте4.3. Проверка
Сброс (RST на один-два такта) — и смотри, как идёт петля. Одна строка — один проход (7 команд от loop до JNZ):
| Проход | Такт | Счётчик (ячейка 1) | Сумма (ячейка 0) | Z | JNZ |
|---|---|---|---|---|---|
| 1 | 11 | 10 | 13 | 0 | ещё раз |
| 2 | 18 | 9 | 26 | 0 | ещё раз |
| 3 | 25 | 8 | 39 | 0 | ещё раз |
| 4 | 32 | 7 | 52 | 0 | ещё раз |
| 5 | 39 | 6 | 65 | 0 | ещё раз |
| 6 | 46 | 5 | 78 | 0 | ещё раз |
| 7 | 53 | 4 | 91 | 0 | ещё раз |
| 8 | 60 | 3 | 104 | 0 | ещё раз |
| 9 | 67 | 2 | 117 | 0 | ещё раз |
| 10 | 74 | 1 | 130 | 0 | ещё раз |
| 11 | 81 | 0 | 143 | 1 | выход из петли |
| — | 83 | 0 | 143 | 0 | A = 143: стоп, PC стоит на 12 |
- Табло
PCбегает по кругу 4 … 10, после 11-го прохода уходит на 11, потом стоит на 12:JMP doneпрыгает сам на себя. - В конце на табло
Aи лампах — 143 (1000 1111). - Внутри петли
Aпрыгает между суммой и счётчиком: его загружают то из ячейки 0, то из ячейки 1 — так и должно быть.
Подумай. Что будет, если счётчик поставить 0? (Петля пройдёт 256 раз: 0 − 1 = 255, и до нуля ещё далеко.)
Не получается? Что-то не работает →