Автор Тема: Как реализовать рандом на проце M68K?  (Прочитано 5223 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Собственно в процессе кодинга игр возникла необходимость в мгновенном или не слишком медленном рандоме.
Вроде говорят что это дело цепляют за тактовую частоту процессора, ну может кто знает по этой теме что.

Я пока использовал инкремент который осуществляется каждое обновлени экрана т.е. 60 раз в секунду, но это медленно

получается только 60 цифр за секунду, мне бы побыстрее чего :?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #1 : 19 Ноябрь 2009, 16:24:11 »
Инкременируй и при каждом вызове функции, а потом бери какой-нибудь хеш.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #2 : 19 Ноябрь 2009, 16:40:22 »
Цикл игры обычно зацеплен за обновление экрана

т.е. ждем прерывания по кадровому обновлению, при этом зачастую обычно вырубают преривания по строкам(наверно в пистолетах их только используют) и обновляем графику, палитры и опрашиваем джой, ну и инкрементирую я при этом

но проблема как раз в том что медленно, а отдельно процедура это всеравно по какомуто признаку должна быть не закономерная а реально рандомная :-\

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #3 : 19 Ноябрь 2009, 17:06:47 »
Дык и инкрементируй при вызове функции - чем не изменение состояния? Ведь каждый раз при вызове функции будут разные значения, а разность рэндома решает уже не счётчик, а алгоритм взятия хеша и преобразования его в выходное значение в зависимости от требуемого типа и диапазона.
А лучше вместо счётчика менять при каждом удобном случае зерно - некий хеш, который меняется алгоритмом, дающим каждый непохожие результаты. А затем из этого зерна извлекать твой рэндом. На обновление экрана (да и вообще, куда не лень) тоже повесишь смену зерна - будет меньше закономерностей.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #4 : 19 Ноябрь 2009, 17:35:48 »
Ну тогда следует уточнить что такое алгоритм взятия хэша - пример нужен, а то я не догоняю :-\

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #5 : 19 Ноябрь 2009, 17:48:02 »
Алгоритм из ANSI-C:
#define RAND_MAX 32767
 
unsigned long next=1;
 
int rand(void) {
 next=next*1103515245+12345;
 return((unsigned int)(next/65536)%32768);
}
 
void srand(unsigned int seed) {
 next=seed;
}

При вызове srand() в качестве зерна можно выставлять какой-нибудь счётчик. Желательно при этом его увеличивать хотя бы на 1, чтобы быть увереным, что при каждом вызове его значение будет меняться.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #6 : 19 Ноябрь 2009, 17:54:57 »
Ну возможно я не уточнил - мне нужно в ассемблере это дело а не в С, я на асме пишу

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #7 : 19 Ноябрь 2009, 18:17:04 »
А есть разница? Алгоритм - он и в Африке алгоритм.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #8 : 19 Ноябрь 2009, 18:31:25 »
unsigned int меня беспокоит :(

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

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #9 : 19 Ноябрь 2009, 18:38:36 »
 
unsigned int меня беспокоит :(
о_О

да и вообще хотелось бы за какую то величину физическую зацеплено чтобы было, там какой такт проца или комманды - вроде есть такое же, только я не знаю как достать :-\
Смысл?.. Как ни крути - закономерность будет всегда. Т.е. при одинаковых условиях будут выдаваться одинаковые значения.
Коль уж так хочется - реализуй вышеописанные функции, а в srand() в качестве параметра передавай какую-нибудь "физическую величину", если сможешь её раздобыть.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #10 : 19 Ноябрь 2009, 18:57:51 »
Ну мне понятно что ты там делишь, умножаешь получается какоето число
но всеже если кто знает другой способ, то буду благодарен

то что можно умножать и делить я учту, может комбинированный вариант сделаю

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #11 : 19 Ноябрь 2009, 19:08:13 »
А как иначе ты собрался делать рэндом? Какие-то неверные у тебя о нём представления.
Умножать/делить надо, чтобы получилось неожиданное значение. В этом и есть вся суть "случайности". Ты можешь подобрать любые другие аналоги, необязательно использовать именно эти операции. Можешь сделать xor с чем-нибудь, затем сдвиг влево на несколько разрядов, затем сложить с чем-нибудь.

Оффлайн evgeny

  • Пользователь
  • Сообщений: 1390
  • Пол: Мужской
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #12 : 20 Ноябрь 2009, 13:01:09 »
Проще говоря, нужно брать любые переменные, которые часто меняются и проделать с ними математические операции, складывать, делить, прибавить значения опроса джойстика и другие прерывания и сохранить результат в новой переменной, которая и станет отвечать за рандом.

Оффлайн romanich

  • Пользователь
  • Сообщений: 26
  • Пол: Мужской
  • пришёл
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #13 : 20 Ноябрь 2009, 16:39:17 »
получается только 60 цифр за секунду, мне бы побыстрее чего :?

Заэнабли HBlank INT и будет ещё в 262 раза (NTSC) быстрее :)

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #14 : 20 Ноябрь 2009, 16:58:06 »
Заэнэбливание HBLank у меня ведет к тормозам, может чего не так конечно делаю, но лучше его не трогать пока

я думал все о номере исполняемой комманде - кто знает как его выцедить :?
ну там есть же статус регистр, а номер команды где хранится PC - программ каунтер т.е.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #15 : 20 Ноябрь 2009, 17:10:35 »
Представь себе картину: хочет человек просверлить в стене дырку. Он берёт железную руду, переплавляет, делает стальной сплав, вытачивает сверло, создаёт крутящий механизм, расчитывает всё до деталей, и в итоге просверливает дыру.
Раздаётся звонок в дверь - пришёл сосед, просит одолжить перфоратор. Человек идёт в кладовую, достаёт перфоратор, даёт соседу, попутно думая "вот у меня правильная дырка, а у него будет неправильная".
Вот у тебя примерно то же самое. Результат в любом случае будет один, а пути его достижения делятся на стандартно-логичный и феерически-спонтанный в вакууме.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #16 : 20 Ноябрь 2009, 17:21:53 »
Так это же мечта человечества - стать богом и самому творить что хотеть, хочешь перфоратор, хочешь стенку с дыркой для разных нужд - все там будем :lol:

Оффлайн romanich

  • Пользователь
  • Сообщений: 26
  • Пол: Мужской
  • пришёл
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #17 : 20 Ноябрь 2009, 17:24:29 »
Заэнэбливание HBLank у меня ведет к тормозам, может чего не так конечно делаю, но лучше его не трогать пока

в своё время мне понравился такой генератор:

u32 System_Seed=0; //Обязательно = 0 !!!!!

//Random Number Generator
u32 System_Random(u32 Modular)
{
 __asm
 {
  mov       eax,System_Seed
  mov       cx,0x21
  @1:
  add       eax,eax
  jnc       @2
  xor       al,0xC5
  @2:
  loop      @1
  mov       System_Seed,eax
 }
 if(Modular) return(System_Seed%Modular);
 return System_Seed;
}

беспроблемно переложится на м68к

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #18 : 26 Ноябрь 2009, 11:24:56 »
В общем я решил так сделать и сделал

Сначала добавляю какое то число находящееся в середине нужного диапазона к тому числу которое инкрементируется каждое обновление экрана

потом беру счетчик Program Counter - вроде он содержит адрес исполняемой комманды, ну не знаю его ли он точно содержит или чего другое, потом делю его на то число которое получилось после добавления к инкрементируемому каждый экран, а результат потом еще разделяю на 2 части по 4 бита, ну мне так нужнее и смотрю не вылетело ли каждое за указанные рамки, если вылетело то еще раз добавляю среднее число к тому результату который получился, а нижнее число (нижние 4 бита) если выбиваются из диапазона то тупо делю сдвигом вправо

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

в общем результатом доволен

но делю не сдвигом а именно делением в M68K это комманда divu.w

в принципе шустро делает, скоростью я доволен, да и рандомностью тоже

А вообще мне нужно было число от 0 до 100 :)

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #19 : 05 Июнь 2010, 01:14:56 »
но делю не сдвигом а именно делением в M68K это комманда divu.w
деление самое медленное у сеги.

вот рандом готовый мошт кому пригодится (думаю тема актуальна ещё, раз готового так никто и не выложил!)

Rock n' Roll Racing :

ROM:00001328                 movem.l d1-d2,-(sp)
ROM:0000132C                 move.w  $51E6(a4),d0
ROM:00001330                 move.w  $51E8(a4),d1
ROM:00001334                 move.w  d1,d2
ROM:00001336                 mulu.w  #$43E5,d0
ROM:0000133A                 mulu.w  #$15A,d1
ROM:0000133E                 add.l   d1,d0
ROM:00001340                 swap    d0
ROM:00001342                 clr.w   d0
ROM:00001344                 mulu.w  #$43E5,d2
ROM:00001348                 add.l   d2,d0
ROM:0000134A                 addq.l  #1,d0
ROM:0000134C                 move.l  d0,$51E6(a4)
ROM:00001350                 swap    d0
ROM:00001352                 andi.w  #$7FFF,d0
ROM:00001356                 movem.l (sp)+,d1-d2
ROM:0000135A                 rts

Dune - The Battle for Arrakis :


ROM:00000E10                 move.l  #$349F285A,(random_value1).w

......

ROM:00000E42 sub_E42:                                ; CODE XREF: sub_C0C+8p
ROM:00000E42                                         ; sub_439Aj ...
ROM:00000E42                 lea     (random_value1).w,a0
ROM:00000E46                 moveq   #0,d0
ROM:00000E48                 move.b  3(a0),d0
ROM:00000E4C                 lsr.b   #2,d0
ROM:00000E4E                 move.b  1(a0),d1
ROM:00000E52                 roxl.b  #1,d1
ROM:00000E54                 move.b  d1,1(a0)
ROM:00000E58                 move.b  2(a0),d1
ROM:00000E5C                 roxl.b  #1,d1
ROM:00000E5E                 move.b  d1,2(a0)
ROM:00000E62                 eori    #$11,ccr
ROM:00000E66                 move.b  3(a0),d1
ROM:00000E6A                 subx.b  d1,d0
ROM:00000E6C                 lsr.b   #1,d0
ROM:00000E6E                 move.b  3(a0),d1
ROM:00000E72                 roxr.b  #1,d1
ROM:00000E74                 move.b  d1,3(a0)
ROM:00000E78                 move.b  3(a0),d0
ROM:00000E7C                 move.b  2(a0),d1
ROM:00000E80                 eor.b   d1,d0
ROM:00000E82                 rts

не использовано (? )

OM:00000E84 sub_E84:
ROM:00000E84                 movem.l d2-d3,-(sp)
ROM:00000E88                 move.b  (random_value4).w,d0
ROM:00000E8C                 move.b  (random_value3).w,d1
ROM:00000E90                 move.b  (random_value2).w,d2
ROM:00000E94                 move.b  d0,d3
ROM:00000E96                 lsr.b   #2,d0
ROM:00000E98                 roxl.b  #1,d2
ROM:00000E9A                 move.b  d2,(random_value2).w
ROM:00000E9E                 roxl.b  #1,d1
ROM:00000EA0
ROM:00000EA0 loc_EA0:
ROM:00000EA0                 move.b  d1,(random_value3).w
ROM:00000EA4                 eori    #$11,ccr
ROM:00000EA8                 subx.b  d3,d0
ROM:00000EAA                 lsr.b   #1,d0
ROM:00000EAC                 roxr.b  #1,d3
ROM:00000EAE                 move.b  d3,(random_value4).w
ROM:00000EB2                 move.b  d3,d0
ROM:00000EB4                 eor.b   d1,d0
ROM:00000EB6                 andi.w  #$FF,d0
ROM:00000EBA                 movem.l (sp)+,d2-d3
ROM:00000EBE                 rts





« Последнее редактирование: 05 Июнь 2010, 01:19:55 от Ti_ »

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #20 : 08 Июнь 2010, 12:38:24 »
Не, ну я для своих то целей рандом реализовал :cool:
шустро, да мне в пределах 0-256 нужно было сделать - не сложно хоть и делит

Оффлайн r57shell

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #21 : 08 Июнь 2010, 12:52:00 »
За то он у тебя полюбому(предположение) нифига не случайный. Рандом должен обладать некоторыми св-вами... если интересно какими и как затестить - Кнут второй том )) (книжку все кнутом завут)

вот тут есть нормальные рандомы...
http://algolist.manual.ru/maths/generator/index.php

ябы выбрал вот этот http://algolist.manual.ru/maths/generator/inline.php для не суровых вещей, а для суровых... незнаю даже... небыло покачто такого  :lol:.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Как реализовать рандом на проце M68K?
« Ответ #22 : 08 Июнь 2010, 14:18:11 »
Дело не в рандумности а в скорости, вот у меня как раз критерием была скорость, другие алгоритмы к сожалению не давали мне такую скорость

Это как нас еще в школе на программировании учили - чем меньше программа тем лучше - кто это сказал? а то что зацикленность программы ведет к потере времени затраченной на каждый обсчет вообще никто не думает

мне важна скорость, и я реализовал удобный мне вариант, комуто нужен рандом - он реализует другой