[#91] Re: Electroman dla Amigi

@tukinem, post #88

i tak robisz bardzo duzo, imho - nie musisz sie nikomu tutaj tłumaczyc , wszystkich i tak sie jak zwykle nie da zadowolić
3
[#92] Re: Electroman dla Amigi

@karolb, post #90

To ta wersja.
[#93] Re: Electroman dla Amigi

@tukinem, post #92

ponoc Eeletrobady jest kultowe
[youtube]https://www.youtube.com/shorts/39ul4NRo4zo[/youtube]

Ostatnia aktualizacja: 19.09.2023 22:53:38 przez selur
1
[#94] Re: Electroman dla Amigi

@selur, post #93

Dobrze tam usłyszałem na filmiku? Autorem gry Maciej Wąsik? szeroki uśmiech
2
[#95] Re: Electroman dla Amigi

@tukinem, post #68

Oto porównanie pierwszej komnaty drugiego levelu:

DOSBOX-X__________________________________Amiga AGA.

Widać zjechaną paletę jak się przypatrzy dobrze. Teleport na górze o niczym nie świadczy to tylko nie wypełniona liczbami tablica sama wkleiła 32 teleporty, bo tyle ich naliczyłem w tym levelu...
5
[#96] Re: Electroman dla Amigi

@tukinem, post #95

Na szczęście to jest gra w której na PC niespecjalnie widać 256 kolorów
Skoro (prawie) nie widać różnicy, to po co uruchamiać PC
3
[#97] Re: Electroman dla Amigi

@tukinem, post #94

Maciej Miąsik. Ktoś przeinaczył legendę PL GameDev.
[#98] Re: Electroman dla Amigi

@Don_Adan, post #54


Czyli w tym przypadku do chyba by bylo cos takiego:

; divide by 24, no rest
lsr.w #3,D0
move.w D0,D1
lsr.w #2,D0
addx.w D1,D0
lsr.w #2,D0
addx.w D1,D0
lsr.w #2,D0

Krotsze to jest, ale raczej wolniejsze od tablicy, o ile dobrze pamietam cykle dla 68020.


Ta implementacja algorytmu dzielenia przez 24 ma dwa problemy: jest przeznaczona dla 8 bitowego zakresu oraz nie jest do konca poprawna.
Oryginalny target, czyli 6502 nie ma operacji dzielenia, wiec wykorzystano tu pomysl zastapienia jej operacjami, opartymi na przesunieciach I dodawaniu. W przypadku dzielenia przez 24, operacje wartosc/24 mozna przedstawic w formie (wartosc/8)/3, gdzie dzielenie przez 8 mozna zastapic przesunieciem, a jego wynik podzielic przez 3. Dzielenie przez 3 tez trzeba zastapic przesunieciami/dodawaniami, wiec wykorzystano tu jedna z przyblizonych metod dzielenie przez 3 jaka jest wykorzystanie rownania 1/3 = 1/4 +1/16 + 1/64 +..
Problem w tym, ze w pseudokodzie dla 8bit powinno wygladac to tak:

iloraz = (wartosc >> 2) + wartosc
iloraz = (iloraz >> 4) + iloraz
uloraz = iloraz >> 2

natomiast implementacja wyglada tak:

iloraz = (wartosc >> 2) + wartosc;
iloraz = (iloraz >> 2) + wartosc;
iloraz = iloraz >> 2;

Niedokladnosci wynikajace z tej zmiany powoduja, ze juz przy wartosci 33 pojawia sie roznica w wyliczeniach, czyli wartosc dzielona na 24 moze miec gora 263 aby uzyskac dokladny, bezbledny wynik dzielenia. Poprawna wersja algorytmu daje taka dokladnosc w zakresie 0-647.
Druga sprawa to zakres: oryginalny algorytm dziala na bajcie, czyli dzielenie na 3 liczby w zakresie 0-255. Powyzej blad zaczyna sie kumulowac: przy wartosci 1000 jest to juz 5 a przy 8000 41!
Dla 16 bitowych wartosci pseudokod wyglada tak:

iloraz = (wartosc >> 2) + wartosc
iloraz = (iloraz >> 4) + iloraz
iloraz = (iloraz >> 8) + iloraz
iloraz = iloraz >> 2

Wygenerowalem sobie z ciekawosci tabelke porownujaca rozne implementacje:
val	val>>3	a_o	a_f	approx	magic	abs	round	val/24
256	(32):	10	10	10	10	10	11	10.666667
264	(33)	10	11	11	11	11	11	11.000000
512	(64):	21	21	21	21	21	21	21.333333
1600	(200)	65	66	66	66	66	67	66.666667
2040	(255)	83	84	85	85	85	85	85.000000
5200	(650)	213	216	216	216	216	217	216.958333
5208	(651):	213	216	217	217	217	217	217.000000
8000	(1000):	328	332	333	333	333	333	333.333333
16000	(2000):	656	664	666	666	666	667	666.666667
32000	(4000):	1312	1328	1333	1333	1333	1333	1333.333333
40000	(5000):	1640	1660	1666	1666	1666	1667	1666.666667
50000	(6250):	2050	2075	2083	2083	2083	2083	2083.333333
60000	(7500):	2461	2490	2500	2500	2500	2500	2500.000000
64000	(8000):	2625	2656	2666	2666	2666	2667	2666.666667
65500	(8187):	2686	2718	2728	2729	2729	2729	2729.166667

W tabelce kolumna a_o oznacza oryginalny kod 8bit w postaci:
wartosc = wartosc >> 3
iloraz = (wartosc >> 2) + wartosc;
iloraz = (iloraz >> 2) + wartosc;
iloraz = iloraz >> 2;

kolumna a_f - kod 8bit poprawiony:
wartosc = wartosc >> 3
iloraz = (wartosc >> 2) + wartosc
iloraz = (iloraz >> 4) + iloraz
uloraz = iloraz >> 2

approx - przyblizone dzielenie z wieksza dokladnoscia, kod dla 16bitowych liczb
wartosc = wartosc >> 3
iloraz = (wartosc >> 2) + wartosc
iloraz = (iloraz >> 4) + iloraz
iloraz = (iloraz >> 8) + iloraz
uloraz = iloraz >> 2

magic - kod dla 16bitych liczb - wyliczanie za pomoca mnozenia przez magiczna wartosc :)
iloraz = ((wartosc >>3 )* 0xAAAB) >> 17
abs, round i wart/24 dla porownania. :)

Przy okazji zaimplementowalem w asm wszystkie algorytmy dla 16bitowych liczb dodatnich aby sprawdzic ile cykli zajmuja.

Co z tego wszystkiego wynika i jaki algorytm dzielenia przez 3 wybrac?

- Jesli piszesz w c, zacznij od sprawdzenia, czy twoj kompilator nie wie lepiej :)- gcc potrafi wygenerowac kod z podobnymi optymalizacjami.
- Najlepiej wybierac takie dzielniki, ktore mozna w calosci zastapic przesunieciami.
- Jelsi jest to niemozliwe, to nalezy rozlozyc operacje tak aby wyodrebnic te, ktore da sie zastapic przesunieciem.
Oczywiscie nie tylko 3 moze byc dzielnikiem, ale jesli juz wybrales 3, to masz nastepujace opcje:

Jak potrzebujesz dokladnosci, korzystasz z mnozenia przez magiczna wartosc:
- gwarantuje dokladnosc dla calego zakresu 16bit.
- stosunkowo wolne
mulu.w	#$aaab, d0	; 70 (38+2n)
swap	d0		;  4
lsr.w	#1, d0		;  8

Dla 68000 w najgorszym przypadku to 82 cykle, dla zakresu wartosci 0-1023 to w najgorszym przypadku 70 cykli, czyli bedzie szybszy od algorytmu 16 bitowego ponizej!
Dla 68030 bedzie to okolo 36 cykli.

Jak dokladnosc nie jest kluczowa a zakres wartosci 16bit, korzystasz z algorytmu z przyblizonym dzieleniem przez 3 dla wartosci 16 bit:
- szybszy od mnozenia
- dokladny w calym zakresie, rzadko moze sie pojawic blad, gora +-1
move.w 	d0,d1		; 4
lsr.w 	#2, d0		; 10
addx.w 	d1,d0		; 4

move.w 	d0,d1		; 4
lsr.w 	#4, d0		; 14
addx.w 	d1,d0		; 4

move.w 	d0,d1		; 4
lsr.w 	#8, d0		; 22
addx.w 	d1,d0		; 4

lsr.w 	#2,d0		; 10

Czas wykonania dla 68000 to 80 cykli.
Dla 68030 bedzie to okolo 28 cykli.

Jak dokladnosc nie jest kluczowa a zakres wartosci <81, korzystasz z algorytmu z przyblizonym dzieleniem przez 3 dla wartosci 8 bit:
- duzo szybszy od mnozenia
- dokladny do wartosci <81, powyzej z bledem, rosnacym wraz z wartoscia.
move.w 	d0,d1		; 4
lsr.w 	#2, d0		; 10
addx.w 	d1,d0		; 4

move.w 	d0,d1		; 4
lsr.w 	#4, d0		; 14
addx.w 	d1,d0		; 4

lsr.w 	#2,d0		; 10

Czas wykonania dla 68000 to 50 cykli.
Dla 68030 bedzie to okolo 20 cykli.

ps: Chyba za duzo wolnego czasu ostatnio mam :)
4
[#99] Re: Electroman dla Amigi

@docent, post #98

co to sa te dwie strzalki ">>" ?
[#100] Re: Electroman dla Amigi

@selur, post #99

Wygooglowalem, że to jest przesunięcie bitowe w prawo szeroki uśmiech
[#101] Re: Electroman dla Amigi

@karolb, post #100

aa ok, tez mi sie cos te dziwne rownania nie zgadzaly
[#102] Re: Electroman dla Amigi

@docent, post #98

Dzieki, ja sprawdzilem tylko pare wartosci, nie mam teraz dostepu do ASM-One, ktorego zwykle uzywalem do takich wyliczen/sprawdzan.
Wiadomo, ze lepiej jest przechowywac dane w formie 4 bajtow niz 3 bajtow, nawet jesli to zajmuje wiecej pamieci (o 1 bajt na kazda dana), to jest duzo szybsze w obsludze, szczegolnie dla 68000.
Przypomnialem sobie, ze kiedys sam szukalem dzielenia przez 3 bez uzywania divu.w, chodzilo o miksowanie 3 sampli w 1 kanal/sampel. Bo wiekszosc uzywanych algorytmow miksujacych jest slaba, bardzo glosnosc spada jesli nie sa odgrywane wszystkie miksowane kanaly. Wiec ktoras implementacja pewnie by sie nadala, szczegolnie dla 68020+ bo tam sa duzo szybsze przesuniecia bitow niz na 68000.
No i taki algorytm jest tez lepszy niz divu.w dla dzielen, gdzie wystepuje overflow np. 300000/3. Z tego co pamietam wtedy 2 dzielenia divu.w trzeba uzyc. I jakies starsze emulatory mialy z tym problem, jak dzielilem miliony bajtow przez 9, uzywajac 2 dzielen (to byla czyjas procedura).
I jak znasz jeszcze jakas procedure, ktora dzieli przez 5 bez divu to mozesz sie podzielic.
[#103] Re: Electroman dla Amigi

@selur, post #99

co to sa te dwie strzalki ">>" ?

Chyba nie przesadzę jeżeli powiem, że na tych strzałkach działa cały świat. szeroki uśmiech A na pewno nie istnieje na świecie gra, która nie używa przesunięć bitowych. Nawet jeżeli programista jest bardzo wysokopoziomowy i nie używa tego jawnie to gdzieś tam pod spodem jakieś maski bitowe działają i takie przesunięcia się robią.
1
[#104] Re: Electroman dla Amigi

@Don_Adan, post #102

Choc po przemysleniu w przypadku dzielenia przez 3 to dla sampli wystarczylaby tylko mala tablica 2x384 (o ile sie nie myle), i jeden odczyt z niej. Wiec to mogloby byc szybkie nawet dla 68000.
[#105] Re: Electroman dla Amigi

@Don_Adan, post #102

Dzielenie przez 5 dla 6502:

;Divide by 5
  sta  temp
  lsr
  adc  #13
  adc  temp
  ror
  lsr
  lsr
  adc  temp
  ror
  adc  temp
  ror
  lsr
  lsr
[#106] Re: Electroman dla Amigi

@kar78787878, post #105

Dzieki.
To chyba bylo by cos takiego:

; divide by 5, no rest
 move.l D0,D1
 moveq #13,D2
 lsr.l #1,D0
 addx.l D2,D0
 lsr.l #3,D0
 addx.l D1,D0
 lsr.l #1,D0
 addx.l D1,D0
 lsr.l #3,D0
[#107] Re: Electroman dla Amigi

@Don_Adan, post #106

A czy addx uwzględnia flagę Carry? No i lsr to nie to samo co ror.
[#108] Re: Electroman dla Amigi

@tukinem, post #41

Dwa błędy - pierwszy wyskoczyłem w prawo w ciemność. Drugi - możliwe, że przez granie na WinUAE, grając dłużej pojawiają się mało widoczne migające "śmieci" na ekranie.
[#109] Re: Electroman dla Amigi

@kar78787878, post #107

tak. addx to dodawanie z bitem rozszerzenia X. a ror to obrot. ale mi wyglada, ze ta procedura na 6502 dzieli w ten sposob, ze bity od 0 do 3 to jest wynik, a bity od 4 do 7 to jest reszta z dzielenia. dlatego jest ror. ale ekspertem od 6502 nie jestem.
[#110] Re: Electroman dla Amigi

@Don_Adan, post #102

I jak znasz jeszcze jakas procedure, ktora dzieli przez 5 bez divu to mozesz sie podzielic.

Jasne:)
mnozenie przez magiczna wartosc:
(wartosc*0xCCCD)>> 18
przesuniecia:
iloraz = ((wartosc >> 1) + wartosc) >>1
iloraz = (iloraz >> 4) + iloraz
iloraz = ((iloraz >> 8) + iloraz) >> 2
[#111] Re: Electroman dla Amigi

@AD99, post #108

Co do pierwszego błędu, to chciałbym wiedzieć, w której komnacie dokładnie ten błąd nastąpił. Postaram się to wyeliminować.

Jeśli chodzi o drugi błąd, to tak, wina winuae, a w szczególności użycia Fastest possible + JIT. Sam tak mam jak uruchamiam grę kilkanaście razy prosto z edytora Blitz Basic 2. Ustaw sobie 020, cycle exact i powinno być ok.



Już miałbym gotową mapę drugiego levelu, ale okazuje się, że elementy, które myślałem że będą zasłaniać naszego bohatera, tak naprawdę działają jako ściany, więc musiałem mapę pozmieniać wraz z kaflami. W takim razie wszystkie teleporty w drugim levelu są konieczne, chociaż kilka jest złośliwych i kieruje nas z powrotem. To jest paskudny level i moim zdaniem bardzo trudny jak na drugi. Bez pliku z mapą ciężko będzie przejść. To bardzo zniechęca, ale jest do przejścia. Level 1 to bajka w porównaniu do drugiego. Powoli będę wdrażać elementy komnat, a jeszcze muszę dopisać nowe elementy takie, jak czołgi strzelające, lasery przelatujące przez komnatę oraz armatki górne strzelające w dół. Armatek dolnych tu nie ma. Jest też ciekawe miejsce takie, jak końcówka levelu 1, czyli trzeba stanąć na końcu rampy i skoczyć w drugą stronę żeby wylądać na rampie komnatę niżej. Jeśli nie staniemy na końcu tej górnej, to przeskoczymy to dolną, a z niej jest teleport do dalszej części. W levelu 1 znowu trzeba stanąć na krańcu platformy i skoczyć w bok tak, żeby nie zahaczyć o górną część, bo wtedy spadamy w dół. Dokładnie to ta komnata:

Ktoś może pomyśleć że jest błąd, ale w oryginale też to tak działa. Trzeba podejść do lewej krawędzi i skoczyć w prawo tak, żeby nie zahaczyć o górę.
4
[#112] Re: Electroman dla Amigi

@tukinem, post #1

Ja chciałem tylko podziękować za fakt przeniesienia tej gry na mój ulubiony komputer. Mam nadzieję, że będzie też jakaś wersja pudełkowa ale jak nie to zadowolę się samą grą. Wielki szacunek dla twórców oryginału i konwersji.
2
[#113] Re: Electroman dla Amigi

@slawekwozniak, post #112

Pudełkowa chyba mogłaby wyjść spod skrzydeł Duddiego z Retronics - wydaje już obecnie wersję PC
1
[#114] Re: Electroman dla Amigi

@slawekwozniak, post #112

Nie wiem, czy będzie można. Gra ma licencję freeware, a dokładnie CC-SA. Raczej nie mogę na tym nawet złotówki zarobić, a wersja pudełkowa pewnie jest kosztowna. Do tego gra musiałaby być na dyskietkach, a ja nie chcę się babrać z ADFami. Już w Tonym się przekonałem, że to wcale nie jest takie łatwe jak to było w Amosie. Chcę to stworzyć w pliku .LHA. Szczerze mówiąc, to mógłbym grę skończyć na drugim levelu, bo i tak raczej nikt dalej chyba nie dojdzie :D ja przez tydzień mam odpalonego DOSBoxa i próbuję drugi level przejść :D

teraz udało mi się dojść dalej i te kolumny, które najpierw myślałem że działają jako Dual Playfield, okazuje się, że są ścianami, przez które nie da się przejść, ale nie do końca :) są miejsca gdzie da się przejść za tymi kolumnami. Będę musiał to dokładnie zbadać na spokojnie, chociaż po każdym teleporcie w inną komnatę idzie się pogubić naprawdę :D

udało mi się już wprowadzić lasery, gdzie animację napisać to było coś ciężkiego, albo ja już nie myślę co robię :) oto zdjęcie komnaty z laserami:


Jestem w szoku, że takie boby działają płynnie na gołym chip ramie w AGA. No ale strzelając łukiem dochodzi kolejny bob i już jest wolniej. Z fastem nie ma problemu.
2
[#115] Re: Electroman dla Amigi

@tukinem, post #114

Trzeba bardzo docenić pracę Pawła. Ja mam na bieżąco wgląd w powstawianie gry i wiem na jakie trudności Paweł ciągle natrafia przy tej konwersji. BRAWO Paweł! OK
2
[#116] Re: Electroman dla Amigi

@tukinem, post #111

Mozesz ulatwic granie przez dodanie tworzenia sie aktualnej minimapy po nacisnieciu klawisza M, to byloby cos czego nie bylo w oryginale. A co do dyskietek to przekombinowujesz, to nie jest az takie trudne zeby wczytywac pliki po pelnej nazwie ze sciezka. Tym bardziej, ze gra dziala na golej A1200.
1
[#117] Re: Electroman dla Amigi

@Don_Adan, post #116

Ja jadę na ścieżkach pośrednich, czyli na samych podkatalogach bez "DH0:". Nie będę się bawić z dyskietkami. Co do mapy to się zastanowię. Narazie mam tu co robić przy tym levelu naprawdę.
[#118] Re: Electroman dla Amigi

@tukinem, post #111

Ok, trochę to trwało. Twoje wskazówki co do ustawień emu pomogłyOK





Ostatnia aktualizacja: 24.09.2023 20:26:17 przez AD99
[#119] Re: Electroman dla Amigi

@tukinem, post #111

Jak zebrać te puszko-akumulatory?
Sorry daje linki, bo coś opcja wstaw obrazek nie działa...
1
2
3- to jest to miejsce, gdzie wskakuję na górę(widać moje buty)
4
ciemność
6
7-tu jak wejdę na te trójkąty(teleporty?) wywala mnie do menu gry.
1
[#120] Re: Electroman dla Amigi

@AD99, post #119

Puszki w tym wąskim korytarzu raczej nie da się zebrać. Tak samo jest w oryginale.

Co do tego miejsca gdzie wyskakujesz w bok to będę musiał poprawić

A co do trójkątów to gratuluję, przeszedłeś pierwszy level
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem