|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Возник тут у нас этот вопрос на днях, что в подпрограмме RND Бейсика «МИКРОША» 0000/19FF(62F1) есть ошибка. Но пока я искал свои исходники, диалог в топике перешел в неконструктивное русло. Тем не менее, если этим Васиком люди пользуются, я счел нужным этот дефект устранить. Так уж случилось, что с генераторам RND я сталкивался очень много и считаю, что самый лучший из них в программе Liberty Basic 1.0...3.0 (может и старше) - он, на мой взгляд, наиболее равномерно покрывает случайными точками прямоугольник экрана. Но вернемся к подпрограмме RND Бейсика «МИКРОША»: на мой взгляд, для устранения ошибки следует пропатчить байт 0C9H по адресу 163BH, исправив его на 0CDH. Для этого в HEX-редакторе ищем сигнатуру: 7A 44 и находим цепочку: 1630: 16 CD FF 12-C8 01 35 98-11 7A 44 CD- BC 11 01 28 Здесь я уже 0C9H на 0CDH исправил. Подпрограмма генератора RND многих наших 8-битных Бейсиков не изменилась практически со времен юного Билла Гейца: http://altairbasic.org/math_dis_12.htmИ в Бейсике «МИКРОША» после правки подпрограмма RND должна выглядеть вот так: | | | | Code: '========== Rnd RST 5 ;162A EF JM L1647 ;162B FA 47 16 LXI H,L165C ;162E 21 5C 16 CALL L12FF ;1631 CD FF 12 RZ ;1634 C8 LXI B,L9835 ;1635 01 35 98 LXI D,L447A ;1638 11 7A 44 CALL L11BC ;163B CD BC 11
LXI B,L6828 ;163E 01 28 68 LXI D,LB146 ;1641 11 46 B1 CALL L1082 ;1644 CD 82 10
L1647: CALL L130D ;1647 CD 0D 13 MOV A,E ;164A 7B { MOV E,C ;164B 59 Y MOV C,A ;164C 4F O MVI M,80H ;164D 36 80 DCX H ;164F 2B + MOV B,M ;1650 46 F MVI M,80H ;1651 36 80 CALL L10D3 ;1653 CD D3 10
LXI H,L165C ;1656 21 5C 16 JMP L1319 ;1659 C3 19 13 '========== | | | | |
А в Бейсике «МИКРОН» она выглядит по сути аналогично: | | | | Code: LA5:RST 5 JM LA6 LXI H,b6D CALL L6B RZ LXI B,9835H LXI D,447AH CALL L51 LXI B,6828H LXI D,0B146H CALL L37 LA6:CALL L6D MOV A,E MOV E,C MOV C,A MVI M,80H DCX H MOV B,M MVI M,80H CALL L3B LXI H,b6D JMP L70 | | | | |
Для тех, кому неохота возиться с патчами, я исправленный вариант выкладываю. Я только не пересчитывал в конце контрольную сумму, так что может быть сообщение об ошибке загрузки. Но в эмуляторе В.Пыхонина по Alt+F3 и в Emu3000 файл и загружается и работает нормально.
_________________ iLavr
|
11 Apr 2016 16:56 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну и несколько слов о том, для чего я ковырялся в случайных генераторах... На "Специалисте" еще, в пакете программ от SP-580, был такой визуальный эффект: Картинка на экране с характерным шумом "тонет" в море случайных точек. А потом эти точки рассеиваются и "всплывает" новая картинка. Код самогО эффекта следующий: | | | | Code: ORG 0000H
; LXI SP,K0B GOO:LXI H,K0D PUSH H LXI H,K0E PUSH H POP H LXI B,K0A PUSH B POP H K00:CALL K09 PUSH H MOV A,H ANI 0BFH ORI 80H MOV H,A CPI 90H JM K01 XRA H XRA L ADC D ADC E XRA M MOV M,A ANI 20H STA K0F K01:POP H DCX B MOV A,B ORA C JNZ K00 ; CALL 0C803H CPI 1BH JZ 0F800H CPI 1FH JZ M01 JMP GOO ;_______________ M01: LDA K02+1 CMA STA K02+1 LXI H,K0C MVI C,0CEH K02:MVI A,0AAH MVI M,00H K03:INR L RRC PUSH PSW ANI 3FH MOV M,A POP PSW DCR C JNZ K03 INR L MVI M,00H INR H MVI B,20H RRC K04:MVI C,07H PUSH H MVI M,00H K05:DCR L RRC MOV M,A DCR C JNZ K05 RRC POP H INR H DCR B JNZ K04 MVI M,00H MVI C,0CEH K06:DCR L RRC PUSH PSW ANI 0FCH MOV M,A POP PSW DCR C JNZ K06 DCR L MVI M,00H MVI B,20H RRC
K07:MVI C,07H DCR H PUSH H MVI M,00H K08:INR L RRC MOV M,A DCR C JNZ K08 RRC POP H DCR B JNZ K07 ; CALL 0C803H JMP 0F800H
K09:MOV A,H RLC MOV D,A RLC RLC RLC RLC MOV E,A MOV A,L RLC RLC ADD E ADD D ADD H ANI 01H DAD H ORA L MOV L,A RET
K0A:EQU 8709H K0B:EQU 8F9FH K0C:EQU 9718H K0D:EQU 0C000H K0E:EQU 0FB43H K0F:EQU 0FFE2H; порт С ППА - звук END | | | | |
Я смог перетащить этот эффект под DOS, а вот перетащить под начавшуюся тогда Венду - так и не сумел... но зато в генераторах RND поковырялся много... Позже я встречал этот эффект, реализованный в Венде на диске REANIMATOR, и даже встречал такой плагин, но интересно было - как это сделать самому, а не факт наличия плагина. http://www.pagetable.com/?p=43
_________________ iLavr
|
11 Apr 2016 17:27 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Что-то я чисто из интересу прогуглил этот эффект на повод, не выложил ли кто исходника его. Нашел пока только вот что: Динамические фильтрыНо примера кода я там что-то не увидел...
_________________ iLavr
|
12 Apr 2016 05:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Джентльмены, извините, что я здесь оффтоплю, но что-то прямо зацепило неподецки! Вычистил я ошибки в примерах с этой страницы: http://lurid.chuvashia.com/DOC/Book.The_WEB-schedule/Glava%2010/Index24.htmвставил ссылку на локальную картинку: SRC = file://localhost/C:/NOIZEtst.gifНо никаких описываемых кунштюков не увидел ничерта! Может у меня Опера 9.64 старая, но на слова " filters" и " filter" не реагирует она никак... В чем может быть проблема? P.S. Попробовал всё это в ИЕ-10 под Вендой-7-32. Тоже нифига не заработало...
_________________ iLavr
|
12 Apr 2016 13:27 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Этот эффект смены картинок есть в PowerPoint - Растворение (Pixel Dissolve): Примерно так выглядит: Буду искать программную реализацию... P.S. И, похоже, что один вариант исходника я нашел. Что значит правильно задать вопрос Гугле... Image Slide Show with Transitions
_________________ iLavr
|
13 Apr 2016 10:43 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А сам оригинальный алгоритм этого графического эффекта, оказывается, весьма интересен! И получается, что я его себе представлял неправильно... Поэтому у меня ничего не получилось под Вендой. (Под DOS я умудрился перенести точную кальку с ассемблера для режимов BW, не вникая в суть.) Так вот представлял я себе эту процедуру неверно. Я думал, что надо забросать случайными пикселями, генеририуемыми ПСЕВДО-случайным генератором так примерно процентов 80 площади картинки, а потом просто выложить всю картинку уже поверх заполненного холста. ПСЕВДО-случайный генератор нужен, чтобы последовательность случайных чисел повторялась. Но споткнулся я об то, что нужен случайный генератор с довольно равномерным распределением, но и он выбрасывает повторяющиеся числа, а это очень замедляет весь такой алгоритм. Вот этот момент я преодолеть и не смог... Оригинальный же алгоритм эффекта весьма оригинален! Составляется массив всех точек координат картинки и его потом просто перемешивают случайно специальным образом с помощью интересного алгоритма тасования имени Фишера–Йетса. После чего на экран быстро выкидывают все точки этого массива. Ясное дело, что повториться при этом в выводе точек картинки на экран просто невозможно!
_________________ iLavr
|
13 Apr 2016 14:47 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Посмотрел я, как я это делал в своих старых исходниках, там этот эффект разобран и выброшено всё лишнее, что относилось не к нему. Вся процедура гораздо короче: | | | | Code: GOO: ;------------ [BC]-длительность всей процедуры LXI B,LEN ; 8709H = [BC] PUSH B POP H ; HL = 8709H
BEG: CALL GEN;-- генератор адреса в HL ? PUSH H;---- сохраним HL
MOV A,H ;---- адрес строки ANI 03FH ; 0011.1111b ORI 80H ; 1000.0000b MOV H,A ;---- адрес строки
CPI 90H ; начало экрана 90000H JM NXT ; ниже его
XRA H XRA L ADC D ADC E XRA M ; байт по адресу [HL] MOV M,A ; запишем на его же место
ANI 20H ; 0010.0000b STA K0F ; 0FFE2H - звук
NXT: POP H;---- восстановим HL DCX B ;- уменьшим длительность MOV A,B ;- и проверим [BC] ORA C ;- на = 0000H JNZ BEG
;------------------------------- CALL 0C803H;- опрос клавиатуры CPI 1BH ;--- выход в систему JZ 0F800H JMP GOO ;--- повторим эффект ;------------------------------- ;------хитро вычисляет HL------- GEN: MOV A,H RLC MOV D,A RLC RLC RLC RLC MOV E,A
MOV A,L RLC RLC ADD E ADD D ADD H;--- в A = L номер строки ANI 01H;- 0000.0001b
DAD H;--- HL = HL+HL ORA L MOV L,A RET
LEN:EQU 8709H;--- длительность процедуры DIN:EQU 0FFE2H;--- порт 580ВВ55 - звук END | | | | |
Собственно, всё основывается на хитрой процедуре GEN:, которая вычисляет псевдослучайный адрес. И ничего в ней особо хитрого-то и нет на вид, но вот алгоритм её мне простыми человеческими словами непонятен..
_________________ iLavr
|
14 Apr 2016 06:00 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А алгоритм-то оказался очень интересным! Но как-то руки не доходили проверить это, хотя я такое свойство за ним и подозревал... Но вот решил проверить, для чего с помощью этого алгоритма генерировал пары координат X, Y и выводил точки в квадратное поле 256х256 (я похожим образом все RND-генераторы проверял). За 256 х 256 = 65536 шагов алгоритм равномерно - псевдо-хаотично заполняет точками всё поле, ни разу не повторяя уже пройденные адреса!
_________________ iLavr
|
17 Apr 2016 07:31 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22821 Location: Silicon Valley
|
Ну прям таки уж ни разу не повторяя?
|
17 Apr 2016 07:44 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
ВОТ ЭТО И УДИВИТЕЛЬНО! В цикле всего 256 х 256 = 65536 шагов, поле заполнено полностью, а если бы был повтор, то точка стала бы красной и была бы незаполненная белая точка.
_________________ iLavr
|
17 Apr 2016 07:49 |
|
|
IgorR76
Senior
Joined: 27 Jul 2015 15:20 Posts: 102
|
Обычный полиномиальный счетчик. WIKIPEDIA https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80_%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0_%D1%81_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B9_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C%D1%8E
Last edited by IgorR76 on 25 Aug 2021 17:58, edited 1 time in total.
|
20 Apr 2016 07:45 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22821 Location: Silicon Valley
|
Если это LFSR, то тогда точка с координатами (0,0) должна остаться незаполненной
|
20 Apr 2016 08:32 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Не сказал бы, что уж очень обычный... А Википедия и есть те знания, которыми Вы обычно делитесь?
_________________ iLavr
|
20 Apr 2016 09:09 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я из интересу решил проверить, а что будет, если задать на 1 шаг больше, чем 65536? И задал их 65537, предполагая, что увижу одну лишнюю красную точку. Но вышло почему-то не так. В окно отладки программа выдала 7 НЕбелых точек, но на картинке я их нашел только 4. Видимо, наложились еще что ли, если я не ошибся нигде... Да, и почему я не считаю это обычным полиномиальным счетчиком. Я не вижу здесь ни одного XOR для обычного... А на плоскость по X и Y выводятся эти H и L.
_________________ iLavr
|
20 Apr 2016 10:05 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это, кстати, совсем необязательно... Ларин А.Л. Основы цифровой электроники: учебное пособие. — М.: МФТИ, 2008. — 314 с. — ISBN 978-5-7417-0228-4.Фунция x+y ( ADD) - может быть линейной булевой функцией в цепи обратной связи регистра сдвига, но такое решение довольно непопулярно... В то же время для XOR даже есть таблица, как сформировать обратные связи для регистра заданной длины, чтобы получить генерацию последовательности максимальной длины. P.S. Хотя, в общем-то, значение имеет только нулевой разряд регистра А при суммировании, видимо, ADD делает то же самое, что и XOR в пределах одного разряда, поскольку ADD не прибавляет флаг С... только вот полином в этом случае у меня что-то пока не соответствует ни одной таблице, если считать HL 16-битным регистром, а DAD H - его сдвигом влево.P.P.S. Вроде как есть такой полином: X0+X4+X7+X9 --> 1000100101000000 = 8940h в полной таблице для 16-битного регистра, я сначала только первые 100 значений скачал, а их - 2048...
_________________ iLavr
|
28 Apr 2016 13:03 |
|
|
Who is online |
Users browsing this forum: Bing [Bot] and 8 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|