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

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

Moderator: Shaos

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

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

Post by Lavr »

В старые времена, когда из компьютеров у меня был только "Специалист", любил я из разных программ
вытаскивать различные визуальные и звуковые эффекты...

Следующая подпрограмма из моей коллекции обычно использовалась, когда надо было озвучить взрыв,
ну или какой-либо шум столкновения:

 ПОДПРОГРАММА NOIZE

Code: Select all

NOIZE:
  PUSH PSW
  PUSH B

  LXI  B,00C0H; length 192
L39:
  CALL L35
  CPI  80H    ;
  JNC  L3A    ; A >= 80H

  MVI  A,0BH  ; SET Port C = 1
  STA  0FFE3H ; PYC PPA

L3A:
  DCX  B
  CALL L35
  CPI  7FH   ;
  JNC  L3B   ; A >= 7FH

  MVI  A,0AH  ; SET Port C = 0
  STA  0FFE3H ; PYC PPA

L3B:
  MOV  A,B
  ORA  C
  JNZ  L39

  MVI  A,0AH  ; SET Port C = 0
  STA  0FFE3H ; PYC PPA

  POP  B
  POP  PSW
  RET

L35:
  PUSH H    ;
  PUSH B
  LHLD L37  ; HL = 5EACH;
  MOV  A,H
  ANI  0C0H ; 1100.0000b
  MOV  B,A
  RAL       ; A = 2хA
  XRA  B
  ANI  80H  ; 1000.0000b Test Bit7
  DAD  H    ; не влияет на Z только C
  JZ   L36  ; Bit7 = 0
  INX  H
  INX  H
L36:
  SHLD L37
  MOV  A,H
  POP  B
  POP  H
  RET
L37:
  DB   0ACH ;  = L
  DB   5EH  ;  = H

Алгоритмы этих подпрограмм я обычно не разбирал, следил только, чтобы не портили регистры...
Но поскольку я сейчас переношу программу на платформу 1816ВЕ48, то построчно прочитать пришлось.
И есть у меня такое предположение, что подпрограмма, которую вызывают по метке L35: - это простенький
генератор псевдослучайной последовательности... псевдо-RND, так сказать.
iLavr
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Lavr wrote:И есть у меня такое предположение, что подпрограмма, которую вызывают по метке L35: - это простенький
генератор псевдослучайной последовательности... псевдо-RND, так сказать.
Тест "звёздное небо" показывает, что предположение весьма похоже на правду!
tRND.PNG
Распределение более-менее равномерное, явных группировок незаметно...
Если наблюдать дольше - весьма равномерно закрасит весь квадрат.
You do not have the required permissions to view the files attached to this post.
iLavr
DDp
Novelist
Posts: 46
Joined: 24 Aug 2006 02:14
Location: pуcвoceмьнадцaть

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

Post by DDp »

Lavr wrote:И есть у меня такое предположение, что подпрограмма, которую вызывают по метке L35: - это простенький
генератор псевдослучайной последовательности
LFSR с отводами 15,14. Период 32767.
В этой реализации младший бит (L37) всегда 0, работают старшие 15 бит.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

DDp wrote:В этой реализации младший бит (L37) всегда 0, работают старшие 15 бит.
А они и используются в программе (MOV A,H), хотя, рисуя "звёздное небо", я и младшие биты в качестве координаты использовал. :wink:
Lavr wrote:Но поскольку я сейчас переношу программу на платформу 1816ВЕ48, ...
А вот под моделью 8048 в Proteus этот звук взрыва звучит омерзительно плохо. :(
Хотя казалось мне - будет лучше, поскольку в звук вмешиваются прерывания по таймеру -
шумнее будет, - так мне казалось... но звучит как трактор: тыр-тыр-тыр... :-?

И я подумал, может быть заменить звук взрыва алгоритмом попроще?
Интересно это сделано в известной игре CROSSFIRE - там в качестве случайного шумового сигнала
использовали массив кодов самой программы, насколько я помню...

Но из интересу я загуглил "имитация звука взрыва на ассемблере" и нашел пока только одну статью
на интересующую тему: Как написать игру на ассемблере для ZX Spectrum
Есть там фраза:"для создания звука, напоминающего взрыв бомбы, можно предложить..."
Посмотрю, что там они предложили... :lol:

P.S. Да... оригинальностью они не удивили:"...в качестве генератора «случайных» чисел, определяющих частоту тона, используются коды ПЗУ".
iLavr