Форт-система для смарт-карт AtMega163+24c256Выложил ее на сайте Пирамида, посвященном спутниковому телевидению. Здесь :
http://viaccessfree.biz/forum/showthrea ... post718924Итак, Форт-система для смарт-карт. Зашивается в смарт-карту, там и работает.
Общение с ней происходит через терминал. Через принятый для работы со
смарт-картами Phoenix-интерфейс, который подключается к COM-порту.
Терминальные программки для MS-DOS..Win-98 прилагаются. Для более поздних
Windows надо бы написать оконную терминальную программу, да у меня руки не
дошли. Одна из терминальных програмок предназначена для общения с картой,
а вторая для сбрасывания ей на компиляцию текстовых файлов. Исходники
прилагаются.
В Форт-системе используется механизм самоперешивания флеш кодом из флеш
(бутлоадера), который имеется у процессоров AtMega. Т.е. если вы при
работе с данной Форт-системой наберете в терминале
: HELLO ." Hello, world !" ;
то это слово сразу же скомпилируется во флеш.
Откат скомпилированного производится словом MARKER
Форт-система 16-разрядная. Соответствует стандарту ANS-Forth, за исключением
словарей. Я не стал делать стек словарей, поскольку у процессора на борту итак
совсем мало ОЗУ и реализовал некий гибрид словарей из Forth-79 и FIG-Forth.
А точнее сделал так, как прочел в книге Баранова и Ноздрунова.
Шитый код в Форт-системе подпрограммный. Оптимизатор кода ограничивается
вставкой однословного rcall там где это возможно вместо двухсловного call.
Словарь Форт-системы ведется во встроенной в карту 24c256, в самом ее хвосте.
Поэтому после написания приложения он отсекается автоматически. Его можно
стереть, а можно про него просто забыть.
Форт-система состоит из двух частей. Первая часть написана на ассемблере.
Она содержит все примитивы, которые определяют быстродействие системы и
минимальный набор слов, обеспечивающих Форту возможность самораскрутки.
Вторая часть Форт-системы написана на Форте. В ней все слова расставлены в
таком порядке, чтобы каждое последующее слово требовало для своего определения
только слова из предыдущих. Т.е Форт-слова выстроены в порядке самораскручивания.
Для сборки полной Форт-системы вторая часть должна быть скормлена через
терминал на компиляцию первой.
Форт-система проиллюстрирована конкретным приложением для смарт-карты.
А именно - пиратской прошивкой, которая открывает канал MEZZO со спутника
HotBird 12245H идент 007400 системы условного доступа Виаксесс.
Форт-система содержит массу программистской шизы. Например
- Перешивание флеш кодом из флеш идет страницами. Т.е. страница в 128 байт
целиком стирается, а потом в нее прошиваются новые данные. Но менять-то мне
нужно, как правило, только один байт. Программист, начитавшийся Дейкстры,
обязательно задействовал бы для этого дела буфер в ОЗУ 128 байт длиной. Тем
более, что и документация на AtMega163 о том недвусмысленно говорит.
Мной же используется
безбуферный метод перешивания единственного байта, пусть
и посредством перезаписи целого блока. Метод шизовый, я его лично придумал.
Буфер я выстроил не в ОЗУ, а на защелках внутренних регистров карты, отвечающих
за запись. Благодаря интуитивному пониманию процессов, что при этом происходят.
- В коде Форт-системы используются rjmp-ы с заворотом по адресному
пространству. rjmp из самых младших адресов до самых старших не дотягивается.
Ну так и не надо дотягиваться. Чтобы попасть в самый старшие адреса из
самых младших нужно прыгать в отрицательные адреса. До них-то рукой подать.
Адресное пространство ведь сложено гармошкой.
- Ассемблерный код написан так, что получающийся после его компиляции HEX
двойного назначения. Он - есть прошивка и для флеш AtMega163 и для 24c256.
- Ассемблерный код всюду оптимизирован самым жесточайшим образом. Повсеместно
код использует побочные эффекты предыдущего кода ради экономии такта и байта. В
результате код с трудом читаем и почти не модифицируем. Все переплетено так,
что тронь и рассыплется. Дейкстра сразу идет лесом.
- В той части системы, что написана на Форте, в одном месте используется вызов
не слова, а части слова. Вот здесь слово S> вызывает часть слова C> :
Код:
: C>
[F]COUNT [ [F]HERE ] HERE 21 + 2DUP C! TUCK >R
FOR CHAR+ OVER [F]C@ OVER C! SWAP CHAR+ SWAP NEXT
2DROP R>
;
: S> [ COMPILE, ] COUNT ;
- В той-же части Форт-системы порой используются самые феерические
управляющие конструкции. Но они тщательно подобраны так, чтобы порождать
самый лаконичный шитый код.
Как вам, например, такие архитектурные построения :
Код:
: >NAME
>R VOC-LINK
BEGIN
BEGIN
[F]@ DUP
WHILE [ ROT ]
DUP CELL- [F]@ ?DUP
UNTIL
BEGIN
DUP NAME> R@ <>
WHILE [ ROT ]
N>LINK [EE]@ ?DUP
UNTIL
REPEAT
NIP
THEN RDROP
;
Но все работает. И упомянутая прошивка для канала классическй музыки Mezzo этот Mezzo открывает.
Вот это карта для которой Форт :
А вот ее схема :
Download embedded Ethereal Forth V01.04 for AtMega163+24c256 smart-cards with sources :
http://www.karelmasters.com/download/viaforth_v0104.rar