Зa весь этот период много всего переделано по теме.
А именно:- Нарисовал много разных схем в Logisim
- Написал несколько вариантов на Verilog
- Прогнал всё в среде Quartus/ModelSim
- Написал эмулятор…
Собственно, представляю вашему вниманию эмулятор данного в теме процессора для РАДИО-86РК.
В архиве RISC-Emu.zip имеется два файла, где «emulator.rkr» собственно само ядро эмуляции размером в 272 байта, загружаемое в область 0x5B00…0x5C0F, чтобы можно было и на ZX-Spectrum'е запустить, предварительно заменив все jp'ы на jr'ы для компактности. Ядро полностью выполняет весь байт-код.
Также в архиве имеется второй файл «emulater.rkr», который представляет собой микросреду для эмуляции.
Напомню, что суть процессора в том, что как байт-код кодируется, то он и обозначает. Своего рода WYSIWYG-машинный код.
Как и виртуальная Java-машина, здесь байт-код тоже выполняется виртуально процессором i8080/z80. А также, напомню, выполняется на уровне Verilog, что позволяет на уровне ПЛИС/FPGA реализовать самый настоящий процессор.
Или же перепрошить ПЗУ АОНа на z80 для эмуляции данного процессора.
Так, байты A0…A9/B0…B9/C0…C9/D0…D9 активируют одноимённые РОН. Как можно догадаться, всего РОН 40. Причём, A0 - это PSW, а D0…D9 - внешние УВВ.
Байты AA…AD/BA…BD/CA…CD/DA…DD группируют регистры в операнды для АЛУ.
Например, код «A2 AB 3E» воспринимается как «A2 A,B3 Eor» и работает как «EOR A2,B3».
Тем самым, никакую таблицу команд заучивать и зубрить не надо. Только чуточку нужно приобрести навык и можно спокойно кодировать алгоритм.
Так как D0…D9 выполняют функцию УВВ, временно в «emulater.rkr» создана такая среда:- D0: Чтение - код символа под курсором / Запись - печать ASCII-символа
- D1: Чтение - проверка клавиатуры / Запись - печать HEX-байта
- D2: Чтение - ожидание ввода с клавиатуры / Запись - BEEP-тональность
- D3: Чтение - опрос клавиатуры без ожидания / Запись - BEEP-длительность
- D4: Чтение - Позиция курсора по X
- D5: Чтение - Позиция курсора по Y
- D9 - Должен работать как переключатель страниц УВВ. То есть, если 0x00 - функционал выше, то 0x57 - функционал i8257 с управлением через D0…D8. А 0x53 - функционал i8253. Проще говоря, здесь хранится код выбранного УВВ
То есть, «PRINT CHR$(USR(-2045))» это «LET D0 = D2», которое мнемонически представляется как «MOV D0,D2» и кодируется кодом «D0 DD 2F».
Verilog-модель выполняет эту команду примерно за 33 такта.
Примеры:
Код:
0100 A1 |REG A1 ; Выбор A1 в качестве аккумулятора
0101 AB |ARG A,B ; Операнд-аккумулятор A и операнд-источник B
0102 2D|OR A1,B2 ; Здесь «2» определяет индекс операнда-источника, а «D» означает «Disjunct»
0103 3D|OR A1,B3 ; Здесь «3» определяет индекс операнда-источника
0104 65 4D|OR A1,[BC6+5+B4] ; Префикс «65» выбирает регистровую пару B6 и C6 как указатель памяти со смещением
0106 A7 |REG A7 ; Меняем аккумулятор на A7
0107 65 4D|OR A7,[BC6+5+B4] ; Та же операция, но результат помещается в A7
0109 AC |ARG A,C ; Операнд-аккумулятор A и операнд-источник C
010A 65 4D|OR A7,[BC6+5+C4] ; Такая же операция, но смещение берётся из C4
010C 5E|EOR A7,C5 ; Инструкция XOR
010D 5F|FOR A7,C5 ; Инструкция MOV
010E 5A|ADD A7,C5 ; Сложение
010F 5B|SUB A7,C5 ; Вычитание
0110 65 D6|MOV [BC6+5],D6 ; Запись из регистра УВВ в память
0112 65 CF|JCF [BC6+5] ; Если !CF, то прыжок на адрес из пары B6 и C6 со смещением 5
0114 65 43|JMP 0x4365 ; Два префикса в подряд - переход (в B0 и C0 сохранится адрес 0x0115)
0116 F1|JMP 0xF100 ; Переход на начало Функции #1 (в B0 и C0 сохранится адрес 0x0116)
0117 23 F1|JMP 0xF123 ; Переход внутрь Функции #1 (в B0 и C0 сохранится адрес 0x0118)
0119 21 00|JMP 0x0021 ; Переход в начальный параграф памяти (в B0 и C0 сохранится адрес 0x011A)
011B 00|HLT ; Останов: Переход на 0000, как RST 0 (в B0 и C0 сохранится адрес 0x011B)
Как можно видеть, ничего сверхъестественного нет. Именно поэтому подобную систему команд можно легко выполнять и эмулятором, и в Verilog, и в Logisim, что близко по уровню к ТТЛ.
А главное - никакого BrainF*ck'а! Никакой эзотерики!
Машинный код прост и очевиден, если есть хоть малое желание вникнуть!
А так как запустить Java-игру на i8080 почти нереально, то с данным кодом можно, напротив, и в ТТЛ баловаться, и на РАДИО-86РК, и в браузере JavaScript-эмулятором.
Короче, кроссплатформенность обеспечивается.
P.S.: Как понятно, переключатель УВВ через D9 мною не реализован в файле «emulater.rkr», так как на данном этапе это не требуется.