Как стать автором
Обновить

Комментарии 69

А почему именно 6502? Есть же 580ВМ80, Z80…


И правда...! :)

Судя по всему, человечество достигло такого уровня развития, что двигаться назад и разгребать старые микросхемы не менее интересно, чем изобретать новые.
Я начинал с 6502 на ПЭВМ «АГАТ»
Да, было время… ИКП, КПОН, «Рапира», Бейсик-АГАТ.
Тоже помню 6502. Хорошо помню. Он поистине ужасен. Там всего 3 регистра — A, X и Y, причем они 8-битные. 16-битовых операндов нет, 16-битной адресации памяти тоже. Когда у меня появился Синклер я продолжил изучение ассемблера на Z80, а о 6502 просто забыл как о страшном сне.
6502 самодостаточен ;) А «когда появился Синклер» то был да, шаг вперёд. Но только из-за доступности проца в нашей стране. Отсутствие прямой 16-битной адресации спокойно заменяется аж тремя вариантами: абсолютной индексной, косвенной предындексной и косвенной постиндексной, на выбор.
Ну и до кучи, развитие линейки зэтки как-то приостановилось, а серия 63хх/65хх/68хх продолжает развиваться.
В 6502 всего 6 регистров: общего назначения A, индексные X и Y, статусный P, указатель на стек S (относительно $100) и указатель на текущую выполняемую инструкцию (16-битный, кстати). Кроме того, в некоторой степени уникальной особенностью адресации является то, что нулевая страница памяти носит специальный статус и позволяет использовать каждые ее 2 последовательных байта как 16-битный регистр, в том числе адресовать с него напрямую или модифицировав 8-битным индексным регистром.

Еще, насколько помню, относительно широко был распространен трюк с самомодифицирующимся кодом типа такого:

	STX mod1+1
	STY mod1+2
mod1:	LDA $0000    ; здесь в build-time будет AD 00 00, а run-time последние два байта будут заменены на X и Y

Это 4+4+4 такта вместо 3+3+6, если то же самое делать напрямую с адресацией в zero-page, зато экономит место в zero-page и иногда 4+4 будет быстрее, чем 3+6.
А что там с 16-битными операциями вообще (кроме указателя стека)? Где то вроде слышал, что их тупо нет. То есть если в том же z80 можно к аккумулятору прибавлять какое-то восьмибитное значение и в паре получать 16-битное, то на 6502 такого не существует. Хочешь 16 бит — будь добр программно складывай.
Одной командой — не существует. Простые штуки — сложения там всякие 16-бит + 8-бит (с переносами) делаются тремя командами, т.е. что-то типа ADC + BCC + INC (в зависимости от адресации — это будет где-то от 9 до 14 тактов, насколько я помню).

У Apple II в ROM есть написанные Возняком (причем это было чуть ли не первое, что им написано) subroutines для 16-битной арифметики — причем там всякие умножения-деления хитрыми способами есть. У NES тоже что-то такое было. У всяких расширенных клонов 6502 есть на эту тему тучу всяких дополнительных опкодов.
Проверил — вру. На самом деле Возняк написал subroutines для floating point арифметики — я вот о них — 6502.org/source/floats/wozfp3.txt

Целочисленные все-таки достаточно простые, их в массе своей инлайнили макросами, т.к. оборачивать это в полноценный вызов подпрограммы — это лишних тактов 20-25-30.
Да, да. Я относительно dendy и присматривался когда-то в детстве. Денди работает на что то около ~2Mhz, в принципе можно кубики крутить по табличкам. Но 1 Mhz все-таки как по мне медленно совсем.
Вот, ваще, прям ацки: rghost.ru/55424137 Может же кто-то… Или, вообще, райкастер с текстурированием, затенением и ваще: rghost.ru/55424160
Я, если честно, в шоке от этих двух программ…
Вчепятляет, аха — правда там в большинстве своем именно всякие NES-only tricks с быстрыми выводами на экран через всякие спрайты и т.п., сам 6502 тут практически не при чем.

