Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср ноя 14, 2018 00:17

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Перекодирование файла для прошивки ПЗУ(случай из практики)
СообщениеДобавлено: Пт мар 12, 2010 16:40 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
При разводке двуслойной печатной платы тополог
изменил подключение шин адреса и шин данных к выводам ПЗУ
по отношению к стандартному, следующим образом:
Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5,
шина D1 на вывод D6, шина D2 на вывод D7.
Файл прошивки (бинарный) форт-компилятор сделал под стандартное
подключение шин адреса и данных, под него же заточен и программатор.

Требуется преобразовать существующий "стандартный" бинарный файл
для прошивки ПЗУ таким образом, чтобы программа после прошивки ПЗУ
выполнялась корректно.

\ примерный вид решения
: perform ( a u --) ... ;
S" file.bin" perform

слово perform преобразует исходный файл file.bin
в требуемый по условию задачи с тем же именем.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 12, 2010 17:34 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6435
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Если адреса сдвинуты, то вместо 00000001 будет 00010000, и т.д. То же и с данными - если D1 в D6, то 00000010 будет 01000000. Делаем таблички A-DECODE и D-DECODE, которые содержат "сдвинутые" значения для получения нужных данных. При этом A-DECODE содержит адреса, по которым надо писать, чтобы потом прочитать оттуда данные, D-DECODE содержит данные, которые надо записать, чтобы получить нужные числа.

Код:
CREATE A-DECODE[] 0  C, ...
CREATE D-DECODE[] 0 C, ...

CREATE DATA[] 256 ALLOT
CREATE NEW[] 256 ALLOT

: PERFORM
  256 0 DO
    DATA[] I + C@ D-DECODE[] + C@
    I A-DECODE[] + C@ NEW[] + C!
  LOOP
;


Обертку по вкусу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 12, 2010 20:51 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Хищник писал(а):
CREATE DATA[] 256 ALLOT
CREATE NEW[] 256 ALLOT

Почему 256?
Емкость ПЗУ может быть гораздо больше.
И не путайте смещение адреса с перестановкой разрядов в адресах.
Короче, алгоритм нерабочий.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 12, 2010 21:08 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Пример кода решения данной задачи можно взять из
ff303 ( ключевое слово scramble )

P.S. Sorry за неспортивный подход:)
Мне требовалось переставить байты
Код:
\ настройка процедуры скрамблирования
0xF 7 scram-d   0xE 6 scram-d 0xD 5 scram-d 0xC 4 scram-d
0xB 3 scram-d   0xA 2 scram-d  9 1 scram-d  8 0 scram-d
7 0xF scram-d   6 0xE scram-d 5 0xD scram-d 4 0xC scram-d
3 0xB scram-d   2 0xA scram-d 1 0x9 scram-d 0 0x8  scram-d
scramble16


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 12, 2010 21:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Kopa писал(а):
Пример кода решения данной задачи можно взять из
ff303 ( ключевое слово scramble )

Кстати, да - таким образом можно шифровать и дешифровать массивы, файлы, сообщения(при известной их длине)

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 12, 2010 22:04 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Код:
\ Перестановка разрядов N1 и N2 для ячейки n - для скорости на ассме
: SWAPB ( n N1 N2 -- n')
D^D S^S B=A B-- C=@P C-- $ 4 A=@P
C=C\A 1Dc<< C=B\A 1Sc<< S^D
L1  J0= C=C\A~ C=B\A~
L1: $ 8 Pa ;

\ обертка для преобразования файлов
: perform { \ idf szf brd bwr }
  R/W OPEN-FILE THROW TO idf
  idf FILE-SIZE THROW DROP TO szf
  szf ALLOCATE THROW TO brd brd szf ERASE
  szf ALLOCATE THROW TO bwr bwr szf ERASE
  0. idf REPOSITION-FILE THROW
  brd szf idf READ-FILE THROW DROP
  szf 0 DO brd I + C@ 2 7 SWAPB 3 8 SWAPB
           bwr I 1 5 SWAPB 2 6 SWAPB + C! LOOP
  0. idf REPOSITION-FILE THROW
  bwr szf idf WRITE-FILE THROW
  idf CLOSE-FILE THROW
  brd FREE THROW bwr FREE THROW ;

S" file.bin" perform

пс. при первом применении perform происходит "криптование" файла, при втором применении perform "декриптование" файла.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 01:15 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6435
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
chess писал(а):
Почему 256?
Емкость ПЗУ может быть гораздо больше.

Потому что "например". На PC в общем случае можно создать массив гораздо большего размера, чем имеется памяти в МК.
chess писал(а):
И не путайте смещение адреса с перестановкой разрядов в адресах.

Никто и не путает. Каждому адресу соответствует однозначная "перепутанная" комбинация, которую и надо записать в таблицу. Встретив адрес, ищем в таблице соответствующую ему "перепутанную" комбинацию, и по этому адресу и пишем "перепутанный" байт.
chess писал(а):
Короче, алгоритм нерабочий.

Такой алгоритм был применен ~10 лет назад, когда знакомые развели дорожки на плате к внешнему устройству, перепутав разряды шины данных. Проблема решилась единственной таблицей.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 08:27 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Хищник писал(а):
Никто и не путает. Каждому адресу соответствует однозначная "перепутанная" комбинация, которую и надо записать в таблицу. Встретив адрес, ищем в таблице соответствующую ему "перепутанную" комбинацию, и по этому адресу и пишем "перепутанный" байт.

Это верно, но я же писал, что емкость ПЗУ не определена,
а адреса "перепутаны"(выражаясь по-вашему) для всего ПЗУ(все адреса).
Как можно составить таблицу неизвестно какого объема?
Ну можно конечно составить таблицу заведомо большую по объему, чем объем ПЗУ,
но у вас таблицу надо набивать руками. Согласитесь, что в данном случае этот
вариант практически бесполезен.
Поэтому ваш пример 10-летней давности с перепутыванием данных,
которые, как я понял, имели разрядность только 8, несколько не в тему.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 12:59 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
chess писал(а):
Это верно, но я же писал, что емкость ПЗУ не определена,

Тополог что, и количество адресов ПЗУ напутал?
Да за такое вредительство надо премии лишать!

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 13:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
chess писал(а):
шина D1 на вывод D6, шина D2 на вывод D7.

аэта... шины D6 и D7 он куда соединил? или кинул без разводки? (точно премии лишать!)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 14:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Таблица для перепутывания данных фактически пуста, так как в ТЗ есть неувязка в этом вопросе.
(данные не перепутаны, но перекодировка формально сделана, надо только заполнить данные для перепутывания)
С точки зрения перепутывания адресов и данных решение пригодно
для любых комбинаций перепутывания при заполнении полей соответствий битов.

Код:
\ "Решение" задачи из http://fforum.winglion.ru/viewtopic.php?t=2512
\ Автор: WingLion admin@winglion.ru
\ предупреждаю сразу - непроверено (не на чем проверять) - здесь только голая идея (для 32-хразрядного форта)

CREATE АTAB \ таблица соответствия адресов
\ маска адреса в разводке : соответствующая маска адреса в исходной прошивке ПЗУ
0x0002 , 0x0010 , \ элемент перепутанного адреса А1 -> А4
0x0010 , 0x0020 , \ элемент перепутанного адреса А4 -> А5
0x0020 , 0x0002 , \ элемент перепутанного адреса А5 -> А1

0x0001 , 0x0001 , \ элемент неперепутанного адреса A0 -> A0
0x0004 , 0x0004 , \ элемент неперепутанного адреса A2 -> A2
0x0008 , 0x0008 , \ элемент неперепутанного адреса A3 -> A3

0x0040 , 0x0040 , \ элемент неперепутанного адреса A6 -> A6
0x0080 , 0x0080 , \ элемент неперепутанного адреса A7 -> A7
0x0100 , 0x0100 , \ элемент неперепутанного адреса A8 -> A8

0x0200 , 0x0200 , \ элемент неперепутанного адреса A8 -> A9
0x0400 , 0x0400 , \ элемент неперепутанного адреса A8 -> A10
0x0800 , 0x0800 , \ элемент неперепутанного адреса A8 -> A11

\ таблица может быть и большего размера хоть 20 адресов для ПЗУ мегабайтного объема
\ важно! исходные биты адреса, как и результирующие в таблице должны быть все!

12 CONSTANT ATAB-SIZE \ константа фактически равна разрядности адреса ПЗУ
4096 ROM-SIZE \ размер ПЗУ равен 2 в степени ATAB-SIZE - ПЗУ-шек произвольного размера не бывает!

CREATE DTAB \ таблица соответствия данных
\ маска бита данных в разводке : соответствующая маска бита данных в исходной прошивке ПЗУ
0x0001 , 0x0001 , \ элемент неперепутанных данных D0 -> D0
0x0002 , 0x0002 , \ элемент неперепутанных данных D1 -> D1
0x0004 , 0x0004 , \ элемент неперепутанных данных D2 -> D2
0x0008 , 0x0008 , \ элемент неперепутанных данных D3 -> D3

0x0010 , 0x0010 , \ элемент неперепутанных данных D4 -> D4
0x0020 , 0x0020 , \ элемент неперепутанных данных D5 -> D5
0x0040 , 0x0040 , \ элемент неперепутанных данных D6 -> D6
0x0080 , 0x0080 , \ элемент неперепутанных данных D7 -> D7

\ таблица может быть и большего размера например 16 шин данных для 16-рзрядного ПЗУ
\ важно! исходные биты данных, как и результирующие в таблице должны быть все!

8 CONSTANT DTAB-SIZE \ константа фактически равна разрядности данных ПЗУ

: АTAB[] 8 * АTAB + ; \ адрес записи в таблице шин адресов
: DTAB[] 8 * DTAB + ; \ адрес записи в таблице шин даных

: DECODE-A ( ADR --> ADR')
0 \ начальное значение ADR'
ATAB-SIZE 0 DO
OVER \ достать ADR
I АTAB[] @ AND \ выделить бит адреса который надо переставлять
IF \ если бит установлен,
I АTAB[] 4 + @ OR \ установить в ADR' соответствующий бит (по таблице)
THEN \ если бит не установлен - ничего не делать
LOOP \ перейти к обработке следующего элемента таблицы
DROP \ удалить исходный ADR, оставив на стеке теолько ADR'
; \закончить определение

: DECODE-D ( DATA --> DATA')
0 \ начальное значение DATA'
DTAB-SIZE 0 DO
OVER \ достать ADR
I DTAB[] @ AND \ выделить бит адреса который надо переставлять
IF \ если бит установлен,
I DTAB[] 4 + @ OR \ установить в ADR' соответствующий бит (по таблице)
THEN \ если бит не установлен - ничего не делать
LOOP \ перейти к обработке следующего элемента таблицы
DROP \ удалить исходный ADR, оставив на стеке теолько ADR'
; \закончить определение

CREATE PLACE4RESULT ROM-SIZE ALLOT

: FULL-DECODE (adr u --> adr' u' ) \ массив декодируется в новое место
ROM-SIZE = IF ABORT" Длина массива данных не равна размеру ПЗУ. Работа не выполнена." THEN
\ на вершине стека адрес перекодируемого массива
ROM-SIZE 0 DO
DUP I DECODE-A
\ тут можно проверять на невыход за пределы массива и занулять данные, если адрес больше
+ \ адрес в исходном массиве
B@ \ получить байт
DECODE-D \ перекодировать
I PLACE4RESULT + \ адрес в результирующем массиве
B! \ записать результат
LOOP
PLACE4RESULT ROM-SIZE \ выдать результат
\ длина на выходе равна объему ПЗУ, но не входной длине!
;


_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 14:56 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6435
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Код:
CREATE BMASK[] 1 C, 2 C, 4 C, 8 C, 16 C, 32 C, 64 C, 128 C,
CREATE NEWMASK[] 1 C, 64 C, 128 C, 8 C, 16 C, 32 C, 2 C, 4 C,  \ 2 на 7, 1 на 6

: SWAPBITS \ X -- Y
  0
  8 0 DO
    OVER I BMASK[] + C@ AND
    IF I NEWMASK[] + C@ OR THEN
  LOOP
  NIP
;

Это как переставлять биты. Таблицы все равно работают, и руками набирать ничего не надо, все можно сгенерировать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 13, 2010 21:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
мое решение для форка
<pre>
branch/ for-next.fts
math/ asmadd.fts

\ тут можно использовать табличный метод (будет быстрее), однако решение
\ зависит от разрядности данных, таблица для 32 битных данных уже слишком велика
: >DATA> ( u --> u )
DUP >L 0x39 AND \ неизмененные битики не трогаем
2 L@ AND 5 LSHIFT OR \ D1>D6
4 L@ AND 5 LSHIFT OR \ D2>D7
\ так как не указано, куда пошли D6 и D7 считаем, что был обмен пар
0x40 L@ AND 5 RSHIFT OR
0x80 L> AND 5 RSHIFT OR
;

\ преобразование порядка бит
: trans-data ( addr # --> addr # ) FOR DUP B@ >DATA> OVER B! 1 + TILL DROP ;

\ преобразование адреса
: >ADDR> ( addr --> addr )
DUP A>L 0x33 AND
1 AL@ AND 4 LSHIFT OR
2 AL@ AND 4 LSHIFT OR
\ так же считаем, что был обмен битов
0x10 AL@ AND 4 RSHIFT OR
0x20 AL> AND 4 RSHIFT OR
;

\ перемещение данных с учетом перепутывания адресов
: exch ( base addr --> )
DUP 0x33 AND IFNOT DDROP ;THEN \ если переставлять нечего
\ --> base addr
DDUP + DUP A>L B@ >L \ исходное значение и адрес сохраняем в локальном стеке
>ADDR> + DUP B@ L> ROT B! AL> B! ;

\ преобразование порядка байт
\ считаем, что образ начинается с нулевого байта
: trans-addr ( addr # --> addr # ) FOR DUP R@ exch TILL DROP ;

\ сохранить содержимое буфера в файл
: >FILE ( addr # asc # --> ior )
W/O OPEN-FILE *IF NIP NIP NIP ;THEN DROP
DUP >L WRITE-FILE
L> CLOSE-FILE DROP ;

\ преобразовать согласно ТЗ исходный файл с именем, определенным строкой asc #
: perform ( asc # --> )
DDUP FILE>HEAP 0 = ABORT" Не могу открыть исходный файл!"
DDUP trans-data
DDUP trans-addr
DSWAP >FILE ABORT" Не могу сохранить данные в файл!" ;
</pre>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 15, 2010 10:58 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Некоторые заметки по решениям:
1. Решения от Winglion'a и Хищника близки по алгоритму и используют
на промежуточных этапах решающие таблицы.
Решение от mOlega и мое таблиц не используют.
2. Быстродействие данных решений не в пользу табличных, так
как таблицы здесь не выдают результаты за одно обращение к ним,
а требуется пробежать по таблице.
3. Обмен 2х разрядов в ячейке можно задать одним числом, с единицами в обмениваемых разрядах.
Например 0x42 -- разряд 2(нумеруем разряды начиная с 1-го, а не с 0-го) обмениваем с разрядом 7.
Код процедуры обмена будет и короче и быстрее:
Код:
: SWAPB ( n bitmask -- n')
2DUP AND OVER 1 SWAP WITHIN AND XOR ;
на ассме это делается еще короче и быстрее
Код:
: swapb ( n bitmask -- n')
D=@P D&A C=A D-A Ac-A A&C XOR ;


При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 15, 2010 19:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
chess писал(а):
При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.

Самый быстрый алгоритм - это "тополог с кривыми руками"... перепутает - мама не горюй - а расхлебывать ой-ой-ой...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB