nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 05 Jun 2020 00:28



Reply to topic  [ 16 posts ]  Go to page 1, 2  Next
RND в Бейсик «МИКРОША» 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Возник тут у нас этот вопрос на днях, что в подпрограмме 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 файл и
загружается и работает нормально.
Attachment:
BASIC.rar [5.52 KiB]
Downloaded 118 times

_________________
iLavr


11 Apr 2016 17:56
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Так уж случилось, что с генераторам RND я сталкивался очень много...

Ну и несколько слов о том, для чего я ковырялся в случайных генераторах...

На "Специалисте" еще, в пакете программ от SP-580, был такой визуальный эффект:
Attachment:
NOIZE.gif
NOIZE.gif [ 9.77 KiB | Viewed 5831 times ]

Картинка на экране с характерным шумом "тонет" в море случайных точек.
А потом эти точки рассеиваются и "всплывает" новая картинка.

Код самогО эффекта следующий:
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 18:27
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Что-то я чисто из интересу прогуглил этот эффект на повод, не выложил ли кто исходника его.
Нашел пока только вот что:
Динамические фильтры
Quote:
Эффекты постепенного появления (исчезновения) графического изображения и преобразования одной картинки в другую можно получить с помощью совместного применения динамического фильтра и сценария (скрипта). Разумное использование таких эффектов украшает Web-страницу. Есть несколько способов преобразования. Эти способы заранее определены, поэтому от вас лишь требуется указать номер выбранного способа. Ниже приведена таблица с названиями и номерами превращений.
...
При установке фильтра типа 12 возникает эффект постепенного повышения разрешения изображения путем случайного заполнения пикселами места, отведенного под картинку. Точки картинки постепенно выводятся на экран в случайном порядке.

Но примера кода я там что-то не увидел... :-?

_________________
iLavr


12 Apr 2016 06:01
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Джентльмены, извините, что я здесь оффтоплю, но что-то прямо зацепило неподецки! :o

Вычистил я ошибки в примерах с этой страницы:
http://lurid.chuvashia.com/DOC/Book.The_WEB-schedule/Glava%2010/Index24.htm
вставил ссылку на локальную картинку: SRC = file://localhost/C:/NOIZEtst.gif
Но никаких описываемых кунштюков не увидел ничерта! :o
Может у меня Опера 9.64 старая, но на слова "filters" и "filter" не реагирует она никак...

В чем может быть проблема? :eugeek:
Code:
<HTML>
<HEAD>
<TITLE> Динамический фильтр </TITLE>
<SCRIPT>
function dyn_filter(){
Image1.filters(0).apply()
I1.style.visibility "visible"
Image1.filters(0).Transition=8
Image1.filters(0).play(2)
}
</SCRIPT>
</HEAD>

<BODY ONLOAD="dyn_filter()">
<DIV ID = Image1 STYLE = "position: absolute; height: 152; width: 166; left: 10; top: 10; filter: revealtrans">
<IMG ID = I1 STYLE = "position: absolute; height: 152; width: 166; visibility: hidden" SRC = file://localhost/C:/NOIZEtst.gif>
<H3 STYLE = "position: absolute; top:270">
Динамическое преобразование картинки</H3>
<P>Фильтр</P>
<P STYLE="top: 300; filter:f11рv">Фильтр flip</P>
<P STYLE="top: 340; fliter:f11рh">Фильтр fliph</P>
<P STYLE="top: 360; filter:blur">Фильтр blur</P>
</BODY>
</HTML>


Code:
<HTML>
<HEAD><TITLE> Динамический фильтр </TITLE>
<SCRIPT>
function dyn_filter(){
Image1.filters(0).Apply()
I1.style.visibility = "visible"
Image1.filters(0).play(2)
}
</SCRIPT>
</HEAD>

<BODY ONLOAD="dyn_filiter()">
<DIV ID = Image1 STYLE = "position: absolute; height: 200; width: 300; left: 10; top: 10; filter: blendtrans">
<IMG ID = I1 STYLE ="position:absolute; height: 152; width: 166; visibility: hidden" SRC = file://localhost/C:/NOIZEtst.gif>
<H3 STYLE="position:absolute; top:210">
Динамическое преобразование картинки с помощью фильтра
</H3>
</BODY>
</HTML>



P.S. Попробовал всё это в ИЕ-10 под Вендой-7-32. Тоже нифига не заработало... :osad:

_________________
iLavr


12 Apr 2016 14:27
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Этот эффект смены картинок есть в PowerPoint - Растворение (Pixel Dissolve):
Attachment:
Растворение.gif
Растворение.gif [ 7.42 KiB | Viewed 5784 times ]


Примерно так выглядит:
Attachment:
000000.jpg
000000.jpg [ 24.67 KiB | Viewed 5784 times ]


Буду искать программную реализацию...


P.S. И, похоже, что один вариант исходника я нашел. Что значит правильно задать вопрос Гугле... :wink:
Image Slide Show with Transitions

_________________
iLavr


13 Apr 2016 11:43
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
А сам оригинальный алгоритм этого графического эффекта, оказывается, весьма интересен!
И получается, что я его себе представлял неправильно... :-? Поэтому у меня ничего не получилось под Вендой.
(Под DOS я умудрился перенести точную кальку с ассемблера для режимов BW, не вникая в суть.)

Так вот представлял я себе эту процедуру неверно. Я думал, что надо забросать случайными пикселями,
генеририуемыми ПСЕВДО-случайным генератором так примерно процентов 80 площади картинки,
а потом просто выложить всю картинку уже поверх заполненного холста.
ПСЕВДО-случайный генератор нужен, чтобы последовательность случайных чисел повторялась.

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

Оригинальный же алгоритм эффекта весьма оригинален! :ebiggrin:

Составляется массив всех точек координат картинки и его потом просто перемешивают случайно специальным
образом с помощью интересного алгоритма тасования имени Фишера–Йетса.
После чего на экран быстро выкидывают все точки этого массива. Ясное дело, что повториться при этом
в выводе точек картинки на экран просто невозможно! :kruto:

_________________
iLavr


13 Apr 2016 15:47
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Под DOS я умудрился перенести точную кальку с ассемблера для режимов BW, не вникая в суть.
Посмотрел я, как я это делал в своих старых исходниках, там этот эффект разобран и выброшено
всё лишнее, что относилось не к нему.
Вся процедура гораздо короче:
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:, которая вычисляет псевдослучайный адрес.
И ничего в ней особо хитрого-то и нет на вид, но вот алгоритм её мне простыми человеческими словами
непонятен.. :osad:

_________________
iLavr


14 Apr 2016 07:00
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Собственно, всё основывается на хитрой процедуре GEN:, которая вычисляет псевдослучайный адрес.
И ничего в ней особо хитрого-то и нет на вид, но вот алгоритм её мне простыми человеческими словами непонятен.. :osad:

А алгоритм-то оказался очень интересным! :o Но как-то руки не доходили проверить это, хотя я такое свойство
за ним и подозревал...

Но вот решил проверить, для чего с помощью этого алгоритма генерировал пары координат X, Y и выводил
точки в квадратное поле 256х256 (я похожим образом все RND-генераторы проверял).
Attachment:
RND1.gif
RND1.gif [ 5.05 KiB | Viewed 5710 times ]

Attachment:
RND2.gif
RND2.gif [ 11.96 KiB | Viewed 5710 times ]

Attachment:
RND3.gif
RND3.gif [ 2.31 KiB | Viewed 5710 times ]

За 256 х 256 = 65536 шагов алгоритм равномерно - псевдо-хаотично заполняет точками всё поле,
ни разу не повторяя уже пройденные адреса! :esurprised:

_________________
iLavr


17 Apr 2016 08:31
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18623
Location: Silicon Valley
Reply with quote
Ну прям таки уж ни разу не повторяя? ;)

_________________
:eugeek: https://twitter.com/Shaos1973


17 Apr 2016 08:44
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Ну прям таки уж ни разу не повторяя? ;)

ВОТ ЭТО И УДИВИТЕЛЬНО! :esurprised:

В цикле всего 256 х 256 = 65536 шагов, поле заполнено полностью, а если бы был повтор,
то точка стала бы красной и была бы незаполненная белая точка.

_________________
iLavr


17 Apr 2016 08:49
Profile
Senior

Joined: 27 Jul 2015 16:20
Posts: 124
Reply with quote
Обычный полиномиальный счетчик.

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


20 Apr 2016 08:45
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18623
Location: Silicon Valley
Reply with quote
Если это LFSR, то тогда точка с координатами (0,0) должна остаться незаполненной

_________________
:eugeek: https://twitter.com/Shaos1973


20 Apr 2016 09:32
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
IgorR76 wrote:
Обычный полиномиальный счетчик.

Не сказал бы, что уж очень обычный...
А Википедия и есть те знания, которыми Вы обычно делитесь? :wink:

_________________
iLavr


20 Apr 2016 10:09
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Shaos wrote:
Ну прям таки уж ни разу не повторяя? ;)
В цикле всего 256 х 256 = 65536 шагов, поле заполнено полностью, а если бы был повтор,
то точка стала бы красной и была бы незаполненная белая точка.
Я из интересу решил проверить, а что будет, если задать на 1 шаг больше, чем 65536?
И задал их 65537, предполагая, что увижу одну лишнюю красную точку.
Но вышло почему-то не так. В окно отладки программа выдала 7 НЕбелых точек,
но на картинке я их нашел только 4. Видимо, наложились еще что ли, если я не ошибся нигде...
Attachment:
noize9.gif
noize9.gif [ 3.59 KiB | Viewed 5658 times ]


Да, и почему я не считаю это обычным полиномиальным счетчиком.
Я не вижу здесь ни одного XOR для обычного...
Code:
;------хитро вычисляет 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

А на плоскость по X и Y выводятся эти H и L.

_________________
iLavr


20 Apr 2016 11:05
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Если это LFSR, то тогда точка с координатами (0,0) должна остаться незаполненной

Это, кстати, совсем необязательно...
Attachment:
gpsp.gif
gpsp.gif [ 5.34 KiB | Viewed 5607 times ]
Ларин А.Л. Основы цифровой электроники: учебное пособие. — М.: МФТИ, 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...
:wink:

_________________
iLavr


28 Apr 2016 14:03
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 16 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 4 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.