«Крутить по табличкам» — можно, но, опять же, в NES это делать сильно легче, т.к. там нулевая страница вся куда как более свободная, там, насколько я помню, под вектора и всякие мэппинги занято байт 20-30, что ли. Ну и, опять же, вывод легкий, линейный и быстрый — без этой всей фигни со stacked rows и переписыванием руками всей памяти.

Впрочем, AFAIR, демки с крутящимися кубиками были и на Apple II, только не shaded, а контурные. Там еще очень смешные характерные линии такие — они современные брезенхемам ну совсем не соответствуют ;)
Установив 65С02, подал на него полную частоту с кварца, 18,432 МГц. Аппарат нормально работает, по крайней мере по СОМ-порту общаться можно (только проц греется). А вот ВВ55 отвалился :(, он работает максимум до 5 МГц, и только избранные 82С55 дотягивают до 8. Тем более, что 1 МГц 6502 равны 3 МГц Z80.
Простите, может я запамятовал за давностью лет, но как я помню Z80 это был тот же 8080 (он же 580) только на стероидах и с «Hyper-threading»… Ну точнее с вторым набором регистров, который при помощи соединения вывода счетчика с немаскируемым прерыванием и тривиальным обработчиком давал почти полноценную «двупоточность». Только знай себе не используй специфичных для z80 команд да вежливо обращайся со стеком.

Так вот — а в чем «сложность программирования» состоит не напомните?
Z80 — это вечный рулез. Во-первых, одно питание, во-вторых, выше чем у 8080 тактовая частота, в третьих в 2 раза больше регистров, в-четвёртых (и этот пункт стоит первых трёх), крутая команда LDIR!
Тем не менее 6502 обгоняет зэтку на одинаковых частотах, ибо практически все команды выполняются за один цикл, а не за 4-5. Но, давайте согласимся, что в данной конструкции говорить о внутренних различиях пока смысла нет, ибо всё запрятано за Бейсиком, чего для работоспособности вполне хватает.
По-моему, чисто психологически все скорее будет упираться в 300 бод, нежели даже Бейсик.
Ну опубликованный вариант работает на 57600, как это видно на скриншоте. Можно продолжать в том же духе, но хочется на чём-то сохранять программы. Пока остановился на «кассетном» варианте (разумеется, что под это подпадают все диктофоны, хоть плёночные, хоть твёрдотельные). Тем более, что в любой момент возможно перепрограммировать УАРТ «влёт» на любую приемлемую скорость. Ну и нужны-то, по сути, эти 300 бод только для запуска и отладки программы. Для работы контроллера, при отключенном терминале, это неважно.
Есть же параллеьный интерфейс, почему бы в виде внешней памяти не использовать старую MMC или SD-карточку? или даже CompactFlash или старый ноутбучный винчестер с IDE(мегабайт на 100) в PIO-режиме — на него как раз хватает одной ВВ55.
Ответ — нежелание дописывать код :), ибо есть СОМ-порт и его вроде бы вполне достаточно. Хотя, если перевести схему в разряд компьютеров (добавлением, скажем, 6538 в качестве выхода на монитор и подцепив ASCII-клаву), смысл в отдельном скоростном устройстве хранения будет. Но это оставлю на будущее…
Тем более, что команды LOAD и SAVE заглушены, т.е. для них ещё можно дописать подпрограммы.
SD-карточка же в последовательном режиме работает, нет?
емнип режимы последовательного порта и SPI различаются
RS232/UART и SPI? Да, разумеется. Но само название SPI (Serial Peripheral Interface) намекает, что интерфейс последовательный.
Ну что..., значит надо вставлять в схему чип 6522 и дописывать подпрограммы…
Можете эмулировать SPI через Bit Bang на параллельном интерфейсе, кстати (ВВ55 же).
Просто не хочется ВВ55 для этого пользовать, пусть на общение с внешним миром остаётся. А вот для 6522 сорцы есть, тем более что он уже содержит некое подобие SPI-шинки
там целых 3 порта, отвести половину одного из них чисто под карточку, остается еще дофига выводов под внешний мир.
Последовательном. Там SPI, интерфейс требует 5 линий для подключения — его проще всего эмулировать дрыганием ног параллельного интерфейса. Темболее скорость там не нужна и нет никакого резона городить аппаратный SPI(а есть ли такое решение на столь старых микросхемах?)

Карточку использовать для хранения подпрограмм, зачем их каждое включение через терминал гонять? Не надо даже FAT стандартную поддерживать — использовать FAT попроще а саму карточку запаять туда намертво.
Есть решение для «старых» микросхем, sbc.rictor.org/65spi.html Но это Ксилинкс, где его только брать… Ах да, это ж еще и Ось хотя бы простейшую надо, типа DOS65.
«монитор». Разве такая большая проблема?
Монитор имхо это шаг назад. Плюс кто-то его напишет или адаптирует? Аналогично, есть заглушенные команды Бейсика, можно сделать их расширение. Есть ещё место в ПЗУ, даже три пустые страницы, которые можно выбирать аппаратно… Но смысла пока в этом не вижу, ибо иначе разговор пойдёт о нормальном компе, а не о контроллере, который пока меня вполне удовлетворяет функциональностью.
Вот именно что пока. Монитор или подобная оболочка — это та базовая функциональность которая позволит удобным образом организовывать расширение функциональности.
В Спектруме ж не было монитора. Был расширенный Бейсик. Но если кому-то захочется Монитор, то можно взять от KIM-1 и доделать с учётом архитектуры.
О да… LDIR шикарная команда. Практически целая процедура в одном опкоде.

Еще из крутых команд DJNZ в микроконтроллерах MСS-51.
z80 сильно неортогонален относительно регистров — надо помнить какие операции над какими регистрами можно делать. Плюс много всякой попсни типа djnz и ldir — с одной стороны удобно, с другой — ограничено применимо. Плюс непредсказуемое количество тактов на команду.

На 6502 я не писал, но с виду у него всё более прямо и понятно сделано — ближе к RISC, а значит — проще программировать.
Я много лет работал с Z80 и немного — с 6502 (начинал с 6502 на «Агатах»). Считаю, что Z80 более прогрессивный, чем 6502, по следующим причинам:

1) У 6502 стек ограничен всего 256 байтами. Это ограничивает возможности реализации рекурсивных программ, многозадачности, теневых мониторов.

2) Индексная адресация у Z80 имеет 16-битную базу (указатель) и 8-битное фиксированное смещение в командах вида LD A,(IX+offset), тогда как у 6502 наоборот — 8-битный указатель и 16-битное смещение в командах вида LDA addr,X. В результате на Z80 легко реализовать массивы структур (AoS) и объектно-ориентированное программирование. В регистре IX или IY размещается указатель на объект или структуру, а в инструкциях доступа — смещение до члена объекта.

С индексной адресацией 6502 лучшее, что можно сделать — это SoA (структура массивов). Доступ к элементам производится инструкциями вида LDA addr+member_offset, X, где addr — адрес массива, member_offset — смещение до члена, X — индекс элемента массива, умноженный на размер структуры. Подобный способ все равно ограничивает весь массив 256 байтами, тогда как на Z80 реализация AoS ограничивает 256 байтами только размер одной структуры, а не всего массива. Также не требуется умножать индекс на размер структуры.

Это на самом деле очень серьезное ограничение, я встречался с методом SoA на 6502, анализируя код музыкального плеера с Atari XL.

Самомодифицирующийся код иногда позволяет выйти из положения, но не всегда код размещается в ОЗУ. На тех же Агатах некоторые области ОЗУ были защищены от записи, так что для них тоже недопустима модификация кода во время исполнения. К тому же, на Z80 тоже можно применять трюки, связанные с самомодификацией кода.

3) Нулевая страница 6502, которую иногда также называют «набором 256 регистров». Как правило, многие ячейки нулевой страницы уже используются системным ПО. Программисту нужно знать, какие из них свободны. Потому что сохранять и восстанавливать все 256 ячеек между вызовами системных функций — слишком долго. У Z80 регистров меньше, и сохранять их не такая проблема. К тому же системное ПО на Z80 обычно не полагается на сохранность значений регистров при исполнении кода пользователя. Синклерский бейсик «блокирует» только один регистр (IY).
У 6502 стек ограничен всего 256 байтами

Пока нигде не встречал стека большей величины. Обычно хватает меньших размеров. По крайней мере больше 256 не попадалось.
Вот из-за тех самых «стероидов» в виде кучи внутренних регистров. Здесь же в самом процессоре всего три основных регистра (вместе с аккумулятором), все восьмибитные. Зато присутствует шикарный выбор способов адресации. Просто я пользовал ВМ80 (Специалист), Z80 (Спектрум), — не понравились именно по внутренностям. Это сугубо ИМХО.
Так а в чем проблема-то с набором регистров? То, что нельзя запросить, с каким набором мы сейчас работаем — да. Но эта задачка решается тривиально. А Куча внутренних регистров как раз позволяет отказаться от ОЗУ в большом спектре задач. имхо
Вы молодец. Ностальгия. А трубчатые конденсаторы добавили «теплоты». Даже не побоялись 155 серию использовать. Респект.
Действительно, сейчас все упирается в… подключил питание к Ардуино, скачал скейтч…
Детям даже игрушки разбирать не интересно — разломал… там одна большая микросхема и провода. Где же развитие?
Я, например, в детстве, пока всем родственникам не поломал телевизоры и радиоприемники, телемастером не стал.
Ну это у кого на что фантазии хватает. У кого скачать скетч, у кого — написать его, у третьего — обвесить ардуину всякой всячиной много покруче, чем обвес МП 6502 для минимального старта.
В применении 155-й серии есть ещё одна причина, о которой скромно хотел умолчать, но… Уже не те глазки, чтобы СМД не то чтобы паять, а вообще ощущать ;) А ДИПы как-то проще и роднее.
Тогда можно 1533 брать — будет меньше ограничений по частотам и нагрузочной способности.
Ну так по возможности 1533 и применил, просто выражение «155-я серия» как бы всё охватывает ;)
У меня валяется без дела 8085 от Тошибы. Радио-86рк как бы сложновато по мне, да и вывод на монитор не нужен особо, и клавы нет… А вот что-то вроде сабжа я бы собрал на нем. Проблемы две — 1) я не знаю 8080 асма (совсем) 2) я не умею так красиво укладывать мгтф на плате снизу. У меня получается клубок проводов в хаотичном порядке, примерно так:
image
Насчет АСМа это не проблема, там очень простой ассемблер просто разновидности инструкций варьируются. Не сложнее микроконтроллера атмеловского, система команд в некотором роде даже похожа, но есть такие специализированные команды которых нет у МК(выше упоминалась DJNZ и еще одна команда для копирования целых блоков памяти одной командой).
Для лучшего понимания можно сделать табличку с кодами команд, тогда и ассемблер становится гораздо понятней и логичней.
Но есть один ньюанс, у Z80 есть два вида инструкций LD и MOV но почему-то в большинстве компиляторов эти мнемоники заменили на одну — MOV что сильно сбивает с толку. Зачем это сделали? чтобы программистам меньше слов учить?
А я готов был сварганить для девайса ASCII-клавиатуру, тем более, что это пара микросхем и четыре транзистора. Но отсутствие возможности найти кнопки зарезало это желание накорню. Так что в терминале придётся довольствоваться обычной PS/2-клавой с конвертером в ASCII (это был спойлер).
Укладывание… более тонкий МГТФ и пара пинцетов… Хотя мне больше нравится как на zx.pk.ru товарищ сваял Микро-80, вот его усидчивости я завидую.
Да, я тоже завидую… Очень красиво все сделано, могут же…
Несмотря на техническую навороченность, эти железки до ужаса скучные. Посудите сами: подал питание, загрузил программу,… и всё! А что делается внутри кремния, установленного на печатную плату — сие нам не ведомо.

