Войти
ФлеймФорумЖелезо

А если ли у нас ностальгирующие по MOS 6502? (2 стр)

Страницы: 1 2 3 411 Следующая »
#15
12:27, 29 ноя. 2017

Dexus
> Кстати я что-то не смог найти инфо о том в каких CPU умножение/деление
> появилось.

Из тех что встречались массово:
- 16-битный PDP-11 имел умножение
- 16-битный наследник сабжа (то есть 6502) WDC 65C816 не обзавёлся умножением. В SNES его клон Ricoh 5A22 умножение делал через отдельный контроллер через порты ввода-вывода.
- 16-битный Intel 8086 - обзавёлся умножением/делением сразу же
- 16-битная по ALU но 32-битная по архитектуре Motorolla 68000 обзавелась умножением сразу же.

По ARM-ам и всяким MIPS-ам лень проверять, но вообще насколько я знаю RISC-процессоры неохотно шли допуск умножения в базовую систему команд, уж больно оно было "сложным" в тех реалиях для "reduced instruction set" и даже когда вводили это были какие то отдельные выделенные под умножение регистры, чуть ли не сопроцессор.


#16
13:29, 29 ноя. 2017

=A=L=X=
А из 8мибитных получается вообще никто не умел?
В 16 получается что в основном умели.
Вообще программируя на z80, смотрел на 8086 как на буржуев, которым не приходится заморачиваться с реализацией этих простых арифметических функций. Куча сниппетов была по умножению регистров на константы, типа вот такого умножения HL на 14:
PUSH HL
POP BC
ADD HL,HL
ADD HL,HL
ADD HL,HL
AND A
SBC HL,BC
ADD HL,HL

#17
13:40, 29 ноя. 2017

P.S.
Вики говорит, что среди 8-битных процов в годы их популярности практически не было умножения, но два таковых процессора как минимум известны.
Это семейство микроконтроллеров от Intel - MCS-51 (8051) появившееся в 1980, но оно мне не особо интересно.

Зато еще раньше в 1978 появился Motorola 6809. Он мог перемножить два беззнаковых байта и использовался как в ПК так и консолях.
Технически это был эдакий переосмысленный Motorola 6800, не имеющий бинарной совместимости с ним, но архитектуры были столь похожи, что была совместимость на уровне ассемблерных программ.
И эта архитектура во многом была похожа на сабжевый MOS 6502 - и это неудивительно, ибо его сделали отколовшиеся от моторолы инженеры, причастные к разработке как раз Motorola 6800.
Но Motorola 6809 был не в пример ортогональнее, имел несколько 16-битных регистров, включая индексные X и Y, стек S и начало кадра стека U. Да даже два 8-битных аккумулятора A и B могли быть объединены в один 16-битный регистр D, который можно было 16-битно сложить с ячейкой памяти. Так что тоже была эдакая 8-битка с некоторой поддержкой 16-битности и вот умножением.

#18
13:54, 29 ноя. 2017

Кто-то ведь должен был вставить сюда это?

А тут подробнее об источнике https://www.youtube.com/watch?v=YRnnjoiSV-U

#19
14:01, 29 ноя. 2017

Dexus
> Вообще программируя на z80, смотрел на 8086 как на буржуев

угу

Dmitry_Milk
> Кто-то ведь должен был вставить сюда это?

а где там было ещё про лисп ?

#20
14:07, 29 ноя. 2017

=A=L=X=
> Но Motorola 6809 был не в пример ортогональнее, имел несколько 16-битных регистров, включая индексные X и Y, стек S и начало кадра стека U.
Что-то напоминает это мне как раз 8080/z80, только в чём-то даже круче. Заметные элементы 16битности и два индексных об этом довольно однозначно говорят.

#21
14:15, 29 ноя. 2017

Dexus
> Что-то напоминает это мне как раз 8080/z80

Нет, их с сабжем можно замести в одно семейство с Motorola 6800 - благо те же инженеры делали.
Основной спектр операций происходит через аккумулятор-память, при этом очень много режимов адресации где как правило и фигурируют регистры X, Y - это основное место их появления, с очень большим упором на однобайтовую адресацию к так называемой zero-page.
Как выше уже сказали zero page во многом можно воспринимать как большой банк несколько медленных регистров. В том же 6502 косвенная адресация всего 64-кбайтного пространства была возможна только через слово которое лежит в zero-page, пример этого в первопосте и находится.
Конечно 6809 был круче - но у него эти тенденции сохраняются, хотя он конечно намного навороченнее 6502.

#22
14:27, 29 ноя. 2017

=A=L=X=
> 6502.

ты его в руках держал ? я Z80 держал

#23
14:36, 29 ноя. 2017

innuendo
> ты его в руках держал ? я Z80 держал

6502 я держал в руках внутри денди.
Z80 ожидаемо внутри спектрума.
если последний позволял к нему прикоснуться с точки зрения программирования, то первое конечно нет.

#24
17:34, 29 ноя. 2017

Гы, почитал про эти 8-битки и проявилась забавная картинка инженерных метаний:

Все процессоры ниже будут обладать 16-битным Program Counter (PC) и 8-битным регистром флагов, поэтому я про них расписывать отдельно не буду.

Motorola 6800

В 1974 году Motorola создаёт его.
В сущности у этой 8-битки было два 8-битных регистра-аккумулятора A и B, а так же два 16-битных регистра X и SP.
Большинство команд происходили по принципу аккумулятор операция= память. Даже A+=B и A-=B были отдельными опкодами, т.к. не попадали под этот шаблон.
16-битные регистры при этом были и неортогональны и сильно ограничены. Их можно было загружать/сохранять, инкрементировать/декрементировать и использовать по своему назначению. В стек можно было сохранять/загружать аккумуляторы и адрес при переходе или прерывании, а индексный X мог участвовал в самом навороченном режиме адресации.
Почти все операции происходили с памятью, но видов адресаций было не очень много:
- непосредственный операнд (1/2 байта после опкода)
- операнд по непосредственному адресу в zero-page (1 байт)
- операнд по непосредственному адресу в любом месте памяти (2 байта)
- операнд по адресу X плюс 8-битное-смещение (1 байт после опкода)

Вся вот эта вот катавасия привела к тому, что процедура memcpy на этом процессоре выглядела вот так:

        ; memcpy --
        ; Copy a block of memory from one location to another.
        ; Called as a subroutine, note return to saved PC addr on exit
        ; Entry parameters
        ;      cnt - Number of bytes to copy
        ;      src - Address of source data block
        ;      dst - Address of target data block

        cnt         dw      $0000       ; sets aside space for memory addr
        src         dw      $0000       ; sets aside space for memory addr
        dst         dw      $0000       ; sets aside space for memory addr

        memcpy      public
                    ldab    cnt+1       ;Set B = cnt.L
                    beq     check       ;If cnt.L=0, goto check
        loop        ldx     src         ;Set IX = src
                    ldaa    ix          ;Load A from (src)
                    inx                 ;Set src = src+1
                    stx     src
                    ldx     dst         ;Set IX = dst
                    staa    ix          ;Store A to (dst)
                    inx                 ;Set dst = dst+1
                    stx     dst
                    decb                ;Decr B
                    bne     loop        ;Repeat the loop
                    stab    cnt+1       ;Set cnt.L = 0
        check       tst     cnt+0       ;If cnt.H=0,
                    beq     done        ;Then quit
                    dec     cnt+0       ;Decr cnt.H
                    ; loop back and do 256*(cnt.H+1) more copies (B=0) 
                    bra     loop        ;Repeat the loop
        done        rts                 ;Return
Недостаток регистров жёстко угнетал и довлел. Для индексации двух разных участков памяти X приходилось постоянно загружать и сохранять в/из (хотя бы) zero-page.

MOS 6502

Через год после разработки 6800, в 1975-ом группа инженеров из его команды уходит из Motorola и присоединяется к компании MOS Technology.
С новым вИдением они делают другой микропроцессор MOS 6502, который однако явно пропитан духом предшественника.
Видимо чтобы быстро копировать хотя бы небольшие участки памяти в этом микропроцессоре происходит перестановка аккумуляторов и индексных регистров:
Все регистры (кроме PC) становятся 8-битными.
Аккумулятор остаётся один - A. Зато индексных регистров становится два - X и Y.
Стек после ужатия указателя на себя до 1 байта может адресовать только вторую страницу памяти. Страницами во всех этих процессорах называются блоки по 256 байт.
Всё так же основная масса команд укладывается в схему аккумулятор операция= память, но число режимов адресации прибавляется.
Так, например, косвенная адресация может взять адрес из памяти в zero-page и прибавить к ней индексный регистр (работает только для регистра Y), а может взять 16-битный адрес по из zero-page по адресу X+байт_смещения и работать с операндом по этому адресу (работает только для регистра X).
Если короткие блоки до 256 байт с помощью двух индексных регистров можно было уже копировать в довольно коротком цикле, то 8-битная природа всех регистров, включая индексные мешала работать с произвольными диапазонами.
Поэтому процедура копирования произвольного куска памяти уже выглядела вот так:
(код из первопоста)

; Move memory down
;
; FROM = source start address
;   TO = destination start address
; SIZE = number of bytes to move
;
MOVEDOWN LDY #0
         LDX SIZEH 
         BEQ MD2 
MD1      LDA (FROM),Y ; move a page at a time 
         STA (TO),Y
         INY
         BNE MD1
         INC FROM+1
         INC TO+1
         DEX
         BNE MD1
MD2      LDX SIZEL
         BEQ MD4
MD3      LDA (FROM),Y ; move the remaining bytes
         STA (TO),Y
         INY
         DEX
         BNE MD3
MD4      RTS

Хрен редьки если и получился немного слаще, но привкус геморроя на губах несомненно оставался.
Поэтому в 1979-ом году снова Motorola разрабатывает духовного наследника 6800:

Motorola 6809

Наследник получился воистину духовный - у него не было бинарной совместимости с 6800, но зато была совместимость ассемблерного кода - программы на 6800 легко пересобирались под новый процессор. Забавно было то, что при этом у него было меньше опкодов команд, но из-за их высокой ортогональности они легко покрывали ассемблерный синтаксис предшественника с потрохами.

Итак, здесь мы возвращаемся к двум 8-битным аккумуляторам A и B, но плюс к тому в некоторых командах (сложение и вычитание) их можно объединять в один 16-битный аккумулятор D.
Присутствуют так же 16-битные индексный регистр X и регистр стека S, но так же добавился индексный регистр Y и регистр базы стека U.
Ортогональности команд прибавилось, но основной принцип остался тем же: аккумулятор операция=память было примативом.
Добавились такие плюшки как прибавление к X регистра B (заметьте, что к 16 битам прибавлялись 8) и сохранение/загрузка из/в любого из стеков (S или U) любого регистра.
Но главное - режимов адресации заметно прибавилось. Вообще, даже больше стало чем в 6502.
Во первых - адрес начала zero-page можно было задавать на начало любой страницы 8-битным регистром Direct, поэтому zero-page адресация стала называться direct-page.
Во вторых - появилась адресация относительно PC, что позволяло спокойно теперь писать полностью relocatable программы.
Самый сложный пожалуй режим адресации был такой: содержимое индексного или стекового регистра + содержимое одного из аккумуляторов давало адрес где находится адрес операнда.
Ну и в четвертых - с индексными или стековыми регистрами можно было еще сделать пост-инкремент или пре-декремент.

В общем со всеми этими плюшками и процедура memcpy должна была стать совсем короткой и опрятной, но я не нашёл исходника.
Надо еще заметить, что в связи с большим количеством регистров и адресаций среднее количество байт на инструкцию тоже подросло и нередко составляло 2 даже без адресации zero-page.
Например инструкция TFR - transfer, которая передавала данные из любого регистра в любой содержала вторым байтом после себя два 4-битовых поля - какие собственно регистры являются операндами.

#25
17:46, 29 ноя. 2017

=A=L=X=, интереснейший обзор, спасибо!
Маленький офф. Раз уж зашла речь о конторе Motorola, то забавно вспомнить историю ее названия. Ее первый продукт - радиоприемники для автомобилей, для которых моторольщики придумали название мотор-ола, по аналогии с ради-ола. Потом, кроме моторолл, моторолла стала выпускать и другую электронику, а название, как говорят на ее родине, прилипло.

#26
19:05, 29 ноя. 2017

Случайно наткнулся на вполне субжевую тему :
https://en.wikipedia.org/wiki/Atari_Lynx#Technical_specifications
Один из самых умопомрачительных обвесов 6502, включая сопроцессор для 16-битного умножения и деления!

#27
20:37, 29 ноя. 2017

ZeebaEata
Хммм... 2d консоль но с произвольным количеством произвольно трансформируемых спрайтов... Надо будет провентилировать ее для темы про блеск и нищету 8/16 бит...

#28
21:20, 29 ноя. 2017

=A=L=X=
> Зато индексных регистров становится два - X и Y.

ох уж эти индесные регистры, помню как страшную тайну узнал про недокументированные команды для z80 :)

половинки всякие там ... всё же какое было время

#29
22:04, 29 ноя. 2017

Ассемблер все равно значительно отличается от X86.
Возник вопрос.
Если MOS6502 был 8 битным процессором, а разрешение PAL 720x576, то как NES умел оперировать с координатами больше чем 255? Значит short там все таки был?

Страницы: 1 2 3 411 Следующая »
ФлеймФорумЖелезо