Forth http://fforum.winglion.ru/ |
|
Перекодирование файла для прошивки ПЗУ(случай из практики) http://fforum.winglion.ru/viewtopic.php?f=19&t=2512 |
Страница 1 из 2 |
Автор: | chess [ Пт мар 12, 2010 16:40 ] |
Заголовок сообщения: | Перекодирование файла для прошивки ПЗУ(случай из практики) |
При разводке двуслойной печатной платы тополог изменил подключение шин адреса и шин данных к выводам ПЗУ по отношению к стандартному, следующим образом: Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5, шина D1 на вывод D6, шина D2 на вывод D7. Файл прошивки (бинарный) форт-компилятор сделал под стандартное подключение шин адреса и данных, под него же заточен и программатор. Требуется преобразовать существующий "стандартный" бинарный файл для прошивки ПЗУ таким образом, чтобы программа после прошивки ПЗУ выполнялась корректно. \ примерный вид решения : perform ( a u --) ... ; S" file.bin" perform слово perform преобразует исходный файл file.bin в требуемый по условию задачи с тем же именем. |
Автор: | Hishnik [ Пт мар 12, 2010 17:34 ] |
Заголовок сообщения: | |
Если адреса сдвинуты, то вместо 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 ; Обертку по вкусу. |
Автор: | chess [ Пт мар 12, 2010 20:51 ] |
Заголовок сообщения: | |
Хищник писал(а): CREATE DATA[] 256 ALLOT
CREATE NEW[] 256 ALLOT Почему 256? Емкость ПЗУ может быть гораздо больше. И не путайте смещение адреса с перестановкой разрядов в адресах. Короче, алгоритм нерабочий. |
Автор: | Kopa [ Пт мар 12, 2010 21:08 ] |
Заголовок сообщения: | |
Пример кода решения данной задачи можно взять из 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 |
Автор: | chess [ Пт мар 12, 2010 21:23 ] |
Заголовок сообщения: | |
Kopa писал(а): Пример кода решения данной задачи можно взять из
ff303 ( ключевое слово scramble ) Кстати, да - таким образом можно шифровать и дешифровать массивы, файлы, сообщения(при известной их длине) |
Автор: | chess [ Пт мар 12, 2010 22:04 ] |
Заголовок сообщения: | |
Код: \ Перестановка разрядов 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 "декриптование" файла. |
Автор: | Hishnik [ Сб мар 13, 2010 01:15 ] |
Заголовок сообщения: | |
chess писал(а): Почему 256? Емкость ПЗУ может быть гораздо больше. Потому что "например". На PC в общем случае можно создать массив гораздо большего размера, чем имеется памяти в МК. chess писал(а): И не путайте смещение адреса с перестановкой разрядов в адресах. Никто и не путает. Каждому адресу соответствует однозначная "перепутанная" комбинация, которую и надо записать в таблицу. Встретив адрес, ищем в таблице соответствующую ему "перепутанную" комбинацию, и по этому адресу и пишем "перепутанный" байт. chess писал(а): Короче, алгоритм нерабочий.
Такой алгоритм был применен ~10 лет назад, когда знакомые развели дорожки на плате к внешнему устройству, перепутав разряды шины данных. Проблема решилась единственной таблицей. |
Автор: | chess [ Сб мар 13, 2010 08:27 ] |
Заголовок сообщения: | |
Хищник писал(а): Никто и не путает. Каждому адресу соответствует однозначная "перепутанная" комбинация, которую и надо записать в таблицу. Встретив адрес, ищем в таблице соответствующую ему "перепутанную" комбинацию, и по этому адресу и пишем "перепутанный" байт.
Это верно, но я же писал, что емкость ПЗУ не определена, а адреса "перепутаны"(выражаясь по-вашему) для всего ПЗУ(все адреса). Как можно составить таблицу неизвестно какого объема? Ну можно конечно составить таблицу заведомо большую по объему, чем объем ПЗУ, но у вас таблицу надо набивать руками. Согласитесь, что в данном случае этот вариант практически бесполезен. Поэтому ваш пример 10-летней давности с перепутыванием данных, которые, как я понял, имели разрядность только 8, несколько не в тему. |
Автор: | WingLion [ Сб мар 13, 2010 12:59 ] |
Заголовок сообщения: | |
chess писал(а): Это верно, но я же писал, что емкость ПЗУ не определена,
Тополог что, и количество адресов ПЗУ напутал? Да за такое вредительство надо премии лишать! |
Автор: | WingLion [ Сб мар 13, 2010 13:03 ] |
Заголовок сообщения: | |
chess писал(а): шина D1 на вывод D6, шина D2 на вывод D7.
аэта... шины D6 и D7 он куда соединил? или кинул без разводки? (точно премии лишать!) |
Автор: | WingLion [ Сб мар 13, 2010 14:09 ] |
Заголовок сообщения: | |
Таблица для перепутывания данных фактически пуста, так как в ТЗ есть неувязка в этом вопросе. (данные не перепутаны, но перекодировка формально сделана, надо только заполнить данные для перепутывания) С точки зрения перепутывания адресов и данных решение пригодно для любых комбинаций перепутывания при заполнении полей соответствий битов. Код: \ "Решение" задачи из 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 \ выдать результат \ длина на выходе равна объему ПЗУ, но не входной длине! ; |
Автор: | Hishnik [ Сб мар 13, 2010 14:56 ] |
Заголовок сообщения: | |
Код: 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 ; Это как переставлять биты. Таблицы все равно работают, и руками набирать ничего не надо, все можно сгенерировать. |
Автор: | mOleg [ Сб мар 13, 2010 21:14 ] |
Заголовок сообщения: | |
мое решение для форка <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> |
Автор: | chess [ Пн мар 15, 2010 10:58 ] |
Заголовок сообщения: | |
Некоторые заметки по решениям: 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 ; При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания" более быстрые алгоритмы будут иметь преимущество. |
Автор: | WingLion [ Пн мар 15, 2010 19:38 ] |
Заголовок сообщения: | |
chess писал(а): При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество. Самый быстрый алгоритм - это "тополог с кривыми руками"... перепутает - мама не горюй - а расхлебывать ой-ой-ой... |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |