Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего? Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то.
Бывает и такое
Чернушный офтоптный стишок
- Шеф, помоги - гдЕ я ступил? - так "ламер" "хакера" просил... Никак не хочет код работать - найти ошибку нету сил...
Лукаво хакер смотрит в код (а дел своих невпроворот):
- Ошибку вижу я пока ... прости, лишь только - в ДНК
[quote="WingLion"] Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего? Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то.[/quote]
Бывает и такое :))
[size=59]Чернушный офтоптный стишок
- Шеф, помоги - гдЕ я ступил? - так "ламер" "хакера" просил... Никак не хочет код работать - найти ошибку нету сил...
Лукаво хакер смотрит в код (а дел своих невпроворот):
- Ошибку вижу я пока ... прости, лишь только - в ДНК[/size]
|
|
|
|
Добавлено: Пн мар 22, 2010 17:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
\ Раз уж Форт позиционирует себя как язык для встраевыемых систем то - вообще то должна быть базовая библиотечка для работы с битами с числами разной длинны
\ нечто вроде GetBit( N i -- 0|1) SetBit (N 0/1 i --) SwapBit (N i1/i2 --) ещё чего?
\ потому что решая в лоб легко ошибиться - я ошибся раз 5 пока не отладил инициализацию массивов.
Код: Create m 8 allot : m@ ( i --0/1 ) m + c@ ; : m! ( 0/1 i-- ) m + c! ; : razval_byte ( b -- ) 8 0 DO 2 /Mod swap I m! LOOP drop ; : .m ( -- ) 8 0 DO I m@ . LOOP ; : sbor_Adr ( -- b ) 0 m@ 2* 1 m@ + 2* 6 m@ + 2* 7 m@ + 2* 4 m@ + 2* 5 m@ + 2* 2 m@ + 2* 3 m@ + ; : sbor_DAT ( -- b ) 7 m@ 2* 6 m@ + 2* 2 m@ + 2* 3 m@ + 2* 4 m@ + 2* 5 m@ + 2* 6 m@ + 2* 7 m@ + ;
create Mass_ADR 32 allot create Mass_DAT 256 allot
: init_ ADR ( --) 32 0 DO i razval_byte sbor_Adr 31 AND i Mass_ADR + c! LOOP ; init_ ADR : init_ DAT ( --) 256 0 DO i razval_byte sbor_DAT i Mass_DAT + c! LOOP ; init_ DAT
\ основные процедуры: : GetAdr ( A--A) dup 31 AND Mass_ADR + c@ swap 224 AND + ; \ меняем только младшие 5 бит - экономим 224 байта : GetDAT ( A--A) Mass_DAT + c@ ; / меняем всё 8 младших 8 бит - быстрее,
\ Раз уж Форт позиционирует себя как язык для встраевыемых систем то - вообще то должна быть базовая библиотечка для работы с битами с числами разной длинны
\ нечто вроде GetBit( N i -- 0|1) SetBit (N 0/1 i --) SwapBit (N i1/i2 --) [b] ещё чего?[/b]
\ потому что решая в лоб легко ошибиться - я ошибся раз 5 пока не отладил инициализацию массивов.
[code]Create m 8 allot : m@ ( i --0/1 ) m + c@ ; : m! ( 0/1 i-- ) m + c! ; : razval_byte ( b -- ) 8 0 DO 2 /Mod swap I m! LOOP drop ; : .m ( -- ) 8 0 DO I m@ . LOOP ; : sbor_Adr ( -- b ) 0 m@ 2* 1 m@ + 2* 6 m@ + 2* 7 m@ + 2* 4 m@ + 2* 5 m@ + 2* 2 m@ + 2* 3 m@ + ; : sbor_DAT ( -- b ) 7 m@ 2* 6 m@ + 2* 2 m@ + 2* 3 m@ + 2* 4 m@ + 2* 5 m@ + 2* 6 m@ + 2* 7 m@ + ;
create Mass_ADR 32 allot create Mass_DAT 256 allot
: init_ ADR ( --) 32 0 DO i razval_byte sbor_Adr 31 AND i Mass_ADR + c! LOOP ; init_ ADR : init_ DAT ( --) 256 0 DO i razval_byte sbor_DAT i Mass_DAT + c! LOOP ; init_ DAT
\ основные процедуры: : GetAdr ( A--A) dup 31 AND Mass_ADR + c@ swap 224 AND + ; \ меняем только младшие 5 бит - экономим 224 байта : GetDAT ( A--A) Mass_DAT + c@ ; / меняем всё 8 младших 8 бит - быстрее,[/code]
|
|
|
|
Добавлено: Пн мар 22, 2010 12:44 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5, шина D1 на вывод D6, шина D2 на вывод D7.
: rszbor ( b -- 1..2..3..4.....8..) 8 0 DO 2 /mod LOOP ;
: sborADR ( 1..2..3.....8..-- b) 2* + 2* + 2* + >R 3 Pick 2* + 2* + 2*+ R> 2* +
: sborDATA (1..2..3.....8..-- b) ... ... ...
реально бы наверное использовал для создания 2-х массивов для перекодировки младших 4-х бит адреса (16 ячеек) и байта данных (256 ячеек)
[quote]Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5, шина D1 на вывод D6, шина D2 на вывод D7.[/quote]
: rszbor ( b -- 1..2..3..4.....8..) 8 0 DO 2 /mod LOOP ;
: sborADR ( 1..2..3.....8..-- b) 2* + 2* + 2* + >R 3 Pick 2* + 2* + 2*+ R> 2* +
: sborDATA (1..2..3.....8..-- b) ... ... ...
реально бы наверное использовал для создания 2-х массивов для перекодировки младших 4-х бит адреса (16 ячеек) и байта данных (256 ячеек)
|
|
|
|
Добавлено: Вс мар 21, 2010 19:20 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.
Тут надо уточнить, ошибиться в чем: в алгоритме или в кодировании алгоритма.
Форт средство интерактивное и позволит быстро протестировать и отладить простейшую функцию
переброса разрядов(у меня к примеру обмениваются только два разряда).
Вот вариант с классическими решающими таблицами:
Код: 16 CONSTANT NADDR \ разрядность адреса 8 CONSTANT NDATA \ разрядность данных
0 VALUE [Amix] \ нач. адрес таблицы перепутывания адресов 0 VALUE [Dmix] \ нач. адрес таблицы перепутывания данных
\ обмен пары разрядов : SWAPB ( bitmask n -- n') SWAP 2DUP AND OVER 1 SWAP WITHIN AND XOR ;
: LOAD-TABLES BASE @ >R 0x2 BASE ! 1 NADDR LSHIFT DUP DUP ALLOCATE THROW DUP TO [Amix] SWAP ERASE 0 DO \ FEDCBA9876543210 0000000000010001 \ обмен шин A0 и A4 на выводах ПЗУ 0000000000100010 \ обмен шин A1 и A5
I SWAPB SWAPB [Amix] I + C! LOOP 1 NDATA LSHIFT DUP DUP ALLOCATE THROW DUP TO [Dmix] SWAP ERASE 0 DO \ 76543210 01000010 \ обмен шин D1 и D6 на выводах ПЗУ 10000100 \ обмен шин D2 и D7
I SWAPB SWAPB [Dmix] I + C! LOOP R> BASE ! ;
\ табличное преобразование адреса и данных : Aperf ( A -- A') [Amix] + C@ ; : Dperf ( D -- D') [Dmix] + C@ ;
Остальное типовая обертка
ПС. Из табличных вариантов решений - этот самый быстрый, но и требует соответствующего объема памяти.
[quote="Хищник"]Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.[/quote]
Тут надо уточнить, ошибиться в чем: в алгоритме или в кодировании алгоритма.
Форт средство интерактивное и позволит быстро протестировать и отладить простейшую функцию
переброса разрядов(у меня к примеру обмениваются только два разряда).
Вот вариант с классическими решающими таблицами:
[code]16 CONSTANT NADDR \ разрядность адреса 8 CONSTANT NDATA \ разрядность данных
0 VALUE [Amix] \ нач. адрес таблицы перепутывания адресов 0 VALUE [Dmix] \ нач. адрес таблицы перепутывания данных
\ обмен пары разрядов : SWAPB ( bitmask n -- n') SWAP 2DUP AND OVER 1 SWAP WITHIN AND XOR ;
: LOAD-TABLES BASE @ >R 0x2 BASE ! 1 NADDR LSHIFT DUP DUP ALLOCATE THROW DUP TO [Amix] SWAP ERASE 0 DO \ FEDCBA9876543210 0000000000010001 \ обмен шин A0 и A4 на выводах ПЗУ 0000000000100010 \ обмен шин A1 и A5
I SWAPB SWAPB [Amix] I + C! LOOP 1 NDATA LSHIFT DUP DUP ALLOCATE THROW DUP TO [Dmix] SWAP ERASE 0 DO \ 76543210 01000010 \ обмен шин D1 и D6 на выводах ПЗУ 10000100 \ обмен шин D2 и D7
I SWAPB SWAPB [Dmix] I + C! LOOP R> BASE ! ;
\ табличное преобразование адреса и данных : Aperf ( A -- A') [Amix] + C@ ; : Dperf ( D -- D') [Dmix] + C@ ;[/code]
Остальное типовая обертка
ПС. Из табличных вариантов решений - этот самый быстрый, но и требует соответствующего объема памяти.
|
|
|
|
Добавлено: Ср мар 17, 2010 17:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности. Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая.
То есть вычисление таблицы программируется проще, чем сама таблица? И что значит "большая таблица"? В ней число элементов равно числу разрядов. Кстати, проверка целостности данных делается очень просто - OR по всем элементам, и должно получиться число, у которого единицы во всех младших разрядах, а их число равно разрядности адреса/данных. Это будет гарантией того, что каждая маска упомянута в таблице по одному разу. Вот уж гарантия правильного размещения масок - извините, это "проверка на криворукость". Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.
[quote="mOleg"]То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности. Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая.[/quote]
То есть вычисление таблицы программируется проще, чем сама таблица? :shock: И что значит "большая таблица"? В ней число элементов равно числу разрядов. Кстати, проверка целостности данных делается очень просто - OR по всем элементам, и должно получиться число, у которого единицы во всех младших разрядах, а их число равно разрядности адреса/данных. Это будет гарантией того, что каждая маска упомянута в таблице по одному разу. Вот уж гарантия правильного размещения масок - извините, это "проверка на криворукость". Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.
|
|
|
|
Добавлено: Вт мар 16, 2010 23:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться. Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего? Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то. mOleg писал(а): Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять Smile особенно, если таблица большая.
У меня она фактически вычисляется... каждый элемент таблицы - в момент использования
[quote="mOleg"]страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться. [/quote]
Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего? Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то.
[quote="mOleg"]Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять Smile особенно, если таблица большая.[/quote]
У меня она фактически вычисляется... каждый элемент таблицы - в момент использования
|
|
|
|
Добавлено: Вт мар 16, 2010 19:41 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): и чем эти проблемы страшнее косоглазого тополога?
страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться.
То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности.
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая.
[quote="WingLion"]и чем эти проблемы страшнее косоглазого тополога?[/quote]
страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться.
То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности.
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять :) особенно, если таблица большая.
|
|
|
|
Добавлено: Вт мар 16, 2010 19:31 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).
и чем эти проблемы страшнее косоглазого тополога?
[quote="mOleg"]кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...). [/quote]
и чем эти проблемы страшнее косоглазого тополога?
|
|
|
|
Добавлено: Вт мар 16, 2010 19:22 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.
кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).
насчет обработки группы бит, это и я заметил, но решил без них.
[quote="Хищник"]Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.[/quote]
кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).
насчет обработки группы бит, это и я заметил, но решил без них.
|
|
|
|
Добавлено: Вт мар 16, 2010 19:04 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
chess писал(а): 2. Быстродействие данных решений не в пользу табличных, так как таблицы здесь не выдают результаты за одно обращение к ним, а требуется пробежать по таблице.
Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.
[quote="chess"]2. Быстродействие данных решений не в пользу табличных, так как таблицы здесь не выдают результаты за одно обращение к ним, а требуется пробежать по таблице.[/quote]
Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.
|
|
|
|
Добавлено: Пн мар 15, 2010 22:48 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
chess писал(а): При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания" более быстрые алгоритмы будут иметь преимущество.
Самый быстрый алгоритм - это "тополог с кривыми руками"... перепутает - мама не горюй - а расхлебывать ой-ой-ой...
[quote="chess"]При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания" более быстрые алгоритмы будут иметь преимущество.[/quote]
Самый быстрый алгоритм - это "тополог с кривыми руками"... перепутает - мама не горюй - а расхлебывать ой-ой-ой...
|
|
|
|
Добавлено: Пн мар 15, 2010 19:38 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Некоторые заметки по решениям:
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 ;
При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.
Некоторые заметки по решениям:
1. Решения от Winglion'a и Хищника близки по алгоритму и используют
на промежуточных этапах решающие таблицы.
Решение от mOlega и мое таблиц не используют.
2. Быстродействие данных решений не в пользу табличных, так
как таблицы здесь не выдают результаты за одно обращение к ним,
а требуется пробежать по таблице.
3. Обмен 2х разрядов в ячейке можно задать одним числом, с единицами в обмениваемых разрядах.
Например 0x42 -- разряд 2(нумеруем разряды начиная с 1-го, а не с 0-го) обмениваем с разрядом 7.
Код процедуры обмена будет и короче и быстрее:
[code]: SWAPB ( n bitmask -- n') 2DUP AND OVER 1 SWAP WITHIN AND XOR ;[/code]на ассме это делается еще короче и быстрее [code]: swapb ( n bitmask -- n') D=@P D&A C=A D-A Ac-A A&C XOR ;[/code]
При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.
|
|
|
|
Добавлено: Пн мар 15, 2010 10:58 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
мое решение для форка
<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>
мое решение для [url=http://fforum.winglion.ru/viewtopic.php?p=25081#25081]форка[/url]
<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>
|
|
|
|
Добавлено: Сб мар 13, 2010 21:14 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код: 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 ;
Это как переставлять биты. Таблицы все равно работают, и руками набирать ничего не надо, все можно сгенерировать.
[code]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 ; [/code]
Это как переставлять биты. Таблицы все равно работают, и руками набирать ничего не надо, все можно сгенерировать.
|
|
|
|
Добавлено: Сб мар 13, 2010 14:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Таблица для перепутывания данных фактически пуста, так как в ТЗ есть неувязка в этом вопросе.
(данные не перепутаны, но перекодировка формально сделана, надо только заполнить данные для перепутывания)
С точки зрения перепутывания адресов и данных решение пригодно
для любых комбинаций перепутывания при заполнении полей соответствий битов.
Код: \ "Решение" задачи из 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 \ выдать результат \ длина на выходе равна объему ПЗУ, но не входной длине! ;
Таблица для перепутывания данных фактически пуста, так как в ТЗ есть неувязка в этом вопросе.
(данные не перепутаны, но перекодировка формально сделана, надо только заполнить данные для перепутывания)
С точки зрения перепутывания адресов и данных решение пригодно
для любых комбинаций перепутывания при заполнении полей соответствий битов.
[code]\ "Решение" задачи из 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 \ выдать результат \ длина на выходе равна объему ПЗУ, но не входной длине! ;
[/code]
|
|
|
|
Добавлено: Сб мар 13, 2010 14:09 |
|
|
|
|