Не согласен с этим. Вопрос подхода, ваш девайс в корпусе точно также могут использовать — подали питание и все. То, что вместо памяти на кристалле вы используете отдельный чип не коррелирует со знанием того, как работает железо, точно также можно квадратики соединить на схеме по даташиту (благо, типовая схема есть), и радоваться.

Если не брать ардуину, а взять отдельный микроконтроллер можно с тем же успехом подключить внешнюю память и на глубоком уровне понимать, как работает система.
На АВРке так и вовсе сделали эмулятор АРМа (да еще и контроллер DRAM!) и запустили линукс.
Так что я не думаю, что достаточно взять старые микросхемы, чтобы решить проблему незаинтересованности людей и подтолкнуть их к изучению глубин, а не поверхностному тырканью.
Не, ну тут как бы проц, а не контроллер. Тут если подать на него питание — то ничего не произойдет, нужно прикрутить память какую-то откуда он будет брать ком-ды на исполнение. Это раз. Два — если хочется «подергать ногой и помигать диодом», то придется делать какой-то простой порт ввода-вывода. Ну и тд. А авр взял, подал питание и дергай ногой. Без всяких там доп микросхем.
Дык я про собранный девайс. Он-то уже контроллер.
АВР без доп. микросхем довольно мало на что способен. Всяко будет периферия. А уж если говорить о более мощных, наподобие STM32F4 так там и память внешнюю часто требуется прикрутить, физические уровни интерфейсов и прочее. Я ж говорю:
>а взять отдельный микроконтроллер можно с тем же успехом подключить внешнюю память
Взять один чип или кучку? Вот и говорю про то, что с одним чипом неинтересно, чистая заливка программы и никаких возможностей модифицирования. А если их несколько, да ещё и связанные между собой, то какой-то игровой момент сохраняется ;)
Хм, не могу понять, что такого сложного в моих фразах
>можно с тем же успехом подключить внешнюю память
>Всяко будет периферия. А уж если говорить о более мощных, наподобие STM32F4 так там и память внешнюю часто требуется прикрутить, физические уровни интерфейсов и прочее.

Вы их намеренно не читаете, фиксировав для себя «микроконтроллер» = «один чип, АВР»?
image

Я сейчас даже безотносительно изначальной темы, я просто не понимаю, я недостаточно ясно выразился? Почему уже второй человек мне говорит про одиночную АВРку?)
«Контроллер» имею в виду как окончательную собранную конструкцию, без оглядки на количество применённого железа. АВР-ка — это уже вся моя плата, запихнутая в отдельный чип. Так что Вы выразились вполне понятно и логично, но привычка привязываться к теме топика осталась, уж звиняйте ;).
Ну не вся, я про это и говорю. Микроконтроллер далеко не всегда может работать без периферии, для интересных применений, с дисплеями и прочим, чаще всего требуется дополнительная периферия, как на фотографии выше. Собственно, на фото — процессорный модуль, он вставляется в хостовую плату, содержащую необходимую схематику для работы с дисплеем, выход на эзернет, GPIO и т.п.
Полагаю, проектирование и сборка подобного компьютера с нуля, вместе с установкой туда uCLinux — занятие намного более серьезное, чем пара кликов в ардуинчатой IDE и не уступает копанию в старых микросхемах.
Собственно, изначально моя идея в этом и состояла — что можно и с использованием современных микросхем разобраться в железе на очень глубоком уровне и, напротив, даже взяв старые, бездумно перекопировать схему)
Таки да, согласен. Но, как я упомянул выше, мне с отдельными ДИП-ами работать и проще, и удобнее. Да и поменять одну ДИПовскую микросхему удобнее, чем СМД или целую плату.
Тут еще один нюанс, касаемо линуксов и аналогичного — а оно надо для большинства применений? И в удобстве ли дело? И зачем нам мерседес для поездок в булошную в соседнем доме? Для скромной лаборатории достаточно и скромного процессора, если задача стоит более серьёзная, то тогда и линукс, и цельные модули…
Хм. Я так понимаю, целью создания вашего девайса было развлечение, а не «большинство применений» — ну вот затем же и линукс)
Эдакий современный аналог спектрума сделать. Да и кодить под него намного удобнее. Если это устройство в итоге работает как PC в той или иной мере, однозначно удобнее будет с линуксом на борту, давая возможность подгрузить свои модули с той же SDшки. Или с перфоленты)

