SWEET16 - архитектура мечты Стива Возняка
Для ретропрограммистов североамериканского континента информация из этой статьи будет банальщиной, но наши отечественные спектрумисты возможно узнают для себя что-то новое.
Дешевый и сердитый 8-битный микропроцессор MOS 6502 стал сердцем очень многих компьютеров и консолей.
Так он был центральным процессором в компьютере Apple II — первом массовом компьютере фирмы Apple эпохальной значимости собственноручной разработки Стива Возняка.
Процессор был 8-битным насколько это было возможно — единственный 16-битный регистр в нём был счётчик инструкций и все 16-битные операции надо было проводить в несколько 8-битных действий.
Например инкремент указателя на 1 байт в MOS 6502 выглядит примерно так:
Что еще очень характерно для данной архитектуры — это то, что указатели должны были располагаться в первой странице из 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 условных и безусловных переходов с возвратом из процедур:
Три опкода 0D,0E,0F не были использованы.
Сразу же обратите внимание на интересный момент — первая же инструкция 0x00 есть возврат в режим 6502.
Предполагается, что инструкции SWEET16 могут быть бесшовно «вплетены» в поток инструкций 6502 и между ними можно переключаться на лету. Активировать режим SWEET16 конечно нужно командой вызова процедуры перехода в этот режим, но выход из него есть первая же инструкция в этой архитектуре.
Если же HI не равен 0, то уже он обозначает код инструкции, а LO содержит номер регистра-операнда (0-15) следующих операций:
Здесь все регистры являются 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 и поэтому не испытывает никаких пенальти, но ничего о состоянии проекта сказать не могу.
Дешевый и сердитый 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 комментариев