Умные часы с Бейсиком на физическом 6502

Автор оригинала: NotArtyom
  • Перевод
  • Tutorial

Процессор 6502 существует более 40 лет и до сих пор используется в ряде встроенных систем. Компания WDC продолжает выпускать 65C02 и периферийные микросхемы серии 65Cxx. Автор обнаружил, что теперь они доступны и в корпусах PLCC и QFP, но эти варианты микросхем используются редко. Микросхемы же в DIP-корпусах более недоступны, поскольку спрос со стороны одних лишь самодельщиков слишком мал. Автор решил сделать самый маленький одноплатник на 6502, какой только сможет. Не исключено, что самый маленький из известных самодельных одноплатников на этом процессоре (несамодельные бывают и меньше, например, Тамагочи). В результате получилось устройство, к которому можно при желании разработать наручный корпус с ремешком. Дисплей взят от Nokia 5110, написана оболочка с красивым интерфейсом, и получились, возможно, единственные смарт-часы на 6502.

В часах установлены: процессор 65C02 с тактовой частотой в 8 МГц, микросхема 65C22, управляющая ЖКИ и опрашивающая кнопки на плате и внешнюю клавиатуру, дисплей от Nokia 5110 (84х48 пикселей), 32 кБ статического ОЗУ, 16 кБ ПЗУ в адресном пространстве. Напряжение питания — 3,3 В.

И самое главное: в качестве док-станции к разъёму на плате можно подключать матрицу клавиатуры от Commodore 64, получая что-то похожее на Seiko UC-2000 (обзор на Хабре):


Схема и топология печатной платы составлены в KiCad. Размеры двусторонней платы — 3х1,5 дюйма. Все компоненты — SMD, кроме PLCC-панельки, а также разъёмов для клавиатуры и ЖКИ.



Топология на иллюстрации — не в масштабе. Внешний вид платы до сборки:



После:



Архив (схема, платы, прошивка, и т.п.)

На часах можно запускать несколько встроенных приложений. Одно из них, G'Mon (Generic Monitor), представляет собой основной инструмент разработки и отладки. Он позволяет просматривать и редактировать содержимое памяти отдельными ячейками и фрагментами, переходить к программам, заполнять участки ОЗУ заданным байтом, перемещать фрагменты по адресному пространству. Версия монитора, применённая в часах — упрощённая, чтобы кроме неё в ПЗУ поместился EhBasic. Он туда едва влез, осталось всего ~100 свободных байт. Интерпретатор переделан таким образом, что его удалось объединить с ядром. Оно, в свою очередь, содержит все подпрограммы инициализации, работы с внешними интерфейсами, а также взаимосвязи всего имеющегося ПО. И ещё одно приложение — основное меню.

Значительный объём ядра занимает код, взаимодействующий с ЖКИ от Nokia 5110 по программно реализованному протоколу SPI через 6522. Подпрограммы WriteBYTE и Command отправляют на ЖКИ, соответственно, графические данные и команды. Поскольку аппаратного текстового режима нет, написаны процедуры отправки на экран символов. Знакогенератор хранится в ПЗУ и представлен двумя таблицами поиска: одна для старшего байта, другая — для младшего. Вместе они указывают на абсолютное положение начального байта знака в ПЗУ. Подпрограмму Write следует запускать после записи ASCII-кода в аккумулятор процессора, при этом он также используется в качестве координаты X для таблиц поиска. Подпрограмма вначале записывает ASCII-код в буфер экрана в памяти. Затем она ищет данные соответствующего тайла и устанавливает на него указатель. Выведя на дисплей 8 последовательных байт от указателя, она вызывает подпрограмму CCheck. Та программно проверяет положение курсора, и если экран заполнен, вызывает подпрограмму Scroll, смещающую изображение на одну текстовую строку. Поскольку чтение из контроллера ЖКИ автор не реализовал, текст индексируется согласно положению курсора и записывается в буфер в памяти. Подпрограмма Scroll выводит на экран три нижние строки из буфера в три верхние строки на ЖКИ, затем нижнюю строку заполняет пробелами. Оставшаяся подпрограмма для работы с ЖКИ — CReturn. Она ищет черех таблицу поиска начальное положение следующей строки, и если текущая строка — не нижняя, увеличивает положение курсора на единицу. Если строка нижняя — вызывает процедуру Scroll, и лишь затем завершается.

Клавиатура опрашивается через 6522 подпрограммой GetKey. Она считывает матрицу клавиатуры построчно и записывает байты в память. Если какие-либо биты оказываются нулевыми, она через таблицу поиска определяет ASCII-код нажатой клавиши. В основном код не содержит циклов, чтобы работать максимально быстро. Подпрограммы для преобразования заданных бит в индексы не используют таблиц поиска, но в результате код получился довольно крупным и малоэффективным.

Видео:


Автор больше не работает над этой прошивкой, он переключился на другие проекты. Он надеется, что код пригодится желающим управлять ЖКИ от Nokia 5110 с одноплатника на 6502. Соответствующие подпрограммы легко поддаются переносу в другое ПО. Важнейшими из них являются Write, Write_NS, Command, WriteBYTE, LCDInit, LCDClear, CCheck, CCheck_NS, CReturn, Scroll и SETCursor. Другие полезные подпрограммы — LCDHome и WriteBMP. В памяти необходимо разместить переменные LCDCursor, GTmp, GTmp5 и GTmp6, а также таблицу Screen длиной 84 байта. Помимо них, необходимы таблицы поиска CRTbl, CTableX и CTableY, а также растровые изображения Char и Char2 со всеми тайлами.

Если вы хотите создать другие наборы тайлов, используйте шаблоны из папки Assets. В GIMP экспортируйте растровое изображение в файл .data в формате RGB (не RGBX). На файл .pal внимание не обращайте, а файл .data поместите в папку BitConvert из архива. Запустите Convert.sh имяфайла.data для получения файла FONT.bin, который и будет набором тайлов.
  • +52
  • 15,8k
  • 6
Поддержать автора
Поделиться публикацией

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

    +2
    Интересно, чей интерпретатор зашит?
    +1
    Интересно, сможет ли работать с батарейкой?
      +3
      Разъём J4 сообщает, что да. А линейный стабилизатор U9 сообщает, что не так долго, как могли бы.
        +2
        Замена LDO здесь даст прибавку во времени работы процентов в десять, а вот замена 65C02 — раз в десять.
      +1
      Замена LDO здесь даст прибавку во времени работы процентов в десять

      Импульсный можно.
      Хотя, если предположить миллиампер 100 на всё это и работу от литиевого аккумулятора при среднем входном напряжении 3.7, то КПД и так довольно высокий.

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

      Самое читаемое