А что до промышленных применений — ну тут надо по задаче смотреть, чаще RTOS требуются, если брать какую-нибудь мелкую то получается что-то среднее, между кодингом под голое железо и кодингом под более распространенную ОС — абстракция от некоторого оборудования есть, механизмы IPC и тасков/тредов есть, а вот с поддержкой железа по-прежнему придется руками разбираться. И протоколы ручками реализовывать. А линукс на порядки более удобен в разработке и поддержке ПО, безусловно — особенно, если речь идет о поддержке какой-то стандартной периферии или протоколов. Если не требуется предсказуемое время реакции (а, в последнее время, даже если требуется, но гарантированно будет достигнуто в 90 процентов случаев за счет частоты процессора), но требуется работать с USB-периферией, какими-то спец. микросхемами, под которые уже есть драйвер, разбирать пакеты TCP, процессить PDF и т.п., то Линукс — лучший выбор. Потому что все это уже реализовано и требует только небольшого допиливания.
Да, это и развлечение, и ностальжи, но также и новый девайс в лабораторию, а также в радиостудию (уже на праздниках Аюша управлял вещанием интернет-радиостанции)
Вот это поддержать не могу никак. Разлечение — дело святое.
Но намеренно использовать устройство, надежность которого невероятно снижена (за счет дип-корпусов, за счет проводных соединений, за счет макетки) — это очень опрометчивое решение. Поэтому в лабораторию я уж лучше ардуину поставлю, а еще лучше — одну из плат на STM32, чтобы не искать потом какой из пары сотен проводков стал плохо контачить, а какой — давать наводки на соседний порт.
Для реальных применений нужна надежность и минимум деталей, что мало пересекается с проектами для развлечения, где главное — получить удовольствие от процесса.
Ну за надёжность своей работы я отвечаю ;) и мощности конструкции вполне хватает.
Макетировать платы с помощью МГТФ, причем так аккуратно — это искусство и надо иметь талант. Никогда не получалось так красиво на макетке сделать :(
Разведено красиво, но за качество пайки в ряде мест меня мой электронщик в институте паяльником-бы пришиб.
Господа! Кому нравится «няшность» регистров 6502, и кто фанат STM- прошу любить и жаловать STM8 у него похожий набор регистров )
Красивая разработка. Жаль, нетехнологично. Присоединяюсь к тем, кто восхищается вашим талантом монтажа на МГТФ. Но, может, лучше развести печатную плату?
Поскольку делалось только для себя, то МГТФ был лучший выход. Однако если кто-то сможет уделить время и сделать хотя бы разводку для ЛУТа — опубликую под его авторством.
Другой вопрос в том, что описанное — только заготовка. Можно выкинуть буферы, можно заменить одну ИД3 на ЛА2, можно не ставить ВИ53, короче — кому что понадобится. И делать ради этого несколько вариантов разводок…
Одну разводку. Хочешь ставь, не хочешь — не ставь или перемычки. В конце концов, можно сделать гибридное подключение — развести основные цепи печатным монтажом(шины данных и управления, стробы свести рядом к одному полю чтобы можно было реализовать свой дешифратор адреса по необходимости)
Кто возьмётся? ;) Я уже терминалом занят…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории