RND в Бейсик «МИКРОША»

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

RND в Бейсик «МИКРОША»

Post by Lavr »

Возник тут у нас этот вопрос на днях, что в подпрограмме 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: Select all

'========== 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: Select all

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 файл и
загружается и работает нормально.
BASIC.rar
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

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

На "Специалисте" еще, в пакете программ от SP-580, был такой визуальный эффект:
NOIZE.gif
Картинка на экране с характерным шумом "тонет" в море случайных точек.
А потом эти точки рассеиваются и "всплывает" новая картинка.

Код самогО эффекта следующий:

Code: Select all

  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
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Что-то я чисто из интересу прогуглил этот эффект на повод, не выложил ли кто исходника его.
Нашел пока только вот что:
Динамические фильтры
Эффекты постепенного появления (исчезновения) графического изображения и преобразования одной картинки в другую можно получить с помощью совместного применения динамического фильтра и сценария (скрипта). Разумное использование таких эффектов украшает Web-страницу. Есть несколько способов преобразования. Эти способы заранее определены, поэтому от вас лишь требуется указать номер выбранного способа. Ниже приведена таблица с названиями и номерами превращений.
...
При установке фильтра типа 12 возникает эффект постепенного повышения разрешения изображения путем случайного заполнения пикселами места, отведенного под картинку. Точки картинки постепенно выводятся на экран в случайном порядке.
Но примера кода я там что-то не увидел... :-?
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Джентльмены, извините, что я здесь оффтоплю, но что-то прямо зацепило неподецки! :o

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

В чем может быть проблема? :eugeek:

Code: Select all

<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: Select all

<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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Этот эффект смены картинок есть в PowerPoint - Растворение (Pixel Dissolve):
Растворение.gif
Примерно так выглядит:
000000.jpg
Буду искать программную реализацию...


P.S. И, похоже, что один вариант исходника я нашел. Что значит правильно задать вопрос Гугле... :wink:
Image Slide Show with Transitions
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

А сам оригинальный алгоритм этого графического эффекта, оказывается, весьма интересен!
И получается, что я его себе представлял неправильно... :-? Поэтому у меня ничего не получилось под Вендой.
(Под DOS я умудрился перенести точную кальку с ассемблера для режимов BW, не вникая в суть.)

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

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

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

Составляется массив всех точек координат картинки и его потом просто перемешивают случайно специальным
образом с помощью интересного алгоритма тасования имени Фишера–Йетса.
После чего на экран быстро выкидывают все точки этого массива. Ясное дело, что повториться при этом
в выводе точек картинки на экран просто невозможно! :kruto:
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Lavr wrote:Под DOS я умудрился перенести точную кальку с ассемблера для режимов BW, не вникая в суть.
Посмотрел я, как я это делал в своих старых исходниках, там этот эффект разобран и выброшено
всё лишнее, что относилось не к нему.
Вся процедура гораздо короче:

Code: Select all

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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Lavr wrote:Собственно, всё основывается на хитрой процедуре GEN:, которая вычисляет псевдослучайный адрес.
И ничего в ней особо хитрого-то и нет на вид, но вот алгоритм её мне простыми человеческими словами непонятен.. :osad:
А алгоритм-то оказался очень интересным! :o Но как-то руки не доходили проверить это, хотя я такое свойство
за ним и подозревал...

Но вот решил проверить, для чего с помощью этого алгоритма генерировал пары координат X, Y и выводил
точки в квадратное поле 256х256 (я похожим образом все RND-генераторы проверял).
RND1.gif
RND2.gif
RND3.gif
За 256 х 256 = 65536 шагов алгоритм равномерно - псевдо-хаотично заполняет точками всё поле,
ни разу не повторяя уже пройденные адреса! :esurprised:
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RND в Бейсик «МИКРОША»

Post by Shaos »

Ну прям таки уж ни разу не повторяя? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Shaos wrote:Ну прям таки уж ни разу не повторяя? ;)
ВОТ ЭТО И УДИВИТЕЛЬНО! :esurprised:

В цикле всего 256 х 256 = 65536 шагов, поле заполнено полностью, а если бы был повтор,
то точка стала бы красной и была бы незаполненная белая точка.
iLavr
IgorR76
Senior
Posts: 102
Joined: 27 Jul 2015 15:20

Re: RND в Бейсик «МИКРОША»

Post by IgorR76 »

Обычный полиномиальный счетчик.

 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.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RND в Бейсик «МИКРОША»

Post by Shaos »

Если это LFSR, то тогда точка с координатами (0,0) должна остаться незаполненной
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

IgorR76 wrote:Обычный полиномиальный счетчик.
Не сказал бы, что уж очень обычный...
А Википедия и есть те знания, которыми Вы обычно делитесь? :wink:
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Lavr wrote:
Shaos wrote:Ну прям таки уж ни разу не повторяя? ;)
В цикле всего 256 х 256 = 65536 шагов, поле заполнено полностью, а если бы был повтор,
то точка стала бы красной и была бы незаполненная белая точка.
Я из интересу решил проверить, а что будет, если задать на 1 шаг больше, чем 65536?
И задал их 65537, предполагая, что увижу одну лишнюю красную точку.
Но вышло почему-то не так. В окно отладки программа выдала 7 НЕбелых точек,
но на картинке я их нашел только 4. Видимо, наложились еще что ли, если я не ошибся нигде...
noize9.gif
Да, и почему я не считаю это обычным полиномиальным счетчиком.
Я не вижу здесь ни одного XOR для обычного...

Code: Select all

;------хитро вычисляет 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.
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RND в Бейсик «МИКРОША»

Post by Lavr »

Shaos wrote:Если это LFSR, то тогда точка с координатами (0,0) должна остаться незаполненной
Это, кстати, совсем необязательно...
gpsp.gif
Ларин А.Л. Основы цифровой электроники: учебное пособие. — М.: МФТИ, 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:
You do not have the required permissions to view the files attached to this post.
iLavr