SWEET16 - архитектура мечты Стива Возняка

Для ретропрограммистов североамериканского континента информация из этой статьи будет банальщиной, но наши отечественные спектрумисты возможно узнают для себя что-то новое.

Дешевый и сердитый 8-битный микропроцессор MOS 6502 стал сердцем очень многих компьютеров и консолей.
Так он был центральным процессором в компьютере Apple II — первом массовом компьютере фирмы Apple эпохальной значимости собственноручной разработки Стива Возняка.

Процессор был 8-битным насколько это было возможно — единственный 16-битный регистр в нём был счётчик инструкций и все 16-битные операции надо было проводить в несколько 8-битных действий.
Например инкремент указателя на 1 байт в MOS 6502 выглядит примерно так:
INC ptr ; инкрементируем байт LSB
BNE skip ; если не получился 0, пропускаем следующую инструкцию
INC ptr+1 ; инкремента байта MSB
skip:

Что еще очень характерно для данной архитектуры — это то, что указатели должны были располагаться в первой странице из 256 байт в памяти — в так называемой zero-page. Опять таки за неимением 16-битных регистров общего назначения полная 16-битная косвенность здесь выполнялась через адрес в zero-page. Т.е. в инструкции было непосредственное однобайтное данное — адрес в zero-page откуда уже за два считывания брался 16-битный указатель и вот по нему уже происходило считывание или запись. Это довольно упрощенное изложение, но главную суть нам тут помогает увидеть.

Когда Стив Возняк начал разрабатывать интерпретатор BASIC для Apple II он столкнулся с необходимостью массовых вычислений с 16-битными указателями и настолько запарился реализовывать их в стиле MOS 6502, что сказал себе «хватит это терпеть» и придумал SWEET16.

SWEET16 — это виртуальный 16-битный микропроцессор с очень простой системой команд. Фактически SWEET16 это байт-код виртуального процессора интерпретатор которого Стив Возняк реализовал на MOS 6502 чтобы упростить себе программирование бейсика.

Архитектура SWEET16 имеет шестнадцать 16-битных регистров общего назначения R0-R15.
Из них R0 является аккумулятором, R12 — указателем стека, R13 — флагами условных переходов, R14 — состоянием процессора и R15 — счётчик инструкций.
Регистры SWEET16 занимают первые 32 байта zero-page и таким образом могут быть и данными и указателями в архитектуре MOS 6502.
Формат инструкций крайне прост — байт инструкции состоит из двух 4-битных полей, назовём из HI и LO.

Если HI=0, то инструкция является вариантом «без указания регистра» и описывает 13 возможных опкодов через поле LO условных и безусловных переходов с возвратом из процедур:

00   RTN   Return to 6502 mode
01   BR ea   Branch always 
02   BNC ea   Branch if No Carry 
03   BC ea   Branch if Carry 
04   BP ea   Branch if Plus 
05   BM ea   Branch if Minus 
06   BZ ea   Branch if Zero 
07   BNZ ea   Branch if NonZero 
08   BM1 ea   Branch if Minus 1 
09   BNM1 ea   Branch if Not Minus 1 
0A   BK   Break 
0B   RS   Return from Subroutine 
0C   BS ea   Branch to Subroutine


Три опкода 0D,0E,0F не были использованы.
Сразу же обратите внимание на интересный момент — первая же инструкция 0x00 есть возврат в режим 6502.
Предполагается, что инструкции SWEET16 могут быть бесшовно «вплетены» в поток инструкций 6502 и между ними можно переключаться на лету. Активировать режим SWEET16 конечно нужно командой вызова процедуры перехода в этот режим, но выход из него есть первая же инструкция в этой архитектуре.

Если же HI не равен 0, то уже он обозначает код инструкции, а LO содержит номер регистра-операнда (0-15) следующих операций:
1n   SET Rn   Constant set 
2n   LD Rn   Load 
3n   ST Rn   Store 
4n   LD @Rn   Load indirect 
5n   ST @Rn   Store indirect 
6n   LDD @Rn   Load double indirect
7n   STD @Rn   Store double indirect
8n   POP @Rn   Pop indirect 
9n   STP @Rn   Store Pop indirect
An   ADD Rn   Add 
Bn   SUB Rn   Subtract 
Cn   POPD @Rn   Pop double indirect
Dn   CPR Rn   Compare 
En   INR Rn   Increment 
Fn   DCR Rn   Decrement


Здесь все регистры являются 16-битными и R0 является выделенным аккумулятором для арифметических операций.
Заметьте — что арифметика представлена только сложениями/вычитания и инкрементом/декрементом — повторюсь, что SWEET16 задумывался именно как инструмент для массивных вычислений с указателями.
Интерпретатор SWEET16 занял около 300 байт памяти в бейсике Apple II и превосходно справился со своими функциями.
Однако работа в режиме SWEET16 роняет пиковую производительность машины примерно в 10 раз по сравнению с незамутнённым 8-битным кодом.
Но плотность кода по утверждению самого Возняка возросла очень сильно — в разы.

Если есть желание подробно разобраться что каждая инструкция значит — можно почитать статью в журнале «Byte» 1977 года выпуска за авторством самого Возняка: archive.org/details/BYTE_Vol_02-11_1977-11_Sweet_16/page/n151/mode/2up
Интересно что там Стив архитектуру называет «Dream Machine», т.е. «Машина Мечты». Вот такие в 1977 году были мечты и желания у первопроходцев индустрии.

Я уже много раз встречал упоминание что энтузиасты то ли пытаются создать то ли создали уже схему клона MOS 6502 на ПЛИС где режим SWEET16 является аппаратным режимом таким же как сам 6502 и поэтому не испытывает никаких пенальти, но ничего о состоянии проекта сказать не могу.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.